test(W7h): retire CEO TODO-menu prose pins from plan-review-calibration

W7h retirement (t04 F11; W7c list). The calibration corpus and
buildPlanReviewDecisionPrompt never read this CEO prose; the AUQ format
tokens (consumed by plan-tune and judges) and the calibration-harness
outcome tests are unchanged.

Retirement card:
- test: plan-review-calibration.test.ts, the six CEO TODO-menu pins ('Only
  unanswered TODO proposals reach this menu', 'Do not ask again about an item
  already deferred, skipped or kept', 'carry its actual answer and destination
  forward', 'Resolve each remaining proposal through all four steps of 0D,
  using the menu below', 'Never batch TODOs — one per question').
- detects: edits to plan-ceo-review TODO-menu prose.
- non_test_callers: none (test-only reads of the template).
- search_command: grep -rn "Never batch TODOs\|Only unanswered TODO" test/
- stronger_proof / replacement: skill-ceo-section-ordering.test.ts 'TODOS.md
  updates' slice keeps /i meaning checks for unanswered-only, no re-asking
  and one TODO per question (CEO invariants are periodic-only under the W7c
  gate, so they keep a free check); 'route through 0D' stays covered by that
  file's 0D route checks.
- history: 636175d v1.87.6.0.
- validation: bun test test/plan-review-calibration.test.ts.

Controls (scratch worktree): replacing 'Never batch TODOs — one per question'
or deleting 'Only unanswered TODO proposals reach this menu' turns
skill-ceo-section-ordering.test.ts red (2/2); in this file, removing an AUQ
format token goes red and rewording the retired TODO sentence stays green
(2/2). Log: .context/mutation-plan-review-calibration.md.
This commit is contained in:
garrytan committed 2026-10-03 01:21:02 +00:00
1 parent 561b82e861
commit d2f53fcb9c
1 file changed
-7
-7
View File
@@ -9,14 +9,7 @@ const ROOT = path.resolve(import.meta.dir, '..');
test('calibration briefs preserve source-required structure and actual choices without phase/qid reliance', () => {
const format = fs.readFileSync(path.join(ROOT, 'scripts/resolvers/preamble/generate-ask-user-format.ts'), 'utf8');
const split = fs.readFileSync(path.join(ROOT, 'docs/askuserquestion-split.md'), 'utf8');
const ceo = fs.readFileSync(path.join(ROOT, 'plan-ceo-review/sections/review-sections.md.tmpl'), 'utf8');
for (const token of ['Project/branch/task:', 'ELI10:', 'Stakes if we pick wrong:', 'Recommendation:', 'Pros / cons:', 'Net:']) expect(format).toContain(token);
const todo = ceo.slice(ceo.indexOf('Only unanswered TODO proposals'), ceo.indexOf('For each TODO, describe:')).replace(/\s+/g, ' ');
expect(todo).toContain('Only unanswered TODO proposals reach this menu');
expect(todo).toContain('Do not ask again about an item already deferred, skipped or kept');
expect(todo).toContain('carry its actual answer and destination forward');
expect(todo).toContain('Resolve each remaining proposal through all four steps of 0D, using the menu below');
expect(todo).toContain('Never batch TODOs — one per question');
for (const token of ['Include', 'Defer', 'Cut', 'Hold']) expect(split).toContain(token);
const corpus = planDecisionCalibrations();
expect(corpus).toHaveLength(4);