zebra-report/docs/tickets/0002-fedora-firefox-cannot-share-camera.md
Russell Ballestrini c361a0304f
docs: compress CLAUDE.md + ticket 0002 diagnosis + cross-refs
CLAUDE.md "Audio jitter buffering" section was the longest in the file
(~70 lines of restated rules). Collapse to a 5-rule list with pointers
to memory + tickets for the deep dives. The old structure restated
content that already lived in feedback_audio_jitter_buffer_strategy
and the per-defect tickets.

Telemetry + tickets sections compressed similarly. Same content,
fewer words, plus explicit pointers so a future session knows where
to look for the canonical version of each rule.

Ticket 0001 grows a Cross-references section pointing back to
CLAUDE.md + memory + the pinning test.

Ticket 0002 (firefox camera) updated with the signal-log diagnosis:
every attempt shows "The request is not allowed by the user agent or
the platform in the current context." = NotAllowedError fired
instantly, no permission prompt. Conclusion: firefox has a remembered
"Block" for the origin. picked.cam= is empty so it isn't the saved-
deviceId case. Lays out two prongs: user-side permission reset
(immediate) and code-side NotAllowedError handling (next pass) so the
page surfaces a user-friendly notice instead of just logging the error
text. Cross-refs to CLAUDE.md telemetry section + the catch site.

docs/tickets/README.md gets a "See also: CLAUDE.md" pointer up top so
the loop closes from the ticket index back to the shared context.

Memory side wired bidirectionally: chromium-decoder-anchor and
audio-jitter-buffer-strategy now point at CLAUDE.md + ticket 0001.
2026-06-07 20:19:33 -04:00

4.2 KiB

0002: fedora firefox cannot share camera

Status: open (diagnosis pinned; awaiting user-side action + retest with new telemetry) Priority: High (feature unavailable) Surface: fedora firefox — speaker / host attempting to publish camera First seen: 2026-06-06 Reporter: fox (blanka identity)

Symptom

Click "share camera" on fedora firefox → instant pub.camera: off → acquiring → off [FAILED] cycle. Chrome on the same machine shares camera fine. Mic publish works (so general WebRTC + permission grants are not all broken).

Telemetry

Every attempt in /var/log/zebra-spaces-signal.log produces the same verbatim error:

click: btn-camera-share
pub.camera: off → acquiring [START]
camera open cancelled: The request is not allowed by the user agent or the platform in the current context.
pub.camera: acquiring → off [FAILED]

Captured pre-deploy of the Jun 6 telemetry improvement (no e.name, no constraints: suffix). Next attempt on the live page will surface both, but the error text is already definitive.

Session fingerprint (latest):

session: ua=firefox/desktop ctx={sr=48000 baseLat=0.0000 sinkSupp=0 sink=n/a}
        devs={out=1 in=2 cam=1} picked={mic=dmV7HOOY cam= spk=+tR1ptfV}
  • picked.cam= is empty → no saved cameraDeviceId. Not the OverconstrainedError + stale-id case my Jun 6 auto-recovery handles.
  • devs.cam=1 → firefox enumerates one camera. Hardware is there.
  • Error fires within the SAME SECOND as the click → no permission prompt is being shown.

Diagnosis

Firefox's error text "The request is not allowed by the user agent or the platform in the current context" maps to NotAllowedError. On a fresh request, Firefox shows a permission prompt. The instant-fail signature means Firefox has a remembered "Block" for the origin (www.unturf.com) on camera — most likely the user (or a previous version of the page) dismissed the prompt with "Block" + "Remember this decision," and Firefox auto-denies forever after.

Mic permission is independent and was granted separately, which is why audio publish works.

This is NOT a code defect — the page's getUserMedia call is correct and chrome accepts the identical call. But the page can still help the user recover.

Path forward

Two prongs:

Prong 1 — user-side recovery (immediate)

  1. Visit www.unturf.com/zebra-report/ (or wherever the page is loaded from).
  2. Click the lock icon in the URL bar → Connection secureMore informationPermissions tab.
  3. Find Use the camera → uncheck "Use Default" → select Allow (or Always Ask).
  4. Reload, click share camera.

Alternative: about:preferences#privacy → scroll to PermissionsCamera → Settings… → find the origin → change from Block / remove the entry.

Prong 2 — code-side help (next code pass)

When e.name === 'NotAllowedError', the page should surface a non-technical user notice with the recovery steps above, AND suggest clicking the camera-icon in Firefox's URL bar (Firefox shows that icon after a blocked permission, click → "Always Allow" without leaving the page).

Don't auto-retry — Firefox won't change its decision until the user acts. Show the notice, log the breadcrumb, leave the FSM in off.

Fix

Pending. After fox's user-side recovery + retest with the Jun 6 telemetry live (showing e.name), I'll add prong 2 to sfuPublishCamera's catch.

Cross-references

  • CLAUDE.md "Telemetry" section — how to grep the signal-server log for these events.
  • The catch site in web/zebra-spaces.html is sfuPublishCamera (search camera open cancelled).
  • Auto-recovery for OverconstrainedError + saved deviceId already landed Jun 6; this prong covers the orthogonal NotAllowedError case.

Status notes

  • 2026-06-07: diagnosis pinned via signal-server log grep. Five identical instant-fail attempts across 4 sessions over 2 days. No prompt shown → Firefox saved-block on origin. Awaiting fox permission reset + retest.
  • 2026-06-06: Jun 6 telemetry improvement (e.name + constraints suffix) deployed. Auto-recovery for the saved-deviceId case shipped but doesn't apply here (picked.cam is empty).