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.
This commit is contained in:
garrytan committed 2026-09-29 16:57:54 +00:00
1 parent 45cdfab2a0
commit 75b22463f3
4 files changed
+18 -9

No files matched your search

+4 -4
View File
@@ -1032,11 +1032,11 @@ Follow the preamble's session rules; `CONDUCTOR_SESSION: true` changes transport
wins. When `QUESTION_TUNING: true`, include `<gstack-qid:plan-ceo-review-mode>`.
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 → <selected mode> (your preference). Change with /plan-tune. Approved decisions: <rows or none>. <Application and rationale>.`
- Other selections: `Mode: <selected mode>; approved decisions: <rows or none>. <Application and rationale>.`
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.
+4 -4
View File
@@ -415,11 +415,11 @@ Follow the preamble's session rules; `CONDUCTOR_SESSION: true` changes transport
wins. When `QUESTION_TUNING: true`, include `<gstack-qid:plan-ceo-review-mode>`.
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 → <selected mode> (your preference). Change with /plan-tune. Approved decisions: <rows or none>. <Application and rationale>.`
- Other selections: `Mode: <selected mode>; approved decisions: <rows or none>. <Application and rationale>.`
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.
+8
View File
@@ -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');
});
+2 -1
View File
@@ -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(/(?<![\w.:/\\-])[\w.:/\\-]+\.md(?![\w.:/\\-])/gi) ?? [])];
if (plans.length !== 1 || (plans[0] !== name && plans[0] !== source.path)) fail('native source context differs from original plan');
// Naming no plan leaves the owned source Read below as the binding; naming another or several plans does not.
if (plans.length > 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) ||