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.
115 lines
4.2 KiB
Markdown
115 lines
4.2 KiB
Markdown
# 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 secure** →
|
|
**More information** → **Permissions** 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 **Permissions**
|
|
→ **Camera → 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).
|