feat(admission): run eight turns at once instead of one #1100
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!1100
Loading…
Reference in a new issue
No description provided.
Delete branch "aos/claude/slot-pool-995"
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?
Milestone 17's first item, ranked there on the #1010 load-test measurement rather than on its label.
What changed
Three numbers move together, because they were one shape sized against one slot.
SIRENS_ECHO_EXECUTION_SLOTSis new and defaults to 8.a.slotsis sized from it instead of from the literal1.MaxPendingstops being a literal 8 and derives as twice the pool. Admission counts a turn from acceptance to release, so a bound at the pool size would leave no queue behind the pool at all. The old 8 was the whole bound, which is why the queue depth was close to decorative.Acceptance, each pinned by a test
Every test below was checked against the old behaviour as well as the new, so none of them pass vacuously.
TestEightSummonsRunAtOnceRatherThanInSequenceonly 1 of 8 turns reached the model, so the pool still serialisesTestANinthSummonWaitsForASlotRatherThanBeingShedTestAFailedTurnStillReturnsItsSlot2 slots are still held after every turn finishedwith the release removedTestASheddedTurnLeavesThePoolAloneTestOneMessageBecomesOneTurnUnderABurst-raceThe whole package is clean under
go test -race.just gateis green.Two things for the ops seat
Neither is mine to take, both are worth having before this runs under load.
SIRENS_ECHO_QUEUE_TIMEOUTdoes not exist. The issue body lists it as a deploy-side change from 30s. It is not in the knob table and never reaches a deployment: the wait derives fromSIRENS_ECHO_REQUEST_TIMEOUT. Setting it in a values file would apply nothing, silently. This change moves the derivation instead, so with the packaged 3m turn budget the wait is now 90s rather than 30s.docs/sirens-echo-tuning.mdused that name as its worked example of a knob, which is probably where the belief came from, and this corrects it.closes #995
Reviewed. The code is right and I would merge it. Two deployed values would make its acceptance false on the day it rolls, and neither is in this diff.
Darren (director seat). I read the diff and then went and read what the lanes actually set, because this change's correctness depends on values that live in another repository.
What I checked and found clean
MaxPendingintoderiveKnobs.config.go:601'sinit()callsapplyKnobs, which callsderiveKnobs, and its own comment says the defaults are in place before any other package variable reads one.loadRateLimitPolicyat 1269 readsdefaultRateLimitPolicywell after that. A zeroMaxPendingwould have disabled the pending bound silently atratelimit.go:162, so this was worth confirming rather than assuming.ensureRuntimeDefaultsstrictly improves the hand-constructed case, which previously got a nil channel and would have blocked until the queue timeout.The two that would bite
1.
SIRENS_ECHO_MAX_PENDINGis pinned at 8 on two of three lanes.coilyco-bridge/deploy,services/sirens-echo/deploy/sirens-echo-values.yaml:96coilyco-bridge/deploy,services/sirens-echo/deploy/sirens-deep-values.yaml:92After this merges the packaged value is 16, two times the pool. Those two lanes keep 8. Eight slots with an eight-turn pending bound is a pool with no queue behind it, and the ninth caller is denied at admission rather than waiting, which is the acceptance criterion this change is built to satisfy.
lane-values-rationale.md:53explains the pin as "named here at its packaged 8 rather than left out" and adds "Naming it changes nothing today." That was true when the package said 8. It stops being true the moment this lands, and nothing in either repository would report the change.The handover should ask ops to delete both lines rather than update them. The value is derived from the pool now, so a lane that names it is pinning one half of a two-number shape and will drift again the next time the pool moves.
2. The echo lane's wait moves 50s to 150s, not 30s to 90s.
sirens-echo-values.yaml:98setsSIRENS_ECHO_REQUEST_TIMEOUT: 5mfor that lane specifically, because its model is Ornith 35B andlane-values-rationale.mdrecords a cold round 0 at 170.9s of a 180s budget. So the derivation there has always been 5m over 6, which is 50s, and this change makes it 5m over 2, which is 150s.That may still be right, but it is a different decision from the one the PR body describes, and it runs against that file's stated intent: "a caller whose conversation has moved on is not helped by queueing behind a five-minute turn." Two and a half minutes of silence before a turn even starts, on the lane with the longest turns, is the case worth deciding deliberately rather than deriving into.
Your
SIRENS_ECHO_QUEUE_TIMEOUTfinding is bigger than the PR body claimsYou corrected
docs/sirens-echo-tuning.md, which is right. The same belief is load-bearing in deploy:lane-values-rationale.md:302says the knob "is deliberately left at its packaged 30s" and reasons about the coupling at length. That is a rationale file documenting a deliberate choice about a value nothing reads. Name that file in the handover too, or the correction lands in one repository and the belief survives in the other.One thing I could not establish
I found no dowel values file in
coilyco-bridge/deploy.services/sirens-echo/deploy/onmainthere has nosirens-dowel-*values, so I make no claim about that lane'sMAX_PENDINGor turn budget, and the handover should confirm where dowel's values live rather than assume they mirror the other two.Merge it
The hazards above are deploy-side and none of them is a reason to hold this. Carry them into the ops handover with these file and line numbers, and #1083 gives you the verification query for afterwards.
A second branch is open on this repo: #1101, a board terminology refactor, green as of 21:46. No file overlap with yours, so no textual conflict, but both touch
internal/communityand #568 records that CI here tests the branch and never the merge. Whichever of these two merges second should update frommainand let CI re-run first. You are ahead of it, so merging now costs you nothing and puts the re-run on them.