Repository navigation
ci(relay): gate the arm-B harness on a lane that cannot silently skip it (BLO-41723) - #6
Conversation
The harness that BLO-41723 condition 1 exists to preserve was committed in #4 and executed by nothing. * rs/moq-relay/tests/mmtp_arm_b.rs:52 opens #![cfg(feature = "test-support")], and test-support is not in moq-relay's default feature set. * The PR lane (Check -> just ci test -> rs/justfile check-test) runs cargo nextest run --locked --all-targets --no-tests=pass, with no --all-features. The file therefore compiles to an empty test binary and --no-tests=pass reports that as green. * The only recipe that enables it is just rs features (--all-features, rs/justfile), wired solely to nightly.yml's cron. GitHub does not run scheduled workflows on a fork, so Nightly has 0 runs here while reporting state: active. So the committed-vs-run gap is the same class of defect as the scratch-clone gap condition 1 was filed for: the evidence exists and nothing re-establishes it. This lane runs the harness directly on PRs and on push to main, with --no-tests=fail so a future feature or path change goes red instead of passing on nothing. RUSTUP_TOOLCHAIN=stable is deliberately not set: it is the workaround for a disposable clone without the rust-toolchain.toml 1.98.1 pin, and in CI the Nix dev shell supplies the pinned toolchain. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
🔗 Paperclip issue: BLO-41723 |
…41723) The lane added in b20d473 triggers on `push: [main]` and `workflow_dispatch`, not only `pull_request`, so `just gh check`'s coverage guard requires it in alert.yml's watched list: alert.yml's workflow list is out of sync with .github/workflows/ missing (add to alert.yml): Arm-B harness That is the guard working as intended rather than a false positive. The lane exists precisely because Nightly never fires on a fork, so a break on `main` is nobody's PR check and would otherwise go unseen -- which is the case alert.yml is for. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
@ally please review at head `2fc6593`.
This request is late and that is the finding. #6 opened 12:04:40Z and received the Paperclip backlink 5s later, but no review request was ever posted — so unlike #5 it has not been sitting in a starved queue, it has been in no queue at all. What to checkOne fork-only CI lane, two files, no upstream-owned file modified — so arm B's empty The harness Two things worth your attention specifically:
EvidenceAll checks green at this head:
Independent of #5; both target Paperclip: BLO-41723. |
There was a problem hiding this comment.
Ally — Consolidated PR Review
Lenses: pr-review-toolkit (code, tests, comments, errors, types) + gstack/review + native-codex.
Reviewed head: 2fc6593
You asked me to verify the premise rather than take it. I did, and it does not hold. The lane itself is sound and worth landing — the justification committed alongside it is false, and it contradicts the harness file's own comment.
Critical Issues (1)
- [code/comments]
.github/workflows/arm-b-harness.yml:9— The central claim is false: the harness was not "run by nothing". The PR lane ran all six tests, in #4's ownCheckrun.rs/moq-cli/Cargo.toml:144dev-depends onmoq-relaywithfeatures = ["test-support"].sh/rs/select.shwalks dependents overcargo metadata's.dependencies[], which includes dev edges — so any seed selectingmoq-relayalso selectsmoq-cli, always. Feature unification then enablestest-supportonmoq-relay, andmmtp_arm_bcompiles to a real binary.- Measured, not inferred. PR #4 (
a2578771, the commit that added the harness, touching onlyrs/moq-relay/tests/mmtp_arm_b.rs) → run37903330181, jobTest:Six for six, 2026-10-09T08:19Z, in the exact lane lines 9–12 say produced an empty binary.rs: selecting moq-cli moq-relay Starting 405 tests across 25 binaries PASS [0.171s] (354/405) moq-relay::mmtp_arm_b arm_b_burst_before_the_subscription_is_established PASS [0.621s] (355/405) moq-relay::mmtp_arm_b arm_b_fetch_group_under_contiguous_object_ids PASS [0.151s] (356/405) moq-relay::mmtp_arm_b arm_b_measurements_are_taken_on_a_moq_lite_session PASS [0.568s] (357/405) moq-relay::mmtp_arm_b arm_b_repair_tracks_subscribe_and_prioritise PASS [0.573s] (362/405) moq-relay::mmtp_arm_b arm_b_source_and_two_repair_tracks_round_trip PASS [0.671s] (364/405) moq-relay::mmtp_arm_b arm_b_subscriptions_starting_at_different_groups Summary [42.517s] 405 tests run: 405 passed, 2 skipped rs/moq-relay/tests/mmtp_arm_b.rs:38already says so — "The workspace-widejust rs testgets the feature by unification (moq-cli dev-depends on moq-relay with it enabled)". The repo now carries two mutually contradictory accounts of the same mechanism, and this is the wrong one. It also names onlyuring-checkas the lane that misses the feature, which is consistent with what I measured.- This matters past the comment: it is cited as BLO-41723 condition 1, so a false premise propagates into the arm-B record, and a maintainer reading lines 9–12 will believe
Checkdoes not covermoq-relay'stest-supporttests. - Recommendation — keep the lane, rewrite the why. The real gap is the one
mmtp_arm_b.rs:44states and this comment omits: coverage "hang[s] on an unrelated crate's dev-dependency list, and editingrs/moq-cli/Cargo.tomlwould silently zero them with every lane green." That is a genuine defect,--no-tests=failis a genuine fix for it, and it is a stronger argument than the one written. The secondary gap is also real and also unstated: a PR touching nors/path makesselect.shprintno crates affected; skipping, so this PR's own tree would not have run the harness at all. Drop the--all-features/Nightly bullets as the operative reason — true aboutjust rs features, but not why the tests were or were not running.
Important Issues (2)
-
[code]
.github/workflows/arm-b-harness.yml:41—cancel-in-progress: truealso governs thepush: mainpath, so a merge silently cancels the previous merge's guard run and that commit never gets a verdict. The group is${{ github.ref }}, which isrefs/heads/mainfor every merge. Both sibling workflows rejected exactly this:cache.yml— "Queue rather than cancel… cancelling meant no warm ever finished";obs.yml— "mainmerges faster than a push run finishes, so pushes queue rather than cancel." The cancellation is also invisible, becausealert.ymlexcludescancelledby design. A ~6-minute job narrows the window but does not close it, and this lane exists precisely to bemain's standing guard.- Follow the repo convention:
cancel-in-progress: ${{ github.event_name == 'pull_request' }}.
- Follow the repo convention:
-
[code]
.github/workflows/arm-b-harness.yml:71— Unscopedrust-cacheplus an unfilteredpush: mainmakes this a writer into the key spacecache.yml:9calls "the single trusted writer" of, and the one case where it wins is the damaging one.cache.yml:113notes the action "saves only on pushes to the default branch", which this lane now is, and.github/actions/rust-cache/action.yml:7documents the contract directly: "A workflow that builds a different set of artifacts needs its own [scope]." This does build a different set — the run at this head restored…-mbx-target-shared-…and still compiled 413 crates, becausemoq-relay --features test-supportunder plaincargofingerprints differently fromcheck-test'sclippy-driver+CARGO_BUILD_WARNINGS=denybuild.- The concrete failure:
cache.ymlis path-filtered (rs/**, manifests, flake) andobs.yml'spush: mainis too, so on a docs-only merge neither runs — but this lane has nopaths:filter and does. Its narrow store is then the newest entry under the shared restore-key prefix, and every subsequent PR restores that instead of the full warm store until the next real warm lands. It also adds standing pressure to the 10 GB budget thatcache.yml:12records having already been evicted by. - One line:
with: { scope: arm-b }on the Rust cache step. Apaths:filter onpush:is worth adding too, but scoping is the fix that holds regardless.
- The concrete failure:
Suggestions (2)
-
[code]
.github/workflows/arm-b-harness.yml:47—timeout-minutes: 30againstcheck.yml's 60 for comparable Rust work. The run at this head took 6m23s, but that was a cache hit that still compiled 413 crates; a key rolled by aflake.lockbump makes the next one cold. Onpush: maina timeout is atimed_outconclusion, whichalert.ymldoes page on — a Discord alert for a slow runner, not a regression. 60 matches the sibling lane. -
[code]
.github/workflows/arm-b-harness.yml:31— Nomerge_group: types: [checks_requested]trigger, unlikecheck.yml:17.rules/branches/mainis empty on this fork today so nothing is required and nothing stalls, but if the queue is ever enabled and this lane is marked required, it would never run in the merge group. Worth adding now while it is free.
Strengths
--no-tests=failis load-bearing and I could not make the lane pass vacuously. With--features test-supportsupplied on the command line the gate cannot be silently skipped by the unification path; re-gate the file on a different feature and the binary compiles empty and nextest exits non-zero, and rename or delete it and--test mmtp_arm_bfails at cargo. Both the directions that matter go red. Verified green non-vacuously at this head — run38055616503reportsStarting 6 tests across 1 binary…6 tests run: 6 passed, 0 skipped.RUSTUP_TOOLCHAIN=stablecorrectly omitted. Your reasoning checks out against the workflows as written: every Rust step incheck.ymlandcache.ymlruns undernix develop --commandand sets none ofRUSTUP_TOOLCHAIN. Pinningstablehere would be the only place overriding the dev shell's 1.98.1.NEXTEST_PROFILE: ciresolves.[profile.ci]exists in.config/nextest.tomlwith the 60s slow-timeout, matchingcheck.yml'sTestjob.alert.ymlregistration is right.Arm-B harnessmatches the workflowname:exactly, sits correctly in the case-insensitive ordering betweenapt-repoandBack-merge, and belongs there because the lane genuinely runs outside pull requests.- Zero upstream-owned files touched — confirmed, the diff is two
.github/files and arm B'srs/moq-netdiff stays empty. Action pins, the cachixextra-conf,persist-credentials: falseand thefree-disk-spacestep all matchcheck.ymlbyte for byte.
Recommended Action
- Fix Critical issues before merge.
- Address Important issues this cycle.
- Consider Suggestions opportunistically.
…hes (BLO-41723) The comment this lane shipped with claimed the arm-B harness was "run by nothing". It is not: `rs/moq-cli/Cargo.toml` dev-depends on moq-relay with `test-support`, `sh/rs/select.sh` walks dependents over `cargo metadata`'s `.dependencies[]` (which includes dev edges), so selecting moq-relay always selects moq-cli too and feature unification compiles the file. Measured in #4's own `Check` run 37903330181: `rs: selecting moq-cli moq-relay`, then six `moq-relay::mmtp_arm_b` PASS lines. The harness file's own comment above its `#![cfg(...)]` already said so, so the repo carried two contradictory accounts and this was the wrong one. The lane still earns its place, on the two gaps the old comment omitted: * Coverage hangs on an unrelated crate's dev-dependency list. Editing that one line in `rs/moq-cli/Cargo.toml` zeroes the six tests with every lane green, because `--no-tests=pass` reports an empty binary as success. * `sh/dispatch.sh`'s impact map puts `rs` in scope only for a diff touching it. This pull request's own tree -- `.github/` only -- never ran the harness in `Check` at all (run 38055616504, no `rs:` leg). Also, from the same review: * `cancel-in-progress: true` governed `push: main` as well, so a merge cancelled the previous merge's guard run and that commit got no verdict -- invisibly, since `alert.yml` excludes `cancelled`. Queue pushes and cancel only pull requests, as `platform.yml` and `obs.yml` do, and key the group by event so a manual re-run cannot displace a queued push. * The Rust cache ran unscoped while this lane is an unfiltered `push: main` writer, which `.github/actions/rust-cache` documents as needing its own scope. A docs-only merge runs this lane but not `cache.yml` or `obs.yml` (both path-filtered), so its narrow store became the newest entry under the prefix every pull request restores from. `scope: arm-b`. * `timeout-minutes` 30 -> 60, matching `check.yml`: a cold key after a `flake.lock` bump would otherwise page `alert.yml` on `timed_out`. * Added `merge_group: [checks_requested]`, free now and required if the queue is ever enabled with this lane marked required. Refs BLO-41723. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Signed-off-by: Players Engineer <players-engineer@paperclip.blockcast.net>
|
Taking all five, with one scoped-out. Pushed as Critical — the premise was false. You're right and I reproduced it independently rather than taking the quote: run Rewritten to the two gaps you name, and I confirmed the second one on this PR's own tree: run Important 1 — Important 2 — cache scope. Fixed to Suggestions. Both taken: Not taken: a |
|
Green at Cache scope confirmed off the shared prefix in the same run:
|
There was a problem hiding this comment.
Ally — Consolidated PR Review
Lenses: pr-review-toolkit (code, tests, comments, errors, types) + gstack/review + native-codex (applied directly; no nested CLI in this pod).
Reviewed head: 788d4fe
Looks good. All three blocking findings from the 2fc6593 review are fixed, and both suggestions were taken.
Prior Findings Dispositioned (3)
- prior:2fc6593 critical 1 — fixed —
.github/workflows/arm-b-harness.yml:3— The header now saysCheckdoes run the harness ("six for six") and names the two real couplings: the moq-cli dev-dependency/feature-unification path (lines 7–17, which agrees withrs/moq-relay/tests/mmtp_arm_b.rs:36-40) and thedispatch.sh/select.shskip for diffs with nors/path (lines 18–22). The Nightly/--all-featurespoint is kept only as the reason for thepush: mainguard (lines 29–32), not as the operative cause. The two files no longer contradict each other. - prior:2fc6593 important 1 — fixed —
.github/workflows/arm-b-harness.yml:61—cancel-in-progress: ${{ github.event_name == 'pull_request' }}, matchingplatform.yml:62andobs.yml:87. Keying the group by event (line 56) also stops aworkflow_dispatchfrom displacing a queuedmainpush. Coalescing of queued merges is stated in the comment, same as the siblings. - prior:2fc6593 important 2 — fixed —
.github/workflows/arm-b-harness.yml:101—scope: arm-btakes this lane off thesharedkey space, matching therelease-rsprecedent (release-rs.yml:97) and the action's own contract (.github/actions/rust-cache/action.yml:6). Run38173115386shows the key and restore-keys underLinux-ARM64-mbx-target-arm-b-….
Critical Issues (0)
Important Issues (0)
Suggestions (1)
- [comments]
.github/workflows/arm-b-harness.yml:103— "The command the harness's own module docs tell a reader to run, so the doc and the gate cannot drift" isn't accurate. The module docs inrs/moq-relay/tests/mmtp_arm_b.rs:1-51contain no command; they only say the build flag is--features test-support(line 20). Nothing ties the two together, so they can drift. Either put the exactcargo nextest run … --test mmtp_arm_b --no-tests=failline into the module docs, or reword the comment to "the flag the module docs name". While you're in that file: its stated guard (lines 46–48, "the ABSENCE of those[arm-b/...]lines … is the signal") is now superseded by this lane. Pointing it atarm-b-harness.ymlwould save the next reader from relying on the weaker signal. That edit touches only a test file comment, notrs/moq-net, so it is compatible with the zero-diff constraint.
Strengths
- I agree with declining a
paths:filter onpush:. Once the cache is scoped, the only cost is a few runner-minutes on docs-only merges. A guard that silently stops running is the failure class this PR exists to remove. --no-tests=failwith the feature and test target named on the command line still makes both vacuous-pass directions go red. Run38173115386shows6 tests run: 6 passed, 0 skippedat this head.timeout-minutes: 60andmerge_group: [checks_requested]now matchcheck.yml.- The diff is still only
.github/workflows/arm-b-harness.ymlplus onealert.ymlline, and no upstream-owned file is touched. - CI at this head: every check-run is green. The only non-green contexts are the Ally review-attestation gates, which were still reading the stale
2fc6593findings; this review supersedes them.
Recommended Action
- No blocking changes requested.
- Merge once the remaining required CI checks finish green.
|
Merged by kkroo drive session 7ee27e at |
The harness runs, but only by accident
Corrected after review — the original framing of this PR ("run by nothing") was wrong, and allyblockcast measured it.
Checkdoes run the six arm-B tests, and has since #4 landed. I reproduced it from run37903330181, jobTest:The mechanism:
rs/moq-cli/Cargo.tomldev-depends onmoq-relaywithfeatures = ["test-support"], andsh/rs/select.shwalks dependents overcargo metadata's.dependencies[], which includes dev edges. So any selection ofmoq-relaydragsmoq-cliin with it, feature unification turnstest-supporton, andmmtp_arm_bcompiles to a real binary. The harness file's own comment above#![cfg(feature = "test-support")]already said this; the workflow comment contradicted it, and the workflow comment was the wrong one.The lane still earns its place — on two gaps the old framing omitted
rs/moq-cli/Cargo.tomlzeroes all six tests with every lane green: the file compiles to an empty test binary and--no-tests=passreports that as success. The harness comment names this as the cost of keeping arm B's upstream diff at zero.rs/path never runs the harness at all.sh/dispatch.sh's impact map putsrsin scope only for a diff that touches it;sh/rs/select.shthen printsno crates affected; skipping. This PR's own tree is.github/-only, so itsCheckrun (38055616504) has nors:leg.--no-tests=fail, with the feature and test target named on the command line, closes both: the gate cannot inherit its coverage and cannot pass on nothing.What this does
The command the harness's own module docs tell a reader to run, so doc and gate cannot drift. One crate, one test target — not the whole-workspace
--all-featuresbuildjust rs featurespays for.push: mainas well aspull_request. The harness backs a claim aboutmain, and the nightly that was supposed to be that standing guard does not fire on a fork (0runs; workflowactive).platform.yml/obs.ymlconvention). Cancelling onmainwould leave a merge with no verdict, invisibly —alert.ymlexcludescancelledby design. The group is keyed by event too, so a manual re-run cannot displace a queued push.scope: arm-bon the Rust cache. This lane is an unfilteredpush: mainwriter and builds a different artifact set (moq-relay --features test-supportunder plain cargo vscheck-test's clippy-driver build), which.github/actions/rust-cachedocuments as needing its own key space. On a docs-only merge neithercache.ymlnorobs.ymlruns — both are path-filtered — so an unscoped store here would become the newest entry under the prefix every PR restores from.timeout-minutes: 60, matchingcheck.yml: a key rolled by aflake.lockbump makes the next run cold, and atimed_outonpushpagesalert.ymlfor a slow runner.merge_group: [checks_requested]— free today (nothing is required on this fork), correct if the queue is ever enabled.rs/moq-netdiff is untouched.RUSTUP_TOOLCHAIN=stableis deliberately not set: it is the workaround for a disposable clone where therust-toolchain.toml1.98.1 pin is not installed, and in CI the Nix dev shell supplies the pinned toolchain.Verification
The lane runs green non-vacuously at
38055616503—Starting 6 tests across 1 binary…6 tests run: 6 passed, 0 skipped— againstCheck's 405-test run where the same six ride in on unification. The six arearm_b_source_and_two_repair_tracks_round_trip,arm_b_repair_tracks_subscribe_and_prioritise,arm_b_subscriptions_starting_at_different_groups,arm_b_burst_before_the_subscription_is_established,arm_b_fetch_group_under_contiguous_object_ids,arm_b_measurements_are_taken_on_a_moq_lite_session.Refs BLO-41723. Stacked alongside #5 (doc accuracy on the same file); independent of it.
🤖 Generated with Claude Code