diff --git a/src/resources/extensions/gsd/doctor-proactive.ts b/src/resources/extensions/gsd/doctor-proactive.ts index 810cd46aa..29fabd288 100644 --- a/src/resources/extensions/gsd/doctor-proactive.ts +++ b/src/resources/extensions/gsd/doctor-proactive.ts @@ -173,14 +173,19 @@ export async function preDispatchHealthGate(basePath: string): Promise { assertEq(result.issues.length, 0, "no issues on clean state"); } + console.log("\n=== health gate: missing STATE.md does NOT block dispatch (#889) ==="); + { + const dir = realpathSync(mkdtempSync(join(tmpdir(), "doc-proactive-"))); + cleanups.push(dir); + // Create milestones dir but no STATE.md — mimics fresh worktree + mkdirSync(join(dir, ".gsd", "milestones", "M001"), { recursive: true }); + writeFileSync(join(dir, ".gsd", "milestones", "M001", "M001-ROADMAP.md"), "# Roadmap\n"); + + const result = await preDispatchHealthGate(dir); + assertTrue(result.proceed, "gate must NOT block when STATE.md is missing (deadlock #889)"); + assertEq(result.issues.length, 0, "missing STATE.md is not a blocking issue"); + assertTrue(result.fixesApplied.some((f: string) => f.includes("STATE.md")), "reports STATE.md status as info"); + } + console.log("\n=== health gate: stale crash lock auto-cleared ==="); { const dir = realpathSync(mkdtempSync(join(tmpdir(), "doc-proactive-")));