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
6 changes: 3 additions & 3 deletions .github/workflows/board-snapshot.yml
Original file line number Diff line number Diff line change
Expand Up @@ -152,9 +152,9 @@ on:
# platform-checklist watchdog at :51 — 44 minutes after this run starts —
# plus CodeQL on Mondays. `4,10,16,22` was the obvious alternative and is
# worse on the same measurement: it drops an 800-request run into the busiest
# scheduled hour on this board (04:00 rerun-safety, 04:19 release-coverage
# patrol, 04:23 required-set patrol, 04:37 branch reaper on Mondays, 04:41
# create-smoke) and shares hour 16 with the required-set patrol.
# scheduled hour on this board (04:19 release-coverage patrol, 04:23
# required-set patrol, 04:37 branch reaper on Mondays, 04:41 create-smoke)
# and shares hour 16 with the required-set patrol.
#
# The minute is off the top of the hour on purpose, as in every patrol here:
# scheduled workflows queue behind everyone else's :00 cron.
Expand Down
56 changes: 56 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -828,6 +828,24 @@ jobs:
pnpm turbo run build "--filter=$PKG" --concurrency=4 --log-order=stream
done < "$RUNNER_TEMP/shard-packages.txt"

# ── Test leftovers, step 1 of 2: the snapshot (#23880, ruling 乙) ──────
#
# REPORT ONLY, never a gate; the rationale, the listing and the closed
# exclusion list are in the `scripts/ci/report-test-leftovers.mjs` header.
# Taken HERE, after both dependency-closure builds above and before the
# tests, so the report after the tests can tell what the test run added
# from what the builds wrote. A package's OWN build (a test task that
# turbo.json makes depend on `build` without `^`) still runs inside the
# test step; the report excludes its declared outputs, read from
# turbo.json on every run. The snapshot goes to $RUNNER_TEMP, outside the
# tree, or the report would count it.
#
# ⛔ No `if:` and no `continue-on-error`: the script exits 0 on every
# path, by construction (a failure prints one NOT MEASURED warning), so
# this step cannot fail the shard or withhold its attestation.
- name: Snapshot the working tree before this shard's tests
run: node scripts/ci/report-test-leftovers.mjs snapshot --out "$RUNNER_TEMP/test-leftovers/before.json"

# --concurrency=4: turbo's default (10) oversubscribes the 4-vCPU
# hosted runner; matching the core count bounds peak memory and the
# job is CPU-bound anyway.
Expand Down Expand Up @@ -1056,6 +1074,27 @@ jobs:
done
exit $STATUS

# ── Test leftovers, step 2 of 2: the report (#23880, ruling 乙) ────────
#
# Every path this shard's test run ADDED to the working tree since the
# snapshot, ignored paths included -- `.objectstack/` is gitignored, so
# `git status` cannot see that class -- grouped by package directory: a
# table in the job summary and one `::warning::` annotation per package.
# Placed directly after the test step so no later step's writes are
# charged to the tests, and `if: always()` so a red shard still reports.
#
# ⛔ REPORT ONLY by ruling, never a gate: the script exits 0 on findings,
# on a missing snapshot and on a crash, so the step carries no
# `continue-on-error` and cannot fail the shard. Making it block is the
# maintainer's word, not an edit here. It stays ABOVE the attestation
# pair at the bottom of the job (#6082), like every step after the tests.
- name: Report what this shard's tests left in the working tree
if: always()
run: |
node scripts/ci/report-test-leftovers.mjs report \
--before "$RUNNER_TEMP/test-leftovers/before.json" \
--label "Test Core (${{ matrix.shard }}/6)"

# --summarize above costs nothing at runtime and writes
# `.turbo/runs/<id>.json`: one per-task record with the execution window
# turbo actually observed. That file IS the balancing input for the next
Expand Down Expand Up @@ -2106,6 +2145,13 @@ jobs:
--report-dir "$RUNNER_TEMP/stall-reports" -- \
pnpm turbo run build --filter=@objectstack/dogfood --concurrency=4 --log-order=stream

# Test leftovers, step 1 of 2 (#23880, ruling 乙): the snapshot, after the
# closure build and before the tests. Report only; the same pair as Test
# Core's, whose comments carry the rationale. `dogfood#test` depends on
# `^build` alone, so the step above builds everything the tests need.
- name: Snapshot the working tree before the dogfood tests
run: node scripts/ci/report-test-leftovers.mjs snapshot --out "$RUNNER_TEMP/test-leftovers/before.json"

# Boots real example apps in-process (in-memory SQLite) and exercises them
# through the real HTTP + service stack — catches runtime regressions that
# build / unit tests / spec-liveness pass over (e.g. the #2018 tz-bucketing
Expand Down Expand Up @@ -2147,6 +2193,16 @@ jobs:
--report-dir "$RUNNER_TEMP/stall-reports" -- \
pnpm turbo run test --filter=@objectstack/dogfood --log-order=stream

# Test leftovers, step 2 of 2 (#23880, ruling 乙): what the dogfood test
# run added to the working tree. Report only -- exits 0 on every path, no
# `continue-on-error` -- and `if: always()`; see Test Core's pair.
- name: Report what the dogfood tests left in the working tree
if: always()
run: |
node scripts/ci/report-test-leftovers.mjs report \
--before "$RUNNER_TEMP/test-leftovers/before.json" \
--label "Dogfood Regression Gate (${{ matrix.shard }}/3)"

# Dogfood boots real apps in-process, so a native/OOM abort is likelier
# here than in the unit suites — and a shard that dies silently looks like
# a shard that had less work.
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/docs-deploy.yml
Original file line number Diff line number Diff line change
Expand Up @@ -52,8 +52,8 @@ on:
# The HOURS keep out of this repository's crowded scheduled windows, read
# from `grep -rn 'cron:' .github/workflows/` on the day this landed: 01–05
# UTC carry most of the nightlies (stale, CodeQL, validate-deps,
# rerun-safety, coverage, the release-coverage and required-set patrols,
# the smokes and nightly tiers), 07 carries showcase-smoke, and the board
# coverage, the release-coverage and required-set patrols, the smokes and
# nightly tiers), 07 carries showcase-smoke, and the board
# snapshot owns :07 of 02, 08, 14 and 20. Of the six six-hour sets, only
# 0/6/12/18 and 1/7/13/19 have hours with nothing scheduled after :00; the
# first is taken because its :00 neighbours are short (release.yml's
Expand Down
39 changes: 17 additions & 22 deletions .github/workflows/lint.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3728,6 +3728,23 @@ jobs:
continue-on-error: true
run: node scripts/report-test-timings.mjs --self-test

# The test-leftover report's own instrument (#23880, ruling 乙). ci.yml's
# test jobs run `scripts/ci/report-test-leftovers.mjs snapshot` / `report`,
# which exit 0 on every path BY RULING -- report only, never a gate -- so
# nothing there can go red when the report stops seeing what it exists to
# see: an ignored path a test added. This self-test is where that breaks
# loudly: fixture snapshots for the diff, the closed exclusion list and the
# turbo.json own-build derivation, plus a real throwaway git tree that
# proves the listing includes IGNORED paths and that every in-job failure
# is a warning with exit 0. It also loads the script on every pull
# request, the one breakage its in-job modes cannot catch about
# themselves. Invoked as `node` per the GATE INVOCATION IDIOM note at the
# top of this file. Offline; about a second.
- name: Test-leftover report self-test
id: test-leftover-report-self-test
continue-on-error: true
run: node scripts/ci/report-test-leftovers.mjs --self-test

# The per-package suite-duration ratchet's own instrument (#16468). The
# gate runs in ci.yml's `Test Core` aggregator, where a clean tree with
# every suite under its ceiling reads OK whether or not the over-ceiling,
Expand Down Expand Up @@ -5184,28 +5201,6 @@ jobs:
continue-on-error: true
run: pnpm check:stall-guard-budget

# The `Rerun Safety` verdict table (#18590) — self-test half only, and the
# asymmetry is the same one the step below explains: the measurement half
# takes two log paths and two exit codes that exist only inside that
# nightly job, so there is nothing here for a bare invocation to read.
#
# ⭐ It is wired HERE rather than left in the nightly deliberately.
# `rerun-safety-nightly.yml` declares `schedule` and `workflow_dispatch`
# and no PR-time event, so a gate family reachable only from it would be
# this tree's first SCHEDULED-ONLY family — which `check:pm-dispatch-gates`
# refuses by name, on the ground that a board sweep must not be routed into
# a per-PR gate list.
#
# WHAT REDDENS IT: its own script's parsing rules and verdict table. Those
# are matching rules, so their production verdict is identical before and
# after they break (see `check-self-test-wired.mjs`) — this step is the
# only instrument watching them. Reads nothing but its own fixtures; no
# build, no network, no token, sub-second.
- name: Rerun-safety verdict table self-test
id: rerun-safety-verdict-table-self-test
continue-on-error: true
run: pnpm check:rerun-safety-verdict

# Rationale: `scripts/measure-stall-guard-headroom.mjs` header (#13246, #13121).
# ⛔ `--self-test` only: never append a bare run (it needs a token).
- name: Stall-guard headroom self-test (self-test half only, never the measurement)
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/prerelease-pin-watch.yml
Original file line number Diff line number Diff line change
Expand Up @@ -57,8 +57,8 @@ name: Prerelease Pin Watch

on:
schedule:
# 06:00 UTC nightly — after Rerun Safety (04:00) and Spec Coverage (05:00),
# before Showcase Smoke (07:00). Nightly, not weekly: see the note above.
# 06:00 UTC nightly — after Spec Coverage (05:00), before Showcase Smoke
# (07:00). Nightly, not weekly: see the note above.
- cron: '0 6 * * *'
workflow_dispatch:
pull_request:
Expand Down
Loading
Loading