From c18f1a2857c479f0ddeea4f3a6c26d7b7add453e Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 28 Oct 2026 06:00:13 +0000 Subject: [PATCH 1/3] ci(fleet-patrols): prose and comments stop naming the four retired patrol workflow files The four daily patrols live as jobs of .github/workflows/fleet-patrols.yml; every comment that still pointed a reader at required-set-patrol.yml, platform-checklist-watchdog.yml, release-coverage-patrol.yml or board-snapshot.yml now names fleet-patrols.yml and the job. lint.yml's watchdog-pin note no longer claims the pull_request filter names the watchdog file alone (the pin freezes a set: the workflow plus the sibling patrols' inputs), fleet-patrols.yml's header no longer says a one-sided cron edit reds nowhere (the watchdog pin's clause 7 refuses it), and check-stall-guard-budget's reused-job-id examples are re-measured. Comments only; no gate behaviour changes. Claude-Session: https://claude.ai/code/session_01QSeKYmhU5KEj1nukYhp1Tg Co-authored-by: Claude --- .github/workflows/fleet-patrols.yml | 6 ++++-- .github/workflows/lint.yml | 17 ++++++++++------- .github/workflows/merged-branch-reaper.yml | 4 ++-- .github/workflows/shard-timings-refresh.yml | 3 ++- .github/workflows/test-nightly-tiers.yml | 2 +- scripts/check-platform-checklist.mjs | 8 ++++---- scripts/check-stall-guard-budget.mjs | 6 +++--- scripts/ci/board-snapshot-r2-upload.sh | 5 +++-- scripts/import-prerequisite.mjs | 3 ++- scripts/pm/dispatch-gates.mjs | 12 +++++++----- scripts/pm/dispatch-gates.self-test.mjs | 8 ++++---- scripts/sync-release-index-currency.mjs | 4 ++-- 12 files changed, 44 insertions(+), 34 deletions(-) diff --git a/.github/workflows/fleet-patrols.yml b/.github/workflows/fleet-patrols.yml index 3b142e9d026..9343d6c21ad 100644 --- a/.github/workflows/fleet-patrols.yml +++ b/.github/workflows/fleet-patrols.yml @@ -22,7 +22,9 @@ name: Fleet Patrols # ⛔ A cron string under `schedule:` and the same string in its job's `if:` are # ONE fact spelled twice: change both in the same edit. A cron no `if:` names # fires a run that does nothing, and a job whose `if:` names a cron the -# schedule does not declare never runs — neither shape is red anywhere. +# schedule does not declare never runs — neither shape is red at run time; +# `scripts/check-platform-checklist-watchdog.mjs` (clause 7) refuses both +# before the edit merges. # # `workflow_dispatch` takes one input, `patrol`: `all` (the default) runs every # job, a job id runs that one alone — the manual fire and the smoke test each @@ -757,7 +759,7 @@ jobs: # # ## Why a workflow, when the gate ALREADY runs on every PR # - # Unlike `half-state-patrol.yml` and `required-set-patrol.yml`, this check does + # Unlike `half-state-patrol.yml` and the `required-set-patrol` job, this check does # not need a runner for TRANSPORT reasons. It is fully offline — it reads # `packages/spec/CHANGELOG.md` and `content/docs/releases/**` straight out of the # tree, opens no socket, and runs inside `lint.yml` on every pull request today. diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 73b29ceea96..8c87dffaa13 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -147,7 +147,8 @@ concurrency: # self-test half of a gate whose scan runs elsewhere). An alias is a copy # only when it is the same command, and a copy is what this rule removes; # * its job sets up no pnpm (an install-free job elsewhere, such as -# check-links.yml or board-snapshot.yml, keeps the direct form); +# check-links.yml or fleet-patrols.yml's `board-snapshot` job, keeps the +# direct form); # * it predates this rule and its script has no alias yet. Those steps are # not swept (#25919 「存量不横扫」); each gains an alias when its step is # next rewired. Their comments say "invoked as `node` rather than through a @@ -2539,20 +2540,22 @@ jobs: # per-PR path means an unrelated PR is never blocked by checklist drift. # Run it by hand: `pnpm check:platform-checklist`. See that dir's README. # Its red does have a reporting channel now, and it is NOT this file: - # `.github/workflows/platform-checklist-watchdog.yml` runs the gate on `main` - # daily and files or refreshes one issue when it is red. + # the `platform-checklist-watchdog` job of `.github/workflows/fleet-patrols.yml` + # runs the gate on `main` daily and files or refreshes one issue when it is red. # ⛔ …and the step below is NOT that wiring. What runs here is the STATIC PIN # over the watchdog workflow: it asserts the file exists, fires on # `schedule:` + `workflow_dispatch:`, carries NO `merge_group:` / # `pull_request_target:` trigger, that any `pull_request:` trigger is - # `paths`-filtered to the watchdog file ALONE, that no board write is + # `paths`-filtered to a frozen SET — the workflow file plus the sibling + # patrol jobs' own inputs, and nothing else — that no board write is # reachable from a pull_request run, and that the gate is invoked through its # package script rather than an inlined copy. Two file reads, no socket. # - # The watchdog's own `pull_request:` trigger names only itself, so it fires on - # no unrelated PR — that filter is what keeps the decision above intact, and - # pinning it is most of this step's job. It has to live HERE rather than + # That workflow's `pull_request:` trigger names only the four patrols' own + # inputs, so it fires on no unrelated PR, and no job in it publishes a + # required context or reds on checklist drift — that filter is what keeps + # the decision above intact, and pinning it is most of this step's job. It has to live HERE rather than # inside the watchdog for the other half: a PR DELETING the watchdog would # silence any check that lived inside it, and this job is the only place where # the absence of that file is observable before it merges. diff --git a/.github/workflows/merged-branch-reaper.yml b/.github/workflows/merged-branch-reaper.yml index 743a6955352..8ba426b2acc 100644 --- a/.github/workflows/merged-branch-reaper.yml +++ b/.github/workflows/merged-branch-reaper.yml @@ -234,8 +234,8 @@ on: type: boolean required: false default: true - # Exercise the sweep on changes to itself, the same posture as - # required-set-patrol.yml. This is what makes the FIRST delivery of this PR a + # Exercise the sweep on changes to itself, the same posture as the + # `required-set-patrol` job of fleet-patrols.yml. This is what makes the FIRST delivery of this PR a # real would-delete list produced by a real runner rather than a claim about # one. Publishes no required context, so a red here blocks nothing. pull_request: diff --git a/.github/workflows/shard-timings-refresh.yml b/.github/workflows/shard-timings-refresh.yml index b7a04463f0c..b577095744d 100644 --- a/.github/workflows/shard-timings-refresh.yml +++ b/.github/workflows/shard-timings-refresh.yml @@ -214,7 +214,8 @@ on: - cron: '30 5 * * 1' workflow_dispatch: # Changes to this lane get exercised before they merge — the same posture - # half-state-patrol.yml and required-set-patrol.yml keep, and the reason a + # half-state-patrol.yml and fleet-patrols.yml's `required-set-patrol` job + # keep, and the reason a # scheduled-only lane is not an option: `dispatch-gates.mjs` reds when a gate # family is reachable ONLY on a schedule, because a family no PR-time event # reaches appears on no card's gate list and is therefore graded by nobody diff --git a/.github/workflows/test-nightly-tiers.yml b/.github/workflows/test-nightly-tiers.yml index d8571d69f8a..968bc83c61f 100644 --- a/.github/workflows/test-nightly-tiers.yml +++ b/.github/workflows/test-nightly-tiers.yml @@ -49,7 +49,7 @@ name: Nightly Tiers # and installs Chromium for it (≈ 5 min, the "Prepare the showcase browser # smoke" step), which no other shard pays. # -# ## What lands where — the house idiom of `platform-checklist-watchdog.yml` +# ## What lands where — the house idiom of `fleet-patrols.yml`'s `platform-checklist-watchdog` job # # On green this workflow files nothing, edits nothing and closes nothing. On # red the `report` job — ONE writer, after both shards, never the shards diff --git a/scripts/check-platform-checklist.mjs b/scripts/check-platform-checklist.mjs index 291bf9eab41..6b8c22b777b 100644 --- a/scripts/check-platform-checklist.mjs +++ b/scripts/check-platform-checklist.mjs @@ -85,8 +85,8 @@ // NOT wired into per-PR CI (the maintainer decision recorded in // `.github/workflows/lint.yml` — it runs by hand before a release or after // a large platform surface lands, with -// `.github/workflows/platform-checklist-watchdog.yml` sweeping `main` -// daily as its only standing caller), so a future out-of-vocabulary anchor +// the `platform-checklist-watchdog` job of `.github/workflows/fleet-patrols.yml` +// sweeping `main` daily as its only standing caller), so a future out-of-vocabulary anchor // sits unreported until somebody runs this gate. The exit is the ruling's // own: widen the shared vocabulary in `scripts/symbol-anchors.mjs`, and // ⛔ never re-fork a private extension set here. @@ -485,8 +485,8 @@ const err = (file, id, msg) => errors.push(`${file}${id ? ` · ${id}` : ''}: ${m // on a PR would ever reach a `--self-test` leg. // // ⚠️ CORRECTED (#11730): the second half of that sentence no longer holds, and -// the first half is unaffected. `.github/workflows/platform-checklist-watchdog.yml` -// now runs this gate on `main` daily through its package script, so a +// the first half is unaffected. The `platform-checklist-watchdog` job of +// `.github/workflows/fleet-patrols.yml` now runs this gate on `main` daily through its package script, so a // `--self-test` leg DOES execute somewhere — and the root alias // `check:platform-checklist` carries one, which is what `check:self-test-wired` // requires of every script CI runs. The gate is still NOT wired into per-PR CI; diff --git a/scripts/check-stall-guard-budget.mjs b/scripts/check-stall-guard-budget.mjs index 043695ab8fc..6b2855c2116 100644 --- a/scripts/check-stall-guard-budget.mjs +++ b/scripts/check-stall-guard-budget.mjs @@ -456,9 +456,9 @@ export function scan(root, defaults, parseYaml) { * * NOT the job id alone. A job id is unique only within its own workflow file, * and this tree really does reuse three of them across files (`publish` in - * docker-publish.yml and release.yml, `patrol` in half-state-patrol.yml and - * release-coverage-patrol.yml, `registry-canary` in publish-smoke.yml and - * scaffold-e2e.yml). Keyed on the id alone, two single-guard jobs in different + * checklist-status.yml, docker-publish.yml and release.yml, `pack-smoke` in + * pack-smoke-optin.yml and publish-smoke.yml, `registry-canary` in + * publish-smoke.yml and scaffold-e2e.yml). Keyed on the id alone, two single-guard jobs in different * files would be printed as siblings -- inventing a shared clock that does not * exist, which is the more dangerous direction to be wrong in. * diff --git a/scripts/ci/board-snapshot-r2-upload.sh b/scripts/ci/board-snapshot-r2-upload.sh index 126d20c436c..d611a965112 100755 --- a/scripts/ci/board-snapshot-r2-upload.sh +++ b/scripts/ci/board-snapshot-r2-upload.sh @@ -1,8 +1,9 @@ #!/usr/bin/env bash # Copyright (c) 2026 ObjectStack. Licensed under the Apache-2.0 license. # -# board-snapshot-r2-upload -- the body of board-snapshot.yml's "Upload the -# archive to R2" step (#26086), moved out of an inline `run:` block. +# board-snapshot-r2-upload -- the body of the "Upload the archive to R2" step +# of fleet-patrols.yml's `board-snapshot` job (#26086), moved out of an inline +# `run:` block. # # bash scripts/ci/board-snapshot-r2-upload.sh # in the step, env from its `env:` # bash scripts/ci/board-snapshot-r2-upload.selftest.sh # offline: stub aws, throwaway archive diff --git a/scripts/import-prerequisite.mjs b/scripts/import-prerequisite.mjs index ef5f4df3602..6c32c07ee97 100644 --- a/scripts/import-prerequisite.mjs +++ b/scripts/import-prerequisite.mjs @@ -232,7 +232,8 @@ export const INSTALL_FIX = 'pnpm install'; * • The half that HOLDS: nothing mechanical changes. Every consumer of the * gates that import this frame treats any non-zero as failure — measured, * not assumed: the `&&` chains in the root `package.json`, the bare `run:` - * steps in `lint.yml`/`ci.yml`, and `required-set-patrol.yml`, which + * steps in `lint.yml`/`ci.yml`, and `fleet-patrols.yml`'s + * `required-set-patrol` job, which * branches on `== '0'` / `!= '0'` and nothing finer. ⛔ This change buys * zero CI benefit today and must not be sold as if it did. * • The half that does NOT: it is not a new contract. The contract was diff --git a/scripts/pm/dispatch-gates.mjs b/scripts/pm/dispatch-gates.mjs index 74e9f5bca31..510b60cb778 100644 --- a/scripts/pm/dispatch-gates.mjs +++ b/scripts/pm/dispatch-gates.mjs @@ -326,8 +326,9 @@ * `pull_request:` trigger with a `paths:` filter naming its own script, so * "changes to the patrol itself get exercised before they merge" * (`half-state-patrol.yml`'s own comment, and the same words in - * `required-set-patrol.yml`, `release-coverage-patrol.yml` and - * `merged-branch-reaper.yml`). The card's own specimen is one of those ten: + * `fleet-patrols.yml` — whose `required-set-patrol` and + * `release-coverage-patrol` jobs carried them in their own files before the + * fold — and `merged-branch-reaper.yml`). The card's own specimen is one of those ten: * `half-state-patrol.yml` already carried that trigger on the day the card was * filed. Three of the ten are `validate-deps.yml`'s, including * `check:override-consistency` — a gate every dependency card must run. So @@ -1837,9 +1838,10 @@ const WORKFLOW_VALUE_SOURCE = /\$\{\{[\s\S]*?\}\}|\$\{[A-Za-z_]\w*\}|\$[A-Za-z_] * MET — this gate grades a saved `turbo run test` log, and no log was * named.` A dev following the list runs it and gets a non-verdict. * `node scripts/check-required-contexts.mjs` → exit 0 — but it runs the - * STATIC pin check, while `required-set-patrol.yml` runs - * `--verify-required-set`, a live sweep of the repo's required set. Same - * script, different question, and the row said `[required-set-patrol.yml]`. + * STATIC pin check, while fleet-patrols.yml's `required-set-patrol` job + * runs `--verify-required-set`, a live sweep of the repo's required set. + * Same script, different question, and the row named that patrol's + * workflow. * `node scripts/check-shard-attestation.mjs` and * `node scripts/check-cross-package-test-inputs.mjs` → exit 0, and both * duplicate what `lint.yml` already runs under a `pnpm check:` alias diff --git a/scripts/pm/dispatch-gates.self-test.mjs b/scripts/pm/dispatch-gates.self-test.mjs index 34f62dec03d..52a35e1eadd 100644 --- a/scripts/pm/dispatch-gates.self-test.mjs +++ b/scripts/pm/dispatch-gates.self-test.mjs @@ -672,8 +672,8 @@ export function selfTest({ tier = 'full' } = {}) { // invocation, so no case can pin a shape the tree does not have. Their // sources: `pr-automation.yml` (the `--base` gates), `ci.yml` (the shard // attestation), `engine-split-metric.yml` (`--days 90`), - // `required-set-patrol.yml` (a complete argv behind a continuation and a - // redirection), `prerelease-pin-watch.yml` (`--verbose 2>&1`; that workflow + // `fleet-patrols.yml`'s `required-set-patrol` job (a complete argv behind a + // continuation and a redirection), `prerelease-pin-watch.yml` (`--verbose 2>&1`; that workflow // left with the objectui pin, objectstack#25711, and its row stays as a // fixture of the shape). The live half at the end of the block re-reads the // others from the workflows themselves. @@ -1046,8 +1046,8 @@ export function selfTest({ tier = 'full' } = {}) { ); // A script invoked BOTH ways gets BOTH entries — the card's third clause, // read off the live tree. `check-release-section-coverage.mjs` is the - // specimen: `lint.yml` runs it bare, `release-coverage-patrol.yml` runs it - // bare AND `--strict`, and before the continuation join the `--strict` run + // specimen: `lint.yml` runs it bare, fleet-patrols.yml's + // `release-coverage-patrol` job runs it bare AND `--strict`, and before the continuation join the `--strict` run // had no entry of its own at all. const coverageKeys = new Set(direct.filter((i) => i.script === 'scripts/check-release-section-coverage.mjs').map((i) => i.check)); t( diff --git a/scripts/sync-release-index-currency.mjs b/scripts/sync-release-index-currency.mjs index c36bd2f29bd..7def26f7611 100644 --- a/scripts/sync-release-index-currency.mjs +++ b/scripts/sync-release-index-currency.mjs @@ -47,8 +47,8 @@ // stays on 17.2.0 until someone notices. Worse here than for the sibling surfaces: // `.github/workflows/lint.yml` runs check-release-section-coverage WITHOUT `--strict`, // where a finding is advisory and the job is GREEN by design, so the staleness reaches -// `main` green on every ordinary PR as well. Only `release-coverage-patrol.yml` passes -// `--strict`, and a standing patrol is by construction an AFTER-THE-FACT reader. +// `main` green on every ordinary PR as well. Only fleet-patrols.yml's `release-coverage-patrol` +// job passes `--strict`, and a standing patrol is by construction an AFTER-THE-FACT reader. // // This repo has already chosen this exact shape for this exact drift class, three // times: sync-protocol-version.mjs (#2769), sync-template-versions.mjs (#2907), From 1de490456a408cdad297eba459c2e476bbd0c42f Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 28 Oct 2026 06:12:01 +0000 Subject: [PATCH 2/3] ci(fleet-patrols): keep dispatch-gates.mjs's census-pinned declaration on line 738 The prose swap at the patrol-posture paragraph added a line above the inherited-population marker, which the dispatch-gates self-test pins by line. Claude-Session: https://claude.ai/code/session_01QSeKYmhU5KEj1nukYhp1Tg Co-authored-by: Claude --- scripts/pm/dispatch-gates.mjs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/scripts/pm/dispatch-gates.mjs b/scripts/pm/dispatch-gates.mjs index 510b60cb778..72fcc9192ff 100644 --- a/scripts/pm/dispatch-gates.mjs +++ b/scripts/pm/dispatch-gates.mjs @@ -326,9 +326,8 @@ * `pull_request:` trigger with a `paths:` filter naming its own script, so * "changes to the patrol itself get exercised before they merge" * (`half-state-patrol.yml`'s own comment, and the same words in - * `fleet-patrols.yml` — whose `required-set-patrol` and - * `release-coverage-patrol` jobs carried them in their own files before the - * fold — and `merged-branch-reaper.yml`). The card's own specimen is one of those ten: + * `fleet-patrols.yml`'s `required-set-patrol` and `release-coverage-patrol` + * jobs, and `merged-branch-reaper.yml`). The card's own specimen is one of those ten: * `half-state-patrol.yml` already carried that trigger on the day the card was * filed. Three of the ten are `validate-deps.yml`'s, including * `check:override-consistency` — a gate every dependency card must run. So From 95ed5eb24889ebd622f9a5c5ec721699833b7f0c Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 28 Oct 2026 06:13:51 +0000 Subject: [PATCH 3/3] ci(fleet-patrols): keep every re-pointed comment line-neutral Line numbers in these files are cited elsewhere (the dispatch-gates census, a dist-freshness note), so the swaps re-wrap inside the lines they replace. Claude-Session: https://claude.ai/code/session_01QSeKYmhU5KEj1nukYhp1Tg Co-authored-by: Claude --- .github/workflows/fleet-patrols.yml | 4 +--- .github/workflows/lint.yml | 15 ++++++--------- .github/workflows/merged-branch-reaper.yml | 4 ++-- .github/workflows/shard-timings-refresh.yml | 3 +-- scripts/ci/board-snapshot-r2-upload.sh | 5 ++--- scripts/import-prerequisite.mjs | 5 ++--- scripts/pm/dispatch-gates.mjs | 3 +-- 7 files changed, 15 insertions(+), 24 deletions(-) diff --git a/.github/workflows/fleet-patrols.yml b/.github/workflows/fleet-patrols.yml index 9343d6c21ad..173a77a4156 100644 --- a/.github/workflows/fleet-patrols.yml +++ b/.github/workflows/fleet-patrols.yml @@ -22,9 +22,7 @@ name: Fleet Patrols # ⛔ A cron string under `schedule:` and the same string in its job's `if:` are # ONE fact spelled twice: change both in the same edit. A cron no `if:` names # fires a run that does nothing, and a job whose `if:` names a cron the -# schedule does not declare never runs — neither shape is red at run time; -# `scripts/check-platform-checklist-watchdog.mjs` (clause 7) refuses both -# before the edit merges. +# schedule does not declare never runs — clause 7 of the watchdog pin refuses both. # # `workflow_dispatch` takes one input, `patrol`: `all` (the default) runs every # job, a job id runs that one alone — the manual fire and the smoke test each diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 8c87dffaa13..a75b43d67a1 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -147,8 +147,7 @@ concurrency: # self-test half of a gate whose scan runs elsewhere). An alias is a copy # only when it is the same command, and a copy is what this rule removes; # * its job sets up no pnpm (an install-free job elsewhere, such as -# check-links.yml or fleet-patrols.yml's `board-snapshot` job, keeps the -# direct form); +# check-links.yml or fleet-patrols.yml's board-snapshot job, keeps it); # * it predates this rule and its script has no alias yet. Those steps are # not swept (#25919 「存量不横扫」); each gains an alias when its step is # next rewired. Their comments say "invoked as `node` rather than through a @@ -2547,16 +2546,14 @@ jobs: # over the watchdog workflow: it asserts the file exists, fires on # `schedule:` + `workflow_dispatch:`, carries NO `merge_group:` / # `pull_request_target:` trigger, that any `pull_request:` trigger is - # `paths`-filtered to a frozen SET — the workflow file plus the sibling - # patrol jobs' own inputs, and nothing else — that no board write is + # `paths`-filtered to a frozen set of the four patrols' inputs, that no board write is # reachable from a pull_request run, and that the gate is invoked through its # package script rather than an inlined copy. Two file reads, no socket. # - # That workflow's `pull_request:` trigger names only the four patrols' own - # inputs, so it fires on no unrelated PR, and no job in it publishes a - # required context or reds on checklist drift — that filter is what keeps - # the decision above intact, and pinning it is most of this step's job. It has to live HERE rather than - # inside the watchdog for the other half: a PR DELETING the watchdog would + # That trigger names only the patrols' inputs and no job there is required or + # reds on drift, so no unrelated PR is blocked — that filter keeps the decision + # above intact, and pinning it is most of this step's job. It has to live HERE + # rather than inside the watchdog for the other half: a PR DELETING it would # silence any check that lived inside it, and this job is the only place where # the absence of that file is observable before it merges. # diff --git a/.github/workflows/merged-branch-reaper.yml b/.github/workflows/merged-branch-reaper.yml index 8ba426b2acc..b3f5d72488f 100644 --- a/.github/workflows/merged-branch-reaper.yml +++ b/.github/workflows/merged-branch-reaper.yml @@ -234,8 +234,8 @@ on: type: boolean required: false default: true - # Exercise the sweep on changes to itself, the same posture as the - # `required-set-patrol` job of fleet-patrols.yml. This is what makes the FIRST delivery of this PR a + # Exercise the sweep on changes to itself, the same posture as fleet-patrols.yml's + # `required-set-patrol` job. This is what makes the FIRST delivery of this PR a # real would-delete list produced by a real runner rather than a claim about # one. Publishes no required context, so a red here blocks nothing. pull_request: diff --git a/.github/workflows/shard-timings-refresh.yml b/.github/workflows/shard-timings-refresh.yml index b577095744d..d6d07f53bd8 100644 --- a/.github/workflows/shard-timings-refresh.yml +++ b/.github/workflows/shard-timings-refresh.yml @@ -214,8 +214,7 @@ on: - cron: '30 5 * * 1' workflow_dispatch: # Changes to this lane get exercised before they merge — the same posture - # half-state-patrol.yml and fleet-patrols.yml's `required-set-patrol` job - # keep, and the reason a + # half-state-patrol.yml and fleet-patrols.yml's required-set-patrol keep, and the reason a # scheduled-only lane is not an option: `dispatch-gates.mjs` reds when a gate # family is reachable ONLY on a schedule, because a family no PR-time event # reaches appears on no card's gate list and is therefore graded by nobody diff --git a/scripts/ci/board-snapshot-r2-upload.sh b/scripts/ci/board-snapshot-r2-upload.sh index d611a965112..4d952199dff 100755 --- a/scripts/ci/board-snapshot-r2-upload.sh +++ b/scripts/ci/board-snapshot-r2-upload.sh @@ -1,9 +1,8 @@ #!/usr/bin/env bash # Copyright (c) 2026 ObjectStack. Licensed under the Apache-2.0 license. # -# board-snapshot-r2-upload -- the body of the "Upload the archive to R2" step -# of fleet-patrols.yml's `board-snapshot` job (#26086), moved out of an inline -# `run:` block. +# board-snapshot-r2-upload -- the body of fleet-patrols.yml's `board-snapshot` job's +# "Upload the archive to R2" step (#26086), moved out of an inline `run:` block. # # bash scripts/ci/board-snapshot-r2-upload.sh # in the step, env from its `env:` # bash scripts/ci/board-snapshot-r2-upload.selftest.sh # offline: stub aws, throwaway archive diff --git a/scripts/import-prerequisite.mjs b/scripts/import-prerequisite.mjs index 6c32c07ee97..0c254c2a509 100644 --- a/scripts/import-prerequisite.mjs +++ b/scripts/import-prerequisite.mjs @@ -232,9 +232,8 @@ export const INSTALL_FIX = 'pnpm install'; * • The half that HOLDS: nothing mechanical changes. Every consumer of the * gates that import this frame treats any non-zero as failure — measured, * not assumed: the `&&` chains in the root `package.json`, the bare `run:` - * steps in `lint.yml`/`ci.yml`, and `fleet-patrols.yml`'s - * `required-set-patrol` job, which - * branches on `== '0'` / `!= '0'` and nothing finer. ⛔ This change buys + * steps in `lint.yml`/`ci.yml`, and fleet-patrols.yml's `required-set-patrol` + * job, which branches on `== '0'` / `!= '0'` and nothing finer. ⛔ This change buys * zero CI benefit today and must not be sold as if it did. * • The half that does NOT: it is not a new contract. The contract was * already written, by the five sites above. What this frame was doing was diff --git a/scripts/pm/dispatch-gates.mjs b/scripts/pm/dispatch-gates.mjs index 72fcc9192ff..9c2f6353c81 100644 --- a/scripts/pm/dispatch-gates.mjs +++ b/scripts/pm/dispatch-gates.mjs @@ -1839,8 +1839,7 @@ const WORKFLOW_VALUE_SOURCE = /\$\{\{[\s\S]*?\}\}|\$\{[A-Za-z_]\w*\}|\$[A-Za-z_] * `node scripts/check-required-contexts.mjs` → exit 0 — but it runs the * STATIC pin check, while fleet-patrols.yml's `required-set-patrol` job * runs `--verify-required-set`, a live sweep of the repo's required set. - * Same script, different question, and the row named that patrol's - * workflow. + * Same script, different question, and the row named that patrol. * `node scripts/check-shard-attestation.mjs` and * `node scripts/check-cross-package-test-inputs.mjs` → exit 0, and both * duplicate what `lint.yml` already runs under a `pnpm check:` alias