Skip to content

group chat: a Bot's "@Name" is dropped on two paths — a mid-round post builds no call, and a late "quiet" line returns before the @ is read #932

Closed

Description

@Birfy

Report

The owner, in the group chat at 11:11 today: a Bot posts a line that names another Bot with @, and the named Bot never answers. Earlier the same shape with @Reviewer. This is Bot-to-Bot naming inside one room.

Not reproduced — recorded so nobody re-opens it

Two Bots in participants, admin-mode room, A (the admin) replies @B your call on current main dfa25a2a: B gets exactly one turn — assert.equal(writerTurns.length, 1) is green, no duplicate, no gap. Evidence from that run:

  • The round report can see such a member: groups.js:1005-1019 has three buckets — addressed (the poster's own @, mine at :1009-1010), Called, but no answer (:1019), and Stayed silent (:1017).
  • hop = 1 (a person's line 0, a Bot's reply +1), nowhere near MAX_HOPS = 6 (core/src/host/constants.js:23).
  • B's Session was created, ran, answered [PASS] → status: 'passed', and room.log holds no line by B (a pass writes none). The call was built and the turn ran.

So the callMembers path (groups.js:585) is correct and must not gain a rule. This test stays as the negative control.

The two paths that actually drop the @ (all line numbers on main dfa25a2a)

(a) A Bot posts into the group while the round is running

postToRoom:929 → the group agent is running and heldWhileRunning is true → holdPost:915 → a this-home Bot's ordinary line goes through showInRound:891, which does logPost and round.replies.push and nothing else: no mentionsIn, no callMembers. The held post is only re-delivered after agent.whenIdle() (:918-925), i.e. after the round has ended — and the round's report has already said Stayed silent (:1017) about the member it named.

This is most likely what the owner saw: a Bot speaks during a round, names a member, and that member is not called until the round is over (and reads as silent in the report).

(b) A late line past ROOM_LATE_ROUNDS is marked quiet and the @ is never read

lateRoomReply:947 sets quiet at :961 once room.lateRounds >= ROOM_LATE_ROUNDS, and passes { late: true, quiet: true } down. Two early returns follow: showInRound drops it (:904), and when it finally opens a round, openingSpeakers returns at :837 — if (opener.quiet) return [] — before mentionsIn is consulted. Measured: feeding {late:true, quiet:true} with @Writer ... yields zero calls for Writer, and the admin answers instead.

quiet exists so late posts cannot keep a group talking; that goal is right. An explicit @ is not "keeping it talking", it names exactly one member.

Dev measured these on a nearby ref, so its numbers drift by a few lines (:939, :895, :812). Anchor on dfa25a2a.

What to change

  • (a) resolve the mentions once in showInRound for a this-home Bot's ordinary line and build the calls there, still inside ROOM_TURNS_EACH / ROOM_ADMIN_TURNS_EACH (groups.js:40-41, enforced in callMembers:347) and the round limit — no second, uncapped call path that skips the caps.
  • (b) make quiet stop only the spread that nobody asked for: either move the mention parse above the :837 early return, or let the early return apply only when nothing is named. Whichever, the comment must say why an explicit @ is exempt and what quiet still prevents.

Acceptance

Red tests first, then the code:

  1. Mid-round post: while a round runs, a this-home Bot posts a line @Writer → Writer gets exactly one call (assert.equal, not "at least one"), and the round's report does not file Writer under Stayed silent.
  2. Late quiet line: {late:true, quiet:true} with @Writer → exactly one call for Writer.
  3. The spread guard still holds: a late quiet line naming nobody → zero calls (that is what quiet is for).
  4. Dev's green case stays, unchanged, as a negative control: two Bots, A replies @B, exactly one turn — proof the callMembers path was not touched.
  5. Negative controls: naming a Bot that is not in participants builds no call; a speaker naming itself builds no call and no loop.

Why the report is not the observation point for this

On both paths the named member is never called, so #913's report files it under Stayed silent (:1017) — not under Called, but no answer. Anyone looking for evidence here should read the code paths above, not the round report.

Activity

  1. added
    bugSomething isn't working
    agent-readyMaintainer-approved spec: an agent may take it. Only maintainers set this; never in a template
    area:socialFriends, invites, grants, Bot Social
    on Oct 24, 2026
  2. changed the title [-]group chat: a Bot that @-names another Bot gets no answer, and the call cannot be traced to the step that dropped it[/-] [+]group chat: a Bot's "@Name" is dropped on two paths — a mid-round post builds no call, and a late "quiet" line returns before the @ is read[/+] on Oct 24, 2026
  3. added
    agent-prPull request opened by an agent
    agent-workingAn agent has claimed this issue (the claim comment names the branch)
    and removed
    agent-readyMaintainer-approved spec: an agent may take it. Only maintainers set this; never in a template
    on Oct 24, 2026
  4. removed
    agent-workingAn agent has claimed this issue (the claim comment names the branch)
    agent-prPull request opened by an agent
    on Oct 24, 2026
  5. added a commit that references this issue on Oct 24, 2026
    7be4e9b
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    area:socialFriends, invites, grants, Bot SocialbugSomething isn't working

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions