fix(turns): a dropped turn always tells the member #987
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!987
Loading…
Reference in a new issue
No description provided.
Delete branch "fix/dropped-turn-always-speaks"
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 #939. Board item 1 on #981,
priority/P0.The wall is arithmetic, not a hang
Three turns died at 30.56s, 30.44s, 30.47s with no reply, no error, no model call.
The lane ran the packaged 3 minutes, so the slot wait was exactly 30 seconds. A 120ms spread across three turns is a budget expiring, not a network.
They never entered
runTurn, which is why the traces carry noturn.input.acceptedand no children.Why they were silent
replyQueueTimeoutreturned beforeReply, because the notice was throttledBurst: 1, Every: time.Second, keyed on the channel. p95community.turnwas 182.2s against one execution slot, so several turns queued behind the same slow work and expired inside the same second. The first was told. The rest reporteddiscord_failure: not_attempted, which is the runtime recording that it never asked Discord anything.The throttle was deliberate, and it is wrong here
Its purpose is right for a denial: saturation must not become an amplifier. A denial says no.
A drop says nothing after admission already said yes. The member did nothing wrong and cannot tell that apart from being ignored. Kai's call on #939 is "never drop silently".
The amplifier concern survives without it. Only admitted turns reach the queue and
MaxPendingcaps how many wait at once, so a saturation burst produces at most that many notices rather than unbounded ones.A previous fix added a failure reaction ahead of the throttle so a suppressed member got something. #939 is the measurement that a mark alone is not enough: three members read it as being ignored.
Tests replaced, not deleted
TestQueueTimeoutNoticeIsThrottledForDiscordOnlyandTestAThrottledQueueTimeoutStillMarksTheMessagepinned the old rule. Both are replaced by tests pinning the new one, across both transports and specifically for a second drop inside one window. Replacing rather than deleting keeps the inversion visible to whoever reads this next, since the old tests were correct for their time.contextKeyandnotifyQueueTimeoutare removed rather than left dead, so nothing invites re-wiring the throttle onto this path.Correction on the issue thread
My first root-cause comment on #939 blamed MCP roster assembly. It was wrong, and the issue's own evidence ruled it out: that path runs inside
runTurn, well afterturn.input.accepted, which the traces do not have. Corrected in the thread rather than edited away.Not in this PR
#943 is not the same defect, which #981 item 2 asked to be settled either way.
mcp.tools.cachedis derived aslen(entries) > 0 && reached == 0, so it reads true both for a healthy warm turn and for one where every server is backing off. #943's 21cached: truespans are consistent with normal warm turns, and its zero-tool rounds remain unexplained. The first move there is fixing the attribute so those two states stop looking alike.#940 is independent. Result bounding after the round trip shares nothing with this.
Verification
go build,go vet,go test ./...,pre-commitall pass.The acceptance on #939 is a repeat of the load burst showing zero silent terminations. That is a live measurement and belongs to whoever can run one, so I will note the before-and-after on the issue rather than claim it here.