From 754a48b5e03e0082bd13ed165510f9eb8ddcca95 Mon Sep 17 00:00:00 2001 From: Luke Curley Date: Tue, 10 Nov 2026 01:14:25 -0800 Subject: [PATCH 1/3] chore(quest): claim quest/m1/audit-merge.md Quest-Claim: 04eef22c3e5ed82c From b10d02795d5ced148d6b62dced349eb6dceb5941 Mon Sep 17 00:00:00 2001 From: Luke Curley Date: Tue, 10 Nov 2026 01:29:10 -0800 Subject: [PATCH 2/3] quest: merge the 13 recurring audits into six that carry plans, not results Co-Authored-By: Claude Opus 5.5 --- quest/m0/ci/trim.md | 3 +- quest/m1/README.md | 1 - quest/m1/audit-merge.md | 40 --- quest/m2/api-shape/README.md | 2 +- quest/m2/ietf-scope/README.md | 2 +- quest/m3/README.md | 19 +- quest/m3/audit-ci.md | 448 --------------------------- quest/m3/audit-code.md | 86 +++++ quest/m3/audit-compile-time.md | 339 -------------------- quest/m3/audit-cost.md | 140 +++++++++ quest/m3/audit-dead-code.md | 88 ------ quest/m3/audit-deps.md | 255 --------------- quest/m3/audit-docs.md | 78 ++--- quest/m3/audit-interop.md | 203 +++--------- quest/m3/audit-lints.md | 148 --------- quest/m3/audit-perf.md | 228 ++++---------- quest/m3/audit-quests.md | 83 ----- quest/m3/audit-simplify.md | 107 ------- quest/m3/audit-size.md | 157 ---------- quest/m3/audit-test-cost.md | 125 -------- quest/m3/audit-test-coverage.md | 169 ++-------- quest/m3/ffi-future-size.md | 2 +- quest/m3/release/feature-flags.md | 5 +- quest/m3/vendor-sync/README.md | 2 +- quest/m3/vendor-sync/quinn.md | 2 +- quest/m4/ashpd-maintained.md | 2 +- quest/m4/askama-maintained.md | 2 +- quest/m5/native-compression-adopt.md | 2 +- 28 files changed, 403 insertions(+), 2335 deletions(-) delete mode 100644 quest/m1/audit-merge.md delete mode 100644 quest/m3/audit-ci.md create mode 100644 quest/m3/audit-code.md delete mode 100644 quest/m3/audit-compile-time.md create mode 100644 quest/m3/audit-cost.md delete mode 100644 quest/m3/audit-dead-code.md delete mode 100644 quest/m3/audit-deps.md delete mode 100644 quest/m3/audit-lints.md delete mode 100644 quest/m3/audit-quests.md delete mode 100644 quest/m3/audit-simplify.md delete mode 100644 quest/m3/audit-size.md delete mode 100644 quest/m3/audit-test-cost.md diff --git a/quest/m0/ci/trim.md b/quest/m0/ci/trim.md index be7975ac770..560748d3d36 100644 --- a/quest/m0/ci/trim.md +++ b/quest/m0/ci/trim.md @@ -34,7 +34,6 @@ kept it). Joins m0 because `cache.yml` is broken now (rule: broken CI is m0). `quest/**`; `main` lands only through the queue, which runs the quest checks. -Update the rows these change in [CI workflow audit](/quest/m3/audit-ci.md) -and any doc naming the removed workflows. +Update any doc naming the removed workflows. Public API: none. Wire: none. diff --git a/quest/m1/README.md b/quest/m1/README.md index f578c647594..e669a257291 100644 --- a/quest/m1/README.md +++ b/quest/m1/README.md @@ -45,7 +45,6 @@ moves what remains of them once their claims merge. - [A resumed QUIC client gives up on its own idle timer](/quest/m1/quic-resume-idle.md) - a client stopped past its idle timeout closes within about one timeout of resuming, without waiting on a stateless reset - [A reused moq-transport alias delivers a group that beats its SUBSCRIBE_OK](/quest/m1/ietf-alias-reuse.md) - a new SUBSCRIBE clears its track's alias tombstone, so moqxr's alias-0 catalog refetch no longer hangs - [Unused crates, scripts, and files are deleted](/quest/m1/unused-code.md) - moq-room, the moq-native tombstone, demo/throttle, sh/dart/publish.sh, demo/web's Solid deps, and unpublished packages' release notes go -- [The recurring audits are fewer and carry plans, not results](/quest/m1/audit-merge.md) - m3's 13 audits become about five, each a Goal plus a short check-first list - [The CARLA bridge builds outside the root workspace](/quest/m1/carla-workspace.md) - workspace builds stop compiling the demo bridge - [.github/ffi.md holds rules, not evidence](/quest/m1/ffi-doc-trim.md) - the FFI release doc drops one-off measurements for links to their PRs - [Draft publishing keeps the upload and drops changelog rewriting](/quest/m1/drafts-publish-trim.md) - `sh/drafts/publish.sh` and its test shrink to the datatracker upload diff --git a/quest/m1/audit-merge.md b/quest/m1/audit-merge.md deleted file mode 100644 index 52f59f85989..00000000000 --- a/quest/m1/audit-merge.md +++ /dev/null @@ -1,40 +0,0 @@ -# [M] The recurring audits are fewer and carry plans, not results - -## Goal - -m3's 13 recurring `audit-*.md` quests become about five, each a Goal plus a -short "check first" list. Results and baselines live in the PR that measured -them, not in the plan. - -## Plan - -Planned 2026-11-09 (maintainer, /quest-plan from the deletion audit). -Decided: ✅ merge the audits (rejected: keep 13 separate recurring audits). - -The 13 files total about 23.6k words, mostly result tables from past runs -(`audit-ci.md` alone is about 7,400 words describing one Nightly). -Several overlap: dead code against simplify, CI against test cost, and deps, -size, and compile time all trace back to dependencies. The same ~150-word -recurrence paragraph is copied into each. - -Recommended grouping, the implementer's call: - -- Cost: CI, test cost, compile time, artifact size, dependencies. -- Code: dead code, simplification, lints. -- Tests: coverage. -- Docs. -- Interop. -- Performance. - -Delete [quest tree audit](/quest/m3/audit-quests.md); `/quest-audit` does -that job. Keep each merged audit's "decided" carve-outs and the still-useful -"check first" items. Drop result tables, measured baselines, and history, -linking the PR that recorded them instead. Each merged audit keeps the -recurrence rule (successor added by the PR that finishes a run, behind the -[release cut](/quest/m3/release/cut.md)), stated once per file in a line or -two. Update m3's README links and anything else that links a merged file. - -[CI lane trims](/quest/m0/ci/trim.md) edits `audit-ci.md` rows; whichever -lands second adapts. - -Public API: none. Wire: none. diff --git a/quest/m2/api-shape/README.md b/quest/m2/api-shape/README.md index b754f23006d..616a1186001 100644 --- a/quest/m2/api-shape/README.md +++ b/quest/m2/api-shape/README.md @@ -32,7 +32,7 @@ work: before the cut, run a "public item used only by its definition" search over the published crates and JS packages and delete each hit, starting with `moq_tokio::Server::serve_both`, `hang::Catalog::to_json_pretty`, and `moq_audio::Format::{is_planar, is_float}`, the shortlist of -[the dead code audit](/quest/m3/audit-dead-code.md). The audit itself stays +[the code audit](/quest/m3/audit-code.md). The audit itself stays in m3 for private code. Decided 2026-11-09 (maintainer, on [moq-dev/moq#8302](https://github.com/moq-dev/moq/pull/8302): diff --git a/quest/m2/ietf-scope/README.md b/quest/m2/ietf-scope/README.md index 0fe228c3de0..aee996eddc7 100644 --- a/quest/m2/ietf-scope/README.md +++ b/quest/m2/ietf-scope/README.md @@ -41,4 +41,4 @@ AGENTS.md's IETF rule is reworded only if the maintainer asks. ## Related -- [Simplification audit](/quest/m3/audit-simplify.md) - owns duplication inside the IETF code that remains +- [Code audit](/quest/m3/audit-code.md) - owns duplication inside the IETF code that remains diff --git a/quest/m3/README.md b/quest/m3/README.md index e1ba55da519..9e174f801c3 100644 --- a/quest/m3/README.md +++ b/quest/m3/README.md @@ -121,22 +121,15 @@ federation) land. - [JS joining FETCH](/quest/m3/ietf-js-joining-fetch.md) - the JS publisher answers a joining FETCH that arrives after a quick finish, mirroring the Rust bound - [An Absolute join never races an older-history FETCH](/quest/m3/ietf-absolute-join-race.md) - reproduce #7680's suspected collision on main, then fix it or keep the test and delete - [A passing interop run stops publishers cleanly](/quest/m3/interop-shutdown-warnings.md) - no lingering publisher or unfinished-producer warning in a green interop run -- [Dependency and alternatives audit](/quest/m3/audit-deps.md) - every dependency earns its weight, preferring fewer, and the rest are current, deduplicated, and the best maintained option -- [Dead code and API surface audit](/quest/m3/audit-dead-code.md) - repeat the removal audit before the next major release +- [Cost audit](/quest/m3/audit-cost.md) - CI jobs, tests, dependencies, build time, and artifact size each earn their cost, deleted by default +- [Code audit](/quest/m3/audit-code.md) - unused code is deleted, overbuilt code simplified, and every lint suppression still needed +- [Test coverage audit](/quest/m3/audit-test-coverage.md) - behavior that matters is tested and every test runs in CI +- [Documentation audit](/quest/m3/audit-docs.md) - docs match the code, with no stale pages, broken examples or links, or undocumented exports +- [Performance audit](/quest/m3/audit-perf.md) - benchmarks that regressed are explained, fixed, or planned, and `main` ships no slower than `release` +- [Interop audit](/quest/m3/audit-interop.md) - our interop runner entries match what we ship, and every red interop cell with a moq.dev side is fixed, reported, or noted as down or unsupported - [Typecheck with bun check](/quest/m3/bun-check.md) - workspace packages typecheck through bun once nixpkgs ships bun 1.4.4 -- [Test coverage audit](/quest/m3/audit-test-coverage.md) - repeat the coverage audit against the m1 baselines after the next release ships -- [Documentation audit](/quest/m3/audit-docs.md) - repeat the docs audit after the release ships, against the m1 baselines -- [Test cost audit](/quest/m3/audit-test-cost.md) - the slowest, flakiest, and least valuable tests are deleted by default, or else fixed or planned, once the release ships -- [Quest tree audit](/quest/m3/audit-quests.md) - repeat the whole-tree audit after the release ships, against the m1 baseline -- [CI workflow audit](/quest/m3/audit-ci.md) - repeat the per-workflow and per-job review after the release ships, against the m1 baselines -- [Performance audit](/quest/m3/audit-perf.md) - benchmarks that regressed since the m1 run are explained, fixed, or planned, and unbenched hot paths get coverage -- [Simplification audit](/quest/m3/audit-simplify.md) - repeat the simplification audit, starting with the m1 leftovers, after the release ships -- [Artifact size audit](/quest/m3/audit-size.md) - repeat the shipping, native, and browser attribution after the release ships -- [Compile time audit](/quest/m3/audit-compile-time.md) - build-time hotspots are measured against the m1 baselines, starting with the transport share now that moq-net compiles once, and the worst are removed, made cheaper, or planned -- [Lint override and deprecation audit](/quest/m3/audit-lints.md) - repeat the suppression and deprecation audit after the release ships, starting with clippy on the macOS and Windows targets - [Clean ALSA playback onset](/quest/m3/audio-alsa-onset.md) - no onset restarts or clicks over PulseAudio - [Read a bus source's own samples](/quest/m3/audio-strip-tap.md) - a tap reads one source's samples before its delay with their bus-clock positions, for the studio's clap sync -- [Interop audit](/quest/m3/audit-interop.md) - our interop runner entries match what we ship, and every red interop cell with a moq.dev side is fixed, reported, or noted as down or unsupported - [moq-hls exposes each rendition's bound source](/quest/m3/hls-rendition-source.md) - playlists and segments report the source path and instance they read, so a cache can key on the source - [The memory bench finishes at 1 MiB frames](/quest/m3/memory-bench-hang.md) - the allocation mode's park at `size=1048576` is root-caused and fixed - [Audio's Latest start reaches back](/quest/m3/audio-latest-reach-back.md) - moq_audio's start covers min plus warmup like other consumers diff --git a/quest/m3/audit-ci.md b/quest/m3/audit-ci.md deleted file mode 100644 index 8a5fe235335..00000000000 --- a/quest/m3/audit-ci.md +++ /dev/null @@ -1,448 +0,0 @@ -# [M] CI workflow audit - -## Goal - -Every CI workflow and job earns its place: its results reach someone (a gate, -a Discord alert, or a published report) at a cost proportional to that signal. -Each one that doesn't is deleted by default, or else made cheaper or moved. Individual tests stay with -the [test cost audit](/quest/m3/audit-test-cost.md), and runner and cache -infrastructure with [CI cost and latency](/quest/m0/ci/README.md). - -## Plan - -Recurs once per major release (decided 2026-10-20). The PR that finishes -this run also adds the next one with the same file name at the end of m3's `Required`, which the shift after the next cut -brings into m1. The successor keeps the Goal and this -paragraph; the rest of its Plan is rewritten with what this run learned: the -per-workflow table, baselines, and what to check first. The successor also lists the -[release cut](/quest/m3/release/cut.md) under `Required`, so it waits for the -release in flight to ship. The parent milestone lists this quest under -`Required`. Only `/quest-delete` ends the recurrence. Fixes land in the run's -PR, one commit each, rather than as follow-ups. Only a change that needs a -maintainer decision (dropping a release target, scope) or is independently -landable and too large to review alongside the rest becomes a follow-up -through `/quest-plan`. - -Default to removing (decided 2026-11-01, maintainer): whatever doesn't earn its -cost is deleted inline, and the PR body lists each deletion with its measured -cost and why it wasn't worth it. Only what earns its keep is refactored to be -cheaper instead. Removing a public API or a user-facing feature stays a -follow-up. - -This audit owns workflows and jobs, including job-level build cost; the test -cost audit owns individual tests. Each run tables every workflow in -`.github/workflows/` and every job of the latest scheduled Nightly with three -verdicts: - -- **Signal:** what regression it catches that nothing cheaper catches, and - when it last caught one. -- **Visibility:** who sees a failure or a result. A gate blocks merging, a - scheduled or publishing workflow posts to Discord `#alerts` through - [alert.yml](/.github/workflows/alert.yml) (`just gh check` enforces its - coverage), and a report lands on the [Pages site](https://git.moq.dev/) or - in a job summary. A result only in a run artifact or log is invisible: - publish it, summarize it, or stop producing it. Each Pages report owns one - `gh-pages` directory, commits only that directory, deploys the whole branch, - and joins the `benchmark-pages` concurrency group with `queue: max` - (decided 2026-10-20; `sh/gh/pages-publish.sh`). -- **Cost:** runner-minutes by runner type, from the org billing API and job - timings, against that signal. macOS is the scarce one (a 5-job concurrency - cap). - -### Check first (off-cycle m1 audit, 2026-11-01) - -- The [benchmark history](https://git.moq.dev/bench/)'s `bench-gate-cost` rows: `module/*` is each `just ci` module's - wall and CPU seconds, run one at a time, in a cold gate without the Rust - cache and in the gate after a moq-net edit, flagged on the nights they moved. -- The latest scheduled [Nightly](https://github.com/moq-dev/moq/actions/runs/41313466339) - is still red: 152 jobs executed, 19 failed and one was cancelled; 28 tag-only - publishers or reused builders were skipped. Read failures by cause, not job count. - A green compile or an alert delivery is not proof of a caught product regression. -- New signal worth retaining on November 1: QUIC connection fuzzing found - `corrupt stream data` at `rs/moq-quic/src/fuzz/connection.rs:835`; the resume - model found missing group 0 after widening an unordered reader's range. - Gate, all-features and Windows exposed the relay stack test failure, already - owned by [moq-dev/moq#7595](https://github.com/moq-dev/moq/pull/7595). - These are reasons to keep the lanes, not reasons to disable their tests. -- Eight moq-net fuzz targets (announce, ietf, lite, pattern, ingest, varint, - request and path) failed to build with Rust E0391 while computing async drop - for `model::bandwidth::Consumer`; they did not run fuzzing. The six other - fuzz jobs ran, including the QUIC corruption above. Do not count a build - failure as eight independent fuzz findings. -- Other November 1 failures: Rust audit reports RUSTSEC-2026-0173; binding - benchmarks fail `benchmark_ffi`; Firefox media fails the codec-rename tone - check (69/78 samples); shared benches confirm six paired slowdowns; - supplemental benches lack 15 base comparisons after the baseline lacks - `moq-sign`; relay session benches panic with `Evicted`; Rust bench targets - reach measurement but are cancelled at 60.4 minutes. The paired calibration - in [Paired comparison](/bench/README.md#paired-comparison) says which paired - slowdowns to trust. [moq-dev/moq#7592](https://github.com/moq-dev/moq/pull/7592) already - verifies that the old paired-base Cargo alias blocker is past. -- Latest scheduled [Interop](https://github.com/moq-dev/moq/actions/runs/41317901057) - costs 48.2 Linux minutes and fails buffering, a catalog assertion, and the - removed `moq-transport-14` version. [moq-dev/moq#7553](https://github.com/moq-dev/moq/pull/7553) - owns the join-test version matrix. The relay-log self-test's empty, timeout - and pinned-round `FAIL` messages are intentional negative controls. - [TS](https://github.com/moq-dev/moq/actions/runs/41317281352) passes in 42.0 - Linux minutes. [Video](https://github.com/moq-dev/moq/actions/runs/41318496744) - fails an assertion in 7.8 Linux minutes; malformed attribute diagnostics - before it are expected test inputs. These tests stay with their owners. -- The earlier finite-track failures before draft 22 (`Error: old`, a JS - `RESET_STREAM`) retain their split ownership: [moq-dev/moq#7306](https://github.com/moq-dev/moq/pull/7306) - fixes the Rust publisher, including the removed WASM harness's quick-finish - case; [JS joining FETCH](/quest/m3/ietf-js-joining-fetch.md) owns the JS half. -- Visibility gaps retained with existing owners: Rust benchmark tests and - shipping sizes are measured but not on Pages yet; - [moq-dev/moq#7510](https://github.com/moq-dev/moq/pull/7510) publishes both. - Binding runner checks have a current consumer in rust2's pinned comparison; - they smoke-run here rather than claiming cross-night timing evidence. - Native audio rows are still non-enforced and artifact-only; the - [audio jitter target](/quest/m1/audio-jitter-target/README.md) owns their - reporting/budget decision. Do not delete that scope in a workflow cleanup. -- Concrete overlap: [moq-dev/moq#7600](https://github.com/moq-dev/moq/pull/7600) - owns test deletions; [moq-dev/moq#7601](https://github.com/moq-dev/moq/pull/7601) - owns dependencies; [moq-dev/moq#7602](https://github.com/moq-dev/moq/pull/7602) - owns source, generics and generated-code compile cost; - [moq-dev/moq#7598](https://github.com/moq-dev/moq/pull/7598) owns dispatcher - KVM testability; [moq-dev/moq#7593](https://github.com/moq-dev/moq/pull/7593) - owns io_uring grouping/diagnostics; [moq-dev/moq#7541](https://github.com/moq-dev/moq/pull/7541) - owns JS bench reachability. No infrastructure, cache or landing-gate work - is duplicated here. In particular, cache 5xx belongs to - [moq-dev/moq#7537](https://github.com/moq-dev/moq/pull/7537), and publisher - environments to [moq-dev/moq#7431](https://github.com/moq-dev/moq/pull/7431). -- Local full checks can hit upstream mbx E2BIG - ([moq-dev/moq#7594](https://github.com/moq-dev/moq/pull/7594)) and the runner-image - `/proc/self/uid_map` denial already reproduced on main. Neither justifies - bypassing the launcher, skipping a selected module, or claiming a full pass. -- Still deferred to the maintainer since m0: fold capture and play test - builds into the main test build (about 75 s per core Rust queue entry in - the earlier sample) or move both to Nightly. Keep both builds until decided. -- Recheck the previously unowned October 22 Windows-only - `reconnect::a_protocol_violation_ends_reconnect` failure. The test remains; - neither the November 1 relay-stack failure nor a merged fix proves it recovered. -- Keep operational lessons from the earlier audit: count infrastructure flakes - across nights before acting, and make failure uploads wait for their producing - step and run directory. Pages redeploys need the stale `github-pages` artifact - removed first; Nightly now does that through `just gh pages-clean`. -- Keep release target/artifact removal as a maintainer decision. Shared - default-feature FFI builds already feed Go/Kotlin/Swift/C/C++; Dart has a - different target set and packaging contract. Do not count their matching - target names as evidence of redundant outputs. - -### Baselines - -Timings below are elapsed runner-minutes, summed from every job's -`started_at`/`completed_at` in the REST jobs API, excluding skipped jobs. -They include setup, builds and teardown, not just workloads. They are neither -CPU-minutes nor billed rounded minutes, and overlapping workflow/caller rows -must not be added together. All observations were fetched November 1 local -(November 2 UTC); no workflow was dispatched for this audit. - -- October org billing for `moq`: Linux 309,940 minutes, Linux ARM 243,405, - macOS 62,756 and Windows 55,972; net charge $0. Source: - `GET /organizations/moq-dev/settings/billing/usage?year=2026&month=10`. - This is monthly attribution only. Do not infer a workflow's cost from it, - multiply a sample by invocation count, or confuse $0 with free capacity. -- Nightly on October 31: 1,402.1 minutes (ARM 767.0, Linux 292.2, - macOS 218.1, Windows 124.8). November 1: 1,505.7 (ARM 780.1, - Linux 303.6, macOS 282.1, Windows 139.9). Early failures make these - lower bounds on a fully successful run, not a performance trend. -- At the November 1 sample, main PRs skipped Check and `quest land serve` - ran `just ci` on the maintainer's host. Since that sample, - [moq-dev/moq#7612](https://github.com/moq-dev/moq/pull/7612) replaced it with - GitHub's single-PR merge queue on the self-hosted runner. Main PRs skip Check - and Queue; the merge group runs `just ci`. The prior hosted queue's - 5.5-minute median is obsolete; this audit claims no replacement host baseline. - Release PRs still run the full Check and Release gate. -- Removed from `nightly.yml`: audio grouping, shard sweep and relay profile - measurement jobs. Across all 13 scheduled nights, October 20 to November 1, - every one succeeded and no caught regression was found. They have no - comparison gate, summary or published series; successful numbers remain in - logs and the profile captures disappear with the runner. Local commands - stay useful for a specific investigation. Profile tooling's deterministic - tests still run through `gh test`; the scheduled capture smoke is dropped. - The jobs' actual cost, including setup, is: - -| Deleted Nightly job | Runner | 13-night minutes | November 1 minutes | Verdict | -| --- | --- | ---: | ---: | --- | -| Audio grouping relay benchmark | ARM | 200.5 | 13.8 | Delete scheduled measurement; keep on-demand diagnostic | -| Relay profiles | Linux | 356.4 | 29.6 | Delete scheduled measurement; keep on-demand diagnostic | -| Relay shard sweep | ARM | 190.2 | 12.1 | Delete scheduled measurement; keep on-demand diagnostic | - -The November 1 removed jobs total 55.5 runner-minutes (25.9 ARM, 29.6 Linux), -not a measured reduction in Nightly wall time. The 13-night total is 747.2 -runner-minutes; totals are calculated before rounding individual rows. -This is the only workflow changed in [moq-dev/moq#7603](https://github.com/moq-dev/moq/pull/7603). -The recurring audit and its release prerequisite remain; no successor is made. - -### Every workflow (2026-11-01) - -The 56 workflows checked in at the November 1 audit are listed below, plus -Queue added afterward. `N` costs are nested jobs in November 1 Nightly; `D` costs are the latest completed successful/failed direct -run in the fetched page (up to 100 runs since October 20). A reusable wrapper with no direct run is not zero cost: -its caller pays. Failure dates below are observations, not automatically unique -regressions. For retained lanes without an attributed regression since October -20, the signal column states the distinct boundary that earns their cost. - -All scheduled/publishing failures reach Discord through Alert; direct PR/push -validation reaches its GitHub check, not Discord. Pages or job summaries are -called out where they expose successful measurements. Artifacts are diagnosis, -not a visible report. Main branch cache writes are protected by `cache-write`; -release credentials remain under the existing publisher-environment work above. - -| Workflow | Unique signal / verdict | Result visibility | Sample runner-minutes | -| --- | --- | --- | --- | -| [alert](/.github/workflows/alert.yml) | Keep: delivers failures; coverage/delivery fixtures exercise the contract | Discord; coverage gate | [D 2026-11-01](https://github.com/moq-dev/moq/actions/runs/41322009598) Linux 0.1 | -| [android](/.github/workflows/android.yml) | Keep: Android cross-compilation and packaging beyond the native gate | Caller gate and Nightly alert | [N](https://github.com/moq-dev/moq/actions/runs/41313466339) Linux 3.4 | -| [api-diff](/.github/workflows/api-diff.yml) | Keep: release backport API compatibility, distinct from compilation | Release gate, summary/report | No executed direct sample since October 20; cost belongs to caller | -| [apt-repo](/.github/workflows/apt-repo.yml) | Keep: APT repository metadata, signatures and publication | Published repository/installer and alert | [D 2026-10-30](https://github.com/moq-dev/moq/actions/runs/41042492573) Linux 1.7 | -| [audio-quality](/.github/workflows/audio-quality.yml) | Keep: deterministic audio replay correctness; real-time quality is in Nightly | Caller gate and Nightly alert | [N](https://github.com/moq-dev/moq/actions/runs/41313466339) ARM 4.5 | -| [c](/.github/workflows/c.yml) | Keep: generated C bindings and installed-consumer ABI link | Caller gate / Nightly alert | [N](https://github.com/moq-dev/moq/actions/runs/41313466339) Linux 4.5 | -| [cache](/.github/workflows/cache.yml) | Keep, infrastructure-owned: publishes reusable shells on three hosts | GitHub status; no product regression claim | [D 2026-11-02](https://github.com/moq-dev/moq/actions/runs/41377533846) ARM 1.3, Linux 1.3, macOS 3.5 | -| [check](/.github/workflows/check.yml) | Keep: release admission; main admission now runs through Queue | Required Check; module timing summary | No completed direct sample in fetched page | -| [codspeed](/.github/workflows/codspeed.yml) | Keep: instruction counts separate layout/timing noise; explicit October 28 maintainer decision in bench-ci | CodSpeed dashboard; failure alert | [D 2026-11-02](https://github.com/moq-dev/moq/actions/runs/41368239240) Linux 63.2 | -| [cpp](/.github/workflows/cpp.yml) | Keep: C++ compiler and ABI consumer builds; not only Rust compilation | Caller gate and Nightly alert | [N](https://github.com/moq-dev/moq/actions/runs/41313466339) Linux 6.3 | -| [dependabot](/.github/workflows/dependabot.yml) | Keep: dependency PR policy and maintenance automation | Dependency PR state | [D 2026-11-02](https://github.com/moq-dev/moq/actions/runs/41372931202) Linux 0.6 | -| [docker](/.github/workflows/docker.yml) | Keep: container image build and multi-architecture publication | Caller gate/alert and release artifacts | [N](https://github.com/moq-dev/moq/actions/runs/41313466339) ARM 13.1, Linux 15.8 | -| [features](/.github/workflows/features.yml) | Keep: feature isolation and missing dependency gates | Caller gate and Nightly alert | [N](https://github.com/moq-dev/moq/actions/runs/41313466339) ARM 53.1 | -| [ietf-conformance](/.github/workflows/ietf-conformance.yml) | Keep: pinned third-party Moxygen protocol behavior | Nightly failure alert; reports are diagnostics | [N](https://github.com/moq-dev/moq/actions/runs/41313466339) Linux 29.8 | -| [interop](/.github/workflows/interop.yml) | Keep: cross-language protocol/media behavior | Discord and Pages interop report | [D 2026-11-01](https://github.com/moq-dev/moq/actions/runs/41317901057) Linux 48.2 | -| [moq-c](/.github/workflows/moq-c.yml) | Keep: C ABI packaging, fixtures and consumer links | Caller gate/alert and release artifacts | [N](https://github.com/moq-dev/moq/actions/runs/41313466339) ARM 10.4, Linux 12.2, Windows 14.9, macOS 23.7 | -| [moq-cli](/.github/workflows/moq-cli.yml) | Keep: CLI release archives and target-specific links | Caller gate/alert and release artifacts | [N](https://github.com/moq-dev/moq/actions/runs/41313466339) ARM 11.5, Linux 12.4, Windows 21.1, macOS 38.1 | -| [moq-gst](/.github/workflows/moq-gst.yml) | Keep: GStreamer plugin packaging and dynamic links | Caller gate/alert and release artifacts | [N](https://github.com/moq-dev/moq/actions/runs/41313466339) ARM 12.2, Linux 15.6, macOS 21.7 | -| [moq-relay](/.github/workflows/moq-relay.yml) | Keep: relay release archives and target-specific links | Caller gate/alert and release artifacts | [N](https://github.com/moq-dev/moq/actions/runs/41313466339) ARM 6.6, Linux 7.5, Windows 12.0, macOS 15.0 | -| [moq-sh](/.github/workflows/moq-sh.yml) | Keep: installer publication, fixtures and installed artifact smoke | Published repository/installer and alert | No executed direct sample since October 20; cost belongs to caller | -| [mutants](/.github/workflows/mutants.yml) | Keep: security/grant/resume/expiry test sensitivity, distinct from rerunning tests; newly added, no scheduled sample yet | Survivors in summary and failure alert | No completed direct sample in fetched page | -| [nightly](/.github/workflows/nightly.yml) | Delete three log-only relay measurement jobs; keep diff-independent coverage below | Discord, Pages, job summaries | [N](https://github.com/moq-dev/moq/actions/runs/41313466339) ARM 780.1, Linux 303.6, Windows 139.9, macOS 282.1 | -| [obs](/.github/workflows/obs.yml) | Keep: OBS consumer build and plugin packaging | Caller gate and Nightly alert | [D 2026-10-25](https://github.com/moq-dev/moq/actions/runs/40211940636) ARM 20.4, Windows 12.2, macOS 10.6 | -| [oss-scanner](/.github/workflows/oss-scanner.yml) | Keep: OSS Scanner container builds | Caller gate and Nightly alert | [N](https://github.com/moq-dev/moq/actions/runs/41313466339) ARM 9.2 | -| [platform](/.github/workflows/platform.yml) | Keep: macOS/Windows cfg, ABI, Swift and native test boundaries | Nightly/release gate alert | [N](https://github.com/moq-dev/moq/actions/runs/41313466339) ARM 0.2, Windows 18.2, macOS 57.5 | -| [pullfrog](/.github/workflows/pullfrog.yml) | Keep: explicitly dispatched agent work, no standing regression cost | Calling agent result / GitHub posts | [D 2026-11-02](https://github.com/moq-dev/moq/actions/runs/41378234938) Linux 3.5 | -| [queue](/.github/workflows/queue.yml) | Keep: exact-tree merge-group admission on the self-hosted runner; added after the audit sample | Required Queue context; build timings artifact | No cost sample in this audit | -| [quest](/.github/workflows/quest.yml) | Keep: validates direct pushes after quest-tree merges | GitHub Quest status; no Discord | [D 2026-11-02](https://github.com/moq-dev/moq/actions/runs/41378565460) ARM 0.4 | -| [release-binary](/.github/workflows/release-binary.yml) | Keep: shared target-specific binary packaging | Calling release workflow; not independently triggered | No executed direct sample since October 20; cost belongs to caller | -| [release-brew](/.github/workflows/release-brew.yml) | Keep: Homebrew publication | Caller gate/alert and release artifacts | [D 2026-10-30](https://github.com/moq-dev/moq/actions/runs/41042504830) Linux 0.3 | -| [release-c](/.github/workflows/release-c.yml) | Keep: generated C package and installed consumers over validated native inputs | Caller gate / alert and release artifacts | [N](https://github.com/moq-dev/moq/actions/runs/41313466339) ARM 3.0, Linux 2.6, Windows 7.5, macOS 4.6 | -| [release-cpp](/.github/workflows/release-cpp.yml) | Keep: C++ release artifacts and consumers | Caller gate/alert and release artifacts | [N](https://github.com/moq-dev/moq/actions/runs/41313466339) ARM 3.3, Linux 3.8, Windows 12.5, macOS 9.1 | -| [release-dart-ffi](/.github/workflows/release-dart-ffi.yml) | Keep: Dart native FFI artifacts | Caller gate/alert and release artifacts | [N](https://github.com/moq-dev/moq/actions/runs/41313466339) Linux 41.2, Windows 17.3, macOS 57.7 | -| [release-dart](/.github/workflows/release-dart.yml) | Keep: Dart package publication | Caller gate/alert and release artifacts | [N](https://github.com/moq-dev/moq/actions/runs/41313466339) Linux 0.4 | -| [release-ffi](/.github/workflows/release-ffi.yml) | Keep: shared FFI target builder | Calling release workflow; not independently triggered | No executed direct sample since October 20; cost belongs to caller | -| [release-gate](/.github/workflows/release-gate.yml) | Keep: complete release PR admission, including callable platform lanes | Caller gate/alert and release artifacts | [D 2026-11-02](https://github.com/moq-dev/moq/actions/runs/41376436029) ARM 0.2, Windows 6.5, macOS 4.4 | -| [release-go-ffi](/.github/workflows/release-go-ffi.yml) | Keep: Go native FFI artifacts | Caller gate/alert and release artifacts | [N](https://github.com/moq-dev/moq/actions/runs/41313466339) Linux 1.0 | -| [release-go](/.github/workflows/release-go.yml) | Keep: Go wrapper publication | Caller gate/alert and release artifacts | [D 2026-10-31](https://github.com/moq-dev/moq/actions/runs/41182420464) Linux 1.4 | -| [release-js](/.github/workflows/release-js.yml) | Keep: npm packages and exports | Caller gate/alert and release artifacts | [N](https://github.com/moq-dev/moq/actions/runs/41313466339) Linux 6.0 | -| [release-kt-ffi](/.github/workflows/release-kt-ffi.yml) | Keep: Kotlin native FFI artifacts | Caller gate/alert and release artifacts | [N](https://github.com/moq-dev/moq/actions/runs/41313466339) Linux 1.7 | -| [release-kt-lib](/.github/workflows/release-kt-lib.yml) | Keep: Kotlin wrapper artifacts | Caller gate/alert and release artifacts | [N](https://github.com/moq-dev/moq/actions/runs/41313466339) Linux 11.1 | -| [release-nix](/.github/workflows/release-nix.yml) | Keep: Nix release evaluation/publication | Caller gate/alert and release artifacts | No completed direct sample in fetched page | -| [release-py-ffi](/.github/workflows/release-py-ffi.yml) | Keep: Python native wheels | Caller gate/alert and release artifacts | [N](https://github.com/moq-dev/moq/actions/runs/41313466339) ARM 11.2, Linux 19.5, Windows 13.8, macOS 8.9 | -| [release-py](/.github/workflows/release-py.yml) | Keep: Python wrapper package | Caller gate/alert and release artifacts | [D 2026-10-31](https://github.com/moq-dev/moq/actions/runs/41182392402) Linux 17.6 | -| [release-rs](/.github/workflows/release-rs.yml) | Keep: Rust package release policy | Caller gate/alert and release artifacts | [D 2026-10-31](https://github.com/moq-dev/moq/actions/runs/41182420560) Linux 22.4 | -| [release-shared-ffi](/.github/workflows/release-shared-ffi.yml) | Keep: one native build per shared target; packages consume these outputs | Caller gate / alert and release artifacts | [N caller total](https://github.com/moq-dev/moq/actions/runs/41313466339) ARM 3.7, Linux 74.6, Windows 22.5, macOS 44.9 (includes nested Go/Kotlin/Swift packagers above) | -| [release-swift-ffi](/.github/workflows/release-swift-ffi.yml) | Keep: Swift native FFI artifacts | Caller gate/alert and release artifacts | [N](https://github.com/moq-dev/moq/actions/runs/41313466339) Linux 0.2, macOS 1.0 | -| [release-swift-lib](/.github/workflows/release-swift-lib.yml) | Keep: Swift wrapper publication | Caller gate/alert and release artifacts | [N](https://github.com/moq-dev/moq/actions/runs/41313466339) Linux 0.3, macOS 0.9 | -| [release-winget](/.github/workflows/release-winget.yml) | Keep: winget manifests and publication | Caller gate/alert and release artifacts | [D 2026-10-30](https://github.com/moq-dev/moq/actions/runs/41041265123) Windows 0.4 | -| [rpm-repo](/.github/workflows/rpm-repo.yml) | Keep: RPM repository metadata/signatures/publication | Published repository/installer and alert | [D 2026-10-30](https://github.com/moq-dev/moq/actions/runs/41042495150) Linux 2.4 | -| [runner-vm](/.github/workflows/runner-vm.yml) | Keep: persistent runner VM configuration and boot/image checks | Caller gate and Nightly alert | [N](https://github.com/moq-dev/moq/actions/runs/41313466339) Linux 7.1 | -| [smoke-toolchain](/.github/workflows/smoke-toolchain.yml) | Keep: coupled smoke tooling and Playwright update validation | Update PR and scheduled failure alert | [D 2026-10-26](https://github.com/moq-dev/moq/actions/runs/40353286871) Linux 1.3 | -| [smoke](/.github/workflows/smoke.yml) | Keep: published distribution and external-relay behavior | Discord and Pages relay report | [D 2026-11-01](https://github.com/moq-dev/moq/actions/runs/41325786483) Linux 55.6 | -| [ts](/.github/workflows/ts.yml) | Keep: TS container compliance and round-trip media integrity | Scheduled failure alert and release gate | [D 2026-11-01](https://github.com/moq-dev/moq/actions/runs/41317281352) Linux 42.0 | -| [uring](/.github/workflows/uring.yml) | Keep: io_uring compile and runtime/kernel contract | Caller gate and Nightly alert | [D 2026-10-20](https://github.com/moq-dev/moq/actions/runs/39372116327) ARM 7.7 | -| [video](/.github/workflows/video.yml) | Keep: browser video renderer behavior | Scheduled failure alert and release gate | [D 2026-11-01](https://github.com/moq-dev/moq/actions/runs/41318496744) Linux 7.8 | -| [x11](/.github/workflows/x11.yml) | Keep: SHM and GetImage native capture paths | Caller gate and Nightly alert | [N](https://github.com/moq-dev/moq/actions/runs/41313466339) ARM 6.2 | - -### Every job of November 1 scheduled Nightly - -These are the actual run's jobs, including skipped tag-only work. A retained -job's failure is delivered through the parent Nightly alert; `Pages` and -`summary` add successful-result visibility. Package/build rows are kept for -their workflow's distinct target/ABI/package contract above, not because each -successful target has demonstrated a regression. Skipped jobs cost zero and -are not extra nightly work. `Delete` is the decision applied by [moq-dev/moq#7603](https://github.com/moq-dev/moq/pull/7603); -all other rows are retained, with exceptions/owners stated below and above. - -| Job | Runner minutes | Result | Signal / visibility verdict | -| --- | ---: | --- | --- | -| [Audio quality](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124868517677) | ARM 42.0 | success | Real-time impaired audio budgets / alert; native reporting decision owned elsewhere | -| [Benchmark site](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124885762600) | ARM 0.7 | success | Pages delivery, not another measurement | -| [Docker / Build linux/amd64](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124868567167) | Linux 15.6 | success | Keep target/package contract above / failure alert; artifact is build input or diagnosis | -| [Docker / Build linux/arm64](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124868567176) | ARM 13.1 | success | Keep target/package contract above / failure alert; artifact is build input or diagnosis | -| [Docker / Parse tag](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124868517747) | Linux 0.1 | success | Keep target/package contract above / failure alert; artifact is build input or diagnosis | -| [Docker / Publish manifest](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124873286713) | 0.0 | skipped | Tag-only publication or native reuse; not executed | -| [Fuzz (announce)](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124868517606) | ARM 3.2 | failure | Fresh ASan fuzz inputs; E0391 build failure, no fuzzing | -| [Fuzz (connection)](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124868517730) | ARM 3.9 | failure | Fresh ASan fuzz inputs; corrupt stream data caught | -| [Fuzz (frame)](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124868517952) | ARM 8.3 | success | Fresh ASan fuzz inputs; crash alert/corpus | -| [Fuzz (ietf)](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124868517805) | ARM 3.1 | failure | Fresh ASan fuzz inputs; E0391 build failure, no fuzzing | -| [Fuzz (ingest)](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124868517897) | ARM 3.2 | failure | Fresh ASan fuzz inputs; E0391 build failure, no fuzzing | -| [Fuzz (lite)](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124868517868) | ARM 3.1 | failure | Fresh ASan fuzz inputs; E0391 build failure, no fuzzing | -| [Fuzz (packet)](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124868518136) | ARM 8.4 | success | Fresh ASan fuzz inputs; crash alert/corpus | -| [Fuzz (params)](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124868517933) | ARM 8.2 | success | Fresh ASan fuzz inputs; crash alert/corpus | -| [Fuzz (path)](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124868518085) | ARM 3.0 | failure | Fresh ASan fuzz inputs; E0391 build failure, no fuzzing | -| [Fuzz (pattern)](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124868517876) | ARM 3.0 | failure | Fresh ASan fuzz inputs; E0391 build failure, no fuzzing | -| [Fuzz (request)](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124868517993) | ARM 3.2 | failure | Fresh ASan fuzz inputs; E0391 build failure, no fuzzing | -| [Fuzz (streamid)](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124868517890) | ARM 8.4 | success | Fresh ASan fuzz inputs; crash alert/corpus | -| [Fuzz (streams)](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124868517961) | ARM 8.2 | success | Fresh ASan fuzz inputs; crash alert/corpus | -| [Fuzz (varint)](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124868517927) | ARM 3.1 | failure | Fresh ASan fuzz inputs; E0391 build failure, no fuzzing | -| [Media (firefox player)](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124868517779) | ARM 11.8 | failure | Firefox decode/lifecycle beyond Chromium / codec-rename alert | -| [Nightly (Audio grouping relay benchmark)](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124868518130) | ARM 13.8 | success | Delete: no regression gate or visible measurement | -| [Nightly (Audit)](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124868517879) | ARM 1.2 | failure | Time-dependent Rust advisory; RUSTSEC-2026-0173 alert | -| [Nightly (BBB rendition alignment)](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124868518050) | ARM 1.3 | success | Published fixture rendition alignment; correctness alert | -| [Nightly (Binding benchmark runners)](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124868517685) | ARM 37.4 | failure | Binding-runner contract used by rust2; correctness alert | -| [Nightly (Browser benchmark smoke)](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124868517775) | ARM 15.6 | success | Browser benchmark harness/output validity; correctness alert | -| [Nightly (Go audit)](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124868518270) | ARM 5.0 | success | Time-dependent Go advisories; alert | -| [Nightly (JS audit)](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124868517806) | ARM 1.1 | success | Time-dependent JS advisories; alert | -| [Nightly (JS benchmarks)](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124868517631) | ARM 9.8 | success | JS benchmark smoke / Pages series | -| [Nightly (JS coverage)](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124868517764) | ARM 7.0 | success | Instrumented JS test reachability / summary | -| [Nightly (OBS TSan)](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124868517771) | ARM 9.2 | success | Native consumer data races beyond ordinary tests; alert | -| [Nightly (OBS)](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124868517684) | ARM 9.0 | success | External staticlib/native-link consumer; alert | -| [Nightly (Python audit)](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124868517713) | ARM 1.1 | success | Time-dependent Python advisories; alert | -| [Nightly (Relay profiles)](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124868518097) | Linux 29.6 | success | Delete: no regression gate or visible measurement | -| [Nightly (Relay session benchmarks)](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124868517800) | ARM 14.3 | failure | Relay-specific Criterion path / paired gate and Pages; Evicted | -| [Nightly (Relay shard sweep)](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124868517871) | ARM 12.1 | success | Delete: no regression gate or visible measurement | -| [Nightly (Rust bench targets)](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124868518082) | ARM 60.4 | cancelled | Criterion coverage / paired gate and Pages; calibration owner | -| [Nightly (Rust benchmark tests)](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124868518054) | ARM 35.0 | success | Benchmark executable correctness; reporting owned by 7510 | -| [Nightly (Rust coverage)](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124868517751) | ARM 18.8 | success | Instrumented Rust test reachability / summary | -| [Nightly (Rust shared bench targets)](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124868517638) | ARM 46.7 | failure | Shared Criterion targets / paired gate and Pages; six slowdowns | -| [Nightly (Rust supplemental benchmarks)](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124868517667) | ARM 14.9 | failure | Supplemental Criterion targets / paired gate and Pages; missing base | -| [Nightly (io_uring benchmarks)](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124868517673) | ARM 14.6 | success | io_uring-specific Criterion path / paired gate and Pages | -| [Nightly (moq-c C fixtures)](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124868517716) | ARM 5.0 | success | C ABI link/fixtures outside cargo; alert | -| [Release C / Build (aarch64-apple-darwin)](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124881867000) | macOS 4.6 | success | Keep target/package contract above / failure alert; artifact is build input or diagnosis | -| [Release C / Build (aarch64-unknown-linux-gnu)](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124881867021) | ARM 3.0 | success | Keep target/package contract above / failure alert; artifact is build input or diagnosis | -| [Release C / Build (x86_64-pc-windows-msvc)](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124881866901) | Windows 7.5 | success | Keep target/package contract above / failure alert; artifact is build input or diagnosis | -| [Release C / Build (x86_64-unknown-linux-gnu)](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124881866933) | Linux 2.6 | success | Keep target/package contract above / failure alert; artifact is build input or diagnosis | -| [Release C / Release](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124883708893) | 0.0 | skipped | Tag-only publication or native reuse; not executed | -| [Release Cpp / Build (aarch64-apple-darwin)](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124881867271) | macOS 5.3 | success | Keep target/package contract above / failure alert; artifact is build input or diagnosis | -| [Release Cpp / Build (aarch64-unknown-linux-gnu)](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124881867311) | ARM 3.3 | success | Keep target/package contract above / failure alert; artifact is build input or diagnosis | -| [Release Cpp / Build (x86_64-pc-windows-msvc)](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124881867285) | Windows 8.6 | success | Keep target/package contract above / failure alert; artifact is build input or diagnosis | -| [Release Cpp / Build (x86_64-unknown-linux-gnu)](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124881867267) | Linux 3.8 | success | Keep target/package contract above / failure alert; artifact is build input or diagnosis | -| [Release Cpp / OBS plugin (aarch64-apple-darwin)](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124883956275) | macOS 3.8 | success | Keep target/package contract above / failure alert; artifact is build input or diagnosis | -| [Release Cpp / OBS plugin (x86_64-pc-windows-msvc)](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124883956221) | Windows 3.9 | success | Keep target/package contract above / failure alert; artifact is build input or diagnosis | -| [Release Cpp / OBS plugin release](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124884924222) | 0.0 | skipped | Tag-only publication or native reuse; not executed | -| [Release Cpp / Release](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124883956930) | 0.0 | skipped | Tag-only publication or native reuse; not executed | -| [Release Cpp / native](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124881868324) | 0.0 | skipped | Tag-only publication or native reuse; not executed | -| [Release Dart / Check package](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124868518572) | Linux 0.4 | success | Keep target/package contract above / failure alert; artifact is build input or diagnosis | -| [Release Dart / Publish moq to pub.dev](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124868622624) | 0.0 | skipped | Tag-only publication or native reuse; not executed | -| [Release Dart FFI / Attach Native Assets](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124881135590) | 0.0 | skipped | Tag-only publication or native reuse; not executed | -| [Release Dart FFI / Check pub package](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124881048718) | Linux 0.4 | success | Keep target/package contract above / failure alert; artifact is build input or diagnosis | -| [Release Dart FFI / Publish moq_ffi to pub.dev](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124881152175) | 0.0 | skipped | Tag-only publication or native reuse; not executed | -| [Release Dart FFI / Stage Native Assets](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124881048709) | Linux 0.3 | success | Keep target/package contract above / failure alert; artifact is build input or diagnosis | -| [Release Dart FFI / moq-ffi / Build moq-ffi (aarch64-apple-darwin)](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124868566148) | macOS 14.2 | success | Keep target/package contract above / failure alert; artifact is build input or diagnosis | -| [Release Dart FFI / moq-ffi / Build moq-ffi (aarch64-apple-ios)](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124868566100) | macOS 11.0 | success | Keep target/package contract above / failure alert; artifact is build input or diagnosis | -| [Release Dart FFI / moq-ffi / Build moq-ffi (aarch64-apple-ios-sim)](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124868566160) | macOS 11.6 | success | Keep target/package contract above / failure alert; artifact is build input or diagnosis | -| [Release Dart FFI / moq-ffi / Build moq-ffi (aarch64-linux-android)](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124868566093) | Linux 6.0 | success | Keep target/package contract above / failure alert; artifact is build input or diagnosis | -| [Release Dart FFI / moq-ffi / Build moq-ffi (aarch64-unknown-linux-gnu)](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124868566120) | Linux 8.9 | success | Keep target/package contract above / failure alert; artifact is build input or diagnosis | -| [Release Dart FFI / moq-ffi / Build moq-ffi (armv7-linux-androideabi)](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124868566149) | Linux 8.2 | success | Keep target/package contract above / failure alert; artifact is build input or diagnosis | -| [Release Dart FFI / moq-ffi / Build moq-ffi (x86_64-apple-darwin)](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124868566281) | macOS 9.7 | success | Keep target/package contract above / failure alert; artifact is build input or diagnosis | -| [Release Dart FFI / moq-ffi / Build moq-ffi (x86_64-apple-ios)](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124868566135) | macOS 11.2 | success | Keep target/package contract above / failure alert; artifact is build input or diagnosis | -| [Release Dart FFI / moq-ffi / Build moq-ffi (x86_64-linux-android)](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124868566104) | Linux 8.1 | success | Keep target/package contract above / failure alert; artifact is build input or diagnosis | -| [Release Dart FFI / moq-ffi / Build moq-ffi (x86_64-pc-windows-msvc)](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124868566189) | Windows 17.3 | success | Keep target/package contract above / failure alert; artifact is build input or diagnosis | -| [Release Dart FFI / moq-ffi / Build moq-ffi (x86_64-unknown-linux-gnu)](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124868566158) | Linux 9.1 | success | Keep target/package contract above / failure alert; artifact is build input or diagnosis | -| [Release Dart FFI / moq-ffi / Generate bindings (${{ matrix.language }})](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124881049144) | 0.0 | skipped | Tag-only publication or native reuse; not executed | -| [Release Dart FFI / moq-ffi / Parse version](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124868518655) | Linux 0.1 | success | Keep target/package contract above / failure alert; artifact is build input or diagnosis | -| [Release FFI / C++ native input (aarch64-apple-darwin)](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124879723377) | macOS 5.2 | success | Keep target/package contract above / failure alert; artifact is build input or diagnosis | -| [Release FFI / C++ native input (aarch64-unknown-linux-gnu)](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124879723373) | ARM 3.7 | success | Keep target/package contract above / failure alert; artifact is build input or diagnosis | -| [Release FFI / C++ native input (x86_64-pc-windows-msvc)](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124879723423) | Windows 8.8 | success | Keep target/package contract above / failure alert; artifact is build input or diagnosis | -| [Release FFI / C++ native input (x86_64-unknown-linux-gnu)](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124879723386) | Linux 3.6 | success | Keep target/package contract above / failure alert; artifact is build input or diagnosis | -| [Release FFI / Publish C++ native inputs](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124881867604) | 0.0 | skipped | Tag-only publication or native reuse; not executed | -| [Release FFI / Release Go FFI / Package](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124879765318) | Linux 0.5 | success | Keep target/package contract above / failure alert; artifact is build input or diagnosis | -| [Release FFI / Release Go FFI / Publish dry-run](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124879882907) | Linux 0.4 | success | Keep target/package contract above / failure alert; artifact is build input or diagnosis | -| [Release FFI / Release Go FFI / Publish to Go module mirror](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124879883877) | 0.0 | skipped | Tag-only publication or native reuse; not executed | -| [Release FFI / Release Go FFI / moq-ffi / Build moq-ffi (${{ matrix.target }})](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124879765704) | 0.0 | skipped | Tag-only publication or native reuse; not executed | -| [Release FFI / Release Go FFI / moq-ffi / Generate bindings (${{ matrix.language }})](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124879766102) | 0.0 | skipped | Tag-only publication or native reuse; not executed | -| [Release FFI / Release Go FFI / moq-ffi / Parse version](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124879723881) | Linux 0.1 | success | Keep target/package contract above / failure alert; artifact is build input or diagnosis | -| [Release FFI / Release Kotlin FFI / Package and publish](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124879775722) | Linux 1.6 | success | Keep target/package contract above / failure alert; artifact is build input or diagnosis | -| [Release FFI / Release Kotlin FFI / moq-ffi / Build moq-ffi (${{ matrix.target }})](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124879776434) | 0.0 | skipped | Tag-only publication or native reuse; not executed | -| [Release FFI / Release Kotlin FFI / moq-ffi / Generate bindings (${{ matrix.language }})](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124879776251) | 0.0 | skipped | Tag-only publication or native reuse; not executed | -| [Release FFI / Release Kotlin FFI / moq-ffi / Parse version](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124879723767) | Linux 0.1 | success | Keep target/package contract above / failure alert; artifact is build input or diagnosis | -| [Release FFI / Release Swift FFI / Attach assets to GitHub release](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124880491128) | 0.0 | skipped | Tag-only publication or native reuse; not executed | -| [Release FFI / Release Swift FFI / Package](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124879776245) | macOS 1.0 | success | Keep target/package contract above / failure alert; artifact is build input or diagnosis | -| [Release FFI / Release Swift FFI / Publish to Swift Package mirror](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124880491888) | 0.0 | skipped | Tag-only publication or native reuse; not executed | -| [Release FFI / Release Swift FFI / Verify staged package resolves](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124880491544) | 0.0 | skipped | Tag-only publication or native reuse; not executed | -| [Release FFI / Release Swift FFI / moq-ffi / Build moq-ffi (${{ matrix.target }})](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124879776532) | 0.0 | skipped | Tag-only publication or native reuse; not executed | -| [Release FFI / Release Swift FFI / moq-ffi / Generate bindings (${{ matrix.language }})](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124879777518) | 0.0 | skipped | Tag-only publication or native reuse; not executed | -| [Release FFI / Release Swift FFI / moq-ffi / Parse version](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124879723777) | Linux 0.2 | success | Keep target/package contract above / failure alert; artifact is build input or diagnosis | -| [Release FFI / Shared moq-ffi / Build moq-ffi (aarch64-apple-darwin)](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124868556663) | macOS 15.8 | success | Keep target/package contract above / failure alert; artifact is build input or diagnosis | -| [Release FFI / Shared moq-ffi / Build moq-ffi (aarch64-apple-ios)](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124868556690) | macOS 12.2 | success | Keep target/package contract above / failure alert; artifact is build input or diagnosis | -| [Release FFI / Shared moq-ffi / Build moq-ffi (aarch64-apple-ios-sim)](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124868556677) | macOS 10.6 | success | Keep target/package contract above / failure alert; artifact is build input or diagnosis | -| [Release FFI / Shared moq-ffi / Build moq-ffi (aarch64-linux-android)](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124868556704) | Linux 8.4 | success | Keep target/package contract above / failure alert; artifact is build input or diagnosis | -| [Release FFI / Shared moq-ffi / Build moq-ffi (aarch64-unknown-linux-gnu)](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124868556694) | Linux 8.7 | success | Keep target/package contract above / failure alert; artifact is build input or diagnosis | -| [Release FFI / Shared moq-ffi / Build moq-ffi (armv7-linux-androideabi)](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124868556675) | Linux 6.7 | success | Keep target/package contract above / failure alert; artifact is build input or diagnosis | -| [Release FFI / Shared moq-ffi / Build moq-ffi (x86_64-linux-android)](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124868556731) | Linux 8.7 | success | Keep target/package contract above / failure alert; artifact is build input or diagnosis | -| [Release FFI / Shared moq-ffi / Build moq-ffi (x86_64-pc-windows-msvc)](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124868556684) | Windows 13.7 | success | Keep target/package contract above / failure alert; artifact is build input or diagnosis | -| [Release FFI / Shared moq-ffi / Build moq-ffi (x86_64-unknown-linux-gnu)](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124868556712) | Linux 11.1 | success | Keep target/package contract above / failure alert; artifact is build input or diagnosis | -| [Release FFI / Shared moq-ffi / Generate bindings (go)](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124875369657) | Linux 17.5 | success | Keep target/package contract above / failure alert; artifact is build input or diagnosis | -| [Release FFI / Shared moq-ffi / Generate bindings (kotlin)](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124875369587) | Linux 3.5 | success | Keep target/package contract above / failure alert; artifact is build input or diagnosis | -| [Release FFI / Shared moq-ffi / Generate bindings (swift)](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124875369588) | Linux 3.4 | success | Keep target/package contract above / failure alert; artifact is build input or diagnosis | -| [Release FFI / Shared moq-ffi / Parse version](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124868518619) | Linux 0.1 | success | Keep target/package contract above / failure alert; artifact is build input or diagnosis | -| [Release JS / Release JS Packages](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124868518542) | Linux 6.0 | success | Keep target/package contract above / failure alert; artifact is build input or diagnosis | -| [Release Kotlin lib / Check FFI publisher](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124868517704) | Linux 0.1 | success | Keep target/package contract above / failure alert; artifact is build input or diagnosis | -| [Release Kotlin lib / Check version](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124868567036) | Linux 0.2 | success | Keep target/package contract above / failure alert; artifact is build input or diagnosis | -| [Release Kotlin lib / Publish wrapper](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124869357056) | Linux 10.7 | success | Keep target/package contract above / failure alert; artifact is build input or diagnosis | -| [Release Py FFI / Build sdist](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124868568272) | Linux 9.0 | success | Keep target/package contract above / failure alert; artifact is build input or diagnosis | -| [Release Py FFI / Build wheels (aarch64-apple-darwin)](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124868568282) | macOS 8.9 | success | Keep target/package contract above / failure alert; artifact is build input or diagnosis | -| [Release Py FFI / Build wheels (aarch64-unknown-linux-gnu)](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124868568291) | ARM 11.2 | success | Keep target/package contract above / failure alert; artifact is build input or diagnosis | -| [Release Py FFI / Build wheels (x86_64-pc-windows-msvc)](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124868568340) | Windows 13.8 | success | Keep target/package contract above / failure alert; artifact is build input or diagnosis | -| [Release Py FFI / Build wheels (x86_64-unknown-linux-gnu)](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124868568301) | Linux 10.4 | success | Keep target/package contract above / failure alert; artifact is build input or diagnosis | -| [Release Py FFI / Parse version](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124868518440) | Linux 0.1 | success | Keep target/package contract above / failure alert; artifact is build input or diagnosis | -| [Release Py FFI / Publish to PyPI](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124876700281) | 0.0 | skipped | Tag-only publication or native reuse; not executed | -| [Release Swift Lib / Build wrapper package](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124868570063) | macOS 0.7 | success | Keep target/package contract above / failure alert; artifact is build input or diagnosis | -| [Release Swift Lib / Check FFI publisher](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124868518447) | Linux 0.1 | success | Keep target/package contract above / failure alert; artifact is build input or diagnosis | -| [Release Swift Lib / Publish dry-run](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124879095921) | Linux 0.2 | success | Keep target/package contract above / failure alert; artifact is build input or diagnosis | -| [Release Swift Lib / Publish to Swift Package mirror](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124879962652) | 0.0 | skipped | Tag-only publication or native reuse; not executed | -| [Release Swift Lib / Verify staged package resolves](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124879095935) | macOS 0.2 | success | Keep target/package contract above / failure alert; artifact is build input or diagnosis | -| [Shipping sizes](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124881866814) | ARM 23.4 | success | Published artifact sizes / summary; Pages owned by 7510 | -| [Tests (gate)](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124868517727) | ARM 37.6 | failure | Full diff-independent local gate; relay stack failure; alert | -| [Tests (rs audio-devices)](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124868517634) | ARM 3.7 | success | Null-sink audio device contract absent on plain runner; alert | -| [Tests (rs cli-export)](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124868517722) | ARM 5.7 | success | Paced CLI process export contract; alert | -| [Tests (rs doctest --workspace)](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124868517732) | ARM 8.7 | success | Rustdoc examples are not nextest tests; alert | -| [Tests (rs multicast)](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124868517686) | ARM 6.1 | success | Looped-back mDNS discovery contract; alert | -| [Tests (rs quic-sim)](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124868517895) | ARM 10.8 | success | Fresh-seed QUIC workload beyond fixed PR seeds; alert | -| [Tests (rs quic-stress)](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124868517588) | ARM 3.8 | success | QUIC backend pressure and flow-control contract; alert | -| [Tests (rs render-sw)](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124868517583) | ARM 9.2 | success | Software-Vulkan renderer readback; alert | -| [Tests (rs send-depth)](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124868517735) | ARM 2.6 | success | Pinned-nightly Send proof at normal recursion depth; alert | -| [Tests (rs uring)](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124868517772) | ARM 11.7 | success | Different feature/kernel/socket contract; alert | -| [Tests (rs v4l2)](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124868517784) | ARM 3.2 | success | Vivid virtual-camera capture and device lifetime; alert | -| [Tests (test drain)](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124868517760) | ARM 8.0 | success | Two-relay JS viewer drain across the wire; alert | -| [Tests (test drill impaired)](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124868517608) | ARM 5.0 | success | Seeded bufferbloat and packet overflow beyond PR loopback; alert | -| [Tests (test drill-sensitivity)](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124868517783) | ARM 14.2 | success | Drill negative controls prove acceptance catches faults; alert | -| [Tests (test json-properties)](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124868517788) | ARM 6.4 | success | Extended generated JSON protocol cases; alert | -| [Tests (test qmux)](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124868517907) | ARM 6.3 | success | Cross-language per-draft qmux interoperability; alert | -| [Tests (test resume-model)](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124868517809) | ARM 7.1 | failure | Fresh generated resume/range cases; missing-group counterexample; alert | -| [android / Android](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124868517795) | Linux 3.4 | success | Distinct platform/consumer build or runtime boundary / failure alert | -| [audio-replay / Replay](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124868518303) | ARM 4.5 | success | Deterministic trace-replay budgets / failure alert | -| [c / C (clang)](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124868518038) | Linux 4.5 | success | Distinct platform/consumer build or runtime boundary / failure alert | -| [cpp / C++ (clang)](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124868518343) | Linux 6.3 | success | Distinct platform/consumer build or runtime boundary / failure alert | -| [features / Features (rs features)](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124868518151) | ARM 53.1 | failure | Feature isolation beyond default gate / relay stack alert | -| [ietf-conformance / moxygen](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124868517493) | Linux 29.8 | success | Third-party protocol conformance / failure alert | -| [moq-c / Build (aarch64-apple-darwin)](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124868518055) | macOS 23.7 | success | Keep target/package contract above / failure alert; artifact is build input or diagnosis | -| [moq-c / Build (aarch64-unknown-linux-gnu)](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124868517939) | ARM 10.4 | success | Keep target/package contract above / failure alert; artifact is build input or diagnosis | -| [moq-c / Build (x86_64-pc-windows-msvc)](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124868518048) | Windows 14.9 | success | Keep target/package contract above / failure alert; artifact is build input or diagnosis | -| [moq-c / Build (x86_64-unknown-linux-gnu)](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124868518066) | Linux 12.2 | success | Keep target/package contract above / failure alert; artifact is build input or diagnosis | -| [moq-c / Release](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124874459428) | 0.0 | skipped | Tag-only publication or native reuse; not executed | -| [moq-cli / release / Attest](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124878066994) | 0.0 | skipped | Tag-only publication or native reuse; not executed | -| [moq-cli / release / Build (aarch64-unknown-linux-gnu)](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124868518682) | ARM 11.5 | success | Keep target/package contract above / failure alert; artifact is build input or diagnosis | -| [moq-cli / release / Build (x86_64-unknown-linux-gnu)](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124868518684) | Linux 12.4 | success | Keep target/package contract above / failure alert; artifact is build input or diagnosis | -| [moq-cli / release / Build Windows zip (x86_64-pc-windows-msvc)](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124868518562) | Windows 21.1 | success | Keep target/package contract above / failure alert; artifact is build input or diagnosis | -| [moq-cli / release / Build macOS tarball (aarch64-apple-darwin)](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124868518608) | macOS 38.1 | success | Keep target/package contract above / failure alert; artifact is build input or diagnosis | -| [moq-cli / release / Release](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124878067934) | 0.0 | skipped | Tag-only publication or native reuse; not executed | -| [moq-gst / Build tarball (aarch64-apple-darwin)](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124868517858) | macOS 21.7 | success | Keep target/package contract above / failure alert; artifact is build input or diagnosis | -| [moq-gst / Build tarball (aarch64-unknown-linux-gnu)](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124868517671) | ARM 7.4 | success | Keep target/package contract above / failure alert; artifact is build input or diagnosis | -| [moq-gst / Build tarball (x86_64-unknown-linux-gnu)](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124868517835) | Linux 9.8 | success | Keep target/package contract above / failure alert; artifact is build input or diagnosis | -| [moq-gst / Package .deb/.rpm (aarch64-unknown-linux-gnu)](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124868517712) | ARM 4.9 | success | Keep target/package contract above / failure alert; artifact is build input or diagnosis | -| [moq-gst / Package .deb/.rpm (x86_64-unknown-linux-gnu)](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124868517785) | Linux 5.9 | success | Keep target/package contract above / failure alert; artifact is build input or diagnosis | -| [moq-gst / Release](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124873960333) | 0.0 | skipped | Tag-only publication or native reuse; not executed | -| [moq-relay / release / Attest](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124872230170) | 0.0 | skipped | Tag-only publication or native reuse; not executed | -| [moq-relay / release / Build (aarch64-unknown-linux-gnu)](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124868518621) | ARM 6.6 | success | Keep target/package contract above / failure alert; artifact is build input or diagnosis | -| [moq-relay / release / Build (x86_64-unknown-linux-gnu)](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124868518604) | Linux 7.5 | success | Keep target/package contract above / failure alert; artifact is build input or diagnosis | -| [moq-relay / release / Build Windows zip (x86_64-pc-windows-msvc)](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124868518642) | Windows 12.0 | success | Keep target/package contract above / failure alert; artifact is build input or diagnosis | -| [moq-relay / release / Build macOS tarball (aarch64-apple-darwin)](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124868518513) | macOS 15.0 | success | Keep target/package contract above / failure alert; artifact is build input or diagnosis | -| [moq-relay / release / Release](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124872230844) | 0.0 | skipped | Tag-only publication or native reuse; not executed | -| [oss-scanner / Build](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124868518381) | ARM 9.2 | success | Distinct platform/consumer build or runtime boundary / failure alert | -| [platform / Platform scope](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124868518486) | ARM 0.2 | success | Platform selection | -| [platform / Windows](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124868585460) | Windows 18.2 | failure | Native OS-specific tests / alert; relay stack failure | -| [platform / macOS](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124868585440) | macOS 57.5 | success | Native OS-specific tests / alert | -| [runner-vm / check](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124868517755) | Linux 7.1 | success | Runner image/boot contract / failure alert; infrastructure-owned | -| [x11 / SHM and GetImage](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124868518062) | ARM 6.2 | success | Distinct platform/consumer build or runtime boundary / failure alert | - -## Required - -- [Release cut](/quest/m3/release/cut.md) - the release in flight ships before this run starts diff --git a/quest/m3/audit-code.md b/quest/m3/audit-code.md new file mode 100644 index 00000000000..ec8362b46a0 --- /dev/null +++ b/quest/m3/audit-code.md @@ -0,0 +1,86 @@ +# [M] Code audit + +## Goal + +Code, exports, Cargo features, and CLI flags that nothing uses are deleted. +Code that costs the most complexity for what it delivers is simplified: +duplicate mechanisms merged, and layers, options, and generics with one user +collapsed. Every lint suppression in every language is still needed and says +why, and nothing calls an API deprecated at the workspace MSRV. + +## Plan + +Recurs each major release: the PR that finishes a run keeps its results in +its own body and re-adds this file at the end of m3's `Required`, behind the +[release cut](/quest/m3/release/cut.md), with Check first rewritten. Fixes land +in that PR; only maintainer decisions (public API, scope) and changes too +large to review alongside become follow-ups. + +Removing or reshaping a public item, narrowing a feature, or removing one of +our deprecated exports or hidden CLI spellings is the maintainer's call, so +each is a follow-up with a recommendation. The public-item pass before a cut +belongs to [API shape](/quest/m2/api-shape/README.md); this audit keeps +private code. + +Previous runs: dead code [moq-dev/moq#6166](https://github.com/moq-dev/moq/pull/6166), +simplification [moq-dev/moq#6527](https://github.com/moq-dev/moq/pull/6527), +lints [moq-dev/moq#6576](https://github.com/moq-dev/moq/pull/6576). + +### Check first: dead code + +- Rustc misses unused `pub` items. Tokenize the tree and shortlist `pub` + declarations whose name appears only at the definition. +- Unconditional dead-code suppressions are `expect`, so a stale one fails the + build; check what the `cfg_attr` ones still guard. +- Knip needs explicit entries for Bun tests, `*.browser.ts`, benches, + examples, worklets, TSX, `test/*` clients, and repo-root scripts, and + `ignore` for `rs/**/test_data`. +- Trace a CLI flag through the config merge, not prose or examples. Hidden + deprecated spellings (`--client-*`, `--server-*`, the relay's legacy auth + fields) fail with migration guidance on purpose. +- Windows clippy reports `capture::pump::Read::Idle` (only X11 idles) and + `I420::from_bgra`, whose cfg still names Windows though only PipeWire calls + it. + +### Check first: simplification + +- Still open from m0: `ietf/session.rs` `start()` builds both halves twice + across the draft arms; lite and IETF `GroupServe` share their open, flush, + and FIN-settle driver; `ietf/adapter.rs` reimplements `kio::Queue`. +- The codec importers each forward `demand`, `flush`, `finish`, `abort`, + `cut`, `discontinuity`, and `seek` to their container producer. Dropping + them means a shared track handle, which is an API proposal. +- Then the largest moq-net modules and the bindings' forwarding layers. + Search the quest tree before fixing a duplicate. +- Kept on purpose: traits with several implementations or device-free test + doubles; ietf `RequestWaker` and lite `FetchWake` apart from the queue-once + waker; js/net's hand-written subscriber grant checks; the separate lite and + IETF JS datagram loops; the thin Dart, C++, and Swift wrappers; the + one-line `until_wanted` loops over `Demand::wanted_changed`; js/net's lite + version gates mirroring Rust's. + +### Check first: lints + +- Already gated, so skip: `clippy::allow_attributes_without_reason`, + unfulfilled `expect`s, Biome's unused `biome-ignore`, ruff's `RUF100`, and + pyright's unnecessary `type: ignore` in the Python wrapper. Review what + those can't see. Generated and vendored bindings keep their blanket allows; + `shellcheck disable` is out of scope. +- CI lints Linux only, so run clippy for `aarch64-apple-darwin` and + `x86_64-pc-windows-gnu` from Linux with a rust-overlay toolchain and + `zig cc` for build scripts. That found every stale suppression last run. +- Swift: read the nightly macOS job's Swift step for warnings. TypeScript: + run typescript-eslint's `no-deprecated` once it supports the pinned + TypeScript, and consider joining CI. The CARLA sim's pyright needs the + bindings installed to check its ignores. +- `fetch_update` is deprecated on nightly in favor of `try_update`, stable + only from Rust 1.95; keep it while the MSRV is 1.91. +- `rs lint`'s `git grep` for `set_var`/`remove_var` becomes a + `disallowed-methods` entry in `clippy.toml` once crate- and module-wide test + `expect(clippy::disallowed_methods)` move onto the items that read the + clock (decided 2026-10-31, maintainer). +- AVFoundation's `devicesWithMediaType` stays: its replacement needs macOS 14. + +## Required + +- [Release cut](/quest/m3/release/cut.md) - the release in flight ships before this run starts diff --git a/quest/m3/audit-compile-time.md b/quest/m3/audit-compile-time.md deleted file mode 100644 index 6b910f9c720..00000000000 --- a/quest/m3/audit-compile-time.md +++ /dev/null @@ -1,339 +0,0 @@ -# [M] Compile time audit - -## Goal - -The crates, dependencies, and code that dominate build time are known, with -recorded baselines, and the worst are removed, refactored to build cheaper, or -planned. - -## Plan - -Recurs once per major release (decided 2026-10-19). The PR that finishes -this run also adds the next one with the same file name at the end of m3's `Required`, which the shift after the next cut -brings into m1. The successor keeps the Goal -and this paragraph; the rest of its Plan is rewritten with what this run -learned: baselines, results, and what to check first. The successor also lists the [release cut](/quest/m3/release/cut.md) under `Required`, so it -waits for the release in flight to ship. Only `/quest-delete` ends the -recurrence. Fixes land in the run's PR, one commit each, rather than as follow-ups. -Only a change that needs a maintainer decision (public API, scope) or is -independently landable and too large to review alongside the rest becomes a -follow-up through `/quest-plan`. - -Default to removing (decided 2026-11-01, maintainer): whatever doesn't earn its -cost is deleted inline, and the PR body lists each deletion with its measured -cost and why it wasn't worth it. Only what earns its keep is refactored to be -cheaper instead. Removing a public API or a user-facing feature stays a -follow-up. - -Scope: this audit owns per-crate build cost in one build (dev, release, and -incremental). The [CI workflow audit](/quest/m3/audit-ci.md) owns job-level CI -cost and caching; the [dependency audit](/quest/m3/audit-deps.md) owns -deduplicating and upgrading dependencies. - -What to check first: - -- The [benchmark history](https://git.moq.dev/bench/)'s `bench-gate-cost` rows: `crate/*/instructions` ranks every - crate's and dependency's rustc instructions in a cold gate (`cold/`) and after - a moq-net edit (`moq-net/`), and flags the nights each one moved. Build - script runs are not attributed per crate; see bench/README.md. -- Fat LTO is kept, but the shipping-profile comparison below no longer - favors it on build cost. From equally cold targets thin cut the whole - build's wall by 12.5% at about equal CPU, and the archive has shrunk since - m0, which was the maintainer's 2026-10-20 condition for revisiting. What - still holds fat is the runtime cost (m0 measured 1.6 to 2.1% more session - instructions; this run's runtime check is noise) and release builds staying - off the PR gate. Compare fat and thin only from fresh targets: a target - the default release build already filled times most fat units at 0 s. -- Rerun the six-target IR inventory and the cold dev/release timings below. - Attribute a large row to a current consumer before changing its types or - splitting a crate. The off-cycle run rejected its reader-consolidation - candidate; it found no unused whole crate or feature that could be removed - without changing a public feature. -- The cargo-hakari workspace-hack - ([moq-dev/moq#6985](https://github.com/moq-dev/moq/pull/6985)) landed after - the off-cycle run's base, so the baselines below predate it. As a - dev-dependency it unifies features only in builds that include - dev-dependencies (tests, lint, benches), such as the mux test-profile IR - count. Treat a shift in those rows across it as the hack's, not the code's. - Keep feature-unification and cross-job cache work with the - [hakari follow-ups](/quest/m0/ci/hakari-followups.md), and test work with the - [test cost audit](/quest/m3/audit-test-cost.md). Dependency and manifest - removal belongs to the [dependency audit](/quest/m3/audit-deps.md). -- Transport-session duplication is fixed by - [moq-dev/moq#6176](https://github.com/moq-dev/moq/pull/6176). At this run's - source, moq-tokio emits 556,292 lines and the old transport-row definition - matches 401 lines (0.07%), against 1,679,222 and 39.1% in the historical - table. Do not reintroduce generic session bodies or redo poll-first's - async-feature work. -- moq-net's BTree rows remain large, but sharing numeric keys was measured - and rejected: [the retained experiment](/.github/btree-build-audit.md) - found about 30 ms of CPU per build, with no CPU-time reduction beyond - noise, at the cost of key translation. A large aggregate share alone is - not evidence for that refactor. -- Do not repeat the bare-slice-to-cursor MP4 experiment without checking - mp4-atom's own decoders first. At 0.17.0 its `Atom::decode_atom` feeds - nested bodies through a bare slice, while `Any::decode_atom` feeds them - through `&mut &[u8]`. Both variants remain needed even when every owned - reader uses a cursor. The measured candidate is rejected below. -- `cargo-llvm-lines` 0.4.48 is still outside the pinned shell. This run used - `nix shell nixpkgs#cargo-llvm-lines` from inside the repository's Nix shell; - no flake or dependency changes were made alongside the concurrent work. -- Measure edits through mbx, which enables learned incremental compilation; - a plain Cargo rebuild with the host's `incremental = false` is a different - experiment. Repeat the edit: the first one after a catch-up build records - incremental state and costs more than plain Cargo. In a warm edit the final - binaries, not the edited libraries, are about half the unit time, so look - there first (see below). -- Nested dev shells used to duplicate PATH until mbx failed with E2BIG; - [moq-dev/moq#7594](https://github.com/moq-dev/moq/pull/7594) deduplicates - it in the shell hook. If E2BIG returns, check PATH's length first. -- On the hybrid host, use `perf stat --no-scale` and sum the unscaled core - counters. Scaled counts can overcount by up to 2x. - -### Off-cycle run (2026-11-01) - -Base: [21d6da9fc1](https://github.com/moq-dev/moq/commit/21d6da9fc108b48373a961f34e43c3fcd38b0146). -A one-off removal run ahead of the m1 cut, by -[moq-dev/moq#7602](https://github.com/moq-dev/moq/pull/7602). It found nothing -worth removing and retained no production or profile change. The recurring -audit's schedule is unchanged and no successor is created. - -[Measurements and rejected candidate patches](/.github/compile-time-audit.json) -record the source, commands, top IR rows, Cargo unit durations, and raw perf -counters. Rust 1.98.1 and cargo-llvm-lines 0.4.48, Linux x86_64, Intel Core -Ultra 7 270K Plus (24 logical CPUs), shared host. Measurements use private -`.tmp/` targets, two Cargo jobs, `MBX_DISABLE=1`, and no incremental -compilation, except the mbx edit probe. The host overrides dev debug info to -false. - -| Target, default features, dev | LLVM lines | Copies | -| --- | ---: | ---: | -| moq-tokio lib | 556,292 | 21,364 | -| moq-mux lib | 1,144,450 | 34,033 | -| moq-net lib | 1,383,588 | 42,863 | -| moq-relay lib | 693,285 | 26,066 | -| moq-ffi lib | 798,830 | 31,542 | -| moq-cli `moq` bin | 1,087,790 | 39,583 | - -Method: `cargo llvm-lines --locked -p --lib` (CLI: `--bin moq`). -The corresponding mux test-profile target (`--lib --profile test`) emits -3,726,367 lines in 103,615 copies. Counts are deterministic at this source -and feature set; code and feature changes since October make cross-date -counts context, not an attribution of all changes to one PR. - -| Cold build | Wall | Process-tree CPU | Sum of unit wall durations | Longest units | -| --- | ---: | ---: | ---: | --- | -| `cargo build --locked --timings`, default members | 241.79 s | 460.12 s | 481.79 s | aws-lc-sys script 43.52 s; moq-net 12.66 s; moq-mux 9.86 s | -| `cargo build --locked --release -p moq-cli -p moq-ffi --timings` | 527.08 s | 927.04 s | 957.90 s | `moq` 224.57 s; moq-ffi 135.04 s; aws-lc-sys script 69.68 s | - -Each is one observation on a shared host. Unit durations overlap and are not -CPU attribution. The dev build's scripts total 107.78 unit seconds (22.4%); -aws-lc-sys alone is 9.0%. The two final release units account for 37.5% of -unit time. Default-feature release artifacts are 46,726,912 bytes (`moq`) -and 65,005,970 bytes (`libmoq_ffi.a`). This is not the shipping Go mirror -measurement: it does not enable OpenH264. - -Owned scripts in the default build are small: moq-sock compiles in 1.10 s, -moq-video in 1.05 s, and each runs in 0.01 s. Their platform aliases still -have consumers. kio-macros takes 1.19 s; its generated wrappers and machines -have live poll/async consumers. Retain those rather than duplicate platform -conditions or the state machines by hand. C's cbindgen and GStreamer's -version helper serve their exported header and plugin metadata and are not -in default members. The large generated UniFFI and configuration parsers -also have current consumers; removing them would remove public features. -No such removal is proposed here. - -#### Rejected reader consolidation - -The historical subtitle candidate is stale at mp4-atom 0.17.0. Replacing its -two bare slices with `Cursor<&[u8]>` changes mux lib IR from 1,144,450 to -1,144,440 lines and test IR from 3,726,367 to 3,726,357: only ten lines, -with the large decoder copies still present. Extending that candidate to -the streaming importer's `Moov::decode_body` and `Moof::decode_body` keeps -the lib at 1,144,440 but grows the test target to 3,727,271 (+904). - -The crate's own `Atom::decode_atom` and `Any::decode_atom` introduce the two -slice forms while decoding nested bodies. Our top-level readers cannot -remove either generated decoder variant. Changing the dependency belongs to -the dependency audit, not an inline vendor patch here. - -Plain mux-only dev rebuilds, dependencies warm, baseline/candidate/candidate/ -baseline order, with both owned reader changes: - -| Sample | Variant | Unscaled user instructions | Task clock | -| --- | --- | ---: | ---: | -| 1 | baseline | 53.271 G | 6.665 s | -| 2 | candidate | 53.281 G | 6.676 s | -| 3 | candidate | 53.265 G | 6.606 s | -| 4 | baseline | 53.275 G | 6.583 s | - -Method: restore both source snapshots before each rebuild, then -`perf stat --no-scale -e instructions:u,task-clock cargo build --locked --p moq-mux --lib --timings`. Sum the hybrid host's unscaled instruction -counters. The source patch and four raw counter outputs are retained in the -JSON. Instructions are flat and CPU times overlap; no speedup is established. -Both reader edits were dropped. Incomplete release rebuilds of the rejected -candidates were stopped and are excluded from the results. - -#### Shipping-profile LTO comparison - -Same unchanged source and the same 474 package/target/feature units, two -jobs, `cargo build-ffi --release --timings`, then the same command with -`CARGO_PROFILE_RELEASE_LTO=thin`. The alias enables OpenH264, as the shipped -FFI does. Each profile builds cold into its own fresh private target with mbx -disabled, fat first (rerun 2026-11-02 at the same base). The set of timed -units is identical. - -| Metric | Fat | Thin | -| --- | ---: | ---: | -| Whole command wall | 465.48 s | 407.12 s | -| Whole command process-tree CPU | 653.42 s | 664.28 s | -| Sum of unit durations | 751.52 s | 676.49 s | -| Final moq-ffi unit | 162.63 s | 114.87 s | -| `libmoq_ffi.a` | 65,447,812 bytes (62.4 MiB) | 74,914,352 bytes (71.4 MiB) | - -Thin cuts the final unit's wall by 29.4% and the whole command's by 12.5%, -at 1.7% more CPU, and grows the archive by 14.5%. Both archives fit the -existing 100 MB per-file ceiling. These are single observations on a shared -host, not a general CPU regression estimate or a cross-job cache -measurement. - -A first comparison built fat into the target the default-feature release -build had already filled: 300 of its 474 units were fresh and timed at 0 s, -while thin's profile change rebuilt them (202.16 s), so its whole-command -totals favored fat by comparing unequal work. The JSON keeps its summary -under `superseded`. - -Runtime check: build the existing `moq-net` session bench once with each -profile, then run fat/thin/thin/fat with `SESSION_CPU=1`, filtering -`session_delivery_group_cost`, 0.1 s warm-up, 0.2 s requested measurement, -and ten samples per case. All 72 cases complete; they sweep publishers and -viewers independently across SUBSCRIBE/FETCH and the supported protocols. -The geometric mean of each case's mean thin CPU divided by mean fat CPU is -1.034; individual ratios range from 0.747 to 1.403. The repeated fat runs' -median max/min ratio is 1.020 and the largest is 1.966. Host variation is -substantial, so this does not prove a 3.4% runtime regression. It establishes -no runtime win that would justify reversing the retained fat-LTO choice. - -Decision made in this run: keep fat LTO, the maintainer's 2026-10-20 -choice. Its archive condition is now met and thin is cheaper in wall time, -but release builds are still off the PR gate, so the saving lands only on -the release workflows, while any runtime cost lands on every user. No -profile edit is retained. The old thin-LTO open item is measured here; -the transport IR inventory and stale subtitle candidate are also resolved. -`cargo-llvm-lines` is still not in the pinned shell. - -#### Incremental edit through mbx - -Same source after the cold builds above. Default members, `cargo build ---locked --timings` under `perf stat --no-scale`, two jobs, mbx 1.25.0, PATH -deduplicated as in [moq-dev/moq#7594](https://github.com/moq-dev/moq/pull/7594). -Each edit appends one comment line to `rs/moq-net/src/lib.rs` after a -catch-up and a no-op build; restore reverts the file. Plain Cargo repeats -the sequence with `MBX_DISABLE=1` in a private target. Every edit rebuilds -the same 26 dependent units. - -| Edit | mbx instructions | mbx CPU | mbx wall | Plain instructions | Plain CPU | Plain wall | -| --- | ---: | ---: | ---: | ---: | ---: | ---: | -| 1 | 537.8 G | 110.2 s | 63.4 s | 450.0 G | 91.8 s | 60.8 s | -| 2 | 99.0 G | 26.2 s | 14.3 s | 450.0 G | 80.6 s | 50.2 s | -| 3 | 99.0 G | 25.1 s | 13.3 s | 450.1 G | 70.6 s | 38.9 s | -| restore | 99.0 G | 24.4 s | 12.4 s | 450.0 G | 93.3 s | 61.9 s | - -Instructions are deterministic to 0.1%; CPU and wall vary with host load -(one-minute load 20 to 54). Once mbx has incremental state for the edited -crates, an edit costs 78% fewer instructions than plain Cargo. The first -edit costs 20% more while it records that state. - -In the warm mbx edits, the five final binary units take 49 to 53% of unit -time: `moq` 3.5 to 4.2 s, `moq-studio` 2.5 to 3.1 s, `moq-bench`'s two bins -3.0 to 3.9 s together, and `moq-relay` 1.7 to 2.1 s. moq-net itself is 2.2 -to 2.4 s. moq-bench and moq-studio are default members, but CI and `just` -select packages or pass `--workspace`, so trimming default members would only -shorten a bare root `cargo build`. Nothing here is removed. - -### Historical baselines (m1 run, 2026-10-23) - -Pinned Nix shell (Rust 1.98.1), Linux x86_64, 32 logical CPUs, Cargo bounded -to two jobs, `MBX_DISABLE=1`, one fresh target dir, registry present. The -host's `~/.cargo/config.toml` sets `incremental = false`, so every touched -crate rebuilds whole. The host was shared; load is the one-minute average -sampled every 30 s. Times are single observations: compare shares within a -run, never seconds across runs. Only the llvm-lines counts are deterministic. - -Builds on `0d3b3e084` (release with the moq-mux fix below): - -| Build | Load (median) | Wall | Unit time | Longest unit | -| --- | --- | ---: | ---: | --- | -| `cargo build --locked --timings` (default members, clean) | 4.1 to 9.0 (5.6) | 308 s | 614 s | aws-lc-sys build script 114 s, 18.6% | -| `cargo build --locked --release -p moq-cli --timings` (clean deps) | 3.1 to 17.7 (5.4) | 750 s | 1,127 s | `moq` bin 369 s, 49% of wall | -| Default members after a comment appended to `rs/moq-net/src/lib.rs` | 5.0 to 8.4 | 70 s | 126 s | moq-tokio 21.8 s, 17.4% | - -Clean dev: build scripts are 31% of unit time (aws-lc-sys alone 18.6%, ring -1.7%) and workspace crates 18.6%; the two-job queue stays full, so total -unit time sets the wall, not the critical path. Release: the final `moq` -unit is still fat LTO on one codegen unit (m0: 42 to 53% of the wall), and -aws-lc-sys is 11% of unit time. Incremental: a moq-net comment rebuilds -every dependent; moq-tokio (17.4%), the `moq` bin (15.6%), moq-net (10.9%), -moq-mux (9.3%) and moq-relay (8.6%) lead. - -`cargo llvm-lines` 0.4.48 (`nix shell nixpkgs#cargo-llvm-lines`), dev profile, -default features: - -| Target | LLVM IR lines | Copies | m0 lines | Notable share | -| --- | ---: | ---: | ---: | --- | -| moq-tokio lib | 1,679,222 | 48,553 | 1,661,503 | moq-net rows instantiated over a transport session 39.1% (any row naming one 55.7%); usage-rs derive 5.2% | -| moq-mux lib | 996,345 | 28,525 | 908,532 | serde 18.6%; mp4-atom 11.9% | -| moq-cli `moq` bin | 1,108,118 | 39,327 | 1,037,734 | tokio 16.6%; serde 5.2%; usage-rs derive 2.7% | -| moq-ffi lib | 811,228 | 32,309 | not run | tokio 18.6%; uniffi_core 9.6%; moq-mux generics 7.3% | -| moq-net lib | 799,404 | 25,306 | 686,443 | BTreeMap internals 29.5%; rows naming `moq_net::model` 47.7% | -| moq-relay lib | 667,136 | 24,636 | 711,268 | serde 30.4% (toml 9.3%); usage-rs derive 9.2% | -| moq-relay bin | 311,790 | 11,313 | 384,813 | tokio 18.9%; transport-session rows 3.0% | -| qmux lib | 12,528 | 524 | not run | generic, instantiated downstream | - -Transport rows: in moq-tokio, `qmux::session::Session` names 28.6% and -`moq_tokio::transport::Session` 28.2%, each again under -moq-net's IETF `ControlStreamAdapter` (20.0%), so the IETF half compiles four -times. The m0 share (43.2%) used an unrecorded grouping; compare against the -39.1% definition above (first path segment `moq_net`, name contains -`qmux::session::Session` or `moq_tokio::transport::Session`). - -moq-net grew 16.5% since m0, mostly in `model`; its BTreeMap share rose from -24.1% to 29.5% across about 30 distinct key and value types, each -instantiating the whole map. - -### Results of the m1 run - -- Fixed: moq-mux's fragment decode read through `Cursor<&Bytes>`, a fourth - instantiation of mp4-atom's `Any::decode_atom`; it now uses - `Cursor<&[u8]>` like the rest (moq-mux lib 1,006,004 to 996,345 lines). -- Deferred: [moq-dev/moq#6176](https://github.com/moq-dev/moq/pull/6176) - landed after these measurements, so the transport-share and thin-LTO - comparisons move to the m2 run. -- Explained, no action: aws-lc-sys's build script remains the longest unit - in clean builds; the crypto provider stays (m0). usage-rs derive output - scales with config fields and is external code. serde visitors per - deserializer are inherent to TOML config. moq-rtmp, moq-srt and moq-webrtc - entry points generic over `impl Into` instantiate their async bodies in - the `moq` bin (20,327 lines with drop glue, 1.8%); a non-generic inner - function would move them, but adds code for little. The catalog JSON diff - no longer instantiates per crate since - [moq-dev/moq#7400](https://github.com/moq-dev/moq/pull/7400): the encoder - diffs `serde_json`'s bytes, compiled once in `moq-json`. -- Not run this time: `-Z time-passes` on the `moq` unit (m0: fat LTO 74%, - LLVM passes 23%); the release share did not move enough to warrant it. - -### Method - -Per target, `CARGO_TARGET_DIR=.tmp/target CARGO_BUILD_JOBS=2 -MBX_DISABLE=1 cargo llvm-lines --locked -p --lib` (or `--bin`; name -`qmux@` since a dev-dependency pins an older qmux), then group rows -by the first path segment after stripping crate hashes, and by substrings for -the transport session types. Clean dev and release builds use `--timings` -into the same fresh target dir; the incremental probe appends one comment -line to `rs/moq-net/src/lib.rs` after a no-op catch-up build. Sample -`/proc/loadavg` every 30 s during each run. - -## Required - -- [Release cut](/quest/m3/release/cut.md) - the release in flight ships before this run starts diff --git a/quest/m3/audit-cost.md b/quest/m3/audit-cost.md new file mode 100644 index 00000000000..f7c48ee5b02 --- /dev/null +++ b/quest/m3/audit-cost.md @@ -0,0 +1,140 @@ +# [L] Cost audit + +## Goal + +Every CI workflow and job, test, dependency, second of build time, and byte +of shipped artifact earns its cost. What doesn't is deleted by default, or +else made cheaper or moved, and growth since the previous run is explained, +fixed, or planned. Runner and cache infrastructure belongs to +[CI cost and latency](/quest/m0/ci/README.md). + +## Plan + +Recurs each major release: the PR that finishes a run keeps its results in +its own body and re-adds this file at the end of m3's `Required`, behind the +[release cut](/quest/m3/release/cut.md), with Check first rewritten. Fixes land +in that PR; only maintainer decisions (public API, scope) and changes too +large to review alongside become follow-ups. + +Default to removing (decided 2026-11-01, maintainer): the PR body lists each +deletion with its measured cost and why it wasn't worth it. Removing a public +API, a user-facing feature, or a release target stays a follow-up. + +Previous runs: CI [moq-dev/moq#7603](https://github.com/moq-dev/moq/pull/7603), +tests [moq-dev/moq#7600](https://github.com/moq-dev/moq/pull/7600), build time +[moq-dev/moq#7602](https://github.com/moq-dev/moq/pull/7602) (raw data in +[compile-time-audit.json](/.github/compile-time-audit.json)), size +[moq-dev/moq#6541](https://github.com/moq-dev/moq/pull/6541), dependencies +[moq-dev/moq#7601](https://github.com/moq-dev/moq/pull/7601). + +### Check first: CI + +- Table every workflow in `.github/workflows/` and every job of the latest + scheduled Nightly by signal (what it catches that nothing cheaper does), + visibility (a gate, a Discord `#alerts` post through + [alert.yml](/.github/workflows/alert.yml), a Pages report, or a job summary; + a result only in an artifact or log is invisible), and cost (runner-minutes + by runner type; macOS is the scarce one). +- The [benchmark history](https://git.moq.dev/bench/)'s `bench-gate-cost` + `module/*` rows give each `just ci` module's wall and CPU seconds. +- Sum elapsed runner-minutes from the REST jobs API. Org billing is monthly + attribution only; never derive a workflow's cost from it. +- Read failures by cause, not job count: N fuzz targets failing one build is + one finding, and a green compile is not a caught regression. Count + infrastructure flakes across nights before acting. +- Each Pages report owns one `gh-pages` directory and joins the + `benchmark-pages` concurrency group (decided 2026-10-20; + `sh/gh/pages-publish.sh`). +- Still the maintainer's call since m0: fold the capture and play test builds + into the main test build, or move both to Nightly. Keep both until decided. +- Shared default-feature FFI builds feed Go, Kotlin, Swift, C, and C++; Dart + has its own target set. Matching target names are not redundant outputs. + +### Check first: tests + +- The benchmark history's `cold/rust-test/*` (each test binary's summed slot + time) and `cold/js-test/*` (each Bun test file's) rows. +- Measure nextest's per-test elapsed time as slot time from one invocation, + noting its test count, profile, features, and threads. Repeat under + `quest gate` and pin whole-suite comparisons to the same CPUs; a + three-second swing can be QUIC draining. +- Classify a failure before calling it a flake. Flake quests own their tests; + don't delete them to green the audit. +- Kept on purpose: the compressed-cache bound tests (stored-tail shedding and + bounded inflation), the three io_uring endpoint timeout and backlog tests, + macro UI compile failures, GStreamer reconnects, the CLI export lane's + redundant-importer arms (real process failover), and the CLI report's + mid-import, late-sink, and stdin-EOF tests. Each covers a distinct boundary. + +### Check first: build time + +- The benchmark history's `crate/*/instructions` rows rank every crate's + rustc instructions in a cold gate and after a moq-net edit. +- Fat LTO stays (maintainer, 2026-10-20; reaffirmed 2026-11-02): thin cut the + shipping build's wall about 12% and grew `libmoq_ffi.a` about 15%, but + release builds are off the PR gate while a runtime cost would reach every + user. Compare the two only from fresh targets. +- Rejected, don't repeat: sharing moq-net's BTree key types + ([experiment](/.github/btree-build-audit.md)); moving MP4 readers from + bare slices to cursors, since mp4-atom's own decoders introduce both forms; + generic transport session bodies, which + [moq-dev/moq#6176](https://github.com/moq-dev/moq/pull/6176) removed. +- Measure edits through mbx and repeat each: the first edit records + incremental state. In a warm edit the final binaries are about half the + unit time. On the hybrid host use `perf stat --no-scale`. +- Rows built with dev-dependencies shift across the cargo-hakari + workspace-hack ([moq-dev/moq#6985](https://github.com/moq-dev/moq/pull/6985)). + Feature unification belongs to [hakari follow-ups](/quest/m0/ci/hakari-followups.md). + +### Check first: artifact size + +- Compare the first complete Shipping sizes report after the cut with the + previous run's. Never compare an archive to an ELF, different targets, or + symbol-preserving to stripped builds. JS rows are synthetic first-load + bundles from `sh/size/bundles.ts`; attribute only an entry's static import + closure and normalize hashed filenames. +- `nm -S -C --defined-only` on the shipped static libraries attributes native + growth by namespace. +- Kept: `sorted-btree` (the `@js-sdsl/ordered-map` candidate was slower on + ascending and rolling arrivals), and the whole Rust workspace in the Python + sdist, minus `test_data` + ([moq-dev/moq#6867](https://github.com/moq-dev/moq/pull/6867)). + `opt-level = "s"` for the bindings needs codec, crypto, and FFI throughput + measurements first. + +### Check first: dependencies + +- Research each candidate's maintenance, performance, and API fit before a + swap. Manual bumps respect Dependabot's 7-day cooldown; security fixes + bypass it. +- What Dependabot misses: majors and 0.x minors (`cargo upgrade --dry-run + --incompatible allow --pinned allow --ignore-rust-version`, `bun outdated + -r`, and `bun outdated` in each standalone Bun project), `0.0.x` ranges and + `npm:` aliases, and lockfiles missing from `.github/dependabot.yml`. + `dart/moq` and `nix/uniffi-dart-Cargo.lock` are uncovered on purpose. +- The QUIC fork has no advisory feed: list quinn-proto and quinn-udp + advisories on RustSec and GHSA, port any fix, and record the newest + reviewed upstream commit in `rs/moq-quic/README.md` (decided 2026-10-28). +- Waiting on upstream: [ashpd](/quest/m4/ashpd-maintained.md) and + [askama](/quest/m4/askama-maintained.md); the root Bun overrides for glob, + minimatch, chokidar, postcss-selector-parser, and Vite, each removable once + its parent allows a safe range; `deny.toml`'s proc-macro-error2 ignore, + until core-models moves to hax-lib 0.4; paste through tikv-jemalloc-ctl; + http-cache-reqwest's 1.0 prerelease; and the local `TransportStats` in + `js/net/src/connection/stats.ts`, until TypeScript's DOM has + `WebTransportConnectionStats`. +- Most duplicate versions in `Cargo.lock` come from upstream ecosystem + transitions; check the consumer before calling one removable. Fix a + transitive Bun advisory with a targeted `bun update --lockfile-only + --ignore-scripts`, not a regenerated lockfile. +- Kept on purpose, each with live consumers a replacement would reimplement: + `tracing-android`, `humantime-serde`, `hex`, `send_wrapper`, `byteorder`, + `assert_matches`, `cpu-time`, `stats_alloc`, `unsafe-libopus`, the + QUIC/UDP, RTMP, V4L2, NVIDIA, VA-API, UniFFI, and LibAV forks + ([vendor-sync](/quest/m3/vendor-sync/README.md) ports upstream), and JS's + Zod, pako, sorted-btree, and UUIDv7. `moq-gst` keeps its Rust 1.92 floor + for GStreamer. + +## Required + +- [Release cut](/quest/m3/release/cut.md) - the release in flight ships before this run starts diff --git a/quest/m3/audit-dead-code.md b/quest/m3/audit-dead-code.md deleted file mode 100644 index 95da4a339be..00000000000 --- a/quest/m3/audit-dead-code.md +++ /dev/null @@ -1,88 +0,0 @@ -# [M] Dead code and API surface audit - -## Goal - -Code, exports, Cargo features, and CLI flags that nothing uses are deleted, or -are planned for deletion when removal breaks a public API. - -## Plan - -Recurs once per major release (decided 2026-10-19). The PR that finishes -this run also adds the next one with the same file name at the end of m3's `Required`, which the shift after the next cut -brings into m1. The successor keeps the Goal -and this paragraph; the rest of its Plan is rewritten with what this run -learned: baselines, results, and what to check first. The successor also lists the [release cut](/quest/m3/release/cut.md) under `Required`, so it -waits for the release in flight to ship. Only `/quest-delete` ends the -recurrence. Fixes land in the run's PR, one commit each, rather than as follow-ups. -Only a change that needs a maintainer decision (public API, scope) or is -independently landable and too large to review alongside the rest becomes a -follow-up through `/quest-plan`. - -Removing a public item is a breaking change and the maintainer's call, so it is -always a follow-up, never an inline fix. - -The m1 run (2026-10-20) removed unused `@moq/signals` dependencies from -`@moq/json` and the browser bench, the web demo's unused `solid-element`, and -module-local exports in the carla web demo and `js/net`'s IETF -`MAX_AGE_OPTION` and `finCancels`. No Rust code, Cargo feature, or flag was -removed. It ran while the lint audit's PR rewrote every Rust suppression, -so the dead-code attributes were counted but left alone. - -Start by comparing the live tree against these baselines: - -- Rust had 423 dead-code/unused suppression lines: 77 unconditional, 346 - through `cfg_attr`. The unconditional ones are drop guards, compile-time - Send assertions, generated settings registries, shared test and benchmark - harnesses, deserialization fixtures, FFI tables, and - `group::Producer::abort_unused`, which only tests call since the answering - API that wanted it was dropped. - Once the lint audit lands, every unconditional one is an `expect`, so a - stale one fails the build; check what the conditional ones still guard. - `cargo shear` found no unused dependencies. -- Rustc misses unused `pub` items. Tokenizing the tree and keeping `pub` - declarations whose name appears exactly once (`.tmp` script, not - checked in) found, outside generated bindings: - - cfg(test) helper `track::Subscriber::assert_error` in moq-net's model, - since removed. `AnnounceConsumer::assert_next_restarted`/`assert_next_ended` - also matched, but `model/origin.rs` calls them. - - Public items no consumer calls: `moq_net::Version::uses_setup_negotiation` - (since removed), `moq_tokio::Server::serve_both`, `quic::web` `ClientBuilder::with_server_certificates` - and `ServerBuilder::with_certificate`, `hang` `Catalog::to_json_pretty`, - `moq_audio::Format::is_planar`/`is_float`, and the vendored forks - (`moq-quic`, `moq-sock`, `moq-v4l`) that keep upstream's surface. - Rerun it first; a name used only by its definition is the shortlist. -- Knip 6.42.0 with explicit entries for Bun tests, `*.browser.ts`, benches, - examples, worklets, TSX, every `test/*` client, the repo-root scripts, and - `ignore` for `rs/**/test_data` reports only real findings plus root - devDependencies used as CLIs and `tsx`/`wrangler` run by scripts. Preserve the - TypeScript DOM override and `rolldown` wherever a Vite config loads - `js/common/vite-plugin-worklet.ts`. `doc/concept/audio-jitter/reference.ts` - exports constants only it uses; it was skipped because an open PR rewrote - it. -- There were 150 Cargo feature declarations across 27 manifests. Only three - have no in-tree user: the moq-native tombstone's `android-logcat`, the QUIC - FIPS crypto feature, and moq-cli's `nvenc`/`nvdec` aliases, since removed - like moq-video's and moq-transcode's. -- The settings registries declared 120 distinct long flags, 186 counting - every `usage` declaration. Each one reaches a runtime consumer; the - `--client-*`/`--server-*` QUIC and TLS spellings and the relay's legacy auth - fields are hidden deprecated spellings that fail with migration guidance. - Trace a flag through the config merge, not through prose or examples. - -No public removal landed in this run itself; the items marked removed above -went in a follow-up PR. Propose any public removals separately with their migration and consumer evidence. The public model and -performance audits own their API and benchmark decisions. - -From the 2026-10-25 run: - -- moq-tokio's `RecvBandwidth::poll` still handles a closed output, but `out` - can no longer close while that call borrows it - ([moq-dev/moq#6744](https://github.com/moq-dev/moq/pull/6744)). -- Locals and fields still named `dynamic` after the `requests()` rename - ([moq-dev/moq#6752](https://github.com/moq-dev/moq/pull/6752)). - -Changed 2026-11-07 (maintainer, /quest-plan from the API sweep of open PRs and remaining quests): the public-item pass runs before the cut as [api-shape](/quest/m2/api-shape/README.md)'s own work, removing this run's shortlist (`Server::serve_both`, `Catalog::to_json_pretty`, `Format::{is_planar, is_float}`); this audit keeps private code. - -## Required - -- [Release cut](/quest/m3/release/cut.md) - the release in flight ships before the next audit starts diff --git a/quest/m3/audit-deps.md b/quest/m3/audit-deps.md deleted file mode 100644 index 3650393be70..00000000000 --- a/quest/m3/audit-deps.md +++ /dev/null @@ -1,255 +0,0 @@ -# [M] Dependency and alternatives audit - -## Goal - -Every dependency, vendored ones included, earns its weight: the fewest that -do the job, each current, deduplicated, and the best maintained option. A -dependency whose use is trivial, that another already covers, or that serves a -feature not worth keeping is removed. Only hand-rolled nontrivial non-core code -that a maintained library covers is planned for replacement. - -## Plan - -Recurs once per major release (decided 2026-10-19). The PR that finishes -this run also adds the next one with the same file name at the end of m3's `Required`, which the shift after the next cut -brings into m1. The successor keeps the Goal -and this paragraph; the rest of its Plan is rewritten with what this run -learned: baselines, results, and what to check first. The successor also lists the [release cut](/quest/m3/release/cut.md) under `Required`, so it -waits for the release in flight to ship. Only `/quest-delete` ends the -recurrence. Fixes land in the run's PR, one commit each, rather than as follow-ups. -Only a change that needs a maintainer decision (public API, scope) or is -independently landable and too large to review alongside the rest becomes a -follow-up through `/quest-plan`. - -Default to removing (decided 2026-11-01, maintainer): whatever doesn't earn its -cost is deleted inline, and the PR body lists each deletion with its measured -cost and why it wasn't worth it. Only what earns its keep is refactored to be -cheaper instead. Prefer fewer dependencies, and count each one's -compile time and transitive tree in its cost. Removing a public API or a user-facing feature stays a -follow-up. - -Research the state of the art for each candidate: compare maintenance, -performance, and API fit before planning a swap. Respect Dependabot's 7-day -cooldown for manual bumps too; security fixes bypass it. - -### Check first - -Dependabot misses three kinds of update, so list them by hand: - -- Majors and 0.x minors. `cargo upgrade --dry-run --incompatible allow - --pinned allow --ignore-rust-version` lists them for every manifest; - without `--ignore-rust-version` it hides any release above a crate's MSRV. - `bun outdated -r` covers the workspace; run `bun outdated` in each - standalone Bun project too. -- `0.0.x` ranges and `npm:` aliases. `npm:@types/web@^0.0.350` sat for four - months with no proposal. -- Lockfiles Dependabot doesn't know about. Compare `git ls-files '*.lock' - '*flake.lock'` against `.github/dependabot.yml`. The m1 run found infra/mbx, - infra/nix, and test/smoke/flake.lock missing, all added that week. - Bun's coverage is now a `/infra/*` glob, and `just js audit` and - `just js workers` walk every tracked `bun.lock`. - -Deliberately uncovered: `dart/moq` (see the comment in -`.github/dependabot.yml`) and `nix/uniffi-dart-Cargo.lock` (pinned with the -generator). -The uniffi `>=0.33` ignore blocks nothing until 0.33 ships; keep it, since it -ties uniffi to the Go generator. - -The QUIC hard fork has no advisory feed: `cargo deny` can't match quinn -advisories against `rs/moq-quic` (quinn-proto) or `rs/moq-sock` (quinn-udp), -as `SECURITY.md` notes. List quinn-proto and quinn-udp advisories (RustSec, -and GHSA on quinn-rs/quinn) and the upstream commits since the last reviewed -one, port any security fix, and record the newest reviewed commit in -`rs/moq-quic/README.md` beside the fork point (`7616e6b2`). Added 2026-10-28 -(maintainer) from the second external security audit, instead of a separate -CI watcher. Check GHSA, not only RustSec: three 2026-09-30 quinn advisories -(GHSA-53rm-773f-4q8c, GHSA-wppq-2f6r-wfvm, GHSA-6pp4-4cxf-xf88) were in -GitHub's feed but not the local RustSec database. That audit found every -known fix already in the fork, each with a regression test. Kept as a -manual step on 2026-10-28 after that evidence; a machine-readable ledger -with a failing scheduled job was judged not worth it while the fork is -current. - -Open after the 2026-11-01 removal run: - -- The lock still carries vt100 0.17 (moq-cli dev-dependency). Re-check its - cost before upgrading; dependency upgrades alone were not this off-cycle - run's goal. -- `test/smoke/flake.lock` lands through the Smoke toolchain update workflow, - which bumps the npm `playwright` pin with it; confirm the coupled PRs land. -- http-cache-reqwest stays on its 1.0 prerelease (alpha.9) until 1.0 ships. - -Advisories waiting on upstream: - -- ashpd 0.13 pulls zbus 5 and the unmaintained zvariant, zvariant_derive, and - zbus_names (RUSTSEC-2026-0370, 0371, 0372). ashpd 0.14.0 (2026-11-05) carries - the zbus 6 port; [ashpd uses maintained D-Bus crates](/quest/m4/ashpd-maintained.md) - upgrades to it. -- basic-toml (RUSTSEC-2026-0374) comes through askama_derive's default - `config` feature in uniffi_bindgen 0.32, which reads its `askama.toml`. - It only reaches the generator-only uniffi fork and never ships. -- The root Bun audit uses version-scoped overrides for chokidar 3 to 4 - (removing braces), postcss-selector-parser 6 to 7.1.7, and Vite 5 to 6.4.5 - (also removing vulnerable esbuild). It also overrides glob to 14.0.3 or - newer (GHSA-3g3m-2fjr-6pw4) and minimatch to 11.0.3 or newer - (GHSA-g3hv-75wg-m249). Remove each override when its parent declares a safe - dependency range: remark-cli/unified-args/unified-engine still requires - glob 10; TypeDoc and vitepress-plugin-llms still require minimatch 10; - `@npmcli/map-workspaces` also requires glob 10 and minimatch 9, and - `@npmcli/package-json` requires glob 10. - `@tailwindcss/typography` and VitePress own the other parser/bundler ranges. - All seven tracked Bun lockfiles audit clean after the 2026-11-03 repair. -- proc-macro-error2 (RUSTSEC-2026-0173) is unmaintained, not a reported - vulnerability. moq-auth, moq-crypto, moq-hls and moq-cli reach it through - rind's libcrux stack, then libcrux-intrinsics 0.0.9's - `cfg(hax)` dependency on core-models 0.0.7, which still requires hax-lib - 0.3.7 and its build-time hax-lib-macros. Those are the latest stable - libcrux-intrinsics/core-models releases as of 2026-11-03. The advisory is - ignored in deny.toml; remove that ignore when core-models migrates to - hax-lib 0.4 or newer, whose macros no longer require proc-macro-error2. -- paste (RUSTSEC-2024-0436) remains through tikv-jemalloc-ctl. tikv-jemallocator's unreleased main drops it. - -### Baselines (2026-11-01 removal run) - -Cargo.lock contains 1,115 registry package versions, 98 registry names with -several versions (117 extra), unchanged by this run. Count from the lock, -including optional/platform dependencies, rather than the default-feature -`cargo metadata` graph (974 registry packages). Exclude workspace and git -packages. Root bun.lock goes from 729 to 726 non-workspace names, with 80 -names at several versions (91 extra), counting distinct resolved versions -per name. This is a new snapshot, not a like-for-like attribution of growth -since 2026-10-20. - -Most duplicates still come from upstream ecosystem transitions: RustCrypto's -older generation through rsa/jsonwebtoken/STUN/SRT; retina's h264-reader 0.8 -and bitstream-io 2; srt-tokio's older rand/socket2/derive_more; rustls-acme's -rcgen 0.13 and web client; winit's older platform stack; and libspa's -system-deps 7 beside GStreamer's 9. mp4-atom still holds thiserror 1. Do not treat -all 117 extras as locally removable without checking those consumers. - -Bun's same-major duplicates can persist until a parent re-resolves. -`bun update glob minimatch --lockfile-only --ignore-scripts` with Bun 1.4.2 -reapplied the existing overrides on 2026-11-03, removing the vulnerable -nested resolutions without changing unrelated package versions. Prefer a -targeted update for a transitive security bump, then verify with -`bun install --frozen-lockfile` and `just js audit`. Re-check the current -package-manager capabilities before attempting broader deduplication. - -Removed inline, with no dependency upgrades: - -- `rimraf` from all 19 JS package build scripts: use `rm -rf dist`, supported - by Bun's cross-platform shell. The installed package was 261,819 bytes; - a warm 30-run nested-output deletion measured median 24.33 ms through its - Bun CLI versus 2.41 ms through `bun exec rm -rf` on this host. Its glob - stack remains needed by other tools or the existing override resolution; - no transitive-package saving is claimed. Preserve those lock entries: - regeneration rehoists unrelated packages and drops existing safe pins. -- `@zod/mini` from six runtime and two peer declarations: its JS and type - entrypoints only re-export `zod/mini`. Use that existing dependency - directly, keeping every package's `zod` declaration. The wrapper costs - 5,615 installed bytes and no exclusive transitive packages. Validate the - built declarations as isolated package consumers, not only workspace - source imports. -- `async-mutex` from `@moq/net`: no source, test, emitted type or script - imports it. Delete the unused runtime declaration; `tslib` remains shared - with build tooling. Its installed package was 63,046 bytes; no replacement - or exclusive-transitive saving. -- `hang`'s `regex` dependency: fixed AV1 fields use the existing - `codec_number` helper and byte patterns, retaining the grammar. Its - normal/build closure drops from 183 to 179 packages in the workspace's - default-feature graph: regex, regex-automata, regex-syntax, aho-corasick. - They remain in Cargo.lock for other consumers. A fresh uncached Nix - Rust 1.98.1 dev build with line-table debug info measured 3.12 s summed - compiler-unit time and 23,447,622 bytes of rlibs for those four crates; - that is standalone cost, not a measured workspace wall-time saving. - 19,598 original/replacement parser comparisons agreed. The existing - nightly `moq-mux --bench catalog` target now includes short/full/partial - AV1 parsing. Paired optimized scratch measurements (five million parses - per case) were 113/248/45 ns before and 14/53/22 ns after; no timing gate. - -`cargo shear` found no unused dependency; its unlinked-file warnings are -compile-fail fixtures and feature-gated source, not permission to delete -coverage. Test deletion and optimization belong to -[the concurrent test audit](https://github.com/moq-dev/moq/pull/7600). - -The 2026-11-03 Nightly audit repair re-resolved glob 10.5.0 to 14.0.3 and -both minimatch 9.0.9 paths to the shared 11.0.4 resolution under the existing -root overrides. The root and standalone Bun audits now pass. Rust's audit -also passes with the advisory-specific policy above. The 2026-11-01 -removal run's full `just ci` was limited by mbx E2BIG on workspace `cargo doc` -([moq-dev/moq#7594](https://github.com/moq-dev/moq/pull/7594)) and the runner -image's denied user namespace. Neither was bypassed for validation. - -### Kept on purpose - -Re-judged for behavior and replacement cost, not age or upstream similarity. -The small-crate times below are compiler-unit times from the same fresh -standalone build, not incremental workspace savings. - -- `tracing-android`: the Android logcat sink is used by the shipped FFI - runtime. Replacing it means owning logging/FFI safety; another tracing - adapter only trades dependencies. Host builds do not compile it. -- `humantime-serde`: duration and optional-duration Serde semantics are used - across CLI configuration, scenes and impairment presets. `serde` and - `humantime` are already consumers' dependencies; the adapter itself cost - 0.05 s. A manual adapter would duplicate those behaviors. -- `hex`: encoding, strict decoding and decode-to-slice are used across - catalog fields, TLS fingerprints, persisted secrets and vectors. No - transitives; 0.10 s. A second encoding library or hand-written validation - would add maintenance; its error type is also part of existing APIs. -- `send_wrapper`: enforces thread ownership of io_uring's non-Send session, - streams and groups when adapting to moq-net's Send transport bounds. - Removing it means owning unsafe Send/Sync and off-thread drop behavior. - No transitives; 0.03 s. -- `byteorder`: RTMP's vendored chunk/message/AMF codec uses fallible Read/Write - helpers, including 24-bit integers and exact short-read behavior, across - many modules. Replacing the I/O adaptation is larger than replacing an - in-memory endian conversion. No transitives; 0.10 s. -- `assert_matches`: QUIC tests use guarded patterns and value extraction; - `matches!` cannot replace those call sites. No transitives; 0.03 s. -- `cpu-time` and `stats_alloc`: benchmarks consume thread CPU and allocation - counts respectively. Wall time cannot replace CPU time, and a custom - allocator would recreate stats_alloc's instrumentation. Their own units - cost 0.05/0.03 s; cpu-time also needs libc/platform bindings. -- `unsafe-libopus`: a nontrivial codec with active moq-audio consumers, - not a helper. No quest compares Opus backends (that plan was deleted - 2026-11-09); deleting Opus is a user-facing feature decision. -- `moq-gst` keeps its Rust 1.92 floor for GStreamer 0.25, above the - workspace's 1.91 library floor. Do not normalize that manifest to 1.91. -- The QUIC/UDP, RTMP, V4L2, NVIDIA, VA-API, UniFFI and LibAV forks all have - current transport, gateway, device, binding or codec consumers. Their - removal would drop behavior or recreate nontrivial platform code; - upstream porting stays with [vendor-sync](/quest/m3/vendor-sync/README.md). - OpenH264 and device integrations remain opt-in where already gated. -- Error/primitive derives remain shared infrastructure: `thiserror` is the - workspace convention; `derive_more` handles existing enum conversions, - displays and custom Debug output; `num_enum` handles protocol enum - mappings. No competing derive crate was added. -- JS keeps Zod validation, pako's interoperable compression, sorted-btree's - ordered range operations, and UUIDv7 generation. A local replacement - would own nontrivial parsing, compression, balancing or monotonicity. - -### Hand-rolled code - -Added: the fixed AV1 codec grammar now lives beside the other fixed codec -parsers. Keep it small and preserve malformed-field refusal; the benchmark -and shared catalog parity corpus exercise the consumer. - -moq-mux's avcC and hvcC records go through mp4-atom, its H.264 SPS through -h264-reader, and relay metrics through prometheus-client. -Re-checked and kept small or cold: capped doubling backoff loops (moq-tokio -already has a `Backoff`), per-byte hex formatting, the STUN token bucket, -JS deep equality, WebVTT stamps and `jwt=` lookups. Adding a library would -cost more than these local operations. `js/publish` and `js/watch` UI helper -copies remain a source duplication question, not a reason for another -package. Source/generics/generated-code build cost belongs to the concurrent -build-time audit. - -When TypeScript 7.1 is stable, re-check whether the DOM includes -`WebTransportConnectionStats` before deleting the local `TransportStats` in -`js/net/src/connection/stats.ts` (from -[moq-dev/moq#6625](https://github.com/moq-dev/moq/pull/6625)). - -## Required - -- [Release cut](/quest/m3/release/cut.md) - the breaking release ships before the next run diff --git a/quest/m3/audit-docs.md b/quest/m3/audit-docs.md index 7363e2e0648..9b6b8d1269e 100644 --- a/quest/m3/audit-docs.md +++ b/quest/m3/audit-docs.md @@ -7,59 +7,37 @@ undocumented exported symbols are fixed or planned. ## Plan -Recurs once per major release (decided 2026-10-19). The PR that finishes -this run also adds the next one with the same file name at the end of m3's `Required`, which the shift after the next cut -brings into m1. The successor keeps the Goal -and this paragraph; the rest of its Plan is rewritten with what this run -learned: baselines, results, and what to check first. The successor also lists the [release cut](/quest/m3/release/cut.md) under `Required`, so it -waits for the release in flight to ship. Only `/quest-delete` ends the -recurrence. Fixes land in the run's PR, one commit each, rather than as follow-ups. -Only a change that needs a maintainer decision (public API, scope) or is -independently landable and too large to review alongside the rest becomes a -follow-up through `/quest-plan`. +Recurs each major release: the PR that finishes a run keeps its results in +its own body and re-adds this file at the end of m3's `Required`, behind the +[release cut](/quest/m3/release/cut.md), with Check first rewritten. Fixes land +in that PR; only maintainer decisions (public API, scope) and changes too +large to review alongside become follow-ups. Follow `doc/AGENTS.md` for what belongs in `doc/`. The docs site deploys from -`release`, so a page describing an unreleased package (such as `@moq/video`, -first published by the release cut) is expected to 404 on its registry until -then. The m1 run (2026-10-21) found the stale claims in pages no PR had touched -for a while: the root `README.md` crate table, `doc/concept/transport.md`, and -the codec lists in `doc/bin/rtmp.md` and `srt.md`. Read those kinds of pages -claim by claim against the code first; the pages recent PRs edit are the -freshest. Baselines: - -- Rust: 31 crates set `#![warn(missing_docs)]`, including `moq-mux`, - `moq-ffi`, and `moq-c` since - [#6088](https://github.com/moq-dev/moq/pull/6088) and - [#6091](https://github.com/moq-dev/moq/pull/6091); m1 added `moq-shaper`. - Count the rest with - `cargo rustdoc -p --lib --all-features -- -W missing_docs`. - `moq-auth` is ambiguous with its crates.io copy, so pass its - `path+file://` spec. Every linted crate was clean with all features. - `moq-audio`, `moq-video`, and `moq-sock` were also clean on Linux but stay - unlinted for their macOS, Windows, and Android items. `moq-gst` has 3 items - from `gst::plugin_define!`. `moq-v4l` reports 3108, nearly all its generated - `sys` bindings; whether the fork earns docs is still undecided. -- JS: the doc build renders the API reference with TypeDoc and fails on any - TypeDoc warning, such as an unresolved link, but not on an undocumented - export, so look for those and check that docs say something. +`release`, so a page for a package the cut first publishes 404s on its +registry until then. + +Previous run: [moq-dev/moq#6170](https://github.com/moq-dev/moq/pull/6170). + +### Check first + +- Pages no recent PR touched, claim by claim against the code: last run's + stale claims were in the root `README.md` crate table, + `doc/concept/transport.md`, and the codec lists in `doc/bin/`. +- Rust: count undocumented items with `cargo rustdoc -p --lib + --all-features -- -W missing_docs` in crates without + `#![warn(missing_docs)]`. `moq-auth` needs its `path+file://` spec. Whether + `moq-v4l`'s generated `sys` bindings earn docs is still undecided. +- JS: TypeDoc fails on warnings but not on an undocumented export; look for + those. - Links: GET (not HEAD) every external URL in `doc/` with a browser user - agent. 316 URLs: all answered except placeholder and local hosts, relay - URLs that only speak MoQ, npmjs.com and w3.org pages that refuse - non-browser clients, and the unreleased items above. Check npm packages on - `registry.npmjs.org/` and crates on the crates.io API, since - crates.io pages answer 200 to anything. `README.md`'s `moq-c` badge waits on - the crate's first publish. -- CLI: all 68 shell invocations in `doc/`, `README.md`, and - `rs/moq-cli/README.md` parse with `--help` appended against a build with - `capture,play,transcode,openh264`, after substituting a URL for the - elided `moq ...` connect. Unknown flags fail but bad values do not. - `gst-inspect-1.0` of a debug `moq-gst` build lists every element and pad - property `doc/bin/gstreamer.md` names. -- Cross-Package Sync: walked from `9b90cdd569` through `7d2a91fe66`. Walk the - next run from there. At that baseline, Go could not observe first-dial - failures because `Dial` returned only once connected. Every binding now - returns a connecting session with one coherent `state()` snapshot; verify - first-dial failure observation and Kotlin/Dart wording against that API. + agent. Check npm packages on `registry.npmjs.org` and crates on the + crates.io API, since crates.io pages answer 200 to anything. +- CLI: every shell invocation in `doc/`, `README.md`, and + `rs/moq-cli/README.md` parses with `--help` appended; `gst-inspect-1.0` + lists every property `doc/bin/gstreamer.md` names. +- Cross-Package Sync: walk the commits since `7d2a91fe66` for a feature one + language or binding lacks. ## Required diff --git a/quest/m3/audit-interop.md b/quest/m3/audit-interop.md index e5d188a98c8..14439e211e4 100644 --- a/quest/m3/audit-interop.md +++ b/quest/m3/audit-interop.md @@ -12,181 +12,72 @@ feature outside the moq-net API). ## Plan -Recurs once per major release (decided 2026-10-21). The PR that finishes -this run also adds the next one with the same file name at the end of m3's `Required`, which the shift after the next cut -brings into m1. The successor keeps the Goal -and this paragraph; the rest of its Plan is rewritten with what this run -learned: baselines, results, and what to check first. The successor also lists the [release cut](/quest/m3/release/cut.md) under `Required`, so it -waits for the release in flight to ship. Only `/quest-delete` ends the -recurrence. Fixes land in the run's PR, one commit each, rather than as follow-ups. -Only a change that needs a maintainer decision (public API, scope) or is -independently landable and too large to review alongside the rest becomes a -follow-up through `/quest-plan`. +Recurs each major release: the PR that finishes a run keeps its results in +its own body and re-adds this file at the end of m3's `Required`, behind the +[release cut](/quest/m3/release/cut.md), with Check first rewritten. Fixes land +in that PR; only maintainer decisions (public API, scope) and changes too +large to review alongside become follow-ups. Decided with the maintainer on 2026-10-21: - Scope: the relays page (our published Rust, browser, and Bun clients - through every registered public relay), plus every cell of the runner's - report with a moq.dev side: our clients, our docker relay, or - `cdn.moq.dev`, including third-party clients failing against our relay. - Smoke's upstream runner job fails only on our clients against our relay, - so this audit is what catches every other red cell. -- Sync new registry entries. The smoke workflow's upstream runner job runs - the runner's HEAD, so check that newly registered clients and docker-only - relays show up in its [report](https://git.moq.dev/interop-runner/), - and ask upstream for a published image for any it lists as not run. The relays page reads every - remote relay from the registry; give new relays the per-relay config they - need (`publish_path`, `WEBSOCKET_KEYS` in `test/smoke/relays.sh`). + through every registered public relay), plus every runner cell with a + moq.dev side: our clients, our docker relay, or `cdn.moq.dev`, including + third-party clients against our relay. Smoke's runner job fails only on our + clients against our relay, so this audit catches every other red cell. +- Sync new registry entries: check that new clients and docker-only relays + show up in the runner's [report](https://git.moq.dev/interop-runner/), and + give new relays their per-relay config (`publish_path`, `WEBSOCKET_KEYS` in + `test/smoke/relays.sh`). - Standing approval to open PRs on englishm/moq-interop-runner that touch only the `moq-dev-*` builds and registry entries, and to file reproducer issues - on other implementations' repos. Every post ends with the AI marker. - -Both reports run published packages, so a fix turns green only after it -ships. Verify from `main` instead. For our clients through a third-party -relay, `CLI_BIN=target/debug/moq just relays --only --publishers rust ---subscribers rust` from `test/smoke`. For a third-party client through our -relay, run its published runner image (`RELAY_URL`, `TLS_DISABLE_VERIFY=1`, -`TESTCASE`) on the host network against a `moq-relay` built from `main`. -For the runner's own cases from `main`, build its `moq-dev-rs` or -`moq-dev-js` client against this checkout; both need small ports to -`main`'s API. Read the cell's log before classifying. + on other implementations' repos. Asking upstream for anything else, such as + restoring the commented-out image rebuild schedule, needs the maintainer. + +Both reports run published packages, so verify a fix from `main`: for our +clients through a third-party relay, `CLI_BIN=target/debug/moq just relays +--only --publishers rust --subscribers rust` from `test/smoke`; for a +third-party client through our relay, its published runner image +(`RELAY_URL`, `TLS_DISABLE_VERIFY=1`, `TESTCASE`) on the host network against +a `moq-relay` built from `main`. Read each cell's log before classifying, and +group cells only when their logs share a cause. A merged runner bump reaches +the nightly only after someone dispatches an image rebuild; check its GHCR +tag. + +Previous runs: [moq-dev/moq#6538](https://github.com/moq-dev/moq/pull/6538), +[moq-dev/moq#7050](https://github.com/moq-dev/moq/pull/7050), and +[moq-dev/moq#7104](https://github.com/moq-dev/moq/pull/7104). ### Check first -The m1 run (2026-10-23) read the runner's 2026-10-23 nightly (77 of 139 -moq.dev cells red; clients on moq-tokio 0.19.28 and `@moq/net` 0.4.4, -docker relay moq-relay 0.17.7) and the relays page (40 of 103 red). Most -red cells were already fixed on `main` and wait for the cut, so confirm -each turned green: - -- The runner's clients bumped to the cut, including the API port the - [runner client bump](/quest/m3/release/runner-client-bump.md) describes. - The JS client's `moqt://` dials (m0 fix) then reach every relay serving - WebTransport on that port; a raw-QUIC-only relay stays unsupported, since - JS has no raw QUIC. The JS client's red5 WebTransport cells still time out - connecting, which m0's one-write control messages target. -- `subscribe-namespace-lifecycle`: released JS withdraws a draft-18+ - PUBLISH_NAMESPACE with FIN, which six relays ignore, so it waits for - NAMESPACE_DONE. `main` resets the request - ([moq-dev/moq#5483](https://github.com/moq-dev/moq/pull/5483)) and passes - against Cloudflare draft-18; - [moq-dev/moq#6518](https://github.com/moq-dev/moq/pull/6518) backports it - to `release`. Released Rust never sees the NAMESPACE itself from quic-zig - or moxygen (docker); the client built on - `main` passes against both, so it gets no backport: the runner client bump - fixes it. -- Our relay through third-party clients: `rendezvous-timeout` 0x10 - (aiomoqt, imquic, quic-zig, Cloudflare draft-18), the relay stamping a - Timestamp property on every object - ([moq-dev/moq#5083](https://github.com/moq-dev/moq/pull/5083)), and moq-go - refusing a server without RESET_STREAM_AT (moq-quic) are fixed on `main`, - as are xquic's raw-QUIC connection errors (5 of 6 cases pass). An omitted - DEFAULT_PUBLISHER_PRIORITY or SUBSCRIBER_PRIORITY now forwards as 128, not 127. -- Through our relay, Cloudflare's draft-18 `data-subgroup-basic` still - fails on two items reported upstream: - [cloudflare/moq-rs#281](https://github.com/cloudflare/moq-rs/issues/281) - (its SUBSCRIBE_OK claims Largest Object (0, 0) before publishing it, then - refuses the joining FETCH) and - [cloudflare/moq-rs#282](https://github.com/cloudflare/moq-rs/issues/282) - (it fails our relay's END_OF_TRACK). - -Still red from `main`, ours: - -- moq-go's webtransport-go speaks WebTransport draft 15: it requires - SETTINGS_WT_ENABLED (0x2c7cf000) and sends `:protocol webtransport-h3`. - `web-transport-proto` 0.6.2 (moq-dev/web-transport) sends neither and - refuses the new token, so every moq-go cell against our relay fails. -- moq-dev-js `data-subgroup-basic` against libquicr never sees the track - end, while moq-dev-rs passes. Not yet traced. -- Every `js-web` publisher cell behind a joining FETCH (imquic, MOQtail - draft-22, aiomoqt, red5) was refused its FETCH; JS now serves cached and - draft-18 joining FETCH, so rerun them. - -Theirs, reported or waiting on others: - -- Reported before and still open: +- Most red cells were fixed on `main` and wait for the cut; confirm each + turned green once the [runner client bump](/quest/m3/release/runner-client-bump.md) + lands. +- Ours, still red from `main`: moq-go's webtransport-go speaks WebTransport + draft 15 (SETTINGS_WT_ENABLED and `:protocol webtransport-h3`), which + `web-transport-proto` doesn't; moq-dev-js `data-subgroup-basic` against + libquicr never sees the track end; moq-dev-js `announce-subscribe` times out + against imquic; moq-dev-js `setup-only` fails across many relays. +- Reported upstream, search before filing again: + [cloudflare/moq-rs#281](https://github.com/cloudflare/moq-rs/issues/281), + [cloudflare/moq-rs#282](https://github.com/cloudflare/moq-rs/issues/282), [moqtail/moqtail#450](https://github.com/moqtail/moqtail/issues/450), [openmoq/moqx#852](https://github.com/openmoq/moqx/issues/852), [gmarzot/aiomoqt#123](https://github.com/gmarzot/aiomoqt/issues/123), [yatagai-mm/Moqtopus#2](https://github.com/yatagai-mm/Moqtopus/issues/2), [facebookexperimental/moxygen#252](https://github.com/facebookexperimental/moxygen/issues/252), - and [facebookexperimental/moxygen#225](https://github.com/facebookexperimental/moxygen/issues/225) - (filter type 250, which also fails moxygen's and moqx's - `announce-subscribe` against our relay). -- [meetecho/imquic#42](https://github.com/meetecho/imquic/issues/42) is - fixed upstream; imquic's cells against `cdn.moq.dev` wait for the runner - to rebuild its image. - [meetecho/imquic#43](https://github.com/meetecho/imquic/issues/43) - (drops a data stream whose header spans reads) is closed, and the - runner's moq-dev-js client writes the header in one write since - `@moq/net` 0.4.7 - ([englishm/moq-interop-runner#179](https://github.com/englishm/moq-interop-runner/pull/179)): - `data-subgroup-basic` against imquic passes in all three cells of the - 2026-10-31 nightly. - [Eyevinn/moqlivemock#157](https://github.com/Eyevinn/moqlivemock/issues/157) - is fixed and green. -- Drafted in this run, posted only if the maintainer approved: MOQtail draft-18 never forwards - NAMESPACE for a later matching PUBLISH_NAMESPACE; moq-go dials only the - IPv6 address of `cdn.moq.dev` and needs an explicit port in an `https://` - URL; and the runner lists moqxr as not run for lack of a published image. - Search before filing again. -- To file: cloudflare/moq-rs `SubscribeRecv::error` returns before setting - `closed` when `TrackWriter::close` fails because the track has no reader, - so a REQUEST_ERROR reaches the caller as `done` instead of not-found. - Smoke's Cloudflare probe holds its reader to avoid it - ([moq-dev/moq#7073](https://github.com/moq-dev/moq/pull/7073)). -- Not reported, lower value: red5 subscribes the published prefix instead - of the requested tuple namespace (no public repo); moqlivemock's relay - refuses a SUBSCRIBE under an announced prefix; libquicr answers - SUBSCRIBE_OK for an unpublished namespace; xquic sends `moq-test/interop` - as one tuple field, and its WebTransport never reaches our relay. - -Unsupported or down, not worth rechecking unless something changes: -PUBLISH and SUBSCRIBE_TRACKS cases (`publish-track-*`, `namespace-discovery`, -Cloudflare's PUBLISH cases), relays without namespace discovery, which -moq-net needs before a SUBSCRIBE (xquic-draft-18), peers speaking only -moq-transport drafts 14 to 17 (Cloudflare's draft-14 and draft-16 relays), -quiche-moq (connect idle timeout), xquic's docker relay (binds loopback), -and moqtopus and xquic-draft-18 over WebTransport (raw QUIC only). - -Added 2026-10-31, from the runner's 2026-10-31 nightly -[41149054952](https://github.com/englishm/moq-interop-runner/actions/runs/41149054952) -as read by [moq-dev/moq#7050](https://github.com/moq-dev/moq/pull/7050) and -[moq-dev/moq#7104](https://github.com/moq-dev/moq/pull/7104) (moq-dev-js on -`@moq/net` 0.4.7): - -- moq-dev-js fails `setup-only` in about 505 ms with an empty message in - three cells: remote QUIC against Cloudflare draft-18, remote QUIC against - aiomoqt, and aiomoqt docker, on 0.4.4 and 0.4.7 alike. WebTransport to the - same hosts passes. The two remote QUIC cells are probably the raw-QUIC - limitation under Check first; the aiomoqt docker cell is unexplained. -- The same nightly shows moq-dev-js `setup-only` failures against - libquicr, moqlivemock, moq-dev-rs, moqtail, moqx, quiche-moq, red5, - stitcher-moq, and xquic-draft-18. Classify each cell from its own log, - and group cells only when their logs show a shared cause. -- imquic: moq-dev-js `subscribe-before-announce` fails in both remote cells - (`lminiero.it`), and `publish-namespace-done` in the remote-quic cell; all - three pass in the docker cell. -- Runner image staleness: a merged moq-dev-* bump reaches the nightly only - after someone dispatches an image rebuild, because the schedule in the - runner's `rebuild-all-images.yml` is commented out. After a bump merges, - check its GHCR tag. Asking upstream to restore the schedule is outside - the standing approval, so get the maintainer's first. -- The runner's `moq-rs-draft-18-relay` and `moq-rs-draft-18-client` image - builds (Cloudflare draft-18) failed in the 2026-10-22 rebuild and both - 2026-10-28 rebuilds, so those cells run stale images. + and [facebookexperimental/moxygen#225](https://github.com/facebookexperimental/moxygen/issues/225). + Not yet filed: cloudflare/moq-rs `SubscribeRecv::error` reports a + REQUEST_ERROR as `done` when the track has no reader. +- Unsupported or down, not worth rechecking unless something changes: + PUBLISH and SUBSCRIBE_TRACKS cases, relays without namespace discovery, + peers speaking only moq-transport drafts 14 to 17, raw-QUIC-only relays + from JS, quiche-moq, and xquic's docker relay. ## Required - [Release cut](/quest/m3/release/cut.md) - waits for the release in flight to ship -From the 2026-10-25 run: the runner's moq-dev-js `announce-subscribe` case times -out against imquic on both 0.4.4 and the [moq-dev/moq#6769](https://github.com/moq-dev/moq/pull/6769) -backport, so it predates that fix. It still times out on 0.4.6 and 0.4.7 -(2026-10-28, 3 runs each), and fails in all three moq-dev-js → imquic -cells of the 2026-10-31 nightly. Classify it. - ## Related -- [Runner client bump](/quest/m3/release/runner-client-bump.md) - the runner's Rust client moves to the cut and its API - [Runner teardown](/quest/m5/interop-runner-approval.md) - the runner's moq.dev clients move to the withdrawing `close()` once it ships diff --git a/quest/m3/audit-lints.md b/quest/m3/audit-lints.md deleted file mode 100644 index 298a4d2cf20..00000000000 --- a/quest/m3/audit-lints.md +++ /dev/null @@ -1,148 +0,0 @@ -# [M] Lint override and deprecation audit - -## Goal - -Every lint suppression in first-party code, in every language, is still -needed and says why, or is removed. Nothing calls an upstream API -deprecated at the supported toolchain (the workspace MSRV), and our own -deprecated items are removed or planned for removal once their -migration window has passed. - -## Plan - -Recurs once per major release (decided 2026-10-20). The PR that finishes -this run also adds the next one with the same file name at the end of m3's `Required`, which the shift after the next cut -brings into m1. The successor keeps the Goal -and this paragraph; the rest of its Plan is rewritten with what this run -learned: baselines, results, and what to check first. The successor also lists the [release cut](/quest/m3/release/cut.md) under `Required`, so it -waits for the release in flight to ship. Only `/quest-delete` ends the -recurrence. Fixes land in the run's PR, one commit each, rather than as follow-ups. -Only a change that needs a maintainer decision (public API, scope) or is -independently landable and too large to review alongside the rest becomes a -follow-up through `/quest-plan`. - -Scope is every language (decided 2026-10-20): clippy and rustc overrides, -`clippy.toml`, `biome-ignore`, `@ts-expect-error`, `noqa` and -`type: ignore`, Kotlin `@Suppress`, and the equivalents in Go, Swift, Dart, -and C/C++. `dead_code` and `unused` suppressions belong to the [dead code -audit](/quest/m3/audit-dead-code.md); skip them here. Generated or vendored -bindings (`moq-nvenc`, `moq-v4l/src/sys`, `moq-rtmp/src/rml`, and the -untracked UniFFI output) keep their blanket allows unless the generator can -emit clean code. Shell `shellcheck disable` comments stay out of scope. - -A suppression stays only when fixing the lint would make the code worse; a -signature reshaped to satisfy `too_many_arguments` or `large_enum_variant` -on a public type is an API change, so it is a follow-up. Removing one of our -own deprecated exports or hidden CLI spellings is a breaking change, so it is -also a follow-up. - -### Gates already in place - -Every workspace crate sets `lints.workspace = true` (moq-quic joined in the -m1 run, dropping quinn's extra lints), and the root `[workspace.lints]` -enables `clippy::allow_attributes_without_reason`. Unconditional -suppressions are `expect`, so a stale one fails clippy as -`unfulfilled_lint_expectations`. Biome reports an unused `biome-ignore` as -`suppressions/unused`, ruff selects `RUF100` (root and `demo/carla/sim`), -and pyright's `reportUnnecessaryTypeIgnoreComment` is an error for the -Python wrapper. This run only reviews what those gates can't see. - -### Check first - -- Lanes clippy never runs. Linux CI lints default and all features only, and - the macOS and Windows platform lanes run `cargo check`, so an `expect` that - holds only on Linux, or only with a feature on, passes CI while failing - elsewhere. Run clippy for `aarch64-apple-darwin` and - `x86_64-pc-windows-gnu` from Linux: a scratch rust-overlay toolchain - carrying those std targets, `zig cc` as the C and C++ compiler for crates - with build scripts (`-target aarch64-macos` after dropping `-arch` and - `-mmacosx-version-min`), and the platform lane's features plus - `moq-video/render`. That found every stale suppression the m1 run fixed. -- Windows clippy still reports dead code the [dead code - audit](/quest/m3/audit-dead-code.md) owns: `capture::pump::Read::Idle` - (only X11 holds a capture idle) and `I420::from_bgra`, whose cfg and doc - still name Windows Desktop Duplication though only PipeWire calls it. -- Swift: the nightly macOS platform job builds the wrapper and tests with - Xcode. Read its Swift step for compiler warnings rather than building on - Linux, which has no Apple SDK. -- TypeScript deprecations: typescript-eslint supported TypeScript - `>=4.8.4 <6.1.0` at the m1 run, so `no-deprecated` ran from a throwaway - package pinning typescript 6 and eslint 9, with an explicit - `allowDefaultProject` list for files outside any `tsconfig`. Check whether - it supports TS 7 before repeating that; if it does, consider joining CI. -- The CARLA sim's pyright check removes the installed bindings, so it can't - enable `reportUnnecessaryTypeIgnoreComment` without falsely flagging its - three needed ignores. Audit it with the bindings installed. - -- Atomic `fetch_update` (added 2026-10-31, from - [moq-dev/moq#7280](https://github.com/moq-dev/moq/pull/7280) and - [moq-dev/moq#7315](https://github.com/moq-dev/moq/pull/7315)): the pinned - nightly warns that it is deprecated in favor of `try_update`. Nine files - call it on be39188000 (`git grep fetch_update -- rs`), six in moq-net, - plus kio, moq-c, and moq-mux. `try_update` is stable since Rust 1.95 and - the workspace `rust-version` is 1.91, so switching needs that MSRV bump. - `fetch_update` is not deprecated at the 1.91 MSRV, so keeping it there is - what the Goal allows: if the MSRV stays, keep the calls, list them under - this run's Results with the MSRV that unblocks `try_update`, and allow the - nightly's deprecation warning where it fires. Fixing it keeps the nightly - pin easy to bump. - -- `set_var`/`remove_var` (decided 2026-10-31, maintainer, the - /quest-complete requeue session): replace `rs lint`'s `git grep` text - check (`rs/justfile`, the `lint` recipe) with a `disallowed-methods` entry - for `std::env::set_var` and `std::env::remove_var` in the root - `clippy.toml`, which arrives with - [moq-dev/moq#7329](https://github.com/moq-dev/moq/pull/7329) (queued). The - recipe's comment says why it is text today: the clock lint's test - allowances (`expect(clippy::disallowed_methods)`) would also silence an - environment write, and a specific `reason` does not narrow what an - expectation silences. Move crate- and module-wide test expectations (such - as the one on `rs/moq-ffi/src/lib.rs`'s test-only `mod bench`) onto the - items that read the clock, and drop the text check only once none remain, so the - clippy entry still catches a write in a test. - -### Results (m1, 2026-10-24) - -- Rust: removed the Apple-only `msghdr_x` `non_camel_case_types` (Rust - exempts `repr(C)` structs) and a VideoToolbox `too_many_arguments` on a - seven-argument function. Clock expectations that held only on Linux or with - a feature moved onto the items that read the clock: moq-sock's shard and - UDP tests, moq-uring's benches, moq-video's PipeWire render test, and the - relay's Unix signal test. Windows-only code that read the host clock - unsuppressed (a `frame` GPU workload test and the `d3d11-resize-probe` - example) got `expect`s, moq-cli's `notify_ready` lost a `needless_return` - off Unix, and two Linux-only ACME test helpers got their callers' cfg. A - moq-mux bench `allow(dead_code)` lacked its reason, which also failed - Linux clippy. -- Deprecations: the AVFoundation `devicesWithMediaType` stays. Its - replacement needs `AVCaptureDeviceTypeExternal` (macOS 14+) for external - cameras, and the macOS 12.3 floor's alternative, - `AVCaptureDeviceTypeExternalUnknown`, is itself deprecated. The Swift - wrapper built without warnings under Xcode 26.6 in the 2026-10-22 nightly; - its later changes were FFI-only. 877 TypeScript files passed - `@typescript-eslint/no-deprecated`. -- Python: removed 23 unnecessary type ignores and made the wrapper's pyright - reject new ones. - -### Baselines (2026-10-24, after the m1 run) - -- Rust `clippy::` suppression attributes: 191 (167 `expect`, 14 `cfg_attr` - `expect`, 10 `allow`). Most common: `disallowed_methods` 128, - `disallowed_types` 50, `large_enum_variant` 23. -- Rust rustc suppressions: 51 (31 `expect`, 12 `cfg_attr` `expect`, 8 - `allow`), led by `non_camel_case_types` 17 and `irrefutable_let_patterns` - 12. `dead_code` and `unused`: 412, owned by the dead code audit. -- Rust `deprecated`: 1, the AVFoundation call above. -- TypeScript: 29 `biome-ignore` and 47 `@ts-expect-error`. -- Python: 7 `noqa` or `type: ignore`. - -Count with `git grep` over the whole tree, not per language directory, so -only tracked files count and none outside `rs/`, `js/`, or `py/` are missed. -Count multi-line Rust attributes too, since rustfmt wraps long ones. -Generated UniFFI bindings are untracked and carry their own suppressions; -leave them out, and fix a noisy one in the generator config instead of the -output. - -## Required - -- [Release cut](/quest/m3/release/cut.md) - the release in flight ships before this run starts diff --git a/quest/m3/audit-perf.md b/quest/m3/audit-perf.md index 0ffce2dfa78..a730dc782f5 100644 --- a/quest/m3/audit-perf.md +++ b/quest/m3/audit-perf.md @@ -10,17 +10,19 @@ for. ## Plan -Recurs once per major release (decided 2026-10-19). The PR that finishes -this run also adds the next one with the same file name at the end of m3's `Required`, which the shift after the next cut -brings into m1. The successor keeps the Goal, -this paragraph, and the release baseline section; the rest of its Plan is -rewritten with what this run learned: baselines, results, and what to check -first. The successor also lists the [release cut](/quest/m3/release/cut.md) under `Required`, so it -waits for the release in flight to ship. Only `/quest-delete` ends the -recurrence. Fixes land in the run's PR, one commit each, rather than as follow-ups. -Only a change that needs a maintainer decision (public API, scope) or is -independently landable and too large to review alongside the rest becomes a -follow-up through `/quest-plan`. +Recurs each major release: the PR that finishes a run keeps its results in +its own body and re-adds this file at the end of m3's `Required`, behind the +[release cut](/quest/m3/release/cut.md), with Check first rewritten. Fixes land +in that PR; only maintainer decisions (public API, scope) and changes too +large to review alongside become follow-ups. + +Fan-out paths need a sweep over both axes, and JS perf is judged in a +browser. Benchmarks never gate the merge queue (decided 2026-10-20, +maintainer); Nightly's [paired comparison](/bench/README.md#paired-comparison) +covers night-to-night drift. + +Previous run: [moq-dev/moq#6281](https://github.com/moq-dev/moq/pull/6281), +and the release comparison in [release-perf.md](/.github/release-perf.md). ### Release baseline @@ -35,170 +37,46 @@ bun bench/browser/micro.ts --bench frames --out /frames.json base=` is an export of `origin/release` with its own `bun install --frozen-lockfile`. Re-run every slower case in alternating -rounds and count instructions for any that holds (see Method). A ratio -against `release` shows where to look, not what to fix: `main` carries -features `release` lacks, so a flat per-operation cost usually pays for one, -while a cost that grows with `main`'s own sweep is accidental. Fix accidental -cost in this run, and record each accepted cost in its results with the -feature and PR it pays for. A browser row inside the `aa` spread is noise. - -### What the m1 run (2026-10-22) fixed - -Instruction counts are one optimized `--test --exact` iteration under callgrind, -collected inside a profiling boundary (see Method). - -- The export consumer reaps queued aborted groups only when delivery blocks, - not once per delivered frame. `annexb-export-queued-groups` (in the - `containers` bench) sweeps queued groups x frames per group: - 64 groups x 16 frames went from 12.36M to 4.47M (-64%); one group stays - within 1%. -- `group::Consumer` was 672 bytes because its prefetch batch held eight frames - inline, and every layer that hands out a group (track cursor, subscriber, - resume reader, mux consumer) moved it by value. The batch is now boxed on its - first fill: `annexb-export-queued-groups/64/1` -14.8%, - `track_recv_groups/arrival/512` -15.2%, `group_read_frames/single/4` +0.6%. - This recovers the m0 run's `memcpy` attribution to - [#6019](https://github.com/moq-dev/moq/pull/6019). -- Each catalog estimate read its rendition through a whole-catalog snapshot - three times, so every frame cloned every rendition. It now clones only the - entry: `catalog_estimate_fanout/hang/tracks_4/4` 106.2M to 59.0M (-44%), - `tracks_16/16` -53%. - -### What it attributed without a fix - -- `catalog_estimate_fanout` +4% across `fc0df978c`..`4327505086`: - [#6074](https://github.com/moq-dev/moq/pull/6074) +0.4%, - [#5543](https://github.com/moq-dev/moq/pull/5543) +3.3% (a larger - `VideoConfig` cloned on every estimate, which the fix above removed). The - [#5677](https://github.com/moq-dev/moq/pull/5677) step was not bisected; - the bench is now well below its Oct 19 baseline. -- Annex B export: per frame it is now below Oct 19 (`1tracks-64frames/256` - 1.185M vs 1.495M), but a per-export constant remains (+18.6k at one frame): - +8.8k catalog decode, +11k `track::Subscriber::poll_group` through the - resume reader, +2.6k track resolve. The duplicate-key check - ([#5941](https://github.com/moq-dev/moq/pull/5941)) replaced an equal-cost - merge check, so it adds nothing. -- `track_stamp_groups/append` (nightly +29% on all three depths, stayed): - 6,557 instructions per group at Oct 20 `f13283b302`, 7,729 at Oct 21 - `bc64b9c525`, 8,944 at this run. The first step is #6074's start index - (`TrackState::index_start`, a `BTreeMap` insert per group); - the second is `group::Handle::start` and `TrackState::wake_landed` taking the - track lock again on each group's first frame, partly offset by a cheaper - `write_frame`. - -Published history had only three distinct commits (Oct 20 `f13283b302`, which -has two reruns, Oct 21 `bc64b9c525`, Oct 22 `33940b6e33`), so the five-night -comparison moved here. Across those three, 13 of 1,756 Rust and FFI cost series -stayed over 25% worse on both later nights and 8 stayed over 25% better, which -is close to noise. The worse ones beyond the above: `track_pending_tail/repoll`, -`session_churn_held/moq-transport-22`, `lite_varint/encode/Datagram`, -`origin/announce/1000p_1000s`, `kio/contended_repoll` (threaded, not -CPU-attributable), and Kotlin FFI (swings 10-40% nightly). Throughput series -did not move. - -### What to check first - -- History: compare at least five nights by commit, now that it exists. Nightly - stores every series on `gh-pages` (`bench/costs`, `bench/rates`); re-runs add - duplicate points for one commit. Read the paired comparison on the table - page instead of raw history, calibrated in - [Paired comparison](/bench/README.md#paired-comparison). The first JS series (841) appeared on - Oct 22, and Dart still needs a recheck against the bindings history. -- The per-group write cost above, then the resume reader: at 16 single-frame - groups `track::Subscriber::poll_group` is 44% of the Annex B export - (174k of 397k), mostly `resume::Reader::poll_lowest`. -- `catalog::tracks::Rendition::stage` still clones and serializes the whole - catalog on every estimate to validate it before retaining it (62% of - `catalog_estimate_fanout/hang/tracks_4/4`). Validating only the edited entry - would weaken that guarantee for custom configs, so it needs a decision. -- The TS export grows with track count (1.50x release at `container-export/ts/1x1`, - 2.24x at `16x64`): `Schedule::index` and `Schedule::admit` - (`moq-mux/src/container/ts/schedule.rs`) scan and sort every queued unit - per PCR slot. -- e2ee expands the AES-GCM key on every frame (`aead` in - `moq-crypto/src/e2ee/protect.rs`), about a quarter of `protect`; release does too. - -### Method: attribute with instruction counts, not wall time - -Shared hosts run at load 20-60, where Criterion intervals span +/-50% and a -wall-clock bisect blames the wrong commit. Count instructions instead: - -- Export each commit with `git archive` into a scratch directory and build the - bench there with its own `CARGO_TARGET_DIR`, the current dev shell's - toolchain, `CARGO_PROFILE_BENCH_STRIP=none` and - `CARGO_PROFILE_BENCH_DEBUG=line-tables-only`. -- Wrap the timed routine in an `#[inline(never)]` function (the `containers` - bench's `export_queued_groups` is one) and run - `valgrind --tool=callgrind --toggle-collect='**' --test --exact `. - One iteration is deterministic to about 1%; for steady state, print a marker - per call and run `--bench --profile-time 5` instead. Without a boundary, - toggle on the operations the setup repeats (`append_group`, `write_frame`, - `finish` for `track_stamp_groups`) and divide by the count. -- `callgrind_annotate --inclusive=yes` diffs between two commits point at the - step; workspace sources show as `${workspace}`, so read them by name. -- A wall-time hold at equal instructions may be page faults: compare - `/usr/bin/time -f %R`, then pin glibc with `GLIBC_TUNABLES` (see - [the m1 release run](/.github/release-perf.md)) before blaming code. -- A bench that is not CPU-bound is not attributable this way: - `relay_auth_refresh` runs real loopback sockets and moved +27-60% on CI with - +0.4% instructions. - -### Baselines (m1 run, instructions per iteration) - -| Bench | Earliest measured | m1 PR | -|---|---|---| -| `annexb-export-frames/1tracks-16frames/256` | 374k (Oct 19 `ad87ad34e`) | 397k | -| `annexb-export-frames/1tracks-64frames/256` | 1.495M (Oct 19 `ad87ad34e`) | 1.185M | -| `cmaf-export-frames/4tracks-16frames/4096` | 7.77M (Oct 19 `ad87ad34e`) | 7.87M | -| `catalog_estimate_fanout/hang/tracks_4/4` | 102.1M (`fecb57131`, before #6074) | 59.0M | -| `track_stamp_groups/append/512`, per group | 6,557 (Oct 20 `f13283b30`) | 8,944 | -| `track_recv_groups/arrival/512` | 3.27M (main `2e3ea8484`) | 2.78M | - -### Unbenchmarked hot and fan-out paths, ranked - -Each needs a bench, swept over both axes where it fans out, or its own -follow-up quest. The m1 run added none of these: - -1. HLS request fan-out: - repeated segment fetch/remux and playlist rendering, swept over viewers, - renditions and window segments. -2. LOC and CMAF wire containers in moq-mux: `containers` and `export` only use - `Container::Legacy`; sweep container x frame size x frames. -3. Browser media copies: - CMAF sample copies and LOC encode allocation. Generic `js/msf` and - `js/flate` benchmark coverage remains here. -4. moq-quic loss recovery and real congestion controllers: every bench pins - `Unlimited`; sweep controller x flight x loss x streams. -5. Announcement snapshots: - HTTP snapshot/rendering costs across routes and pollers. -6. JWT verification is covered: `moq-auth`'s `verify` bench runs nightly in - `rust-extra` (see [bench/README.md](/bench/README.md#auth-verification)). - Signature verification dominated every asymmetric algorithm; nothing - was changed. Track its `decide`, `set` and `sessions` series here. -7. MPEG-TS import with real repeated media (the CLI bench mostly skips null - padding), and MKV, FLV, H.265, AV1 importers. -8. JS watch audio ring buffer and publish `Fanout` (lower impact). Include - capture-to-encoder staging: `audio/framer.ts` copies planes before - `audio/encoder.ts` joins them. AudioData already uses a transfer list; - do not count that transfer as another mandatory copy. Sweep publishers - x renditions, channels and frame duration in a browser. - -The 2026-10-22 source survey's quests were deleted on 2026-11-09 for want of -a consumer; a measured regression or a consumer brings an item back, with -paired benchmarks required before optimization. This audit still owns nightly -regression attribution and the remaining coverage. Its fragmented-MKV child -specializes item 7's MKV work. - -Single-axis fan-out benches to widen: `session_delivery_paced` (viewers only), -`track_fanout_*` (subscribers only), `memory` (lite-06 only), and -`bench/workloads/fanout*.toml` (connections only). - -Fan-out paths need a sweep over both axes (AGENTS.md). JS perf is judged in a -browser, not node or bun. Benchmarks never gate the merge queue (decided -2026-10-20, maintainer): each Nightly compares them in the git.moq.dev -report's [paired comparison](/bench/README.md#paired-comparison); don't -duplicate it. +rounds and count instructions for any that holds. `main` carries features +`release` lacks, so a flat per-operation cost usually pays for one, while a +cost that grows with `main`'s own sweep is accidental. Fix accidental cost in +this run, and record each accepted cost with the feature and PR it pays for. +A browser row inside the `aa` spread is noise. + +### Method + +Shared hosts make wall-clock bisects blame the wrong commit, so count +instructions: build each commit from `git archive` with its own +`CARGO_TARGET_DIR`, `CARGO_PROFILE_BENCH_STRIP=none`, and +`CARGO_PROFILE_BENCH_DEBUG=line-tables-only`, wrap the timed routine in an +`#[inline(never)]` boundary, and run +`valgrind --tool=callgrind --toggle-collect='**' --test --exact `. +Diff `callgrind_annotate --inclusive=yes` between commits. A wall-time hold +at equal instructions may be page faults; a bench that is not CPU-bound, +such as `relay_auth_refresh`, is not attributable this way. + +### Check first + +- At least five nights of history by commit, read through the paired + comparison rather than raw `gh-pages` series. Dart still needs a recheck + against the bindings history. +- `track_stamp_groups/append`'s per-group cost (a start-index insert and a + second track lock per group), then the resume reader, which dominates a + short Annex B export. +- `catalog::tracks::Rendition::stage` clones and serializes the whole catalog + on every estimate; validating only the edited entry weakens custom configs, + so it needs a decision. +- The TS export's `Schedule::index` and `Schedule::admit` scan and sort every + queued unit per PCR slot, so cost grows with track count. +- e2ee expands the AES-GCM key on every frame in `protect`. +- Unbenchmarked paths, by impact: HLS request fan-out; LOC and CMAF in + moq-mux's benches, which only use `Container::Legacy`; browser media + copies; moq-quic loss recovery and real congestion controllers; HTTP + announcement snapshots; MPEG-TS, MKV, FLV, H.265, and AV1 import with real + media; JS watch audio ring and publish `Fanout`. +- Single-axis fan-out benches to widen: `session_delivery_paced`, + `track_fanout_*`, `memory`, and `bench/workloads/fanout*.toml`. ## Required -- [Cut and publish the prepared breaking release](/quest/m3/release/cut.md) - the release in flight ships before this run starts +- [Release cut](/quest/m3/release/cut.md) - the release in flight ships before this run starts diff --git a/quest/m3/audit-quests.md b/quest/m3/audit-quests.md deleted file mode 100644 index 8ded49f7555..00000000000 --- a/quest/m3/audit-quests.md +++ /dev/null @@ -1,83 +0,0 @@ -# [M] Quest tree audit - -## Goal - -The quest tree agrees with itself and with `main`: done, stale, -conflicting, and misranked quests are fixed. - -## Plan - -Recurs once per major release (decided 2026-10-19). The PR that finishes -this run also adds the next one with the same file name at the end of m3's `Required`, which the shift after the next cut -brings into m1. The successor keeps the Goal -and this paragraph; the rest of its Plan is rewritten with what this run -learned: baselines, results, and what to check first. The successor also lists the [release cut](/quest/m3/release/cut.md) under `Required`, so it -waits for the release in flight to ship. Only `/quest-delete` ends the -recurrence. Fixes land in the run's PR, one commit each, rather than as follow-ups. -Only a change that needs a maintainer decision (public API, scope) or is -independently landable and too large to review alongside the rest becomes a -follow-up through `/quest-plan`. - -Run `/quest-audit` after the release cut. Read every outstanding quest with -parallel auditors, then verify source claims, active PR ownership, Required -ordering, and the latest maintainer decisions before changing plans. - -Also reconcile merged follow-ups (decided 2026-10-22 from the release audit): -read the Follow-ups of every PR merged since the last release, and plan each -concrete remainder that has no quest, open PR, or recorded decline. The -release audit found seven such remainders across -[moq-dev/moq#6124](https://github.com/moq-dev/moq/pull/6124), -[moq-dev/moq#6153](https://github.com/moq-dev/moq/pull/6153), -[moq-dev/moq#6251](https://github.com/moq-dev/moq/pull/6251), -[moq-dev/moq#6243](https://github.com/moq-dev/moq/pull/6243), -[moq-dev/moq#4991](https://github.com/moq-dev/moq/pull/4991), and -[moq-dev/moq#5758](https://github.com/moq-dev/moq/pull/5758). - -Baseline from the m1 run, 2026-10-22 UTC, against `main` at `bce217e063`: - -- Read all 463 quest documents across m0-m3 and the root with parallel - read-only support. Checked 315 referenced GitHub items and the open-PR - inventory. Source checks were targeted to the factual claims; hardware - and deployment acceptance was not inferred from old inventory text. -- Fixed timestamp provenance's rank before its IETF passthrough consumer, - the generated-C exception for dynamic range fills, discovery's fixed 2s - linger, and replacement linger's existing-reader semantics. -- Carried m1's settled compression migration into deferred plans: one - compressed catalog/stats track, ordinary tracks for opaque bytes, no - moq-flate or `moq-mux::binary` helper, authenticated logical compression - in the e2ee wrapper, and bounded prefix reconstruction for front eviction. -- Refreshed partly landed benchmark/report baselines and explicit - prerequisites for the JS encrypted-wrapper mirror and fMP4 ambisonics. -- The JS allocation replacement passed all 2,493 js/net tests under load. - The OBS drain failure reproduced on unchanged main and passed with the - existing close-tail PR; its quest keeps the remaining merged-result proof. -- No m2 implementation quest was started, no external-organization report - was posted, and ambiguous remote claim branches were left intact. - -Check first next run: - -- A moved quest can still be owned by a PR under its old branch name. The - redundant failover quest moved to m0 while - [moq-dev/moq#6113](https://github.com/moq-dev/moq/pull/6113) retained its - m1 branch. Search PR titles, bodies, and source scope as well as exact - branch names before taking a claim. Do not infer abandonment from age. -- Refresh all linked open PRs before changing ownership or deleting a - quest. At this baseline, the TRACK_STATUS retirement, silent-peer - retirement, audio conformance, CI audit, and local gate each had owners; - an overlapping cleanup should finish through that PR. -- Confirm the first scheduled size report after the Linux release-link - fix, the required count of post-change audio-budget nights, shared FFI - publication, and release-gate availability. Partial evidence does not - clear an external-condition quest. Safari WebKit bug 319818 was still - NEW with no fixed shipping version established. -- Recheck local gate and binding-cost plans together: Bun `--no-orphans` - reaps newly spawned local descendants even after successful completion, - while the CI bypass preserves persistent queue daemons. A warm local - daemon policy needs an explicit choice; no dependency edge was invented. -- Re-run the transitive Required rank check, including prerequisites added - within an epic, and compare plans against replaced designs before looking - for new implementation work. - -## Required - -- [Release cut](/quest/m3/release/cut.md) - the release in flight ships before this run starts diff --git a/quest/m3/audit-simplify.md b/quest/m3/audit-simplify.md deleted file mode 100644 index f378f92414e..00000000000 --- a/quest/m3/audit-simplify.md +++ /dev/null @@ -1,107 +0,0 @@ -# [M] Simplification audit - -## Goal - -The code and APIs that cost the most complexity for what they deliver are -simplified: duplicate mechanisms merged, layers, options, and generics with -one user collapsed, and features that don't earn their keep narrowed or -removed. The result is net simpler, even where that means less scope. - -## Plan - -Recurs once per major release (decided 2026-10-19). The PR that finishes -this run also adds the next one with the same file name at the end of m3's `Required`, which the shift after the next cut -brings into m1. The successor keeps the Goal -and this paragraph; the rest of its Plan is rewritten with what this run -learned: baselines, results, and what to check first. The successor also lists the [release cut](/quest/m3/release/cut.md) under `Required`, so it -waits for the release in flight to ship. Only `/quest-delete` ends the -recurrence. Fixes land in the run's PR, one commit each, rather than as follow-ups. -Only a change that needs a maintainer decision (public API, scope) or is -independently landable and too large to review alongside the rest becomes a -follow-up through `/quest-plan`. - -Narrowing a feature or reshaping an API is the maintainer's call, so those -are proposals with a recommendation, filed as follow-ups. Unlike the [dead -code audit](/quest/m3/audit-dead-code.md), this targets code that is used but -overbuilt. - -### Check first - -The m1 run (2026-10-23) ran while about 150 PRs were open, touching every -moq-net session module, the bindings, moq-tokio, moq-relay, and moq-cli, so it -skipped those. Still open from m0, unchanged because open work kept editing -the same code: - -- `ietf/session.rs` `start()` builds both halves twice across the draft arms, - and the IETF publisher/subscriber constructors drifted from lite's config - structs. -- Lite and IETF `GroupServe` share their open, flush, and FIN-settle driver. -- `ietf/adapter.rs` reimplements `kio::Queue`; keep a drop guard for the - writer. -- Python's `connect` forwards every `Client` parameter, still about a dozen - after the [wrapper config](https://github.com/moq-dev/moq/pull/6507) nesting. - Binding `connect = Client` keeps the call signature, so it needs no - decision. Expect the wrappers' other forwarding layers to have changed too. - -New from m1: - -- The codec importers (H.264, H.265, AV1, VP8, VP9, AAC, Opus, MP3, FLAC, and - legacy) each forward `demand`, `flush`, `finish`, `abort`, `cut`, - `discontinuity`, and `seek` to their container producer. Dropping the - forwards means exposing a shared track handle, which is an API proposal. The - audio and video producers differ in their config type, so check the - handle can be one type before proposing it. -- moq-mux's H.264 and H.265 `Import` and `Split` share their shape but differ - in SEI scanning, open-GOP recovery points, and error variants. A generic - version needed enough hooks that it was left alone; recheck it if those - converge. - -Proposals from m0 are settled. The moq-video raw-frame publisher and the -shared `Background` would each have had moq-ffi as their only user once the -[generated C bindings](/quest/m3/c/README.md) retire moq-c's hand-written -copies, so both were dropped. The Go wrapper's missing `bridge.CallHandle` was -in the generated binding, not the wrapper: uniffi-bindgen-go -`v0.10.0-kixelated.2` destroys a result whose context was cancelled as it -completed. - -### Results (m1, 2026-10-23) - -One PR, private and behavior-preserving: moq-mux's `import::Track` and -`TrackStream` expand their codec arms through one macro each, and nine -importers lost a deleted method's doc left on `cut`. The H.264 and H.265 -exporters were left alone for [one shared Annex-B export lifecycle](https://github.com/moq-dev/moq/pull/6575), -which has since landed. Search the -quest tree before fixing a duplicate: the 2026-10-22 refactor audit filed -several. - -### Kept on purpose - -- Backend and playback traits have several implementations or device-free - test doubles; catalog traits erase application extension types. -- The ietf publisher's `RequestWaker` and lite's `FetchWake` stay apart from - the queue-once waker: one collects into a list and wakes an owner, the - other fills a set. -- js/net's subscriber grant checks stay hand-written: `auth_gate.ts` `Gate` - only checks publish grants, and a direction flag costs what it saves. -- The JS datagram send and receive loops: the lite and IETF error handling - and `served` bookkeeping differ, so a shared loop needs hooks. -- Dart and C++ wrappers are already thin. The Swift wrapper's forwarding - classes stay classes, for argument labels and unprefixed names. -- Kotlin's `AnnounceConsumer.updates()` cancels on every completion, as its - doc promises. -- The `until_wanted` loop copied into moq-audio, moq-boy, moq-video, and - moq-transcode is one line over `Demand::wanted_changed`. A helper on - `Demand` would be a second way to wait for the one demand signal. -- js/net's lite version gates mirror Rust's on purpose, and its per-message - IETF error classes are distinct wire messages. - -Transport adapter deduplication and compression removal have dedicated work; -avoid a second design here. Start with the items above, then the largest -modules again, and the bindings' forwarding layers. The largest moq-net -modules at the end of m1: `ietf/publisher.rs` 17,182 lines, -`ietf/subscriber.rs` 17,066, `model/origin.rs` 13,036, `lite/publisher.rs` -8,508, and `lite/subscriber.rs` 7,839. The three m0 named all grew. - -## Required - -- [Release cut](/quest/m3/release/cut.md) - wait for the release in flight to ship diff --git a/quest/m3/audit-size.md b/quest/m3/audit-size.md deleted file mode 100644 index 380ca1d9803..00000000000 --- a/quest/m3/audit-size.md +++ /dev/null @@ -1,157 +0,0 @@ -# [S] Artifact size audit - -## Goal - -Growth in release binaries, the FFI library, and JS bundles since the -previous run is explained, fixed, or planned. - -## Plan - -Recurs once per major release (decided 2026-10-19). The PR that finishes -this run also adds the next one with the same file name at the end of m3's `Required`, which the shift after the next cut -brings into m1. The successor keeps the Goal -and this paragraph; the rest of its Plan is rewritten with what this run -learned: baselines, results, and what to check first. The successor also lists the [release cut](/quest/m3/release/cut.md) under `Required`, so it -waits for the release in flight to ship. Only `/quest-delete` ends the -recurrence. Fixes land in the run's PR, one commit each, rather than as follow-ups. -Only a change that needs a maintainer decision (public API, scope) or is -independently landable and too large to review alongside the rest becomes a -follow-up through `/quest-plan`. - -Decided 2026-10-31 (maintainer): investigate the failing Shipping sizes guard -before the release cut. The pre-cut investigation below is complete; this -file now tracks the recurring post-release refresh. Its release-cut blocker -applies to that refresh, not to the incident investigation. - -After the release ships, compare its first complete Shipping sizes report -with these baselines. Re-measure the local native profiling rows from -[the previous audit](https://github.com/moq-dev/moq/pull/6541) using the same -Rust target, profile, stripping, and toolchain. Never compare an archive to -an ELF, different targets, or symbol-preserving FFI to fully stripped code. -Preserve artifact keys and history identity; no guard limit or history reset -is needed for this investigation. - -### Shipping comparison - -The [2026-10-31 Nightly](https://github.com/moq-dev/moq/actions/runs/41204380716) -measured source `38566f5a84cb07bb756aae43f6dc902f1abacec2`. Its last retained -comparison was 2026-10-24, source -`0513c07369357ae0ecd6109d0f6afc61d16b597f`. These are a week's changes, -not one night's. Native, Python, and Swift counts are the actual uploaded -consumer artifacts, except the explicitly labeled minimal native libraries. -JS rows are not uploaded artifacts: `sh/size/collect.sh` builds the packages -and `sh/size/bundles.ts` measures synthetic first-load consumer bundles of -them. Compare JS rows only with JS rows measured the same way. - -| Shipping artifact, bytes | October 24 | October 31 | -|---|---:|---:| -| JS net, first-load gzip | 120,578 | 131,739 | -| JS hang, first-load gzip | 145,814 | 157,500 | -| JS watch, first-load gzip | 161,132 | 173,880 | -| JS watch-ui, first-load gzip | 173,539 | 186,338 | -| JS publish, first-load gzip | 158,683 | 169,794 | -| moq-c macOS aarch64 tar.gz | 12,117,666 | 12,802,828 | -| moq-c Linux aarch64 tar.gz | 14,139,421 | 14,864,395 | -| moq-c Linux x86_64 tar.gz | 14,484,602 | 15,252,992 | -| moq-c Windows x86_64 zip | 17,211,584 | 18,080,501 | -| Python sdist | 7,733,152 | 9,192,166 | -| Swift generated source tar.gz | 84,457 | 89,070 | -| Minimal FFI aarch64 Linux .so | 23,783,232 | 24,757,488 | -| Minimal FFI aarch64 Linux .a | 56,329,042 | 58,158,580 | - -The new generated-C archive keys start their own series. They do not replace -the existing C archive measurements. Native minimal builds remain below the -5% guard. JS raw and Brotli rows grow alongside gzip; the watch CMAF lazy -chunk stays essentially unchanged at 2,459 bytes gzip. - -### Python source packaging - -[moq-dev/moq#6867](https://github.com/moq-dev/moq/pull/6867) included the Rust -workspace because Cargo resolves disabled optional path dependencies that -Maturin's enabled dependency graph omits. Keep that correctness fix. It also -made media test fixtures in other crates reach the source archive. - -On one local host with Maturin 1.14.1, repacking the same source before and -after excluding all `test_data` directories reduced the archive from -9,188,183 to 7,771,007 bytes. The removed mux/video fixture payload is -3,665,958 uncompressed bytes. Audio fixtures were already excluded. The -repacked archive is within 5% of the retained 7,733,152-byte baseline. -Local repack counts differ slightly from hosted archive bytes; use the -matched local pair to quantify the reduction. - -The reduced archive retains every Rust workspace source and optional path -dependency. A release wheel built from its extracted contents, installed in -a fresh virtual environment, and imported successfully. Cargo metadata with -all features also resolves from the extracted archive. Existing Nightly -source-install coverage exercises the same packaging boundary. - -### Browser first-load attribution and rejected reduction - -`bun sh/size/bundles.ts OUTPUT` against the built packages reproduced every -October 31 byte count exactly. Attribute only the entry's static import -closure, not all metafile outputs: IETF session chunks remain lazy. - -The largest added first-load input is `sorted-btree`, 19,371 minified raw -bytes, from [moq-dev/moq#6869](https://github.com/moq-dev/moq/pull/6869). -Other net additions include auth session handling (3,902), resume (2,183), -lite subscribe (1,557), track (1,470), reconnect policy (1,446), and group -handling (1,437). These contributions are raw module attribution, not -additive compressed deltas. Hang adds health reporting (4,080 raw bytes); -watch adds player behavior (3,903). Hashed generated filenames must be -normalized before comparing the watch/publish metafiles. - -A scratch adaptation to `@js-sdsl/ordered-map` 4.4.2 passed all ten ledger -tests. Its isolated browser module was 10,757 raw / 3,445 gzip bytes, versus -19,886 / 5,952 for the current tree under the same export harness. That is -only a candidate dependency comparison, not a measured consumer-bundle delta. - -Five alternating warmed Chromium 156.0.8078.4 rounds of the existing ledger -benchmark measured the following medians at 32,768 sparse arrivals: - -| Order, ns per arrival | Current | A/A | Candidate | -|---|---:|---:|---:| -| Ascending | 406 | 403 | 592 | -| Descending | 565 | 562 | 620 | -| Shuffled | 1,080 | 946 | 1,022 | -| Rolling expiry | 700 | 677 | 882 | - -Keep `sorted-btree`: the candidate slows ascending and rolling paths beyond -the A/A spread. Do not restore array-backed insertion or full gap scans to -save bytes; the ordered indexes bound sparse ledger work. No dependency or -runtime behavior changed in this investigation. - -### Native and generated binding attribution - -The actual x86_64 Linux C archive contains a header, one static library, and -its CMake/pkg-config metadata. The library grew from 58,705,866 to 61,628,112 -bytes; the header from 147,069 to 163,216. There is no duplicate runtime or -extra build artifact in the package. - -`nm -S -C --defined-only` on the two shipped static libraries attributes the -largest text-symbol increases to `moq_net` (+335,565 bytes), `moq_mux` -(+208,475), and `mp4_atom` (+200,070). This is approximate namespace -attribution, not a compressed-byte decomposition. Cross-crate inlining, -compiler-generated code, and metadata account for other bytes. -[moq-dev/moq#7400](https://github.com/moq-dev/moq/pull/7400), merged after -these measurements, addresses the catalog serialization duplication lead. Adopting opt-level s for the bindings would need codec/crypto and FFI -throughput measurements first; no quest plans it, and no compiler profile was -changed. - -The Swift source tarball grows in `Generated.swift`, from 684,643 to 704,105 -bytes. Its new request/publication, token, media-read and decoder-start -bindings match the changed public API. `Package.swift` only changes the -xcframework checksum, at the same length; licenses and README are identical. -No packaging duplication was found. - -### WASM - -moq's WASM build was removed on 2026-10-31, so there is no WASM row to repeat. - -## Required - -- [Release cut](/quest/m3/release/cut.md) - -## Related - -- [Native synchronous codecs](/quest/m5/native-compression-sync.md) -- [Native browser codecs](/quest/m5/native-compression-adopt.md) diff --git a/quest/m3/audit-test-cost.md b/quest/m3/audit-test-cost.md deleted file mode 100644 index 25f8019fb8b..00000000000 --- a/quest/m3/audit-test-cost.md +++ /dev/null @@ -1,125 +0,0 @@ -# [M] Test cost audit - -## Goal - -The slowest, flakiest, and least valuable tests are deleted by default, and -the ones that earn their keep are sped up, fixed, or moved to nightly, so the -suite costs what it earns. Workflows and jobs belong to the -[CI workflow audit](/quest/m3/audit-ci.md). - -## Plan - -Recurs once per major release (decided 2026-10-19). The PR that finishes -this run also adds the next one with the same file name at the end of m3's `Required`, which the shift after the next cut -brings into m1. The successor keeps the Goal -and this paragraph; the rest of its Plan is rewritten with what this run -learned: baselines, results, and what to check first. The successor also lists the [release cut](/quest/m3/release/cut.md) under `Required`, so it -waits for the release in flight to ship. Only `/quest-delete` ends the -recurrence. Fixes land in the run's PR, one commit each, rather than as follow-ups. -Only a change that needs a maintainer decision (public API, scope) or is -independently landable and too large to review alongside the rest becomes a -follow-up through `/quest-plan`. - -Default to removing (decided 2026-11-01, maintainer): whatever doesn't earn its -cost is deleted inline, and the PR body lists each deletion with its measured -cost and why it wasn't worth it. Only what earns its keep is refactored to be -cheaper instead. Removing a public API or a user-facing feature stays a -follow-up. - -The off-cycle m1 pruning run (2026-11-01) refreshes this baseline in place; -it does not finish this recurring run, move its schedule, or create a successor. - -Measure nextest's per-test elapsed time as slot time, not CPU time. Sum only -one invocation: the full gate also runs feature-specific selections, and a -failed run may print the failed test twice. Keep the invocation's test count, -profile, features, thread count and completion state beside its timing. Repeat -local measurements under `quest gate`; concurrent work makes one sample -unreliable. Pin whole-suite comparisons to the same eight CPUs. A roughly -three-second swing can be QUIC draining rather than computation. The `ci` -profile marks a test slow at 60 seconds and uses zero retries. - -Current hosted baseline: - -- [2026-10-31 Nightly, gate job](https://github.com/moq-dev/moq/actions/runs/41204380716/job/124546373689): - the main nextest invocation passed 10,645 tests, skipped 115, and took - 196.586 seconds. Summed test slot time was 768.723 seconds; the 27 tests - above five seconds used 258.848 of it. By crate: moq-mux 193.621 seconds, - moq-net 142.320, moq-relay 80.813, moq-quic 48.398, moq-tokio 46.230, - moq-uring 42.835, and moq-cli 37.359. Other invocations in that job are - excluded from those sums. These hosted ARM64 timings replace the old - 9,312-test queue baseline for ranking, not for a same-machine speedup claim. -- [2026-11-01 Nightly, gate job](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124868517727): - 9,163 of 10,891 tests ran in 249.218 seconds before the relay stack test - aborted. This is an incomplete selection, not a new whole-suite baseline. - [moq-dev/moq#7595](https://github.com/moq-dev/moq/pull/7595) has since - fixed the private configuration size without weakening that test. -- [2026-10-31 CLI export lane](https://github.com/moq-dev/moq/actions/runs/41204380716/job/124546373649): - 14 passed in 38.774 seconds, using 124.897 summed test seconds. The clean - and bufferbloated redundant-importer arms cost 18.669 and 26.278 seconds. - They exercise real process failover and impaired delivery. The route - identity change in [moq-dev/moq#7489](https://github.com/moq-dev/moq/pull/7489) - owns changes to that harness; do not duplicate them here. -- [2026-11-01 Rust benchmark-test lane](https://github.com/moq-dev/moq/actions/runs/41313466339/job/124868518054): - all 15 selected benchmark tests passed, using 114.177 summed seconds. - Receive-window sweeps used 80.370 seconds, raw audio 11.341. These measure - different transport, layout and fanout cases, rather than repeating one - behavior assertion. - -Local default-feature workspace selection on `21d6da9fc1`, pinned to CPUs -0-7 with 24 nextest threads and the `ci` profile: 10,623 tests ran in -50.433 seconds, using 997.332 summed seconds. One failed: -`backend::quic_client_close_drains_finished_track` with `Unroutable`, already -tracked by [moq-dev/moq#7590](https://github.com/moq-dev/moq/pull/7590). -This is not `just ci`'s device/runtime feature selection. Before the cut, the -99-test import/report selection passed; the deletion candidate cost 7.763 -seconds in the full run and 7.152 in that selection; do not attribute -whole-suite speed to it. - -The m1 cut ([moq-dev/moq#7600](https://github.com/moq-dev/moq/pull/7600)) -removed `report::import_reports_a_silent_video_pid` and its private -TS rewriting helpers. It cost 6.932 and 6.948 seconds in the two hosted gate -runs. The kept mid-import report test already checks the CLI-to-relay-to-report -path; `liveness_steps_over_a_corrupt_pcr_and_the_wrap` covers silence and -resumption directly, and the importer and stats tests cover stalled video -beside sparse data. The removed process test added a paced five-second clip, -two child processes, and another TS suppressor to repeat those properties. -The mid-import report and late-sink tests stay, as do the two stdin-EOF tests: -ongoing reports, cached final reports, catalog finish, and media announced only -at EOF are different process boundaries. - -Check first: - -- The [benchmark history](https://git.moq.dev/bench/)'s `bench-gate-cost` rows: `cold/rust-test/*` is each test - binary's summed slot time in the full gate's workspace nextest run, and - `cold/js-test/*` each Bun test file's, flagged on the nights they moved. -- Account for [moq-dev/moq#6987](https://github.com/moq-dev/moq/pull/6987) - before touching the TS export/jitter simulations, routing reference model, - JSON budgets, QUIC simulation payloads, or other CPU cuts it owns. Its - repeated cohort measurements are 61.02 and 67.49 CPU-seconds; neither is - this audit's saving. The hosted drift cases still cost 12 to 19 seconds - each before those changes land. -- [moq-dev/moq#7549](https://github.com/moq-dev/moq/pull/7549) owns the - refused-fill test and its scaling benchmark. Recovery fixture caching, - tracing isolation and stats oversize cuts have already landed; its body - identifies their owners. Do not repeat the old follow-up list. -- Compressed-cache bounds earn their cost: the long compressed group used - 22.150 and 42.928 hosted seconds, the large compressible batch 6.608 and - 10.849. They test stored-tail shedding while a plain reader lags, and - bounded inflation when tiny slices describe large frames. Smaller codec - round trips do not test either resource bound. Preserve those assertions. -- The three io_uring endpoint timeout/backlog tests used 30.284 seconds - together on October 31. Their unanswered handshake, pending admission and - completed-but-unaccepted connection cases are distinct. Keep them without - adding a timeout knob. [moq-dev/moq#7593](https://github.com/moq-dev/moq/pull/7593) - owns ring grouping and fixture startup diagnostics, not test deletion. -- Macro UI compile failures and GStreamer reconnects have distinct compiler - and real socket boundaries. Their elapsed cost alone is not evidence of redundancy. -- Classify failures before calling them flakes. October 30 and 31's feature - jobs stopped on an unused `moq-tokio::connect::Config::with_url` method; - November 1's gate and all-features run aborted on the relay stack, since - fixed. Neither is intermittent evidence against a test. Existing flake quests retain - their ownership; do not delete their tests to green the audit. - -## Required - -- [Cut and publish the prepared breaking release](/quest/m3/release/cut.md) - the release in flight ships before this run starts diff --git a/quest/m3/audit-test-coverage.md b/quest/m3/audit-test-coverage.md index 564bc39d7b4..52aba8866fd 100644 --- a/quest/m3/audit-test-coverage.md +++ b/quest/m3/audit-test-coverage.md @@ -7,143 +7,38 @@ test runs in CI. ## Plan -Recurs once per major release (decided 2026-10-19). The PR that finishes -this run also adds the next one with the same file name at the end of m3's `Required`, which the shift after the next cut -brings into m1. The successor keeps the Goal -and this paragraph; the rest of its Plan is rewritten with what this run -learned: baselines, results, and what to check first. The successor also lists the [release cut](/quest/m3/release/cut.md) under `Required`, so it -waits for the release in flight to ship. Only `/quest-delete` ends the -recurrence. Fixes land in the run's PR, one commit each, rather than as follow-ups. -Only a change that needs a maintainer decision (public API, scope) or is -independently landable and too large to review alongside the rest becomes a -follow-up through `/quest-plan`. - -### Tools - -Nightly keeps both reports as artifacts: `just rs coverage` (cargo-llvm-cov -over nextest, the native workspace at default features, both fuzz packages -excluded) and `just js coverage` (Bun's own -coverage, one process per package, line hits unioned across processes). -Start from those artifacts (`gh run download -n rust-coverage` -and `-n js-coverage`) rather than re-running the instrumented workspace, -which is expensive on a shared machine. - -- `just rs coverage ` is not comparable to the workspace table: - without other packages' feature unification it compiles less of the - crate. -- Default features hide feature-gated tests that run nightly in the - `rs features` leg (`--all-features`). Check that leg passed before calling - a low file untested: on 2026-10-20 it stopped at a moq-auth example's lint, - so nothing after it ran. -- Bun 1.4.2 undercounts a module loaded again with a query suffix. Verify an - apparent JS gap before acting on it, and never merge packages into one - `bun test` process. -- The most productive scan in m1 was public functions whose signature line - the lcov report never hit: walk `DA:` records for lines matching - `pub fn`/`pub(crate) fn` outside test, bench, and fuzz files. It found the - binding facades below in minutes. Per-file uncovered line counts mostly - point at GPU code and generated bindings instead. -- When sampling `fix` commits for regression tests, count - `#[kio::test]` as well as `#[test]` and `#[tokio::test]`. -- `just gh check` fails on any `#[ignore]` test, fuzz or bench target, test - recipe, or standalone test script that no workflow reaches - (`sh/gh/test-inventory.py`). The local-only ones are in - `sh/gh/test-inventory.allow`, each with its owning quest, so the `#[ignore]` - walk starts from that list instead of grepping. - -### m1 baselines - -From nightly run 39421743227 at `f13283b302` (2026-10-20): 9,050 native -tests passed with 33 ignored, and 18 JS package processes ran 3,924 tests. -Lines covered / measured: - -| Rust crate | Lines | Rust crate | Lines | -| --- | --- | --- | --- | -| hang | 2848 / 2924 | moq-loc | 141 / 153 | -| kio | 2045 / 2137 | moq-msf | 674 / 684 | -| moq-archive | 4353 / 4484 | moq-mux | 64372 / 66631 | -| moq-audio | 5455 / 5716 | moq-net | 83698 / 87593 | -| moq-auth | 5187 / 5313 | moq-nvenc | 3445 / 7771 | -| moq-bench | 1614 / 2068 | moq-pattern | 931 / 960 | -| moq-boy | 169 / 707 | moq-quic | 21696 / 22815 | -| moq-c | 8946 / 9516 | moq-relay | 10952 / 11607 | -| moq-cli | 6431 / 7566 | moq-room | 432 / 460 | -| moq-clock | 1858 / 1921 | moq-rtc | 2506 / 2882 | -| moq-e2ee | 679 / 759 | moq-rtmp | 6826 / 7638 | -| moq-ffi | 10819 / 11749 | moq-rtsp | 1033 / 1057 | -| moq-flate | 839 / 892 | moq-shaper | 2149 / 2219 | -| moq-gst | 6362 / 6740 | moq-sock | 1328 / 1486 | -| moq-hls | 8473 / 8857 | moq-srt | 1286 / 1481 | -| moq-ice | 319 / 361 | moq-stats | 4414 / 4601 | -| moq-json | 4897 / 5231 | moq-tokio | 15962 / 18005 | -| moq-uring | 4802 / 5558 | moq-transcode | 2997 / 3239 | -| moq-v4l | 9 / 1457 | moq-video | 6462 / 9988 | -| carla bridge (demo) | 923 / 1676 | | | - -moq-rtc, moq-ice, and moq-tokio's `webrtc` module have since merged into -moq-webrtc, so its report compares with moq-rtc plus moq-ice, and moq-tokio's -row above still counts the moved module. - -| JS package | Lines | Unloaded files | JS package | Lines | Unloaded files | -| --- | --- | --- | --- | --- | --- | -| common | 200 / 250 | 5 | loc | 127 / 145 | 0 | -| net | 19248 / 25149 | 4 | msf | 103 / 130 | 0 | -| p2p | 293 / 303 | 1 | video | 277 / 336 | 0 | -| clock | 310 / 333 | 1 | watch | 3123 / 4596 | 29 | -| pattern | 435 / 523 | 0 | publish | 2773 / 3308 | 22 | -| auth | 725 / 788 | 2 | room | 493 / 530 | 1 | -| e2ee | 568 / 569 | 2 | signals | 580 / 763 | 2 | -| flate | 233 / 333 | 0 | | | | -| json | 804 / 1093 | 0 | moq-boy | 155 / 194 | 8 | -| hang | 2076 / 2899 | 1 | | | | - -These are not acceptance thresholds. Compare the next run's report against -them and explain what moved. Against m0, every crate held its ratio: the -growth (moq-net +3.4k measured lines, moq-auth's in-band auth, moq-clock) -arrived tested, and moq-cli and @moq/json shrank. The m1 run's new tests -land after this baseline, so the next report should show moq-mux's -`import/track.rs` and moq-ffi's `video.rs` and `media.rs` rise. - -### What m1 found - -- `just rs audio-devices`, added by the m0 run, failed all five tests on its - first nightly. Two causes: cpal's PulseAudio host opened playback with the - server's default 2 s buffer (3.96 s end to end), and the tests assumed a - device starts within 100 ms while PulseAudio's idle null sink renders up to - two seconds ahead. Playback now asks PulseAudio for 20 ms periods, and the - tests wait until the device's clock moves. Watch that the first nightly - after this run is green, and keep any new device test behind the same wait. - Capture likely shares the buffer default: [PulseAudio capture periods](/quest/m3/pulseaudio-capture-period.md). -- The binding facades were the largest untested public surface: - `moq_mux::import::Track` had decoded only Avc3, Hvc1, VP8, and the audio - codecs other than MP3; `TrackStream` (the FFI raw-stream producer) had - never decoded a byte; and `MoqVideoEncoder` (`moq.video.Encoder` in every - wrapper) had no test in any language. Its doc and the Swift copy also - claimed `finish` drops the trailing access unit, which it does not. -- `just rs gpu` could not load a Vulkan loader inside the Nix shell on a - non-NixOS host. AMD and Intel now run through the flake's Mesa; NVIDIA - stays with [GPU CI](/quest/m3/gpu-ci.md). -- The VA-API renderer import tests have no caller: the m0 run mapped them to - GPU CI, which covers only NVIDIA. [VA-API renderer tests](/quest/m4/vaapi-render-tests.md) - owns them now. -- Every `#[ignore]` has a reason, and each one's caller is a recipe or a - quest. Several reasons name neither (the WGC, MediaCodec, and NVIDIA - Vulkan/CUDA tests), but their quests name the tests. Re-run the check by - test name, not by reason text. -- All 33 `fix` commits from the m0 PR to `7d2a91fe66` that changed code - carried a regression test; the rest were dependency, CI, Nix, or bench - compile fixes. - -### What to check first - -- The nightly legs that run tests outside `just check`: `rs audio-devices`, - `rs multicast`, `rs render-sw`, `rs quic-stress`, `rs v4l2`, `rs features`, and the - `rust-test` benchmark group. A red leg hides everything after it. -- Public functions never executed, by the scan above, starting with moq-c, - moq-ffi, and moq-mux's import facades. -- Whether [Bindings in the interop matrix](/quest/m4/interop-bindings.md) - and [GPU CI](/quest/m3/gpu-ci.md) landed, before re-auditing the tests they - own. +Recurs each major release: the PR that finishes a run keeps its results in +its own body and re-adds this file at the end of m3's `Required`, behind the +[release cut](/quest/m3/release/cut.md), with Check first rewritten. Fixes land +in that PR; only maintainer decisions (public API, scope) and changes too +large to review alongside become follow-ups. + +Test cost belongs to the [cost audit](/quest/m3/audit-cost.md). + +Previous run, with its per-crate and per-package baselines: +[moq-dev/moq#6175](https://github.com/moq-dev/moq/pull/6175). + +### Check first + +- Start from Nightly's `rust-coverage` and `js-coverage` artifacts + (`just rs coverage`, `just js coverage`) rather than re-running the + instrumented workspace. `just rs coverage ` is not comparable to the + workspace report. +- The nightly legs that run tests outside `just check`, such as `rs features` + and `rs audio-devices`: a red leg hides everything after it, so confirm each + passed before calling a file untested. +- Public functions never executed: walk the lcov `DA:` records for + `pub fn`/`pub(crate) fn` lines outside tests, benches, and fuzz, starting + with moq-c, moq-ffi, and moq-mux's import facades. Per-file uncovered counts + mostly point at GPU code and generated bindings. +- Bun undercounts a module loaded again with a query suffix; verify a JS gap + before acting, and never merge packages into one `bun test` process. +- `just gh check` already fails on an `#[ignore]` test or test target no + workflow reaches; the local-only ones are listed in + `sh/gh/test-inventory.allow` with their owning quests. +- Sample `fix` commits for regression tests, counting `#[kio::test]`. +- Whether [interop bindings](/quest/m4/interop-bindings.md) and + [GPU CI](/quest/m3/gpu-ci.md) landed, before re-auditing the tests they own. ## Required diff --git a/quest/m3/ffi-future-size.md b/quest/m3/ffi-future-size.md index bbea0865467..1cd8c37758a 100644 --- a/quest/m3/ffi-future-size.md +++ b/quest/m3/ffi-future-size.md @@ -30,6 +30,6 @@ futures in the FFI layers may sit just under the edge the same way. `accept_on_a_foreign_thread` in `rs/moq-ffi/src/server.rs` uses 512 KiB) and record the margin. - If the lint proves useful, consider it workspace-wide in - [audit lints](/quest/m3/audit-lints.md) instead. + the [code audit](/quest/m3/audit-code.md) instead. Public API: none. Wire: none. diff --git a/quest/m3/release/feature-flags.md b/quest/m3/release/feature-flags.md index 6f18f7c8c28..9ce916465bf 100644 --- a/quest/m3/release/feature-flags.md +++ b/quest/m3/release/feature-flags.md @@ -55,9 +55,8 @@ What to check first (seeded 2026-10-26): - The crates with the most features at seeding: moq-cli (21), moq-tokio (17), moq-relay (14), moq-native (13), and moq-video (11). -Related: the [compile time audit](/quest/m3/audit-compile-time.md) owns -per-crate build cost, and the [dependency audit](/quest/m3/audit-deps.md) owns -which dependencies exist. +Related: the [cost audit](/quest/m3/audit-cost.md) owns per-crate build +cost and which dependencies exist. ## Required diff --git a/quest/m3/vendor-sync/README.md b/quest/m3/vendor-sync/README.md index 2c958955bb1..cd8ce5da46c 100644 --- a/quest/m3/vendor-sync/README.md +++ b/quest/m3/vendor-sync/README.md @@ -81,4 +81,4 @@ behavior follows quinn's fixes. ## Related -- [Dependency audit](/quest/m3/audit-deps.md) - covers crates cargo-deny can see +- [Cost audit](/quest/m3/audit-cost.md) - covers crates cargo-deny can see diff --git a/quest/m3/vendor-sync/quinn.md b/quest/m3/vendor-sync/quinn.md index 670e51f29f8..1dcc8589540 100644 --- a/quest/m3/vendor-sync/quinn.md +++ b/quest/m3/vendor-sync/quinn.md @@ -46,4 +46,4 @@ behavior follows upstream's fixes. ## Related -- [Dependency audit](/quest/m3/audit-deps.md) - covers crates cargo-deny can see +- [Cost audit](/quest/m3/audit-cost.md) - covers crates cargo-deny can see diff --git a/quest/m4/ashpd-maintained.md b/quest/m4/ashpd-maintained.md index 3c1afb17bfd..f3361805ba2 100644 --- a/quest/m4/ashpd-maintained.md +++ b/quest/m4/ashpd-maintained.md @@ -19,4 +19,4 @@ so the portal capture client compiles against the new API. ## Related -- [Dependency audit](/quest/m3/audit-deps.md) - recheck the rest of the dependency graph +- [Cost audit](/quest/m3/audit-cost.md) - recheck the rest of the dependency graph diff --git a/quest/m4/askama-maintained.md b/quest/m4/askama-maintained.md index 6d06a63a2bd..011a05c7730 100644 --- a/quest/m4/askama-maintained.md +++ b/quest/m4/askama-maintained.md @@ -16,5 +16,5 @@ its template syntax. Verify binding generation after the upgrade. ## Related -- [Dependency audit](/quest/m3/audit-deps.md) - recheck the rest of the dependency graph +- [Cost audit](/quest/m3/audit-cost.md) - recheck the rest of the dependency graph - [Switch to rust2's exporter](/quest/m3/ffi-exporter.md) - askama reaches the lock only through `uniffi_bindgen`, which that switch deletes diff --git a/quest/m5/native-compression-adopt.md b/quest/m5/native-compression-adopt.md index 9561defb393..167ad1e6ae2 100644 --- a/quest/m5/native-compression-adopt.md +++ b/quest/m5/native-compression-adopt.md @@ -19,7 +19,7 @@ main-thread blocking through workers, or a new preparation API. starting implementation. Constructor support alone is insufficient. Check nonfinal frame output, shared history, exact declared-size admission, early output-overrun refusal, cancellation, malformed input and group end. -- Native decoding is also an avenue in the size audit. JS compression landed +- Native decoding is also an avenue in the [cost audit](/quest/m3/audit-cost.md). JS compression landed with a bundled pako codec in `js/net/src/flate`; coordinate with the audit and remove only duplicated conditional scope. Encoder and decoder adoption may land independently if each preserves the existing contract and removes From 0527b0b71945a12dcec44689c81e6d05378936e7 Mon Sep 17 00:00:00 2001 From: Luke Curley <432854+kixelated@users.noreply.github.com> Date: Tue, 10 Nov 2026 07:43:56 -0800 Subject: [PATCH 3/3] quest: address CodeRabbit review on audit merge Co-Authored-By: Claude Opus 5.5 --- quest/m3/audit-code.md | 4 ++-- quest/m3/audit-cost.md | 12 +++++++----- quest/m3/audit-docs.md | 4 ++-- quest/m3/audit-interop.md | 10 ++++++---- quest/m3/audit-perf.md | 8 +++++--- quest/m3/audit-test-coverage.md | 4 ++-- 6 files changed, 24 insertions(+), 18 deletions(-) diff --git a/quest/m3/audit-code.md b/quest/m3/audit-code.md index ec8362b46a0..eba48fa7b7f 100644 --- a/quest/m3/audit-code.md +++ b/quest/m3/audit-code.md @@ -11,8 +11,8 @@ why, and nothing calls an API deprecated at the workspace MSRV. ## Plan Recurs each major release: the PR that finishes a run keeps its results in -its own body and re-adds this file at the end of m3's `Required`, behind the -[release cut](/quest/m3/release/cut.md), with Check first rewritten. Fixes land +its own body and re-adds this file at the end of m3's `Required`, with its own `Required` +naming the [release cut](/quest/m3/release/cut.md) and Check first rewritten. Fixes land in that PR; only maintainer decisions (public API, scope) and changes too large to review alongside become follow-ups. diff --git a/quest/m3/audit-cost.md b/quest/m3/audit-cost.md index f7c48ee5b02..d38c5a371e3 100644 --- a/quest/m3/audit-cost.md +++ b/quest/m3/audit-cost.md @@ -11,8 +11,8 @@ fixed, or planned. Runner and cache infrastructure belongs to ## Plan Recurs each major release: the PR that finishes a run keeps its results in -its own body and re-adds this file at the end of m3's `Required`, behind the -[release cut](/quest/m3/release/cut.md), with Check first rewritten. Fixes land +its own body and re-adds this file at the end of m3's `Required`, with its own `Required` +naming the [release cut](/quest/m3/release/cut.md) and Check first rewritten. Fixes land in that PR; only maintainer decisions (public API, scope) and changes too large to review alongside become follow-ups. @@ -89,7 +89,7 @@ tests [moq-dev/moq#7600](https://github.com/moq-dev/moq/pull/7600), build time ### Check first: artifact size - Compare the first complete Shipping sizes report after the cut with the - previous run's. Never compare an archive to an ELF, different targets, or + previous run's, the [2026-10-31 measurements](https://github.com/moq-dev/moq/blob/cd560bde5e585dcfc59a705b8013a9a733c06a73/quest/m3/audit-size.md). Never compare an archive to an ELF, different targets, or symbol-preserving to stripped builds. JS rows are synthetic first-load bundles from `sh/size/bundles.ts`; attribute only an entry's static import closure and normalize hashed filenames. @@ -113,8 +113,10 @@ tests [moq-dev/moq#7600](https://github.com/moq-dev/moq/pull/7600), build time `npm:` aliases, and lockfiles missing from `.github/dependabot.yml`. `dart/moq` and `nix/uniffi-dart-Cargo.lock` are uncovered on purpose. - The QUIC fork has no advisory feed: list quinn-proto and quinn-udp - advisories on RustSec and GHSA, port any fix, and record the newest - reviewed upstream commit in `rs/moq-quic/README.md` (decided 2026-10-28). + advisories on RustSec and GHSA, port any fix, and note it in + `rs/moq-quic/README.md` (decided 2026-10-28). Only a + [vendor sync](/quest/m3/vendor-sync/quinn.md), which reviews the full + upstream range, advances the recorded upstream commit. - Waiting on upstream: [ashpd](/quest/m4/ashpd-maintained.md) and [askama](/quest/m4/askama-maintained.md); the root Bun overrides for glob, minimatch, chokidar, postcss-selector-parser, and Vite, each removable once diff --git a/quest/m3/audit-docs.md b/quest/m3/audit-docs.md index 9b6b8d1269e..12f8887b452 100644 --- a/quest/m3/audit-docs.md +++ b/quest/m3/audit-docs.md @@ -8,8 +8,8 @@ undocumented exported symbols are fixed or planned. ## Plan Recurs each major release: the PR that finishes a run keeps its results in -its own body and re-adds this file at the end of m3's `Required`, behind the -[release cut](/quest/m3/release/cut.md), with Check first rewritten. Fixes land +its own body and re-adds this file at the end of m3's `Required`, with its own `Required` +naming the [release cut](/quest/m3/release/cut.md) and Check first rewritten. Fixes land in that PR; only maintainer decisions (public API, scope) and changes too large to review alongside become follow-ups. diff --git a/quest/m3/audit-interop.md b/quest/m3/audit-interop.md index 14439e211e4..dbd6c4b3c0b 100644 --- a/quest/m3/audit-interop.md +++ b/quest/m3/audit-interop.md @@ -13,8 +13,8 @@ feature outside the moq-net API). ## Plan Recurs each major release: the PR that finishes a run keeps its results in -its own body and re-adds this file at the end of m3's `Required`, behind the -[release cut](/quest/m3/release/cut.md), with Check first rewritten. Fixes land +its own body and re-adds this file at the end of m3's `Required`, with its own `Required` +naming the [release cut](/quest/m3/release/cut.md) and Check first rewritten. Fixes land in that PR; only maintainer decisions (public API, scope) and changes too large to review alongside become follow-ups. @@ -35,11 +35,13 @@ Decided with the maintainer on 2026-10-21: restoring the commented-out image rebuild schedule, needs the maintainer. Both reports run published packages, so verify a fix from `main`: for our -clients through a third-party relay, `CLI_BIN=target/debug/moq just relays +clients through a third-party relay, `CLI_BIN= just relays --only --publishers rust --subscribers rust` from `test/smoke`; for a third-party client through our relay, its published runner image (`RELAY_URL`, `TLS_DISABLE_VERIFY=1`, `TESTCASE`) on the host network against -a `moq-relay` built from `main`. Read each cell's log before classifying, and +a `moq-relay` built from `main`; for the runner's own cases, its `moq-dev-rs` +or `moq-dev-js` client built against the checkout, which needs small ports to +`main`'s API. Read each cell's log before classifying, and group cells only when their logs share a cause. A merged runner bump reaches the nightly only after someone dispatches an image rebuild; check its GHCR tag. diff --git a/quest/m3/audit-perf.md b/quest/m3/audit-perf.md index a730dc782f5..abcf3acca8a 100644 --- a/quest/m3/audit-perf.md +++ b/quest/m3/audit-perf.md @@ -11,8 +11,8 @@ for. ## Plan Recurs each major release: the PR that finishes a run keeps its results in -its own body and re-adds this file at the end of m3's `Required`, behind the -[release cut](/quest/m3/release/cut.md), with Check first rewritten. Fixes land +its own body and re-adds this file at the end of m3's `Required`, with its own `Required` +naming the [release cut](/quest/m3/release/cut.md) and Check first rewritten. Fixes land in that PR; only maintainer decisions (public API, scope) and changes too large to review alongside become follow-ups. @@ -58,7 +58,9 @@ such as `relay_auth_refresh`, is not attributable this way. ### Check first - At least five nights of history by commit, read through the paired - comparison rather than raw `gh-pages` series. Dart still needs a recheck + comparison rather than raw `gh-pages` series. Nightly pairs only the Rust + bench targets: pick JS and Rust benchmark-test candidates from their history + and compare each against the release separately. Dart still needs a recheck against the bindings history. - `track_stamp_groups/append`'s per-group cost (a start-index insert and a second track lock per group), then the resume reader, which dominates a diff --git a/quest/m3/audit-test-coverage.md b/quest/m3/audit-test-coverage.md index 52aba8866fd..6027c1d88aa 100644 --- a/quest/m3/audit-test-coverage.md +++ b/quest/m3/audit-test-coverage.md @@ -8,8 +8,8 @@ test runs in CI. ## Plan Recurs each major release: the PR that finishes a run keeps its results in -its own body and re-adds this file at the end of m3's `Required`, behind the -[release cut](/quest/m3/release/cut.md), with Check first rewritten. Fixes land +its own body and re-adds this file at the end of m3's `Required`, with its own `Required` +naming the [release cut](/quest/m3/release/cut.md) and Check first rewritten. Fixes land in that PR; only maintainer decisions (public API, scope) and changes too large to review alongside become follow-ups.