Skip to content

busy ack: a member Bot in a group room is silent while its turn runs (#1584 room side) #1646

Closed

Description

@HugoXK

Implementation: FlyBot (ours) — PR follows within 24h. Do not pick up without a pickup-ok comment on this issue.

Written-by: FlyBot Lead
Claimed-by: FlyBot Lead
Claim-Id: e9782fb6143d464fbf621caa92c96da7
Branch: dev/3-busy-ack-in-a-group-room
Base: c26089f
At: 2026-10-29T06:01:07Z

Implementation: FlyBot (ours) — PR follows within 24h. Do not pick up without a pickup-ok comment.

The busy acknowledgment from #1584/#1629 exists only in a Bot's own chat. In a group room a member Bot that is already running answers a human line with silence until its step ends — the same silence #1584 set out to remove, on the surface the team actually works in.

Verified code facts (read at main c26089f55d1b):

  • core/src/host/busy-ack.js:128-130 — shouldNoteBusyAck({ sourceKind, turnRunning, ownChat }) returns sourceKind === 'user' && turnRunning === true && ownChat === true.
  • core/src/host/busy-ack.js:147 — const ownChat = sessionId => rt.chatOwners?.has(sessionId) === true, passed in at :176-180, so any Session outside chatOwners can never note an ack.
  • core/src/host/store.js:569 — chatOwners.set(chatOf(bot.id), bot.id): only each Bot's own chat (its current segment). Group Sessions are indexed apart at :575 — groupOwners.set(sessionId, { botId, roomId }), filled from room.sessions[botId] (:574).
  • core/src/client/busy-ack.js:36-52 — BusyAckBubble({ sessionId, … }) reads useBusyAcks()[sessionId] and useSessionStatus().get(sessionId)?.running; header.js:101 mounts it with the Session of the open conversation. In a room that is the room's own Session, while the member's running turn lives in room.sessions[botId] — a different id, so the bubble cannot find the ack or the running turn even if the host recorded one.
  • docs/subsystems/core-host.md:406-408 documents the gap as intended shape ("in a Bot's own chat").

Consequence. A member Bot busy with a >1s tool in a room says nothing when a person writes; the room reads as a dead Bot until the step ends. Pings and dispatch lines land in rooms, so this is the common case, not an edge.

Expected. A human line in a room, while the addressed member's room turn is running, gets the same one short ack on that member's row in the room flow: once per coalesce window, worded by the same composer, cleared when that member's turn ends. Other members in the same room are unaffected, a line that names nobody acks nobody, and the own-chat path stays byte-for-byte as today.

Acceptance.

  • (a) real install() with the real indexes (chatOwners + groupOwners), a room line whose user/message arrives in the member's group Session while that Session has a live turn → exactly one ack recorded for that Session;
  • (b) a second line inside COALESCE_MS keeps one ack (same window), a line after it produces a second one, and the previous wording is not repeated;
  • (c) turn/end and agent/status: idle clear it — no ack survives the turn;
  • (d) a line in a room where that member has no running turn, a line naming a different member, and an own-chat line behave exactly as today;
  • (e) the client draws it in the room flow on the running member's row (data-chat-running / the member row that already exists for room turns), and the own-chat bubble is unchanged;
  • (f) the new test is red on today's code and uses the real group-Session shape, not a hand-built chatOwners entry.

Scope. core/src/host/busy-ack.js (accept a Session that is a live group Session, keeping the own-chat branch as it is), core/src/client/busy-ack.js plus its room-flow mount, core/test/busy-ack.test.js / busy-ack-client.test.js (existing cases unchanged), the patches/ds-bot regeneration (bundle + file mirror via the generators, never by hand), the one sentence in docs/subsystems/core-host.md §#1584 that states the own-chat-only limit, and one changelog fragment. Keep COALESCE_MS, the composer, and the template pools untouched; {t}/{d} quoting (#1634) and steering-interrupt.js are out of scope. If a store helper is needed, add the lookup only — do not change what the indexes contain.

Written-by: FlyBot Lead

Activity

  1. HugoXK commented on Oct 29, 2026

    @HugoXK
    ContributorAuthor

    Release

    Written-by: FlyBot Lead
    Released: e9782fb6143d464fbf621caa92c96da7
    Reason: merged via PR
    At: 2026-10-29T07:42:30Z

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

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions