@@ -135,12 +135,17 @@ Turn-scoped `refresh-state` and `quota spend-slot` expose
135135` settlement_progress ` from the TypeScript receipt readback. The states are
136136` identity_required ` , ` writeback_required ` , ` writeback_receipt_required ` ,
137137` spend_required ` , ` spend_receipt_required ` , and ` settled ` . A durable run without
138- its matching receipt is incomplete. ` settled ` certifies this writeback/spend
139- chain; Todo completion and Goal acceptance retain their separate checks.
140-
141- After verified writeback, ` settlement_owed.command ` carries the original Goal,
142- Agent, Todo or replan obligation, Turn, registry/runtime route and spend source.
143- Execute it unchanged. In ` spend_receipt_required ` , the same idempotent spend
138+ its matching receipt is incomplete. Ordinarily, ` settled ` certifies the
139+ writeback/spend chain. An exact typed blocked writeback with a bounded retry
140+ instead sets ` closeout_kind=typed_blocked_writeback_no_spend ` and settles the
141+ Turn without a quota debit. Todo completion and Goal acceptance retain their
142+ separate checks in both cases.
143+
144+ When a quota spend remains owed after verified writeback,
145+ ` settlement_owed.command ` carries the original Goal, Agent, Todo or replan
146+ obligation, Turn, registry/runtime route and spend source. Execute it unchanged.
147+ The typed blocked no-spend closeout has no spend command. In
148+ ` spend_receipt_required ` , the same idempotent spend
144149writer restores the receipt without another debit. Refresh and recovery never
145150spend automatically. JSON and normal/recovery Markdown expose the same step.
146151Rejected recovery reports observed progress without offering a spend command.
@@ -313,13 +318,24 @@ from `classification`. New writes should use one of:
313318execution-profile hints only as a compatibility fallback for historical runs;
314319new control-plane decisions should be driven by the enum above.
315320
316- An ` outcome_gap ` does not become delivery progress. It may settle and spend one
317- exact Todo-bound Turn only when the same writeback includes a
321+ An ` outcome_gap ` does not become delivery progress. A blocked writeback is
322+ eligible for exact Todo-bound Turn settlement only when it includes a
318323` typed_progress_observation_v0 ` with ` result_class=blocked ` , the matching
319324` work_item_id ` , a stable ` blocker_id ` , and a non-empty array of stable
320325` evidence_ids ` . Missing schemas, prose-only blockers, malformed evidence, and
321326Todo identity mismatches remain fail-closed.
322327
328+ New Turn-bound blocked writebacks also require a bounded retry on the same
329+ unfinished advancement Todo. A legacy Todo must have a pending
330+ ` resume_when=resume_at:<timezone-aware-time> ` due in 1–30 minutes. With promoted
331+ File/SQLite authority, an open Todo without its own resume condition can use
332+ a five-minute retry stored on the committed Turn instead; the peer-gated Todo
333+ and its completion validator stay unchanged. That exact writeback settles the
334+ Turn without spending quota. The retry suppresses only the blocked Todo for
335+ the same Agent until due or superseded by newer work, so independent eligible
336+ Todos can still be selected. Historical blocked writebacks without a bounded
337+ retry retain their prior spend readback; no debit is retroactively erased.
338+
323339` quota should-run ` also separates long-running observation from work that should
324340advance the selected goal. When the selected goal's current projection is a
325341dependency-only observation, the payload includes ` work_lane_contract ` with
0 commit comments