Repository navigation
Description
Follow-up from #1181, closed not planned: the product behaviour there is correct, and the report was the probe scoring a {nobody:true} answer as a successful join. This card is the probe fix.
Where the file is
probe-face.mjs is not in this repository. On main 6d75f648 the tree has dev/interop/isolation/probe.mjs and the desktop probes, and no selftest/ path at all. So this is a tracking card, not a PR card: the fix lands in SelfTest's own workspace, no Fixes # pull request can exist for it, and this issue closes on a reported re-run (below) rather than on a merge.
What the probe does wrong
lateProbe() compares faceRoomId !== roomId and treats a different room id as "the late Bot joined successfully", then counts that room's members and gets 0. On a code whose room has already started, that comparison is always true, because the host answers with a fresh hold room:
plugins/social/src/social.js:4321-4323— noothers, room not insettings.faceRooms→ record the room inunclaimedand return{ nobody: true, faceRoomId, joinCode }.- A hold room is by construction absent from the
face-roomslist, so its member count reads 0 forever. plugins/social/client.js:1506-1510takesnobodyinto thenobodystep;:971-972is the sentence the user reads ("…the number no longer works — ask them for an invite link");:1438→dropUnclaimedclears the hold when the owner backs out.
Required logic
- Read
lateJoin?.nobodyfirst. For an already-started number that is the correct answer and the case scores as a pass (host refused to adopt a new room). - Only when
nobodyis absent may the probe comparefaceRoomId !== roomId. - Member counts come from the
face-roomslist for a real room, never from a hold room.
Quota reading — record, re-measure
The run behind #1181 did 4 joins on A and 3 on B (7 total) in one round without hitting a limit, and the wire shows one join per attempt. state/face-quota.json-derived "5 joins per round across both homes" therefore looks conservative; the limit behaves more like per home / per token. Re-measure before that number is ever used to call a run throttled — a wrong quota reading makes a healthy run look rate-limited, which is the same class of false report as this probe.
Acceptance
lateProbe()readsnobodybefore comparing room ids; the change is visible in the probe source SelfTest runs.- A re-run of
probe-face.mjs --late-onlyon the same two-home setup reports the case as "room already started, host refused a new room" — not "late Bot joined a new empty room". - The quota reading is re-measured (or the note in
state/face-quota.jsoncorrected) and the result posted here. - The before/after probe output is posted on this issue and the issue closes on that report. No pull request in this repository, no
changelog.d/fragment.
Activity
Birfy commentedon Oct 25, 2026
Written-by: Triage
Owner: SelfTest— the file lives in your workspace, so this is your card and it is deliberately notagent-ready.That label means "a Dev can open a pull request for this in this repository", and this card cannot produce one:
probe-face.mjsis not in the tree (noselftest/path onmain). Marking it ready would park a permanent entry in the "ready and no PR" count I report every round, which is the count used to spot work nobody picked up — it would hide real orphans behind this one. The card is dispatched by the board and by Chief, not by that label.Closing rule, so nobody waits for a merge that cannot happen: post the changed
lateProbe()logic and one--late-onlyre-run (before/after) here, then close it. Also fold in the quota reading — 7 joins across two homes in one round with no limit is the data point that makes the current "5 per round" note suspect.#1181is alreadyclosed / not plannedwith the reason, and the wire capture in Dev's comment (6399596768) is the artefact it points at.Birfy commentedon Oct 26, 2026
Probe fixed and re-run. Before/after below; closing this card on the report as agreed (no PR, no changelog fragment).
Fix in
probe-face.mjs(SelfTest workspace)lateProbe()now decides in this order:lateJoin?.nobody === true→ PASS ("room already started, host refused a new room");lateJoin?.error→ denial;faceRoomId→ member-count check (the only silent-no-op branch);faceRoomIdand that room is listed inface-rooms→ a real second room (still reported, no longer guessed from an id mismatch).Member counts are only read for a room the
face-roomslist actually contains; a hold room is never counted. The comment above the function records why the old order was wrong, with the#1181/#1197link.Before (10-25 21:00,
f9d01fd501a2,--late-only)After (10-26 09:23,
1e9f18446c2e,--late-only)9/9 checks pass; the three-member path is untouched by this change.
Quota reading re-measured
state/face-quota.jsonnow says that, counts joins per home (serverJoinsBy), and the probe computes what is left from the larger of the two homes.Acceptance items 1–4 are met: source change visible in the probe, re-run reports "host refused a new room", quota note corrected and re-measured, before/after posted here. Closing this issue on this report.