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 bfcdf92eb96..736d4430353 100644 --- a/quest/m1/README.md +++ b/quest/m1/README.md @@ -51,7 +51,6 @@ moves what remains of them once their claims merge. - [A model of a relay chain's failover delivers every group once](/quest/m1/failover-chain-model.md) - route, resume, and subscribe composed across a relay chain whose hops fail - [A reused moq-transport alias refuses its track at once](/quest/m1/ietf-alias-refuse.md) - a SUBSCRIBE_OK on an alias already bound fails its readers and removes its entry without waiting on the peer's FIN acknowledgement - [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 - [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 - [A client's first dial fails fast](/quest/m1/reconnect-fail-fast.md) - a client that never got a session stops instead of retrying, later failures back off, and a version mismatch is logged on both sides 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 969834492f3..9f68577d24d 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 8efdaaeda88..5ba40b1d8ee 100644 --- a/quest/m3/README.md +++ b/quest/m3/README.md @@ -124,23 +124,16 @@ 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 - [moq-audio filter chain](/quest/m3/audio-filters.md) - per-source suppression, gate, compressor, limiter, ducking, and plugins, which moq-dev/studio configures -- [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..eba48fa7b7f --- /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`, 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. + +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..d38c5a371e3 --- /dev/null +++ b/quest/m3/audit-cost.md @@ -0,0 +1,142 @@ +# [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`, 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. + +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, 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. +- `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 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 + 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..12f8887b452 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`, 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. 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..dbd6c4b3c0b 100644 --- a/quest/m3/audit-interop.md +++ b/quest/m3/audit-interop.md @@ -12,181 +12,74 @@ 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`, 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. 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= 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`; 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. + +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..abcf3acca8a 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`, 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. + +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,48 @@ 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. 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 + 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 d426c6ff7b7..92c91915ada 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`, 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. + +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. - Each TLA+ model's `verify-*` skill against the code it covers: run `/maintain-formal-verification-skill` on every one whose Coverage files changed since its sync commit, so a change that skipped review is resynced 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