Why: O2 A01 paid rerun P3 (after #233) failed again on route-contract C8. Final-only was triggered by the budget reserve after a round of three knowledge_search calls; #233 only appended the notice to publish_work_checkpoint results, so the model never saw it, called the checkpoint tool in the final-only request, and the strict contract treated the undeclared tool as terminal.
Change:
New subRun.withFinalOnlyNotice appends materialFinalOnlyNotice when the material budget applies and the next request will be final-only or stop; IsError is never changed.
Used by the publish_work_checkpoint branch (unchanged behaviour) and by the generic tool branch; the persisted tool-result summary equals the content returned to the model.
Final-only checkpoint reject branch, finalOnlyRejected latch, per-request decision, reminder, declaration removal, schemas and task text unchanged.
Evidence (SELF, host): gofmt clean; go vet ./internal/runtime/; go test ./internal/runtime/ ./internal/runmgr/ ./internal/server/ -count=1 ok; go test -tags live -run '^TestFollowupA01KeepsItsOwnOneShotResult$' ./eval/live/ ok; git diff --check clean. Implementation: agent-exec unit o2f1b-i1-backend-notice-all-tools (PI, attempt 1, success). Independent review (fresh session): no blocking issues; non-blocking: runtime-generated results (hook/unknown-tool/cancel) bypass runTool and carry no notice; materialDecision comment still mentions checkpoint results only.
Impact: material subagent with a token budget only; non-material subagents unaffected. Whether the model obeys needs a separately authorized paid rerun.
Refs: Dev feature/fast-slow-o2-final-only-notice-all-tools; previous Backend #233
Announce final-only on every material tool result
Why: O2 A01 paid rerun P3 (after #233) failed again on route-contract C8. Final-only was triggered by the budget reserve after a round of three knowledge_search calls; #233 only appended the notice to publish_work_checkpoint results, so the model never saw it, called the checkpoint tool in the final-only request, and the strict contract treated the undeclared tool as terminal.
Change:
- New `subRun.withFinalOnlyNotice` appends materialFinalOnlyNotice when the material budget applies and the next request will be final-only or stop; IsError is never changed.
- Used by the publish_work_checkpoint branch (unchanged behaviour) and by the generic tool branch; the persisted tool-result summary equals the content returned to the model.
- Final-only checkpoint reject branch, finalOnlyRejected latch, per-request decision, reminder, declaration removal, schemas and task text unchanged.
Evidence (SELF, host): gofmt clean; go vet ./internal/runtime/; go test ./internal/runtime/ ./internal/runmgr/ ./internal/server/ -count=1 ok; go test -tags live -run '^TestFollowupA01KeepsItsOwnOneShotResult$' ./eval/live/ ok; git diff --check clean. Implementation: agent-exec unit o2f1b-i1-backend-notice-all-tools (PI, attempt 1, success). Independent review (fresh session): no blocking issues; non-blocking: runtime-generated results (hook/unknown-tool/cancel) bypass runTool and carry no notice; materialDecision comment still mentions checkpoint results only.
Impact: material subagent with a token budget only; non-material subagents unaffected. Whether the model obeys needs a separately authorized paid rerun.
Refs: Dev feature/fast-slow-o2-final-only-notice-all-tools; previous Backend #233
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Announce final-only on every material tool result
Why: O2 A01 paid rerun P3 (after #233) failed again on route-contract C8. Final-only was triggered by the budget reserve after a round of three knowledge_search calls; #233 only appended the notice to publish_work_checkpoint results, so the model never saw it, called the checkpoint tool in the final-only request, and the strict contract treated the undeclared tool as terminal.
Change:
subRun.withFinalOnlyNoticeappends materialFinalOnlyNotice when the material budget applies and the next request will be final-only or stop; IsError is never changed.Evidence (SELF, host): gofmt clean; go vet ./internal/runtime/; go test ./internal/runtime/ ./internal/runmgr/ ./internal/server/ -count=1 ok; go test -tags live -run '^TestFollowupA01KeepsItsOwnOneShotResult$' ./eval/live/ ok; git diff --check clean. Implementation: agent-exec unit o2f1b-i1-backend-notice-all-tools (PI, attempt 1, success). Independent review (fresh session): no blocking issues; non-blocking: runtime-generated results (hook/unknown-tool/cancel) bypass runTool and carry no notice; materialDecision comment still mentions checkpoint results only.
Impact: material subagent with a token budget only; non-material subagents unaffected. Whether the model obeys needs a separately authorized paid rerun.
Refs: Dev feature/fast-slow-o2-final-only-notice-all-tools; previous Backend #233