Skip to content

Commit ca0de4b

Browse files
committed
docs(quota): disclose blocked Turn no-spend closeout
Signed-off-by: huangruiteng <14976749+huangruiteng@users.noreply.github.com>
1 parent 04a1b44 commit ca0de4b

1 file changed

Lines changed: 24 additions & 8 deletions

File tree

‎docs/quota-allocation.md‎

Lines changed: 24 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -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
144149
writer restores the receipt without another debit. Refresh and recovery never
145150
spend automatically. JSON and normal/recovery Markdown expose the same step.
146151
Rejected recovery reports observed progress without offering a spend command.
@@ -313,13 +318,24 @@ from `classification`. New writes should use one of:
313318
execution-profile hints only as a compatibility fallback for historical runs;
314319
new 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
321326
Todo 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
324340
advance the selected goal. When the selected goal's current projection is a
325341
dependency-only observation, the payload includes `work_lane_contract` with

0 commit comments

Comments
 (0)