Repository navigation
Closed
Labels
area:socialFriends, invites, grants, Bot SocialFriends, invites, grants, Bot SocialbugSomething isn't workingSomething isn't working
Description
Summary
In a face-to-face room (面对面房间, multi-home room via Bot Social), every home runs its own round over only its local Bots. The round logic in core/src/host/groups.js ignores what another home's Bots already posted, so:
- Forced fallback after a friend already answered.
answeredAlready(round)andfallbackDue(round)look only atround.slots(local Bots). When a friend's Bot (e.g. their Chief) has already answered or posted a plan for the person's line, and all local Bots reply[PASS],fallbackDueis still true and the first local Bot is forced to answer (route.forced,ROOM_REPLY_FORCED— "nobody else answered"). Result: a second plan for the same request. - A friend Bot's
@all/@所有人wakes every local Bot.openingSpeakers()only returns[]for face-room Bot posts when!all(if (isFaceRoom(room) && !all) return [], ~line 739); with@allit falls through toreturn admin ? [admin, ...] : members, so a Bot in another home can start a full round of all of my Bots. This is the gap left by Face rooms: a plain line should let every Bot in the room answer (one round, capped), not only the first (follow-up to #287) #295 (which made a person's plain line answerable in one capped pass) and Face-to-face: a human message that does not @ the Bot still starts a Chief model turn #167 ("only @name / @ALL calls a Bot") — Bots in two homes can still set each other off with@all.
Investigation: local clone at main bae4128.
Expected behavior
- Cross-home answers count. Any Bot line (local or another home's Bot) logged in the room after the current
room.faceLine(the person's line that opened the routed round) counts as "answered":answeredAlreadyis true, remaining local slots are not asked (no model call), andfallbackDueis false, so no forced fallback when a friend's Bot already answered/planned.
- routeNote mentions it. When a friend's Bot already posted for this line (e.g. a plan) and a local Bot is still asked (broadcast-style line or explicit @name),
routeNote()tells it:"<X> already posted a plan; add only your role's part"(do not re-plan, do not repeat). - A friend Bot's
@all/@所有人does not wake all local Bots. In a face room, a Bot post from another home with@allstarts no local round (same as a plain Bot post, Face-to-face: a human message that does not @ the Bot still starts a Chief model turn #167). - A friend Bot's
@MyBotstill wakes only that Bot (unchanged). - A person's
@all(owner or attested friend line, Face rooms: a plain line should let every Bot in the room answer (one round, capped), not only the first (follow-up to #287) #295/Face room: friend's plain line bypasses face-room routing and no-follow-up rule #462) keeps its current behavior.
Acceptance criteria
- In
core/src/host/groups.js,answeredAlready/fallbackDueconsider Bot lines inroom.logwithseq>room.faceLine.seq(from any home,botIdset, not notices/face-notice) as answered for the current face line. - No
route.forcedslot is pushed when another home's Bot answered the current face line after it was posted. -
routeNote()names the friend's Bot that already answered and says to add only the local Bot's role-specific part. -
openingSpeakers(): a face-room post by another home's Bot containing@all/@所有人returns[](or only explicitly named local Bots); a friend Bot's@MyBotreturns onlyMyBot. - Tests in
core/test/rounds.test.jscover:- friend's Bot answers a plain owner line → all local Bots PASS → no forced fallback, no local post;
- friend's Bot posted a plan → local Bot still asked gets the "already posted a plan; add only your role's part" note;
- friend Bot posts
@alland@所有人→ no local Bot turn; - friend Bot posts
@MyBot→ onlyMyBotgets a turn; - existing Face rooms: a plain line should let every Bot in the room answer (one round, capped), not only the first (follow-up to #287) #295 / Face rooms: a plain line should be answered by the Bot(s) it is for, not by every Bot (follow-up to #295) #299 / Face room: friend's plain line bypasses face-room routing and no-follow-up rule #462 tests still pass (own-home fallback still fires when nobody in any home answered).
- Mirror the change in
ds-bot/src/host/groups.js/ds-bot/test/rounds.test.jsonly if that copy shares the face-room code path (check; do not diverge silently).
File pointers (main @ bae4128)
core/src/host/groups.jsrouteFor()~L339,answeredAlready~L352,fallbackDue()~L357, forced fallback inrunRound()~L403routeNote()~L202,roomPrompt()~L222currentFaceLine/openFaceLine~L76–82 (room.faceLine)openingSpeakers()~L708, the face-room Bot-post rule ~L739
core/test/rounds.test.js
Related
- Face rooms: a plain line should let every Bot in the room answer (one round, capped), not only the first (follow-up to #287) #295 (face rooms: plain line lets every Bot answer, capped) — this closes its cross-home gap
- Face rooms: a plain line should be answered by the Bot(s) it is for, not by every Bot (follow-up to #295) #299 routing (route/fallback), Face room: friend's plain line bypasses face-room routing and no-follow-up rule #462 (friend's plain line routing), Face-to-face: a human message that does not @ the Bot still starts a Chief model turn #167 (Bot posts only call by @name / @ALL)
- Team mode via groups: task layer step 1 - responsible-owner authority, FLYBOT-TASK envelope, workBotId #149 team mode via groups (responsible owner) — longer-term task layer
- [Team] Recover task handoffs without duplicate work #55 recover task handoffs without duplicate work
- Follow-up feature: Face rooms: selectable room lead (总负责人) picked by the room creator, cross-home roster with roles, one plan per request #476 selectable room lead for face rooms (depends on this)
Scope: bug fix only; no UI changes.
Metadata
Metadata
Assignees
Labels
area:socialFriends, invites, grants, Bot SocialFriends, invites, grants, Bot SocialbugSomething isn't workingSomething isn't working
Activity
Birfy commentedon Oct 20, 2026
Owner decision (2026-10-20): face rooms must work like self-created groups — the room has one selectable overall lead (总负责人). The lead is not necessarily the Chief (the Chief may not be in the room); any Bot in the room, from any home, can be chosen. The room creator picks it via a UI button in the room (never by a typed chat reply); until picked, the default is the first Bot from the creator's home that joined. The lead sees the full room roster (all people and all Bots from every home, with roles) and assigns work; other Bots only do the part assigned to them or answer when named. One plan per request; nobody re-plans.
For this issue: a friend Bot's answer/plan must count as answered (no forced local re-answer), and a friend Bot's @all/@所有人 must not wake all local Bots. Lead selection itself is #476.
Birfy commentedon Oct 20, 2026
Claimed by maintenance run (2026-10-20 09:54 Asia/Shanghai). Working on branch
fix/475-face-room-cross-home-answers(fork Birfy/FlyBot), developed in parallel with sibling issues; first slice per the Owner decision only.Birfy commentedon Oct 20, 2026
Minor decisions for PR #487 (2026-10-20 11:12 Asia/Shanghai):
botIdnot one of my room members, notface-notice, nokind) logged after the person's line and after my round opened. A friend Bot post that was queued before the round opened is not counted, because the relay logs it after the person's line even when it is older (this keeps Face room: friend's plain line bypasses face-room routing and no-follow-up rule #462's "friend line queued after a Bot post" case answered). My own Bots' answers keep being counted through the round's slots androom.faceLine.answeredas before.routeNoteonly, so it reaches Bots still asked on a routed line to everyone; an explicit@Nameline is not routed and gets no note (unchanged prompt).@all/@所有人calls only the local Bots it also names by@; my own Bots'@alland any person's@allare unchanged.ds-bot/is pristine upstream and is never edited; the change reaches it only through the regeneratedpatches/ds-bot/.Count another home's Bot answer in face rooms; a friend Bot's @ALL wa…
Birfy commentedon Oct 20, 2026
Cleanup: face-room answer-count fix shipped; issue closed. Removing stale agent-working and assignee.