diff --git a/src/agent/directors/brand-reviewer/package.test.ts b/src/agent/directors/brand-reviewer/package.test.ts index 86a0b59f0..d88bf4bd0 100644 --- a/src/agent/directors/brand-reviewer/package.test.ts +++ b/src/agent/directors/brand-reviewer/package.test.ts @@ -33,14 +33,6 @@ describe("brandReviewerPackage", () => { expect(brandReviewerPackage.systemPrompt).not.toMatch(/authz/i); }); - test("report.requiredSections covers the leaf envelope", () => { - const sections = brandReviewerPackage.report.requiredSections; - expect(sections).toContain("Summary"); - expect(sections).toContain("Findings"); - expect(sections).toContain("Blockers"); - expect(sections).toContain("Paths"); - }); - test("modelRole is docs", () => { expect(brandReviewerPackage.modelRole).toBe("docs"); }); diff --git a/src/agent/directors/brand-reviewer/package.ts b/src/agent/directors/brand-reviewer/package.ts index 323ce1c02..6490f073d 100644 --- a/src/agent/directors/brand-reviewer/package.ts +++ b/src/agent/directors/brand-reviewer/package.ts @@ -17,7 +17,6 @@ export const brandReviewerPackage: DirectorPackage = { tools: { allow: DOCS_TOOLS }, spawn: { maySpawn: false }, nudge: { maxTurns: 40 }, - report: { requiredSections: ["Summary", "Findings", "Blockers", "Paths"] }, modelRole: "docs", systemPrompt: `You are BrandReviewerDirector, a specialist in Corbits Code. diff --git a/src/agent/directors/bruckheimer/package.test.ts b/src/agent/directors/bruckheimer/package.test.ts index d3ca05e4e..4fdcbd1c3 100644 --- a/src/agent/directors/bruckheimer/package.test.ts +++ b/src/agent/directors/bruckheimer/package.test.ts @@ -29,12 +29,6 @@ describe("bruckheimerPackage", () => { expect(bruckheimerPackage.writePaths).toBeUndefined(); }); - test("report requires envelope sections", () => { - for (const section of ["Summary", "Findings", "Blockers", "Paths"]) { - expect(bruckheimerPackage.report.requiredSections).toContain(section); - } - }); - test("modelRole is docs", () => { expect(bruckheimerPackage.modelRole).toBe("docs"); }); diff --git a/src/agent/directors/bruckheimer/package.ts b/src/agent/directors/bruckheimer/package.ts index 921856556..63acdce20 100644 --- a/src/agent/directors/bruckheimer/package.ts +++ b/src/agent/directors/bruckheimer/package.ts @@ -18,7 +18,6 @@ export const bruckheimerPackage: DirectorPackage = { tools: { allow: DOCS_TOOLS }, spawn: { maySpawn: false }, nudge: { maxTurns: 40 }, - report: { requiredSections: ["Summary", "Findings", "Blockers", "Paths"] }, modelRole: "docs", systemPrompt: `You are BruckheimerDirector, a specialist in Corbits Code. diff --git a/src/agent/directors/build/package.test.ts b/src/agent/directors/build/package.test.ts index 6b754227b..4b4d4260b 100644 --- a/src/agent/directors/build/package.test.ts +++ b/src/agent/directors/build/package.test.ts @@ -27,14 +27,6 @@ describe("buildDirectorPackage", () => { expect(allow).toContain("apply_patch"); }); - test("report.requiredSections includes Summary, Findings, Blockers, Paths", () => { - const sections = buildDirectorPackage.report.requiredSections; - expect(sections).toContain("Summary"); - expect(sections).toContain("Findings"); - expect(sections).toContain("Blockers"); - expect(sections).toContain("Paths"); - }); - test("modelRole is implement", () => { expect(buildDirectorPackage.modelRole).toBe("implement"); }); diff --git a/src/agent/directors/build/package.ts b/src/agent/directors/build/package.ts index 39786171d..f348ea17b 100644 --- a/src/agent/directors/build/package.ts +++ b/src/agent/directors/build/package.ts @@ -16,7 +16,6 @@ export const buildDirectorPackage: DirectorPackage = { tools: { allow: BUILD_TOOLS }, spawn: { maySpawn: false }, nudge: { maxTurns: 60 }, - report: { requiredSections: ["Summary", "Findings", "Blockers", "Paths"] }, modelRole: "implement", systemPrompt: `You are BuildDirector, a specialist in Corbits Code. diff --git a/src/agent/directors/critique/package.test.ts b/src/agent/directors/critique/package.test.ts index 2801b174c..038a995f4 100644 --- a/src/agent/directors/critique/package.test.ts +++ b/src/agent/directors/critique/package.test.ts @@ -64,14 +64,6 @@ describe("critiquePackage", () => { expect(allow).not.toContain("delete_file"); }); - test("report.requiredSections covers the leaf envelope", () => { - const sections = critiquePackage.report.requiredSections; - expect(sections).toContain("Summary"); - expect(sections).toContain("Findings"); - expect(sections).toContain("Blockers"); - expect(sections).toContain("Paths"); - }); - test("modelRole is review", () => { expect(critiquePackage.modelRole).toBe("review"); }); diff --git a/src/agent/directors/critique/package.ts b/src/agent/directors/critique/package.ts index c401b7a8c..5cffb1efb 100644 --- a/src/agent/directors/critique/package.ts +++ b/src/agent/directors/critique/package.ts @@ -20,7 +20,6 @@ export const critiquePackage: DirectorPackage = { tools: { allow: REVIEW_TOOLS }, spawn: { maySpawn: false }, nudge: { maxTurns: 45 }, - report: { requiredSections: ["Summary", "Findings", "Blockers", "Paths"] }, modelRole: "review", systemPrompt: `You are CritiqueDirector, a specialist in Corbits Code. diff --git a/src/agent/directors/draper/package.test.ts b/src/agent/directors/draper/package.test.ts index f8417933e..dddf64af3 100644 --- a/src/agent/directors/draper/package.test.ts +++ b/src/agent/directors/draper/package.test.ts @@ -28,14 +28,6 @@ describe("draperPackage", () => { expect(allow).not.toContain("delete_file"); }); - test("report.requiredSections covers the leaf envelope", () => { - const sections = draperPackage.report.requiredSections; - expect(sections).toContain("Summary"); - expect(sections).toContain("Findings"); - expect(sections).toContain("Blockers"); - expect(sections).toContain("Paths"); - }); - test("modelRole is review", () => { expect(draperPackage.modelRole).toBe("review"); }); diff --git a/src/agent/directors/draper/package.ts b/src/agent/directors/draper/package.ts index bc866c4db..3ffd249bf 100644 --- a/src/agent/directors/draper/package.ts +++ b/src/agent/directors/draper/package.ts @@ -19,7 +19,6 @@ export const draperPackage: DirectorPackage = { tools: { allow: REVIEW_TOOLS }, spawn: { maySpawn: false }, nudge: { maxTurns: 40 }, - report: { requiredSections: ["Summary", "Findings", "Blockers", "Paths"] }, modelRole: "review", systemPrompt: `You are DraperDirector, a specialist in Corbits Code. diff --git a/src/agent/directors/emil/package.test.ts b/src/agent/directors/emil/package.test.ts index 959c328f7..234550d9d 100644 --- a/src/agent/directors/emil/package.test.ts +++ b/src/agent/directors/emil/package.test.ts @@ -28,14 +28,6 @@ describe("emilPackage", () => { expect(allow).not.toContain("delete_file"); }); - test("report.requiredSections covers the leaf envelope", () => { - const sections = emilPackage.report.requiredSections; - expect(sections).toContain("Summary"); - expect(sections).toContain("Findings"); - expect(sections).toContain("Blockers"); - expect(sections).toContain("Paths"); - }); - test("modelRole is review", () => { expect(emilPackage.modelRole).toBe("review"); }); diff --git a/src/agent/directors/emil/package.ts b/src/agent/directors/emil/package.ts index 73f886548..f7011ae5c 100644 --- a/src/agent/directors/emil/package.ts +++ b/src/agent/directors/emil/package.ts @@ -19,7 +19,6 @@ export const emilPackage: DirectorPackage = { tools: { allow: REVIEW_TOOLS }, spawn: { maySpawn: false }, nudge: { maxTurns: 40 }, - report: { requiredSections: ["Summary", "Findings", "Blockers", "Paths"] }, modelRole: "review", systemPrompt: `You are EmilDirector, a specialist in Corbits Code. diff --git a/src/agent/directors/explore/package.test.ts b/src/agent/directors/explore/package.test.ts index 2f76d148e..3bb7dc66c 100644 --- a/src/agent/directors/explore/package.test.ts +++ b/src/agent/directors/explore/package.test.ts @@ -52,14 +52,6 @@ describe("explorePackage", () => { expect(allow).not.toContain("delete_file"); }); - test("report.requiredSections covers the leaf envelope", () => { - const sections = explorePackage.report.requiredSections; - expect(sections).toContain("Summary"); - expect(sections).toContain("Findings"); - expect(sections).toContain("Blockers"); - expect(sections).toContain("Paths"); - }); - test("modelRole is explore", () => { expect(explorePackage.modelRole).toBe("explore"); }); diff --git a/src/agent/directors/explore/package.ts b/src/agent/directors/explore/package.ts index 95aee302f..3c822269e 100644 --- a/src/agent/directors/explore/package.ts +++ b/src/agent/directors/explore/package.ts @@ -27,6 +27,5 @@ Report: Summary, Findings, Blockers, Paths.`, tools: { allow: READ_TOOLS }, spawn: { maySpawn: false }, nudge: { maxTurns: 35 }, - report: { requiredSections: ["Summary", "Findings", "Blockers", "Paths"] }, modelRole: "explore", }; diff --git a/src/agent/directors/gaasbot/package.test.ts b/src/agent/directors/gaasbot/package.test.ts index b857d7d5f..303ba7300 100644 --- a/src/agent/directors/gaasbot/package.test.ts +++ b/src/agent/directors/gaasbot/package.test.ts @@ -27,12 +27,6 @@ describe("gaasbotPackage", () => { expect(allow).not.toContain("delete_file"); }); - test("report requires envelope sections", () => { - for (const section of ["Summary", "Findings", "Blockers", "Paths"]) { - expect(gaasbotPackage.report.requiredSections).toContain(section); - } - }); - test("modelRole is plan", () => { expect(gaasbotPackage.modelRole).toBe("plan"); }); diff --git a/src/agent/directors/gaasbot/package.ts b/src/agent/directors/gaasbot/package.ts index 6d8cb9cca..c46d5cd99 100644 --- a/src/agent/directors/gaasbot/package.ts +++ b/src/agent/directors/gaasbot/package.ts @@ -20,7 +20,6 @@ export const gaasbotPackage: DirectorPackage = { tools: { allow: REVIEW_TOOLS }, spawn: { maySpawn: false }, nudge: { maxTurns: 35 }, - report: { requiredSections: ["Summary", "Findings", "Blockers", "Paths"] }, modelRole: "plan", systemPrompt: `You are GaasbotDirector, a specialist in Corbits Code. diff --git a/src/agent/directors/greybeard/package.test.ts b/src/agent/directors/greybeard/package.test.ts index 00dae5aed..5480c8a61 100644 --- a/src/agent/directors/greybeard/package.test.ts +++ b/src/agent/directors/greybeard/package.test.ts @@ -53,12 +53,6 @@ describe("greybeardPackage", () => { expect(allow).not.toContain("delete_file"); }); - test("report requires envelope sections", () => { - for (const section of ["Summary", "Findings", "Blockers", "Paths"]) { - expect(greybeardPackage.report.requiredSections).toContain(section); - } - }); - test("modelRole is review", () => { expect(greybeardPackage.modelRole).toBe("review"); }); diff --git a/src/agent/directors/greybeard/package.ts b/src/agent/directors/greybeard/package.ts index 43a6450e4..791ea1866 100644 --- a/src/agent/directors/greybeard/package.ts +++ b/src/agent/directors/greybeard/package.ts @@ -17,7 +17,6 @@ export const greybeardPackage: DirectorPackage = { allowlist: ["intern", "explore", "critique"], }, nudge: { maxTurns: 50 }, - report: { requiredSections: ["Summary", "Findings", "Blockers", "Paths"] }, modelRole: "review", systemPrompt: `You are GreybeardDirector, a specialist in Corbits Code. diff --git a/src/agent/directors/index.ts b/src/agent/directors/index.ts index d4bf9a2bf..c675604d5 100644 --- a/src/agent/directors/index.ts +++ b/src/agent/directors/index.ts @@ -4,7 +4,6 @@ export { type DirectorPackage, type ModelRole, type NudgePolicy, - type ReportContract, type ResolveDirectorInput, type ResolveDirectorResult, type SpawnRights, diff --git a/src/agent/directors/intern/package.test.ts b/src/agent/directors/intern/package.test.ts index 3f8d0a234..e56e86792 100644 --- a/src/agent/directors/intern/package.test.ts +++ b/src/agent/directors/intern/package.test.ts @@ -31,12 +31,6 @@ describe("internPackage", () => { } }); - test("report.requiredSections envelope", () => { - for (const section of ["Summary", "Findings", "Blockers", "Paths"]) { - expect(internPackage.report.requiredSections).toContain(section); - } - }); - test("modelRole is implement", () => { expect(internPackage.modelRole).toBe("implement"); }); diff --git a/src/agent/directors/intern/package.ts b/src/agent/directors/intern/package.ts index 795ed003d..230b2a8cc 100644 --- a/src/agent/directors/intern/package.ts +++ b/src/agent/directors/intern/package.ts @@ -22,7 +22,6 @@ export const internPackage: DirectorPackage = { tools: { allow: INTERN_TOOLS }, spawn: { maySpawn: false }, nudge: { maxTurns: 20 }, - report: { requiredSections: ["Summary", "Findings", "Blockers", "Paths"] }, modelRole: "implement", systemPrompt: `You are InternDirector, a specialist in Corbits Code. diff --git a/src/agent/directors/neckbeard/package.test.ts b/src/agent/directors/neckbeard/package.test.ts index c2a2f5628..114d0e975 100644 --- a/src/agent/directors/neckbeard/package.test.ts +++ b/src/agent/directors/neckbeard/package.test.ts @@ -33,12 +33,6 @@ describe("neckbeardPackage", () => { expect(allow).not.toContain("delete_file"); }); - test("report requires envelope sections", () => { - for (const section of ["Summary", "Findings", "Blockers", "Paths"]) { - expect(neckbeardPackage.report.requiredSections).toContain(section); - } - }); - test("modelRole is review", () => { expect(neckbeardPackage.modelRole).toBe("review"); }); diff --git a/src/agent/directors/neckbeard/package.ts b/src/agent/directors/neckbeard/package.ts index eec278a5b..f701416f0 100644 --- a/src/agent/directors/neckbeard/package.ts +++ b/src/agent/directors/neckbeard/package.ts @@ -19,7 +19,6 @@ export const neckbeardPackage: DirectorPackage = { tools: { allow: REVIEW_TOOLS }, spawn: { maySpawn: false }, nudge: { maxTurns: 40 }, - report: { requiredSections: ["Summary", "Findings", "Blockers", "Paths"] }, modelRole: "review", systemPrompt: `You are NeckbeardDirector, a specialist in Corbits Code. diff --git a/src/agent/directors/plan/package.test.ts b/src/agent/directors/plan/package.test.ts index ba6656850..e98a0a481 100644 --- a/src/agent/directors/plan/package.test.ts +++ b/src/agent/directors/plan/package.test.ts @@ -27,12 +27,6 @@ describe("planPackage", () => { expect(allow).not.toContain("delete_file"); }); - test("report requires envelope sections", () => { - for (const section of ["Summary", "Findings", "Blockers", "Paths"]) { - expect(planPackage.report.requiredSections).toContain(section); - } - }); - test("modelRole is plan", () => { expect(planPackage.modelRole).toBe("plan"); }); diff --git a/src/agent/directors/plan/package.ts b/src/agent/directors/plan/package.ts index d1be1dffc..29778e2ab 100644 --- a/src/agent/directors/plan/package.ts +++ b/src/agent/directors/plan/package.ts @@ -10,7 +10,6 @@ export const planPackage: DirectorPackage = { tools: { allow: REVIEW_TOOLS }, spawn: { maySpawn: false }, nudge: { maxTurns: 40 }, - report: { requiredSections: ["Summary", "Findings", "Blockers", "Paths"] }, modelRole: "plan", systemPrompt: `You are PlanDirector, a specialist in Corbits Code. diff --git a/src/agent/directors/registry.test.ts b/src/agent/directors/registry.test.ts index 528a033ed..eb7df6a87 100644 --- a/src/agent/directors/registry.test.ts +++ b/src/agent/directors/registry.test.ts @@ -26,9 +26,6 @@ describe("director registry", () => { expect(pkg.systemPrompt.length).toBeGreaterThan(40); expect(pkg.systemPrompt.startsWith("Placeholder")).toBe(false); expect(pkg.systemPrompt.toLowerCase()).toContain("primary intent"); - expect(pkg.report.requiredSections).toEqual( - expect.arrayContaining(["Summary", "Findings", "Blockers", "Paths"]), - ); } }); diff --git a/src/agent/directors/shakespeare/package.test.ts b/src/agent/directors/shakespeare/package.test.ts index 41501eb47..93b447d42 100644 --- a/src/agent/directors/shakespeare/package.test.ts +++ b/src/agent/directors/shakespeare/package.test.ts @@ -39,14 +39,6 @@ describe("shakespearePackage", () => { expect(shakespearePackage.writePaths).toBeUndefined(); }); - test("report.requiredSections includes Summary, Findings, Blockers, Paths", () => { - const sections = shakespearePackage.report.requiredSections; - expect(sections).toContain("Summary"); - expect(sections).toContain("Findings"); - expect(sections).toContain("Blockers"); - expect(sections).toContain("Paths"); - }); - test("modelRole is docs", () => { expect(shakespearePackage.modelRole).toBe("docs"); }); diff --git a/src/agent/directors/shakespeare/package.ts b/src/agent/directors/shakespeare/package.ts index c883756e7..9117b4340 100644 --- a/src/agent/directors/shakespeare/package.ts +++ b/src/agent/directors/shakespeare/package.ts @@ -77,6 +77,5 @@ export const shakespearePackage: DirectorPackage = { tools: { allow: DOCS_TOOLS }, spawn: { maySpawn: false }, nudge: { maxTurns: 50 }, - report: { requiredSections: ["Summary", "Findings", "Blockers", "Paths"] }, modelRole: "docs", }; diff --git a/src/agent/directors/skywalker/package.test.ts b/src/agent/directors/skywalker/package.test.ts index bd0c9a7c6..f0363acb3 100644 --- a/src/agent/directors/skywalker/package.test.ts +++ b/src/agent/directors/skywalker/package.test.ts @@ -51,15 +51,6 @@ describe("skywalkerPackage", () => { expect(allow).toContain("delete_file"); }); - test("report required sections", () => { - expect(skywalkerPackage.report.requiredSections).toEqual([ - "Summary", - "Findings", - "Blockers", - "Paths", - ]); - }); - test("modelRole is orchestrator", () => { expect(skywalkerPackage.modelRole).toBe("orchestrator"); }); diff --git a/src/agent/directors/skywalker/package.ts b/src/agent/directors/skywalker/package.ts index f3487d1e8..629781ff8 100644 --- a/src/agent/directors/skywalker/package.ts +++ b/src/agent/directors/skywalker/package.ts @@ -192,8 +192,5 @@ export const skywalkerPackage: DirectorPackage = { ], }, nudge: { maxTurns: 100 }, - report: { - requiredSections: ["Summary", "Findings", "Blockers", "Paths"], - }, modelRole: "orchestrator", }; diff --git a/src/agent/directors/tester/package.test.ts b/src/agent/directors/tester/package.test.ts index cca9adafb..1c66c5a74 100644 --- a/src/agent/directors/tester/package.test.ts +++ b/src/agent/directors/tester/package.test.ts @@ -31,14 +31,6 @@ describe("testerPackage", () => { expect(allow).not.toContain("delete_file"); }); - test("report.requiredSections includes Summary, Findings, Blockers, Paths", () => { - const sections = testerPackage.report.requiredSections; - expect(sections).toContain("Summary"); - expect(sections).toContain("Findings"); - expect(sections).toContain("Blockers"); - expect(sections).toContain("Paths"); - }); - test("modelRole is test", () => { expect(testerPackage.modelRole).toBe("test"); }); diff --git a/src/agent/directors/tester/package.ts b/src/agent/directors/tester/package.ts index aefc78005..f55e948c3 100644 --- a/src/agent/directors/tester/package.ts +++ b/src/agent/directors/tester/package.ts @@ -33,6 +33,5 @@ Report: Summary, Findings (commands + results), Blockers, Paths.`, tools: { allow: READ_TOOLS }, spawn: { maySpawn: false }, nudge: { maxTurns: 40 }, - report: { requiredSections: ["Summary", "Findings", "Blockers", "Paths"] }, modelRole: "test", }; diff --git a/src/agent/directors/testsmith/package.test.ts b/src/agent/directors/testsmith/package.test.ts index cb8b6c324..ac9e3ee29 100644 --- a/src/agent/directors/testsmith/package.test.ts +++ b/src/agent/directors/testsmith/package.test.ts @@ -29,14 +29,6 @@ describe("testsmithPackage", () => { expect(allow).not.toContain("delete_file"); }); - test("report.requiredSections includes Summary, Findings, Blockers, Paths", () => { - const sections = testsmithPackage.report.requiredSections; - expect(sections).toContain("Summary"); - expect(sections).toContain("Findings"); - expect(sections).toContain("Blockers"); - expect(sections).toContain("Paths"); - }); - test("modelRole is test", () => { expect(testsmithPackage.modelRole).toBe("test"); }); diff --git a/src/agent/directors/testsmith/package.ts b/src/agent/directors/testsmith/package.ts index 6274f4760..e01f143d5 100644 --- a/src/agent/directors/testsmith/package.ts +++ b/src/agent/directors/testsmith/package.ts @@ -35,6 +35,5 @@ Report: Summary, Findings (strategy + cases), Blockers, Paths.`, tools: { allow: READ_TOOLS }, spawn: { maySpawn: false }, nudge: { maxTurns: 40 }, - report: { requiredSections: ["Summary", "Findings", "Blockers", "Paths"] }, modelRole: "test", }; diff --git a/src/agent/directors/types.ts b/src/agent/directors/types.ts index 259ea3054..d14924d92 100644 --- a/src/agent/directors/types.ts +++ b/src/agent/directors/types.ts @@ -48,11 +48,6 @@ export interface NudgePolicy { readonly stallMs?: number; } -export interface ReportContract { - /** Required top-level sections in the worker report. */ - readonly requiredSections: readonly string[]; -} - /** * One shipped director: hard primary intent + package fields. * Packages land in later levels; registry holds the closed set. @@ -80,7 +75,6 @@ export interface DirectorPackage { readonly writePaths?: readonly string[]; readonly spawn: SpawnRights; readonly nudge?: NudgePolicy; - readonly report: ReportContract; readonly modelRole: ModelRole; } diff --git a/src/prompts.test.ts b/src/prompts.test.ts index 0a26355aa..5ecad1b3e 100644 --- a/src/prompts.test.ts +++ b/src/prompts.test.ts @@ -3,6 +3,7 @@ import { expect, test } from "bun:test"; import { createChatDirector, submitOutputDefinition } from "./agent/director.js"; import { manageTasksDefinition } from "./agent/tasks.js"; import { CHAT_PROMPT_QUALITY_MARKERS } from "./agent/prompt-contract.js"; +import { hasReportEnvelope } from "./subagent/report.js"; import { buildActiveContext, buildAvailableTools, @@ -279,6 +280,19 @@ test("sub-agent report contract treats Success criteria as completion gate", () expect(contract).toContain("Intent / Do not"); }); +// Pins the only real report-envelope mechanism (buildSubAgentReportContract's +// prompt text and hasReportEnvelope's completeness check) to stay in sync, +// since director packages no longer declare their own requiredSections +// (CL-6969: that field was inert and enforced nothing). +test("sub-agent report contract's headings satisfy hasReportEnvelope", () => { + const contract = buildSubAgentReportContract(); + const headingsOnly = contract + .split("\n") + .filter((line) => line.startsWith("## ")) + .join("\n"); + expect(hasReportEnvelope(headingsOnly)).toBe(true); +}); + test("sub-agent prompt does not advertise tool_search (it gets the full toolset)", () => { const prompt = buildSubAgentSystemPrompt(); expect(prompt).not.toContain("tool_search");