Watch
3
Testing the coalescing lane owes: a seam for the Discord adapter, one measured rate, and six live observations #988
Closed
opened 2026-08-18 22:07:43 +00:00 by coilyco-ops
·
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
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#988
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?
The lane landed in #975, the coverage line in #983, and coilyco-bridge/deploy#682 turned it on for deep and dowel at 21:54Z on 2026-08-18. Every claim about it is currently a unit test or an argument. Nothing in it has answered a real member.
This issue is the testing debt, sorted by what it would take to pay.
The structural gap, which is the one worth fixing
The entire Discord half of the lane has no test coverage, and it cannot get any as written.
internal/community/coalescing.goholdssubmitSummon,discordAck,batchRunner,settle,batchShelf, andclearArrivalMark. Every one of them ends atdiscordMessageTurn.React,Unreact, orReply, which call*discordgo.Sessionmethods directly. There is no interface to substitute, so a test cannot reach any of that path without a network. The tests that exist cover the pure pieces around it: the folded content, the history anchor, the attachment union, the dedupe, the reply target, the hold, and the prompt suffix.internal/ingestandinternal/coalesceare well covered, andjust smokedrives them end to end with no backend. The adapter between them and Discord is the untested part, and it is the part that was written last and fastest.The fix is a narrow interface over the three calls, the way
messageReaderalready exists for history reads inthreadprefill.go. With it, these become ordinary tests:The measurement that exists and has never been run
coalesced-ask-answers-every-commentinagents/deep/packs/rate.yamlcarriesobserved: NOT YET MEASURED. Three sums in one ask,comments: 3, one required pattern per answer, so a dropped comment is a missing number.just rate-deepgives it a number. This is the cheapest real evidence available and it needs no Discord, because it goes through the production prompt and Agent Proxy. Until it runs, the coverage line in #983 is a plausible fix rather than a measured one, and the concern that motivated it (a smaller model answering the last comment and dropping the rest) is unresolved either way.What only a live guild can answer
None of these can be unit tested, and all of them are first-run behaviour:
sirens_echo.coalesce.batch.sizeflat at 1 means the 25 second window closes before a second comment arrives and the lane bought nothing. This is the first thing to read and the most likely disappointing result.Also unexercised
SIRENS_ECHO_COALESCE_CAPACITYis 200 and the queue has never been near it. The retract-and-mark-failed branch has never fired anywhere./mcpsanswers above the jobs guard. What/echo,/job-status, and/job-canceldo against the job surface as deployed is not established.Current()now routes throughcurrentContent()on every lane.Suggested order
Before the August 19 stream, if anything:
just rate-deepfor the coverage number. No Discord, no risk.sirens_echo.coalesce.batch.sizeandsirens_echo.coalesce.asks./mcpsinvocation per lane.After it, in ordinary work: the test seam, then the shed and restart paths behind it.
What this issue does not claim
I have not established that the lane is broken. I have established that nothing has proven it works, which is a different and smaller statement. The pods are healthy, registration succeeded on all three lanes, and
sirens_echo.turnsreads zero for the whole period since the rollout, so there has been no traffic to judge it on either way.Read the three items against the source. Two are blocked on things this session does not hold, and the first has a wrinkle worth recording before anyone starts it.
On the seam, which is the item worth fixing
Confirmed:
internal/community/coalescing.goreaches Discord throughdiscordMessageTurn.React,Unreact, andReply, and there is no substitution point, so the five tests this issue names are unreachable as written.The
messageReaderprecedent does not transfer directly, and that is the wrinkle.messageReaderis an interface over a session method, so*discordgo.Sessionsatisfies it and a fake slots in underneath. The coalescing calls are methods on the turn, and the turn is concrete everywhere it matters:discordSummon.ID()readsturn.message.ID,foldTurnbuilds a*discordMessageTurnfrom the summons, andRunhands that same concrete turn torunAdmitted. So "an interface over the three calls" has to decide where the substitution point lives, and the obvious placements each cost something:discordSummon.turnan interface, andID(),foldTurn, andrunAdmittedall need the concrete type back.Agent, and the tests exercise a fake marker rather than the real marks, which is a weaker test than the issue is asking for.messageReaderand the largest change.I am not starting that at the end of a long session. It is a refactor across concurrency-adjacent code where a half-done seam is worse than none, and this issue is the right place for it to wait rather than a worse version of it landing.
On the rate measurement
coalesced-ask-answers-every-commentstill readsNOT YET MEASUREDinagents/deep/packs/rate.yaml, withruns: 10andmax_failure_rate: 0.0. This issue is right that it needs no Discord.It does need a configured proxy.
AGENT_PROXY_URL,AGENT_PROXY_MODEL, andSIRENS_ECHO_MCP_ROSTERare all unset in this session, and AGENTS.md is explicit that a case run without a roster fails for a reason that is not the agent's. So I cannot produce that number here without inventing the conditions it was measured under, which would be worse than the missing row.Whoever has the proxy:
just rate-deep, and record host state inSIRENS_ECHO_SUBSTRATEfirst.On the live-guild items
Unchanged and correctly parked. Those are first-run behaviour and no unit test reaches them.
Leaving this open with all three items intact. Nothing here is done, and I would rather say that than close it on the reading.
Correcting my earlier comment on this issue. I said the
messageReaderprecedent does not transfer and that the substitution point is an open design choice. On a closer read that was wrong in the part that matters, and #1123 lands the seam.Most of the interfaces already exist.
a.reacttakes areactor,notifyFailuretakes aturnIO, andReactandUnreacteach call exactly one session method. So the precedent does transfer: what was missing is a two-methodmessageMarkeroverMessageReactionAddandMessageReactionRemove, plus two signatures that named the concrete turn where an interface would do. A nil marker takes the session, the same shapeProxyClient.Nowalready uses, and nothing production sets it.Five of the tests this issue names now exist, plus one holding that a marking failure is swallowed. Each was checked against the behaviour it guards: replacing the
sync.Oncewith a bare call reportsholds returned = 6, want exactly 3, which is your fourth bullet and the shutdown-hangs-forever failure.Three things stay here.
Replygoes throughsend, which does threading, mentions, and files. Its seam is a larger piece than this one and your fifth test, the batch whose turn panics, needs it.coalesced-ask-answers-every-commentstill readsNOT YET MEASURED. It needsAGENT_PROXY_URL,AGENT_PROXY_MODEL, andSIRENS_ECHO_MCP_ROSTER, all unset in this session.So the structural gap is closed and the two that need a proxy or a guild are untouched.
Reopened. This closed when #1123 merged, and it should not have: that pull request closes #1122, the structural slice, and only refs this one. Two of the three items here are genuinely undone and I would rather say so than let a merge mark them finished.
Still open:
Replygoes throughsend, which does threading, mentions, and files, so its seam is a larger piece than the marks one. Your fifth test, the batch whose turn panics and still settles its holds and tells the member, needs it.coalesced-ask-answers-every-commentstill readsNOT YET MEASURED. It needsAGENT_PROXY_URL,AGENT_PROXY_MODEL, andSIRENS_ECHO_MCP_ROSTER.Done, via #1122: the marks seam and five tests over a path that had no coverage at all.
Correcting myself again, in the useful direction. I said the panic test needed the reply-path seam first. It does not, and #1124 lands it.
recoverTurntakes aturnIOsince #1122, anddeliverWithOverflowfalls back toturn.Replyfor a transport carrying no overflow, so a plainturnIOreaches the crash notice end to end. The test deferssettleandrecoverTurnin the orderRundefers them, because that ordering is the behaviour: a panic must not strand a hold behind the notice.Both halves checked against the failure they guard. Dropping
notifyFailurereportsmember was told "". Droppingsettlereportsholds returned = 0, want 2, so a shutdown waits forever.So all five tests this issue names now exist, plus one on the swallowed marking failure.
What is genuinely left here, and none of it is unit-testable from this session:
Replygoes throughsend, which does threading, mentions, and files. No test in this issue needs it now, but the path stays uncovered and that is worth saying rather than letting five green tests imply otherwise.coalesced-ask-answers-every-commentstill readsNOT YET MEASUREDand needs a configured proxy.Reopened. Two hard facts from that merge, and no third theory from me.
Darren (director seat), 2026-08-23 00:31. #1124 merged at
00:30:13and this closed at00:30:14, against its body's own sentence:That scope is real and unbuilt, so this is open again.
Fact one: the closing-reference rule does not bind this merge path
AGENTS.mdsays a pull request body must carry a closing reference "or the merge verb will not merge it". #1124 carried nocloses,fixes, orresolvesline at all, and it merged anyway.So the rule describes
ward agent director mergerather than the path an agent merging its own pull request actually uses. That is worth knowing and worth writing down, because the rule currently reads as universal and an agent obeying it files a slice issue it does not need. I would not remove the rule, since the merge verb is a real lane, but the sentence should say which lane it binds.Fact two: the same trailer produced opposite results forty minutes apart
closes #1122andRefs #988- #988 stayed openRefs #988alone - #988 closedSame issue, same trailer keyword, opposite outcomes.
I am not offering a third mechanism. I proposed one earlier tonight, predicted #988 would close on #1123, was wrong, and retracted it. Five observations now exist and I have no account that fits all five. Someone who can read the Forgejo configuration should settle it, and until then the only defensible statement is the empirical one.
The empirical statement, which is all anyone needs to act on
A parent issue named in a
Refstrailer has been closed against its pull request's explicit written intent three times tonight, on this issue, on #1083, and twice on #940. Every one needed a manual reopen. The one pull request that named its parent in prose instead, #1121, closed nothing by accident.Name the parent in prose. That is the whole of the advice, and it does not depend on knowing why.
Pointer: the rate measurement is now filed as #1133, so it is schedulable rather than parked behind two other items.
Status of the three:
The ordinary reply seam also stays uncovered. No test in this issue needs it now, and saying so is better than letting five green tests imply the path is covered.
Closing this. All three items are either done or filed with a named successor, and nothing is left here to carry.
coalesced-ask-answers-every-commentstill readsNOT YET MEASURED. It needs a host that can reach Agent Proxy, which a code session does not have.What I want on the record rather than implied by a green close
The ordinary reply path is still untested.
Replygoes throughsend, which does threading, mentions, and files, so its seam is a larger piece than the marks one. No test this issue names needs it, which is why I did not build it, and five passing tests should not be read as the Discord half being covered. It is the mark and hold paths that are covered.I was wrong about this issue twice and corrected both. First I said the
messageReaderprecedent did not transfer and the seam was an open design choice; on a closer read most of the interfaces already existed and it was a two-method addition. Then I said the panic test needed the reply seam first; it did not, becauserecoverTurntakes aturnIOanddeliverWithOverflowfalls back toturn.Reply. Both corrections are above.Reopen if the reply path's absence turns out to matter before someone gets to it.