Watch
3
feat(threads): prefill the whole thread when a turn is inside one #832
Closed
coilyco-ops
wants to merge 1 commit from
aos/claude/wy58-thread-prefill into main
pull from: aos/claude/wy58-thread-prefill
merge into: coilyco-gaming:main
coilyco-gaming:main
coilyco-gaming:aos/claude/sj87-entity-attribute
coilyco-gaming:aos/claude/sj87-challenge
coilyco-gaming:aos/claude/turn-duration-buckets
coilyco-gaming:aos/claude/turn-stages-over-cap
coilyco-gaming:aos/claude/turn-stages-hold-doc
coilyco-gaming:aos/claude/turn-iteration-cap
coilyco-gaming:book-leads-the-glyphs
coilyco-gaming:science-and-web-culture-packs
coilyco-gaming:record-lane-role-voice-pairings
coilyco-gaming:catalogue-stage-phrase
coilyco-gaming:progress-rows-one-knob
coilyco-gaming:skill-read-worklog-detail
coilyco-gaming:librarian-lookup-first
coilyco-gaming:librarian-person-package
coilyco-gaming:feat/dowel-no-boundaries
coilyco-gaming:aos/claude/gh1035-no-blank-posts
coilyco-gaming:aos/claude/gh1036-harness-thread-name
coilyco-gaming:fix/thread-names
coilyco-gaming:feat/trajectory-completes
coilyco-gaming:fix/prompt-budgets
coilyco-gaming:aos/claude/docs-cut-2
coilyco-gaming:aos/claude/ka54-thread-ownership
coilyco-gaming:aos/claude/admission-bound
coilyco-gaming:aos/claude/gh1025-roster-reexport
coilyco-gaming:aos/claude/docs-strip-archaeology
coilyco-gaming:feat/temporal-mcp
coilyco-gaming:aos/claude/dowel-board-moxn-write-boundaries
coilyco-gaming:aos/claude/ue65-moxn-write-framing
coilyco-gaming:aos/claude/progress-backoff
coilyco-gaming:aos/claude/bound-scratch-search-2
coilyco-gaming:aos/claude/unblock-main
coilyco-gaming:aos/claude/tool-breaker
coilyco-gaming:fix/roster-core-eager
coilyco-gaming:aos/claude/finish-dowel-rename
coilyco-gaming:fix/971-skill-contract
coilyco-gaming:aos/claude/model-answered-not-unavailable
coilyco-gaming:aos/claude/mcp-singular-command
coilyco-gaming:task/moxn-and-temporal-skills
coilyco-gaming:aos/claude/ue65-temporal-brand
coilyco-gaming:task/dowel-site-work-tier
coilyco-gaming:aos/claude/ue65-roster-drift
coilyco-gaming:fix/dropped-turn-always-speaks
coilyco-gaming:aos/claude/folded-ask-coverage
coilyco-gaming:aos/claude/dowel-board
coilyco-gaming:aos/claude/dowel-pronouns
coilyco-gaming:feat/trajectory-keyed-on-the-message
coilyco-gaming:aos/claude/coalesce-discord-lane
coilyco-gaming:task/derive-shipped-profiles
coilyco-gaming:fix/ship-the-dowel-skill-root
coilyco-gaming:aos/claude/eval-context
coilyco-gaming:fix/bundle-references-reachable
coilyco-gaming:aos/claude/eval-docs-one-page
coilyco-gaming:aos/claude/dowel-engineer-suite
coilyco-gaming:fix/catalogue-clone-cache
coilyco-gaming:feat/engineer-role-graph
coilyco-gaming:task/free-the-config-numbers
coilyco-gaming:aos/claude/dowel-site-work
coilyco-gaming:aos/claude/dowel-prose
coilyco-gaming:aos/claude/mx76-derive-knobs
coilyco-gaming:issue-859-on-demand-skill-reads
coilyco-gaming:issue-651-ship-well-formed-replies
coilyco-gaming:issue-852-filing-validity
coilyco-gaming:issue-916-calculator-tool
coilyco-gaming:issue-854-feature-flag-table
coilyco-gaming:issue-866-role-mention-summons
coilyco-gaming:issue-858-grounding-bound-per-server
coilyco-gaming:issue-899-progress-keeps-updating
coilyco-gaming:issue-900-rollup-mirrors-worklog
coilyco-gaming:issue-901-raise-progress-cadence
coilyco-gaming:issue-904-thread-title-length
coilyco-gaming:issue-905-http-reachability
coilyco-gaming:issue-855-turn-clock
coilyco-gaming:issue-895-silent-turn
coilyco-gaming:issue-873-mcp-tool-span-error
coilyco-gaming:issue-878-settle-dropped-jobs
coilyco-gaming:aos/claude/aw85-se-bands
coilyco-gaming:aos/claude/hs68-model-rejected
coilyco-gaming:aos/claude/hs68-effect-telemetry
coilyco-gaming:aos/claude/hs68-temporal-mirror
coilyco-gaming:aos/claude/hs68-prompt-commands
coilyco-gaming:aos/claude/hs68-model-idle-timeout
coilyco-gaming:aos/claude/hs68-prompt-command-intent
coilyco-gaming:aos/claude/hs68-consult-label-name
coilyco-gaming:aos/claude/hs68-grant-denial-403
coilyco-gaming:aos/claude/hs68-queued-jobs-dropped
coilyco-gaming:aos/claude/hs68-knob-guard
coilyco-gaming:aos/claude/bk79-agent-folders
coilyco-gaming:aos/claude/bk79-own-instructions
coilyco-gaming:aos/claude/ym96-docs-band
coilyco-gaming:aos/claude/bk79-server-instructions
coilyco-gaming:aos/claude/aw85-mcp-beaver-doc
coilyco-gaming:aos/claude/bk79-session-workspace
coilyco-gaming:aos/claude/yt58-org-relationship
coilyco-gaming:aos/claude/bk79-numeric-config
coilyco-gaming:aos/claude/xu59-just-boundaries
coilyco-gaming:aos/claude/xu59-eval-board
coilyco-gaming:aos/claude/bk79-phrase-telemetry
coilyco-gaming:aos/claude/bk79-object-emoji
coilyco-gaming:aos/claude/xh55-otlp-logs
coilyco-gaming:aos/claude/aw85-thread-prefill
coilyco-gaming:aos/claude/wy58-thread-prefill-always
coilyco-gaming:aos/claude/xh55-move-to-repo
coilyco-gaming:aos/claude/wy58-thread-title-length
coilyco-gaming:aos/claude/xh55-filing-trigger
coilyco-gaming:aos/claude/yt58-worklog-embed
coilyco-gaming:aos/claude/aw85-relative-brevity
coilyco-gaming:aos/claude/xh55-reasoning-roundtrip
coilyco-gaming:aos/claude/yt58-clock-rotation
coilyco-gaming:aos/claude/yt58-unbreak-main
coilyco-gaming:aos/claude/bk79-test-build-break
coilyco-gaming:aos/claude/yt58-partial-refusal
coilyco-gaming:aos/claude/aw85-turn-failure-classify
coilyco-gaming:aos/claude/aw85-outbound-spill
coilyco-gaming:aos/claude/xh55-budget-spent-cause
coilyco-gaming:aos/claude/wy58-bundles-not-content
coilyco-gaming:aos/claude/wy58-refusal-reason
coilyco-gaming:aos/claude/yt58-role-snapshot-gate
coilyco-gaming:aos/claude/xh55-docker-probe
coilyco-gaming:aos/claude/bk79-grounding-tools
coilyco-gaming:aos/claude/az59-gate-span
coilyco-gaming:aos/claude/az59-pg-jobstore
coilyco-gaming:eng/roster-request-headers
coilyco-gaming:eng/roster-headers
coilyco-gaming:eng/list-the-mcps
coilyco-gaming:aos/claude/mg96-fm
coilyco-gaming:eng/name-echos-seat
coilyco-gaming:eng/unpin-the-card-wording
coilyco-gaming:olaf/remove-irl-physical
coilyco-gaming:aos/claude/mg96
coilyco-gaming:eng/echo-composes-ops
coilyco-gaming:quail/two-rows-not-four
coilyco-gaming:fix/two-failures-two-verdicts
coilyco-gaming:feat/an-emitted-message-is-not-emitted-twice
coilyco-gaming:quail/partial-coverage-outcome
coilyco-gaming:feat/ten-minutes-or-ten-messages
coilyco-gaming:feat/a-waiting-turn-says-how-long
coilyco-gaming:feat/a-job-may-emit-content
coilyco-gaming:quail/round-fanout-unbounded
coilyco-gaming:quail/adversarial-reply-ceiling
coilyco-gaming:docs/list-the-open-pull-requests
coilyco-gaming:quail/principal-id-stays-out-of-the-prompt
coilyco-gaming:fix/every-label-in-a-wildcard-prefix-is-a-label
coilyco-gaming:docs/the-battery-assumes-two-checks-it-does-not-run
coilyco-gaming:fix/a-rest-failure-keeps-its-status
coilyco-gaming:quail/retag-label-rows
coilyco-gaming:quail/adjacency-guard-row
coilyco-gaming:test/pin-names-the-issue-that-owns-it
coilyco-gaming:test/pin-points-at-a-live-issue
coilyco-gaming:quail/job-outcome-discarded
coilyco-gaming:fix/repair-exhaustion-is-not-an-outage
coilyco-gaming:quail/reasoning-omitempty-pin
coilyco-gaming:docs/label-id-silently-drops
coilyco-gaming:quail/gating-pack-markup-gap
coilyco-gaming:fix/instance-name-reads-identity
coilyco-gaming:docs/indistinguishable-542-resolution
coilyco-gaming:fix/instance-name-not-a-live-service
coilyco-gaming:quail/unwired-capability-guard
coilyco-gaming:fix/repair-path-reasoning-content
coilyco-gaming:quail/indistinguishable-values-recurrence
coilyco-gaming:quail/identity-short-form-rows
coilyco-gaming:quail/repair-path-reasoning-content
coilyco-gaming:docs/verify-a-write-landed-claude
coilyco-gaming:quail/host-label-shape-corpus
coilyco-gaming:docs/a-deploy-owned-file-has-two-shapes-claude
coilyco-gaming:fix/a-roster-path-must-name-servers-claude
coilyco-gaming:fix/every-label-before-the-suffix-claude
coilyco-gaming:fix/a-first-label-must-exist-claude
coilyco-gaming:feat/tune-the-timeouts-from-deployment-claude
coilyco-gaming:qa/protocol-limits-are-not-dials
coilyco-gaming:feat/a-wildcard-is-not-a-suffix-claude
coilyco-gaming:feat/retry-what-fails-fast-claude
coilyco-gaming:fix/name-the-deliberate-hold-claude
coilyco-gaming:test/the-access-check-exit-codes-claude
coilyco-gaming:build/ship-the-access-check-claude
coilyco-gaming:qa/callers-not-reachability
coilyco-gaming:qa/pin-the-unwired-thread-binding
coilyco-gaming:feat/an-offline-access-policy-gate-claude
coilyco-gaming:test/the-notice-detaches-twice-claude
coilyco-gaming:docs/say-what-the-job-thread-does-claude
coilyco-gaming:fix/a-notice-does-not-thread-claude
coilyco-gaming:fix/one-invocation-is-a-phrase-claude
coilyco-gaming:fix/a-moment-ago-is-this-turn
coilyco-gaming:fix/main-is-red-on-the-adverb-row
coilyco-gaming:fix/an-adverb-does-not-break-the-auxiliary
coilyco-gaming:qa/score-the-575-fix
coilyco-gaming:feat/a-reply-names-its-subject
coilyco-gaming:eng/a-turn-is-not-the-past
coilyco-gaming:fix/since-you-asked-is-this-turn
coilyco-gaming:docs/a-default-that-reads-as-an-answer
coilyco-gaming:fix/a-nameless-tool-is-not-the-server
coilyco-gaming:qa/pin-the-outage-state
coilyco-gaming:fix/a-session-lifetime-is-not-a-latency
coilyco-gaming:fix/an-undated-passive-is-still-a-claim
coilyco-gaming:fix/main-is-red-on-the-corpus
coilyco-gaming:fix/an-undated-passive-is-a-claim
coilyco-gaming:eng/a-session-is-not-a-request
coilyco-gaming:fix/a-self-claim-in-the-simple-past
coilyco-gaming:qa/extend-grounding-corpus
coilyco-gaming:fix/a-tool-never-offered-is-not-a-tool-declined
coilyco-gaming:eng/one-doc-for-the-tracker-surface
coilyco-gaming:eng/say-what-is-switched-on
coilyco-gaming:fix/evaluation-is-not-the-production-service
coilyco-gaming:qa/pin-the-listing-attribute
coilyco-gaming:eng/split-five-docs-off-the-cap
coilyco-gaming:eng/concurrent-means-goroutines
coilyco-gaming:eng/split-the-tracker-surface
coilyco-gaming:test/the-first-label-of-a-hostname
coilyco-gaming:fix/a-cache-hit-is-not-a-round-trip
coilyco-gaming:qa/pin-the-budget-ladder
coilyco-gaming:fix/the-first-label-of-a-hostname
coilyco-gaming:eng/the-scratchpad-assumes-one-replica
coilyco-gaming:fix/a-person-is-named-in-prose
coilyco-gaming:docs/jobs-are-single-process
coilyco-gaming:qa/enumerate-the-mention-positions
coilyco-gaming:eng/split-the-response-inventory
coilyco-gaming:fix/green-main-doc-cap-and-stale-characterizations
coilyco-gaming:eng/main-is-green-again
coilyco-gaming:eng/split-the-mention-scope
coilyco-gaming:fix/mentions-doc-over-cap
coilyco-gaming:qa/unredden-the-code-span-pin
coilyco-gaming:qa/pin-the-code-span-collision
coilyco-gaming:eng/code-spans-are-not-prose
coilyco-gaming:feat/a-thread-title-says-what-it-is-for
coilyco-gaming:fix/discord-markup-is-not-prose-either
coilyco-gaming:eng/mark-the-turn-once
coilyco-gaming:fix/a-name-in-a-url-is-not-a-person
coilyco-gaming:qa/pin-every-reaction-is-emitted
coilyco-gaming:eng/mentions-skip-link-spans
coilyco-gaming:fix/one-step-owns-every-service-suffix
coilyco-gaming:qa/pin-the-mention-url-collision
coilyco-gaming:docs/the-roster-is-member-influenced
coilyco-gaming:docs/what-a-mention-can-reach
coilyco-gaming:qa/pin-the-documented-glyphs
coilyco-gaming:feat/naming-someone-reaches-them
coilyco-gaming:qa/pin-the-sandbox-label-wiring
coilyco-gaming:qa/pin-the-truncated-receipt
coilyco-gaming:feat/the-harness-labels-what-it-files
coilyco-gaming:qa/compare-a-case-by-marshalling
coilyco-gaming:fix/one-spelling-for-the-status-vocabulary
coilyco-gaming:qa/declare-pack-divergence
coilyco-gaming:fix/the-reactions-match-the-approved-vocabulary
coilyco-gaming:fix/a-file-path-is-just-a-file-path
coilyco-gaming:qa/pin-the-mapped-tailnet-form
coilyco-gaming:fix/a-truncated-page-says-so
coilyco-gaming:fix/the-extraction-case-detects-a-dump
coilyco-gaming:docs/the-consult-label-tracks-the-thread
coilyco-gaming:feat/the-eval-can-forge-a-turn
coilyco-gaming:fix/refuse-the-tailnet-range
coilyco-gaming:qa/pin-the-fail-heading-count
coilyco-gaming:feat/a-bounded-fetch-tool
coilyco-gaming:fix/preserve-the-longform-probe-pack
coilyco-gaming:qa/pin-the-lane-gate
coilyco-gaming:qa/preserve-the-longform-pack
coilyco-gaming:fix/the-prompt-is-not-a-secret
coilyco-gaming:fix/a-reference-never-loses-to-the-footer
coilyco-gaming:qa/preserve-the-probe-packs
coilyco-gaming:feat/a-trusted-caller-on-the-tailnet
coilyco-gaming:fix/capability-tells-the-truth-about-the-scratchpad
coilyco-gaming:qa/echo-battery-negative-control
coilyco-gaming:fix/one-fail-block-not-two
coilyco-gaming:feat/tool-call-footer
coilyco-gaming:fix/guard-the-extraction-case
coilyco-gaming:feat/canonical-phrases-by-key
coilyco-gaming:fix/the-progress-line-is-a-reply-too
coilyco-gaming:qa/pin-the-agent-recognition-case
coilyco-gaming:qa/pin-the-tool-name-markup-guards
coilyco-gaming:feat/five-second-buffer
coilyco-gaming:fix/a-failing-case-shows-the-reply
coilyco-gaming:fix/extraction-case-stops-penalising-compliance
coilyco-gaming:fix/a-security-case-that-penalises-compliance
coilyco-gaming:feat/deny-actually-denies
coilyco-gaming:feat/job-refusals-reach-telemetry
coilyco-gaming:fix/land-the-harness-refresh-on-main
coilyco-gaming:feat/a-long-reply-gets-a-thread
coilyco-gaming:feat/the-thinking-line-shows-it-is-working
coilyco-gaming:feat/roster-hour-ttl-and-refresh
coilyco-gaming:refactor/every-number-in-one-file
coilyco-gaming:feat/agent-can-refresh-its-roster
coilyco-gaming:fix/size-refusal-is-not-a-parse-error
coilyco-gaming:fix/budget-base-above-the-reasoning-floor
coilyco-gaming:fix/one-number-for-the-progress-cadence
coilyco-gaming:fix/gate-sees-a-new-file
coilyco-gaming:fix/one-meaning-for-channel-id
coilyco-gaming:fix/look-up-verbs-cannot-match
coilyco-gaming:feat/recognise-a-trace-lookup-request
coilyco-gaming:feat/discord-identifiers-on-the-turn-span
coilyco-gaming:fix/budget-failure-names-the-reasoning-spend
coilyco-gaming:feat/notice-carries-the-trace-id
coilyco-gaming:qa/cut-run-stops-calling
coilyco-gaming:docs/merge-lane-closing-reference
coilyco-gaming:eng/gate-knows-the-lane
coilyco-gaming:eng/feature-inventory-catchup
coilyco-gaming:fix/rate-dataset-survives-a-cut-run
coilyco-gaming:test/consolidate-pack-coverage
coilyco-gaming:pr-lane-318
coilyco-gaming:fix/flip-unknown-field-rows
coilyco-gaming:test/turn-unknown-fields
coilyco-gaming:fix/rate-doc-over-cap
coilyco-gaming:test/language-scope-characterization
coilyco-gaming:fix/pronoun-case-cannot-fire
coilyco-gaming:fix/main-red-again
coilyco-gaming:fix/main-is-red-doc-cap
coilyco-gaming:fix/gate-negated-accuracy-claim
coilyco-gaming:fix/stale-skip-allowlist-note
coilyco-gaming:test/definition-must-reject
coilyco-gaming:test/gate-covers-every-pack
coilyco-gaming:test/bucket-table-bound
coilyco-gaming:test/compose-deny-offline
coilyco-gaming:fix/symlink-test-skips-itself
coilyco-gaming:test/build-revision
coilyco-gaming:fix/eviction-corpus-green
coilyco-gaming:test/eviction-corpus
coilyco-gaming:test/duration-config
coilyco-gaming:test/rune-boundary
coilyco-gaming:test/send-bounds
coilyco-gaming:test/reserved-path-spellings
coilyco-gaming:test/data-borne-injection
coilyco-gaming:test/scratch-partition-collision
coilyco-gaming:test/capability-docs-all
coilyco-gaming:test/injection-cases
coilyco-gaming:docs/http-contract-retry-after
coilyco-gaming:test/capability-reach
coilyco-gaming:test/rate-cases-from-192
coilyco-gaming:test/score-order
coilyco-gaming:test/capability-doc-matches-code
coilyco-gaming:test/grounding-action-claim-corpus
coilyco-gaming:test/http-turn-contract
coilyco-gaming:feat/require-rate-limit-on-open-guilds
coilyco-gaming:fix/pr-image-build
coilyco-gaming:fix/compose-stage-inputs
coilyco-gaming:feat/sirens-deep-compose-wiring
coilyco-gaming:fix/deep-forgejo-mcp
coilyco-gaming:refactor/evaluation-pack-yaml
coilyco-gaming:coilysiren-patch-1
coilyco-gaming:feat/deep-steam-mcp
coilyco-gaming:feat/drop-issue-envelope
coilyco-gaming:fix/dm-needs-no-mention
coilyco-gaming:fix/pronoun-defaults
coilyco-gaming:chore/aos-precommit-v0.18-lint-backlog
coilyco-gaming:fix/harness-attribution-and-forgejo-detail
coilyco-gaming:fix/tool-inflated-completion-budget
coilyco-gaming:feat/sirens-deep-compose
coilyco-gaming:feat/banner-hires
coilyco-gaming:feat/banner
coilyco-gaming:feat/sirens-deep-mark
coilyco-gaming:feat/sirens-deep-transparent
coilyco-gaming:feat/prompt-snapshots
coilyco-gaming:fix/policy-check-image-context
coilyco-gaming:sirens-deep-admission-hardening
coilyco-gaming:docs/drop-private-image-claim
coilyco-gaming:feat/thread-scoped-replies
coilyco-gaming:issue-67
coilyco-gaming:feat/sirens-community-harness
No reviewers
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!832
Loading…
Reference in a new issue
No description provided.
Delete branch "aos/claude/wy58-thread-prefill"
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 #769, built to your comment rather than to the design pass.
The toggle is gone
So there is none. Whole-thread prefill applies wherever the turn is inside a thread. That also retires two of the spec's acceptance criteria, the toggle-off byte-identity check and the default-off-at-boot check, since neither has anything left to describe.
Worth knowing, because it follows from removing the toggle rather than from anything you asked for: the staged rollout is gone with it. The spec's plan was ship-off, measure a long thread, then enable per channel. This is on everywhere the moment it merges, so the entire context risk now rests on the two bounds below rather than on your being able to watch one channel first. Flagging it rather than quietly absorbing it - if you want a measure-first step back, the cheapest version is landing this with
threadPrefillRunesset low and raising it once you have seen real numbers.What it does
Outside a thread: unchanged. Same call, same
MaxContextMessages, same order. That path is a pure extraction intowindowHistory, sharing thetranscribestep with the thread path so the two cannot drift.Inside a thread: pages back to the start of the thread.
MaxContextMessagesis a window into a channel that never ends; a thread does end, and it is the whole exchange the member is asking inside.Two bounds, because they fail differently
threadPrefillRunes(32000) bounds what reaches the model. Six tool rounds at the defaultToolResultBytesalready admit more than this, so it sits in family with what a turn carries today rather than being a number I invented from nothing.threadPrefillPages(10) bounds the Discord round trips, so one enormous thread cannot spend the rate limit every other channel shares. A short page means the thread's start was reached, which is the ordinary exit.A page that errors fails the prefill rather than returning what it had. Half a thread presented as a whole one is the failure this feature is against.
Oldest first, and said out loud
Over the bound, oldest go first - the newest exchange is the one the member is in. The reply carries
[thread context truncated, N older messages dropped]whenever anything was dropped.The notice reserves its room before the answer is fitted, the same way the tool-disclosure footer does. A notice that vanishes under load reads as context that was never missing.
Mutation
TestADroppedPrefillIsAlwaysAnnotatedfails on every count.Coverage I do not have, stated rather than left to be found
The
inThreadbranch insideHistoryis not covered by a test, because both arms need a live*discordgo.Session.inThreaditself is tested directly against cached gateway state, and the pagination and budget logic are tested through seams (pageBacktakes a fetcher,boundPrefilltakes entries). The non-thread path had no direct test before this change either, and the diff shows itsChannelMessagescall andt.limituntouched.Verification
ward gategreen: build, policy-check, vet, test, test-skips, pre-commit. Ten new tests, each run individually.Reasoning:
docs/sirens-echo-thread-prefill.md.🤖 Generated with Claude Code
Closing this as duplicate work. My mistake, and worth recording rather than deleting quietly.
#827 landed the same feature at 17:13Z. I branched from
mainat 17:07Z and did not re-checkmainbefore pushing, so I built a second implementation of #769 in parallel with one already in flight. CI on this branch was green, but it conflicts withmainbecause both addinternal/community/threadprefill.goanddocs/sirens-echo-thread-prefill.md.#827's implementation is the better one and stays. Two things it has that mine did not: the
Cappedfloor, so a thread longer than the walk reportsat least Nrather than a count it cannot support, and the annotation as a real service-authored suffix contending in the send budget rather than a notice appended outside it.The actual remaining work on #769 was Kai's comment, not the build:
That is #833, which removes the toggle from what #827 landed.
How I would have caught this: re-fetching
origin/mainbefore opening the PR, not just before branching. A merged sibling PR closing the same issue is the signal, andgit log origin/main --grep '#769'would have shown it in one command.Correction to the comment above: the follow-on is #834, not #833. I wrote the number before opening it.
Pull request closed