@linimin/pi-letscook 0.1.66 → 0.1.68

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -5,33 +5,33 @@ ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
5
5
  cd "$ROOT"
6
6
  export PI_COMPLETION_RUNNING_RELEASE_CHECK=1
7
7
 
8
- echo "[release-check] running control-plane validation, tracked .agent contract coverage, slice-surface parity, explicit-/cook parity, startup/refocus/context regressions, canonical evidence artifact, active-slice contract, observability, legacy cleanup, evaluator calibration, and rubric contract coverage"
8
+ echo "[release-check] running control-plane validation, tracked .agent contract coverage, slice-surface parity, /cook startup-plan parity, startup/refocus/context regressions, canonical evidence artifact, active-slice contract, observability, legacy cleanup, evaluator calibration, and rubric contract coverage"
9
9
  bash .agent/verify_completion_control_plane.sh
10
10
  git ls-files --error-unmatch .agent/README.md .agent/mission.md .agent/profile.json .agent/verify_completion_stop.sh .agent/verify_completion_control_plane.sh >/dev/null
11
11
 
12
- echo "[release-check] verifying public /cook parity and primary-agent-handoff docs/help"
12
+ echo "[release-check] verifying public /cook parity and startup-plan docs/help"
13
13
  python3 - <<'PY'
14
14
  from pathlib import Path
15
15
 
16
16
  checks = {
17
17
  "README.md": [
18
18
  "You can still implement directly in ordinary chat when you do not need workflow state.",
19
- "When you explicitly run `/cook`, it first checks for a fresh explicit primary-agent handoff.",
20
- "If one is missing, it calls a same-entry primary-agent handoff synthesis step from the current task context, then asks you to **Start** or **Cancel** before rewriting canonical workflow state.",
21
- "Explicit `/cook` capsules are still valid startup intake, but they are no longer the only path because `/cook` can synthesize the primary-agent handoff in the same entry when needed.",
19
+ "When you explicitly run `/cook`, it always calls a same-entry primary-agent startup-plan synthesis step from the current task context, then asks you to **Start** or **Cancel** before rewriting canonical workflow state.",
20
+ "After **Start**, the approved startup plan is written into `.agent/startup-plan.json` / `.agent/startup-plan.md`, and `completion-regrounder` uses it to derive canonical slices from current repo truth.",
21
+ "Optional preview capsules in ordinary chat are advisory only. `/cook` does not directly consume them as approval-ready workflow state; it synthesizes a fresh startup plan in the `/cook` entry.",
22
22
  ],
23
23
  "CHANGELOG.md": [
24
- "changed `/cook` entry again so it now calls a same-entry primary-agent handoff synthesis step when no fresh explicit handoff exists, then proceeds directly to Start / Cancel without requiring a second `/cook` run",
25
- "kept `/cook` from guessing startup purely from recent discussion by requiring that same-entry synthesis step to produce explicit primary-agent handoff data before workflow state can start",
24
+ "simplified `/cook` startup sourcing so workflow proposals now come only from same-entry primary-agent startup-plan synthesis",
25
+ "stopped `/cook` from directly adopting old preview capsules or falling back to transcript-derived startup proposals",
26
26
  ],
27
27
  "extensions/completion/prompt-surfaces.ts": [
28
- '"If the user explicitly runs /cook, the extension should call a primary-agent handoff synthesis step from the current task context, then show Start/Cancel confirmation without making the user rerun /cook."',
29
- '"Do not expect /cook to infer or guess startup intent from recent discussion alone; /cook should use explicit primary-agent handoff data, whether it already exists or is synthesized in the same /cook entry."',
28
+ '"If the user explicitly runs /cook, the extension should call a primary-agent startup-plan synthesis step from the current task context, show Start/Cancel confirmation in the same /cook entry, and only write the approved plan into .agent after Start."',
29
+ '"Do not expect /cook to infer or guess startup intent from recent discussion alone, and do not expect /cook to directly reuse an old preview capsule; /cook should always synthesize the startup plan fresh in the same entry from current task context."',
30
30
  '"In ordinary chat, do not load or follow completion-protocol, and do not call completion_role."',
31
31
  ],
32
32
  "extensions/completion/index.ts": [
33
- '"/cook failed closed because the primary-agent handoff step could not prepare a concrete startup handoff from the current task context. Clarify the mission, first slice, or verification intent in the main chat, then rerun /cook."',
34
- 'description: "/cook workflow: start or replace workflow only from an explicit primary-agent handoff, or resume the current workflow from canonical state"',
33
+ '"/cook failed closed because the startup-plan step could not prepare a concrete workflow startup plan from the current task context. Clarify the mission, scope, acceptance, or verification intent in the main chat, then rerun /cook."',
34
+ 'description: "/cook workflow: capture the approved startup plan into .agent, let completion-regrounder split canonical slices, or resume the current workflow from canonical state"',
35
35
  '"Do not call completion_role from ordinary chat; it is reserved for explicit /cook workflow driver turns."',
36
36
  ],
37
37
  "extensions/completion/policy-guards.ts": [
@@ -40,6 +40,7 @@ checks = {
40
40
  "skills/cook-handoff-boundary/SKILL.md": [
41
41
  '- load or follow `completion-protocol` while still in ordinary chat',
42
42
  '- call `completion_role` before the user has explicitly entered `/cook`',
43
+ '- `/cook` should always synthesize the startup plan fresh in the same entry from current task context',
43
44
  ],
44
45
  "skills/completion-protocol/SKILL.md": [
45
46
  'Load this skill only after the user explicitly enters `/cook` and you are operating inside the `completion` workflow as the workflow driver or a completion role.',
@@ -51,6 +52,7 @@ forbidden = {
51
52
  "README.md": [
52
53
  "asks the primary agent to prepare one in the main chat and leaves canonical state unchanged until you rerun /cook",
53
54
  "Explicit `/cook` capsules are the required startup intake for new-workflow, next-round, and replacement entry.",
55
+ "When you explicitly run `/cook`, it first checks for a fresh explicit primary-agent startup-plan preview.",
54
56
  ],
55
57
  "extensions/completion/prompt-surfaces.ts": [
56
58
  '"If the user explicitly asks to enter /cook workflow, generate one fresh ```cook_handoff``` capsule in ordinary chat from the primary-agent view of the task, then tell the user to run /cook."',
@@ -30,9 +30,9 @@ assertIncludes('extensions/completion/role-runner.ts', 'const transcription = ex
30
30
  assertIncludes('extensions/completion/role-runner.ts', 'env: { ...process.env, PI_COMPLETION_ROLE: params.role },');
31
31
  assertIncludes('extensions/completion/role-runner.ts', 'async function runContextProposalAnalystSubprocess(');
32
32
  assertIncludes('extensions/completion/role-runner.ts', 'export async function analyzeContextProposalWithAgent(');
33
- assertIncludes('extensions/completion/index.ts', 'import { analyzeContextProposalWithAgent, runCompletionRole } from "./role-runner";');
33
+ assertIncludes('extensions/completion/index.ts', 'import { runCompletionRole } from "./role-runner";');
34
34
  assertIncludes('extensions/completion/index.ts', 'const result = await runCompletionRole({');
35
- assertIncludes('extensions/completion/index.ts', 'await analyzeContextProposalWithAgent({');
35
+ assertNotIncludes('extensions/completion/index.ts', 'analyzeContextProposalWithAgent');
36
36
  assertNotIncludes('extensions/completion/index.ts', 'const systemPromptTemp = await writeTempFile(runCwd, "pi-cook-proposal-analyst-", CONTEXT_PROPOSAL_ANALYST_SYSTEM_PROMPT);');
37
37
  assertNotIncludes('extensions/completion/index.ts', 'const invocation = getPiInvocation(args);');
38
38
  assertNotIncludes('extensions/completion/index.ts', 'async function loadAgentDefinition(');
@@ -103,13 +103,12 @@ INLINE_REJECTION_ROUTING_SNAPSHOT="$TMPDIR/inline-arg-routing.json"
103
103
  INLINE_REJECTION_PROPOSAL_SNAPSHOT="$TMPDIR/inline-arg-proposal.json"
104
104
  INLINE_REJECTION_CHOOSER_SNAPSHOT="$TMPDIR/inline-arg-chooser.json"
105
105
  BOOTSTRAP_SESSION="$TMPDIR/session-smoke-bootstrap.jsonl"
106
- BOOTSTRAP_MESSAGES="$(python3 - <<'PY'
106
+ BOOTSTRAP_DISCUSSION=$'Please prepare the packaged smoke-test bootstrap path and tell me when it is ready for /cook.'
107
+ GENERATED_HANDOFF="$(python3 - <<'PY'
107
108
  import json
108
109
  capsule = {
109
110
  "kind": "cook_handoff",
110
111
  "source": "primary_agent",
111
- "captured_at": "2026-01-01T00:00:02.000Z",
112
- "source_turn_id": "m0002",
113
112
  "mission": "Exercise smoke-test bootstrap.",
114
113
  "scope": [
115
114
  "Materialize the canonical completion control-plane files.",
@@ -123,10 +122,10 @@ capsule = {
123
122
  "Keep scripts/smoke-test.sh and kickoff-prompt coverage truthful for packaged bootstrap."
124
123
  ],
125
124
  "risks": [
126
- "Smoke-test bootstrap should stay anchored to the fresh explicit handoff."
125
+ "Smoke-test bootstrap should stay anchored to same-entry primary-agent startup-plan synthesis."
127
126
  ],
128
127
  "notes": [
129
- "Keep the smoke fixture aligned with the shipped explicit-handoff-only startup contract."
128
+ "Keep the smoke fixture aligned with the shipped startup-plan-driven startup contract."
130
129
  ],
131
130
  "handoff_kind": "implementation_workflow_handoff",
132
131
  "first_slice_goal": "Scaffold canonical completion files and verify the packaged startup contract.",
@@ -140,16 +139,12 @@ capsule = {
140
139
  "verification_commands": [
141
140
  "npm run smoke-test"
142
141
  ],
143
- "why_this_slice_first": "The packaged explicit-handoff startup path must work before later workflow verification can run.",
142
+ "why_this_slice_first": "The packaged startup-plan entry path must work before later workflow verification can run.",
144
143
  "task_type": "completion-workflow",
145
144
  "evaluation_profile": "completion-rubric-v1",
146
- "why_cook_now": "The startup handoff is concrete enough to bootstrap canonical workflow files."
145
+ "why_cook_now": "The startup plan is concrete enough to bootstrap canonical workflow files."
147
146
  }
148
- messages = [
149
- {"role": "user", "content": "Please prepare the packaged smoke-test bootstrap path and tell me when it is ready for /cook."},
150
- {"role": "assistant", "content": "This bootstrap path is ready for /cook. Run /cook to confirm the startup brief.\n\n```cook_handoff\n" + json.dumps(capsule, ensure_ascii=False, indent=2) + "\n```"},
151
- ]
152
- print(json.dumps(messages, ensure_ascii=False))
147
+ print("```cook_handoff\n" + json.dumps(capsule, ensure_ascii=False, indent=2) + "\n```")
153
148
  PY
154
149
  )"
155
150
 
@@ -175,21 +170,21 @@ chooser = Path(sys.argv[5])
175
170
 
176
171
  assert not Path('.agent').exists(), 'startup /cook inline-args rejection should leave canonical state untouched'
177
172
  assert not routing.exists(), 'startup /cook inline-args rejection should not open active-workflow routing before a workflow exists'
178
- assert not proposal.exists(), 'startup /cook inline-args rejection should not emit a startup-brief proposal snapshot'
173
+ assert not proposal.exists(), 'startup /cook inline-args rejection should not emit a startup-plan proposal snapshot'
179
174
  assert not chooser.exists(), 'startup /cook inline-args rejection should not open the existing-workflow chooser before a workflow exists'
180
175
  assert '/cook no longer accepts inline arguments.' in output, 'startup /cook inline-args rejection should explain the bare-only entry contract'
181
176
  PY
182
177
 
183
- write_session_messages "$BOOTSTRAP_SESSION" "$ROOT" "$BOOTSTRAP_MESSAGES"
178
+ write_session "$BOOTSTRAP_SESSION" "$ROOT" "$BOOTSTRAP_DISCUSSION"
184
179
 
185
180
  PI_COMPLETION_CONTEXT_PROPOSAL_ACTION=accept \
186
- PI_COMPLETION_DISABLE_CONTEXT_PROPOSAL_ANALYST=1 \
181
+ PI_COMPLETION_PRIMARY_HANDOFF_OUTPUT="$GENERATED_HANDOFF" \
187
182
  PI_COMPLETION_SKIP_DRIVER_KICKOFF=1 \
188
183
  PI_COMPLETION_TEST_DRIVER_PROMPT_PATH="$KICKOFF_PROMPT" \
189
184
  pi --session "$BOOTSTRAP_SESSION" -e "$PKG_ROOT" -p "/cook" \
190
185
  >"$TMPDIR/pi-completion-smoke-bootstrap.out" 2>"$TMPDIR/pi-completion-smoke-bootstrap.err"
191
186
 
192
- for file in .agent/profile.json .agent/state.json .agent/plan.json .agent/active-slice.json .agent/verification-evidence.json; do
187
+ for file in .agent/profile.json .agent/state.json .agent/startup-plan.json .agent/startup-plan.md .agent/plan.json .agent/active-slice.json .agent/verification-evidence.json; do
193
188
  [[ -f "$file" ]] || { echo "missing canonical bootstrap file: $file" >&2; exit 1; }
194
189
  done
195
190
 
@@ -209,6 +204,8 @@ profile = json.loads(Path('.agent/profile.json').read_text())
209
204
  state = json.loads(Path('.agent/state.json').read_text())
210
205
  plan = json.loads(Path('.agent/plan.json').read_text())
211
206
  active = json.loads(Path('.agent/active-slice.json').read_text())
207
+ startup_plan = json.loads(Path('.agent/startup-plan.json').read_text())
208
+ startup_plan_md = Path('.agent/startup-plan.md').read_text()
212
209
  evidence = json.loads(Path('.agent/verification-evidence.json').read_text())
213
210
  kickoff = Path(sys.argv[1]).read_text()
214
211
 
@@ -224,15 +221,24 @@ assert active['implementation_surfaces'] == [], 'active-slice.json should scaffo
224
221
  assert active['verification_commands'] == [], 'active-slice.json should scaffold empty verification_commands'
225
222
  brief = state['advisory_startup_brief']
226
223
  assert brief['kind'] == 'startup_brief', 'state.json should preserve the confirmed startup brief as advisory intake'
227
- assert brief['source'] == 'primary_agent_handoff', 'smoke bootstrap should record the explicit handoff source in advisory intake'
224
+ assert brief['source'] == 'deferred_primary_agent_handoff', 'smoke bootstrap should record same-entry primary-agent synthesis in advisory intake'
228
225
  assert brief['mission'] == state['mission_anchor'], 'advisory startup brief mission should match the canonical mission anchor after bootstrap'
229
226
  assert brief['scope'] == ['Materialize the canonical completion control-plane files.', 'Keep the smoke test on supported /cook startup behavior.'], 'advisory startup brief should preserve scope items'
230
227
  assert brief['constraints'] == ['Keep startup proposal confirmation approval-only.'], 'advisory startup brief should preserve constraints'
228
+ assert startup_plan['artifact_type'] == 'completion-startup-plan', 'startup-plan.json should persist the approved startup plan canonically'
229
+ assert startup_plan['mission_anchor'] == state['mission_anchor'], 'startup-plan.json mission anchor should match canonical workflow state'
230
+ assert startup_plan['source'] == 'deferred_primary_agent_handoff', 'startup-plan.json should preserve the same-entry primary-agent startup source'
231
+ assert startup_plan['scope'] == brief['scope'], 'startup-plan.json should preserve approved scope items'
232
+ assert startup_plan['constraints'] == brief['constraints'], 'startup-plan.json should preserve approved constraints'
233
+ assert startup_plan['planned_surfaces'] == ['.agent/README.md', 'scripts/smoke-test.sh'], 'startup-plan.json should preserve planned surfaces derived from startup hints'
234
+ assert startup_plan['verification_intent'] == ['npm run smoke-test'], 'startup-plan.json should preserve verification intent derived from startup hints'
235
+ assert '## Planned surfaces' in startup_plan_md, 'startup-plan.md should render planned surfaces as a readable section'
236
+ assert '.agent/README.md' in startup_plan_md and 'scripts/smoke-test.sh' in startup_plan_md, 'startup-plan.md should mirror planned surfaces'
231
237
  assert brief['acceptance'] == [
232
238
  'Scaffold .agent/profile.json, .agent/state.json, .agent/plan.json, .agent/active-slice.json, and .agent/verification-evidence.json for the smoke fixture.',
233
239
  'Keep scripts/smoke-test.sh and kickoff-prompt coverage truthful for packaged bootstrap.'
234
240
  ], 'advisory startup brief should preserve acceptance'
235
- assert brief['risks'] == ['Smoke-test bootstrap should stay anchored to the fresh explicit handoff.'], 'advisory startup brief should preserve handoff risks'
241
+ assert brief['risks'] == ['Smoke-test bootstrap should stay anchored to same-entry primary-agent startup-plan synthesis.'], 'advisory startup brief should preserve startup-plan risks'
236
242
  assert 'First slice goal: Scaffold canonical completion files and verify the packaged startup contract.' in brief['notes'], 'advisory startup brief should preserve the first_slice_goal in notes'
237
243
  assert 'Verification commands: npm run smoke-test' in brief['notes'], 'advisory startup brief should preserve verification_commands in notes'
238
244
  assert evidence['artifact_type'] == 'completion-verification-evidence', 'verification-evidence.json artifact_type mismatch after bootstrap'
@@ -271,8 +277,9 @@ assert 'Do not proactively tell the user to run /cook' in handoff_text, 'ordinar
271
277
  assert '/cook is optional workflow mode' in handoff_text, 'ordinary handoff reminder should position /cook as optional workflow mode'
272
278
  assert 'In ordinary chat, do not load or follow completion-protocol, and do not call completion_role.' in handoff_text, 'ordinary handoff reminder should forbid workflow-role routing before explicit /cook'
273
279
  assert 'If the user wants direct implementation now, stay in ordinary chat and help directly instead of blocking on /cook.' in handoff_text, 'ordinary handoff reminder should avoid blocking implementation on /cook'
274
- assert 'the extension should call a primary-agent handoff synthesis step from the current task context' in handoff_text, 'ordinary handoff reminder should describe same-entry primary-agent handoff synthesis for /cook'
280
+ assert 'the extension should call a primary-agent startup-plan synthesis step from the current task context' in handoff_text, 'ordinary handoff reminder should describe same-entry primary-agent startup-plan synthesis for /cook'
275
281
  assert 'Do not expect /cook to infer or guess startup intent from recent discussion alone' in handoff_text, 'ordinary handoff reminder should forbid /cook-side guessing'
282
+ assert 'the approved startup plan should be written into .agent and then handed to completion-regrounder' in handoff_text, 'ordinary handoff reminder should mention startup-plan persistence and regrounder slice derivation'
276
283
  assert 'do not silently rewrite discussion into canonical workflow state' in handoff_text, 'ordinary handoff reminder should preserve non-canonical ordinary-chat behavior'
277
284
  assert not auto_resume.exists(), 'ordinary non-/cook turn should not queue auto-resume before /cook activation'
278
285
  assert 'Skipped completion workflow auto-resume prompt (test mode)' not in output, 'ordinary non-/cook turn should not attempt auto-resume'
@@ -302,10 +309,10 @@ assert f'- task_type: {expected_task_type}' in resume, 'resume prompt missing ca
302
309
  assert f'- evaluation_profile: {expected_eval_profile}' in resume, 'resume prompt missing canonical evaluation_profile'
303
310
  assert routing['mode'] == 'bare', 'active bare /cook should snapshot bare routing mode'
304
311
  assert routing['action'] == 'continue', 'no-discussion active bare /cook should resume from canonical state without a concrete replacement mission'
305
- assert routing['reason'] == 'missing_explicit_handoff', 'no-discussion active bare /cook should explain that resume happened because no fresh explicit handoff existed'
312
+ assert routing['reason'] == 'no_generated_startup_plan', 'no-discussion active bare /cook should explain that resume happened because no synthesized replacement startup plan existed'
306
313
  assert routing['currentMissionAnchor'] == state['mission_anchor'], 'resume routing snapshot should keep the current mission anchor'
307
314
  assert routing['proposedMissionAnchor'] is None, 'no-discussion active bare /cook should not propose a replacement mission'
308
- assert not chooser_path.exists(), 'active bare /cook resume should not open the chooser without a fresh explicit handoff'
315
+ assert not chooser_path.exists(), 'active bare /cook resume should not open the chooser without a synthesized replacement startup plan'
309
316
  PY
310
317
 
311
318
  PI_COMPLETION_SKIP_DRIVER_KICKOFF=1 \
@@ -376,6 +383,54 @@ active['evaluation_profile'] = profile['evaluation_profile']
376
383
  active_path.write_text(json.dumps(active, indent=2) + '\n')
377
384
  PY
378
385
 
386
+ python3 - <<'PY'
387
+ import json
388
+ from pathlib import Path
389
+ path = Path('.agent/startup-plan.json')
390
+ startup = json.loads(path.read_text())
391
+ startup.pop('task_type', None)
392
+ path.write_text(json.dumps(startup, indent=2) + '\n')
393
+ PY
394
+
395
+ if bash .agent/verify_completion_control_plane.sh >/dev/null 2>&1; then
396
+ echo "expected control-plane verification to fail when startup-plan.json omits task_type" >&2
397
+ exit 1
398
+ fi
399
+
400
+ python3 - <<'PY'
401
+ import json
402
+ from pathlib import Path
403
+ profile = json.loads(Path('.agent/profile.json').read_text())
404
+ startup_path = Path('.agent/startup-plan.json')
405
+ startup = json.loads(startup_path.read_text())
406
+ startup['task_type'] = profile['task_type']
407
+ startup_path.write_text(json.dumps(startup, indent=2) + '\n')
408
+ PY
409
+
410
+ python3 - <<'PY'
411
+ import json
412
+ from pathlib import Path
413
+ path = Path('.agent/startup-plan.json')
414
+ startup = json.loads(path.read_text())
415
+ startup['mission_anchor'] = 'drifted-startup-plan-mission'
416
+ path.write_text(json.dumps(startup, indent=2) + '\n')
417
+ PY
418
+
419
+ if bash .agent/verify_completion_control_plane.sh >/dev/null 2>&1; then
420
+ echo "expected control-plane verification to fail when startup-plan.json mission_anchor drifts from canonical workflow state" >&2
421
+ exit 1
422
+ fi
423
+
424
+ python3 - <<'PY'
425
+ import json
426
+ from pathlib import Path
427
+ state = json.loads(Path('.agent/state.json').read_text())
428
+ startup_path = Path('.agent/startup-plan.json')
429
+ startup = json.loads(startup_path.read_text())
430
+ startup['mission_anchor'] = state['mission_anchor']
431
+ startup_path.write_text(json.dumps(startup, indent=2) + '\n')
432
+ PY
433
+
379
434
  python3 - <<'PY'
380
435
  import json
381
436
  from pathlib import Path
@@ -21,7 +21,9 @@ This skill defines shared protocol facts only. Role-specific behavior belongs in
21
21
  ## Shared Rules
22
22
 
23
23
  - Current repo truth beats stale notes, stale summaries, and conversation memory.
24
- - `plan.json` is the persistent machine-readable slice backlog. Rebuild it during every re-grounding wave and keep it truthful after every committed slice.
24
+ - `startup-plan.json` is the approved workflow startup plan captured at `/cook`. Treat it as planning input only: `completion-regrounder` must reconcile it against current repo truth and derive canonical slices instead of copying it blindly into `plan.json`.
25
+ - `startup-plan.md` is the human-readable rendering of that same approved startup plan and must remain in parity with `startup-plan.json`.
26
+ - `plan.json` is the persistent machine-readable slice backlog. Rebuild it during every re-grounding wave from repo truth plus the approved startup plan, and keep it truthful after every committed slice.
25
27
  - `state.json` is the persistent machine-readable workflow controller. Keep `current_phase`, `continuation_policy`, `continuation_reason`, `next_mandatory_role`, and `next_mandatory_action` truthful after every transition.
26
28
  - Every slice in `plan.json` must have non-empty `acceptance_criteria` — concrete, verifiable conditions that define done. A slice without acceptance criteria is invalid and must not be selected.
27
29
  - Acceptance criteria are immutable after lock except for removing a criterion already satisfied with evidence or adding a missing criterion discovered during implementation.
@@ -76,7 +78,7 @@ If the workflow driver detects that the next mandatory action belongs to a compl
76
78
 
77
79
  1. If tracked protocol contract files are missing or first-time onboarding is required, invoke `completion-bootstrapper`.
78
80
  2. If canonical `.agent` execution state is missing, invalid, contradictory, stale, or ambiguous after compaction or recovery, invoke `completion-regrounder`.
79
- 3. If no slice is selected, invoke `completion-regrounder` to reconcile `.agent/plan.json` and return the next exact handoff payload.
81
+ 3. If no slice is selected, invoke `completion-regrounder` to read `.agent/startup-plan.json`, reconcile `.agent/plan.json` against current repo truth, and return the next exact handoff payload.
80
82
  4. If a slice is `selected` or `in_progress` and no new slice commit exists yet, invoke `completion-implementer`.
81
83
  5. If the latest committed slice lacks a review result, invoke `completion-reviewer`.
82
84
  6. If the latest committed slice lacks an audit result, invoke `completion-auditor`.
@@ -99,6 +101,8 @@ Tracked repo-contract files:
99
101
  Ignored canonical execution-state files:
100
102
 
101
103
  - `.agent/state.json`
104
+ - `.agent/startup-plan.json`
105
+ - `.agent/startup-plan.md`
102
106
  - `.agent/plan.json`
103
107
  - `.agent/active-slice.json`
104
108
  - `.agent/slice-history.jsonl`
@@ -114,6 +118,7 @@ Read these when making completion decisions:
114
118
  - `.agent/README.md`
115
119
  - `.agent/profile.json`
116
120
  - `.agent/state.json`
121
+ - `.agent/startup-plan.json`
117
122
  - `.agent/plan.json`
118
123
  - `.agent/active-slice.json`
119
124
  - `.agent/slice-history.jsonl`
@@ -140,6 +145,7 @@ Canonical truth remains in `.agent/**`.
140
145
  After context compaction, suspected memory loss, stalled-role recovery, or any ambiguous completion state, the workflow driver must re-read:
141
146
 
142
147
  - `.agent/state.json`
148
+ - `.agent/startup-plan.json`
143
149
  - `.agent/plan.json`
144
150
  - `.agent/active-slice.json`
145
151
  - `.agent/verification-evidence.json`
@@ -157,7 +163,7 @@ The exact implementer handoff now includes implementation-scope surfaces and exp
157
163
 
158
164
  The workflow driver must not continue implementation, review, audit, or stop evaluation from compacted conversation memory alone.
159
165
 
160
- After compaction or recovery, `completion-implementer` must also re-read canonical `.agent/state.json`, `.agent/plan.json`, `.agent/active-slice.json`, and `.agent/verification-evidence.json` before resuming work. If `.agent/active-slice.json` still contains a truthful exact handoff snapshot, continue from canonical state rather than asking the user to resend the original caller payload.
166
+ After compaction or recovery, `completion-implementer` must also re-read canonical `.agent/state.json`, `.agent/startup-plan.json`, `.agent/plan.json`, `.agent/active-slice.json`, and `.agent/verification-evidence.json` before resuming work. If `.agent/active-slice.json` still contains a truthful exact handoff snapshot, continue from canonical state rather than asking the user to resend the original caller payload.
161
167
 
162
168
  ## Shared Report Header
163
169
 
@@ -13,6 +13,8 @@
13
13
  ## Ignored Canonical Execution State
14
14
 
15
15
  - `.agent/state.json`
16
+ - `.agent/startup-plan.json`
17
+ - `.agent/startup-plan.md`
16
18
  - `.agent/plan.json`
17
19
  - `.agent/active-slice.json`
18
20
  - `.agent/slice-history.jsonl`
@@ -28,6 +30,7 @@ Read these when making completion decisions:
28
30
  - `.agent/README.md`
29
31
  - `.agent/profile.json`
30
32
  - `.agent/state.json`
33
+ - `.agent/startup-plan.json`
31
34
  - `.agent/plan.json`
32
35
  - `.agent/active-slice.json`
33
36
  - `.agent/slice-history.jsonl`
@@ -130,6 +133,37 @@ Rules:
130
133
  4. `continuation_policy == paused` means the user explicitly paused the workflow.
131
134
  5. `continuation_policy == done` means canonical final stop reconciliation is complete and the workflow may stop.
132
135
 
136
+ ## Fixed Startup Plan Model
137
+
138
+ `startup-plan.json` carries the approved workflow startup plan captured at `/cook`.
139
+
140
+ Required fields:
141
+
142
+ - `schema_version`
143
+ - `artifact_type` where the value is `completion-startup-plan`
144
+ - `status` where the value is `approved`
145
+ - `source`
146
+ - `captured_at`
147
+ - `mission_anchor`
148
+ - `goal_text`
149
+ - `task_type`
150
+ - `evaluation_profile`
151
+ - `scope`
152
+ - `constraints`
153
+ - `acceptance`
154
+ - `risks`
155
+ - `notes`
156
+ - `planned_surfaces`
157
+ - `verification_intent`
158
+ - `sequencing_hints`
159
+
160
+ Rules:
161
+
162
+ 1. `startup-plan.json` is canonical startup intake, not canonical slice selection.
163
+ 2. `completion-regrounder` must treat `startup-plan.json` as planning input, reconcile it against current repo truth, and derive canonical slices in `plan.json`.
164
+ 3. `startup-plan.json` must stay aligned with the current canonical mission anchor in `.agent/state.json`, `.agent/plan.json`, and `.agent/active-slice.json` until a later `/cook` refocus or next-round startup rewrites it.
165
+ 4. `startup-plan.md` is the human-readable rendering of the same approved startup plan and must remain in parity with `startup-plan.json`.
166
+
133
167
  `plan.json` carries the ordered persistent slice backlog.
134
168
 
135
169
  Required fields:
@@ -338,7 +372,7 @@ It must not, while a slice is selected or in progress:
338
372
 
339
373
  1. If tracked protocol contract files are missing or first-time onboarding is required, invoke `completion-bootstrapper`.
340
374
  2. If canonical `.agent` execution state is missing, stale, invalid, contradictory, or ambiguous after compaction or recovery, invoke `completion-regrounder` first.
341
- 3. If no slice is selected, invoke `completion-regrounder` to reconcile `.agent/plan.json` and return the next exact handoff payload.
375
+ 3. If no slice is selected, invoke `completion-regrounder` to read `.agent/startup-plan.json`, reconcile `.agent/plan.json` against current repo truth, and return the next exact handoff payload.
342
376
  4. If a slice is `selected` or `in_progress` and no new commit exists for it yet, invoke `completion-implementer`.
343
377
  5. If the latest committed slice lacks review, invoke `completion-reviewer`.
344
378
  6. If the latest committed slice lacks audit, invoke `completion-auditor`.
@@ -351,6 +385,7 @@ It must not, while a slice is selected or in progress:
351
385
  After context compaction, suspected memory loss, stalled-role recovery, or any ambiguous completion state, the workflow root must re-read:
352
386
 
353
387
  - `.agent/state.json`
388
+ - `.agent/startup-plan.json`
354
389
  - `.agent/plan.json`
355
390
  - `.agent/active-slice.json`
356
391
  - `.agent/verification-evidence.json`
@@ -366,7 +401,7 @@ The workflow root must invoke `completion-regrounder` before continuing whenever
366
401
 
367
402
  The workflow root must not continue implementation, review, audit, or stop evaluation from compacted conversation memory alone.
368
403
 
369
- After compaction or recovery, `completion-implementer` must also re-read canonical `.agent/state.json`, `.agent/plan.json`, `.agent/active-slice.json`, and `.agent/verification-evidence.json` before resuming work. If `.agent/active-slice.json` still contains a truthful exact handoff snapshot, continue from canonical state rather than asking the user to resend the original caller payload.
404
+ After compaction or recovery, `completion-implementer` must also re-read canonical `.agent/state.json`, `.agent/startup-plan.json`, `.agent/plan.json`, `.agent/active-slice.json`, and `.agent/verification-evidence.json` before resuming work. If `.agent/active-slice.json` still contains a truthful exact handoff snapshot, continue from canonical state rather than asking the user to resend the original caller payload.
370
405
 
371
406
  ## Default Priority Policy
372
407
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: cook-handoff-boundary
3
- description: Ordinary-chat contract for treating `/cook` as an optional workflow mode while requiring `/cook` to use primary-agent-authored handoff data instead of guessing from recent discussion.
3
+ description: Ordinary-chat contract for treating `/cook` as an optional workflow mode while requiring `/cook` to capture a primary-agent-authored startup plan instead of guessing from recent discussion.
4
4
  ---
5
5
 
6
6
  # /cook Handoff Boundary
@@ -58,20 +58,20 @@ But even in those cases:
58
58
 
59
59
  If the user explicitly runs or clearly chooses `/cook` workflow mode, the system behavior should be:
60
60
 
61
- 1. check for a fresh explicit primary-agent `cook_handoff`
62
- 2. if none exists, call a primary-agent handoff synthesis step immediately from the current task context
63
- 3. use that handoff to show Start / Cancel confirmation in the same `/cook` entry
64
- 4. write canonical workflow state only after Start
61
+ 1. call a primary-agent startup-plan synthesis step immediately from the current task context
62
+ 2. use that synthesized startup plan to show Start / Cancel confirmation in the same `/cook` entry
63
+ 3. after Start, write the approved startup plan into `.agent/startup-plan.json` / `.agent/startup-plan.md`, then let `completion-regrounder` derive canonical slices from repo truth
65
64
 
66
65
  That means:
67
66
 
68
- - `/cook` must not infer or guess the startup slice from recent discussion alone
69
- - `/cook` should use primary-agent-authored handoff data
70
- - `/cook` should not require a manual rerun just to consume a handoff it can synthesize immediately from the primary-agent view
67
+ - `/cook` must not infer or guess canonical slices from recent discussion alone
68
+ - `/cook` should always synthesize the startup plan fresh in the same entry from current task context
69
+ - `/cook` should not directly reuse an old preview capsule as canonical or approval-ready workflow state
70
+ - `/cook` should not require a manual rerun just to consume a startup plan it can synthesize immediately from the primary-agent view
71
71
 
72
72
  ## Optional Preview Behavior
73
73
 
74
- Only if the user explicitly asks for a preview startup brief or handoff capsule in ordinary chat may the primary agent provide one.
74
+ Only if the user explicitly asks for a preview startup plan or handoff capsule in ordinary chat may the primary agent provide one.
75
75
 
76
76
  Optional preview capsule format:
77
77
 
@@ -82,7 +82,7 @@ Optional preview capsule format:
82
82
  "source": "primary_agent",
83
83
  "captured_at": "<ISO-8601 timestamp>",
84
84
  "source_turn_id": "<current assistant turn id>",
85
- "mission": "<startable implementation mission>",
85
+ "mission": "<approved workflow mission>",
86
86
  "scope": ["..."],
87
87
  "constraints": ["..."],
88
88
  "non_goals": ["..."],
@@ -105,12 +105,12 @@ Optional preview capsule format:
105
105
  Notes:
106
106
 
107
107
  - `constraints` may be replaced or supplemented by `non_goals` when clearer.
108
- - `first_slice_goal`, `first_slice_non_goals`, `implementation_surfaces`, `verification_commands`, and `why_this_slice_first` are required for an implementation-ready handoff.
109
- - Any capsule is startup intake for `/cook` only. It is not canonical `.agent/**` state, not active-slice state, and not a second repo contract source.
108
+ - `first_slice_goal`, `first_slice_non_goals`, `implementation_surfaces`, `verification_commands`, and `why_this_slice_first` are optional sequencing hints. They help `completion-regrounder` split slices later when they are already obvious, but the approved startup plan may still be startable without them.
109
+ - Any capsule is advisory preview only. It is not canonical `.agent/**` state, not active-slice state, not a second repo contract source, and not something `/cook` should directly reuse without same-entry primary-agent synthesis.
110
110
 
111
111
  Suggested wording:
112
112
 
113
- > We can continue directly in ordinary chat if you want. If you prefer workflow mode, run `/cook` and it should use a primary-agent handoff for Start / Cancel confirmation rather than guessing from recent discussion.
113
+ > We can continue directly in ordinary chat if you want. If you prefer workflow mode, run `/cook` and it should capture an approved startup plan for Start / Cancel confirmation, then hand that plan to `completion-regrounder` for slice derivation.
114
114
 
115
115
  ## Forbidden Behaviors
116
116
 
@@ -125,13 +125,14 @@ Before the user explicitly runs `/cook`, the primary agent must not:
125
125
 
126
126
  When the user does explicitly choose `/cook`, the system must not:
127
127
 
128
- - let `/cook` invent the startup mission from recent discussion alone
129
- - let `/cook` replace missing handoff data with generic transcript guessing
130
- - require a second `/cook` invocation when same-entry primary-agent handoff synthesis is possible
128
+ - let `/cook` invent canonical slices from recent discussion alone
129
+ - let `/cook` replace missing startup-plan data with generic transcript guessing
130
+ - let `/cook` directly consume an old preview capsule instead of rerunning same-entry primary-agent startup-plan synthesis
131
+ - require a second `/cook` invocation when same-entry primary-agent startup-plan synthesis is possible
131
132
 
132
133
  ## Relationship To `completion-protocol`
133
134
 
134
- This skill is only about pre-`/cook` ordinary-chat behavior and `/cook` handoff expectations.
135
+ This skill is only about pre-`/cook` ordinary-chat behavior and `/cook` startup-plan expectations.
135
136
 
136
137
  After the user explicitly enters `/cook`, the separate `completion-protocol` skill governs:
137
138