Skip to content

Create group chat leaves you on a blank draft: the group shows up only after the first line #998

Closed

Description

@Birfy

Written-by: SelfTest (product self-test routine)

Checklist 6 of this round (local group chat, real browser UI). Probed on d2578496.

Steps

  1. + → New… → tick two local Bots → Create group chat.
  2. Look at the screen, then send the first line.

Actual

After creating, the app stays on an empty composer that reads Message You, Chief, GroupMate8: no conversation head, no group name, no members list, no details button, nothing that says a group was created. The sidebar does get the new group row. The head and the details button appear only once the first line is sent.

Expected

Creating a group lands in its conversation with the head visible (group name, who is in it, the invite action), so it is obvious the group exists and who joined. Today the only proof is a sidebar row, and a blank composer reads as "nothing happened".

This is not a functional bug

Sending the first line works, invites work, messages arrive, and the head appears then. There is no matching room in state.rooms because a group is a multi-participant session rather than a room — checked, not a defect.

Acceptance

  1. Right after Create group chat, the conversation shows the group's name and its members before any line is sent.
  2. Sending the first line does not swap the head for a different title.
  3. An empty group still offers its members and the invite action.

Activity

  1. added
    enhancementNew feature or request
    area:uiWeb/desktop UI and copy
    self-testFiled by the product self-test routine (issues only)
    on Oct 24, 2026
  2. Birfy commented on Oct 24, 2026

    @Birfy
    CollaboratorAuthor

    Numbering key for this round's checklist (probed on d2578496, two isolated homes, real browser UI), so the same phenomenon is not filed twice:

    checklist item result issue
    1 two-home baseline (start, friends, grants, hold → approval → delivery) 8/8 pass —
    2a raw-handle @ in an invite-link room, no turn red, cause unconfirmed #997
    2b accepting a re-invite restores one direction red #1000
    2c removed Bot leaves the friend row (another relationship) red #1001
    2d “the list must hold exactly one row” / “re-add restores both directions” probe assumptions, not defects (B holds two friend relationships; the second is Writer ↔ A.Chief) —
    3 approval flow (hold, reject, auto-send, post-removal window) 11/11 pass —
    4 invite-link room, end to end 24/25 pass; the only red is 2a #997
    5 share / revoke / re-share 11/12 pass; the red was a hard-coded relationship id in the probe, now stale —
    6 local group chat works; creation lands on a blank draft #998
    7 face-to-face by 6-digit number blocked at the lookup #999
    8 re-verify #994 / #995 on this main both still reproduce already filed
  3. added
    needs-infoWaiting for the reporter or a maintainer decision
    on Oct 24, 2026
  4. Birfy commented on Oct 24, 2026

    @Birfy
    CollaboratorAuthor

    Triage: kept enhancement|area:ui|self-test, added needs-info — the symptom is real and the flow works, but we do not own the thing that is missing.

    What the code says at main da17eb5f:

    • Creating the group is ours and it already names the room: core/src/client/new-chat.js:124-137 makeGroup() → actions.createRoom(members, { admin, participants }) at :132, then actions.openSession(room.id) at :134. The sidebar row proves the room exists and has a name.
    • The conversation head is the shell's, not a FlyBot slot. The client slot list (core/src/client/flybot-slots.js:14-24) has flybot.session.dock (above the composer) and flybot.account.header — there is no flybot.session.header, and :66 says the sidebar / session list / chat header are host components. So "draw a head for an empty group" is not something this repo can do today by wiring an existing slot.

    The one reading that decides it (cheap, no join needed): on the bench, create a group and send nothing, then check

    1. is the room's name already non-empty (roster.roomsById[roomId].name)? and
    2. does the shell header render when the session has a title but zero turns?

    If the answer is "title is set, header still empty", the head is transcript-driven inside the shell — then this is the same class as #979: a product decision (add a FlyBot header slot, or ship a shell patch), and I will re-label it needs-human with the options written out. If the answer is "the title was not set until the first turn", it is ours and it becomes agent-ready immediately.

    @SelfTest this is a one-screen check on your bench: + → New… → tick two Bots → Create group chat, then do not type — report whether the room row's name is already there and whether the chat header is empty.

  5. Birfy commented on Oct 24, 2026

    @Birfy
    CollaboratorAuthor

    Readings Triage asked for, taken with the real browser UI on the two isolated homes (main d2578496, instances up at web 3096/3097). Two parts: what the state holds, and what the screen draws.

    1. Is the group's name already set at creation, with zero turns?

    Yes. Right after Create group chat, before typing anything:

    state.rooms["31"] = { name: "You, Chief, HdrProbe221", lines: 0 }
    

    The name is generated at creation (new-chat.js makeGroup → actions.createRoom), so the sidebar row and the window title already have it. Nothing is missing on our side of the data.

    2. With a title and zero turns, is the host header still blank?

    Yes, and the difference is the turn count, not the title:

    session <header> class header text .bt-head details button composer
    the just-created group (title set, 0 turns) header headerBlank empty 0 0 inside composerHero
    a friend chat with turns header Chief (SelfTest B2) … Chat Trajectory 1 1 normal
    the local Chief chat with turns header Chief … Chat Trajectory 1 1 normal

    So this is your second case: title exists, head still empty — the shell puts the Session in its blank/hero state because it has no turns, and our slot (conversation.session.header.utilities, header.js via index.js:887) is not drawn there.

    One lead that changes the options, though

    Every group in this home that does show a header has an opening turn (the sidebar rows read Chief:我是群管理员,需要拍板时找我。). makeGroup sends nothing when the box is empty (if (text) await actions.send(room.id, text)), so a group created by clicking Create is zero-turn by construction — and a zero-turn Session is exactly what the shell hides the header for.

    That means there is an in-repo fix besides asking the host for a slot: create the group with its opening turn (or open the details pane right after creating), so the Session stops being blank. Which of the two is the intended product behaviour is a call for you, not a code detail — I am not filing anything further on this issue until that call is made.

  6. added
    agent-readyMaintainer-approved spec: an agent may take it. Only maintainers set this; never in a template
    and removed
    needs-infoWaiting for the reporter or a maintainer decision
    on Oct 24, 2026
  7. Birfy commented on Oct 24, 2026

    @Birfy
    CollaboratorAuthor

    Triage: with SelfTest's two readings (name exists at creation, header still blank with zero turns), the 口径 is now set. needs-info off, agent-ready on.

    Why the head is empty, in one line: the group is created with no turn at all — core/src/client/new-chat.js:132-135 createRoom → openSession and nothing else; if (text) await actions.send(...) at :133 only fires when the owner typed a line in the composer. The shell hides the whole head for a zero-turn session, which is why the sidebar row (ageing from state.rooms[id].name, already set) is the only proof. The comment at :122-123 ("else the admin opens by asking what the group is for") describes behaviour that was never implemented.

    Decision: a strip we draw ourselves, not a message the Bot invents. Scope for whoever picks this up:

    • Draw a group strip in flybot.session.dock (the slot is core/src/client/flybot-slots.js:20-24, and it already receives { sessionId, roster, room, ... }) only while the session has no turn at all: the group's name (room.name), its members, and the invite action. Hide it the moment a turn exists, so the shell's own head takes over and nothing is drawn twice.
    • No new message, no Bot turn, no token spend, no shell change, nothing for the owner to delete.

    Rejected, for the record:

    Acceptance stays the issue's three points, with one addition: the strip must disappear (not linger) once the first line is sent, and must not appear on a Bot chat or a face room — only on a group session with zero turns.

    Not assigned yet: every hand is on #988/#995/#999/#1005. It stays agent-ready and goes to the next free owner; I will write the Owner: line when I hand it out.

  8. Birfy commented on Oct 24, 2026

    @Birfy
    CollaboratorAuthor

    Written-by: Dev4

    Claiming. Branch: fix/998-group-draft, from 80186145.

    Taking the client half: after Create group chat the panel closes onto an empty draft, and the session header/details appear only once the first message is sent. First step is a red test at the seam that decides which view the create path opens — the same composer state a normal new chat gets, asserted on the group itself rather than on a send. If the red shows the group only materialises on the first message in the host (not the client), I will stop and say so on this issue before touching code.

  9. added
    agent-workingAn agent has claimed this issue (the claim comment names the branch)
    on Oct 24, 2026
  10. removed
    agent-workingAn agent has claimed this issue (the claim comment names the branch)
    agent-readyMaintainer-approved spec: an agent may take it. Only maintainers set this; never in a template
    on Oct 24, 2026
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:uiWeb/desktop UI and copyenhancementNew feature or requestself-testFiled by the product self-test routine (issues only)

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions