zebra-report/web
Russell Ballestrini 54f97866a2
zebra-spaces: keep mesh on role change, drop all publishes on demote, no looked-away noise
Three defects fox hit in one demotion. Fixes:

1) 'looked away' triggered on every demoted person.
   Cause: dropping the user's screen/camera tile in sfuUnpublishX during
   demotion fired pickNextSpotlight → broadcastSpotlight with empty key
   → every peer logged 'X looked away'. False signal — they didn't look
   away, the room tore their tile.
   Fix: inRoleTransition flag set inside onRoleChanged(); broadcast-
   Spotlight() short-circuits when true.

2) Speaker links not severed — they could keep talking to listeners.
   Cause: onRoleChanged tore down mic+sfuPubPC but NOT screen / camera /
   game publishes. Listeners kept seeing the demoted user's mic +
   screen via the now-orphan publishers.
   Fix: demotion now awaits sfuUnpublish + sfuUnpublishScreen +
   sfuUnpublishCamera + sfuUnpublishGame.

3) Mesh peers were torn automatically on demotion (per fox: 'never drop
   people out of the mesh automatically').
   Cause: both onRoleChanged AND the other-side handler in case
   'role-change' called tearPeer when a member became listener.
   Fix: removed both tearPeer calls. Mesh connections ride as a
   back-channel until one side actually leaves the room. Promote
   path still connects (idempotent, only when both can speak and
   the peer doesn't exist).

The 'demoted user can't see screen-shares' part of fox's report is
likely a sub-PC renegotiation race during the multi-unpublish — diagnostic
log lines from earlier commit (bc7bbbf) should help us narrow it down
once fox reproduces and pastes the log.
2026-06-02 14:45:15 -04:00
..
blog phase 1: unfirehose reconstruction from session JSONL ingest 2026-05-27 13:51:14 -04:00
fonts phase 2: gap analysis — cat>> append + binary asset recovery 2026-05-27 13:54:19 -04:00
chat.html css: .row uses minmax(0, max-content) so long labels shrink + wrap 2026-06-02 09:27:55 -04:00
host-your-own.html zebra: dark mode default on all pages + unified theme key 2026-06-01 22:18:02 -04:00
how-it-works.html zebra: dark mode default on all pages + unified theme key 2026-06-01 22:18:02 -04:00
index.html web: bump mobile body padding from 1rem to 1.25rem so the right edge has visible breathing room 2026-05-31 14:13:25 -04:00
kernel.html web: bump mobile body padding from 1rem to 1.25rem so the right edge has visible breathing room 2026-05-31 14:13:25 -04:00
stamp.js web: stamp each zebra-report page with build date + md5/sha256 2026-05-28 17:50:12 -04:00
zebra-audio.html css: .row uses minmax(0, max-content) so long labels shrink + wrap 2026-06-02 09:27:55 -04:00
zebra-spaces.html zebra-spaces: keep mesh on role change, drop all publishes on demote, no looked-away noise 2026-06-02 14:45:15 -04:00