Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -124,14 +124,17 @@ jobs:
save-if: ${{ github.ref == 'refs/heads/main' }}

- name: Check formatting
if: ${{ !cancelled() }}
run: cargo fmt --all -- --check

- name: Audit workspace architecture
if: ${{ !cancelled() }}
run: |
python3 scripts/workspace_architecture.py --self-test
python3 scripts/workspace_architecture.py --check --print-summary

- name: Public benchmark evidence freshness
if: ${{ !cancelled() }}
run: |
PYTHONPATH=. python3 tests/test_public_baseline.py
# README embedded table is optional since #6736 (marketing landing
Expand All @@ -145,6 +148,7 @@ jobs:
# cargo-check incrementality, and hide regressions in code review.
# Allowlist + exclusions live in the script.
- name: File size limit
if: ${{ !cancelled() }}
run: ./scripts/check_file_size.sh

# Well-known binding provenance pins: every third-party binding in
Expand All @@ -154,6 +158,7 @@ jobs:
# (no network); the weekly update runs `--check --refresh` to surface
# newly-soaked upstream releases as advisories.
- name: Binding upstream pins (lock-step)
if: ${{ !cancelled() }}
run: node scripts/binding_pins.mjs --check

# GC write-barrier store-site inventory: every raw heap-slot store in
Expand All @@ -162,6 +167,7 @@ jobs:
# in scripts/gc_store_site_allowlist.txt). Catches new unbarriered
# old->young store paths before they become nondeterministic segfaults.
- name: GC store-site inventory
if: ${{ !cancelled() }}
run: |
python3 scripts/gc_store_site_inventory.py --self-test
python3 scripts/gc_store_site_inventory.py
Expand All @@ -174,6 +180,7 @@ jobs:
# they become Linux-only segfaults (#1843, #4004, #4665, #4800 class).
# Allowlist: scripts/addr_class_allowlist.txt.
- name: Address-classification audit
if: ${{ !cancelled() }}
run: |
python3 scripts/addr_class_inventory.py --self-test
python3 scripts/addr_class_inventory.py
Expand All @@ -182,9 +189,11 @@ jobs:
# its own logic is unit-checked on the cheap job rather than only being
# exercised 8 shards deep.
- name: Gap snapshot checker self-test
if: ${{ !cancelled() }}
run: python3 scripts/gap_snapshot.py --self-test

- name: Platform-aware parity allowlist self-test
if: ${{ !cancelled() }}
run: python3 scripts/parity_known_failures.py --self-test

# Moving-GC gate wiring. The GC gates are the ones this repo has most
Expand All @@ -201,6 +210,7 @@ jobs:
# server-side state, not a file in the tree — and says so; `--list` prints
# what is and is not covered.
- name: Moving-GC gate wiring
if: ${{ !cancelled() }}
run: |
python3 scripts/gc_gate_wiring_check.py --self-test
python3 scripts/gc_gate_wiring_check.py
Expand All @@ -215,6 +225,7 @@ jobs:
# cites an issue, and the matrix still calls the checker at all — a gate
# nobody invokes is the same hazard one level up).
- name: GC matrix liveness gate
if: ${{ !cancelled() }}
run: |
python3 scripts/gc_matrix_liveness_check.py --self-test
python3 scripts/gc_matrix_liveness_check.py --check-registry
Expand Down
17 changes: 17 additions & 0 deletions changelog.d/7306-lint-gates-report-independently.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
Every gate step in the `lint` job now carries `if: ${{ !cancelled() }}`, so one
failing gate no longer hides the ones after it. Setup steps (checkout, Node,
Rust toolchain) still stop the job — there is nothing to gate without them.

This was not hypothetical. The public-baseline freshness check sits at step 8 and
was stale for 40+ commits, so **file size, GC store-site inventory,
address-classification audit, moving-GC gate wiring, GC matrix liveness and the
dark-test registration check never executed in CI at all**. Four of them were
found red only by running them by hand (#7256, #7273), and #7253's wiring gate —
added specifically to catch gates that cannot fail — was itself unreachable.

Before this change 1 of 17 steps ran unconditionally. The job still fails if any
gate fails; it just reports all of them.

Relevant now because the benchmark artifact is expected to go stale during the
current optimization work — its only fix is a ~2-hour regeneration on a specific
quiet host, and that must not silently disarm six other gates each time.
Loading