Skip to content

ci: run main's full battery every 4 hours and CodeQL daily (maintainer ruling Q6 = C) - #25969

Merged
os-zhuang merged 3 commits into
mainfrom
claude/project-thread-18emds
Oct 26, 2026
Merged

os-zhuang merged 3 commits into
mainfrom
claude/project-thread-18emds

Conversation

@objectstack-fleet

Copy link
Copy Markdown
Contributor

Requested by Elon · project thread

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):

  • hourly full run: red on main (CI) #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 hourly full run: red on main (CI) #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.ai/code/session_01AjoNWTpihGQZrTamr1vd4W

…r ruling Q6 = C)

ci.yml and lint.yml schedule '0 * * * *' -> '0 */4 * * *', job logic
unchanged. codeql.yml drops push: main and runs daily at 02:00 UTC
(the Monday pass folds in), with workflow_dispatch.

The scheduled-full-run card identity moves to `4-hourly` and keeps the
hourly title and marker readable through CADENCE_PREDECESSORS, so the
open card #25438 is refreshed, never orphaned or duplicated; pinned in
the self-test with its real title and marker line. The scheduled runs'
Test Core run-summary and timing artifacts are kept 4 days so the
weekly shard-timings refresh still sees about 24 runs. Readers, runbook
and messages that said hourly follow.

Co-authored-by: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AjoNWTpihGQZrTamr1vd4W
@objectstack-fleet objectstack-fleet Bot added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Oct 26, 2026
@github-actions github-actions Bot added ci/cd documentation Improvements or additions to documentation labels Oct 26, 2026
@os-zhuang
os-zhuang marked this pull request as ready for review October 26, 2026 06:47
@os-zhuang
os-zhuang enabled auto-merge October 26, 2026 06:47
…ourly schedule

shard-timings-refresh.yml's Save-Turbo-cache paragraph and docs-deploy.yml's
cron-collision reasoning (the 0/6/12/18 set still holds: the 4-hourly
ci/lint runs meet it at 00 and 12 only).

Co-authored-by: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AjoNWTpihGQZrTamr1vd4W
@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

Test UI (14/16) is red on 7567bf7 in ui/scripts/__tests__/check-pre-install-import-graph.test.ts › "finds no pre-install gate reaching a package": unresolved: scripts/objectstack-pin.mjs.

This failure is not this PR's. That gate derives its population from ui/.github/workflows/, which still name scripts/objectstack-pin.mjs. #25745 deleted that script. This PR touches root workflow files, so Test UI selects that suite here; it does not change ui/**. The fix in flight is #25957 ("the pre-install import graph reads the repository root's workflows"). It changes about 400 lines across ui/scripts and moves the prompt files, so I am not porting it into this Tier H PR. Once #25957 lands I will merge main here and push. A re-run would fail the same way, because the failure is deterministic, so I have not re-run it.


Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

ci/cd documentation Improvements or additions to documentation size/m skip-changeset PR has no user-facing published change; bypasses the changeset gate

Projects

None yet

3 participants