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
Member

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.go holds submitSummon, discordAck, batchRunner, settle, batchShelf, and clearArrivalMark. Every one of them ends at discordMessageTurn.React, Unreact, or Reply, which call *discordgo.Session methods 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/ingest and internal/coalesce are well covered, and just smoke drives 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 messageReader already exists for history reads in threadprefill.go. With it, these become ordinary tests:

  • An ask marks its comment on arrival, before the queue can hold it.
  • A shed ask has its mark retracted and replaced by the failure mark.
  • A batch clears the arrival mark from every folded comment and not from the one the turn answered.
  • Every ask in a batch gives back its drain hold exactly once, on the served path and on the shelved path.
  • A batch whose turn panics still settles its holds and tells the member.

The measurement that exists and has never been run

coalesced-ask-answers-every-comment in agents/deep/packs/rate.yaml carries observed: 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-deep gives 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:

  • Does the window ever close on more than one comment. sirens_echo.coalesce.batch.size flat 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.
  • Does a folded reply answer every comment. The rate case measures the model. This measures the whole path.
  • Do the marks read correctly to a member. Each comment takes an arrival mark, and the marks clear when the batch answers. A folded comment left marked is a promise nobody kept.
  • Does the reply fit. Several answers in one message pushes at the 1990 character budget far more often than one answer does, so the overflow-to-file path will be exercised in a way it has not been.
  • Do two members in one channel answer concurrently. Different shards by construction, never observed.
  • Does a batch in flight survive a restart. Each ask holds the drain open, and #986 shows the shutdown path is already noisy enough that a real drain has not been read cleanly.

Also unexercised

  • The shed path. SIRENS_ECHO_COALESCE_CAPACITY is 200 and the queue has never been near it. The retract-and-mark-failed branch has never fired anywhere.
  • The slash commands. All three lanes registered four commands each. Nobody has invoked one. /mcps answers above the jobs guard. What /echo, /job-status, and /job-cancel do against the job surface as deployed is not established.
  • Echo's parity. Echo is deliberately off the lane, so its summon path should be byte-identical to last week. Worth one confirmed turn rather than an assumption, since Current() now routes through currentContent() on every lane.

Suggested order

Before the August 19 stream, if anything:

  1. just rate-deep for the coverage number. No Discord, no risk.
  2. Two quick comments at Deep in a scoped channel, then read sirens_echo.coalesce.batch.size and sirens_echo.coalesce.asks.
  3. One /mcps invocation 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.turns reads zero for the whole period since the rollout, so there has been no traffic to judge it on either way.

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.go` holds `submitSummon`, `discordAck`, `batchRunner`, `settle`, `batchShelf`, and `clearArrivalMark`. Every one of them ends at `discordMessageTurn.React`, `Unreact`, or `Reply`, which call `*discordgo.Session` methods 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/ingest` and `internal/coalesce` are well covered, and `just smoke` drives 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 `messageReader` already exists for history reads in `threadprefill.go`. With it, these become ordinary tests: * An ask marks its comment on arrival, before the queue can hold it. * A shed ask has its mark retracted and replaced by the failure mark. * A batch clears the arrival mark from every folded comment and not from the one the turn answered. * Every ask in a batch gives back its drain hold exactly once, on the served path and on the shelved path. * A batch whose turn panics still settles its holds and tells the member. ## The measurement that exists and has never been run `coalesced-ask-answers-every-comment` in `agents/deep/packs/rate.yaml` carries `observed: 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-deep` gives 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: * **Does the window ever close on more than one comment.** `sirens_echo.coalesce.batch.size` flat 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. * **Does a folded reply answer every comment.** The rate case measures the model. This measures the whole path. * **Do the marks read correctly to a member.** Each comment takes an arrival mark, and the marks clear when the batch answers. A folded comment left marked is a promise nobody kept. * **Does the reply fit.** Several answers in one message pushes at the 1990 character budget far more often than one answer does, so the overflow-to-file path will be exercised in a way it has not been. * **Do two members in one channel answer concurrently.** Different shards by construction, never observed. * **Does a batch in flight survive a restart.** Each ask holds the drain open, and #986 shows the shutdown path is already noisy enough that a real drain has not been read cleanly. ## Also unexercised * **The shed path.** `SIRENS_ECHO_COALESCE_CAPACITY` is 200 and the queue has never been near it. The retract-and-mark-failed branch has never fired anywhere. * **The slash commands.** All three lanes registered four commands each. **Nobody has invoked one.** `/mcps` answers above the jobs guard. What `/echo`, `/job-status`, and `/job-cancel` do against the job surface as deployed is not established. * **Echo's parity.** Echo is deliberately off the lane, so its summon path should be byte-identical to last week. Worth one confirmed turn rather than an assumption, since `Current()` now routes through `currentContent()` on every lane. ## Suggested order Before the August 19 stream, if anything: 1. `just rate-deep` for the coverage number. No Discord, no risk. 2. Two quick comments at Deep in a scoped channel, then read `sirens_echo.coalesce.batch.size` and `sirens_echo.coalesce.asks`. 3. One `/mcps` invocation 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.turns` reads zero for the whole period since the rollout, so there has been no traffic to judge it on either way.
Author
Member

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.go reaches Discord through discordMessageTurn.React, Unreact, and Reply, and there is no substitution point, so the five tests this issue names are unreachable as written.

The messageReader precedent does not transfer directly, and that is the wrinkle. messageReader is an interface over a session method, so *discordgo.Session satisfies 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() reads turn.message.ID, foldTurn builds a *discordMessageTurn from the summons, and Run hands that same concrete turn to runAdmitted. So "an interface over the three calls" has to decide where the substitution point lives, and the obvious placements each cost something:

  • Make discordSummon.turn an interface, and ID(), foldTurn, and runAdmitted all need the concrete type back.
  • Put the seam on the Agent, and the tests exercise a fake marker rather than the real marks, which is a weaker test than the issue is asking for.
  • Give the turn itself a swappable session-shaped dependency, which is closest to messageReader and 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-comment still reads NOT YET MEASURED in agents/deep/packs/rate.yaml, with runs: 10 and max_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, and SIRENS_ECHO_MCP_ROSTER are 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 in SIRENS_ECHO_SUBSTRATE first.

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.

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.go` reaches Discord through `discordMessageTurn.React`, `Unreact`, and `Reply`, and there is no substitution point, so the five tests this issue names are unreachable as written. **The `messageReader` precedent does not transfer directly, and that is the wrinkle.** `messageReader` is an interface over a *session method*, so `*discordgo.Session` satisfies 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()` reads `turn.message.ID`, `foldTurn` builds a `*discordMessageTurn` from the summons, and `Run` hands that same concrete turn to `runAdmitted`. So "an interface over the three calls" has to decide **where the substitution point lives**, and the obvious placements each cost something: * Make `discordSummon.turn` an interface, and `ID()`, `foldTurn`, and `runAdmitted` all need the concrete type back. * Put the seam on the `Agent`, and the tests exercise a fake marker rather than the real marks, which is a weaker test than the issue is asking for. * Give the turn itself a swappable session-shaped dependency, which is closest to `messageReader` and 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-comment` still reads `NOT YET MEASURED` in `agents/deep/packs/rate.yaml`, with `runs: 10` and `max_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`, and `SIRENS_ECHO_MCP_ROSTER` are 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 in `SIRENS_ECHO_SUBSTRATE` first. ## 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.
Author
Member

Correcting my earlier comment on this issue. I said the messageReader precedent 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.react takes a reactor, notifyFailure takes a turnIO, and React and Unreact each call exactly one session method. So the precedent does transfer: what was missing is a two-method messageMarker over MessageReactionAdd and MessageReactionRemove, plus two signatures that named the concrete turn where an interface would do. A nil marker takes the session, the same shape ProxyClient.Now already 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.Once with a bare call reports holds returned = 6, want exactly 3, which is your fourth bullet and the shutdown-hangs-forever failure.

Three things stay here.

  • The reply path. Reply goes through send, 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.
  • The rate measurement. coalesced-ask-answers-every-comment still reads NOT YET MEASURED. It needs AGENT_PROXY_URL, AGENT_PROXY_MODEL, and SIRENS_ECHO_MCP_ROSTER, all unset in this session.
  • The six live observations, which no unit test reaches.

So the structural gap is closed and the two that need a proxy or a guild are untouched.

**Correcting my earlier comment on this issue.** I said the `messageReader` precedent 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.react` takes a `reactor`, `notifyFailure` takes a `turnIO`, and `React` and `Unreact` each call **exactly one** session method. So the precedent does transfer: what was missing is a two-method `messageMarker` over `MessageReactionAdd` and `MessageReactionRemove`, plus two signatures that named the concrete turn where an interface would do. A nil marker takes the session, the same shape `ProxyClient.Now` already 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.Once` with a bare call reports `holds returned = 6, want exactly 3`, which is your fourth bullet and the shutdown-hangs-forever failure. Three things stay here. * **The reply path.** `Reply` goes through `send`, 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. * **The rate measurement.** `coalesced-ask-answers-every-comment` still reads `NOT YET MEASURED`. It needs `AGENT_PROXY_URL`, `AGENT_PROXY_MODEL`, and `SIRENS_ECHO_MCP_ROSTER`, all unset in this session. * **The six live observations**, which no unit test reaches. So the structural gap is closed and the two that need a proxy or a guild are untouched.
Author
Member

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:

  • The reply-path seam and the panic test. Reply goes through send, 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.
  • The rate measurement. coalesced-ask-answers-every-comment still reads NOT YET MEASURED. It needs AGENT_PROXY_URL, AGENT_PROXY_MODEL, and SIRENS_ECHO_MCP_ROSTER.
  • The six live observations, which no unit test reaches.

Done, via #1122: the marks seam and five tests over a path that had no coverage at all.

**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: * **The reply-path seam and the panic test.** `Reply` goes through `send`, 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. * **The rate measurement.** `coalesced-ask-answers-every-comment` still reads `NOT YET MEASURED`. It needs `AGENT_PROXY_URL`, `AGENT_PROXY_MODEL`, and `SIRENS_ECHO_MCP_ROSTER`. * **The six live observations**, which no unit test reaches. Done, via #1122: the marks seam and five tests over a path that had no coverage at all.
Author
Member

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.

recoverTurn takes a turnIO since #1122, and deliverWithOverflow falls back to turn.Reply for a transport carrying no overflow, so a plain turnIO reaches the crash notice end to end. The test defers settle and recoverTurn in the order Run defers 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 notifyFailure reports member was told "". Dropping settle reports holds 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:

  • The ordinary reply seam. Reply goes through send, 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.
  • The rate measurement. coalesced-ask-answers-every-comment still reads NOT YET MEASURED and needs a configured proxy.
  • The six live observations, which need a guild.
**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. `recoverTurn` takes a `turnIO` since #1122, and `deliverWithOverflow` falls back to `turn.Reply` for a transport carrying no overflow, so **a plain `turnIO` reaches the crash notice end to end**. The test defers `settle` and `recoverTurn` in the order `Run` defers 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 `notifyFailure` reports `member was told ""`. Dropping `settle` reports `holds 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: * **The ordinary reply seam.** `Reply` goes through `send`, 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. * **The rate measurement.** `coalesced-ask-answers-every-comment` still reads `NOT YET MEASURED` and needs a configured proxy. * **The six live observations**, which need a guild.
Author
Member

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:13 and this closed at 00:30:14, against its body's own sentence:

This does not close #988, which still owes the ordinary reply seam, the never-run rate measurement, and the six live observations.

That scope is real and unbuilt, so this is open again.

Fact one: the closing-reference rule does not bind this merge path

AGENTS.md says a pull request body must carry a closing reference "or the merge verb will not merge it". #1124 carried no closes, fixes, or resolves line at all, and it merged anyway.

So the rule describes ward agent director merge rather 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

  • #1123 - closes #1122 and Refs #988 - #988 stayed open
  • #1124 - Refs #988 alone - #988 closed

Same 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 Refs trailer 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.

## Reopened. Two hard facts from that merge, and no third theory from me. **Darren (director seat), 2026-08-23 00:31.** https://forgejo.coilysiren.me/coilyco-gaming/sirens-echo/pulls/1124 merged at `00:30:13` and this closed at `00:30:14`, against its body's own sentence: > **This does not close #988**, which still owes the ordinary reply seam, the never-run rate measurement, and the six live observations. That scope is real and unbuilt, so this is open again. ### Fact one: the closing-reference rule does not bind this merge path `AGENTS.md` says a pull request body must carry a closing reference "or the merge verb will not merge it". https://forgejo.coilysiren.me/coilyco-gaming/sirens-echo/pulls/1124 carried **no** `closes`, `fixes`, or `resolves` line at all, and it merged anyway. So the rule describes `ward agent director merge` rather 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 * https://forgejo.coilysiren.me/coilyco-gaming/sirens-echo/pulls/1123 - `closes #1122` and `Refs #988` - **#988 stayed open** * https://forgejo.coilysiren.me/coilyco-gaming/sirens-echo/pulls/1124 - `Refs #988` alone - **#988 closed** Same issue, same trailer keyword, opposite outcomes. **I am not offering a third mechanism.** I proposed one earlier tonight, predicted #988 would close on https://forgejo.coilysiren.me/coilyco-gaming/sirens-echo/pulls/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 `Refs` trailer has been closed against its pull request's explicit written intent three times tonight**, on this issue, on https://forgejo.coilysiren.me/coilyco-gaming/sirens-echo/issues/1083, and twice on https://forgejo.coilysiren.me/coilyco-gaming/sirens-echo/issues/940. Every one needed a manual reopen. The one pull request that named its parent in prose instead, https://forgejo.coilysiren.me/coilyco-gaming/sirens-echo/pulls/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.
Author
Member

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 adapter seam - done. #1122 for the marks, #1124 for the panic path. All five tests this issue names now exist, plus one on the swallowed marking failure.
  • The rate measurement - #1133. Needs a host that can reach Agent Proxy.
  • The six live observations - stay here. They need a guild and no unit test reaches them.

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.

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 adapter seam** - done. #1122 for the marks, #1124 for the panic path. All five tests this issue names now exist, plus one on the swallowed marking failure. * **The rate measurement** - #1133. Needs a host that can reach Agent Proxy. * **The six live observations** - stay here. They need a guild and no unit test reaches them. 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.
Author
Member

Closing this. All three items are either done or filed with a named successor, and nothing is left here to carry.

  • The adapter seam - done. #1122 gave the mark path a substitution point and five of the tests this issue names; #1124 added the sixth, the panicking batch. Each was checked against the behaviour it guards, not only against current code.
  • The measured rate - #1133. coalesced-ask-answers-every-comment still reads NOT YET MEASURED. It needs a host that can reach Agent Proxy, which a code session does not have.
  • The six live observations - #1134. They need a guild.

What I want on the record rather than implied by a green close

The ordinary reply path is still untested. Reply goes through send, 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 messageReader precedent 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, because recoverTurn takes a turnIO and deliverWithOverflow falls back to turn.Reply. Both corrections are above.

Reopen if the reply path's absence turns out to matter before someone gets to it.

**Closing this. All three items are either done or filed with a named successor, and nothing is left here to carry.** * **The adapter seam** - **done.** #1122 gave the mark path a substitution point and five of the tests this issue names; #1124 added the sixth, the panicking batch. Each was checked against the behaviour it guards, not only against current code. * **The measured rate** - **#1133.** `coalesced-ask-answers-every-comment` still reads `NOT YET MEASURED`. It needs a host that can reach Agent Proxy, which a code session does not have. * **The six live observations** - **#1134.** They need a guild. ## What I want on the record rather than implied by a green close **The ordinary reply path is still untested.** `Reply` goes through `send`, 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 `messageReader` precedent 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, because `recoverTurn` takes a `turnIO` and `deliverWithOverflow` falls back to `turn.Reply`. Both corrections are above. Reopen if the reply path's absence turns out to matter before someone gets to it.
Sign in to join this conversation.
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

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