Context
Surfaced in sprint 20260630-0c77248 (omnibus #573), on issue #230 (Semantic output C5 perf counters).
Problem
When the architect re-scopes an issue during re-triage — dropping needs-decision, re-adding
good-autonomous, and recording the new scope in a parked comment + the committed sprint plan —
the issue body's ## Done-when is left unedited. For #230 the body still listed all three original
assertions (including the unsatisfiable tree_nodes_built == 0 for a not-yet-built C3 backend), while
the binding re-scope (ship two assertions now, defer the zero-tree one to C8) lived only in the parked
memo + sprint plan.
This is handled correctly inside a sprint — /start-sprint §3 says "classify from the label state +
resolving comments, not stale body text", and both the #230 worker and the verdict-only reviewer
reconciled body-vs-labels-vs-plan to recover the intended scope. But it cost the worker ~1 reconciliation
cycle, and a future non-sprint /next-task pick that reads the stale body at face value could
implement the wrong (over-scoped / unsatisfiable) done-when.
Done-when
- A triage/re-triage discipline (in
/triage and/or PRINCIPLES.md §6 issue-contract) states: when an
issue is re-scoped, edit the body's ## Done-when (or add a dated **Re-scope (architect, <date>):**
block at the top of the body) in the same action that flips the labels — so the body and the label
state never disagree on the falsifiable done-when.
- Optionally: a lightweight check/reminder that an issue moving off
needs-decision back to
good-autonomous had its body touched.
Files / blast radius
.claude/commands/triage.md (re-triage step), possibly lark-rs/docs/PRINCIPLES.md §6 (the issue
contract). Governance/process only — no code. Needs /triage to schedule (prio:* + status:triaged).
Context
Surfaced in sprint 20260630-0c77248 (omnibus #573), on issue #230 (Semantic output C5 perf counters).
Problem
When the architect re-scopes an issue during re-triage — dropping
needs-decision, re-addinggood-autonomous, and recording the new scope in a parked comment + the committed sprint plan —the issue body's
## Done-whenis left unedited. For #230 the body still listed all three originalassertions (including the unsatisfiable
tree_nodes_built == 0for a not-yet-built C3 backend), whilethe binding re-scope (ship two assertions now, defer the zero-tree one to C8) lived only in the parked
memo + sprint plan.
This is handled correctly inside a sprint —
/start-sprint§3 says "classify from the label state +resolving comments, not stale body text", and both the #230 worker and the verdict-only reviewer
reconciled body-vs-labels-vs-plan to recover the intended scope. But it cost the worker ~1 reconciliation
cycle, and a future non-sprint
/next-taskpick that reads the stale body at face value couldimplement the wrong (over-scoped / unsatisfiable) done-when.
Done-when
/triageand/orPRINCIPLES.md§6 issue-contract) states: when anissue is re-scoped, edit the body's
## Done-when(or add a dated**Re-scope (architect, <date>):**block at the top of the body) in the same action that flips the labels — so the body and the label
state never disagree on the falsifiable done-when.
needs-decisionback togood-autonomoushad its body touched.Files / blast radius
.claude/commands/triage.md(re-triage step), possiblylark-rs/docs/PRINCIPLES.md§6 (the issuecontract). Governance/process only — no code. Needs
/triageto schedule (prio:*+status:triaged).