wheypoint · diff

git:20260903.28d86a6 to git:20260905.0a0b1f7

307 added, 123 removed. Audit A to A.

---
name: wheypoint
- description: Mark a checkpoint in the current conversation — compact it into a durable handoff document so a fresh agent can resume the work without context loss. Use when the user wants to preserve session state for a later or parallel session — phrases like "hand this off", "write a handoff", "drop a wheypoint", "checkpoint this", "compact the conversation", "I'm running low on context", "save where we are for the next session", "prep a handoff for another agent", "/wheypoint". Use even when the user just says "wrap up" or "I need to clear context" mid-task. Do NOT use for per-phase pipeline handoffs — those belong to `/cook`, `/press`, `/age`, and `/cure`.
+ description: >-
+ Mark the current conversation as a durable handoff so a new agent can resume
+ the work. Use when the user wants to preserve state for a later or parallel
+ session. Triggers include "hand this off", "write a handoff", "drop a
+ wheypoint", "checkpoint this", "compact the conversation", and
+ "/wheypoint". Also use for "wrap up" or "I need to clear context" during a
+ task. Do NOT use for phase handoffs from `/cook`, `/press`, `/age`, or
+ `/cure`.
license: MIT
---
# /wheypoint
- `/wheypoint` captures just enough state for a cold reader to resume.
+ `/wheypoint` captures just enough state for a new agent to resume.
- `/wheypoint` checkpoints culture sessions or mid-task work without a phase slug.
+ Use `/wheypoint` for culture sessions or work without a phase slug.
+ `/wheypoint` does not replace a routine phase handoff from `/cook`, `/press`,
+ `/age`, or `/cure`.
+
+ Use it when the user selects **Checkpoint & stop** at one of those phases.
+
## Inputs
- - The conversation so far (the primary input).
- - Optional argument: a description of what the next session will focus on. When present, treat it as the lens and tailor the document to it. Drop state that does not serve that focus to a one-line pointer.
+ - Use the conversation as the primary input.
+ - The optional argument states the next session's focus.
+ - Use this argument as the document lens.
+ - Reduce unrelated state to a one-line reference.
## Flow
### Runtime commands
- `/wheypoint resolve --ref <absolute-path | work-id | slug>` and `/wheypoint lint <projection-path>` are read-only runtime operations. Route them through this skill's own archive:
+ The `resolve` and `lint` commands only read state.
+ Run them through this skill's archive:
+
```bash
python3 skills/wheypoint/scripts/wheypoint.pyz resolve --ref <absolute-path | work-id | slug>
python3 skills/wheypoint/scripts/wheypoint.pyz lint <projection-path>
```
- Direct invocations run, return output, and **STOP** before checkpoint writing. `/cheese --continue` uses these terminal operations; never invoke another archive.
+ Direct invocations run, return output, and **STOP** before checkpoint writing.
- 1. **Derive a slug** from the task (e.g. `auth-retry-backoff`). Reuse an existing slug if this session already owns one under `.cheese/`.
- 2. **Inventory what already exists.** List the `.cheese/` artifacts, specs, PRs, issues, commits, and diffs this session produced or touched. These get referenced, never re-summarised.
- 3. **Rehydrate.** `python3 skills/wheypoint/scripts/wheypoint.pyz show --work-id <id>` returns the record. Mandatory after a compaction: a compaction-marked delta is rejected unless the revision it declares as rehydrated is the current one.
- 4. **Build a semantic `WheypointDelta`**, not a rewritten document. `expected_revision_id` is the revision you rehydrated, or the genesis sentinel when this work has no record yet — that sentinel creates the first record, so there is no create step. Omitting a protected decision, question, blocker, or artifact link carries it forward; retiring one takes an explicit transition naming its entry ID, action, and rationale. A focus argument is the delta's lens.
- 5. **Commit through the runtime.** Pipe the delta as JSON to `python3 skills/wheypoint/scripts/wheypoint.pyz commit`. It assigns the revision, derives `status:`, and writes the immutable revision plus the Markdown `WheypointProjection` at `.cheese/notes/<slug>.md` — a generated projection, never the authority: never hand-edit it, never resume from it. A rejected commit is a real failure: fix the delta and re-commit, never hand-write the note.
- 6. **Redact** secrets on the way out (`## Redaction`).
- 7. **Report durability.** State the durability the commit result reports (`canonical-local`, `repo-snapshot`, or `published`); never run a Git commit, push, or publish to raise it. Point at resumption per `## Handoff`.
+ `/cheese --continue` uses these terminal operations.
+ Never invoke another archive.
+
+ Slash commands are host renderings, not the control model.
+
+ Run the bundled archive by its repository path on every host. See [`../cheese/references/harness-portability.md`](../cheese/references/harness-portability.md).
+
+ 1. **Derive a slug.** Use a value such as `auth-retry-backoff`.
+ 2. Reuse an existing slug when this session already owns it under `.cheese/`.
+ 3. **List existing artifacts.** Include each artifact, spec, PR, issue, commit, and diff that this session touched.
+ 4. Reference existing items. Do not summarize them again.
+ 5. **Rehydrate the record.** Run `python3 skills/wheypoint/scripts/wheypoint.pyz show --work-id <id>`.
+ 6. Rehydrate after compaction. The runtime rejects a compaction proof that does not name the current revision.
+ 7. **State each change.** Specify the orientation, `next`, artifact, new entries, and transitions.
+ 8. Give a reason for each transition. Omitted data carries forward.
+ 9. Use the focus argument as the lens.
+ 10. Follow [`references/delta-contract.md`](references/delta-contract.md) for all fields and rules.
+ 11. **Create the checkpoint.** Pipe intent JSON to `python3 skills/wheypoint/scripts/wheypoint.pyz checkpoint`.
+ 12. The command binds the rehydrated revision as the parent.
+ 13. The command uses the genesis sentinel when no record exists.
+ 14. Set `base_revision_id` when the command must reject a changed base.
+ 15. The command assigns the revision and derives `status:`.
+ 16. It writes an immutable revision and a generated projection at `.cheese/notes/<slug>.md`.
+ 17. The projection is not the authority.
+ 18. Never edit the projection or resume from it.
+ 19. Fix a refused intent and run the command again.
+ 20. Never write the note manually.
+ 21. Use `python3 skills/wheypoint/scripts/wheypoint.pyz commit` only for a raw delta with an explicit `expected_revision_id`.
+ 22. Use this command for a compaction proof.
+ 23. **Remove secrets.** Follow `## Redaction`.
+ 24. **Report durability.** State the result: `canonical-local`, `repo-snapshot`, or `published`.
+ 25. Never run a Git commit, push, or publish to increase durability.
+ 26. Give the resume commands from `## Handoff`.
+
## Handoff slug
- Prepend the standard resumable slug to the top of the file so `/cheese --continue` can route from it without reading the whole document:
+ The `checkpoint` command writes the slug at the start of the generated projection.
+ This slug lets `/cheese --continue` route without reading the complete document.
+
+ The first four lines are the shared handoff preamble.
+
+ Every consumer reads them with `parse_handoff_slug()`.
+
```markdown
status: <canonical status field>
- next: mold | cook | press | age | cure | affinage | briesearch | culture | hold | tasks | done
- mode: single | parallel
+ next: mold | cut | cook | press | age | cure | affinage | briesearch | culture | hold | tasks | done
artifact: <path-to-richer-report, or PR ref (PR#<n> / URL) when next: affinage, else none>
- session: <harness>:<session-id> # optional; auto-filled provenance
- git: <branch>@<short-sha> # optional; auto-filled provenance
- created: <UTC ISO-8601> # optional; auto-filled provenance
- parents: [<slug>, ...] # optional; lineage (join => 2+, split-child => 1)
- baseline: none | <block — carries a recorded baseline block forward from an upstream cook/press/cure handoff; see ../cook/references/quality-gates.md>
<one-line orientation: where the session is and what is mid-flight>
+
+ work_id: <work id>
+ revision_id: <revision id>
+ record_digest: <sha256 of the record>
+ projection_digest: <sha256 of this document>
+ durability: canonical-local | repo-snapshot | published
+ schema_version: <integer>
```
- `mode:` is optional for backwards compatibility; omitted mode means `mode: single`. In `mode: single`, `next:` names the skill the cold reader should run, which is the machine-readable form of the suggested-skills section below. Use `done` only when the work is genuinely finished and the handoff is a record, not a baton. `/cheese --continue <slug>` resolves the slug through `python3 skills/wheypoint/scripts/wheypoint.pyz resolve` and dispatches `next:` only from the validated current revision; an absolute note path resolves as an explicit path first. When `next: affinage`, record the PR reference (`PR#<n>` or its URL) in `artifact:` so the resume dispatches `/affinage <pr>` explicitly rather than relying on branch auto-detection.
- Pipeline: `culture -> mold -> cook -> press -> age -> cure -> plate`. Mold `red-required` checkpoints use `next: cook` with the durable spec pointer in `artifact:`. Resume preserves `mode:`, `--hard`, `--open-pr`, `--safe`, and explicit `--auto`. Press corrective work remains `continue: press-corrective-cook`, not a global Press-to-Cook dispatch.
+ The keyed block after the orientation holds the Wheypoint pins.
- When the checkpointed session carries a recorded `baseline:` block, carry it into the delta unchanged: it is settled state, not something the resumed phase should re-ask about or re-halt on. See [`../cook/references/quality-gates.md`](../cook/references/quality-gates.md).
+ The runtime derives every line. Never write or edit this document by hand.
- ### Provenance fields
+ ### Handwritten legacy notes
- These optional fields precede the orientation line and come only from the live session; pre-provenance notes remain valid.
+ The `resolve` command also reads a handwritten note under `.cheese/notes/`.
- - **`session: <harness>:<session-id>`** — active Claude JSONL id, Codex rollout id, or OpenCode session row. Omit when unavailable; Claude's newest-mtime heuristic is `<speculative>`.
- - **`git: <branch>@<short-sha>`** — branch and short commit from a callable, read-only git inspection capability (`git status --short --branch`; `git rev-parse --short HEAD`). Omit the field when git inspection is unavailable, outside git, or incomplete.
- - **`created: <UTC ISO-8601>`** — UTC capture time.
- - **`parents: [<slug>, ...]`** — lineage. Legacy `--join` writes `parents: [<slugA>, <slugB>]`; `--split` children write `parents: [<current-slug>]`. Both remain outside this continuity contract: they rewrite `.cheese/notes/` Markdown and commit no delta.
+ That older format accepts `mode:`, `session:`, `git:`, `created:`, `parents:`,
+ and `baseline:` between `artifact:` and the orientation.
+ A legacy result is never authoritative. It gates a resume for a human decision.
+
+ The `checkpoint` command refuses each of those keys in an intent.
+
+ The record has no field for that data, so accepting the key would drop it.
+
+ `mode:` is optional in a legacy note.
+
+ An omitted mode means `mode: single`.
+
+ In `mode: single`, `next:` names the skill that the new agent runs.
+
+ This value also represents the suggested skill.
+
+ Use `done` only when the work is complete.
+
+ `/cheese --continue <slug>` resolves the slug through the `resolve` command.
+
+ It dispatches `next:` only from the validated current revision.
+
+ An absolute note path resolves as an explicit path first.
+
+ When `next: affinage`, put the PR reference in `artifact:`.
+
+ Use `PR#<n>` or the PR URL.
+
+ This value makes the runtime dispatch `/affinage <pr>` without branch detection.
+
+ Pipeline: `culture -> mold -> cook -> press -> age -> cure -> plate`.
+
+ Mold `red-required` checkpoints use `next: cook`.
+
+ Put the durable spec path in `artifact:`.
+
+ Resume preserves `mode:`, `--hard`, `--open-pr`, `--safe`, and explicit `--auto`.
+
+ Press corrective work remains `continue: press-corrective-cook`, not a global Press-to-Cook dispatch.
+
+ A handwritten legacy note can record a one-line `baseline:` value.
+
+ The baseline is settled state.
+
+ Do not re-ask, re-flag, or re-halt on identical baseline entries.
+
+ The canonical record carries no baseline field today.
+
+ The `checkpoint` command refuses a `baseline` key rather than drop it.
+
+ Keep a Cook baseline mapping in the Cook handoff until the record gains a
+ typed baseline field.
+
+ See [`../cook/references/quality-gates.md`](../cook/references/quality-gates.md).
+
+ See [`references/provenance-fields.md`](references/provenance-fields.md) for provenance fields and legacy lineage commands.
+
### `status:` values
- `status:` grammar is canonical in [handback contract](../cheese/references/handback-contract.md); the derivation rule below is wheypoint-specific.
+ The [handback contract](../cheese/references/handback-contract.md) defines the `status:` grammar.
- Status is **derived** by the runtime, never asserted by the author: an active human-blocking question or blocker derives `gated:` and requires a decision dossier, and no caller can force `ok`.
+ The rules below define Wheypoint status.
- - **`ok`** — the next step is unblocked; `/cheese --continue` auto-dispatches `next:`.
- - **`gated: <one-line decision>`** — work is fine, but the next step is blocked on a human decision. Name the decision in one line. On `/cheese --continue`, the reader surfaces the decision plus the body's open-questions/blockers and asks which direction (research / decide / build); it dispatches nothing until the user picks. Never collapse a gate into a bare actionable `next:` with `status: ok` — that is the misfire this contract exists to stop. Any open blocker in the body mandates `status: gated:`, not `status: ok`.
- - **`halt: <one-line reason>`** — legacy vocabulary, valid only in hand-written notes read through the legacy fallback, with unchanged semantics: surface the reason, then dispatch the runnable `next:`. The runtime never derives it and the derived set stays two-valued on purpose: `halt` records how the previous session ended, while derived status records whether continuation is blocked on a human, and a session can halt on an environment failure with nothing left to decide. That difference is deliberate, not a contradiction to close by adding `halt` to the derived set.
+ The runtime derives status.
+ The author does not set status.
+
+ An active question or blocker derives `gated:` and requires a decision dossier.
+
+ No caller can force `ok`.
+
+ - **`ok`**: The next step is not blocked. `/cheese --continue` dispatches `next:`.
+ - **`gated: <one-line decision>`**: A human decision blocks the next step.
+ - For `gated:`, state the decision on one line.
+ - The new agent shows the decision and the open entries.
+ - The new agent asks whether to research, decide, or build.
+ - It dispatches nothing until the user selects a direction.
+ - The new agent asks through the shared [handoff gate](../cheese/references/handoff-gate.md).
+ - Every open blocker requires `status: gated:`.
+ - Never replace a gate with `status: ok` and an actionable `next:`.
+ - **`halt: <one-line reason>`**: This legacy value is valid only in handwritten notes.
+ - The `resolve` command gates every legacy status whose disposition is not `proceed`.
+ - A legacy `halt` therefore stops. It shows the reason and dispatches nothing.
+ - The runtime never derives `halt`.
+ - Derived status has only `ok` and `gated:`.
+ - A session can halt after an environment failure without a human decision.
+
### `next:` values and semantics
- Single-value `next:` is one of the pipeline phases (`mold | cook | press | age | cure | affinage`), a read-only kickoff (`briesearch | culture`), `hold`, `tasks` (with `mode: parallel`), or `done`.
+ A single `next:` value selects one move.
- - **`mold` / `cook` / `press` / `age` / `cure`** — the pipeline phases. Which one fits the session state (and the mid-phase resume case, e.g. `/cook` interrupted) is defined by the `## Suggested skills` mapping table below, which owns these semantics.
- - **`affinage`** — PR has review comments or failing CI. Record the PR reference in `artifact:` (`PR#<n>` or URL) so the resume dispatches `/affinage <pr>` explicitly.
- - **`briesearch | culture`** — read-only, low-risk next moves. Under `status: ok`, `/cheese --continue` auto-dispatches them directly (frictionless research/think kickoff), deriving any dispatch argument (e.g. `briesearch`'s question) from the orientation line. A move that needs a human decision belongs in `status: gated:`.
- - **`hold`** — restore orientation and wait for instruction; dispatch nothing. For compacting or stringing context along when no action is implied. Distinct from `done` (work finished, record only).
- - **`done`** — work genuinely finished; handoff is a record, not a baton. Use only for true terminal completion.
- - **A missing `next:` is a malformed handoff.** `/cheese --continue` flags it (`malformed handoff: next: required`) rather than guessing or defaulting. Declare intent explicitly — `hold` is the value for "no action."
+ It accepts `mold`, `cut`, `cook`, `press`, `age`, `cure`, `affinage`, `briesearch`, `culture`, `hold`, `tasks`, or `done`.
- ### `next:` list form
+ - **`mold` / `cut` / `cook` / `press` / `age` / `cure`**: Select a pipeline phase.
+ - **`cut`**: Select the protected red evidence step before Cook changes production.
+ - Put the approved behavior spec path in `artifact:`.
+ - The `## Suggested skills` table defines which phase matches each state.
+ - **`affinage`**: Select this move for PR review comments or failing CI.
+ - Put `PR#<n>` or the PR URL in `artifact:`.
+ - **`briesearch | culture`**: Select a read-only next move.
+ - With `status: ok`, `/cheese --continue` dispatches the move.
+ - The runtime derives its argument from the orientation line.
+ - A move that requires a human decision uses `status: gated:`.
+ - **`hold`**: Restore orientation and wait for instructions.
+ - Use `hold` when no action follows the checkpoint.
+ - **`done`**: Record completed work without a handoff.
+ - Use `done` only for terminal completion.
+ - A missing `next:` makes the handoff malformed.
+ - `/cheese --continue` reports `malformed handoff: next: required`.
+ - Use `hold` when no action must start.
- To kick off several read-only follow-ups from one handoff, `next:` may be a list with a required `order:`:
+ See [`references/parallel-handoffs.md`](references/parallel-handoffs.md) for multiple moves.
- ```markdown
- next: [briesearch "slug1", briesearch "slug2", culture "slug3"]
- order: parallel | sequential
- ```
+ ## Document
- - Each item is `<skill> "<arg>"`. `order:` is **required** when `next:` is a list.
- - `order: parallel` — `/cheese --continue` fans out concurrent read agents, one per item, in the same turn.
- - `order: sequential` — items run in listed order.
- - The inline list is restricted to read-only skills (`briesearch | culture`). Parallel *write* efforts still require the heavyweight `mode: parallel` + `tasks:` block with worktree/branch isolation below; sequential *pipeline* chaining stays the job of `--auto` / `/cook`'s fan pathway.
+ After the slug, write a `## Document` section.
- For multiple independent next moves, use `mode: parallel`, set `next: tasks`, add a `parallel:` block, and add a `tasks:` list immediately after the orientation line. Each task must carry its exact `command:`; commands may name different skills. Parallel write tasks must never share a checkout. Choose one portable isolation strategy:
+ Start with the answer.
- | `worktree_strategy` | Use when | Required fields |
- | --- | --- | --- |
- | `existing` | The user already has durable bench checkouts | each write task has distinct `worktree:`, `branch:`, and `branch_from` |
- | `create` | No checkouts exist yet | `worktree_root`, plus each write task has `branch:` and `branch_from` |
- | `harness` | The host can create isolated threads/worktrees | each write task has `branch:` and `branch_from`; the host owns checkout creation |
+ Write for an agent that has not read the conversation.
- Example:
+ Include only information that supports the resume.
- ```markdown
- status: ok
- next: tasks
- mode: parallel
- artifact: none
- KIP-76 and KIP-77 are ready to run as independent PR efforts.
- parallel:
- isolation: git-worktree
- worktree_strategy: existing
- tasks:
- - slug: kip-77-ai-test-server
- intent: cook
- repo: /Users/marcus/Documents/multiplier
- worktree: /Users/marcus/Documents/multiplier-01
- branch: marcus/kip-77-ai-test-server
- branch_from: origin/main
- command: /cook .cheese/specs/kip-77-ai-test-server.md
- - slug: kip-76-ai-service-spin-up
- intent: cook
- repo: /Users/marcus/Documents/multiplier
- worktree: /Users/marcus/Documents/multiplier-02
- branch: marcus/kip-76-ai-service-spin-up
- branch_from: origin/main
- command: /cook .cheese/specs/kip-76-ai-service-spin-up.md
- ```
+ Use this order:
- For a generic setup without existing benches, use `worktree_strategy: create` and add `worktree_root: ../.cheese-worktrees`; `/cheese --continue` derives one checkout per task from the task slug.
+ - **Goal.** State the result that the work must achieve.
+ - **State.** State completed, verified, active, and untouched work.
+ - Describe partial work accurately.
+ - **Key decisions and constraints.** State each choice that a new agent could question again.
+ - Add one confidence tag: `` `<certain>` ``, `` `<speculating>` ``, or `` `<don't know>` ``.
+ - Give one short reason for each choice.
+ - **Open questions and blockers.** State each unresolved item and its dependency.
+ - **Artifacts.** List paths and URLs. Do not copy their contents.
+ - **Suggested skills.** State the exact next moves.
+ - **Environment.** State the branch, modified files, and unusual worktree state.
+ - Remove sensitive values from environment details.
- ## Document
+ Follow [`../cheese/references/formatting.md`](../cheese/references/formatting.md).
- After the slug, write a `## Document` section. Open with the answer; keep every claim readable to someone who has not seen the conversation. Cover, in order, only the parts that carry signal:
+ Apply the shared voice rules from [`../age/references/voice.md`](../age/references/voice.md).
- - **Goal.** The one or two sentences that say what we are trying to achieve.
- - **State.** What is done and verified, what is in-flight, what is untouched. Be honest about partial work; a half-finished step described accurately beats a tidy lie (Rule 9).
- - **Key decisions and constraints.** The choices a fresh agent would otherwise re-litigate, each with a calibrated tag (`` `<certain>` `` / `` `<speculating>` `` / `` `<don't know>` ``) and a one-line why.
- - **Open questions and blockers.** What is unresolved and what it is waiting on.
- - **Artifacts.** A list of paths and URLs, not their contents. See `## Do not duplicate`.
- - **Suggested skills.** The concrete next moves. See `## Suggested skills` for the state-to-skill mapping.
- - **Environment.** Branch, dirty files, anything non-obvious about the working state. Redacted.
+ Use complete sentences in prose.
- Follow the house style in [`../cheese/references/formatting.md`](../cheese/references/formatting.md): no em-dashes, complete sentences in prose, no throat-clearing, calibrated tags on the claim.
+ Do not use em dashes or introductory filler.
+ Add a confidence tag to each claim.
+
## Suggested skills
- Derive `next:` and `status:` from the body's blockers, not from optimism. See `### status: values` for the gate rule.
+ Derive `next:` and `status:` from the active blockers.
- Pick the next move from where the session actually is, name it as an easy-cheese skill with its argument, and write the same target into the slug's `next:` field. Suggest the *single* best next step, plus the step after it when the path is obvious. When the session has two or more independent tracks that can proceed without sharing branch state, write `mode: parallel`, set `next: tasks`, and put each exact skill invocation under `tasks:` instead of collapsing them into one sequential next step. For several read-only follow-ups, use the inline `next:` list with `order:` instead. The map:
+ Do not derive them from expected success.
+ See `### status: values` for the gate rule.
+
+ Select the next move from the current session state.
+
+ Name the easy-cheese skill and its argument.
+
+ Put the same target in the slug's `next:` field.
+
+ Suggest one best next step.
+
+ Suggest the following step when the path is clear.
+
+ For independent write tracks, set `mode: parallel` and `next: tasks`.
+
+ Put each exact skill invocation under `tasks:`.
+
+ Do not reduce parallel work to one sequential move.
+
+ For multiple read-only moves, use a `next:` list and `order:`.
+
| Where the session is | Suggest | `next:` |
| --- | --- | --- |
- | Fuzzy idea, no approved spec yet | `/mold` | `mold` |
- | Research wanted before deciding or building | `/briesearch <question>` | `briesearch` |
- | Wants to think a problem through, no writes | `/culture` | `culture` |
- | Next step blocked on a human decision | surface the decision, ask direction | — (set `status: gated:`) |
- | Compacting or stringing along, no action implied | restore orientation, wait | `hold` |
- | Approved spec, not yet implemented | `/cook <spec-path>` | `cook` |
- | Code written, not yet hardened or reviewed | `/press <slug>` then `/age` | `press` |
- | Implementation done, review wanted now | `/age <ref>` | `age` |
- | Review findings in hand, fixes not applied | `/cure <slug>` | `cure` |
+ | Fuzzy idea without an approved spec | `/mold` | `mold` |
+ | Research needed before a decision or build | `/briesearch <question>` | `briesearch` |
+ | Discussion without writes | `/culture` | `culture` |
+ | Human decision blocks the next step | Show the decision and ask for direction | Set `status: gated:` |
+ | No action follows the checkpoint | Restore orientation and wait | `hold` |
+ | Approved spec without implementation | `/cook <spec-path>` | `cook` |
+ | Code without hardening or review | `/press <slug>`, then `/age` | `press` |
+ | Implementation needs review | `/age <ref>` | `age` |
+ | Review findings need fixes | `/cure <slug>` | `cure` |
| PR has review comments or failing CI | `/affinage <pr>` | `affinage` |
- | Hard bug still un-diagnosed | surface the blocker; invoke `/pasteurize` once ready | — (set `status: gated:`) |
- | Work genuinely finished | record only, no baton | `done` |
+ | Hard bug has no diagnosis | Show the blocker. Use `/pasteurize` when ready. | Set `status: gated:` |
+ | Work is complete | Record only | `done` |
- When the session sits mid-phase (e.g. `/cook` was interrupted), suggest re-entering that same phase with the slug. Tailor to the optional focus argument when the user gave one: it overrides the table if the next session is meant to do something other than advance the pipeline.
+ When a phase stops, suggest the same phase with the slug.
+ The optional focus argument overrides the table.
+
+ Use it when the next session must not advance the pipeline.
+
## Required body sections by state
- The opening line ("`/wheypoint` captures just enough state for a cold reader to resume") sets the default: compress everything that does not serve the resume. This table names the one exception and pins the minimum `## Document` sections each `status:`/`next:` combination requires, so compression never eats the state a resume actually needs.
+ The default rule keeps only information that supports the resume.
+ The table defines the minimum `## Document` content.
+
+ It also defines one exception to the default rule.
+
| state | required Document sections |
| --- | --- |
- | `status: gated:` | `## Decision dossier` — per open fork: options / evidence `file:line` / what-each-breaks / prior leanings |
+ | `status: gated:` | `## Decision dossier` per open fork: options / evidence `file:line` / what-each-breaks / prior leanings |
| `next: culture` | agenda + open-thread state |
- | `next: cure` | findings artifact ref |
- | `next: cook` / `press` / `age` | spec/slug pointers per existing conventions |
+ | `next: cure` | findings artifact reference |
+ | `next: cook` / `press` / `age` | spec/slug pointers |
| `next: hold` / `done` | orientation only |
- **`status: gated:` overrides the "just enough state" compression rule for gated notes.** Every open fork gets its own `## Decision dossier` entry — options considered, evidence as `file:line` citations, what each option breaks, and any prior leaning from the session — instead of the one-line decision the compression default would otherwise leave. A resumed session with a consequential fork rebuilds its prose weighing from this dossier; see [`../cheese/references/ask-user-question.md`](../cheese/references/ask-user-question.md) § When to structure for why an undiscussed design fork needs that weighing rather than a structured confirm.
+ This dossier requirement overrides the just enough state compression rule for gated notes.
+ For `status: gated:`, keep complete information for each open decision.
+ Add one `## Decision dossier` entry for each open decision.
+
+ Include the options, `file:line` evidence, effects, and prior choice.
+
+ Do not reduce this information to the one-line status.
+
+ The resumed session uses the dossier to evaluate the decision.
+
+ See the structured-choice rules in [`../cheese/references/ask-user-question.md`](../cheese/references/ask-user-question.md).
+
## Do not duplicate
- The point of a handoff is to be short enough to read cold. Anything already captured in a durable artifact gets a reference, not a copy:
+ Keep the handoff short enough for a new agent to read.
- - Specs, findings reports, research reports under `.cheese/` — link by path.
- - PRs, issues, commits, diffs — link by URL or sha.
- - Plans, ADRs, design docs — link by path or URL.
+ Reference each durable artifact instead of copying it.
- Summarise an artifact only when the summary is genuinely shorter than its pointer. Re-pasting a diff or a spec into the handoff is the failure mode this skill exists to avoid.
+ - Link specs, findings, and research reports under `.cheese/` by path.
+ - Link PRs, issues, commits, and diffs by URL or SHA.
+ - Link plans, ADRs, and design documents by path or URL.
+ Summarize an artifact only when the summary is shorter than the reference.
+
+ Do not copy a diff or spec into the handoff.
+
## Redaction
- Strip anything sensitive before writing: API keys, tokens, passwords, connection strings, and personally identifiable information. If a secret is required for the next session, reference where it lives (env var name, secret manager path), never its value.
+ Remove API keys, tokens, passwords, connection strings, and personal information.
+ When the next session needs a secret, reference its location.
+
+ Use an environment variable name or secret manager path.
+
+ Never include the secret value.
+
## Handoff
- `/wheypoint` writes only through `python3 skills/wheypoint/scripts/wheypoint.pyz commit`: the canonical record, its immutable revision, and the generated projection. No Git commits, pushes, PRs, or production-code edits — durability is reported, never automatically raised. Use the host's read-only inspection capabilities plus a write capability scoped to the durable corpus and `.cheese/notes/**`. The slug header keeps the shape `src/easy_cheese/shared/handoff.py` parses and renders today; the continuity codec is additive, so `parse_handoff_slug()` and its callers are unchanged. End by showing the slug's orientation line, a normal Markdown link to the projection, and repo-root-aware resumption commands. Keep the note link outside fenced code so it is clickable. The link line should match this shape: `Wheypoint dropped: [.cheese/notes/<slug>.md](<absolute-note-path>)`.
+ Use `checkpoint` for normal intent JSON.
- Resume from the original repo with `/cheese --continue <slug>` after `cd <absolute-repo-path>`, or from anywhere with `/cheese --continue <absolute-repo-path>/.cheese/notes/<slug>.md`.
+ Use `commit` only for raw deltas and compaction proofs.
+
+ Both commands write the canonical record, its immutable revision, and the generated projection.
+
+ They do not make Git commits, pushes, PRs, or production code changes.
+
+ The commands report durability.
+
+ They never increase durability automatically.
+
+ Use read-only inspection capabilities.
+
+ Limit write access to the durable corpus and `.cheese/notes/**`.
+
+ The slug header keeps the shape that `src/easy_cheese/shared/handoff.py` parses.
+
+ The continuity codec does not change `parse_handoff_slug()` or its callers.
+
+ End with the slug orientation, a Markdown projection link, and repository-aware resume commands.
+
+ Keep the note link outside code fences.
+
+ Use this link form: `Wheypoint dropped: [.cheese/notes/<slug>.md](<absolute-note-path>)`.
+
+ From the original repository, run `cd <absolute-repo-path>`.
+
+ Then run `/cheese --continue <slug>`.
+
+ From another directory, run `/cheese --continue <absolute-repo-path>/.cheese/notes/<slug>.md`.
+
+ See the generated command list in [`references/commands.md`](references/commands.md).