Repository navigation
ci: run main's full battery every 4 hours instead of hourly (CI and Lint schedules), and CodeQL daily instead of on every push to main (maintainer ruling Q6 = C) #25771
Description
Filing-gate category: ③ maintainer-directed. Tesla ruled the whole-project assessment's Q6 on 2026-10-25 09:23Z in the director thread, answering "A = keep hourly; B = skip when the SHA is unchanged (saves most, loses flake detection); C = lower the frequency to about every 4 hours, logic unchanged", plus "CodeQL on every push … can be filed directly": 「D4 · 固定发版日 没必要;其他同意 ,npm dist-tag 手工清理 应该立一张管理者维护的卡」 — "其他同意" = C. ⛔ Not a claim; for triage to grade and route.
Governing text: .github/workflows/ci.yml on.schedule (#16467's hourly full run), .github/workflows/lint.yml on.schedule (same ruling, the half that file owns), .github/workflows/codeql.yml on.
The change
ci.ymlandlint.yml:cron: '0 * * * *'→ every 4 hours ('0 */4 * * *'or an offset of it). Job logic unchanged: the scheduled run stays the full battery and keeps finding flakes on green SHAs (objectui 8/78, objectstack 4/37 such reds in the assessment window — the reason B was not chosen).codeql.yml: drop thepush: maintrigger, run daily on a schedule (keep the weekly deep pass or fold it into the daily one), keepworkflow_dispatchif present.- Update the readers that assume one scheduled run per hour, e.g.
scripts/ci/select-shard-timings-run.mjs("wants one complete run per hour"),scripts/ci/scheduled-full-run.mjsand the "THE HOURLY FULL RUN" comments;grep -rln hourly scripts/ci scripts/*.mjslists 11 candidate files on5874d25. Fix any freshness window that would now read a 4-hour gap as missing.
Re-check:grep -n "cron" .github/workflows/ci.yml .github/workflows/lint.yml .github/workflows/codeql.yml
Explicitly not in this card
Dropping the push-to-main runs of CI/Lint. Measured on 5874d25, those runs are not copies of the merge_group run: merge_group carries the fast set while push carries the post-merge-only jobs (dogfood ×3, dogfood-verify, temporal-conformance, console-pin) attributed per commit (#25373), and push runs are the only writers of the main Turbo seeds that PR runs restore (ci.yml save steps if: always() && github.event_name == 'push'). That half went back to the maintainer with the corrected premise; it gets its own card only if re-ruled.
Business rationale
The scheduled full battery is ~24 runs/day, most on an unchanged SHA (21/37 on an already-run SHA in the assessment window); CodeQL ran 100 times in 25.9 h with 86 cancelled. Every one of those runner-minutes competes with PR and merge-queue capacity, i.e. with how fast product work lands. Cutting the schedule to 6 runs/day keeps the flake detector statistically alive at about a quarter of the cost.
Serial constraint: the objectui-merge cutover (#25752) lands PR B #25697 and 4a #25745 which edit ci.yml / lint.yml; land outside the cutover freeze window. After cutover the merged Test UI jobs live in ci.yml and inherit this cadence; the objectui repo's own hourly schedule is objectui#13448's business. Workflow files = governed surface (Tier H), human merge.
Reader: the devx seat after triage. Effort S.
Duplicate check: semantic searches "hourly scheduled full run CI cron frequency push to main duplicate CodeQL every push" (objectstack, 43 hits: the "hourly full run: red on main" incident cards, none about cadence) and "codeql schedule daily instead of every push" (1 hit, #16467 closed, the card that created the hourly run). No duplicate.
Evidence: https://claude.ai/artifact/8qxoYjsE4jQC4DJBCF3wm5#Q6
Generated by Claude Code
Activity
objectstack-fleet commentedon Oct 25, 2026
Triage: first grade —
tooling·priority:p2·domain:devx·area:devpath·pm:queue· triage seat ·session_01AavokzJ5DndAwitDXvKy4U· 2026-10-25T09:56Z⛔ Not a claim, ⛔ not a dispatch.
scripts/ci/scheduled-full-run.mjs --release-gatereads the newest completed schedule run at or before the version commit. At a 4-hour cadence a version commit can wait up to 4 h for its first green full run. Say so indocsand the release runbook, and check its 'not stale' window.scripts/ci/select-shard-timings-run.mjstoo, as the card says.Generated by Claude Code
objectstack-fleet commentedon Oct 26, 2026
Claim: PM loop · 2026-10-26T06:10Z
Session:
session_01AjoNWTpihGQZrTamr1vd4W(card thread 「全量 CI 改为每 4 小时一次」, dispatched by seat sessionsession_01LKHDniRQSWjRJyDtacwpEd; re-routed from in-seat 06:14Z)Account:
os-elon-muskBranch:
claude/project-thread-18emds(the harness-pinned branch for the card thread; amended 2026-10-26 06:16Z; it names no issue, so this claim is the identity record)Worktree:
objectstack-issue-25771Domain:
domain:devxSeat:
domain:devx#1(seat post #6023)File surface:
.github/workflows/ci.yml/lint.yml(on.scheduleonly),.github/workflows/codeql.yml(on), the readers that assume an hourly schedule (scripts/ci/scheduled-full-run.mjs,scripts/ci/select-shard-timings-run.mjstext, "hourly" comments and docs) (stop on breach; explain in the report)Container & model:
S-M,mode:thread,model: default tier,effort: mediumClause-②: no
Metadata-protocol: none
Contract review: not triggered (workflow cadence + readers; no spec, no narrowing, no governed rule text). Tier H (workflows): lands on a GOVERNED_APPROVERS approval.
Responsibility: the maintainer's Q6 = C ruling — the scheduled full battery every 4 hours, CodeQL daily instead of on every push
Thread-read: none
Serial constraints cleared: #25870 (card thread, pending) may touch
ci.yml's Test Core job — whoever lands second merges mainSeated under the maintainer's 「你开始接 devx 车道」 (2026-10-26). Dispatch order:
/mnt/project-files/pm-devx-seat/dispatch-25771.md.objectstack-fleet commentedon Oct 26, 2026
os-dev-report
{ "issue": 25771, "status": "done", "branch": "claude/project-thread-18emds", "pr": "https://github.com/objectstack-ai/objectstack/pull/25969", "session": "session_01AjoNWTpihGQZrTamr1vd4W", "premise_still_valid": true, "summary": "ci.yml and lint.yml schedule moved to '0 */4 * * *' (job logic unchanged); codeql.yml drops push: main and runs daily at 02:00 UTC with workflow_dispatch (the Monday pass folds in). Card identity moves to `4-hourly` and keeps the hourly title/marker readable via CADENCE_PREDECESSORS, so #25438 is refreshed, never orphaned or duplicated. The scheduled runs' Test Core run-summary and timing artifacts are retained 4 days (1 day on other events) so the weekly shard-timings refresh still sees ~24 runs; the release gate has no clock and needed no change beyond the runbook paragraph.", "tests": "scheduled-full-run.mjs --self-test OK (card identity battery 42 cases, floor 34 -> 42; new cases use #25438's real title and marker line); --check-concurrency OK for both files. Mutations: CADENCE_PREDECESSORS emptied -> red 'the CI identity lost the hourly spelling #25438 carries'; lint.yml cron reverted to '0 * * * *' -> red 'declares [\"0 * * * *\"], but CARD_CADENCES says 4-hourly'. select-shard-timings-run --self-test OK, partition-test-shards --self-test OK, select-gate-families.selftest.sh 59/59, select-shard-packages.selftest.sh 32/32.", "gates": "dispatch-gates --commands: 82 commands, 77 exit 0; exit 3 NOT MEASURED (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 on the PR owns the rest.", "dogfood_battery": "n/a — no `!` in the PR title and no (narrowing) arm", "mcp_calls": "2 — mcp__github__issue_read (#25771, #25438); no write tool", "api_writes": "2 relay strokes — pr_create #25969; this comment + pr_request_reviewers", "open_questions": [ { "question": "Keep the 4-day retention for scheduled Test Core run-summary/timing artifacts, or accept ~6 accumulated runs per weekly refresh at 1 day?", "options": [ "A keep 4 days on schedule only", "B revert to 1 day" ], "recommendation": "A, because it restores the ~24-run sample the refresh was sized for at negligible storage (6 runs/day x 8 shards)" } ], "out_of_scope_findings": [] }Generated by Claude Code
objectstack-fleet commentedon Oct 26, 2026
Landed: PR #25969, merged 2026-10-26T07:12:58Z by os-zhuang through the merge queue (merge
cdd4eea938). The governed approval was os-zhuang's, so the Tier H requirement is met.Seat review on record: I read the substance at
7567bf70. TheCADENCE_PREDECESSORSlegacy read means #25438 is found by both its title and its marker. The cron is'0 */4 * * *'in ci.yml and lint.yml, and CodeQL runs daily. Retention is 4 days on schedule runs only. The patch round atac31cc8cfixed the two present-tense "hourly" sentences in shard-timings-refresh.yml and docs-deploy.yml. It landed before I posted a formal 席位核对 on the final head, so this comment is that record.Still owed after landing:
scheduleCI and Lint runs at the new cadence;The seat will read these from the next scheduled runs.
Generated by Claude Code