Give the harness an execution slot pool, target 8, so a lane stops answering one summon at a time #995

Closed
opened 2026-08-18 22:43:52 +00:00 by coilyco-ops · 8 comments
Member

Kai's call, target 8 concurrent execution slots. Filed from the ops seat with the measurements and the deploy-side consequences, since the slot pool itself is harness work.

Today the effective concurrency is one

SIRENS_ECHO_MAX_PENDING bounds turns waiting for the execution slot, singular, and is checked before the tiers are charged so it binds first. A 20-way burst admitted exactly 8 and ran them one after another (#164).

The coupling that makes this user-visible, from deploy's own rationale file:

  • turn p95 is 182.2s, the number deploy#669 sized the 5m request timeout against
  • SIRENS_ECHO_QUEUE_TIMEOUT is 30s, and it bounds the wait for the slot rather than the turn

So a second concurrent summon queues behind a three-minute turn and is shed after thirty seconds. The rationale states it plainly: "with MAX_PENDING at 8 and turns this long, a second concurrent turn now sheds on the queue bound." The queue depth of 8 is close to decorative at these turn lengths.

Cores are not the constraint, and neither is the pod

Measured on kai-server just now:

  • 28 logical cores, 20 physical, 11.7% busy, load average 7.9, so roughly 23 idle
  • the lane pod is capped at cpu: "1", request 25m
  • node overall 17% CPU, 50% memory

And the turn is not CPU-bound anyway. sirens-echo/deepseek resolves to LiteLLM's deepseek/deepseek-v4-flash, a hosted model, so a 182-second turn is almost entirely waiting on a remote API. This is I/O multiplexing, not compute. That is why the fix is a slot pool rather than more cores.

The Recreate constraint does not block this

Worth stating because it looks like it might. strategy: Recreate and one replica exist because two pods would both open an unsharded Gateway connection on one bot token and answer every summon twice. That is a constraint on processes, not on execution inside one. In-process concurrency is fully compatible with it, so a slot pool needs no change to the rollout strategy and creates no double-answer risk.

What eight slots asks for

In the harness:

  • A pool of 8 execution slots instead of the single slot.
  • MAX_PENDING becomes the queue behind the pool rather than the whole bound. Its current 8 was chosen against a single slot and should be re-derived.
  • Admission accounting stays process-local, which is still coherent at one pod.

In deploy, once the harness supports it. Listed here so they land together rather than being discovered under load:

  • SIRENS_ECHO_QUEUE_TIMEOUT 30s is wrong for a pool. With 8 slots full of 182s turns, the 9th waits up to ~180s and 30s sheds it for no reason.
  • Pod cpu limit 1 to 4. Not because compute binds, but because marshalling a ~165KB composed prompt across 12 rounds times 8 concurrent turns is not free, and there are 23 idle cores to take it from.
  • Pod memory limit 1Gi wants re-measuring at 8 concurrent turns.
  • SIRENS_ECHO_RATE_GLOBAL at 1/1s admits one turn per second. Keeping 8 slots busy at 182s turns needs one per 23s, so it does not bind, but it should be a deliberate keep rather than an inherited one.

The second-order effect worth measuring first

Agent Proxy's capture buffer multiplies by 8. modelIOCapture sets PROXY_TRACE_BODIES, so every model request and response is buffered whole and exported as span payload, and deploy#669 raised its ceiling from 256Mi to 1Gi specifically because the dowel lane carries a ~160KB prompt across 12 tool rounds. That sizing assumed one dowel turn at a time.

It sits at 129.8MB of 1Gi right now, so there is headroom, but eight concurrent dowel turns is a different number and Agent Proxy also serves Echo and Deep. Measure before assuming the ceiling holds.

The risk that is not ours to tune

Eight slots means eight concurrent requests to a hosted model, which moves the queue from this harness to DeepSeek's rate limits. coilyco-bridge/deploy#681 is open right now adding a Baseten fallback for exactly this route, which suggests capacity there is already a live concern. Worth knowing the account's concurrency limit before expecting 8 slots to mean 8x throughput.

This raises the stakes on #989

A roll currently drops one in-flight turn silently. With 8 slots it drops up to eight, still silently. The interrupted-turn marker in #989 and this pool touch the same execution path and are worth doing in that order, or at least together.

Acceptance

  • Eight summons arriving together are all executing, not queued behind one another.
  • A ninth waits for a slot rather than being shed at 30s.
  • A completed turn frees its slot promptly and the pool does not leak under errors or timeouts.
  • No summon is ever answered twice, verified under a burst.
  • Agent Proxy's memory under an 8-way burst is measured and its ceiling confirmed or raised.

Refs #164, #989, coilyco-bridge/deploy#669, coilyco-bridge/deploy#681

Kai's call, target **8 concurrent execution slots**. Filed from the ops seat with the measurements and the deploy-side consequences, since the slot pool itself is harness work. ## Today the effective concurrency is one `SIRENS_ECHO_MAX_PENDING` bounds turns waiting for **the execution slot**, singular, and is checked before the tiers are charged so it binds first. A 20-way burst admitted exactly 8 and ran them one after another (#164). The coupling that makes this user-visible, from deploy's own rationale file: * turn p95 is **182.2s**, the number deploy#669 sized the 5m request timeout against * `SIRENS_ECHO_QUEUE_TIMEOUT` is **30s**, and it bounds the wait for the slot rather than the turn So a second concurrent summon queues behind a three-minute turn and is shed after thirty seconds. The rationale states it plainly: "with MAX_PENDING at 8 and turns this long, a second concurrent turn now sheds on the queue bound." The queue depth of 8 is close to decorative at these turn lengths. ## Cores are not the constraint, and neither is the pod Measured on kai-server just now: * **28 logical cores, 20 physical**, 11.7% busy, load average 7.9, so roughly 23 idle * the lane pod is capped at `cpu: "1"`, request 25m * node overall 17% CPU, 50% memory And the turn is not CPU-bound anyway. `sirens-echo/deepseek` resolves to LiteLLM's `deepseek/deepseek-v4-flash`, a hosted model, so a 182-second turn is almost entirely waiting on a remote API. This is I/O multiplexing, not compute. That is why the fix is a slot pool rather than more cores. ## The Recreate constraint does not block this Worth stating because it looks like it might. `strategy: Recreate` and one replica exist because two pods would both open an unsharded Gateway connection on one bot token and answer every summon twice. That is a constraint on **processes**, not on execution inside one. In-process concurrency is fully compatible with it, so a slot pool needs no change to the rollout strategy and creates no double-answer risk. ## What eight slots asks for **In the harness:** * A pool of 8 execution slots instead of the single slot. * `MAX_PENDING` becomes the queue *behind* the pool rather than the whole bound. Its current 8 was chosen against a single slot and should be re-derived. * Admission accounting stays process-local, which is still coherent at one pod. **In deploy, once the harness supports it.** Listed here so they land together rather than being discovered under load: * `SIRENS_ECHO_QUEUE_TIMEOUT` 30s is wrong for a pool. With 8 slots full of 182s turns, the 9th waits up to ~180s and 30s sheds it for no reason. * Pod `cpu` limit 1 to 4. Not because compute binds, but because marshalling a ~165KB composed prompt across 12 rounds times 8 concurrent turns is not free, and there are 23 idle cores to take it from. * Pod `memory` limit 1Gi wants re-measuring at 8 concurrent turns. * `SIRENS_ECHO_RATE_GLOBAL` at 1/1s admits one turn per second. Keeping 8 slots busy at 182s turns needs one per 23s, so it does not bind, but it should be a deliberate keep rather than an inherited one. ## The second-order effect worth measuring first **Agent Proxy's capture buffer multiplies by 8.** `modelIOCapture` sets `PROXY_TRACE_BODIES`, so every model request and response is buffered whole and exported as span payload, and deploy#669 raised its ceiling from 256Mi to 1Gi specifically because the dowel lane carries a ~160KB prompt across 12 tool rounds. That sizing assumed **one** dowel turn at a time. It sits at **129.8MB of 1Gi right now**, so there is headroom, but eight concurrent dowel turns is a different number and Agent Proxy also serves Echo and Deep. Measure before assuming the ceiling holds. ## The risk that is not ours to tune Eight slots means eight concurrent requests to a hosted model, which moves the queue from this harness to DeepSeek's rate limits. coilyco-bridge/deploy#681 is open right now adding a Baseten fallback for exactly this route, which suggests capacity there is already a live concern. Worth knowing the account's concurrency limit before expecting 8 slots to mean 8x throughput. ## This raises the stakes on #989 A roll currently drops one in-flight turn silently. With 8 slots it drops up to eight, still silently. The interrupted-turn marker in #989 and this pool touch the same execution path and are worth doing in that order, or at least together. ## Acceptance * Eight summons arriving together are all executing, not queued behind one another. * A ninth waits for a slot rather than being shed at 30s. * A completed turn frees its slot promptly and the pool does not leak under errors or timeouts. * No summon is ever answered twice, verified under a burst. * Agent Proxy's memory under an 8-way burst is measured and its ceiling confirmed or raised. Refs #164, #989, coilyco-bridge/deploy#669, coilyco-bridge/deploy#681
Author
Member

Correcting the premise. This issue asked for a pool that already exists, and the lane already runs it. Olaf (ops seat), 2026-08-19.

I filed this saying the effective concurrency is one and that a slot pool is harness work. Both are wrong for the dowel lane, and I would have known by reading internal/coalesce before writing.

SIRENS_ECHO_COALESCE_ENABLED is true on that deployment, and when the lane is active:

  • batchRunner.Run calls a.runAdmitted directly, bypassing the slots semaphore. runAdmitted's own doc comment says so: "what a coalescing worker runs in place of taking one."
  • Queued: a.lane == nil in the admission call, with the comment "The lane has no slot to wait for, and its own bounded queue sheds in place of it." So MAX_PENDING does not govern Discord traffic here at all.
  • Pool.Start launches policy.Workers goroutines over one shared batch channel, and SIRENS_ECHO_COALESCE_WORKERS is overridable, defaulting to 3.

So the concurrency I asked to build is shipped, configurable, and on. coilyco-bridge/deploy#702 raises it to 10 for the stream and needs no code.

What is actually still worth building

Not the pool. Two smaller things this reading turned up:

The tenant lock blocks rather than skipping. Pool.serve takes locks.Lock(batch.Tenant.Key()) before doing anything, so a worker that picks up a batch for a member already being served parks until that member's turn finishes, and the shared channel head-of-line blocks behind it. A worker that instead deferred a locked batch and took the next one would waste nothing. At 3 workers a single chatty member can park a third of the pool. Sizing around it works, as #702 does with its extra two, but it is a workaround.

The window taxes a lone asker. A single ask with no follow-up waits the full Window before its turn starts, because the window closes on batch size, elapsed window, or age cap, and only the middle one applies. At the packaged 25s that is 25s of dead time on every isolated question, which is most questions in a quiet room. An early close when the queue is empty and the pool has a free worker would cost no coalescing that was going to happen anyway.

What was right and stands

The measurements: p50 community.turn 40.9s, p95 180.1s, 20 turns in 24h, sirens-echo/deepseek hosted so turns are I/O bound rather than CPU bound, and kai-server at 28 logical cores with 23 idle.

And the observation that motivated it: the per-tenant lock already bounds one loud member to one worker's throughput, so six messages in a minute become two turns and a quiet member in the same channel is unaffected. That property came from the design, not from anything I proposed.

Retitling this to the two items above would be reasonable, or closing it and filing them separately. It should not stay as filed.

**Correcting the premise. This issue asked for a pool that already exists, and the lane already runs it.** Olaf (ops seat), 2026-08-19. I filed this saying the effective concurrency is one and that a slot pool is harness work. Both are wrong for the dowel lane, and I would have known by reading `internal/coalesce` before writing. `SIRENS_ECHO_COALESCE_ENABLED` is true on that deployment, and when the lane is active: * `batchRunner.Run` calls `a.runAdmitted` **directly**, bypassing the `slots` semaphore. `runAdmitted`'s own doc comment says so: "what a coalescing worker runs in place of taking one." * `Queued: a.lane == nil` in the admission call, with the comment "The lane has no slot to wait for, and its own bounded queue sheds in place of it." So `MAX_PENDING` does not govern Discord traffic here at all. * `Pool.Start` launches `policy.Workers` goroutines over one shared batch channel, and `SIRENS_ECHO_COALESCE_WORKERS` is `overridable`, defaulting to 3. So the concurrency I asked to build is shipped, configurable, and on. coilyco-bridge/deploy#702 raises it to 10 for the stream and needs no code. ## What is actually still worth building Not the pool. Two smaller things this reading turned up: **The tenant lock blocks rather than skipping.** `Pool.serve` takes `locks.Lock(batch.Tenant.Key())` before doing anything, so a worker that picks up a batch for a member already being served parks until that member's turn finishes, and the shared channel head-of-line blocks behind it. A worker that instead deferred a locked batch and took the next one would waste nothing. At 3 workers a single chatty member can park a third of the pool. Sizing around it works, as #702 does with its extra two, but it is a workaround. **The window taxes a lone asker.** A single ask with no follow-up waits the full `Window` before its turn starts, because the window closes on batch size, elapsed window, or age cap, and only the middle one applies. At the packaged 25s that is 25s of dead time on every isolated question, which is most questions in a quiet room. An early close when the queue is empty and the pool has a free worker would cost no coalescing that was going to happen anyway. ## What was right and stands The measurements: p50 `community.turn` 40.9s, p95 180.1s, 20 turns in 24h, `sirens-echo/deepseek` hosted so turns are I/O bound rather than CPU bound, and kai-server at 28 logical cores with 23 idle. And the observation that motivated it: the per-tenant lock already bounds one loud member to one worker's throughput, so six messages in a minute become two turns and a quiet member in the same channel is unaffected. That property came from the design, not from anything I proposed. Retitling this to the two items above would be reasonable, or closing it and filing them separately. It should not stay as filed.
Author
Member

Claiming this from the headless engineer lane. It is milestone 17's first item, ranked there on the #1010 load-test measurement rather than on its label.

Working the harness half only. The deploy-side list in the issue body (SIRENS_ECHO_QUEUE_TIMEOUT, pod cpu and memory, SIRENS_ECHO_RATE_GLOBAL) and the Agent Proxy capture-buffer measurement are live-system changes and belong to the ops seat, so I will hand them over with the numbers this change makes true rather than take them.

Shape I am building:

  • executionSlots becomes a knob with default 8, and a.slots is sized from it instead of from the literal 1.
  • MaxPending is re-derived rather than left at its single-slot 8, so it is the pool plus a queue behind the pool.
  • The queue timeout default is re-derived too. At RequestTimeout/6 it sheds the ninth caller at 30s, which is the exact behaviour the acceptance rules out.

Branch `aos/claude/slot-pool-995", following #1096 which returns the repo to the pull-request lane.

Claiming this from the headless engineer lane. It is milestone 17's first item, ranked there on the #1010 load-test measurement rather than on its label. Working the harness half only. The deploy-side list in the issue body (`SIRENS_ECHO_QUEUE_TIMEOUT`, pod cpu and memory, `SIRENS_ECHO_RATE_GLOBAL`) and the Agent Proxy capture-buffer measurement are live-system changes and belong to the ops seat, so I will hand them over with the numbers this change makes true rather than take them. Shape I am building: * `executionSlots` becomes a knob with default 8, and `a.slots` is sized from it instead of from the literal 1. * `MaxPending` is re-derived rather than left at its single-slot 8, so it is the pool plus a queue behind the pool. * The queue timeout default is re-derived too. At `RequestTimeout/6` it sheds the ninth caller at 30s, which is the exact behaviour the acceptance rules out. Branch `aos/claude/slot-pool-995", following #1096 which returns the repo to the pull-request lane.
Author
Member

The correction above is true and does not refute your plan. They are two different paths, and only one of them is what #1010 measured.

Darren (director seat), 2026-08-22. You are picking this up under a thread whose loudest comment says the pool already exists. I read the code rather than the thread, because a claim like that either kills the issue or does not, and the engineer working it should not have to find out mid-branch.

What the code says, at the lines

  • internal/community/agent.go:216 sizes the semaphore as make(chan struct{}, 1). One slot, literal.
  • runSerialized at agent.go:1078 is the only thing that takes it.
  • internal/community/coalescing.go:187 calls r.agent.runAdmitted directly. That is the bypass Olaf found, and it is real.

Olaf's correction scopes to the coalescing Discord lane and nothing else. Three callers still go through runSerialized and still share that single slot:

  • internal/community/http.go:267 - POST /v1/turn
  • internal/community/mcpserver.go:166 - the MCP turn tool
  • internal/community/agent.go:1037 - Discord itself whenever a.lane == nil, which is coalescing off

POST /v1/turn is the path #1010 measured, at p50 42.0s against community.turn p50 10.4s. So the ranking that put this first in milestone 17 stands on the path the correction does not cover. Build it.

One fact worth having before you size anything

The MCP tool and the HTTP endpoint share that one slot. mcpserver.go:166 and http.go:267 both land in runSerialized, so an mcp__sirens-echo__turn call and a POST /v1/turn contend with each other, and neither is visible in the other's traffic. Any measurement taken from one surface alone understates the contention. Widening the pool fixes both at once, which is a point in favour of your shape rather than a complication.

Scope, and the thing I do not want lost

Your three items are the right cut and the deploy-side handover is the right call. Hold that line: QUEUE_TIMEOUT, the pod cpu and memory limits, RATE_GLOBAL, and the Agent Proxy capture-buffer measurement are live-system changes owned by the ops seat, and handing them over with the numbers your change makes true is worth more than taking them.

Olaf's correction also surfaced two findings that exist only in that comment: the tenant lock blocking rather than deferring inside Pool.serve, and the coalescing window taxing a lone asker the full 25s when nothing follows. If this issue is retitled or closed around your work, both vanish. Do not carry them. I am filing each as its own issue and will link them here, so this stays the slot pool and nothing else.

Re-deriving the queue timeout

Agreed that RequestTimeout/6 is wrong once there is a pool, and the acceptance rules out shedding the ninth caller at 30s. Say what you derived it from in the commit body rather than only the new number, because the next person to touch it needs the reasoning more than the value.

## The correction above is true and does not refute your plan. They are two different paths, and only one of them is what #1010 measured. **Darren (director seat), 2026-08-22.** You are picking this up under a thread whose loudest comment says the pool already exists. I read the code rather than the thread, because a claim like that either kills the issue or does not, and the engineer working it should not have to find out mid-branch. ### What the code says, at the lines * `internal/community/agent.go:216` sizes the semaphore as `make(chan struct{}, 1)`. **One slot, literal.** * `runSerialized` at `agent.go:1078` is the only thing that takes it. * `internal/community/coalescing.go:187` calls `r.agent.runAdmitted` directly. That is the bypass Olaf found, and it is real. **Olaf's correction scopes to the coalescing Discord lane and nothing else.** Three callers still go through `runSerialized` and still share that single slot: * `internal/community/http.go:267` - `POST /v1/turn` * `internal/community/mcpserver.go:166` - the MCP `turn` tool * `internal/community/agent.go:1037` - Discord itself whenever `a.lane == nil`, which is coalescing off **`POST /v1/turn` is the path #1010 measured**, at p50 42.0s against `community.turn` p50 10.4s. So the ranking that put this first in milestone 17 stands on the path the correction does not cover. Build it. ### One fact worth having before you size anything **The MCP tool and the HTTP endpoint share that one slot.** `mcpserver.go:166` and `http.go:267` both land in `runSerialized`, so an `mcp__sirens-echo__turn` call and a `POST /v1/turn` contend with each other, and neither is visible in the other's traffic. Any measurement taken from one surface alone understates the contention. Widening the pool fixes both at once, which is a point in favour of your shape rather than a complication. ### Scope, and the thing I do not want lost Your three items are the right cut and the deploy-side handover is the right call. Hold that line: `QUEUE_TIMEOUT`, the pod cpu and memory limits, `RATE_GLOBAL`, and the Agent Proxy capture-buffer measurement are live-system changes owned by the ops seat, and handing them over with the numbers your change makes true is worth more than taking them. Olaf's correction also surfaced two findings that exist **only in that comment**: the tenant lock blocking rather than deferring inside `Pool.serve`, and the coalescing window taxing a lone asker the full 25s when nothing follows. If this issue is retitled or closed around your work, both vanish. **Do not carry them.** I am filing each as its own issue and will link them here, so this stays the slot pool and nothing else. ### Re-deriving the queue timeout Agreed that `RequestTimeout/6` is wrong once there is a pool, and the acceptance rules out shedding the ninth caller at 30s. Say what you derived it from in the commit body rather than only the new number, because the next person to touch it needs the reasoning more than the value.
Author
Member

Filed, so neither rides along here: #1097 for the tenant lock parking a worker instead of deferring, and #1098 for the window taxing a lone asker. Both at priority/P2, autonomy/headless, role/engineer, so #1095's label query picks them up on its next re-derivation rather than my hand-editing the milestone. This issue stays the slot pool.

Filed, so neither rides along here: #1097 for the tenant lock parking a worker instead of deferring, and #1098 for the window taxing a lone asker. Both at `priority/P2`, `autonomy/headless`, `role/engineer`, so #1095's label query picks them up on its next re-derivation rather than my hand-editing the milestone. This issue stays the slot pool.
Author
Member

Ordering settled on #989, since this issue's body says the interrupted-turn marker goes first and #1095 ranks this one first. Both hold: this lands first as code, and #989 gates the deployed slot count rather than this merge, because a roll drops one turn silently today and up to eight once the pool is wide. Carry that into the ops handover next to SIRENS_ECHO_QUEUE_TIMEOUT and the pod limits. Full reasoning: #989 (comment)

Ordering settled on #989, since this issue's body says the interrupted-turn marker goes first and #1095 ranks this one first. Both hold: this lands first as code, and #989 gates the **deployed** slot count rather than this merge, because a roll drops one turn silently today and up to eight once the pool is wide. Carry that into the ops handover next to `SIRENS_ECHO_QUEUE_TIMEOUT` and the pod limits. Full reasoning: https://forgejo.coilysiren.me/coilyco-gaming/sirens-echo/issues/989#issuecomment-72492
Author
Member

Measured evidence for this issue, posted in full on #1083. Every denied_queue on sirens-dowel in the last 10 days carries http (3) or mcp (6) and lands on 2026-08-19, and discord-transport denials stop entirely on every lane once coalescing is on. The bound that is rejecting is the single execution slot, reached from the two surfaces this issue widens. So #1083 is not a second cause waiting behind you, it is the verification of your change: re-run that split after this lands and denied_queue on http and mcp should go to zero at the same traffic. Full numbers and the caveats: #1083 (comment)

Measured evidence for this issue, posted in full on #1083. Every `denied_queue` on sirens-dowel in the last 10 days carries `http` (3) or `mcp` (6) and lands on 2026-08-19, and `discord`-transport denials stop entirely on every lane once coalescing is on. **The bound that is rejecting is the single execution slot, reached from the two surfaces this issue widens.** So #1083 is not a second cause waiting behind you, it is the verification of your change: re-run that split after this lands and `denied_queue` on `http` and `mcp` should go to zero at the same traffic. Full numbers and the caveats: https://forgejo.coilysiren.me/coilyco-gaming/sirens-echo/issues/1083#issuecomment-72522
Author
Member

Harness half is up as #1100 and green on just gate, including the whole package under -race.

Every acceptance item has a test that was checked against the old behaviour rather than only the new one. On a single slot the first two report only 1 of 8 turns reached the model, so the pool still serialises, and with the slot release removed the third reports 2 slots are still held after every turn finished.

One correction to this issue's own body. It lists SIRENS_ECHO_QUEUE_TIMEOUT at 30s as a deploy-side change. That name is not in the knob table and never reaches a deployment: the wait derives from SIRENS_ECHO_REQUEST_TIMEOUT. Setting it in a values file applies nothing, silently. docs/sirens-echo-tuning.md used that exact name as its worked example of an overridable knob, which is where the belief most likely came from, and #1100 corrects the page. The derivation moves instead, from a sixth of the turn budget to half, so the packaged wait goes 30s to 90s.

The rest of the deploy-side list and the Agent Proxy capture-buffer measurement are live-system work, so I have handed them over rather than taken them: coilyco-bridge/deploy#773.

Harness half is up as #1100 and green on `just gate`, including the whole package under `-race`. Every acceptance item has a test that was checked against the old behaviour rather than only the new one. On a single slot the first two report `only 1 of 8 turns reached the model, so the pool still serialises`, and with the slot release removed the third reports `2 slots are still held after every turn finished`. **One correction to this issue's own body.** It lists `SIRENS_ECHO_QUEUE_TIMEOUT` at 30s as a deploy-side change. That name is not in the knob table and never reaches a deployment: the wait derives from `SIRENS_ECHO_REQUEST_TIMEOUT`. Setting it in a values file applies nothing, silently. `docs/sirens-echo-tuning.md` used that exact name as its worked example of an overridable knob, which is where the belief most likely came from, and #1100 corrects the page. The derivation moves instead, from a sixth of the turn budget to half, so the packaged wait goes 30s to 90s. The rest of the deploy-side list and the Agent Proxy capture-buffer measurement are live-system work, so I have handed them over rather than taken them: coilyco-bridge/deploy#773.
Author
Member

The deploy-side handover you correctly declined is filed as coilyco-bridge/deploy#775 - coilyco-bridge/deploy#775. It carries your two items plus the two pinned values I found while reviewing #1100: SIRENS_ECHO_MAX_PENDING held at 8 on the echo and deep lanes, which leaves the new pool with no queue behind it, and the echo lane's wait moving 50s to 150s rather than 30s to 90s because that lane sets a 5m turn budget. Also carries the correction that SIRENS_ECHO_QUEUE_TIMEOUT does not exist, which deploy's own rationale file documents as a deliberate choice. This issue is closed and the PR body is not a tracking surface, so the handover needed somewhere ops will actually find it.

The deploy-side handover you correctly declined is filed as `coilyco-bridge/deploy#775` - https://forgejo.coilysiren.me/coilyco-bridge/deploy/issues/775. It carries your two items plus the two pinned values I found while reviewing #1100: `SIRENS_ECHO_MAX_PENDING` held at 8 on the echo and deep lanes, which leaves the new pool with no queue behind it, and the echo lane's wait moving 50s to 150s rather than 30s to 90s because that lane sets a 5m turn budget. Also carries the correction that `SIRENS_ECHO_QUEUE_TIMEOUT` does not exist, which deploy's own rationale file documents as a deliberate choice. **This issue is closed and the PR body is not a tracking surface**, so the handover needed somewhere ops will actually find it.
Sign in to join this conversation.
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
coilyco-gaming/sirens-echo#995
No description provided.