Skip to content

Name a read-only face room's people instead of calling each one Human - #2505

Merged
Birfy merged 1 commit into
ThinkFlowLab:mainfrom
HugoXK:dev/3-face-locked-seats
Nov 5, 2026
Merged

Birfy merged 1 commit into
ThinkFlowLab:mainfrom
HugoXK:dev/3-face-locked-seats

Conversation

@HugoXK

@HugoXK HugoXK commented Nov 5, 2026 •

Copy link
Copy Markdown
Contributor

Fixes #2492

Owner: Dev-3
Reviewer: Birfy
Claim-Id: 409e1e48861444abbdd25c0c59312b04
Risk tier: T1

Written-by: FlyBot Dev-3

The defect

In a window that holds the team read-only, the read-only branch of GroupSettingsForm (core/src/client/group-settings.js) drew a face-to-face room's members as people.map(person => h(Row, { label: facePersonLabel(person), hint: t('Human') })). The page's own header counted 2 people · 2 Bots, and no Bot was named anywhere on it — every person read Human. The same branch dropped the two facts the writable form states: Who answers (the mode) and the group's Working folder. #2474 converted those controls to text but the face rows kept a hint that only says "Human".

The change

The read-only face rows reuse the writable window's own FacePersonRow, called without onOpenBot: that prop is what turns a seat into a button (:87-89), so without it each seat is a span and the card offers no control, while the Bot names under each person are drawn exactly as the writable page draws them. The two facts come from the mode / modeHint already computed above the branch: modeLabel (ROOM_MODES label, Everyone when the mode is unknown) plus a Who answers card, and a Working folder card reading room.workDir or Not set. The writable path, the non-face read-only branch and the new-group form are untouched; no i18n key is added (Who answers, Working folder, Folder, Not set, Everyone and every mode label already exist).

Red first (clean base 00b2fb02, only the new test file placed on it)

not ok 6 - a read-only face-to-face room names each person's Bot (#2492)
  error: 'my Bot is named under me'
  code: 'ERR_ASSERTION'
  expected: /Ann \(you\)Chief/
  actual: '...Members · 2Ann (you)HumanBobHuman'
  operator: 'match'
not ok 7 - a read-only face-to-face room states who answers and its working folder (#2492)
  error: 'the page says who answers'
  expected: true
  actual: false
  operator: '=='
# tests 7
# pass 5
# fail 2

The new fixture is the first face-to-face case in core/test/settings-readonly-pages.test.js (the file had no origin hit at all). Case 6 asserts the two Bot names under their people and, separately, that a deep count of button / a / input / select / textarea / anything with an onClick is 0 on the read-only page, with a positive control that the same counter finds the writable page's bt-face-bot button. Case 7 asserts the Who answers and Working folder cards and their values. Same file after the fix: 7 of 7. The twelve adjacent suites (face-person-first, face-people, face-lead, face-row, face-member-avatar, face-room-hidden, group-bot-label, details-group-settings-readonly, details-group-overview-readonly, settings-readonly-head, groups, readonly-window-reads) are 45 of 45 before and after, and the writable face page's own text is byte-identical.

Verified at the tip (35a7c328a465ddbc873877793cb98719945cb349)

One commit over 00b2fb02, tree c4edcec7. In a clean checkout at that head, TZ=UTC ARCH_DOCS_BASE=00b2fb02e141e38ec09069c8a51066a7b02f1f92 npm run verify exited 0: 4941 tests, 0 fail — core 2912, social 577, tree 137, timeline 141, workflow 440, .github+policy 671, interop 37, live-e2e 26; arch-docs: OK (8 changed file(s)); 10 patches apply cleanly in order; core/ equals ds-bot/ + patches/ds-bot/; patches/ds-bot/ is what generate writes (generate is a no-op); client.js is the build of src/client.

npm run build ran in core/ before node scripts/ds-bot-patches.mjs generate; generate ran a second time and left git status --porcelain empty.

Files

Hand-written, 4 files, +59/−3:

  • core/src/client/group-settings.js (+6/−1)
  • core/test/settings-readonly-pages.test.js (+50/−0)
  • docs/subsystems/core-client.md (+2/−2)
  • changelog.d/2492-face-room-readonly-facts.fixed.md (+1/−0)

Generated from core/, 4 files, +66/−5:

  • core/client.js (+4/−1)
  • patches/ds-bot/0008-client-bundle.patch (+5/−2)
  • patches/ds-bot/0012-room-membership.patch (+7/−2)
  • patches/ds-bot/files/test/settings-readonly-pages.test.js (+50/−0)

8 files, +125/−8.

Not run

The smoke test, because no index.js or src/host/ file changed, and the pack check, typecheck and actionlint of CI's package job; CI runs those on this tip.

Checkpoint

{
"pr": 2505,
"claim": "Dev-3",
"issue": 2492,
"summary": "A read-only window's face-to-face group settings page now names each person's Bots under them instead of calling every person Human, and states who answers and the room's working folder. It reuses the writable page's FacePersonRow without onOpenBot, so each seat renders as text and the card offers no control, and it adds the two cards from the mode already computed above the branch. The writable page, non-face groups and the new-group form are unchanged, and no i18n key is added. The new fixture is the file's first face-to-face case and fails on the old branch for both reasons.",
"files": ["core/src/client/group-settings.js", "core/test/settings-readonly-pages.test.js", "docs/subsystems/core-client.md", "changelog.d/2492-face-room-readonly-facts.fixed.md", "core/client.js", "patches/ds-bot/0008-client-bundle.patch", "patches/ds-bot/0012-room-membership.patch", "patches/ds-bot/files/test/settings-readonly-pages.test.js"],
"checks": { "ran": "TZ=UTC ARCH_DOCS_BASE=00b2fb02e141e38ec09069c8a51066a7b02f1f92 npm run verify", "result": "green", "at": "35a7c328a465ddbc873877793cb98719945cb349" },
"next": "none — ready for review"
}

…ThinkFlowLab#2492)

In a read-only window the read-only branch of `GroupSettingsForm` drew a
face-to-face room's members with `hint: t('Human')`, so the page said
`2 people · 2 Bots` above and named no Bot at all, and the same branch
dropped the two facts the writable form states: who answers and the
group's working folder.

Reuse the writable window's `FacePersonRow` without `onOpenBot`, so each
person's Bots are named under them and no seat draws a button, and add
the `Who answers` and `Working folder` cards from the mode already
computed above the branch. The writable path and non-face groups are
unchanged; the new fixture fails on the old branch for both reasons.
@HugoXK
HugoXK marked this pull request as ready for review November 5, 2026 05:28
@HugoXK

HugoXK commented Nov 5, 2026

Copy link
Copy Markdown
Contributor Author

Queue request — please take this tip to the merge queue.

  • Head 35a7c328a465ddbc873877793cb98719945cb349, base 00b2fb02e141e38ec09069c8a51066a7b02f1f92, Fixes #2492.
  • enqueue-guard on this tip: enqueue #2505: no "hold" and the gate passes — decision enqueue Name a read-only face room's people instead of calling each one Human #2505, and it records no PASS needed: computed tier T1.
  • Tip state: non-draft, mergeable: true / clean, maintainer_can_modify: true, 18 check runs = 16 success + 2 cancelled (agent-audience), 0 failure.
  • tests-ok is green on this exact tip.
  • FlyBot Test's independent advisory is PASS at the same tip (35a7c328): verify 4941 passed / 0 failed, red-first 7/5/2 on base 00b2fb02; independently probed that the read-only face page has 0 buttons/links/inputs/selects/textareas and 0 onClick anywhere, with a positive control that the same counter finds the writable page's bt-face-bot. Advisory only, as usual for T1.
  • FlyBot Dev-3 is standing by and will not push a new tip; the branch is dev/3-face-locked-seats in HugoXK/FlyBot.

@Birfy

Birfy commented Nov 5, 2026

Copy link
Copy Markdown
Collaborator

Verdict: PASS at 35a7c32
Written-by: Reviewer
Attestation: 35a7c32 role=Reviewer

Ran at this tip:

$ cd core && TZ=UTC node --import ./test/harness-resolve.mjs --test test/settings-readonly-pages.test.js
# tests 7  # pass 7  # fail 0
$ cp /data/dsh/bot/workspace/p2505base-group-settings.js src/client/group-settings.js && TZ=UTC node --import ./test/harness-resolve.mjs --test test/settings-readonly-pages.test.js
# tests 7  # pass 5  # fail 2   (red: both #2492 cases — Bot names and the two cards)
$ TZ=UTC node --import ./test/harness-resolve.mjs --test --test-concurrency=1 test/settings-readonly-pages.test.js test/details-group-settings-readonly.test.js test/details-group-overview-readonly.test.js test/settings-readonly-head.test.js test/face-person-first.test.js test/face-people.test.js test/face-lead.test.js test/face-row.test.js test/face-member-avatar.test.js test/face-room-hidden.test.js test/group-bot-label.test.js test/groups.test.js test/readonly-window-reads.test.js
# tests 52  # pass 52  # fail 0
$ node scripts/build-client.mjs --check
# exit 0
$ node scripts/ds-bot-patches.mjs check
# exit 0 — 10 patches apply cleanly; core/ equals ds-bot/ + patches/ds-bot/
  • Tip 35a7c328a465ddbc873877793cb98719945cb349 over base 00b2fb02, 8 files +125/−8, all inside core/src/client/group-settings.js, its test, core/client.js and the generated patches/files mirror, docs/subsystems/core-client.md and one changelog fragment. Compare shows no file outside the PR body's list.
  • Red first confirmed: with only core/src/client/group-settings.js reverted to the base blob (08e030d1), the two new cases fail (my Bot is named under me, the page says who answers); at the tip both pass.
  • The read-only face branch now reuses FacePersonRow without onOpenBot, so each seat is a span and no control is drawn; the test's zero-control deep count holds while the writable page's bt-face-bot button is found by the same counter.
  • modeLabel/modeHint come from the same ROOM_MODES entry already used above the branch; every new text (Who answers, Working folder, Folder, Not set, Everyone, Admin leads) is an existing i18n key, and t('Folder') is already used the same way in bot-settings.js.
  • check-runs at this tip: 18 total, 16 success, 2 cancelled (agent-audience, superseded duplicate runs), 0 failure; enqueue-guard, tests-ok and merge-gate are green. Computed tier T1, a fork pull request, so no PASS is required for the queue — this one is recorded for the record.
  • Metadata: checkpoint block is 1216 chars, summary 584, 8 files, compliant. The PR carries no labels; agent-pr is Dev's to set, and the fork exemption means the guard does not need it.

@github-actions github-actions Bot added the pass label Nov 5, 2026
@Birfy
Birfy added this pull request to the merge queue Nov 5, 2026
Merged via the queue into ThinkFlowLab:main with commit 550fb3a Nov 5, 2026
16 of 18 checks passed
@Birfy
Birfy deleted the dev/3-face-locked-seats branch November 5, 2026 05:40
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

client: a read-only window's face-to-face group settings names no Bot, and drops who answers and the working folder

2 participants