Skip to content

ci: unify dependency features with a cargo-hakari workspace-hack - #6985

Merged
kixelated merged 21 commits into
mainfrom
quest/m0/ci/hakari
Nov 2, 2026
Merged

kixelated merged 21 commits into
mainfrom
quest/m0/ci/hakari

Conversation

@kixelated

@kixelated kixelated commented Oct 28, 2026 •

Copy link
Copy Markdown
Collaborator

Problem

PR-shaped Rust builds compile dependencies repeatedly when their enabled features differ, reducing reuse in the shared mbx cache.

Approach

Adds a cargo-hakari workspace-hack, rs/workspace-hack, so test, lint, and bench builds compile each third-party crate with one feature set whatever packages a job selects. mbx keys every compilation on its inputs, so before this a PR touching moq-video and one touching moq-relay built most of the dependency graph twice.

  • rs/workspace-hack: generated by cargo hakari generate over the four CI host platforms (.config/hakari.toml). Not published.
  • Every workspace member dev-depends on it by path, except kio-macros (trybuild copies dev-dependencies into the project each UI case compiles in, so the edge made kio-macros::ui build the whole hack there) and the fuzz crates.
  • features.yml runs cargo hakari disable && cargo update --workspace before just rs features, so the feature-contract checks see each crate's own declarations rather than the hack's union.
  • just rs lint fails when the hack is stale (cargo hakari generate --diff) or an edge is missing, misplaced, or versioned (sh/rs/hakari.py). just rs fix regenerates it.
  • cargo sort skips the hack's manifest: hakari interleaves each platform's dependencies and build-dependencies, cargo sort wants them grouped, and neither tool can be configured to agree.
  • cargo-hakari joins the dev shell.
  • Android runs outside Nix, so its workflow disables and re-resolves the hack before cross-building, avoiding host PipeWire/libclang dependencies. Local instructions match the workflow.

Why a dev-dependency

Hakari's two supported setups for published workspaces both cost more here. cargo hakari publish must replace cargo publish, which release-plz runs itself. Option B publishes a stub workspace-hack crate to crates.io. A path-only dev-dependency needs neither, because cargo publish strips it. It also follows the existing rule that internal dev-dependencies are path-only. Dev-dependencies are not transitive, so the hack enters a build only through a selected package's own edge, and excluding a crate needs no closure. The cost is that cargo hakari manage-deps cannot maintain these edges (it writes normal dependencies only), so sh/rs/hakari.py checks them instead. Library-only builds (doc, the FFI cargo build --release) also stay un-unified.

Measurements

The land gate's Rust test build, on current main (2026-11-01)

The gate's test rs lane (sh/rs/select.sh test, a clippy-wrapped nextest build) replayed compile-only (--no-run) for seven PR-shaped selections in order, each pair from one empty isolated mbx store and one target directory: main at fcef1ea64b against this branch merged with it. CPU is the whole cargo process tree's user plus system time.

Selection (changed crate) Compiled before Compiled after CPU before CPU after
moq-relay (first, cold) 665 694 596 s 645 s
moq-video 251 49 344 s 177 s
moq-mux 135 43 345 s 264 s
moq-ffi 175 14 147 s 49 s
hang 0 0 1 s 1 s
moq-tokio 119 24 429 s 309 s
whole workspace 213 101 658 s 404 s
Total 1,558 925 (−41%) 2,520 s 1,849 s (−27%)

After the first build, recompilations fall 74% (893 → 231) and CPU 37% (1,924 s → 1,204 s). The first cold build costs 8% more, because every crate now builds the union; the gate's shared store pays that once per lockfile change. Fewer distinct artifacts also matter on the land host, whose store evicted 7-15 GiB every batch at its 50 GiB cap.

Earlier runs, from this branch's first parent (fbeac8a9fd, 2026-10-28)

These predate dropping the gate's feature permutations, cargo-hack, wasm, and loom, so they measured a wider CI than today's.

Real mbx runs

Each job's recorded cargo invocations were replayed compile-only, in order, against one empty isolated mbx store. Each job started from an empty managed target (mbx clean), as on a fresh runner. CPU is the whole process tree's (systemd-run --wait). "Misses" includes compilations mbx could not look up.

Sequence Hits / misses (hit rate) CPU
Queue: 5 PR-shaped select.sh test builds (relay, video, hang, ffi, net), then relay and ffi select.sh lint before 3,980 / 3,693 (52%) → after 5,335 / 2,746 (66%) 3,633 s → 3,080 s (−15%)
Queue, the four warm test builds only 1,758 s → 1,219 s (−31%)
Nightly: rs uring, cli-export, multicast, quic-stress, audio-devices, render-sw before 1,758 / 1,812 (49%) → after 2,419 / 1,479 (62%) 1,556 s → 1,417 s (−9%)

Per job, the queue's test builds after the first went from 255-801 hits to 638-885 hits. The relay lint and the warm test builds each spend less CPU. The ffi lint rose from 182 s to 294 s: its isolated feature-shapes builds of moq-ffi now compile the whole hack.

Cross-job model

Every compiling cargo invocation of 40 Linux jobs was recorded through a logging cargo shim. That covers the gate over the whole workspace and six single-crate PR selections, its binding builds, and Nightly's features, tests matrix, and Rust bench jobs. Each invocation was expanded with cargo --unit-graph. Each unit is keyed the way its -C metadata is (package, target, mode, profile, features, platform, RUSTFLAGS, clippy wrapper, and its dependencies' keys, recursively) and weighted by its compile time from cold --timings builds. "Unique CPU" is what one shared cache needs to compile once. Jobs only share within a runner pool (the queue's local store, or Nightly's R2 namespace).

Pool Distinct compilations Unique CPU Sum of per-job cold CPU
Queue (21 jobs) 6,871 → 5,360 (−22%) 11,160 s → 8,440 s (−24%) 41,861 s → 35,910 s (−14%)
Nightly (19 jobs) 8,277 → 7,309 (−12%) 20,216 s → 18,523 s (−8%) 26,777 s → 30,657 s (+14%)

The last column is the cost of unifying. A single-crate Nightly job now also compiles hack crates it does not use. Examples are rs cli-export (570 → 731 units) and the release-profile bench jobs (rust-relay 485 → 1,079). That cost is paid once per lockfile change while the cache holds them, and it bought the Nightly jobs' sharing: their minority feature variants fell to 0-4 per job.

Across all 40 jobs, a compilation that one job misses although another built the same crate at the same version, grouped by what differs:

Cause Before After
Dependencies' keys only (a feature split further down) 1,200 723
Profile (release benches, loom, quic-sim) 1,167 952
Mode (check vs build) 1,117 472
Own features 845 679
Platform (an explicit host --target, as the Dart FFI build passes) 410 408
clippy wrapper 330 249
RUSTFLAGS 15 16
Total 5,280 3,691

The remaining feature splits come from the excluded crates' own builds and from library-only builds.

Feature-contract checks

With the hack disabled as features.yml does (cargo hakari disable && cargo update --workspace), a planted undeclared third-party feature in each guarded crate fails its check (rerun 2026-11-01 on this head):

Check Plant Result
just rs quic-features indexmap::map::serde_seq (indexmap/serde) E0432
just rs net-features uuid::Uuid::new_v4() (uuid/v4) E0599
just rs tokio-features reqwest::Response::json (reqwest/json) E0599
just rs media-features tokio::fs::read (tokio/fs) E0433

Publishing

  • cargo publish --dry-run passes end to end (package, verify build) for moq-clock-macros and moq-pattern, which both carry the hack edge. A packaged moq-json manifest has no reference to it.
  • release-plz release --dry-run stops at the same place on this branch and its parent: moq-clock needs moq-clock-macros, which a dry run never uploads.
  • release-plz update succeeds and leaves the hack and its edges untouched.

Impact

  • Public API: none. workspace-hack is publish = false, and cargo publish strips the path-only dev-dependency, so published manifests are unchanged.
  • Wire: none.
  • Contributors: a new crate must add workspace-hack = { path = "../workspace-hack" } under [dev-dependencies]; just rs lint names the line. A dependency change needs just rs fix (or cargo hakari generate).

Alternatives

A published stub crate or a publishing wrapper would add release machinery. The path-only dev-dependency preserves the existing release-plz flow. Android disables the hack instead of provisioning the host dev shell's media libraries.

Decisions

Settled with the maintainer on 2026-11-01, after the gate dropped feature permutations, cargo-hack, wasm, and loom (moq-dev/moq#7472 and others):

  1. Iterate this PR rather than start over. ✅ Iterate moq-dev/moq#6985 · Fresh PR · Leave it
  2. The contract-checked crates (moq-quic, moq-net, moq-tokio, moq-video, moq-audio, moq-transcode). ✅ Include them, disable the hack in features.yml · Keep them excluded · Include them and drop the contract checks
  3. Nightly's per-package cargo hack check pass this PR had added. ✅ Drop it · Keep it in Nightly
  4. Is hakari still worth it with the slimmer CI? The maintainer asked me to decide. Yes: the replay above cuts the gate's Rust test-build CPU 27% overall and 37% once warm.

Made without asking, since wasm and loom are gone: moq-clock (excluded for its wasm32 tests) and kio (excluded for loom) take the edge too.

Earlier decisions that still stand:

  • Edge layout. Use this PR's path-only dev-dependency rather than hakari's published-workspace setups (a published stub crate, or cargo hakari remove-deps before release-plz release).
  • FFI builds: follow-up. They are library-only release builds, so this layout leaves them as they were. Aligning their flags is the remaining work in quest/m0/ci/hakari.md.

Follow-ups

  • Align the binding builds' cargo invocations: the Dart build's explicit --target x86_64-unknown-linux-gnu alone splits 400+ units from every other build on the host (in quest/m0/ci/hakari.md).
  • Record the hosted macOS and Windows Nightly hit rates and CPU before and after this merges (in quest/m0/ci/hakari.md).

Checks

At the committed head, in the Nix dev shell:

  • just ci origin/main: 26 of 27 selected phases passed, including 11,322 Rust tests (126 skipped), 113 Python tests, JavaScript tests, C/C++, OBS compilation, Kotlin, Go, Dart, Swift checks, and repository tooling.
  • The remaining check flake failed while building the NixOS runner image: unshare: write failed /proc/self/uid_map: Operation not permitted. This is the local Nix builder's namespace restriction, not a source/test failure. The repository's non-strict namespace probe confirms that this host cannot run the VM check; the strict VM gate still needs a host that permits it.
  • cargo hakari generate --diff, python3 sh/rs/hakari.py, cargo metadata --locked --no-deps --format-version 1, quest check --base origin/main --branch quest/m0/ci/hakari, and git diff --check pass.
  • Android dependency-graph checks reproduce and eliminate the host-library edge. Full Android, macOS, and Windows builds were not run locally.
  • A read-only merge-tree check against the newer main at 7168b8f972 is conflict-free.

Review

  • Head: fb988e87c7b111f2a432e05d750b415f2cf29fcc, based on main at f8c608a24b.
  • Author review: Codex harness, GPT-6.1 Sol, high effort. Inspected the committed repair against the previously reviewed head, the merge resolutions, generated dependency graph, Android workflow, and checker formatting. No unresolved findings.
  • Independent review skipped under the trivial-change exemption: this repair combines both sides' tool/dependency additions, regenerates derived files, formats the checker, and applies the existing feature-workflow disable/re-resolve pattern to Android. The user requested working without subagents. The broader implementation already has a recorded clean review at 2a0a295e7a.
  • Android host-library finding: fixed. cargo tree --locked --target aarch64-linux-android -p moq-video -i pipewire --edges normal,build,dev reproduces the hack's host edge. After cargo hakari disable and cargo update --workspace, that graph contains neither PipeWire nor clang-sys. Full Android cross-compilation was not run locally because this host has no NDK.
  • The earlier CodeRabbit media traversal finding remains withdrawn; supported host builds still use Nix.
  • Checker formatting preserves its AST and import set. The refreshed lockfile changes no registry package names or versions from main.

(Written by GPT-6.1 Sol)

kixelated and others added 6 commits October 27, 2026 18:48
Quest-Claim: c9386df8a93a7f8a
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@kixelated kixelated changed the title Unify dependency features with cargo-hakari ci: unify dependency features with a cargo-hakari workspace-hack Oct 28, 2026
@kixelated

Copy link
Copy Markdown
Collaborator Author

Note from #7148, which adds a new workspace crate kio-macros (rs/kio/macros) and is in the merge queue. If #7148 lands first, regenerate the workspace-hack here so kio-macros gets its entry; if this lands first, #7148 needs it instead.

(Written by Claude Opus 5.5)

Resolve conflicts (moq-flate removed, web-transport-trait dev-deps dropped,
.taplo.toml .tmp exclude), regenerate the hack, and give the new
bench-harness crate its edge.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@kixelated
kixelated marked this pull request as ready for review October 29, 2026 16:03
@coderabbitai

coderabbitai Bot commented Oct 29, 2026 •

Copy link
Copy Markdown
Contributor

Review in Change Stack →

No actionable comments were generated in the recent review.

Recent review info
Run configuration
  • Source mode: Auto
  • Repository: Unavailable
  • Branch: Unavailable
  • File: No configuration file from this repository applied
  • Commit: Unavailable
  • Layers: Organization UI
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: 898e72cc-eb21-42f2-a771-3acfe08004dd
Commits

Reviewing files that changed from the base of the PR and between 4ec3011 and fb988e8.

Files ignored due to path filters: 1
  • Cargo.lock is excluded by !**/*.lock
Files selected for processing: 39
  • .config/hakari.toml
  • .github/workflows/android.yml
  • .github/workflows/features.yml
  • .taplo.toml
  • flake.nix
  • quest/m0/ci/README.md
  • quest/m0/ci/hakari.md
  • rs/hang/Cargo.toml
  • rs/justfile
  • rs/kio/Cargo.toml
  • rs/moq-archive/Cargo.toml
  • rs/moq-audio/Cargo.toml
  • rs/moq-auth/Cargo.toml
  • rs/moq-bench/Cargo.toml
  • rs/moq-cli/Cargo.toml
  • rs/moq-congestion/Cargo.toml
  • rs/moq-e2ee/Cargo.toml
  • rs/moq-ffi/Cargo.toml
  • rs/moq-hls/Cargo.toml
  • rs/moq-ice/Cargo.toml
  • rs/moq-mux/Cargo.toml
  • rs/moq-net/Cargo.toml
  • rs/moq-quic/Cargo.toml
  • rs/moq-relay/Cargo.toml
  • rs/moq-room/Cargo.toml
  • rs/moq-rtmp/Cargo.toml
  • rs/moq-rtsp/Cargo.toml
  • rs/moq-scene/Cargo.toml
  • rs/moq-sign/Cargo.toml
  • rs/moq-sock/Cargo.toml
  • rs/moq-srt/Cargo.toml
  • rs/moq-stats/Cargo.toml
  • rs/moq-tokio/Cargo.toml
  • rs/moq-transcode/Cargo.toml
  • rs/moq-uring/Cargo.toml
  • rs/moq-video/Cargo.toml
  • rs/qmux/Cargo.toml
  • rs/workspace-hack/Cargo.toml
  • sh/rs/hakari.py
Files skipped from review as they are similar to previous changes: 2
  • quest/m0/ci/README.md
  • rs/justfile

Included review availability: This review used your included allowance. Your plan provides up to 4 included reviews per hour; 0 remain after this review.

Walkthrough

The change adds a Hakari-managed workspace-hack package with shared and platform-specific dependency feature declarations. Workspace package manifests add local path dependencies on that package. Rust lint and fix recipes, a dependency-edge validation script, CI workflows, formatting configuration, and related documentation are also updated.

Merge Risk: Minimal · up to fb988

The supported Linux build environment supplies the libraries required by the workspace-hack. No actionable merge blocker remains after normal checks.

Pre-merge checks: Passed 5
Check name Status Explanation
Title check Passed The title clearly and concisely identifies the primary change: using a cargo-hakari workspace-hack to unify dependency features.
Description check Passed The description is directly related to the changeset and explains the workspace-hack implementation, CI behavior, measurements, validation, and known limitations.
Docstring Coverage Passed No eligible functions found in the changed files. Skipping docstring coverage check. Docstring coverage is scoped to functions touched by this diff with cyclomatic complexity of at least 2. Documentat…
Linked Issues check Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check Passed Check skipped because no linked issues were found for this pull request.
Full details: Docstring Coverage

Explanation

No eligible functions found in the changed files. Skipping docstring coverage check. Docstring coverage is scoped to functions touched by this diff with cyclomatic complexity of at least 2. Documentation-only edits and deletions within surviving functions are included; unchanged diff context and fully deleted functions are excluded. Analyzed 0 functions across 3 files. (38 skipped: 38 unsupported.)

Finishing Touches
Simplify code
  • Commit to this branch
  • Create a new PR
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

Share

@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Oct 29, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-10-31T04:00:49.666875Z 4ec3011 New commits
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

kixelated and others added 2 commits October 29, 2026 19:38
kio-macros landed on main in #7148 after this branch's last merge.

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

Copy link
Copy Markdown
Collaborator Author

Merging per the maintainer's /quest-merge pick in a /quest-complete session.

  • Merged main (d33b591) into the branch. There were no Cargo or lockfile changes. The quest merge driver resolved the only conflict, a link-list entry in quest/m0/ci/README.md (nightly-ffi-reuse.md was removed on main). The workspace-hack is unchanged.
  • Local checks on 8499085 pass: cargo sort --check, cargo hakari generate --diff, sh/rs/hakari.py, taplo format --check, and quest check --base origin/main.
  • Local quest review (Codex, gpt-6.1-sol, medium effort) of 8499085: 0 findings, recorded in the body's ## Review. No online review threads are open.
  • The decisions in the body were already settled. The follow-ups stay in quest/m0/ci/hakari.md.

(Written by Claude Opus 5.5)

@kixelated
kixelated added this pull request to the merge queue Oct 30, 2026
@kixelated
kixelated enabled auto-merge (squash) October 30, 2026 06:28
@github-actions
github-actions Bot disabled auto-merge October 30, 2026 07:37
@moq-bot

moq-bot Bot commented Nov 1, 2026

Copy link
Copy Markdown
Contributor

quest land removed this pull request from the queue: the batch check failed (exit 123).

@moq/e2ee:test            | subscribe close: id=0 broadcast=qNMmsuC9j3gTo1Ao-0SEIQ track=nMIPmJanfNGw5QO79jpd52ZosKO39FsH35JgKRXIeRAxgmAWKrcsRH0GMwY
@moq/e2ee:test            | https://localhost:4443/test negotiated ALPN: moqt-18
@moq/e2ee:test            | subscribe_namespace written: requestId=2
@moq/e2ee:test            | announced: broadcast=qNMmsuC9j3gTo1Ao-0SEIQ active=true
@moq/e2ee:test            | subscribe start: id=4 broadcast=qNMmsuC9j3gTo1Ao-0SEIQ track=foFGqEdPx7V95J31I8S5JTT4IIwCYsbg-bAm1JT12smZ4dSQ1sWtBDfR1tY
@moq/e2ee:test            | subscribe written: id=4 broadcast=qNMmsuC9j3gTo1Ao-0SEIQ track=foFGqEdPx7V95J31I8S5JTT4IIwCYsbg-bAm1JT12smZ4dSQ1sWtBDfR1tY
@moq/e2ee:test            | publish ok: broadcast=qNMmsuC9j3gTo1Ao-0SEIQ track=foFGqEdPx7V95J31I8S5JTT4IIwCYsbg-bAm1JT12smZ4dSQ1sWtBDfR1tY
@moq/e2ee:test            | subscribe ok: id=4 broadcast=qNMmsuC9j3gTo1Ao-0SEIQ track=foFGqEdPx7V95J31I8S5JTT4IIwCYsbg-bAm1JT12smZ4dSQ1sWtBDfR1tY
@moq/e2ee:test            | joining fetch: id=6 group=0
@moq/e2ee:test            | join head: group=0 objects=1
@moq/e2ee:test            | publish done: broadcast=qNMmsuC9j3gTo1Ao-0SEIQ track=foFGqEdPx7V95J31I8S5JTT4IIwCYsbg-bAm1JT12smZ4dSQ1sWtBDfR1tY
@moq/e2ee:test            | announced: broadcast=qNMmsuC9j3gTo1Ao-0SEIQ active=false
@moq/e2ee:test            | subscribe close: id=4 broadcast=qNMmsuC9j3gTo1Ao-0SEIQ track=foFGqEdPx7V95J31I8S5JTT4IIwCYsbg-bAm1JT12smZ4dSQ1sWtBDfR1tY
@moq/e2ee:test            | subscribe_namespace stream error: session closed
@moq/e2ee:test            | 
@moq/e2ee:test            |  60 pass
@moq/e2ee:test            |  0 fail
@moq/e2ee:test            |  1641 expect() calls
@moq/e2ee:test            | Ran 60 tests across 3 files. [528.00ms]
@moq/e2ee:test            | Done in 542ms
@moq/hang:test            | bun test v1.4.2 (744846f84)
@moq/hang:test            | 
@moq/hang:test            | src/container/consumer.backpressure.test.ts:
@moq/hang:test            | skipping missing groups: track=test 2 -> 3
@moq/hang:test            | 
@moq/hang:test            | src/container/consumer.holes.test.ts:
@moq/hang:test            | skipping missing groups: track=data 1 -> 2
@moq/hang:test            | skipping missing groups: track=data 1 -> 2
@moq/hang:test            | skipping missing groups: track=data 3 -> 4
@moq/hang:test            | skipping missing groups: track=data 1 -> 2
@moq/hang:test            | skipping missing groups: track=data 3 -> 4
@moq/hang:test            | skipping missing groups: track=data 5 -> 6
@moq/hang:test            | skipping missing groups: track=data 1 -> 2
@moq/hang:test            | skipping missing groups: track=data 3 -> 4
@moq/hang:test            | skipping missing groups: track=data 1 -> 3
@moq/hang:test            | skipping missing groups: track=data 4 -> 5
@moq/hang:test            | 
@moq/hang:test            | src/container/consumer.test.ts:
@moq/hang:test            | skipping missing groups: track=test 1 -> 2
@moq/hang:test            | skipping slow groups: track=test 0 -> 1 count=1
@moq/hang:test            | skipping slow groups: track=test 1 -> 2 count=1
@moq/hang:test            | skipping slow groups: track=test 0 -> 2 count=1
@moq/hang:test            | skipping slow groups: track=test 0 -> 3 count=1
@moq/hang:test            | skipping slow groups: track=test 2 -> 3 count=1
@moq/hang:test            | skipping slow groups: track=test 0 -> 1 count=1
@moq/hang:test            | skipping slow groups: track=test 0 -> 1 count=1
@moq/hang:test            | skipping slow groups: track=test 0 -> 1 count=1
@moq/hang:test            | skipping slow groups: track=test 0 -> 1 count=1
@moq/hang:test            | skipping slow groups: track=test 0 -> 1 count=1
@moq/hang:test            | skipping slow groups: track=test 1 -> 3 count=1
@moq/hang:test            | skipping covered group: 0 -> 1
@moq/hang:test            | skipping missing groups: track=test 1001 -> 2000
@moq/hang:test            | skipping missing groups: track=test 1001 -> 2000
@moq/hang:test            | skipping slow groups: track=test 0 -> 2 count=1
@moq/hang:test            | skipping slow groups: track=test 0 -> 3 count=1
@moq/hang:test            | skipping covered group: 0 -> 1
@moq/hang:test            | skipping slow groups: track=test 1 -> 2 count=1
@moq/hang:test            | skipping missing groups: track=test 1 -> 2
@moq/hang:test            | skipping missing groups: track=test 1 -> 2
@moq/hang:test            | skipping missing groups: track=test 1 -> 2
@moq/hang:test            | 
@moq/hang:test            | src/util/libav.test.ts:
@moq/hang:test            | using libav WebCodecs polyfill; performance may be degraded
@moq/hang:test            | 
@moq/hang:test            |  521 pass
@moq/hang:test            |  0 fail
@moq/hang:test            |  20822 expect() calls
@moq/hang:test            | Ran 521 tests across 29 files. [3.74s]
@moq/hang:test            | Done in 3.77s
@moq/interop-browser:test | bun test v1.4.2 (744846f84)
@moq/interop-browser:test | 
@moq/interop-browser:test |  25 pass
@moq/interop-browser:test |  0 fail
@moq/interop-browser:test |  184 expect() calls
@moq/interop-browser:test | Ran 25 tests across 7 files. [3.50s]
@moq/interop-browser:test | Done in 3.53s
@moq/json:test            | bun test v1.4.2 (744846f84)
error: recipe `test-changed` failed on line 54 with exit code 143
ci: check python failed
ci: seconds per module
   387  check py
    35  test py
   288  check rs
   370  test rs
   687  check c
   347  check cpp
    23  check obs_compile
   183  check js
    36  test js (cancelled)
   178  check kt
    79  check flake
     2  check swift
    10  check go (cancelled)
     1  check drill
     2  check quest
     2  check obs
     1  check ts_paths
     0  check python (failed)
   877  wall time
error: recipe `ci` failed on line 107 with exit code 123

.

@kixelated
kixelated enabled auto-merge (squash) November 1, 2026 18:02
@moq-bot

moq-bot Bot commented Nov 1, 2026

Copy link
Copy Markdown
Contributor

codex / Codex land fixer: PR was picked again while fixing; keeping the newer pick. Recommendation: run /quest-iterate before picking it again.

exec
/bin/bash -lc "tail -4 /tmp/tmp.QE8ljpll2u/rs.log; rg -n '"'^ *FAIL|Summary'"' /tmp/tmp.QE8ljpll2u/rs.log | tail -4" in /work
 succeeded in 0ms:
        PASS [   0.752s] ( 4196/10900) moq-mux container::ts::recovery_test::a_skip_across_a_resolution_change_takes_the_new_parameters
        PASS [   0.658s] ( 4197/10900) moq-mux container::ts::recovery_test::a_skip_across_the_wrap_keeps_the_clock
        PASS [   0.488s] ( 4198/10900) moq-mux container::ts::recovery_test::a_stall_drops_what_it_made_late
        PASS [   0.444s] ( 4199/10900) moq-mux container::ts::recovery_test::a_stalled_track_leaves_the_others_running

codex
The GStreamer tests now pass. More than 4,000 tests have completed with no failures in this run.

exec
/bin/bash -lc "tail -3 /tmp/tmp.QE8ljpll2u/rs.log; rg -n '"'^ *FAIL|Summary'"' /tmp/tmp.QE8ljpll2u/rs.log | tail -4" in /work
 succeeded in 0ms:
        PASS [   0.357s] ( 7409/10900) moq-net::integration broadcast_close::close_ends_a_local_consumer
        PASS [   0.355s] ( 7410/10900) moq-net::integration broadcast_close::close_ends_a_remote_consumer
        PASS [   0.316s] ( 7411/10900) moq-net::integration catalog_handover::fetch_lite_06::fetch_right_after_leave

exec
/bin/bash -lc 'tail -4 /tmp/tmp.QE8ljpll2u/rs.log; tail -5 /tmp/quest-6985-check.log' in /work
 succeeded in 0ms:
        PASS [   0.006s] ( 8686/10900) moq-quic transport_parameters::test::read_reset_stream_at_with_value
        PASS [   0.008s] ( 8687/10900) moq-quic transport_parameters::test::reserved_transport_parameter_generate_reserved_id
        PASS [   0.008s] ( 8688/10900) moq-quic transport_parameters::test::read_semantic_validation
        PASS [   0.006s] ( 8689/10900) moq-quic transport_parameters::test::reserved_transport_parameter_ignored_when_read
==> check python
All checks passed!
164 files already formatted
ci: check rs passed in 26s
ci: test rs started

codex
More than 8,600 tests have completed with no failures. I’ll write the result file once the suite finishes.

exec
/bin/bash -lc "tail -3 /tmp/tmp.QE8ljpll2u/rs.log; rg -n '"'^ *FAIL|Summary'"' /tmp/tmp.QE8ljpll2u/rs.log | tail -4" in /work
 succeeded in 0ms:
        PASS [   0.084s] ( 9022/10900) moq-relay::integration cluster_close::a_relay_shutdown_closes_its_cluster_dials
        PASS [   0.294s] ( 9023/10900) moq-relay::integration auth_lifetime::websocket_refusal_is_in_band
        PASS [   0.483s] ( 9024/10900) moq-relay::integration auth_lifetime::the_end_carries_duration_and_bytes

exec
/bin/bash -lc 'tail -3 /tmp/tmp.QE8ljpll2u/rs.log; tail -5 /tmp/quest-6985-check.log' in /work
 succeeded in 0ms:
        PASS [   0.092s] (10512/10900) moq-uring::integration web::a_clean_finish_closes_a_stream
        PASS [   0.089s] (10513/10900) moq-uring::integration web::a_dropped_session_delivers_its_close
        PASS [   0.091s] (10514/10900) moq-uring::integration web::a_dropped_stream_carries_a_webtransport_code
==> check python
All checks passed!
164 files already formatted
ci: check rs passed in 26s
ci: test rs started

 succeeded in 273527ms:
exec
/bin/bash -lc 'tail -8 /tmp/quest-6985-check.log; tail -3 /tmp/tmp.QE8ljpll2u/rs.log 2>/dev/null' in /work
 exited 1 in 0ms:
        PASS [   8.242s] (10900/10900) moq-video encode::producer::tests::clock::hls_records_keep_the_live_timestamps
────────────
     Summary [ 243.804s] 10900 tests run: 10900 passed, 124 skipped
ci: seconds per module
    26  check rs
   247  test rs
     0  check python
   274  wall time

codex
Validation passed: 10,900 Rust tests passed, with 124 skipped, and the Rust and Python checks are green. I’m writing the `fixed` result with the branch head and validation commands.

exec
/bin/bash -lc "python3 - <<'PY'
import json, subprocess
head=subprocess.check_output(['git','rev-parse','pr-6985'],text=True).strip()
result=[{'number':6985,'action':'fixed','head':head,'reason':'Merged base and applied Ruff import/indentation formatting to sh/rs/hakari.py without behavior changes; passed ALLOW_HOST_TOOLCHAIN=1 LOCAL_SUPERVISED=1 CHECK_MODULES=\"python rs\" CI_STRICT=1 NEXTEST_PROFILE=ci sh/dispatch.sh ci base with cached native-library/include/GStreamer-plugin environment (10900 tests passed, 124 skipped); also passed CHECK_MODULES=\"toml justfile quest\" sh/dispatch.sh check base, cargo hakari generate --diff, and python3 sh/rs/hakari.py.'}]
with open('quest-land-result.json','w') as f:
 json.dump(result,f,indent=2)
 f.write('\\n')
assert len(head)==40
subprocess.run(['git','merge-base','--is-ancestor','2a0a295e7a26ecb767575069175cf28bd3bfd0ec',head],check=True)
PY
 git status --short; git diff --check; git log -2 --format='%H %s'" in /work
 succeeded in 0ms:
?? quest-land-result.json
71ae34f936ffc5bd39a8c6793985e4e7edd366a9 style: format hakari dependency checker
d3976831010f9f3be22b4666161c08716b5d70a3 Merge branch 'base' into pr-6985

codex
Fixed PR #6985 on `pr-6985` at `71ae34f936ffc5bd39a8c6793985e4e7edd366a9`: merged base and formatted the Python checker without behavior changes.

Validation passed: 10,900 tests; 124 skipped.

Wrote [quest-land-result.json](/work/quest-land-result.json) and left it uncommitted.
tokens used
98,870
Fixed PR #6985 on `pr-6985` at `71ae34f936ffc5bd39a8c6793985e4e7edd366a9`: merged base and formatted the Python checker without behavior changes.

Validation passed: 10,900 tests; 124 skipped.

Wrote [quest-land-result.json](/work/quest-land-result.json) and left it uncommitted.
fixer result written

(written by codex / Codex)

@moq-bot

moq-bot Bot commented Nov 2, 2026

Copy link
Copy Markdown
Contributor

codex / Codex land fixer note:

Failure log line 1:

Conflicts with the base: flake.nix

The read-only merge check git merge-tree --write-tree base pr-6985 reproduces CONFLICT (content): Merge conflict in flake.nix. This task prohibits resolving conflicts in that protected file. Please merge base and resolve the conflict, then rerun the affected build and tests. No branches or tracked files were changed; builds and tests were not run because the merge is blocked.

(written by codex / Codex)

@moq-bot
moq-bot Bot disabled auto-merge November 2, 2026 04:40
@moq-bot moq-bot Bot removed the quest:merge label Nov 2, 2026
@moq-bot

moq-bot Bot commented Nov 2, 2026

Copy link
Copy Markdown
Contributor

codex / Codex land fixer: PR conflicts with base in protected flake.nix; git merge-tree --write-tree base pr-6985 reports "CONFLICT (content): Merge conflict in flake.nix".. Recommendation: Merge base into the PR and have a maintainer re·solve flake.nix, then rerun the affected build and tests.

Conflicts with the base: flake.nix

(written by codex / Codex)

kixelated and others added 3 commits November 2, 2026 06:56
Co-Authored-By: GPT-6.1 Sol <noreply@openai.com>
Co-Authored-By: GPT-6.1 Sol <noreply@openai.com>
Co-Authored-By: GPT-6.1 Sol <noreply@openai.com>
@kixelated
kixelated added this pull request to the merge queue Nov 2, 2026

@kixelated kixelated left a comment

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

Automated review by review (OpenAI)

Reviewed commit: fb988e87c7b111f2a432e05d750b415f2cf29fcc, comparing the update against my previous review while accounting for merged main changes.

Fixed: the prior Android P2 is addressed in .github/workflows/android.yml: the pinned hakari tool disables the hack and re-resolves Cargo.lock before the Android cross-check, removing the unprovisioned host PipeWire dependency path. The local recipe documents the same prerequisite.

No new actionable bugs found. Keeping the native cache optimization while disabling it at the cross-build boundary is a focused, simpler fix than provisioning unrelated media libraries on the Android runner. The checker changes are formatting-only.

Verification: static GitHub inspection of the workflow, recipes, dependency refresh, and checker, with independent validation of the fix. I did not run Android builds, tests, hakari regeneration, or performance measurements.

(Written by OpenAI)

Merged via the queue into main with commit 8e53bf3 Nov 2, 2026
6 checks passed
@kixelated
kixelated deleted the quest/m0/ci/hakari branch November 2, 2026 15:45
kixelated added a commit that referenced this pull request Nov 2, 2026
#6985 merged after the off-cycle run's base, so point feature-unification
work at the still-open hakari quest and flag which baselines it can shift.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
kixelated added a commit that referenced this pull request Nov 3, 2026
main's #7468 added a parse-amplification measurement to quest/m2/media-fuzz.md,
which this branch deletes. The measurement found three fMP4 cases that need
fixing, so the quest now keeps that remaining work with the numbers instead
of being deleted, and its m2 and import-metadata-policy links stay.

- .config/hakari.toml: exclude moq-mux-fuzz and moq-rtmp-fuzz from the
  workspace-hack (#6985), like moq-net-fuzz and moq-quic-fuzz.
- sps-overflow.md: H.264 now parses with h264-reader (#7398).
- mp4-atom-bump.md: its prose wait moves into a ## Waiting section.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant