fix(progress): back the wait narration off instead of editing every beat #1021
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!1021
Loading…
Reference in a new issue
No description provided.
Delete branch "aos/claude/progress-backoff"
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 #934. Stacked on #1014, which unblocks a red
main.What the edits actually were
The 10 edits are not stage transitions. They are
Watch's ticker callingrefresh→narrateWaiteveryturnProgressEvery, which isturnProgressAfter * 2= 16 seconds, matching the observed cadence exactly. So the count was a function of turn duration and nothing else, which is the third bullet of this issue's "why it matters".Stageedits are left alone. Those carry a real transition, and #934's own middle option says an edit carrying no new information is the pure cost. This targets exactly those.The fix
waitBackoffdoubles per timer edit: 16s, 32s, 64s, 128s. The eleven beats from the incident trace now cost 4 writes instead of 10, and a stage change resets the counter because a new stage is new information rather than the same wait continuing.Why there is no hard cap, which this issue asked for
The "Done when" here is "a single turn cannot spend more than a small bounded number of Discord writes on progress, independent of how long it runs". A hard cap is the literal reading and it would revert #899.
That issue is recorded in the code and in the test I had to change:
So a cap trades "12 writes" for "the member thinks it died", on a public recording, which is the same class of harm this issue opens with. The backoff never stops.
Strictly, that means this does not meet the acceptance as written: cost is logarithmic in duration rather than independent of it. In practice
SIRENS_ECHO_REQUEST_TIMEOUTbounds the turn, so the ceiling is a handful of writes. Flagging rather than quietly redefining it. If you want the hard cap anyway, it is a few lines and #899 should be reopened alongside.Two existing tests changed rather than deleted
Both asserted one edit per beat, which is the behaviour this issue calls the defect, so they could not both stay true. What they were protecting is kept and still asserted:
Two tests added: the backoff itself, driven with the incident's own numbers (eleven 16-second beats), and that a stage change restarts it.
Also corrected
This issue's first bullet was already withdrawn in its own comments: the lanes no longer share a bot token, so the rate-limit argument is per-lane. I did not rely on it. The reason to fix this is the recording, which is the argument that survived.
Verification
just gatepasses: build, policy-check, vet, test, test-skips, pre-commit.go test -race ./internal/...clean, which matters since the counter is touched under the progress lock.Not verified against Discord. The turn shape is driven by a fake clock and a recording sink, as the existing progress tests are.