Skip to content

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

Closed

Description

@objectstack-fleet

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.yml and lint.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 the push: main trigger, run daily on a schedule (keep the weekly deep pass or fold it into the daily one), keep workflow_dispatch if 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.mjs and the "THE HOURLY FULL RUN" comments; grep -rln hourly scripts/ci scripts/*.mjs lists 11 candidate files on 5874d25. 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

  1. objectstack-fleet commented on Oct 25, 2026

    @objectstack-fleet
    ContributorAuthor

    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.

    • Ruled (Tesla, Q6 = C).
    • Release-gate reader to update in the same PR: scripts/ci/scheduled-full-run.mjs --release-gate reads 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 in docs and the release runbook, and check its 'not stale' window. scripts/ci/select-shard-timings-run.mjs too, as the card says.
    • Workflows are governed, so the maintainer merges.

    Generated by Claude Code

  2. objectstack-fleet commented on Oct 26, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop · 2026-10-26T06:10Z
    Session: session_01AjoNWTpihGQZrTamr1vd4W (card thread 「全量 CI 改为每 4 小时一次」, dispatched by seat session session_01LKHDniRQSWjRJyDtacwpEd; re-routed from in-seat 06:14Z)
    Account: os-elon-musk
    Branch: 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-25771
    Domain: domain:devx
    Seat: domain:devx#1 (seat post #6023)
    File surface: .github/workflows/ci.yml / lint.yml (on.schedule only), .github/workflows/codeql.yml (on), the readers that assume an hourly schedule (scripts/ci/scheduled-full-run.mjs, scripts/ci/select-shard-timings-run.mjs text, "hourly" comments and docs) (stop on breach; explain in the report)
    Container & model: S-M, mode:thread, model: default tier, effort: medium
    Clause-②: 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 main

    Seated under the maintainer's 「你开始接 devx 车道」 (2026-10-26). Dispatch order: /mnt/project-files/pm-devx-seat/dispatch-25771.md.

  3. objectstack-fleet commented on Oct 26, 2026

    @objectstack-fleet
    ContributorAuthor

    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

  4. objectstack-fleet commented on Oct 26, 2026

    @objectstack-fleet
    ContributorAuthor

    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. The CADENCE_PREDECESSORS legacy 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 at ac31cc8c fixed 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:

    The seat will read these from the next scheduled runs.


    Generated by Claude Code

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

Metadata

Metadata

Assignees

Labels

area:devpathThe road — create, dev, verify, publish/install, connect an agent, iteratedomain:devxpriority:p2Medium: important, M3tooling

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions