Skip to content

test(audio-quality): report push-to-talk latency on the browser defaults - #8364

Merged
kixelated merged 6 commits into
mainfrom
quest/m1/push-to-talk-latency
Nov 10, 2026
Merged

kixelated merged 6 commits into
mainfrom
quest/m1/push-to-talk-latency

Conversation

@kixelated

@kixelated kixelated commented Nov 9, 2026 •

Copy link
Copy Markdown
Collaborator

Quest: quest/m1/push-to-talk-latency.md (this PR finishes and deletes it)

Summary

  • just test push-to-talk now runs the browser defaults: 20 ms Opus and <moq-watch> delay: "auto". The fixed 300 ms delay and 60 ms / 128 kbit/s Opus row is dropped, per the 2026-11-04 and 2026-11-06 decisions, now that Watch's stretch (moq-dev/moq#8058) has landed. The native listener is unchanged (--delay 300ms), since native playback is out of scope.
  • summary.json and the printed report add latency.onset: the press to the render onset, which is the press-to-audible latency excluding device output. The path breakdown already splits it.
  • ptt-analyze.ts reports onset, underruns, and stalls (browser and native) and no longer fails on any of them. It still fails on every completeness check: missing heads, unencoded, unsent, or unreceived audio, reopened capture or subscription, a new encoder, a dropped rendition, a native utterance not resuming on its head, a mute without comfort noise, and no native playback at all.
  • The analyzer's test fixture moves to the defaults (20 ms frames, 60 ms delay). The underrun and stall tests now assert the reported counts, including the native window's edges.
  • Deletes the quest and its link in quest/m1/README.md. grading now records that push-to-talk's underruns are reported and judged there.

Measurement on kixtop, 2026-11-09

macOS 26 MacBook Air, headless Chromium 156, local relay. Only the browser half ran: the harness's native listener plays into a PulseAudio null sink (test/lib/pulse.py), and macOS has no PulseAudio. Load average was 10 to 12 from other agents' builds. Every browser completeness check passed: all 44 heads arrived, with nothing unencoded, unsent, or unreceived.

Part (ms) median max
capture 2.3 11.4
packetization 14.7 19.7
encode 0.7 0.9
network 2.9 4.1
decode 0.6 2.1
jitter buffer 39.5 59.5
render 14.5 30.2
press to render onset 77.8 105.8
device 260.6 262.3
  • "auto" target: 40 / 60 / 80 ms (min / median / max over the presses). Spread: 14 / 60 ms.
  • Browser playback: 17 underruns, 8 stalls. On the loaded Linux agent host the same day it was 596 / 136, and on kixtop before the stretch (2026-11-05) it was 10 / 9.
  • device was Bluetooth headphones, kixtop's default output that day. On 2026-11-05 it was the built-in speakers at 54 ms.
  • The Linux harness check (2026-11-09, load average 3 to 5) had an onset of 56 / 83 ms.

Local checks: just check passed, and bun test ptt-analyze.test.ts had 14 pass.

Public API and wire impact

None. These are test harness changes only.

Decisions

  • Onset (maintainer, /quest-unblock, 2026-11-09): ✅ report only, no gate (rejected: a 140 ms gate from the kixtop max times 1.25, an arbitrary gate). ptt-analyze.ts reports onset median and max and never fails on them.
  • Underruns (maintainer, /quest-unblock, 2026-11-09): ✅ report only; the audio grading quest owns judging them (rejected: a provisional ceiling from kixtop plus a branch Nightly; keeping the zero check and waiting for the stretch model). This replaces the earlier /quest-complete decision to gate on a measured ceiling after the stretch model.
  • Keep completeness checks as failures (maintainer, /quest-unblock, 2026-11-09).
  • Stalls and the native listener (agent, for review): treated the same as browser underruns, reported and not gated, since the earlier decisions always paired underruns with stalls and the native zero gate with the browser one. "No native playback from the first press" stays a failure, as completeness.
  • Quest file (agent, for review): the brief asked to record these decisions in the quest's Plan and rewrite its Goal, but with them nothing in the quest remains, so this PR deletes it as the quest guide requires of a finishing PR. The decisions live here instead.

Models

Size: M
Implementer: Claude Code, claude-opus-5-5, medium effort (iterate, M)
Implementer: Claude Code, claude-opus-5-5, medium effort (iterate, M)

Suggested follow-up

  • Drop: the earlier suggestion to investigate the Linux host's 596 underruns. Underruns are now the grading quest's to judge, and kixtop's 17 against 10 before the stretch points to host load.

(Written by Claude Opus 5.5 with medium effort)

Review

Rewritten by quest review after each round.

  • Reviewer: Codex, gpt-6.1-sol, medium effort
  • Session: 01a1c343-7324-78a3-b34d-343970510f4c, round 1
  • Head: 5fec26f
  • Base: origin/main at 66a0b1f
  • Score: 9/10, No actionable defects were found; the default-settings measurement and report-only latency, underrun, and stall behavior match the recorded decisions, though builds and tests were not run as instructed.
  • Findings: none

kixelated and others added 2 commits November 9, 2026 02:57
Drop the fixed 300 ms delay and 60 ms / 128 kbit/s Opus from the page, so
just test push-to-talk measures what a listener gets: 20 ms Opus and
delay "auto". Report latency.onset, the press to the render onset, which
the press-to-audible budget will gate once it is measured on kixtop.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@kixelated kixelated changed the title Push-to-talk's press-to-audible latency fits a budget on the defaults test(audio-quality): budget push-to-talk latency on the browser defaults Nov 9, 2026
kixelated and others added 3 commits November 9, 2026 16:40
Set from a kixtop run on the browser defaults (106 ms max x 1.25, rounded
up), and move the analyzer's fixture to 20 ms Opus and a 60 ms delay.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…gating

Per the 2026-11-09 maintainer decisions: drop the 140 ms onset budget and the
browser and native underrun/stall failures; keep completeness checks. This
finishes the push-to-talk latency quest.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@kixelated kixelated changed the title test(audio-quality): budget push-to-talk latency on the browser defaults test(audio-quality): report push-to-talk latency on the browser defaults Nov 10, 2026
@kixelated
kixelated marked this pull request as ready for review November 10, 2026 02:23
@coderabbitai

coderabbitai Bot commented Nov 10, 2026

Copy link
Copy Markdown
Contributor

Warning

Review limit reached

You'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 3 minutes.

Check out review usage here.

View limit details

Limit details: You’ve used all 4 included reviews currently available.

Learn how review limits work.

Review configuration:

Run configuration

  • Source mode: Auto
  • Repository: Unavailable
  • Branch: Unavailable
  • File: No configuration file from this repository applied
  • Commit: Unavailable
  • Layers: Organization UI
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: 7d4de95e-89be-4e7b-a010-dcb8f062e309
Commits

Reviewing files that changed from the base of the PR and between d9800c1 and 5fec26f.

Files selected for processing: 8

  • quest/m1/README.md
  • quest/m1/audio-jitter-target/grading.md
  • quest/m1/push-to-talk-latency.md
  • test/audio-quality/README.md
  • test/audio-quality/clients/js/ptt-analyze.test.ts
  • test/audio-quality/clients/js/ptt-analyze.ts
  • test/audio-quality/clients/js/src/ptt.ts
  • test/justfile
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

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.

Share

@kixelated kixelated left a comment

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Automated review by review (OpenAI)

Reviewed head: 5fec26f
Base: d9800c1

No actionable findings. Removing the overrides selects the actual 20 ms Opus and "auto" browser defaults. The new onset metric excludes projected device output and leaves ambiguous zero-gap presses out of its summary. The report-only latency/underrun/stall behavior matches the recorded direction, while the existing head, delivery, capture/subscription lifecycle, native resume, and comfort-noise completeness checks remain failures.

Verification: GitHub-only static review of the patch, analyzer and fixtures, measurement/driver paths, current defaults, and documentation. No builds, tests, browser/native playback, or hardware measurements executed. The fixtures exercise the changed report-only counters but do not directly assert the new onset summary. Check is still in progress.

@kixelated
kixelated added this pull request to the merge queue Nov 10, 2026

@pullfrog pullfrog Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ℹ️ No blocking issues. One stale comment in the driver's setup, and the new onset field is not asserted in the fixture test.

The default-settings change, the report-only onset/underrun/stall behavior, and the quest deletion all match the decisions recorded in the PR. bun test test/audio-quality/clients/js/ptt-analyze.test.ts passes 14/14 here, and the quest deletion leaves no dangling references.

The comment in test/audio-quality/clients/js/ptt.ts still describes the native listener as joining "at the same fixed delay" as the page's listener. The page's watch now uses delay: "auto", so the native listener is the only one with a fixed 300 ms delay. The comment is now wrong in the file this PR edits.

Separately, the new latency.onset and press.onset fields are never asserted in the fixture test. The "complete run" test checks latency.playout and press.path, but not the new onset, so the field's arithmetic could regress without a test failure. A one-line assertion on press.onset (and its latency.onset summary) would lock the new field.


Note: 2 inline comment(s) dropped because they did not anchor to lines inside the PR diff:

  • test/audio-quality/clients/js/ptt.ts:86 (RIGHT) — file not in PR diff
  • test/audio-quality/clients/js/ptt-analyze.test.ts:106 (RIGHT) — line 106 (RIGHT) is not inside a diff hunk

Pullfrog  | Fix it ➔ | View workflow run | Using deepseek-v4.1-flash-1017 (free via Pullfrog for OSS) | 𝕏

Merged via the queue into main with commit 940a1ac Nov 10, 2026
8 checks passed
@kixelated
kixelated deleted the quest/m1/push-to-talk-latency branch November 10, 2026 02:46
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant