From 75b22463f3061a094f1356ec95a5447bafa64efe Mon Sep 17 00:00:00 2001 From: garrytan Date: Tue, 29 Sep 2026 16:57:54 +0000 Subject: [PATCH] fix(plan-ceo-review): restore experience-first expansion framing, require the mode handoff, skip pacing menus Census 36597762183: both mode-routing runs logged provenance and moved on without the mandated handoff chat; the EXPANSION run asked an unauthorized batch/narrow pacing menu instead of the first per-addition question; the expansion-energy proposals led with the spec because v1.87.6.0 dropped 'lead with the felt experience'. The HOLD review detector also rejected a decision whose grounding line named no plan file although the owned source Read binds it. --- plan-ceo-review/SKILL.md | 8 ++++---- plan-ceo-review/SKILL.md.tmpl | 8 ++++---- test/ceo-hold-posture-review.test.ts | 8 ++++++++ test/helpers/ceo-hold-posture-review.ts | 3 ++- 4 files changed, 18 insertions(+), 9 deletions(-) diff --git a/plan-ceo-review/SKILL.md b/plan-ceo-review/SKILL.md index ce380f764..4f46d50de 100644 --- a/plan-ceo-review/SKILL.md +++ b/plan-ceo-review/SKILL.md @@ -1032,11 +1032,11 @@ Follow the preamble's session rules; `CONDUCTOR_SESSION: true` changes transport wins. When `QUESTION_TUNING: true`, include ``. These modes differ in kind, not coverage; do NOT score completeness. -4. **Mode handoff:** After selection, send brief chat before tools or further questions: the mode's application and rationale; every governing approved row's ID, answer reference and accepted scope. Keep rows separate. +4. **Mode handoff:** After selection, always send brief chat before tools or further questions: the mode's application and rationale; every governing approved row's ID, answer reference and accepted scope. Keep rows separate. - `plan-ceo-review-mode: AUTO_DECIDE`: `Auto-decided review mode → (your preference). Change with /plan-tune. Approved decisions: . .` - Other selections: `Mode: ; approved decisions: . .` -Record mode provenance after the handoff: +Record mode provenance after the handoff chat: - **Explicit user choice:** instruction and mode; no question log because none was asked. - **Successful preference check:** result and recommendation; log `plan-ceo-review-mode`, `auto_decided: true`. - **Actual question answer:** question, answer reference and mode; log `auto_decided: false`, including the question ID only when `QUESTION_TUNING: true`. @@ -1075,14 +1075,14 @@ In expansion modes, extend 0F's pending list. 1. **10x check:** Describe 10x value for 2x effort. 2. **Platonic ideal:** What would the best engineer with unlimited time and perfect taste build? Start with the user's experience. 3. **Delight scan:** List at least 5 adjacent 30-minute improvements that would delight the user. -4. **Expansion opt-in ceremony:** Present visions and individual proposals; enthusiastically explain each one's value. The user decides. +4. **Expansion opt-in ceremony:** Lead each proposal with the felt user experience, then its shape, effort and impact. The user decides. **For SELECTIVE EXPANSION:** 1. Run all three HOLD SCOPE checks below, including their defer/keep decisions. 2. Describe 10x ambition, run the delight scan and assess platform potential. Candidates stay pending until scope answers. 3. **Cherry-pick ceremony:** Use 0F with S/M/L/XL effort and risk. For more than 8, present the top 5–6; offer the rest on request. -For both expansion modes, ask separately for each addition: **A)** Add to this plan's scope **B)** Defer to TODOS.md **C)** Skip. Accepted items govern the remaining sections. +For both expansion modes, ask separately for each addition, starting with the first; no pacing menu: **A)** Add to this plan's scope **B)** Defer to TODOS.md **C)** Skip. Accepted items govern the remaining sections. **For HOLD SCOPE** — run this: 1. Complexity check: at more than 8 files or more than 2 new classes/services, challenge whether fewer moving parts achieve the same goal. diff --git a/plan-ceo-review/SKILL.md.tmpl b/plan-ceo-review/SKILL.md.tmpl index ebe5f802c..8b47e3195 100644 --- a/plan-ceo-review/SKILL.md.tmpl +++ b/plan-ceo-review/SKILL.md.tmpl @@ -415,11 +415,11 @@ Follow the preamble's session rules; `CONDUCTOR_SESSION: true` changes transport wins. When `QUESTION_TUNING: true`, include ``. These modes differ in kind, not coverage; do NOT score completeness. -4. **Mode handoff:** After selection, send brief chat before tools or further questions: the mode's application and rationale; every governing approved row's ID, answer reference and accepted scope. Keep rows separate. +4. **Mode handoff:** After selection, always send brief chat before tools or further questions: the mode's application and rationale; every governing approved row's ID, answer reference and accepted scope. Keep rows separate. - `plan-ceo-review-mode: AUTO_DECIDE`: `Auto-decided review mode → (your preference). Change with /plan-tune. Approved decisions: . .` - Other selections: `Mode: ; approved decisions: . .` -Record mode provenance after the handoff: +Record mode provenance after the handoff chat: - **Explicit user choice:** instruction and mode; no question log because none was asked. - **Successful preference check:** result and recommendation; log `plan-ceo-review-mode`, `auto_decided: true`. - **Actual question answer:** question, answer reference and mode; log `auto_decided: false`, including the question ID only when `QUESTION_TUNING: true`. @@ -458,14 +458,14 @@ In expansion modes, extend 0F's pending list. 1. **10x check:** Describe 10x value for 2x effort. 2. **Platonic ideal:** What would the best engineer with unlimited time and perfect taste build? Start with the user's experience. 3. **Delight scan:** List at least 5 adjacent 30-minute improvements that would delight the user. -4. **Expansion opt-in ceremony:** Present visions and individual proposals; enthusiastically explain each one's value. The user decides. +4. **Expansion opt-in ceremony:** Lead each proposal with the felt user experience, then its shape, effort and impact. The user decides. **For SELECTIVE EXPANSION:** 1. Run all three HOLD SCOPE checks below, including their defer/keep decisions. 2. Describe 10x ambition, run the delight scan and assess platform potential. Candidates stay pending until scope answers. 3. **Cherry-pick ceremony:** Use 0F with S/M/L/XL effort and risk. For more than 8, present the top 5–6; offer the rest on request. -For both expansion modes, ask separately for each addition: **A)** Add to this plan's scope **B)** Defer to TODOS.md **C)** Skip. Accepted items govern the remaining sections. +For both expansion modes, ask separately for each addition, starting with the first; no pacing menu: **A)** Add to this plan's scope **B)** Defer to TODOS.md **C)** Skip. Accepted items govern the remaining sections. **For HOLD SCOPE** — run this: 1. Complexity check: at more than 8 files or more than 2 new classes/services, challenge whether fewer moving parts achieve the same goal. diff --git a/test/ceo-hold-posture-review.test.ts b/test/ceo-hold-posture-review.test.ts index 41eb40402..262b7c08b 100644 --- a/test/ceo-hold-posture-review.test.ts +++ b/test/ceo-hold-posture-review.test.ts @@ -276,3 +276,11 @@ for(const sourcePath of ['C:\\owned\\PLAN.md','\\\\server\\share\\PLAN.md'])test expect(r.deadlines).toEqual([r.deadline]);expect(r.error).toBeUndefined();expect(r.snapshots.at(-1)).toBe('posture_confirmed'); }else{expect(r.error).toBeInstanceOf(Error);expect(r.snapshots.at(-1)).toBe('failed');} }); + +test('a decision whose grounding line names no plan file stays bound by the owned source Read (census 36597762183 HOLD D2)',()=>{ + const f=input();revise(f,q=>{q.question=q.question.replace(/Project\/branch\/task:[^\n]*/,'Project/branch/task: gstack-plan-count on main, HOLD SCOPE review of saved project views.');}); + expect(buildCeoHoldPostureReview(f)!.plan).toBe(f.source.content); + const unread=input();revise(unread,q=>{q.question=q.question.replace(/Project\/branch\/task:[^\n]*/,'Project/branch/task: gstack-plan-count on main, HOLD SCOPE review of saved project views.');}); + unread.publicTools=unread.publicTools.filter(e=>e.toolUseId!==sourceId); + expect(()=>buildCeoHoldPostureReview(unread)).toThrow('complete original source Read/ACK'); +}); diff --git a/test/helpers/ceo-hold-posture-review.ts b/test/helpers/ceo-hold-posture-review.ts index b4e8e489d..d7b97646b 100644 --- a/test/helpers/ceo-hold-posture-review.ts +++ b/test/helpers/ceo-hold-posture-review.ts @@ -64,7 +64,8 @@ export function buildCeoHoldPostureReview(input: CeoHoldPostureReviewInput): Pla for (const call of [mode, decision]) { const context = /Project\/branch\/task:([^\n]*)/i.exec(call.questions[0]!.question)?.[1] ?? ''; const plans = [...new Set(context.match(/(? 1 || (plans.length === 1 && plans[0] !== name && plans[0] !== source.path)) fail('native source context differs from original plan'); } const decisionContext = /Project\/branch\/task:([^\n]*)/i.exec(decision.questions[0]!.question)?.[1] ?? ''; if (!/\bHOLD SCOPE\b/.test(decisionContext) ||