From 4021a8cdea18dd28a091f86ba85ed0ad39a88db9 Mon Sep 17 00:00:00 2001 From: Claude Date: Sun, 11 Oct 2026 08:11:58 +0000 Subject: [PATCH 1/5] feat(planning): check mid-interview whether work is bigger, and allow a ship-it exit The interview now checks at each round boundary for a worsened context-guard zone or more branches opened than closed, and recommends /planning:wayfind chart with the ledger, constraints, intake disclosure and glossary carried over. A "this is small, ship it" exit defers the open rows and hands off to implementation. The entry gate states why it is diff size and retry cost. Co-Authored-By: Claude Opus 5.5 (1M context) Claude-Session: https://claude.ai/code/session_01L8KdG7fWg2YrErVYWtohmR --- ...feat-6729-route-by-diff-size-and-fog-bb664112.md | 8 ++++++++ plugins/planning/skills/interview/SKILL.md | 13 +++++++++++++ plugins/planning/skills/wayfind/SKILL.md | 3 ++- 3 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 .changes/planning/feat-6729-route-by-diff-size-and-fog-bb664112.md diff --git a/.changes/planning/feat-6729-route-by-diff-size-and-fog-bb664112.md b/.changes/planning/feat-6729-route-by-diff-size-and-fog-bb664112.md new file mode 100644 index 0000000000..3c660aa810 --- /dev/null +++ b/.changes/planning/feat-6729-route-by-diff-size-and-fog-bb664112.md @@ -0,0 +1,8 @@ +--- +bump: minor +--- + +### Added + +- `/planning:interview` checks at every round boundary whether the work is bigger than it looked, on two triggers (the context-guard zone report has worsened, or two rounds running opened more questions than they closed), and recommends `/planning:wayfind chart` with the ledger, constraints, starting-point disclosure and shorthand glossary carried over. It also takes a "this is small, ship it" exit at any round boundary: remaining open questions are deferred with the operator's reply as the reason and the work hands off to `/implementation:implement`. +- The interview states why its entry gate is diff size and retry cost rather than behavior change. diff --git a/plugins/planning/skills/interview/SKILL.md b/plugins/planning/skills/interview/SKILL.md index f630028dfb..68937565fb 100644 --- a/plugins/planning/skills/interview/SKILL.md +++ b/plugins/planning/skills/interview/SKILL.md @@ -447,6 +447,19 @@ the rule that current model and effort names are fetched live and never pinned ( fetch degrades rather than halts), the advisory framing, and the per-surface wording. Do not form the recommendation from this summary. +## Routing by size and fog + +**Entry: diff size and retry cost, not behavior change.** A change whose diff is quick to review and cheap to retry skips the interview (see "What this skill does NOT do"): when the diff is tiny, a wrong build costs almost nothing, so aligning on the diff after it exists beats aligning before it. Work that fails either test is interview-first, and an effort too big and too foggy for one session is reached from here, never first (`/planning:wayfind` sends a cold start back to this skill). + +**Bigger than you thought? Check at every round boundary.** After each reply is recorded and before the next round is written, answer one question: did this turn out larger or foggier than it looked at entry? It is bigger when either trigger holds: + +- **The context zone has worsened.** The session's context-guard report (the zone line the module injects, or its `mcp__context-guard__status` tool) puts the session past its best zone. Use only a report the harness already surfaced or that tool; do not poll your own context statistics, and write no token or percentage figure here, because the zone thresholds belong to context-guard. No report, or `unknown`, is not a trigger. +- **More branches opened than closed.** Count the register: this round's new `open` rows against the rows it moved to a terminal status. Two rounds running with more opened than closed is a trigger; one is noise. + +On a trigger, recommend `/planning:wayfind chart` to the user in one short block (the trigger and its evidence, what it would carry over); never switch on your own. If it is not a trigger, say nothing and ask the next round. When the user accepts, the handoff carries everything this interview already holds, so nothing is asked twice: the ledger path (`//interview-checklist.md`) with its answered rows as decisions so far, its `open`, `deferred` and `blocked` rows as candidate decision items, the constraints the user stated, the starting-point disclosure from intake, and the session-shorthand glossary. Wayfind's chart step reads that ledger. + +**Small after all: ship it.** At any round boundary the operator can say the work is small ("this is small, ship it") and the model can propose the same when the diff now looks quick to review and cheap to retry. The model's proposal waits for the operator's yes, because the remaining questions are the operator's to drop. On that yes, stop asking; move each `open` row to `deferred` with the reply as its reason, so the register gate passes without inventing an answer; write the decisions so far (the Brief, or the shared-understanding summary in a general session); and hand off to implementation (`/implementation:implement`), not to `/planning:plan`. + ## What this skill does NOT do - `context/gotchas.md`. Failure patterns from real sessions diff --git a/plugins/planning/skills/wayfind/SKILL.md b/plugins/planning/skills/wayfind/SKILL.md index bb41094be0..cf3c07246f 100644 --- a/plugins/planning/skills/wayfind/SKILL.md +++ b/plugins/planning/skills/wayfind/SKILL.md @@ -88,7 +88,8 @@ session. Do not fabricate a map. resolution comment lists them; it is closed at once with one *Decisions-so-far* pointer (the work-mode step 5 sequence). Its open, deferred and blocked questions become candidate decision items, and its self-answered facts are distilled into *Notes* as text, never as a - path. Sort every remaining uncertainty through the fog test: sharp → candidate decision + path. The constraints the user stated, their starting-point disclosure, and the session-shorthand + glossary ride into *Notes* the same way, so a decision the interview already asked is not asked again. Sort every remaining uncertainty through the fog test: sharp → candidate decision item; foggy → *Not-yet-specified* prose. **No-fog bail-out:** if the survey leaves *both* halves of the trigger unmet. Every uncertainty is already sharp, or the whole effort fits one session. This effort does not need a map. STOP and route out From c5c4bf3f52ad4a6d2d9f49658ab1630cf3fcbfa1 Mon Sep 17 00:00:00 2001 From: Claude Date: Sun, 11 Oct 2026 16:02:11 +0000 Subject: [PATCH 2/5] fix(planning): move interview routing to a spoke and persist the starting point The "Routing by size and fog" section pushed interview SKILL.md to 510 lines, over check-skill's 500-line hard cap. Its body moves to context/routing.md behind a one-paragraph pointer, outside every digest-pinned section. The wayfind handoff named the intake starting-point disclosure, but the ledger had no place for it, so a /clear before /planning:wayfind chart lost it. The ledger template gains a "## Starting point" section and the handoff writes it before handing off; wayfind's chart step reads it. Ship-it now states the gates it keeps: the assumption sweep is skipped, the Step 3 confirmation still runs, deferred rows carry arbiter USER-RESERVED, and the Step 4 --brief cross-check must pass. Co-Authored-By: Claude Opus 5.5 (1M context) Claude-Session: https://claude.ai/code/session_01L8KdG7fWg2YrErVYWtohmR --- ...729-route-by-diff-size-and-fog-bb664112.md | 2 +- plugins/planning/skills/interview/SKILL.md | 17 +---- .../skills/interview/context/routing.md | 71 +++++++++++++++++++ .../skills/interview/templates/checklist.md | 6 ++ plugins/planning/skills/wayfind/SKILL.md | 5 +- 5 files changed, 83 insertions(+), 18 deletions(-) create mode 100644 plugins/planning/skills/interview/context/routing.md diff --git a/.changes/planning/feat-6729-route-by-diff-size-and-fog-bb664112.md b/.changes/planning/feat-6729-route-by-diff-size-and-fog-bb664112.md index 3c660aa810..e808354a54 100644 --- a/.changes/planning/feat-6729-route-by-diff-size-and-fog-bb664112.md +++ b/.changes/planning/feat-6729-route-by-diff-size-and-fog-bb664112.md @@ -4,5 +4,5 @@ bump: minor ### Added -- `/planning:interview` checks at every round boundary whether the work is bigger than it looked, on two triggers (the context-guard zone report has worsened, or two rounds running opened more questions than they closed), and recommends `/planning:wayfind chart` with the ledger, constraints, starting-point disclosure and shorthand glossary carried over. It also takes a "this is small, ship it" exit at any round boundary: remaining open questions are deferred with the operator's reply as the reason and the work hands off to `/implementation:implement`. +- `/planning:interview` checks at every round boundary whether the work is bigger than it looked, on two triggers (the context-guard zone report has worsened, or two rounds running opened more questions than they closed), and recommends `/planning:wayfind chart` with the ledger, constraints, starting-point disclosure and shorthand glossary carried over. The interview ledger gains a `## Starting point` section, so the intake disclosure survives a `/clear` before wayfind charts. It also takes a "this is small, ship it" exit at any round boundary: remaining open questions are deferred with the operator's reply as the reason and tagged `USER-RESERVED`, the Step 3 confirmation and the Step 4 `--brief` check still run, and the work hands off to `/implementation:implement`. The rules live in the interview's new `context/routing.md`. - The interview states why its entry gate is diff size and retry cost rather than behavior change. diff --git a/plugins/planning/skills/interview/SKILL.md b/plugins/planning/skills/interview/SKILL.md index 68937565fb..0766c97f30 100644 --- a/plugins/planning/skills/interview/SKILL.md +++ b/plugins/planning/skills/interview/SKILL.md @@ -441,24 +441,11 @@ Do NOT auto-clear or auto-invoke. Recommend; let the user pull the trigger. Turn the interview's read of complexity and ambiguity into a recommendation for how the session carrying the work forward should be configured. *When* it lands follows from *what* it configures: an engineering interview recommends at the stop/handoff boundary, for the downstream execution session; a terminal interview (a general decision, per Step 5) recommends at the early post-survey surface and again at the stop boundary, for the current session. -Read [`context/session-config.md`](context/session-config.md) at that boundary, before forming the -recommendation: it owns the two orthogonal knobs and their picking signals, the advisor pairing, -the rule that current model and effort names are fetched live and never pinned (and that a failed -fetch degrades rather than halts), the advisory framing, and the per-surface wording. Do not form -the recommendation from this summary. +Read [`context/session-config.md`](context/session-config.md) at that boundary, before forming the recommendation: it owns the two orthogonal knobs and their picking signals, the advisor pairing, the rule that current model and effort names are fetched live and never pinned (and that a failed fetch degrades rather than halts), the advisory framing, and the per-surface wording. Do not form the recommendation from this summary. ## Routing by size and fog -**Entry: diff size and retry cost, not behavior change.** A change whose diff is quick to review and cheap to retry skips the interview (see "What this skill does NOT do"): when the diff is tiny, a wrong build costs almost nothing, so aligning on the diff after it exists beats aligning before it. Work that fails either test is interview-first, and an effort too big and too foggy for one session is reached from here, never first (`/planning:wayfind` sends a cold start back to this skill). - -**Bigger than you thought? Check at every round boundary.** After each reply is recorded and before the next round is written, answer one question: did this turn out larger or foggier than it looked at entry? It is bigger when either trigger holds: - -- **The context zone has worsened.** The session's context-guard report (the zone line the module injects, or its `mcp__context-guard__status` tool) puts the session past its best zone. Use only a report the harness already surfaced or that tool; do not poll your own context statistics, and write no token or percentage figure here, because the zone thresholds belong to context-guard. No report, or `unknown`, is not a trigger. -- **More branches opened than closed.** Count the register: this round's new `open` rows against the rows it moved to a terminal status. Two rounds running with more opened than closed is a trigger; one is noise. - -On a trigger, recommend `/planning:wayfind chart` to the user in one short block (the trigger and its evidence, what it would carry over); never switch on your own. If it is not a trigger, say nothing and ask the next round. When the user accepts, the handoff carries everything this interview already holds, so nothing is asked twice: the ledger path (`//interview-checklist.md`) with its answered rows as decisions so far, its `open`, `deferred` and `blocked` rows as candidate decision items, the constraints the user stated, the starting-point disclosure from intake, and the session-shorthand glossary. Wayfind's chart step reads that ledger. - -**Small after all: ship it.** At any round boundary the operator can say the work is small ("this is small, ship it") and the model can propose the same when the diff now looks quick to review and cheap to retry. The model's proposal waits for the operator's yes, because the remaining questions are the operator's to drop. On that yes, stop asking; move each `open` row to `deferred` with the reply as its reason, so the register gate passes without inventing an answer; write the decisions so far (the Brief, or the shared-understanding summary in a general session); and hand off to implementation (`/implementation:implement`), not to `/planning:plan`. +Read [`context/routing.md`](context/routing.md) at entry and at every round boundary. It owns why the entry gate is diff size and retry cost, the bigger-than-you-thought check that recommends `/planning:wayfind chart` and what that handoff carries, and the "this is small, ship it" exit with the gates it still runs. ## What this skill does NOT do diff --git a/plugins/planning/skills/interview/context/routing.md b/plugins/planning/skills/interview/context/routing.md new file mode 100644 index 0000000000..f474c9f133 --- /dev/null +++ b/plugins/planning/skills/interview/context/routing.md @@ -0,0 +1,71 @@ +# Routing by size and fog + +Reference detail for the `## Routing by size and fog` section of `SKILL.md`. Read it at entry +and at every round boundary: it owns the entry gate's reason, the bigger-than-you-thought check, +what the handoff to `/planning:wayfind` carries, and the "this is small, ship it" exit. + +## Entry: diff size and retry cost, not behavior change + +A change whose diff is quick to review and cheap to retry skips the interview (SKILL.md "What +this skill does NOT do"): when the diff is tiny, a wrong build costs almost nothing, so aligning on +the diff after it exists beats aligning before it. Work that fails either test is interview-first, +and an effort too big and too foggy for one session is reached from here, never first +(`/planning:wayfind` sends a cold start back to this skill). + +## Bigger than you thought? Check at every round boundary + +After each reply is recorded and before the next round is written, answer one question: did this +turn out larger or foggier than it looked at entry? It is bigger when either trigger holds: + +- **The context zone has worsened.** The session's context-guard report (the zone line the module + injects, or its `mcp__context-guard__status` tool) puts the session past its best zone. Use only + a report the harness already surfaced or that tool; do not poll your own context statistics, and + write no token or percentage figure here, because the zone thresholds belong to context-guard. + No report, or `unknown`, is not a trigger. +- **More branches opened than closed.** Count the register: this round's new `open` rows against + the rows it moved to a terminal status. Two rounds running with more opened than closed is a + trigger; one is noise. + +On a trigger, recommend `/planning:wayfind chart` to the user in one short block (the trigger and +its evidence, what it would carry over); never switch on your own. If it is not a trigger, say +nothing and ask the next round. + +## The handoff to wayfind + +When the user accepts, the handoff carries everything this interview already holds, so nothing is +asked twice. Wayfind's chart step reads the ledger +(`//interview-checklist.md`), so everything goes there before the handoff, +where a `/clear` between the two skills cannot lose it: + +- answered rows: decisions so far; +- `open`, `deferred` and `blocked` rows: candidate decision items; +- the `## Constraint ledger`: the constraints the user stated; +- the `## Starting point` section: the user's starting-point disclosure from intake. When the + ledger has none yet, write it now, one line in the user's words or a faithful paraphrase; +- the session-shorthand glossary. + +The recommendation block names the ledger path, so a fresh session that runs +`/planning:wayfind chart` finds it. + +## Small after all: ship it + +At any round boundary the operator can say the work is small ("this is small, ship it"), and the +model can propose the same when the diff now looks quick to review and cheap to retry. The model's +proposal waits for the operator's yes, because the remaining questions are the operator's to drop. + +On that yes, stop asking and close out through the normal gates; ship-it drops questions, never a +gate: + +1. Move each `open` row to `deferred`, with the operator's reply as its resolution, so the + register gate passes without inventing an answer. Skip the assumption sweep: it exists to find + more questions, which the operator just declined; say so in the restatement. +2. **Step 3 still runs, confirmation gate included.** The yes to ship it drops the remaining + questions; it does not confirm the shared understanding. Run the register gate and the + `--procedure` check, restate with the register recap (the deferred rows visible in it), and get + the user's confirmation. +3. **Step 4 as usual.** An engineering session writes the Brief: each deferred row goes under + `### Deferred questions`, led by its `Q` id, tagged **arbiter: USER-RESERVED** (the handoff + skips `/planning:plan`, so no plan stage would resolve a `/planning:plan` tag), and the + `--brief` cross-check must exit 0 before handing off. A general session writes the + shared-understanding summary with the deferred rows listed. +4. Hand off to implementation (`/implementation:implement`), not to `/planning:plan`. diff --git a/plugins/planning/skills/interview/templates/checklist.md b/plugins/planning/skills/interview/templates/checklist.md index 899c8a92ec..f70f3a7a7e 100644 --- a/plugins/planning/skills/interview/templates/checklist.md +++ b/plugins/planning/skills/interview/templates/checklist.md @@ -21,6 +21,12 @@ One row per constraint, `- C | confirmed|inherited | | ` - C1 | confirmed | V1 ships without SSO | user, round 1 - C2 | inherited | no new runtime dependencies | prior Brief +## Starting point + +One line: what the user disclosed at intake about where they start (SKILL.md Stance, "Intake the starting point"). `/planning:wayfind chart` carries it into its map's Notes, so a session cleared between the two skills keeps it (`context/routing.md` "The handoff to wayfind"). Replace the example line with this run's disclosure. + +- New to this codebase area; has used the queue library elsewhere + ## Open-question register **Write a row the moment a round is ASKED, before any reply arrives.** The register is a byproduct of asking, not of resolving: a question that only lands on disk once it is answered cannot record the failure of never being answered. Statuses: `open` | `answered` | `deferred` | `withdrawn` | `blocked` | `superseded-by-plan` (set by `/planning:plan` when a plan change displaces an answer, resolution `plan proposes: ; was: `; not terminal; row shape and how it clears: `context/loop.md` "Superseded by plan"). `Q` matches the terminal numbering and runs continuously across rounds with no gaps. diff --git a/plugins/planning/skills/wayfind/SKILL.md b/plugins/planning/skills/wayfind/SKILL.md index cf3c07246f..685d97a143 100644 --- a/plugins/planning/skills/wayfind/SKILL.md +++ b/plugins/planning/skills/wayfind/SKILL.md @@ -88,8 +88,9 @@ session. Do not fabricate a map. resolution comment lists them; it is closed at once with one *Decisions-so-far* pointer (the work-mode step 5 sequence). Its open, deferred and blocked questions become candidate decision items, and its self-answered facts are distilled into *Notes* as text, never as a - path. The constraints the user stated, their starting-point disclosure, and the session-shorthand - glossary ride into *Notes* the same way, so a decision the interview already asked is not asked again. Sort every remaining uncertainty through the fog test: sharp → candidate decision + path. Its constraint ledger, its `## Starting point` line, and its session-shorthand glossary + ride into *Notes* the same way, so nothing the interview already asked is asked again. Sort + every remaining uncertainty through the fog test: sharp → candidate decision item; foggy → *Not-yet-specified* prose. **No-fog bail-out:** if the survey leaves *both* halves of the trigger unmet. Every uncertainty is already sharp, or the whole effort fits one session. This effort does not need a map. STOP and route out From a01090156722822ee0c18798f454de30bf1f95df Mon Sep 17 00:00:00 2001 From: Kyle Sexton <153232337+kyle-sexton@users.noreply.github.com> Date: Mon, 12 Oct 2026 23:27:43 -0400 Subject: [PATCH 3/5] fix(planning): condition the ship-it handoff and stop a declined trigger repeating Ship-it now hands off by session kind (implement, design, general summary, or scope return) instead of always to /implementation:implement. The zone trigger fires on a zone worse than at entry and is not re-raised after a decline until it escalates. The ledger template's starting-point line is a placeholder, so no example disclosure reaches wayfind's Notes. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01W6SjPvY7DmXBGzboeCq8nj --- .../skills/interview/context/routing.md | 30 ++++++++++++------- .../skills/interview/templates/checklist.md | 4 +-- 2 files changed, 21 insertions(+), 13 deletions(-) diff --git a/plugins/planning/skills/interview/context/routing.md b/plugins/planning/skills/interview/context/routing.md index f474c9f133..3c3a9a738d 100644 --- a/plugins/planning/skills/interview/context/routing.md +++ b/plugins/planning/skills/interview/context/routing.md @@ -18,7 +18,8 @@ After each reply is recorded and before the next round is written, answer one qu turn out larger or foggier than it looked at entry? It is bigger when either trigger holds: - **The context zone has worsened.** The session's context-guard report (the zone line the module - injects, or its `mcp__context-guard__status` tool) puts the session past its best zone. Use only + injects, or its `mcp__context-guard__status` tool) puts the session in a worse zone than the one + it reported at entry. Use only a report the harness already surfaced or that tool; do not poll your own context statistics, and write no token or percentage figure here, because the zone thresholds belong to context-guard. No report, or `unknown`, is not a trigger. @@ -28,7 +29,8 @@ turn out larger or foggier than it looked at entry? It is bigger when either tri On a trigger, recommend `/planning:wayfind chart` to the user in one short block (the trigger and its evidence, what it would carry over); never switch on your own. If it is not a trigger, say -nothing and ask the next round. +nothing and ask the next round. After the user declines, raise it again only when it escalates: +the zone worsens further, or the other trigger fires. ## The handoff to wayfind @@ -41,7 +43,7 @@ where a `/clear` between the two skills cannot lose it: - `open`, `deferred` and `blocked` rows: candidate decision items; - the `## Constraint ledger`: the constraints the user stated; - the `## Starting point` section: the user's starting-point disclosure from intake. When the - ledger has none yet, write it now, one line in the user's words or a faithful paraphrase; + ledger has none yet, or holds only the template's placeholder, write it now, one line in the user's words or a faithful paraphrase; - the session-shorthand glossary. The recommendation block names the ledger path, so a fresh session that runs @@ -49,23 +51,29 @@ The recommendation block names the ledger path, so a fresh session that runs ## Small after all: ship it -At any round boundary the operator can say the work is small ("this is small, ship it"), and the +At any round boundary the user can say the work is small ("this is small, ship it"), and the model can propose the same when the diff now looks quick to review and cheap to retry. The model's -proposal waits for the operator's yes, because the remaining questions are the operator's to drop. +proposal waits for the user's yes, because the remaining questions are the user's to drop. On that yes, stop asking and close out through the normal gates; ship-it drops questions, never a gate: -1. Move each `open` row to `deferred`, with the operator's reply as its resolution, so the +1. Move each `open` row to `deferred`, with the user's reply as its resolution, so the register gate passes without inventing an answer. Skip the assumption sweep: it exists to find - more questions, which the operator just declined; say so in the restatement. + more questions, which the user just declined; say so in the restatement. 2. **Step 3 still runs, confirmation gate included.** The yes to ship it drops the remaining questions; it does not confirm the shared understanding. Run the register gate and the `--procedure` check, restate with the register recap (the deferred rows visible in it), and get the user's confirmation. 3. **Step 4 as usual.** An engineering session writes the Brief: each deferred row goes under `### Deferred questions`, led by its `Q` id, tagged **arbiter: USER-RESERVED** (the handoff - skips `/planning:plan`, so no plan stage would resolve a `/planning:plan` tag), and the - `--brief` cross-check must exit 0 before handing off. A general session writes the - shared-understanding summary with the deferred rows listed. -4. Hand off to implementation (`/implementation:implement`), not to `/planning:plan`. + skips `/planning:plan`, so no plan stage would resolve a `/planning:plan` tag). No later stage + resolves these rows: the user dropped them, and the tag records that only the user re-raises + one. The `--brief` cross-check must exit 0 before handing off. A `scope` run writes no Brief: + it returns each deferred row as a `Deferred: Q ... (arbiter: USER-RESERVED)` line in its + `Scope decisions:` section. A general session writes the shared-understanding summary with the + deferred rows listed. +4. Hand off by what the session produced, never to `/planning:plan`: engineering work that is not + design-significant goes to implementation (`/implementation:implement`), design-significant + work goes to `/planning:design` first (SKILL.md Step 5), a general session delivers its summary + and stops, and a `scope` run returns to its caller. diff --git a/plugins/planning/skills/interview/templates/checklist.md b/plugins/planning/skills/interview/templates/checklist.md index f70f3a7a7e..d857679421 100644 --- a/plugins/planning/skills/interview/templates/checklist.md +++ b/plugins/planning/skills/interview/templates/checklist.md @@ -23,9 +23,9 @@ One row per constraint, `- C | confirmed|inherited | | ` ## Starting point -One line: what the user disclosed at intake about where they start (SKILL.md Stance, "Intake the starting point"). `/planning:wayfind chart` carries it into its map's Notes, so a session cleared between the two skills keeps it (`context/routing.md` "The handoff to wayfind"). Replace the example line with this run's disclosure. +One line: what the user disclosed at intake about where they start (SKILL.md Stance, "Intake the starting point"). `/planning:wayfind chart` carries it into its map's Notes, so a session cleared between the two skills keeps it (`context/routing.md` "The handoff to wayfind"). Replace the placeholder line with this run's disclosure. -- New to this codebase area; has used the queue library elsewhere +- ## Open-question register From 2548d6dbcdf77c567e282b013d8ef20cb8d96014 Mon Sep 17 00:00:00 2001 From: Kyle Sexton <153232337+kyle-sexton@users.noreply.github.com> Date: Mon, 12 Oct 2026 23:38:21 -0400 Subject: [PATCH 4/5] fix(planning): count exposed branches, list ship-it deferrals, and skip the sweep in the checklist The fog trigger counts the branches a round's answers exposed, since a new branch gets its register row only when asked. The ship-it handoff lists the deferred rows, because /planning:plan's approval gate does not run on that path. The ledger checklist records that a ship-it exit skips the assumption sweep. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01W6SjPvY7DmXBGzboeCq8nj --- plugins/planning/skills/interview/context/routing.md | 10 +++++++--- .../planning/skills/interview/templates/checklist.md | 3 ++- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/plugins/planning/skills/interview/context/routing.md b/plugins/planning/skills/interview/context/routing.md index 3c3a9a738d..a943f71349 100644 --- a/plugins/planning/skills/interview/context/routing.md +++ b/plugins/planning/skills/interview/context/routing.md @@ -23,8 +23,10 @@ turn out larger or foggier than it looked at entry? It is bigger when either tri a report the harness already surfaced or that tool; do not poll your own context statistics, and write no token or percentage figure here, because the zone thresholds belong to context-guard. No report, or `unknown`, is not a trigger. -- **More branches opened than closed.** Count the register: this round's new `open` rows against - the rows it moved to a terminal status. Two rounds running with more opened than closed is a +- **More branches opened than closed.** Recompute the frontier first, then count the branches this + round's answers exposed (the questions the next round would add) against the rows it moved to a + terminal status. Register rows alone miss this: a new branch gets its row only when it is + asked. Two rounds running with more opened than closed is a trigger; one is noise. On a trigger, recommend `/planning:wayfind chart` to the user in one short block (the trigger and @@ -76,4 +78,6 @@ gate: 4. Hand off by what the session produced, never to `/planning:plan`: engineering work that is not design-significant goes to implementation (`/implementation:implement`), design-significant work goes to `/planning:design` first (SKILL.md Step 5), a general session delivers its summary - and stops, and a `scope` run returns to its caller. + and stops, and a `scope` run returns to its caller. The handoff message lists each deferred + row by its `Q` id and question, because `/planning:plan`'s approval gate, the usual place a + `USER-RESERVED` row comes back to the user, does not run on this path. diff --git a/plugins/planning/skills/interview/templates/checklist.md b/plugins/planning/skills/interview/templates/checklist.md index d857679421..5c5734da24 100644 --- a/plugins/planning/skills/interview/templates/checklist.md +++ b/plugins/planning/skills/interview/templates/checklist.md @@ -9,7 +9,7 @@ Planning version: