feat(review): make review mandatory across pipeline skills (#433)
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
102
tests/pipeline-review-contract.test.ts
Normal file
102
tests/pipeline-review-contract.test.ts
Normal file
@@ -0,0 +1,102 @@
|
||||
import { readFile } from "fs/promises"
|
||||
import path from "path"
|
||||
import { describe, expect, test } from "bun:test"
|
||||
|
||||
async function readRepoFile(relativePath: string): Promise<string> {
|
||||
return readFile(path.join(process.cwd(), relativePath), "utf8")
|
||||
}
|
||||
|
||||
describe("ce:work review contract", () => {
|
||||
test("requires code review before shipping", async () => {
|
||||
const content = await readRepoFile("plugins/compound-engineering/skills/ce-work/SKILL.md")
|
||||
|
||||
// Phase 3 has a mandatory code review step (not optional)
|
||||
expect(content).toContain("2. **Code Review**")
|
||||
expect(content).not.toContain("Consider Code Review")
|
||||
expect(content).not.toContain("Code Review** (Optional)")
|
||||
|
||||
// Two-tier rubric
|
||||
expect(content).toContain("**Tier 1: Inline self-review**")
|
||||
expect(content).toContain("**Tier 2: Full review (default)**")
|
||||
expect(content).toContain("ce:review")
|
||||
expect(content).toContain("mode:autofix")
|
||||
|
||||
// Quality checklist includes review
|
||||
expect(content).toContain("Code review completed (inline self-review or full `ce:review`)")
|
||||
})
|
||||
|
||||
test("delegates commit and PR to dedicated skills", async () => {
|
||||
const content = await readRepoFile("plugins/compound-engineering/skills/ce-work/SKILL.md")
|
||||
|
||||
expect(content).toContain("`git-commit-push-pr` skill")
|
||||
expect(content).toContain("`git-commit` skill")
|
||||
|
||||
// Should not contain inline PR templates or attribution placeholders
|
||||
expect(content).not.toContain("gh pr create")
|
||||
expect(content).not.toContain("[HARNESS_URL]")
|
||||
})
|
||||
|
||||
test("ce:work-beta mirrors review and commit delegation", async () => {
|
||||
const beta = await readRepoFile("plugins/compound-engineering/skills/ce-work-beta/SKILL.md")
|
||||
|
||||
// Both have mandatory review
|
||||
expect(beta).toContain("2. **Code Review**")
|
||||
expect(beta).not.toContain("Consider Code Review")
|
||||
|
||||
// Both delegate to git skills
|
||||
expect(beta).toContain("`git-commit-push-pr` skill")
|
||||
expect(beta).toContain("`git-commit` skill")
|
||||
expect(beta).not.toContain("gh pr create")
|
||||
})
|
||||
})
|
||||
|
||||
describe("ce:brainstorm review contract", () => {
|
||||
test("requires document review before handoff", async () => {
|
||||
const content = await readRepoFile("plugins/compound-engineering/skills/ce-brainstorm/SKILL.md")
|
||||
|
||||
// Phase 3.5 exists and runs document-review
|
||||
expect(content).toContain("### Phase 3.5: Document Review")
|
||||
expect(content).toContain("`document-review` skill")
|
||||
|
||||
// Handoff option is for additional passes, not the first review
|
||||
expect(content).toContain("**Run additional document review**")
|
||||
expect(content).not.toContain("**Review and refine**")
|
||||
})
|
||||
})
|
||||
|
||||
describe("ce:plan review contract", () => {
|
||||
test("requires document review after confidence check", async () => {
|
||||
const content = await readRepoFile("plugins/compound-engineering/skills/ce-plan/SKILL.md")
|
||||
|
||||
// Phase 5.3.8 runs document-review before final checks (5.3.9)
|
||||
expect(content).toContain("##### 5.3.8 Document Review")
|
||||
expect(content).toContain("`document-review` skill")
|
||||
|
||||
// Document review must come before final checks so auto-applied edits are validated
|
||||
const docReviewIdx = content.indexOf("5.3.8 Document Review")
|
||||
const finalChecksIdx = content.indexOf("5.3.9 Final Checks")
|
||||
expect(docReviewIdx).toBeLessThan(finalChecksIdx)
|
||||
})
|
||||
|
||||
test("uses headless mode in pipeline context", async () => {
|
||||
const content = await readRepoFile("plugins/compound-engineering/skills/ce-plan/SKILL.md")
|
||||
|
||||
// Pipeline mode runs document-review headlessly, not skipping it
|
||||
expect(content).toContain("document-review` with `mode:headless`")
|
||||
expect(content).not.toContain("skip document-review and return control")
|
||||
})
|
||||
|
||||
test("handoff options recommend ce:work after review", async () => {
|
||||
const content = await readRepoFile("plugins/compound-engineering/skills/ce-plan/SKILL.md")
|
||||
|
||||
// ce:work is recommended (review already happened)
|
||||
expect(content).toContain("**Start `/ce:work`** - Begin implementing this plan in the current environment (recommended)")
|
||||
|
||||
// Document review option is for additional passes
|
||||
expect(content).toContain("**Run additional document review**")
|
||||
|
||||
// No conditional ordering based on plan depth (review already ran)
|
||||
expect(content).not.toContain("**Options when document-review is recommended:**")
|
||||
expect(content).not.toContain("**Options for Standard or Lightweight plans:**")
|
||||
})
|
||||
})
|
||||
@@ -78,7 +78,7 @@ describe("ce-review contract", () => {
|
||||
"Only include `gated_auto` findings in the fixer queue after the user explicitly approves the specific items.",
|
||||
)
|
||||
expect(content).toContain(
|
||||
'If the fixer queue is empty, do not offer "Apply safe_auto fixes" options.',
|
||||
"If no `gated_auto` or `manual` findings remain after safe fixes, skip the policy question entirely",
|
||||
)
|
||||
expect(content).toContain(
|
||||
"In autofix mode, create durable todo files only for unresolved actionable findings whose final owner is `downstream-resolver`.",
|
||||
|
||||
Reference in New Issue
Block a user