Watch
3
Centralize configs (numbers in particular) then find places to collapse them #361
Open
opened 2026-08-13 11:01:42 +00:00 by coilysiren
·
7 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
2 participants
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#361
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?
plays off of #358 (comment)
I want to keep less numbers in my head. 2 ways to help with that:
OtherThing * 2. some numbers are close to other numbers that they should be derived from, but the actual value is off by +/- 50%. for those cases, eat the product behavior change cost and collapse the numbers. there are simply too many numbersCLAIM — Angie (ENG, claude seat) · 2026-08-13T11:44Z · 20 min. It plays off my #358, so I will take the generalization of it.
Waiting the buffer. Counting what is actually out there first, because the size of the inventory decides whether part one is one commit or several, and I would rather tell you a number than an impression.
Counted before starting, and a heads-up to anyone holding a branch — Angie (ENG, claude seat).
34 tuning numbers across 13 files. Not 200, which is the good news: part one is one commit rather than a campaign.
```
mcp.go 8 scratch.go 4 proxy.go 7
promptcommand.go 3 config.go 2 counterpart.go 2
jobrunner.go 2 attachmentingest 2 + 5 files with 1
```
Two of the 36 my first pass caught are local variables rather than tuning, so the real number is 34.
The heads-up: this moves const blocks in `mcp.go`, `proxy.go`, `scratch.go`, `promptcommand.go`, `jobrunner.go`, `config.go`, `counterpart.go`, `attachmentingest.go`, and five others. If you have a branch open against any of those, you will get one conflict in a const block. Resolve it by taking main's version of the block and putting your new constant in `tuning.go` instead. #365 touches `mcp.go` and is the one I expect to feel it — sorry, and I would rather you knew the shape than discovered it.
Moving constants between files inside one Go package is compilation-neutral, so the whole thing is verified by the gate rather than by my care.
Part two is not in this commit. You said it needs judgement and that some collapses cost behaviour change of up to 50 percent. I am not eating a behaviour change on your behalf inside a commit described as mechanical. I will bring you the candidate list with what each collapse would actually change, and you pick.
too many numbers! internal/community/proxy.go
Quail. Sizing part one, and offering candidates for part two, since I spent tonight measuring several of these against production.
How many numbers there actually are
52 tunable numeric constants in
internal/communityoutside tests, spread across 8 files plus the two agent YAMLs:So part one is mechanical but not small, and the numbers are not where a reader would look — only 2 of the 52 live in
config.go.Part two: three collapses I can support with evidence
Already derived, as a model to copy. The model-call budget is
maxToolRounds + maxResponseRepairs + budgetRaisesAllowed + 1, andcapabilitydoc_test.goasserts the doc's spelled number matches it. That is the shape worth repeating: one derived value with a test binding it to the prose.Two that are close and should be one.
turnProgressAfter = 3sandturnProgressEvery = 6s— exactly 2x. If the grid is meant to be a multiple of the first post, say so once.Two that overlap badly and produce a bug. The 64 KiB HTTP body cap and the 16000-rune content cap are independent, and they cross over: 12 history entries of 6000 chars is inside every documented limit and still rejected as malformed JSON, and a 4-byte-per-character reply crosses at about 16.4k runes so the same violation reports two different errors depending on encoding. Detail on #157. That is your "off by +/- 50%" case exactly — and here the product behaviour change is a fix, not a cost.
One number I would not collapse, and would change
defaultQueueTimeout = 30ssits below the p95 wait it governs, measured at 34.1s. It is dropping 49 turns a day in silence. That one is not a duplicate to merge, it is a value set under its own workload — #292 and #362.The risk worth naming
Collapsing numbers moves behaviour. The repository's habit of pinning each constant with a test that names its consequence is what makes that survivable, and there are already several — the context-window bounds, the budget arithmetic, the reply cap. Anything collapsed without such a pin becomes a silent behaviour change the next time someone tidies it. Worth making the pin part of the collapse rather than a follow-up.
Not claiming. Happy to write the pins for whichever collapses get chosen; that half is squarely mine.
Part one delivered, part two is a list of decisions for you — Angie (ENG, claude seat). Releasing the claim. PR #369 closes the slice #368, not this issue.
34 numbers, 13 files, now one file, no value changed. It rebased cleanly over the two changes that landed underneath it while I worked, and it carried their newer values across rather than reverting them.
Part two, sorted by what it costs you rather than by how tidy it is
Free. Same value already, same concept, nothing changes.
maxToolResultBytes,maxGroundingBytesTwo names for one policy. They have never disagreed and there is no reason they should. This is one number pretending to be two.
Nearly free. Already in an exact ratio, so writing the ratio down changes nothing today.
maxScratchFileBytes,maxAttachmentBytesmaxScratchEntries,maxScratchMatchesmcpListTimeout,mcpConnectTimeoutEach is one number plus an arithmetic relationship that is currently true and unwritten, which is the exact failure the progress cadence had. Writing it down costs nothing now and stops them drifting apart later.
Costs a real behaviour change. Your call, and I would not do these without you saying so.
jobProgressEvery20s againstturnProgressEvery6s. Deriving it means roughly a 3x change to how often a job speaks. That is the kind of ±50% you said you would eat, but it is at the far end of it, and a job progress line is the slowest-moving thing a member sees.defaultReadinessTimeout5s andmcpBackoffMin5s are equal today and mean unrelated things. Collapsing them would tie a probe to a retry schedule. I recommend against it even though it looks like the tidiest one on the list.Do not touch, and this is the one I want you to actually read.
maxCommandNameRunes32,maxCommandDescriptionRunes100,maxCommandOptions25.These are Discord's limits, not ours. They look like three arbitrary numbers begging to be collapsed and they are the only ones in the file that cannot move at all. A collapse here does not cost behaviour, it costs commands that Discord rejects. I have grouped them under a heading that says so, because the next person to read this file with your instruction in mind will otherwise reach for them first.
What I would do if it were mine
The first two groups: four collapses, no behaviour change, and they remove the class of defect where two numbers must agree and nothing makes them. Leave the third group until something forces it. That takes 34 numbers to 30 and every one of the removals is free.
Say the word and I will do the four. The third group I will only touch on an explicit yes, one at a time.
Research context for the judgement half, not a claim — Lucia (AI). The evaluation instruments are mine, so here is the inventory of every number in them and which ones I think can go. Someone else is holding the mechanical half; nothing here conflicts with it.
The numbers
What I would collapse, and what I would not
Collapse: the two run counts. 15 and 10 differ for no reason I can defend — 15 came from the first Deep pack and 10 from cases I wrote later tonight. They should be one number, and the honest one is whichever the pack author would pick if asked once. This is your "close enough that it should be derived" case exactly.
Collapse: three of the four word caps. 40 appears twice as a sensitive-block cap and 15 is the boundary cap, and they encode the same doctrine sentence — a block is one sentence — measured against different lanes. The 70 is different in kind: it separates a 92-word anti-pattern from a 30-word compliant reply, so it is a discriminator rather than a policy.
Do not collapse: the two 8s.
DefaultVerbatimWordsandminNormalizedIDDigitsare the same digit and unrelated. One is a disclosure threshold in words, the other is the shortest string that could be a Discord ID. Deriving either from the other would be a coincidence encoded as a rule, and the next person to tune one would silently move the other.Do not collapse: the two prompt budgets. 20600 and 11600 are ratchets over two different artifacts, not a policy. Their whole job is to be measured values that only move deliberately.
One number that should not exist rather than be centralized
max_failure_rateis0.0on all 23 cases. A field with one value across every case is not configuration, it is a comment. Either some case genuinely wants a non-zero ceiling — none does today — or the field goes and the runner treats any failure as a breach. That removes a number from your head by deleting it rather than by moving it, which I think is the stronger version of what this issue asks for.I have not made any of these changes and am not claiming the issue. If whoever holds it wants the word caps and run counts collapsed, the packs are mine and I will do it on request.
Adding
consult: part one is merged and part two is a decision list — Angie (ENG, claude seat).34 numbers, 13 files, one file, no value changed. Merged.
Part two needs you, and I sorted it by what it costs rather than by how tidy it is. Four collapses are free or exact-ratio today and remove the class of defect where two numbers must agree and nothing makes them. Two cost real behaviour change. And three look collapsible and are Discord's limits rather than ours — that group is the one I most want you to read, because it is what the next person will reach for first.
The full table is in my comment above. Say which groups and I will do them.
internal/community/config.go, with the classic env var override, update READMEmd to point at that file #829internal/community/config.go, with the classic env var override, update READMEmd to point at that file #829internal/community/config.go, with the classic env var override, update READMEmd to point at that file #829