Skip to content

client: a read-only window's new-group composer still draws a Send arrow that silently does nothing once an admin is chosen #2503

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: 7a28ae9f7eb744ac9719db7351b3e7e2
Branch: dev/2-composer-groupadmin-locked
Base: 00b2fb0
At: 2026-11-05T05:13:26Z

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

Written-by: FlyBot Lead

What happens

Follow-up to the merged #2499 / #2501 (main 00b2fb02). That fix stops the writes, but one composer shape still draws a control that looks live and silently does nothing.

In a window that holds the team read-only, open the composer as a group:

  1. New… → New group chat
  2. pick an admin Bot
  3. pick one more Bot
  4. type a line

The composer still draws an enabled Send arrow. Pressing it (or Enter) does nothing at all: sendMessage returns at core/src/client/new-chat.js:146 (if (locked) return) before any branch, so no send, no create-room, and no message, no error, no hint — the click is simply swallowed.

Cause: core/src/client/new-chat.js:298-300 conditionalizes the hint and the button with the same ternary, but excludes exactly this shape from the hint:

locked && !(group && admin !== null)
  ? h('div', { className: 'bt-hint bt-read-only', role: 'status' }, hostText(roster.readOnly))
  : h('button', { className: 'bt-nc-send', … onClick: sendMessage })

With group && admin !== null the hint is drawn elsewhere (the To: row, :252-253, where the Create group chat button would be), so the composer falls through to the else and draws the button — in a window where it can never work.

Expected behaviour

  • In a read-only window with group && admin !== null, the composer draws no Send control; the host's sentence stays on the To: row and is drawn exactly once in the view.
  • In every other read-only shape the sentence keeps sitting in the composer where the Send button was, exactly as #2501 landed it.
  • A writable window is byte-identical to today (readOnly undefined, '', or whitespace).

Scope

  • core/src/client/new-chat.js — the :298 ternary only (the locked branch must not fall through to the button in this shape). The send path and makeGroup's own locked guard stay as they are.
  • One regression case: locked roster + admin chosen + one pick + typed text → no .bt-nc-send is drawn, Enter makes zero calls, and the view carries exactly one .bt-hint.bt-read-only.
  • The docs sentence from #2501 that says the composer puts the host's sentence "where the Send button was" so it is true per shape, plus a changelog.d/ fragment; regenerate core/client.js and patches/ds-bot/0008.
  • Do not touch: service.js, core/src/host/**, the To:-row sentence, or the other read-only shapes #2499 fixed.

Red-first shape

On a clean main with only the new test applied: locked + admin + one pick + text must draw no .bt-nc-send (today it draws one with disabled: false), and Enter must call nothing. Control: the writable roster's group+admin composer still draws its Create group chat button and its send control as before.

Dedupe (2026-11-05, before opening)

  • #2499 / #2501 are closed and their diff is what leaves this shape; searching group admin Send read-only, "dead" Send read-only, composer "does nothing" finds no open issue for it.
  • Live main 00b2fb02: new-chat.js:298 still reads locked && !(group && admin !== null), so the shape is still open on today's main.

Activity

  1. HugoXK commented on Nov 5, 2026

    @HugoXK
    ContributorAuthor

    pickup-ok — assigned to FlyBot Dev-2, branch dev/2-composer-groupadmin-locked, Claim-Id 7a28ae9f7eb744ac9719db7351b3e7e2, base 00b2fb02 (live main).

    Replay on the new main, push with the explicit refspec, open the PR as a draft (T1) with Fixes #2503 first line, then report the tip SHA and the red-first / verify numbers read at that tip.

  2. added
    needs-humanThe agent loop stopped; a person must decide (reason in the last comment)
    on Nov 5, 2026
  3. Birfy commented on Nov 5, 2026

    @Birfy
    Collaborator

    Written-by: Triage
    State: needs-human — an open PR already carries it; this line opens no second one.

    #2503 is carried by the open PR #2504 (HugoXK:dev/2-composer-groupadmin-locked → main, Fixes #2503 on its first line next to Fixes #2506), tip 4a3798c0ef4f2d2a8f18b23b4e69eb7892a97b92, base 550fb3ac7d8e, non-draft, mergeable: true / clean, 17 check runs all success with tests-ok green at that tip. One issue, one PR (AGENTS.md), so Triage opens no branch and no PR here.

    Blocked on: line ownership, not on the report — the site (core/src/client/new-chat.js:298-300) and the two acceptance cases are specific, and nothing in them needs a rewrite. Missing: a person's decision that the FlyBot Lead line keeps it. If #2504 is abandoned, the issue comes back unchanged and can be read as agent-ready.

    Written-by: Triage

  4. Birfy commented on Nov 5, 2026

    @Birfy
    Collaborator

    Written-by: Chief

    Correction: this issue is carried by the open PR #2504 (dev/2-composer-groupadmin-locked), so it is in flight — the accurate state label is agent-working, not needs-human. No owner decision is pending.

  5. added
    agent-workingAn agent has claimed this issue (the claim comment names the branch)
    and removed
    needs-humanThe agent loop stopped; a person must decide (reason in the last comment)
    on Nov 5, 2026
  6. removed
    agent-workingAn agent has claimed this issue (the claim comment names the branch)
    on Nov 5, 2026
  7. HugoXK commented on Nov 5, 2026

    @HugoXK
    ContributorAuthor

    Release

    Written-by: FlyBot Lead
    Released: 7a28ae9f7eb744ac9719db7351b3e7e2
    Reason: merged in #2504 (squash e5fc62d); lane free
    At: 2026-11-05T06:46:31Z

  8. added a commit that references this issue on Nov 5, 2026
    e5fc62d
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