feat(proxy): bound a turn, not just each completion in it #1077
No reviewers
Labels
No labels
move-to-repo
coilyco-bridge-deploy
move-to-repo
coilyco-flight-deck-agent-compose
move-to-repo
coilyco-gaming-eco-app
move-to-repo
coilysiren-inbox
move-to-repo
unknown
🔒⚠️📦⚠️🔒 SANDBOXED 🔒⚠️📦⚠️🔒
autonomy
async-consult
autonomy
epic
autonomy
headless
autonomy
live-collab
c#
priority
P0
priority
P1
priority
P2
priority
P3
priority
P4
role/ai
role/creator
role/design
role/director
role/engineer
role/exec
role/human
role/ops
role/qa
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
coilyco-gaming/sirens-echo!1077
Loading…
Reference in a new issue
No description provided.
Delete branch "aos/claude/turn-iteration-cap"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Closes #1076.
What the measurement changed about the issue
The issue proposed a per-turn iteration cap with an env knob, degrading to an
answer from gathered results rather than dropping the turn. That mechanism
already existed as
SIRENS_ECHO_TOOL_ROUNDS/model_budget.tool_roundsplusthe
toolsSpentpath, and the traces show it is honoured:model.roundneverpassed 15 across the whole 24h window, exactly the last round of dowel's
16-call ceiling. The issue's grep found no knob because it searched the deploy
repo rather than the harness.
The tail has a different cause. The heaviest turn ran 36
model.chatspansin 235.9s, and its rounds read 0-8 three times each and taper to 13 once. That
is three completions of 14, 13, and 9 rounds, not one loop that ran long,
and
mcp.tools.listappears three times in the same trace, one per completionthat opened a roster. A turn runs the content gate, the answer, and the filing
check as separate
Completecalls, and each one opened the ceiling again. Theper-completion bound multiplied instead of binding. Nothing counted the turn.
Retry amplification was ruled out: every failure path marks its span errored,
and only one errored
model.chatspan exists in the window.The change
SIRENS_ECHO_TURN_MODEL_CALLS(24, per lanemodel_budget.turn_model_calls)rides the turn context and is spent by every completion under it.
It gates investigation and never the answer. Under two calls a tool round no
longer fits, so the tools are withdrawn and the existing spent-budget notice is
appended, logged as
model.turn.budget.spent, while every completion still buysits final call. A starved content gate or filing check fails a turn outright,
which is a worse outcome than a turn answering from partial evidence and saying
which parts it could not determine. An allowance under two would make the lane
silently toolless, so configuration refuses it.
Only an ingress turn installs an allowance. The evaluation board, the bridge
runner, and the rate lane call
Completeoutside a turn and carry none, and anil budget affords everything, so they are unchanged.
Against the measured window, 24 would have bounded the 36-call and 26-call turns
and left the 20/17/15-call turns untouched. The p50 of 3.65 completions per turn
is nowhere near it.
Notes for review
docs/FEATURES.mdis not updated. It sits at exactly its 120-line /7924-char caps on main, and
docs/is at its 40-page cap, so neither a newpage nor a new bullet fits without evicting existing content. On a fair
reading this rescopes an existing bound rather than shipping a new capability,
which is the case FEATURES says to leave alone. The prose landed in
docs/sirens-echo-turn-stages.md, already linked from the FEATURES index.Say the word if you would rather make room for an entry.
agent/rendered/knobs.txtis regenerated by its own test.go build,go vet,go test ./..., andpre-commit run --all-filesare allgreen.