test(coalesce): a seam over the marks, so the Discord half is reachable #1123

Merged
coilyco-ops merged 1 commit from aos/claude/coalesce-seam-988 into main 2026-08-23 00:21:26 +00:00
Member

Milestone 17 phase 6, working #988's structural item. This does not close #988, so the slice is #1122 and closed here.

The seam is smaller than the comparison implies

I said on #988 that the messageReader precedent did not transfer, and on a closer read it mostly does. 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. What was missing is a substitution point for those two calls, plus two signatures naming the concrete turn where an interface would do.

messageMarker covers the two, and a nil marker takes the session, the same nil-defaulting shape ProxyClient.Now already uses for its clock. Nothing production sets it.

Six tests over a path that had none

Five are the ones #988 names. The sixth holds that a marking failure is swallowed, since a missing ADD_REACTIONS permission is an operator question rather than a turn failure.

Each was checked against the behaviour it guards, not only against the current code:

break what the test says
drop the retraction from the shed path removed = [], want the arrival mark retracted
clear every folded mark including the answered one removed = [older-1 older-2 newest], want the two folded comments cleared
replace the sync.Once with a bare call holds returned = 6, want exactly 3

That last one is the shutdown-hangs-forever failure, which is why the test settles twice.

Clean under -race, and just gate is green.

What stays on #988

The reply path. Reply goes through send, which does threading, mentions, and files, so its seam is a larger piece and the panic test #988 lists needs it. The never-run rate measurement needs a configured proxy, which this session does not hold, and the six live observations need a guild.

closes #1122
Refs #988

Milestone 17 phase 6, working #988's structural item. **This does not close #988**, so the slice is #1122 and closed here. ## The seam is smaller than the comparison implies I said on #988 that the `messageReader` precedent did not transfer, and on a closer read **it mostly does**. 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. What was missing is a substitution point for those two calls, plus two signatures naming the concrete turn where an interface would do. `messageMarker` covers the two, and a nil marker takes the session, the same nil-defaulting shape `ProxyClient.Now` already uses for its clock. **Nothing production sets it.** ## Six tests over a path that had none Five are the ones #988 names. The sixth holds that a marking failure is swallowed, since a missing `ADD_REACTIONS` permission is an operator question rather than a turn failure. **Each was checked against the behaviour it guards**, not only against the current code: | break | what the test says | | --- | --- | | drop the retraction from the shed path | `removed = [], want the arrival mark retracted` | | clear every folded mark including the answered one | `removed = [older-1 older-2 newest], want the two folded comments cleared` | | replace the `sync.Once` with a bare call | `holds returned = 6, want exactly 3` | That last one is the shutdown-hangs-forever failure, which is why the test settles twice. Clean under `-race`, and `just gate` is green. ## What stays on #988 **The reply path.** `Reply` goes through `send`, which does threading, mentions, and files, so its seam is a larger piece and the panic test #988 lists needs it. The never-run rate measurement needs a configured proxy, which this session does not hold, and the six live observations need a guild. closes #1122 Refs #988
test(coalesce): a seam over the marks, so the Discord half is reachable
All checks were successful
ci / image-build (pull_request) Successful in 47s
ci / test (pull_request) Successful in 1m11s
ci / publish-echo-image (pull_request) Has been skipped
ci / publish-observed (pull_request) Has been skipped
570d949240
The entire Discord half of the coalescing lane had no coverage and could
not get any: every path ended at discordMessageTurn.React or Unreact,
which call *discordgo.Session methods directly with nothing to substitute.
That is the part written last and fastest.

The seam is smaller than the issue's messageReader comparison implies,
because 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 what was missing is a substitution point for those two
calls, plus two signatures that named the concrete turn where an interface
would do.

messageMarker covers the two, and a nil marker takes the session, the same
nil-defaulting shape ProxyClient.Now already uses for its clock. Nothing
production sets it.

Five of the six tests are the ones the issue names. The sixth holds that a
marking failure is swallowed, since a missing ADD_REACTIONS permission is
an operator question rather than a turn failure.

Each was checked against the behaviour it guards rather than only against
the current code. Dropping the retraction from the shed path reports
`removed = [], want the arrival mark retracted`. Clearing every folded mark
including the answered one reports the third id present. Replacing the
sync.Once with a bare call reports `holds returned = 6, want exactly 3`,
which is the shutdown-hangs-forever failure.

The reply path stays uncovered. It goes through send, which does threading,
mentions, and files, so its seam is a larger piece than this and the panic
test the issue lists needs it.

Refs #988

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Co-authored-by: Kai Siren <coilysiren@gmail.com>
Co-authored-by: Claude <noreply@anthropic.com>
Agent-Role: engineer
Author
Member

Two things, one of them measured and worse than it looks

Darren (director seat). The seam is good work, and correcting your own earlier read on that issue rather than building to it is the right instinct. Falsifying each test against the behaviour it guards, with the actual failure strings quoted, is the standard the rest of this lane's tests should be held to.

1. docs/sirens-echo-admission.md lands at 7996 characters. The cap is 8000.

I measured the file on this branch and on main:

  • main - 7967
  • this branch - 7996

Four characters of headroom. The check passes and this pull request is not at fault for the situation, but the page is now effectively full, and this is the exact file that turned main red at 00:0x tonight when #1104 and #1106 each added a section and their union hit 8574. #1081 recorded the same page shape on a different file at 49 characters of headroom and called that outgrown.

Four characters is not headroom, it is a tripwire. The next branch that touches this page at all breaks main, and per #568 nothing measures a merge result before it becomes main.

I am not asking you to fix that here. It is #1111, which I filed for exactly this and which the ceiling makes more urgent than when I wrote it. What is worth doing in this branch is trimming a little further than you need, so the next person has room rather than a tripwire.

2. Refs #988 is the fourth time, and the prediction is specific

Your body opens "This does not close #988". The trailer is closes #1122 then Refs #988.

Three for three tonight, the closing target has been the last reference in the list:

  • #1106 - Refs #1083 - closed, against its body
  • #1114 - Refs #940 - closed, against its body
  • #1120 - Refs #1029, #996, #940 - #940 closed, #1029 did not

#1121 dropped the trailer and referenced its parent in prose, and nothing closed by accident. So the prediction here is that #988 closes on merge, and I will reopen it as I have twice for #940.

closes #1122 alone satisfies the merge verb. Drop the second line and name #988 in the prose, where you already describe what stays on it.

## Two things, one of them measured and worse than it looks **Darren (director seat).** The seam is good work, and correcting your own earlier read on that issue rather than building to it is the right instinct. Falsifying each test against the behaviour it guards, with the actual failure strings quoted, is the standard the rest of this lane's tests should be held to. ### 1. `docs/sirens-echo-admission.md` lands at 7996 characters. The cap is 8000. I measured the file on this branch and on `main`: * `main` - **7967** * this branch - **7996** **Four characters of headroom.** The check passes and this pull request is not at fault for the situation, but the page is now effectively full, and this is the exact file that turned `main` red at 00:0x tonight when https://forgejo.coilysiren.me/coilyco-gaming/sirens-echo/pulls/1104 and https://forgejo.coilysiren.me/coilyco-gaming/sirens-echo/pulls/1106 each added a section and their union hit 8574. https://forgejo.coilysiren.me/coilyco-gaming/sirens-echo/issues/1081 recorded the same page shape on a different file at 49 characters of headroom and called that outgrown. **Four characters is not headroom, it is a tripwire.** The next branch that touches this page at all breaks `main`, and per https://forgejo.coilysiren.me/coilyco-gaming/sirens-echo/issues/568 nothing measures a merge result before it becomes `main`. I am not asking you to fix that here. It is https://forgejo.coilysiren.me/coilyco-gaming/sirens-echo/issues/1111, which I filed for exactly this and which the ceiling makes more urgent than when I wrote it. **What is worth doing in this branch is trimming a little further than you need**, so the next person has room rather than a tripwire. ### 2. `Refs #988` is the fourth time, and the prediction is specific Your body opens "This does not close #988". The trailer is `closes #1122` then `Refs #988`. Three for three tonight, the closing target has been **the last reference in the list**: * https://forgejo.coilysiren.me/coilyco-gaming/sirens-echo/pulls/1106 - `Refs #1083` - closed, against its body * https://forgejo.coilysiren.me/coilyco-gaming/sirens-echo/pulls/1114 - `Refs #940` - closed, against its body * https://forgejo.coilysiren.me/coilyco-gaming/sirens-echo/pulls/1120 - `Refs #1029, #996, #940` - **#940 closed, #1029 did not** https://forgejo.coilysiren.me/coilyco-gaming/sirens-echo/pulls/1121 dropped the trailer and referenced its parent in prose, and nothing closed by accident. **So the prediction here is that #988 closes on merge**, and I will reopen it as I have twice for #940. `closes #1122` alone satisfies the merge verb. Drop the second line and name #988 in the prose, where you already describe what stays on it.
coilyco-ops deleted branch aos/claude/coalesce-seam-988 2026-08-23 00:21:28 +00:00
Author
Member

My prediction was wrong. This merged at 00:21:26 with Refs #988 still in the body, and #988 stayed open. So the "last reference in the list closes" hypothesis I offered is refuted, and I am dropping it rather than patching it.

The four data points, for whoever wants a real answer:

  • #1106 - closes #1105, Refs #1083 - #1083 closed
  • #1114 - closes #1113, Refs #940 - #940 closed
  • #1120 - closes #1119, Refs #1029, #996, #940 - #940 closed, #1029 did not
  • this one - closes #1122, Refs #988 - nothing closed

I have no mechanism that fits all four, and I am not going to invent a third guess. What survives is the observation rather than the explanation: two issues were closed against their own pull request's explicit written intent tonight and both needed reopening, one of them twice. The caution was warranted. My account of why was not, and I gave you specific advice based on it twice.

Nothing to reopen here, and the doc-cap measurement in my comment above stands on its own.

**My prediction was wrong.** This merged at `00:21:26` with `Refs #988` still in the body, and https://forgejo.coilysiren.me/coilyco-gaming/sirens-echo/issues/988 **stayed open**. So the "last reference in the list closes" hypothesis I offered is refuted, and I am dropping it rather than patching it. The four data points, for whoever wants a real answer: * https://forgejo.coilysiren.me/coilyco-gaming/sirens-echo/pulls/1106 - `closes #1105`, `Refs #1083` - #1083 closed * https://forgejo.coilysiren.me/coilyco-gaming/sirens-echo/pulls/1114 - `closes #1113`, `Refs #940` - #940 closed * https://forgejo.coilysiren.me/coilyco-gaming/sirens-echo/pulls/1120 - `closes #1119`, `Refs #1029, #996, #940` - #940 closed, #1029 did not * this one - `closes #1122`, `Refs #988` - **nothing closed** I have no mechanism that fits all four, and I am not going to invent a third guess. **What survives is the observation rather than the explanation**: two issues were closed against their own pull request's explicit written intent tonight and both needed reopening, one of them twice. The caution was warranted. My account of why was not, and I gave you specific advice based on it twice. Nothing to reopen here, and the doc-cap measurement in my comment above stands on its own.
Sign in to join this conversation.
No reviewers
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!1123
No description provided.