feat(design): PRODUCT.md prefill + /impeccable handoffs

design-consultation's context gathering and design-shotgun's auto-gather read
PRODUCT.md (impeccable's product-context file) when it exists: it counts as
the user's prior answers, gets confirmed in one line, and is never re-asked.
Neither skill opens `.claude/skills/impeccable/**`; PRODUCT.md and DESIGN.md
are the shared surface, and impeccable's prose never loads inside a gstack
skill.

Handoffs: ship's review-lite ends each NEEDS INPUT detector row with the
`handoff=` command the scan printed (`/impeccable <cmd>`) when the probe
reported IMPECCABLE_SKILL: present, recommending the command and never
opening its files; design-review's Phase 7 does the same for deferred
findings, and `design_detector: off` silences handoff lines with the rest.
Codex and Factory ship goldens refreshed.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
Garry Tan
2026-09-08 16:27:37 +00:00
co-authored by Claude Fable 5.1
parent 35d641b4b2
commit 4308e487aa
9 changed files with 36 additions and 4 deletions
+20
View File
@@ -2002,6 +2002,26 @@ describe('DESIGN_MD_CHECK resolver and open DESIGN.md adoption', () => {
});
});
// --- PRODUCT.md prefill + /impeccable handoffs ---
describe('PRODUCT.md prefill and /impeccable handoffs', () => {
test('design-consultation and design-shotgun read PRODUCT.md and never open the impeccable skill', () => {
for (const skill of ['design-consultation', 'design-shotgun']) {
const c = readSkillUnion(skill);
expect(c).toContain('cat PRODUCT.md 2>/dev/null | head -120 || echo "NO_PRODUCT_MD"');
expect(c).toContain('do not re-ask');
expect(c).toContain('Never open `.claude/skills/impeccable/**`');
}
});
test('handoffs are gated on IMPECCABLE_SKILL: present in review-lite and design-review', () => {
expect(readSkillUnion('ship')).toContain('IMPECCABLE_SKILL: present`, end each NEEDS INPUT detector row with the `handoff=` command');
const dr = fs.readFileSync(path.join(ROOT, 'design-review', 'SKILL.md'), 'utf-8');
expect(dr).toContain('a deferred one ends with its `handoff=` command when `IMPECCABLE_SKILL: present`');
expect(dr).toContain('skip every detector step, including `/impeccable` handoff lines');
});
});
// --- Extended DESIGN_SKETCH resolver tests ---
describe('DESIGN_SKETCH extended with outside voices', () => {