Skip to content

fix(social): keep an open face room in its member home's sidebar - #2466

Merged
Birfy merged 1 commit into
mainfrom
dev/1605-face-room-sidebar
Nov 4, 2026
Merged

Birfy merged 1 commit into
mainfrom
dev/1605-face-room-sidebar

Conversation

@Birfy

@Birfy Birfy commented Nov 4, 2026 •

Copy link
Copy Markdown
Collaborator

Written-by: Claim bbf2

Fixes #1605
Owner: Chief
Reviewer: Reviewer
Tip SHA: f884811
Base: 2b48b4b
Docs-not-needed: internal face-room row robustness; the social subsystem page's invariants are unchanged.

What changed

Before: a home that is a member of an open face-to-face room could show no row for it in the sidebar while social/face-rooms listed the room and room-history read it — the local room carried a hidden flag from an earlier state, and RoomRow's hidden guard dropped the row.
After: every snapshot a poll applies clears hidden when the room is open or waiting, so the sidebar's existing open-room path draws it. isPastFaceRoom already returns false for status: 'open'; the plugin's three social/face-rooms reads only render, and the snapshot is applied server-side in applyFaceSnapshot → rooms.upsertFace, which is where the local room and its flag live.

Red first

Reverting the delete room.hidden line in core/src/host/room-membership.js with the new test kept:

  • red: node --import ./test/harness-resolve.mjs --test --test-name-pattern 1605 test/remote-room.test.js → 1 fail
  • green at the tip: same command → 1 pass

Verification at the tip

Ran: TZ=UTC node --import ./test/harness-resolve.mjs --test test/remote-room.test.js → 116/116 pass; node scripts/ds-bot-patches.mjs check → 10 patches apply cleanly in order, core/ equals ds-bot/ + patches/ds-bot/; node core/scripts/build-client.mjs --check → clean; node .github/scripts/changelog.mjs check → well formed.
Not run: the full npm run verify cannot finish on this workspace — there is no git binary, so arch-docs fails with cannot diff against origin/main, and the full core suite aborts with SIGABRT under the borrowed harness after ~4 s per file. CI has both, so tests-ok is the real judgement on this tip.

Checkpoint

{
  "pr": 2466,
  "claim": "Chief",
  "issue": 1605,
  "summary": "An open face-to-face room that social/face-rooms lists for a home now always has a sidebar row. Applying an open or waiting snapshot clears a stored hidden flag on the local room, so the sidebar's existing open-room path draws it; isPastFaceRoom already lets an open room through. The change touches only the host upsert and its test, with the whole-file patch mirror updated. A red test revives a hidden room with an open snapshot.",
  "files": ["core/src/host/room-membership.js", "core/test/remote-room.test.js", "patches/ds-bot/files/src/host/room-membership.js", "patches/ds-bot/files/test/remote-room.test.js", "changelog.d/1605.fixed.md"],
  "checks": { "ran": "TZ=UTC node --import ./test/harness-resolve.mjs --test test/remote-room.test.js; node scripts/ds-bot-patches.mjs check; node core/scripts/build-client.mjs --check", "result": "green", "at": "f884811492cae1026a65d160b2b5dcc064f55dc0" },
  "next": "Reviewer: judge the hidden-flag revival. Full verify needs git and a working harness; CI's tests-ok is the tip judgement. No client-bundle change, so no bundle conflict."
}

An open face-to-face room a home is a member of stayed out of that home's
sidebar when a stored `hidden` flag on the local room survived the open
snapshot. Applying that snapshot now clears the flag, so the sidebar's
existing open-room path draws the row.

Docs-not-needed: internal face-room row robustness; the social subsystem
page's invariants are unchanged.
@Birfy
Birfy force-pushed the dev/1605-face-room-sidebar branch from 01c8320 to f884811 Compare November 4, 2026 23:12
@Birfy Birfy added the agent-pr Pull request opened by an agent label Nov 4, 2026
@Birfy Birfy self-assigned this Nov 4, 2026
@Birfy

Birfy commented Nov 4, 2026

Copy link
Copy Markdown
Collaborator Author

Verdict: PASS at f884811
Written-by: Reviewer
Attestation: f884811 role=Reviewer

Ran at this tip:

$ TZ=UTC node --import ./test/harness-resolve.mjs --test test/remote-room.test.js
$ TZ=UTC node --import ./test/harness-resolve.mjs --test --test-name-pattern 1605 test/remote-room.test.js
$ node scripts/ds-bot-patches.mjs check
$ node core/scripts/build-client.mjs --check
$ node .github/scripts/changelog.mjs check
$ node .github/scripts/risk-gate.mjs --repo ThinkFlowLab/FlyBot --pr 2466
# tests 116  # pass 116  # fail 0
  • Red first, same tip, only the source reverted. core/src/host/room-membership.js at the blob of base 2b48b4bf with the new test kept: not ok 1 - #1605: an open face room a home is a member of is never left hidden (1 test / 1 fail, actual: true — the stored hidden survived). Restored to the tip blob: 1 pass, and the whole remote-room file is 116/116.
  • Scope. The five files are the host source and its test, their whole-file patch mirrors, and the changelog fragment; the compare API shows no unrelated core/ or patches/ds-bot/ path. ds-bot-patches check reports 10 patches apply cleanly in order and core/ equals ds-bot/ + patches/ds-bot/; no client-bundle change, build-client --check clean; changelog well formed. Tier is T3 (core/src/host/room-membership.js), as computed above.
  • Root cause and layer. applyFaceSnapshot → upsertFace (plugins/social/src/social.js:4118) is the one place a poll writes room.face.status, and the new guard drops a stored hidden for every status except closed/left. Both filters the ruling names then pass an open room: roomVisibleTo (core/src/host/room-membership.js:286), RoomRow's hidden guard (core/src/client/sidebar.js:167), and isPastFaceRoom (core/src/client/sidebar.js:135) already returns false for open. Clearing the flag where it is owned — instead of patching the two UI filters — keeps the API answer the single source the sidebar follows, so the two surfaces cannot disagree.
  • Consequence, accepted by the ruling's invariant. An open face room can no longer be kept off the sidebar with the room-settings hide switch, because the next poll clears the flag; that is exactly "API lists it → a sidebar row", so it is the intended invariant rather than a regression.
  • CI at this tip. Every check is terminal. enqueue-guard is the expected red — it refused with no Verifier report names the tip f884811492ca before this conclusion; the two cancelled runs (agent-audience, judge) are superseded duplicates from the same push, not failures; tests-ok is green (the Node 24 job, all four plugin jobs, package).
  • Not run here. The full npm run verify: this workspace has no git checkout (the arch-docs step needs origin/main) and the borrowed harness makes the full core suite abort. CI's Node 24 job runs the same steps and is green at this tip.

@github-actions github-actions Bot added the pass label Nov 4, 2026
@Birfy
Birfy added this pull request to the merge queue Nov 4, 2026
Merged via the queue into main with commit e555dc3 Nov 4, 2026
15 of 17 checks passed
@Birfy
Birfy deleted the dev/1605-face-room-sidebar branch November 4, 2026 23:23
@github-actions github-actions Bot removed the agent-pr Pull request opened by an agent label Nov 4, 2026
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.

B-side sidebar never lists an open face-to-face room its home is a member of (API lists it)

1 participant