import assert from "node:assert/strict"; import test from "node:test"; import { mkdtemp, readFile, rm, writeFile } from "node:fs/promises"; import { tmpdir } from "node:os"; import { join } from "node:path"; import { DEFAULT_CONFIG, stage } from "../src/domain"; import { bootstrapProject } from "../src/persistence"; import { createState, recordEvidence, startStage } from "../src/state"; import { validatePom } from "../src/validators"; test("stage gate rejects starter shell then accepts substantive evidence-backed artifact", async () => { const parent = await mkdtemp(join(tmpdir(), "pom-validation-")); try { const config = { ...DEFAULT_CONFIG, projectRootMode: "child" as const }; let state = createState("Validation Test", parent, config, true); await bootstrapProject(state); state = startStage(state, 0); const initial = await validatePom(state, "stage", { writeReport: false }); assert.equal(initial.passed, false); assert.ok(initial.checks.some((item) => item.id.includes("bytes") && item.status === "fail")); const sections = ["Vision", "Audience", "Constraints", "Success Criteria", "Open Questions"]; const body = sections.map((heading) => `## ${heading}\n\n${("Specific, measurable, original production detail. ").repeat(18)}`).join("\n\n"); const briefPath = join(state.projectRoot, "01_planning", "00_project_brief.md"); const original = await readFile(briefPath, "utf8"); await writeFile(briefPath, `${original.split("## Vision")[0]}${body}\n`); for (const criterion of stage(0).acceptance) { state = recordEvidence(state, criterion.id, `Verified ${criterion.description}`, ["01_planning/00_project_brief.md"], "Test"); } const final = await validatePom(state, "stage", { writeReport: false }); assert.equal(final.passed, true, final.checks.filter((item) => item.status === "fail").map((item) => item.message).join("\n")); } finally { await rm(parent, { recursive: true, force: true }); } });