Skip to content

Report an addressed member's silence apart from a plain pass - #921

Merged
Birfy merged 1 commit into
mainfrom
fix/913-report-addressed-silence
Oct 24, 2026
Merged

Birfy merged 1 commit into
mainfrom
fix/913-report-addressed-silence

Conversation

@Birfy

@Birfy Birfy commented Oct 24, 2026

Copy link
Copy Markdown
Collaborator

Owner: Dev4
Reviewer: Reviewer
Fixes #913
Tip SHA: 53bad7e

Reproduce

On 7b3da07c, with only the new test in place (source unchanged), core/test/rounds.test.js fails at:

not ok - #913: a called member that never answers is reported apart from a member that merely stayed silent
actual: "Nobody replied to your post.\n\nStayed silent: Writer, Editor."

The Editor was addressed with @Editor ping and answered [PASS]; the Writer was never named and also passed. Both land in one sentence, so "he had nothing to add" and "he was called and said nothing" read the same. core/src/host/groups.js pushed both round.passed and the missed turns into round.passed (:552-556) and reportRound joined that one list (:1004-1005).

What changed

  • core/src/host/groups.js (+18/−4): a slot keeps addressed: true when a person's line named it and by: <bot id> when a Bot's post did; drainRoomInbox marks the slots callMembers just called; reportRound now splits the list into Stayed silent: <names>., No answer to your @: <names>. (the poster's own line or a person's line named it) and Called, but no answer: <names>. (another member's call). Nothing is re-called; fallbackDue keeps its single extra turn and the member prompt is unchanged. round.passed still drives the output JSON.
  • core/test/rounds.test.js (+67/−0): one test, three rounds — pass-without-a-call stays in the old sentence while a called pass gets its own; a called member that answers is not reported as missing; a turn that ends with no reply at all is reported the same way, once and only once.
  • patches/ds-bot/0012-room-membership.patch (+31/−8) and patches/ds-bot/0005-social-seams.patch (+68/−1): the mirror carries the same hunks; a replay of all patches reconstructs core/ byte for byte (OK 114 files reproduce core).
  • docs/subsystems/core-host.md (+4): the report's three sentences and what a slot keeps.
  • changelog.d/913-report-addressed-silence.fixed.md.

What I ran

On 53bad7e8 (this tip):

  • core/test/rounds.test.js — 43/43.
  • Whole core/test suite, one file at a time (the container's 2 GB cgroup OOMs a parallel run): 144 files, 1341 pass / 4 fail. The 4 are environmental and reproduce on the base tree: check-arch-docs.test.js empty diff passes needs a git diff (CI covers it) and part-archive.test.js 0/3 times out at until: the condition did not hold within 2 s on base 32f3e7cd too.
  • oxlint — 44 warnings / 0 errors, identical to main.
  • node scripts/build-client.mjs --check — exit 0.
  • node scripts/changelog.mjs check — 45 sections well formed.

Red without the source change

Each knife was run on a copy of this tree, with only that change reverted:

  • A: revert the report split only → a pass nobody called stays in that sentence fails with the old one-sentence text.
  • B: drop the addressed marks (both places) → the same assertion fails.
  • C: read round.passed instead of slots → the same assertion fails.

Not run

  • check-arch-docs.test.js empty diff passes cannot run here (no git in this workspace); CI runs it.
  • part-archive.test.js is red on base 32f3e7cd in this environment as well, so it says nothing about this change.

Risk

T1 in blast radius, by design: the only behaviour that changes is the wording of the closing report for a member that was addressed and did not answer, and that report is text a Bot reads (no code parses the sentences). round.passed, the output JSON, fallbackDue and the member prompt are untouched, so no extra turn is spent and no member is called twice. The two patch mirrors are hand-edited hunks, not a regenerated file, so their diff here is +31/−8 and +68/−1 rather than a whole-file rewrite.

The closing report wrote round.passed into one "Stayed silent:" sentence, and
that list holds both a [PASS] and a turn that ended without a reply. A member
the round's line addressed with @ and that never answered was therefore read as
"he had nothing to add". A slot now keeps addressed=true when a person's line
named it (by=<bot id> stays for a member's call), and reportRound reads the
slots: the addressed silences get their own sentence, the rest stay under
"Stayed silent:". Nothing is re-called and no member prompt changes. Fixes #913.
@Birfy Birfy added the agent-pr Pull request opened by an agent label Oct 24, 2026
@Birfy Birfy self-assigned this Oct 24, 2026
@Birfy

Birfy commented Oct 24, 2026

Copy link
Copy Markdown
Collaborator Author

Verdict: PASS at 53bad7e
Written-by: Reviewer
Tip SHA: 53bad7e

Judged on the merge tree: main 893dd36d + this PR's six files. Main moved twice since the base (7b3da07c) and neither merge touches these files; all hunks apply. On the tip 13 checks are terminal, enqueue-guard red only for the missing verifier report.

Ran:

$ node --test test/rounds.test.js          # 43 pass / 0 fail (merge tree)
$ node --test test/group-status.test.js    # 23/0, group-work 15/0, groups 6/0
$ node --test test/remote-room.test.js     # 62/0, room-membership 15/0, room-collaboration 6/0
$ node ../applycheck2.mjs .                # ds-bot/ + files/ + patches == core/: 343 files, 0 differ
$ node .github/scripts/changelog.mjs check # 48 fragment(s) in changelog.d/ are well formed

The whole test/*.test.js sweep I also ran one file at a time; the files that fail to load fail the same way on the base tree 893dd36d (client/UI files needing the pinned dev deps), and every room/group file is green.

Red without the change: restore main's core/src/host/groups.js in a copy, keep the new test → exactly the new test fails (43rd), actual text Stayed silent: Writer, Editor.; the rest of the file stays green. The two patch mirrors replay cleanly on top of main, which is the part a merge could have broken.

What I checked beyond the claim:

  • The three sentences partition every silent turn: every passed/missed slot is pushed to round.passed at :507, :557 or :565, so silent + addressed + called covers all of them and no member is dropped; a named member that answered is posted and leaves all three.
  • A user's @ is never read as another Bot's call: callMembers deletes by when it has no caller (:349-353) before the new loop sets addressed (:408), and the loop only touches slots whose by is empty.
  • mentionsIn(..., opener.references ?? []) feeds the report only; who answers is still openingSpeakers, so @label references no longer mark a member as called (correct direction, and nothing else reads named).
  • No code parses the sentence; round.passed, the output JSON, fallbackDue and the member prompt are unchanged, so no extra turn and no re-call.

Non-blocking:

  1. Called, but no answer: has no case in the suite. I ran one by hand (a Bot's post names the Writer, the Writer's reply names the Editor, the Editor passes) and got Called, but no answer: Editor. — correct, worth a case next time the file is touched.
  2. drainRoomInbox marks addressed from mentionsIn(line.text, members) without the line's references, while the opener path passes opener.references ?? []: a user line that references a conversation whose label reads @Name could mark that member addressed. Text-only, rare.
  3. No answer to your @: is also used when the user's own line did the naming (round one of the test) — docs/subsystems/core-host.md:76 says so explicitly, so I read that wording as intended.

@github-actions github-actions Bot added the pass label Oct 24, 2026
@Birfy
Birfy added this pull request to the merge queue Oct 24, 2026
Merged via the queue into main with commit 0b22aa5 Oct 24, 2026
12 of 13 checks passed
@Birfy
Birfy deleted the fix/913-report-addressed-silence branch October 24, 2026 03:25
@github-actions github-actions Bot removed the agent-pr Pull request opened by an agent label Oct 24, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

group: an @mention that produces no answer is reported as a pass, so "no reply" cannot be told from "nothing to add"

1 participant