Skip to content

Commit cdd4eea

Browse files
ci: run main's full battery every 4 hours and CodeQL daily (maintainer ruling Q6 = C) (#25969)
<!-- claude-projects-attribution: {"github_login":"os-elon-musk"} --> _Requested by **Elon** · [project thread](https://claude.ai/code/project/chan_01WedDzV26nniwxv7jC88B9D?thread=cmsg_01WedDzV26nniwxv7jC88B9DVbbHyHMZtUJMt5EUYKRYE5)_ Fixes #25771 Maintainer ruling Q6 = C: the scheduled full battery of `CI` and `Lint & Type Check` runs every 4 hours instead of hourly, and CodeQL runs daily instead of on every push to `main`. Job logic is unchanged: the scheduled run is still the full battery. Dropping the push-to-main CI/Lint runs is out of scope, per the card. ## The change - `ci.yml`, `lint.yml`: `on.schedule` `'0 * * * *'` → `'0 */4 * * *'`. `workflow_dispatch` kept. - `codeql.yml`: `push: main` dropped; schedule `'0 2 * * 1'` (Monday deep pass) → `'0 2 * * *'` (daily, same query suite, so the Monday pass folds in); `workflow_dispatch` added so a fix can be re-analyzed on demand. ## The scheduled-full-run card identity (the part that is not S) **Choice: the identity moves to the new cadence, and the hourly spellings stay readable.** `CARD_CADENCES` names `4-hourly` for both workflows, so a newly filed card is titled `4-hourly full run: red on main (CI)` with marker `os-4-hourly-full-run-ci`, and its body says "every 4 hours". A new `CADENCE_PREDECESSORS` map (`'4-hourly': ['hourly']`) gives each identity a `legacy` title and marker that `matchesCard` still reads. So the open card #25438 (`hourly full run: red on main (CI)` / `os-hourly-full-run-ci`) is found by its old title or old marker, refreshed in place, and never duplicated. A refresh rewrites the body with the current marker and leaves the title alone (`updateIssue` writes only the body). A legacy spelling is read, never filed. Pinned in `scheduled-full-run.mjs --self-test` (card identity battery floor 34 → 42): - #25438's real title and real first body line are found by title, and by marker alone after a rename; - a red 4-hourly run refreshes #25438, files no second card, and leaves the current marker in the body (found by that afterwards too); - an empty board files under the new title, not the legacy one; - Lint's identity does not match CI's hourly card; - each watched workflow declares exactly `'0 */4 * * *'`, so the cadence on the card is the cadence the workflow runs. Mutation checks: emptying `CADENCE_PREDECESSORS` reds the self-test ("#25438 would be orphaned"); reverting `lint.yml` to `'0 * * * *'` reds it too. ## Readers of the cadence - **Release gate** (`--release-gate`, `releaseGateVerdict`): no clock anywhere in it. It reads the nearest completed `schedule` or `push` run at or before the version commit, so nothing reads a 4-hour gap as missing. The window constants (400 commits, 3 × 100 runs) cover 50 days of scheduled runs. `docs/releases-maintenance.md` now says that a version commit can wait up to 4 hours for its first scheduled full run, that the gate does not wait for it (the version commit's own push run usually decides), and when a dispatched run helps. - **Shard-timings refresh**: the weekly lane accumulates scheduled runs whose `test-core-run-summary-*` / `test-core-timings-*` artifacts are still downloadable. With 1-day retention, hourly gave 24 of them; at every 4 hours it would give 6. The two uploads now use `retention-days: ${{ github.event_name == 'schedule' && 4 || 1 }}`, which keeps about 24 in the window and leaves every other event at 1 day. This is the one change outside "cron + words"; drop it if the reviewer prefers fewer samples to longer retention. The `PREVIOUS_FILE_SHARDED_PACKAGES` comment in `partition-test-shards.mjs` follows the new window. - Prose and messages that said "hourly" in `ci.yml`, `lint.yml`, `release.yml`, `scheduled-full-run-card.yml` (job display name included), `shard-timings-refresh.yml`, `select-shard-timings-run.mjs`, `select-gate-families.sh`, `select-shard-packages.sh`, their self-test case names, and one `AGENTS.md` sentence. The lint step `Hourly full run self-test and concurrency gate` was renamed `Scheduled full run …` (id too; nothing else reads it). Historical measurements that describe the hourly era are left as written. ## Verification - `node scripts/ci/scheduled-full-run.mjs --self-test` OK; `--check-concurrency` OK for both files. - `select-shard-timings-run.mjs --self-test`, `partition-test-shards.mjs --self-test`, `select-gate-families.selftest.sh` (59 cases), `select-shard-packages.selftest.sh` (32 cases) all pass. - `grep -n cron .github/workflows/ci.yml .github/workflows/lint.yml .github/workflows/codeql.yml` → `'0 */4 * * *'`, `'0 */4 * * *'`, `'0 2 * * *'`. - Derived gate families (`dispatch-gates.mjs --commands`, 82 commands on the pre-merge tree): 77 exit 0. 5 exit 3 (NOT MEASURED, they need every package's `dist/`): `check:doc-formula-expressions`, `check:dts-closure`, `check:dual-build-cjs-loads`, `check:lean-entry-closure`, `check:sourcemap-no-sources-content`. CI's lanes own those. Tier H (`.github/workflows/**`): lands after a GOVERNED_APPROVERS approval. 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_01AjoNWTpihGQZrTamr1vd4W --------- Co-authored-by: Claude <noreply@anthropic.com>
1 parent 963e504 commit cdd4eea

16 files changed

Lines changed: 307 additions & 161 deletions

‎.github/workflows/ci.yml‎

Lines changed: 34 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ on:
3838
# branch-protection-required check MUST carry this trigger, or queue builds
3939
# wait forever on a check that never reports.
4040
merge_group:
41-
# ── THE HOURLY FULL RUN (#16467) ─────────────────────────────────────────
41+
# ── THE SCHEDULED FULL RUN (#16467), every 4 hours since #25771 ──────────
4242
# `push` above now computes the Test Core package set with `--affected`
4343
# against `github.event.before`, so a merge no longer re-tests the whole
4444
# workspace it just tested in the queue. Something still has to run the FULL
@@ -48,16 +48,22 @@ on:
4848
# This is that run. Minute 0 rather than an offset minute ON PURPOSE, and
4949
# against the sibling convention in test-nightly-tiers.yml: the reading this
5050
# feeds — `scripts/ci/select-shard-timings-run.mjs` — wants one complete run
51-
# per hour far more than it wants a short queue wait, and a run that starts
52-
# a few minutes late is still the hour's run. What it must NOT do is collide
53-
# with the next hour's, which the concurrency group below decides.
51+
# per window far more than it wants a short queue wait, and a run that starts
52+
# a few minutes late is still that window's run. What it must NOT do is
53+
# collide with the next one, which the concurrency group below decides.
54+
#
55+
# EVERY 4 HOURS, not hourly (#25771, maintainer ruling Q6 = C): the job logic
56+
# is unchanged — the run is still the full battery and still finds flakes on
57+
# an unchanged SHA — at six runs a day instead of twenty-four, most of which
58+
# re-tested a SHA an earlier run had already tested. Every runner-minute it
59+
# spends competes with PR and merge-queue capacity.
5460
#
5561
# ⛔ This is a NEW TRIGGER KEY, not a widening of `push:`. The ⛔ above still
5662
# binds: `push:` stays filtered to `main`.
5763
schedule:
58-
- cron: '0 * * * *'
64+
- cron: '0 */4 * * *'
5965
# The same full battery, on demand: an operator who has just landed a fix for
60-
# a red hourly run should not have to wait up to an hour to see it answered.
66+
# a red scheduled run should not have to wait up to 4 hours to see it answered.
6167
# Treated as `full` by the selection script for the same reason `schedule` is.
6268
workflow_dispatch:
6369

@@ -68,7 +74,7 @@ on:
6874
# run that tests ITS OWN merge: Test Core computes `--affected` against
6975
# `github.event.before` (see `on.schedule` above), so a push run that does not
7076
# finish leaves that merge's diff with no Test Core verdict on `main` until the
71-
# next hourly run. Main merges land every ~9–16 min and a push run takes ~27,
77+
# next scheduled full run. Main merges land every ~9–16 min and a push run takes ~27,
7278
# so under the old shared key `ci-CI-push-refs/heads/main` the next merge
7379
# cancelled it: 31 of 40 push runs on 2026-10-23 01:03Z–11:03Z, most of them
7480
# inside "Run this shard's tests". (The Turbo seed is NOT what was lost: the
@@ -86,7 +92,7 @@ on:
8692
# ⭐ `github.event_name` IS LOAD-BEARING TOO (#16467). A `schedule` and a
8793
# `workflow_dispatch` run on `main` both fall through to `refs/heads/main`;
8894
# without the event name they share one group and an on-demand run cancels the
89-
# hourly one (and, under any key that drops `github.event.after`, the next
95+
# scheduled one (and, under any key that drops `github.event.after`, the next
9096
# merge cancels both, which is how 36 of 60 hourly-era push runs died).
9197
#
9298
# ⛔ Do not "simplify" either segment away. `scripts/ci/scheduled-full-run.mjs
@@ -98,8 +104,8 @@ on:
98104
# those events too).
99105
#
100106
# `cancel-in-progress` stays `true`: with a per-commit push group it never
101-
# fires on a push, and for everything else it is the policy. Two hourly runs
102-
# overlapping means one of them is over an hour old, and an hour-old
107+
# fires on a push, and for everything else it is the policy. Two scheduled
108+
# runs overlapping means one of them is over 4 hours old, and a 4-hour-old
103109
# measurement of `main` is strictly the worse of the two. Test Core's wall clock
104110
# is well inside the cadence (~39 shard-minutes across the shards), so this is
105111
# the exceptional path, not the normal one.
@@ -109,7 +115,7 @@ concurrency:
109115

110116
# ── THE TWO SPEEDS (#22998) ──────────────────────────────────────────────────
111117
# A `pull_request` or `merge_group` run carries the FAST SET: `Build Core`,
112-
# `Test Core` (affected-only) and `Build Docs`. `main`'s hourly `schedule` run,
118+
# `Test Core` (affected-only) and `Build Docs`. `main`'s 4-hourly `schedule` run,
113119
# its `push` runs and an on-demand `workflow_dispatch` carry the FULL BATTERY:
114120
# the fast set plus the three jobs below that spell
115121
#
@@ -243,7 +249,7 @@ jobs:
243249
# That failure direction is the dangerous one: every filter output would
244250
# come back `false`, `|| 'true'` supplies nothing (the output exists and
245251
# says `false`), and every downstream `!= 'false'` guard SKIPS — so the
246-
# hourly full run would have been an entirely green, entirely empty run
252+
# scheduled full run would have been an entirely green, entirely empty run
247253
# of nothing at all. An allow-list makes each new event fail toward
248254
# THE FILTER CONTRACT's half 1 instead: the step is skipped, its outputs
249255
# are the empty string, `|| 'true'` fills them in, and everything runs.
@@ -628,7 +634,7 @@ jobs:
628634
# (p + s + 10m) and the cap-deferred path (p + s + 20m) -- land before the
629635
# new value on every observation, AND the slowest `Test Core (N/8)` job
630636
# wall is at or under 80% of it. Read the pull_request and merge_group
631-
# runs, not the hourly schedule alone: scheduled runs mostly replay the
637+
# runs, not the 4-hourly schedule alone: scheduled runs mostly replay the
632638
# cache their commit's push run saved. It carries no other expiry — a
633639
# raise with no revert condition beside it becomes permanent by
634640
# forgetting — and the stall guard stays the primary hang detector.
@@ -772,7 +778,7 @@ jobs:
772778
# `main` was on before this merge landed (#16467). A zero
773779
# sha -- a first push, or a force-push that rewrote
774780
# history -- falls back to the FULL list, loudly.
775-
# schedule the FULL list: the hourly run IS the full battery, and
781+
# schedule the FULL list: the 4-hourly run IS the full battery, and
776782
# workflow_ the on-demand rerun of it. Neither carries a diff base,
777783
# dispatch and neither should: they are the run that says whether
778784
# the whole workspace is green on `main`.
@@ -1266,6 +1272,11 @@ jobs:
12661272
# attestation pair below to "match" this step — that pair is the
12671273
# credential, not diagnostics, and check:shard-attestation pins its
12681274
# unguarded shape statically.
1275+
# Retention: 4 days on a `schedule` run, 1 day otherwise (#25771). The
1276+
# weekly shard-timings refresh accumulates the scheduled runs whose
1277+
# summaries are still downloadable; hourly, one day held 24 of them, and
1278+
# at every 4 hours it takes four days to hold the same 24. Every other
1279+
# event's summary is read only inside its own run, so it stays at 1 day.
12691280
- name: Publish this shard's turbo run summary
12701281
if: always()
12711282
continue-on-error: true
@@ -1274,7 +1285,7 @@ jobs:
12741285
name: test-core-run-summary-${{ matrix.shard }}-of-8
12751286
path: .turbo/runs/
12761287
if-no-files-found: ignore
1277-
retention-days: 1
1288+
retention-days: ${{ github.event_name == 'schedule' && 4 || 1 }}
12781289

12791290
# ── Predicted vs measured: this shard's timing drift (#16173, #16465) ──
12801291
#
@@ -1490,10 +1501,11 @@ jobs:
14901501
--shard "${{ matrix.shard }}/8" \
14911502
--out "$RUNNER_TEMP/test-timings/shard-${{ matrix.shard }}.json"
14921503
1493-
# 1 day, matching the run-summary upload above: this is an intermediate
1494-
# the aggregator consumes minutes later in the SAME run. The 14-day
1495-
# retention this card asks for is on the MERGED table, published by
1496-
# `Test Core`.
1504+
# Retention matches the run-summary upload above (4 days on `schedule`,
1505+
# 1 day otherwise, #25771): the aggregator consumes this minutes later in
1506+
# the SAME run, and the shard-timings refresh reads the scheduled runs'
1507+
# captures beside their summaries. The 14-day retention this card asks
1508+
# for is on the MERGED table, published by `Test Core`.
14971509
- name: Publish this shard's test timings
14981510
if: always()
14991511
continue-on-error: true
@@ -1502,7 +1514,7 @@ jobs:
15021514
name: test-core-timings-${{ matrix.shard }}-of-8
15031515
path: ${{ runner.temp }}/test-timings/
15041516
if-no-files-found: ignore
1505-
retention-days: 1
1517+
retention-days: ${{ github.event_name == 'schedule' && 4 || 1 }}
15061518

15071519
# A stall's full diagnostic reports (JS stacks, libuv handles, heap
15081520
# summary per process) outlive the in-log digest — keep them so a #4250
@@ -1836,7 +1848,7 @@ jobs:
18361848
# driver-memory, driver-mongodb, service-analytics) — the other backends the
18371849
# temporal conformance matrix holds to one standard. Its NAME still says
18381850
# "live PG + MySQL" on purpose: it was a required check until #22998 moved
1839-
# the job to the full battery, and its readers (the hourly run's red card,
1851+
# the job to the full battery, and its readers (the scheduled run's red card,
18401852
# merge-queue triage history, every instruction that names it) find it by
18411853
# that literal — renaming it is a contract change, not a tidy-up.
18421854
temporal-conformance:
@@ -2734,7 +2746,7 @@ jobs:
27342746
# too (`no caches are enabled`) and re-executes everything.
27352747
#
27362748
# Credentials go only to runs whose code has landed or is landing:
2737-
# `merge_group`, and any run on refs/heads/main (push, the hourly
2749+
# `merge_group`, and any run on refs/heads/main (push, the 4-hourly
27382750
# schedule, workflow_dispatch on main). A `pull_request` run, and a
27392751
# dispatch on any other branch, receives neither TURBO_TOKEN nor the
27402752
# signing key, so code a PR adds can neither upload to the remote nor

‎.github/workflows/codeql.yml‎

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,24 @@
11
name: CodeQL Security Analysis
22

33
# Deliberately NOT on pull_request: the analysis took ~4½ runner-minutes per
4-
# PR sync, and everything a PR introduces is analyzed on main within minutes
5-
# of the merge anyway (multi-agent merge cadence). Alerts surface on main's
6-
# runs + the weekly deep pass instead of blocking/occupying PR runners.
7-
# If branch protection ever required the "Analyze (javascript)" check, that
8-
# requirement must be dropped along with this trigger.
4+
# PR sync. If branch protection ever required the "Analyze (javascript)" check,
5+
# that requirement must be dropped along with this trigger.
6+
#
7+
# DAILY, not on every push to main (#25771, maintainer ruling Q6 = C). The push
8+
# trigger ran 100 analyses in 25.9 h, 86 of them cancelled by the next merge,
9+
# and each one competed with PR and merge-queue runners. One daily run of
10+
# `main` analyzes everything that landed the day before; the Monday deep pass
11+
# it replaces ran the same query suite, so it folds into the daily one.
12+
# `workflow_dispatch` re-analyzes `main` on demand, e.g. after landing a fix.
913
on:
10-
push:
11-
branches:
12-
- main
1314
schedule:
14-
# Run at 02:00 UTC every Monday
15-
- cron: '0 2 * * 1'
15+
# 02:00 UTC every day
16+
- cron: '0 2 * * *'
17+
workflow_dispatch:
1618

17-
# A superseded analysis of an outdated commit has no value — cancel it. A newer
18-
# main push cancels only an in-flight main analysis (the newer commit still
19-
# gets analyzed).
19+
# A superseded analysis of an outdated commit has no value — cancel it. An
20+
# on-demand run cancels an in-flight analysis of the same ref (the newer
21+
# `main` head still gets analyzed).
2022
concurrency:
2123
group: codeql-${{ github.workflow }}-${{ github.ref }}
2224
cancel-in-progress: true

‎.github/workflows/docs-deploy.yml‎

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,8 +57,10 @@ on:
5757
# snapshot owns :07 of 02, 08, 14 and 20. Of the six six-hour sets, only
5858
# 0/6/12/18 and 1/7/13/19 have hours with nothing scheduled after :00; the
5959
# first is taken because its :00 neighbours are short (release.yml's
60-
# version-pr refresh, the hourly ci/lint runs), while 07:00 starts the
61-
# showcase smoke. The MINUTE is off the top of the hour for the reason every
60+
# version-pr refresh, the ci/lint full runs), while 07:00 starts the
61+
# showcase smoke. Since #25771 those ci/lint runs are 4-hourly
62+
# (00/04/08/12/16/20 :00), so they now meet this set only at 00 and 12 and
63+
# 06/18 lose that neighbour; the choice still holds and nothing moved. The MINUTE is off the top of the hour for the reason every
6264
# patrol here gives: scheduled runs queue behind everyone else's :00 cron.
6365
#
6466
# This job spends almost nothing of the per-repository GITHUB_TOKEN budget

‎.github/workflows/lint.yml‎

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,10 @@ on:
2525
# queue builds or the queue stalls. This workflow has no PR-only steps, so
2626
# the trigger alone is enough.
2727
merge_group:
28-
# ── THE HOURLY FULL RUN (#16467), the half this file owns ────────────────
29-
# The card's ruling is that the hourly run covers BOTH required-context
28+
# ── THE SCHEDULED FULL RUN (#16467), the half this file owns ─────────────
29+
# Every 4 hours since #25771 (maintainer ruling Q6 = C), the same cadence as
30+
# ci.yml's half and for the reason stated there; no step changed.
31+
# The card's ruling is that the scheduled run covers BOTH required-context
3032
# files, not just ci.yml, and the reason is measured rather than symmetric:
3133
# the push-on-`main` run of THIS workflow is the only post-merge full-battery
3234
# run of the families `scripts/ci/select-gate-families.sh` scopes away on
@@ -44,7 +46,7 @@ on:
4446
#
4547
# ⛔ A NEW TRIGGER KEY, not a widening of `push:`; see ci.yml's `on:` block.
4648
schedule:
47-
- cron: '0 * * * *'
49+
- cron: '0 */4 * * *'
4850
workflow_dispatch:
4951

5052
# ── MEASURED 2026-08-25 (#12211) — a NEGATIVE result, recorded so it is not
@@ -95,7 +97,7 @@ on:
9597
#
9698
# ⭐ `github.event_name` is in the key for the reason ci.yml's concurrency block
9799
# states in full (#16467): `schedule` and `workflow_dispatch` both fall through
98-
# to `refs/heads/main`, so without it an on-demand run cancels the hourly one.
100+
# to `refs/heads/main`, so without it an on-demand run cancels the scheduled one.
99101
# `scripts/ci/scheduled-full-run.mjs --check-concurrency` evaluates THIS
100102
# expression too and reds if two pushes, or a push and a schedule run, share a
101103
# group, or if two schedule, dispatch or same-PR runs stop sharing one.
@@ -3514,8 +3516,8 @@ jobs:
35143516
run: pnpm check:select-shard-packages
35153517

35163518
# Rationale: `scripts/ci/scheduled-full-run.mjs` header (#16467).
3517-
- name: Hourly full run self-test and concurrency gate
3518-
id: hourly-full-run-self-test-and-concurrency
3519+
- name: Scheduled full run self-test and concurrency gate
3520+
id: scheduled-full-run-self-test-and-concurrency
35193521
continue-on-error: true
35203522
run: |
35213523
node scripts/ci/scheduled-full-run.mjs --self-test
@@ -4426,7 +4428,7 @@ jobs:
44264428
# only a name that DISAPPEARS can turn a live declaration dead, which is
44274429
# a structural change the selector already runs everything for. A group
44284430
# confined to product source, tests, docs or changesets skips it here and
4429-
# pays for it on `push` to main and on the hourly run.
4431+
# pays for it on `push` to main and on the 4-hourly run.
44304432
- name: A declared gate population reaches the tree
44314433
id: a-declared-gate-population-reaches-the-tree
44324434
continue-on-error: true
@@ -4542,7 +4544,7 @@ jobs:
45424544
# ROOT_DIR_WATCH_HINTS declaration, held against the root it really walks
45434545
# by its own self-test — so a group that changes no file under scripts/
45444546
# (and no root configuration) skips it. The selection step at the top of
4545-
# this job decides that, `push` on main and the hourly run keep it
4547+
# this job decides that, `push` on main and the 4-hourly run keep it
45464548
# unconditional, and the ruling that authorizes moving a tooling
45474549
# self-test off the PR path is quoted in the selector's header.
45484550
- name: scripts/ entry guards go through one predicate
@@ -4693,7 +4695,7 @@ jobs:
46934695
# anyway, and the trade is explicit rather than reasoned away: it imports
46944696
# the same derivation as the dispatch-gates and watch-hint literal steps, so its inputs are the
46954697
# workflow tree and the gate sources, and on a group touching neither the
4696-
# gap does move — to `push` on main and the hourly full run, which keep
4698+
# gap does move — to `push` on main and the 4-hourly full run, which keep
46974699
# the whole battery. Gate weakening is a maintainer floor; the sentence
46984700
# that authorizes this one is quoted in the selector's header.
46994701
- name: PM bare-root worklist self-test
@@ -4747,7 +4749,7 @@ jobs:
47474749
# `scripts/**/*.mjs`, `scripts/**/*.mts` and `scripts/**/*.sh`, and the
47484750
# rest of its read-set is the workflow tree and `.github/actions` it
47494751
# discovers the runnable self-tests from — so a group touching none of
4750-
# those skips it here and runs it on `push` to main and on the hourly
4752+
# those skips it here and runs it on `push` to main and on the 4-hourly
47514753
# full run.
47524754
- name: Self-test workflow-command gate
47534755
id: self-test-workflow-command-gate
@@ -4913,13 +4915,13 @@ jobs:
49134915
# three-file `packages/spec` diff, and ruling #208 on #19491 (R4) took
49144916
# those whole-tree reads off the PR path on the maintainer's sentence,
49154917
# quoted in the selector's header. ⛔ A defect in that wider set can now
4916-
# first appear on `main`; the push-on-main and hourly full runs are what
4918+
# first appear on `main`; the push-on-main and 4-hourly full runs are what
49174919
# bound it, and widening the skip further is again a maintainer call.
49184920
#
49194921
# ⚠️ Since #22991 the battery is TIERED by event, inside the gate rather
49204922
# than here: on `pull_request` and `merge_group` `pnpm check:pm-dispatch-gates`
49214923
# runs the fast tier; on `schedule`, `push` and any other event it runs
4922-
# both. Every case still runs at least hourly on the full run, and a
4924+
# both. Every case still runs at least every 4 hours on the full run, and a
49234925
# slow-tier red is a red on `main`. The step below is unchanged; the
49244926
# decision and its argument live in `scripts/pm/check-dispatch-gates.mjs`.
49254927
#

‎.github/workflows/release.yml‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1507,7 +1507,7 @@ jobs:
15071507
full-battery:
15081508
name: Full battery green at the version commit
15091509
# A PR or queue build carries ci.yml's FAST SET since #22998; the dogfood
1510-
# and temporal legs run only on main's push, hourly and
1510+
# and temporal legs run only on main's push, 4-hourly schedule and
15111511
# dispatch runs. So "tested before a release" is read HERE, as a gate: the
15121512
# newest completed `schedule` or `push` runs of `CI` and `Lint & Type
15131513
# Check` whose head is the version commit or a first-parent ancestor of it

0 commit comments

Comments
 (0)