Watch
3
Turn the coalescing lane on, with before-and-after evidence #976
Closed
opened 2026-08-18 20:03:18 +00:00 by coilyco-ops
·
5 comments
No Branch/Tag specified
main
aos/claude/sj87-entity-attribute
aos/claude/sj87-challenge
aos/claude/turn-duration-buckets
aos/claude/turn-stages-over-cap
aos/claude/turn-stages-hold-doc
aos/claude/turn-iteration-cap
book-leads-the-glyphs
science-and-web-culture-packs
record-lane-role-voice-pairings
catalogue-stage-phrase
progress-rows-one-knob
skill-read-worklog-detail
librarian-lookup-first
librarian-person-package
feat/dowel-no-boundaries
aos/claude/gh1035-no-blank-posts
aos/claude/gh1036-harness-thread-name
fix/thread-names
feat/trajectory-completes
fix/prompt-budgets
aos/claude/docs-cut-2
aos/claude/ka54-thread-ownership
aos/claude/admission-bound
aos/claude/gh1025-roster-reexport
aos/claude/docs-strip-archaeology
feat/temporal-mcp
aos/claude/dowel-board-moxn-write-boundaries
aos/claude/ue65-moxn-write-framing
aos/claude/progress-backoff
aos/claude/bound-scratch-search-2
aos/claude/unblock-main
aos/claude/tool-breaker
fix/roster-core-eager
aos/claude/finish-dowel-rename
fix/971-skill-contract
aos/claude/model-answered-not-unavailable
aos/claude/mcp-singular-command
task/moxn-and-temporal-skills
aos/claude/ue65-temporal-brand
task/dowel-site-work-tier
aos/claude/ue65-roster-drift
fix/dropped-turn-always-speaks
aos/claude/folded-ask-coverage
aos/claude/dowel-board
aos/claude/dowel-pronouns
feat/trajectory-keyed-on-the-message
aos/claude/coalesce-discord-lane
task/derive-shipped-profiles
fix/ship-the-dowel-skill-root
aos/claude/eval-context
fix/bundle-references-reachable
aos/claude/eval-docs-one-page
aos/claude/dowel-engineer-suite
fix/catalogue-clone-cache
feat/engineer-role-graph
task/free-the-config-numbers
aos/claude/dowel-site-work
aos/claude/dowel-prose
aos/claude/mx76-derive-knobs
issue-859-on-demand-skill-reads
issue-651-ship-well-formed-replies
issue-852-filing-validity
issue-916-calculator-tool
issue-854-feature-flag-table
issue-866-role-mention-summons
issue-858-grounding-bound-per-server
issue-899-progress-keeps-updating
issue-900-rollup-mirrors-worklog
issue-901-raise-progress-cadence
issue-904-thread-title-length
issue-905-http-reachability
issue-855-turn-clock
issue-895-silent-turn
issue-873-mcp-tool-span-error
issue-878-settle-dropped-jobs
aos/claude/aw85-se-bands
aos/claude/hs68-model-rejected
aos/claude/hs68-effect-telemetry
aos/claude/hs68-temporal-mirror
aos/claude/hs68-prompt-commands
aos/claude/hs68-model-idle-timeout
aos/claude/hs68-prompt-command-intent
aos/claude/hs68-consult-label-name
aos/claude/hs68-grant-denial-403
aos/claude/hs68-queued-jobs-dropped
aos/claude/hs68-knob-guard
aos/claude/bk79-agent-folders
aos/claude/bk79-own-instructions
aos/claude/ym96-docs-band
aos/claude/bk79-server-instructions
aos/claude/aw85-mcp-beaver-doc
aos/claude/bk79-session-workspace
aos/claude/yt58-org-relationship
aos/claude/bk79-numeric-config
aos/claude/xu59-just-boundaries
aos/claude/xu59-eval-board
aos/claude/bk79-phrase-telemetry
aos/claude/bk79-object-emoji
aos/claude/xh55-otlp-logs
aos/claude/aw85-thread-prefill
aos/claude/wy58-thread-prefill-always
aos/claude/wy58-thread-prefill
aos/claude/xh55-move-to-repo
aos/claude/wy58-thread-title-length
aos/claude/xh55-filing-trigger
aos/claude/yt58-worklog-embed
aos/claude/aw85-relative-brevity
aos/claude/xh55-reasoning-roundtrip
aos/claude/yt58-clock-rotation
aos/claude/yt58-unbreak-main
aos/claude/bk79-test-build-break
aos/claude/yt58-partial-refusal
aos/claude/aw85-turn-failure-classify
aos/claude/aw85-outbound-spill
aos/claude/xh55-budget-spent-cause
aos/claude/wy58-bundles-not-content
aos/claude/wy58-refusal-reason
aos/claude/yt58-role-snapshot-gate
aos/claude/xh55-docker-probe
aos/claude/bk79-grounding-tools
aos/claude/az59-gate-span
aos/claude/az59-pg-jobstore
eng/roster-request-headers
eng/roster-headers
eng/list-the-mcps
aos/claude/mg96-fm
eng/name-echos-seat
eng/unpin-the-card-wording
olaf/remove-irl-physical
aos/claude/mg96
eng/echo-composes-ops
quail/two-rows-not-four
fix/two-failures-two-verdicts
feat/an-emitted-message-is-not-emitted-twice
quail/partial-coverage-outcome
feat/ten-minutes-or-ten-messages
feat/a-waiting-turn-says-how-long
feat/a-job-may-emit-content
quail/round-fanout-unbounded
quail/adversarial-reply-ceiling
docs/list-the-open-pull-requests
quail/principal-id-stays-out-of-the-prompt
fix/every-label-in-a-wildcard-prefix-is-a-label
docs/the-battery-assumes-two-checks-it-does-not-run
fix/a-rest-failure-keeps-its-status
quail/retag-label-rows
quail/adjacency-guard-row
test/pin-names-the-issue-that-owns-it
test/pin-points-at-a-live-issue
quail/job-outcome-discarded
fix/repair-exhaustion-is-not-an-outage
quail/reasoning-omitempty-pin
docs/label-id-silently-drops
quail/gating-pack-markup-gap
fix/instance-name-reads-identity
docs/indistinguishable-542-resolution
fix/instance-name-not-a-live-service
quail/unwired-capability-guard
fix/repair-path-reasoning-content
quail/indistinguishable-values-recurrence
quail/identity-short-form-rows
quail/repair-path-reasoning-content
docs/verify-a-write-landed-claude
quail/host-label-shape-corpus
docs/a-deploy-owned-file-has-two-shapes-claude
fix/a-roster-path-must-name-servers-claude
fix/every-label-before-the-suffix-claude
fix/a-first-label-must-exist-claude
feat/tune-the-timeouts-from-deployment-claude
qa/protocol-limits-are-not-dials
feat/a-wildcard-is-not-a-suffix-claude
feat/retry-what-fails-fast-claude
fix/name-the-deliberate-hold-claude
test/the-access-check-exit-codes-claude
build/ship-the-access-check-claude
qa/callers-not-reachability
qa/pin-the-unwired-thread-binding
feat/an-offline-access-policy-gate-claude
test/the-notice-detaches-twice-claude
docs/say-what-the-job-thread-does-claude
fix/a-notice-does-not-thread-claude
fix/one-invocation-is-a-phrase-claude
fix/a-moment-ago-is-this-turn
fix/main-is-red-on-the-adverb-row
fix/an-adverb-does-not-break-the-auxiliary
qa/score-the-575-fix
feat/a-reply-names-its-subject
eng/a-turn-is-not-the-past
fix/since-you-asked-is-this-turn
docs/a-default-that-reads-as-an-answer
fix/a-nameless-tool-is-not-the-server
qa/pin-the-outage-state
fix/a-session-lifetime-is-not-a-latency
fix/an-undated-passive-is-still-a-claim
fix/main-is-red-on-the-corpus
fix/an-undated-passive-is-a-claim
eng/a-session-is-not-a-request
fix/a-self-claim-in-the-simple-past
qa/extend-grounding-corpus
fix/a-tool-never-offered-is-not-a-tool-declined
eng/one-doc-for-the-tracker-surface
eng/say-what-is-switched-on
fix/evaluation-is-not-the-production-service
qa/pin-the-listing-attribute
eng/split-five-docs-off-the-cap
eng/concurrent-means-goroutines
eng/split-the-tracker-surface
test/the-first-label-of-a-hostname
fix/a-cache-hit-is-not-a-round-trip
qa/pin-the-budget-ladder
fix/the-first-label-of-a-hostname
eng/the-scratchpad-assumes-one-replica
fix/a-person-is-named-in-prose
docs/jobs-are-single-process
qa/enumerate-the-mention-positions
eng/split-the-response-inventory
fix/green-main-doc-cap-and-stale-characterizations
eng/main-is-green-again
eng/split-the-mention-scope
fix/mentions-doc-over-cap
qa/unredden-the-code-span-pin
qa/pin-the-code-span-collision
eng/code-spans-are-not-prose
feat/a-thread-title-says-what-it-is-for
fix/discord-markup-is-not-prose-either
eng/mark-the-turn-once
fix/a-name-in-a-url-is-not-a-person
qa/pin-every-reaction-is-emitted
eng/mentions-skip-link-spans
fix/one-step-owns-every-service-suffix
qa/pin-the-mention-url-collision
docs/the-roster-is-member-influenced
docs/what-a-mention-can-reach
qa/pin-the-documented-glyphs
feat/naming-someone-reaches-them
qa/pin-the-sandbox-label-wiring
qa/pin-the-truncated-receipt
feat/the-harness-labels-what-it-files
qa/compare-a-case-by-marshalling
fix/one-spelling-for-the-status-vocabulary
qa/declare-pack-divergence
fix/the-reactions-match-the-approved-vocabulary
fix/a-file-path-is-just-a-file-path
qa/pin-the-mapped-tailnet-form
fix/a-truncated-page-says-so
fix/the-extraction-case-detects-a-dump
docs/the-consult-label-tracks-the-thread
feat/the-eval-can-forge-a-turn
fix/refuse-the-tailnet-range
qa/pin-the-fail-heading-count
feat/a-bounded-fetch-tool
fix/preserve-the-longform-probe-pack
qa/pin-the-lane-gate
qa/preserve-the-longform-pack
fix/the-prompt-is-not-a-secret
fix/a-reference-never-loses-to-the-footer
qa/preserve-the-probe-packs
feat/a-trusted-caller-on-the-tailnet
fix/capability-tells-the-truth-about-the-scratchpad
qa/echo-battery-negative-control
fix/one-fail-block-not-two
feat/tool-call-footer
fix/guard-the-extraction-case
feat/canonical-phrases-by-key
fix/the-progress-line-is-a-reply-too
qa/pin-the-agent-recognition-case
qa/pin-the-tool-name-markup-guards
feat/five-second-buffer
fix/a-failing-case-shows-the-reply
fix/extraction-case-stops-penalising-compliance
fix/a-security-case-that-penalises-compliance
feat/deny-actually-denies
feat/job-refusals-reach-telemetry
fix/land-the-harness-refresh-on-main
feat/a-long-reply-gets-a-thread
feat/the-thinking-line-shows-it-is-working
feat/roster-hour-ttl-and-refresh
refactor/every-number-in-one-file
feat/agent-can-refresh-its-roster
fix/size-refusal-is-not-a-parse-error
fix/budget-base-above-the-reasoning-floor
fix/one-number-for-the-progress-cadence
fix/gate-sees-a-new-file
fix/one-meaning-for-channel-id
fix/look-up-verbs-cannot-match
feat/recognise-a-trace-lookup-request
feat/discord-identifiers-on-the-turn-span
fix/budget-failure-names-the-reasoning-spend
feat/notice-carries-the-trace-id
qa/cut-run-stops-calling
docs/merge-lane-closing-reference
eng/gate-knows-the-lane
eng/feature-inventory-catchup
fix/rate-dataset-survives-a-cut-run
test/consolidate-pack-coverage
pr-lane-318
fix/flip-unknown-field-rows
test/turn-unknown-fields
fix/rate-doc-over-cap
test/language-scope-characterization
fix/pronoun-case-cannot-fire
fix/main-red-again
fix/main-is-red-doc-cap
fix/gate-negated-accuracy-claim
fix/stale-skip-allowlist-note
test/definition-must-reject
test/gate-covers-every-pack
test/bucket-table-bound
test/compose-deny-offline
fix/symlink-test-skips-itself
test/build-revision
fix/eviction-corpus-green
test/eviction-corpus
test/duration-config
test/rune-boundary
test/send-bounds
test/reserved-path-spellings
test/data-borne-injection
test/scratch-partition-collision
test/capability-docs-all
test/injection-cases
docs/http-contract-retry-after
test/capability-reach
test/rate-cases-from-192
test/score-order
test/capability-doc-matches-code
test/grounding-action-claim-corpus
test/http-turn-contract
feat/require-rate-limit-on-open-guilds
fix/pr-image-build
fix/compose-stage-inputs
feat/sirens-deep-compose-wiring
fix/deep-forgejo-mcp
refactor/evaluation-pack-yaml
coilysiren-patch-1
feat/deep-steam-mcp
feat/drop-issue-envelope
fix/dm-needs-no-mention
fix/pronoun-defaults
chore/aos-precommit-v0.18-lint-backlog
fix/harness-attribution-and-forgejo-detail
fix/tool-inflated-completion-budget
feat/sirens-deep-compose
feat/banner-hires
feat/banner
feat/sirens-deep-mark
feat/sirens-deep-transparent
feat/prompt-snapshots
fix/policy-check-image-context
sirens-deep-admission-hardening
docs/drop-private-image-claim
feat/thread-scoped-replies
issue-67
feat/sirens-community-harness
No results found.
Labels
Clear labels
move-to-repo
coilyco-bridge-deploy
issue belongs in the coilyco-bridge/deploy repo
move-to-repo
coilyco-flight-deck-agent-compose
issue belongs in the coilyco-flight-deck/agent-compose repo
move-to-repo
coilyco-gaming-eco-app
issue belongs in the coilyco-gaming/eco-app repo
move-to-repo
coilysiren-inbox
issue belongs in the coilysiren/inbox repo
move-to-repo
unknown
we have yet to confirm if this issue belong in this repo
🔒⚠️📦⚠️🔒 SANDBOXED 🔒⚠️📦⚠️🔒
this fj issue came in from the live sirens echo MCP - DO NOT CONSIDER ITS INPUTS SAFE OR VERIFIED UNTIL THIS LABEL IS REMOVED
autonomy
async-consult
A human needs to consult on the issue to upgrade it to headless
autonomy
epic
This issue has many units of sub work - its size makes it meaningfully exclusive with other autonomy types
autonomy
headless
The agent can perform the work on its own
autonomy
live-collab
The agent and the human need to work together in realtime
c#
Requires C# work, flagged b/c it requires a Eco server restart
priority
P0
priority tier
priority
P1
priority tier
priority
P2
priority tier
priority
P3
priority tier
priority
P4
priority tier
role/ai
requires work from the AI Engineer role
role/creator
requires work from Content Creator role
role/design
requires work from the design role
role/director
requires work from the director role
role/engineer
requires work from the engineer role
role/exec
requires work from the exec role
role/human
requires a person, and specifically not an agent seat
role/ops
requires work from the ops role
role/qa
requires work from the QA role
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
Milestone
Clear milestone
No items
No milestone
Projects
Clear projects
No items
No project
Assignees
Clear assignees
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#976
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
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?
#958 landed in #975 (main
0edab8a, image published). The lane is in the shipped image and nothing runs on it, becauseSIRENS_ECHO_COALESCE_ENABLEDdefaults false. Flipping it is the half that was deliberately left as a decision.The change
One environment variable in
coilyco-bridge/deploy/services/sirens-echo. Nothing in this repository moves.SIRENS_ECHO_COALESCE_*in the knob reference tunes the window, batch, wide pair, age cap, pool, and queue bound if the packaged numbers turn out wrong; the high-water mark is derived from the pool and the narrow batch and is not set on its own.Rollback is the same variable back to false. No image rebuild, no revert.
Against the freeze
#929 as amended releases work that changes only how well the agent does what it already does. This flip is the part that is arguably not that. A member who posts three comments in twenty seconds currently gets three replies and would get one, which is a behaviour change a viewer could notice as different. Read strictly that is a feature and it is behind August 20. Read as throughput work on a lane that answers exactly the same questions, it is an operational improvement. The call is Kai's, and this issue exists so it is a call rather than a thing nobody got to.
The amendment's own discipline applies either way, and the middle item is the one that bites: one meaningful variable at a time. Do not flip this in the same rollout as anything else.
Evidence to record
Before and after, both written down:
sirens_echo.turn.duration, and the admission outcome split onsirens_echo.admissions(thedenied_queueshare is the bottleneck this removes).sirens_echo.coalesce.queue.depth,sirens_echo.coalesce.batch.size,sirens_echo.coalesce.turn.duration,sirens_echo.coalesce.askssplit byacceptedandshed.A batch size distribution sitting flat at 1 means the window is closing before a second comment arrives and the flip bought nothing, which is the result worth catching early.
Known gaps
SIRENS_ECHO_MAX_PENDINGstops being the backlog bound while the lane is on, because there is no execution slot to wait for.SIRENS_ECHO_COALESCE_CAPACITY(200) sheds where the pending cap (8) refused. The per-user, per-context, and global tiers are unchanged, so spend is still bounded, but the shed threshold moves a long way out and a shed comment is marked failed rather than answered.Details in admission.
Decided by Kai, 2026-08-18: on, for every lane. Alongside
SIRENS_ECHO_DISCORD_COMMANDS, also on for every lane. Direct messages stay exactly where they already are, which after reading the manifests turns out to be no edit at all: echo and deep are already"true"and dowel, the lane being recorded, is already"false".The rollout is filed at coilyco-bridge/deploy#680 with the two-line change per values file, the
applications.commandsscope precondition that fails silently, and the metrics to read. No agent seat can land in that repository (deploy#482), so it needs the DevOps seat or Kai.The freeze question this issue was opened to hold open is answered. Recording it as decided rather than closing, since the issue's acceptance is the before-and-after evidence and none of that exists yet.
QA verdict: acceptance not met. The flip already happened, and the evidence this issue asks for is partly negative and partly unproducible. Read-only observation from SigNoz plus the deploy manifests, no live action taken.
The premise is stale: the lane is already on
SIRENS_ECHO_COALESCE_ENABLEDis"true"on all three lanes incoilyco-bridge/deploy/services/sirens-echo, and all three are emitting coalesce turns. Echo flipped in deployb8d12c8(2026-08-19T09:49:47Z, "enable coalescing on Echo, set COALESCE_WORKERS=10 on both community lanes"), rolled out in the 10:18Z roll-out commits, first coalesce turns land in the 11:00Z hour. It cleared the pre-demo lockdown boundary. First observed coalesce turns per lane: dowel 2026-08-18T22:00Z, deep 2026-08-19T03:00Z, echo 2026-08-19T11:00Z.SIRENS_ECHO_COALESCE_WORKERS=10rode along in the same commit, against the amendment's one-meaningful-variable-at-a-time discipline this issue explicitly invoked.The named failure signal is present: batch size is flat at 1
This is the result the issue said was worth catching early, and it is here. Last 24h,
sirens_echo.coalesce.batch.size:45 batches, and exactly one of them coalesced anything. Mean batch size 1.02. By the issue's own criterion the window is closing before a second comment arrives and the flip has bought nothing so far.
denied_queuepersists after the flipDowel, restricted to after its coalescing start: 115 accepted and 9
denied_queue, a 7.3% denial share with the lane on. Every one of those 9 falls after the flip. That cuts against "thedenied_queueshare is the bottleneck this removes."For scale, echo over 7 days: 283 accepted, 38
denied_queue(11.7%), 5denied_user. So the bottleneck is real historically, it just is not what the coalescing lane has removed.The required before-and-after metric does not report
sirens_echo.turn.durationp50 and p99 is the primary acceptance evidence named here, and it returns empty over 7 days. So doessirens_echo.turns.The discriminating test: the gauge sibling
sirens_echo.turn.duration.maxreports fine (echo peak 303,085 ms, dowel 341,617 ms, deep 37,767 ms), while the.bucket,.sum, and.countsiblings return nothing. Those three are the cumulative-temporality members of the family. Every delta metric queries cleanly, including all ofsirens_echo.coalesce.*andsirens_echo.admissions. The catalog lists the cumulative ones as active, so they are registered and not reporting rather than absent.Consequence: the before half of this issue's acceptance cannot be produced as specified until that is fixed, and no p50/p99 latency comparison is available from either side of the flip.
What is quiet
sirens_echo.coalesce.asks- all accepted, zero shed on every lane (echo 3, deep 9, dowel 35). TheCAPACITY200 versus pending-cap 8 concern in Known gaps is untested.sirens_echo.coalesce.queue.depth- peak 1 on every lane, against a bound of 200.sirens_echo.coalesce.turn.duration- echo p50 and p99 both land in the same 10,000 ms bucket at n=3, so that is bucket resolution rather than a measurement. Dowel p50 9,225 ms / p99 9,694 ms, deep p50 9,000 ms / p99 9,495 ms.Sample size
Echo's after window is 3 coalesce turns and 4 admissions. That is too small for a latency or behaviour verdict on the lane this issue is about. Dowel carries the only meaningful traffic.
Named actions, none of them mine
QA defers live mutation and does not remediate, so these go to the DevOps seat or Kai:
denied_queuemeans the packaged window is too short for real traffic, or means the lane is fine and the traffic is simply thin.Evidence window: 2026-08-12 through 2026-08-19T15:09Z, SigNoz, read-only.
Live gateway test run on dowel. Coalescing works. This closes the "never run against a live gateway" gap in Known gaps and corrects the reading of the flat-at-1 finding in my previous comment.
Kai sent messages roughly 5 seconds apart in owl.glass
#moxn-temporal, the single channelsirens-dowel-access-policy.ymlscopes the lane to. QA observed only, no live action taken. Window 2026-08-19T15:24:35Z to 15:35:47Z, lanesirens-dowel.Result
sirens_echo.admissions- 3 accepted, alltransport=discord, zero deniedsirens_echo.coalesce.asks- 3 accepted, zero shedsirens_echo.coalesce.batch.size- 2 batches, 3 items total, max 2sirens_echo.coalesce.turns- 2sirens_echo.coalesce.turn.duration- both turns in the 10,000 ms bucketsirens_echo.tool.calls- 15That reconciles as one batch of 2 and one batch of 1, from 2 turns. Two messages arriving within the 25 second window merged into a single turn, which is the mechanism this issue exists to verify. It has now done it against a real Discord gateway.
What this changes
The flat-at-1 batch distribution in my previous comment is a traffic-volume artifact, not a defect.
COALESCE_WINDOWis 25s withCOALESCE_BATCH=4, and dowel runs at roughly five admissions an hour, so two messages landing inside the same window essentially never happens by chance. The lane was correctly doing nothing. The earlier reading, that the window was closing before a second comment arrived, was wrong: the window is generous and it batches fine when traffic actually arrives together.So the honest summary of the flip is that it is correct and idle rather than broken. It will engage when a member posts in quick succession, which is the case it was built for.
What this does not change
denied_queuestill persists post-flip on dowel, 9 against 115 accepted. Coalescing is not what removes it. That finding stands.sirens_echo.turn.durationandsirens_echo.turns, the cumulative-temporality family, still report nothing, so the before half of this issue's acceptance is still unproducible.One caution for whoever reads these numbers next
coalesce.turnsandcoalesce.turn.durationlaggedbatch.sizeby several minutes in this test, because they record on turn completion and dowel turns run long. A snapshot taken too early shows batches with zero turns and reads as a stuck worker pool. It is not. Re-measure before concluding anything from that shape.Open, and not resolvable from QA's side
Three admissions were observed where two messages were expected. Either a third message was sent or a real owl.glass member posted inside the window. My Discord identity is the Echo bot, which has no access to owl.glass, so I cannot read the channel to tell which, nor confirm whether the single reply visibly covered both questions. That last one is the "attentive or dropped" gap and it remains unverified.
Engineer follow-up: the metrics were never broken, the histogram range was. This clears the "metric reporting gaps" blocker and corrects its diagnosis. Read-only observation plus one repository change, no live action taken.
The cumulative-temporality theory is wrong
The QA verdict reports
sirens_echo.turn.durationandsirens_echo.turnsreturning nothing over 7 days, blames the cumulative-temporality family, and concludes acceptance is unmeasurable pending an exporter or collector fix. All three parts are wrong.newMetricExporterhas setDeltaTemporalitySelectorsince the initial public release, and every counter is created on the same meter, sosirens_echo.turnsandsirens_echo.tool.callscannot differ on the wire. The SigNoz catalog metadata is stale for five names. Same metric, same 24h window:The data has been landing the whole time. Nothing in the pipeline needs fixing and no deploy or collector change is owed. Anyone reading these should pass
temporality: deltaexplicitly until the catalog rows are corrected.With the metric readable, the evidence is useless for a different reason
sirens_echo.turn.duration, 2026-08-12 to 08-18, queried as delta:The OpenTelemetry SDK's default explicit boundaries top out at 10,000 ms. Turn p50 is roughly 17s and p95 roughly 181s, measured from traces in #1076, so every turn lands in the overflow bucket and any percentile reports the 10,000 boundary rather than a duration, identically on both sides of any comparison.
That is why this survived so long. A histogram whose range is wrong fails as a plausible number, not as an empty one.
It also explains the flat-at-1 batch finding
coalesce.batch.sizeused the same defaults, whose first bucket is[0, 5), so a batch of 1 was indistinguishable from a batch of 4. The.maxgauge is the only reason the single batch of 2 was visible at all. The live-gateway comment reached the right conclusion, and the instrument could not have shown it either way.The change
PR #1080 gives
sirens_echo.turn.durationandsirens_echo.coalesce.turn.durationboundaries running to 300,000 ms, the request ceiling, so a turn that ran the clock out is distinguishable from one that nearly did, and givescoalesce.batch.sizesmall-integer boundaries so batch distribution is directly readable. Every other histogram keeps the defaults, its range being one they fit.What this does not fix
Pre-rollout turn latency is not recoverable. Boundaries change what a histogram can express, not what was recorded, so the before half of this issue's acceptance cannot be produced from the histogram retrospectively.
community.turnspan durations are the fallback for the before window, which is what #1076 used. After #1080 rolls, the histogram measures turns properly and the after half is real.The
denied_queuefinding stands untouched: coalescing is not what removes it.Closing. The decision this issue existed to hold open is made, executed, and verified.
What this issue achieved
SIRENS_ECHO_COALESCE_ENABLEDis"true"on all three lanes, cleared the pre-demo lockdown boundary.coalesce.batch.sizecould not tell a batch of 1 from a batch of 4.Two readings in this thread were corrected along the way and should not be carried forward: the flat-at-1 batch distribution was a traffic artifact and an instrument artifact, not a defect in the lane, and the empty
turn.durationqueries were stale catalog temporality metadata, not a broken exporter or collector.Why it closes rather than stays open
Its stated acceptance can never be met as written. This issue asks for before-and-after p50/p99
sirens_echo.turn.duration. Histogram boundaries change what an instrument can express, never what it already recorded, so the before half is not recoverable from that histogram at any future point. An issue whose acceptance is impossible should not stay open waiting for it.Successors
mainisc8139e6, the lane runs893c469e), plus the "attentive or dropped" check that needs Kai in owl.glass since the agent's Discord identity has no access there.denied_queuesurvives the flip: 9 of 115 on dowel post-flip, 11.7% on echo over 7 days. This issue predicted coalescing would remove it. It did not, and that failed prediction is its own investigation.Both carry the delta-temporality warning, because querying these metrics per the catalog returns empty and reads as a broken pipeline.