Why this exists
Recovering a deferral that lost its tracker. #1571 was closed as COMPLETED while still carrying an unchecked box:
#1479 is also CLOSED. So as of now the decision has no open tracker, and grep -rl context-guard plugins/session-flow/ still returns nothing. This issue is that tracker — it is not new scope.
The gap
context-guard publishes a per-session context-window snapshot at ~/.claude/context-guard/context/<session_id>.json and ships context-zone.sh to reduce it to one word (smart / acceptable / dumb / unknown). It is observability-only by design — its reader contract says consumers decide what to do — and no session-flow skill is a consumer.
That is backwards relative to need: session-flow's skills are precisely the ones whose correctness depends on knowing how degraded the current context is. handoff decides whether it is time to check point, orchestrate decides how much to fan out, keep-going and running-retro both re-enter long sessions. All four currently make that call without reading the one seam that answers it.
Motivating evidence from a live session (2026-07-26)
While orchestrating a multi-lane run, the main session reported its own context usage as "around 40%" to the operator. The operator corrected it: the real figure was 15%.
The session had no measurement — it estimated from a vague sense of elapsed work and stated the guess as fact. Meanwhile context-guard was installed, enabled, and had written a fresh snapshot roughly four minutes earlier:
{"used_percentage":15,"remaining_percentage":85,
"context_window":{"context_window_size":1000000,"total_input_tokens":150032}}
context-zone.sh <session_id> returned smart. One cat would have produced the correct number.
This is the failure mode the wiring prevents, and it is worth being precise about the shape: the harm was not that the session ran out of room. It was that the session volunteered a fabricated measurement into a decision the operator was relying on — the handoff threshold. A guessed context percentage is worse than no percentage, because it looks like an instrument reading.
Scope — one decision, made once
Per #1571's note, do not solve this in orchestrate alone. At minimum handoff, orchestrate, keep-going, and running-retro share it. Decide plugin-wide:
- Which skills read the seam, and at what point in their flow.
- Presence-gating and fail-open. The snapshot may be absent (setup never ran), stale, or
unknown. Per the reader contract there is a 10-minute staleness rule and fail-open capability detection. A skill must degrade to today's behavior, never block or guess.
- What a skill does with a zone, which is the substantive half.
handoff has an obvious use (recommend checkpointing on entering a worse zone). orchestrate's is less obvious and must not contradict its own contract — see the constraint below.
- Whether
rate-limit-guard's signal rides along, since it publishes to a sibling path and the two tees are already chained in the statusline slot on at least one machine.
Hard constraint carried over from #1571
orchestrate's export brief is "model- and tool-agnostic by construction", so a context-guard read cannot go into the seven imperatives or the export rails without breaking that contract. The skill's existing lane for a machine-specific read is the priming addendum, which export modes already omit for exactly this reason. Any design must respect that split, and the equivalent question needs answering for each other skill rather than assumed.
Relationship to #1475
#1475 ("context-guard: zone-crossing hooks") is the producer side — making context-guard push guidance via hooks. This issue is the consumer side — session-flow skills pulling the existing seam. They are complementary, and the ordering is a genuine open question worth settling early: if #1475 ships zone-crossing injection, some of what a skill would otherwise inline may become unnecessary. Note #1475 is needs-human and work-class: structural, so it may sit for a while; that argues for the pull side not blocking on it.
Acceptance criteria
Unverified
Why this exists
Recovering a deferral that lost its tracker. #1571 was closed as COMPLETED while still carrying an unchecked box:
#1479 is also CLOSED. So as of now the decision has no open tracker, and
grep -rl context-guard plugins/session-flow/still returns nothing. This issue is that tracker — it is not new scope.The gap
context-guardpublishes a per-session context-window snapshot at~/.claude/context-guard/context/<session_id>.jsonand shipscontext-zone.shto reduce it to one word (smart/acceptable/dumb/unknown). It is observability-only by design — its reader contract says consumers decide what to do — and nosession-flowskill is a consumer.That is backwards relative to need:
session-flow's skills are precisely the ones whose correctness depends on knowing how degraded the current context is.handoffdecides whether it is time to check point,orchestratedecides how much to fan out,keep-goingandrunning-retroboth re-enter long sessions. All four currently make that call without reading the one seam that answers it.Motivating evidence from a live session (2026-07-26)
While orchestrating a multi-lane run, the main session reported its own context usage as "around 40%" to the operator. The operator corrected it: the real figure was 15%.
The session had no measurement — it estimated from a vague sense of elapsed work and stated the guess as fact. Meanwhile
context-guardwas installed, enabled, and had written a fresh snapshot roughly four minutes earlier:{"used_percentage":15,"remaining_percentage":85, "context_window":{"context_window_size":1000000,"total_input_tokens":150032}}context-zone.sh <session_id>returnedsmart. Onecatwould have produced the correct number.This is the failure mode the wiring prevents, and it is worth being precise about the shape: the harm was not that the session ran out of room. It was that the session volunteered a fabricated measurement into a decision the operator was relying on — the handoff threshold. A guessed context percentage is worse than no percentage, because it looks like an instrument reading.
Scope — one decision, made once
Per #1571's note, do not solve this in
orchestratealone. At minimumhandoff,orchestrate,keep-going, andrunning-retroshare it. Decide plugin-wide:unknown. Per the reader contract there is a 10-minute staleness rule and fail-open capability detection. A skill must degrade to today's behavior, never block or guess.handoffhas an obvious use (recommend checkpointing on entering a worse zone).orchestrate's is less obvious and must not contradict its own contract — see the constraint below.rate-limit-guard's signal rides along, since it publishes to a sibling path and the two tees are already chained in the statusline slot on at least one machine.Hard constraint carried over from #1571
orchestrate's export brief is "model- and tool-agnostic by construction", so acontext-guardread cannot go into the seven imperatives or the export rails without breaking that contract. The skill's existing lane for a machine-specific read is the priming addendum, which export modes already omit for exactly this reason. Any design must respect that split, and the equivalent question needs answering for each other skill rather than assumed.Relationship to #1475
#1475 ("context-guard: zone-crossing hooks") is the producer side — making context-guard push guidance via hooks. This issue is the consumer side —
session-flowskills pulling the existing seam. They are complementary, and the ordering is a genuine open question worth settling early: if #1475 ships zone-crossing injection, some of what a skill would otherwise inline may become unnecessary. Note #1475 isneeds-humanandwork-class: structural, so it may sit for a while; that argues for the pull side not blocking on it.Acceptance criteria
unknownhandling specified; absent seam degrades to current behavior with no new failure modeorchestrate's agnostic-export contract demonstrably preserved (machine-specific reads confined to the priming addendum)Unverified