Repository navigation
quest: plan native playback in the push-to-talk acceptance proof - #8038
Conversation
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Warning Review limit reachedYou've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository. Next included review available in 11 seconds. View limit details
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. |
kixelated
left a comment
There was a problem hiding this comment.
Automated review by review (OpenAI)
Reviewed commit: c93ceb5
No actionable findings in this planning-only change. The child quest is linked from the push-to-talk epic, keeps the native listener on a separate session through the same ideal-path relay, and preserves the latency quest's browser-only scope.
The implementation direction matches the current harness and CLI: moq play --metrics requires --video off, and its existing samples expose gaps and stalls but do not identify each utterance's first decoded frame or directly prove comfort-noise playback. The plan appropriately calls for extending the native metrics instead of inferring that evidence from the script. Those assertions remain work for the implementation; this PR adds no playback or test coverage itself.
Verification: GitHub-only static review of both changed files, the parent/latency quests, push-to-talk analyzer, native harness, and CLI metrics. I did not run the harness or listen to native output. Hosted Check was still running when inspected.
There was a problem hiding this comment.
ℹ️ Minor suggestions only — the plan is sound; two gaps would bite the implementer.
Reviewed changes
- New child quest:
quest/m1/push-to-talk/native.mdplans a nativemoq play --metricslistener beside the browser one injust test push-to-talk, held to the epic's lost-head, comfort-noise, and underrun checks, with native latency explicitly out of scope. - Epic link: the push-to-talk epic gains a
## Requiredentry for the child, matching the pattern the other m1 epics use.
I verified the plan's premises against the tree: the harness path and goal exist, the pulse native rows never mute, --metrics requires --video off, and the browser listener is fixed at 300 ms. quest check conventions and the link targets look correct.
ℹ️ The comfort-noise check can't be graded from --metrics as it stands
quest/m1/push-to-talk/native.md:8-9 promises the native listener is held to "each muted span's declared silence plays as comfort noise", but the metrics only carry quanta and quiet, and a quantum counts as quiet below about -60 dBFS — exactly where comfort noise is synthesized. A player that filled the mute with zeros would look identical. The plan already accepts extending --metrics for the lost-head question; the same extension is needed for this one, or the check degrades to "no gap or stall across the mute".
Technical details
# Comfort noise is indistinguishable from digital silence in `--metrics`
## Affected sites
- `quest/m1/push-to-talk/native.md:8-9` — the acceptance check that a muted span plays comfort noise
- `rs/moq-cli/src/play/metrics.rs:32-56` — `Sample` carries `quanta`/`quiet` and no rendered level
- `rs/moq-audio/src/playback/observe.rs:23` — a quantum is quiet below about -60 dBFS RMS
- `rs/moq-audio/src/playback/sink.rs:225` — comfort noise plays at the quietest 20 ms heard, at most -60 dBFS
## Required outcome
A native run must be able to distinguish comfort noise from zeros through a mute, not only prove no gap or stall.
## Suggested approach
Add rendered peak or RMS (or the comfort level) to the metrics sample, in the schema the audio-quality analyzer reads, then assert non-zero low-level audio across each muted span.ℹ️ The native listener's invocation is underspecified
quest/m1/push-to-talk/native.md:28-30 names only --video off, but CI has no audio device: the listener needs the private PulseAudio null sink test/lib/pulse.py (as native-play and the native audio-quality rows use), and ptt.sh currently builds only moq-relay, not a moq with moq-cli/play. --metrics also takes a path and writes NDJSON that test/audio-quality/clients/js/analyze.ts reduces — the player reports no underrun verdict — and --delay 300ms should be pinned to match the browser listener.
Technical details
# The native listener's setup is underspecified
## Affected sites
- `quest/m1/push-to-talk/native.md:28-30` — the plan names only `--video off`
- `test/audio-quality/ptt.sh:23` — builds `moq-relay` only
- `test/native-play/run.sh:19-25` — builds `moq-cli` with `moq-cli/play` and wraps the player in `test/lib/pulse.py`
- `test/audio-quality/run.sh:347-355` — native rows run through a per-row PulseAudio null sink
- `test/audio-quality/clients/js/src/ptt.ts:129` — the browser listener is fixed at `delay 300ms`
## Required outcome
The plan lists every prerequisite and condition that differs from the browser listener: the null sink, a `moq` binary with the `play` feature, `--metrics <PATH>` plus the analyzer that reduces it, and the 300 ms fixed delay.
## Suggested approach
Run the listener through `test/lib/pulse.py` like `native-play`, add `moq-cli/play` to the build in `ptt.sh`, pass `--delay 300ms`, and feed the samples file through the audio-quality analyzer.deepseek-v4.1-flash-1017 (free via Pullfrog for OSS) | 𝕏

Plans Push-to-talk's acceptance proof covers native playback, a child of the m1 Push-to-talk epic. It's a follow-up from moq-dev/moq#8010, queued 2026-11-06, which gave native playback comfort noise for declared silence with only unit tests behind it.
just test push-to-talkgains a nativemoq play --metricslistener beside the browser one. It's held to the epic's correctness checks (no lost utterance head, comfort noise in declared silence, no underrun or stall), and native latency stays unbudgeted.Decisions (maintainer, 2026-11-06)
Should push-to-talk's acceptance proof run a native listener?
pulserows are enough)Review
Codex (gpt-6.1-sol, medium) round 1 on c93ceb5: no findings.
Public API and wire impact: planning only. Wire: none.
(Written by Claude Opus 5.5 with high effort)
🤖 Generated with Claude Code