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
4 changes: 2 additions & 2 deletions .github/workflows/fleet-patrols.yml
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +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 anywhere.
# 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
Expand Down Expand Up @@ -757,7 +757,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.
Expand Down
16 changes: 8 additions & 8 deletions .github/workflows/lint.yml
Original file line number Diff line number Diff line change
Expand Up @@ -147,7 +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 board-snapshot.yml, 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
Expand Down Expand Up @@ -2539,21 +2539,21 @@ 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 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.
#
# 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
# 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.
#
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/merged-branch-reaper.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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 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:
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/shard-timings-refresh.yml
Original file line number Diff line number Diff line change
Expand Up @@ -214,7 +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 required-set-patrol.yml 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
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/test-nightly-tiers.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
8 changes: 4 additions & 4 deletions scripts/check-platform-checklist.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down Expand Up @@ -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;
Expand Down
6 changes: 3 additions & 3 deletions scripts/check-stall-guard-budget.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -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.
*
Expand Down
4 changes: 2 additions & 2 deletions scripts/ci/board-snapshot-r2-upload.sh
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
#!/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 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
Expand Down
4 changes: 2 additions & 2 deletions scripts/import-prerequisite.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -232,8 +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
* 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
Expand Down
10 changes: 5 additions & 5 deletions scripts/pm/dispatch-gates.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -326,8 +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
* `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`'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
Expand Down Expand Up @@ -1837,9 +1837,9 @@ 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.
* `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
Expand Down
8 changes: 4 additions & 4 deletions scripts/pm/dispatch-gates.self-test.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down Expand Up @@ -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(
Expand Down
4 changes: 2 additions & 2 deletions scripts/sync-release-index-currency.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -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),
Expand Down
Loading