Skip to content

[Decision] CI and Lint run a full battery every hour (48 runs/day, about 2,800 job-minutes/day before any PR traffic): keep hourly, every 3 h, every 6 h, or run only when main moved since the last full run #22083

Closed

Description

@objectstack-fleet

Filing gate: ② a decision only the maintainer can make — the hourly full CI and Lint runs are a maintainer ruling (#16467, 2026-09-07), so changing their cadence is the maintainer's call. Filed by domain:skills seat 2 (seat post #19287, session_0181E4ZeZmWyknawnauxD2CE) on the maintainer's instruction after this seat's CI assessment, verbatim: 「CI 优化按照你的建议创建任务」. ⛔ Not a claim, ⛔ not a dispatch.
Reader: the maintainer (the needs-user-decision inbox); after the ruling, the domain:devx seat executes per 「裁后执行」 below.
Dedupe: page-looped REST listings, closed included (union 1,266) grepped for hourly|schedule|cron|full run|scheduled → 34 hits; the governing ones: #16467 (closed: push runs use the affected set; an hourly scheduled run keeps the full list and files a card on red — maintainer-directed), #16453 (the affected-set work it belongs to), #16464 / #22022 (the shard-timings refresh that reads the scheduled runs), and the 16 "hourly full run: red on main" cards since 2026-09-09 (#17059, #17687, #18161, #18594 …), every one closed. None re-measures the cadence's cost against its value, which is this card.

维护者速读

问题:CI 与 Lint 每小时各跑一次全量(0 * * * *),一天 48 次,约 2,800 job-分钟(≈47 个 runner-小时),与 PR 流量无关;它换来「main 红了一小时内有卡」(四周 16 张红卡,全部已关)和分片时长数据集每小时一个样本。本席在评估里把它列为可裁项,立卡前又量了两件事:过去 7 天 main 有提交的小时占 90%(152/168,662 次提交),所以「没改动就跳过」只能省约 10%;而且仓库是公开仓,ubuntu-latest 分钟不计费;实测代价只是 runner 池负载,而所有采样 job 的排队等待 ≤0.2 分钟。

推荐:A(保持每小时)。降频省下的是不计费的分钟,付出的是红 main 晚几小时被发现;真正该省的是每次全量跑的成本——那在 #22075(分片失衡)和 #22077(重复构建)里。等那两张落地后再量一次,届时若 runner 池出现排队再回到这张卡。

你要做的:回一个字母 A / B / C / D。选 A 本卡即关、cron 不动。

Governing text

前提(每条带 re-check 命令)

  1. Both workflows run the full battery hourly. — grep -n "cron: '0 \* \* \* \*'" .github/workflows/ci.yml .github/workflows/lint.yml → 2 lines.
  2. Cost: scheduled CI runs used 36–147 job-minutes (4 samples), scheduled Lint runs 33–46; 24 × (77 + 41) ≈ 2,800 job-minutes a day; the repository is public, so ubuntu-latest minutes are not billed; the measured cost is runner-pool load, and runner wait was ≤0.2 min in every sampled job. — jobs API over the 100 most recent completed runs of each workflow (the seat's CI research, raw files kept); gh api repos/objectstack-ai/objectstack --jq .private → false.
  3. Activity: over the last 7 days main received commits in 152 of 168 hours (90%), 662 commits; only the other 16 hours' full runs re-tested an unchanged tree. — git log origin/main --since=7.days --format=%cd --date=format:%Y-%m-%dT%H | sort -u | wc -l
  4. Value: 16 "hourly full run: red on main" cards since 2026-09-09, all closed; detection latency of a red main is at most one hour. — REST listing grep hourly full run: red on main.
  5. The shard-timings refresh (fix(ci): accumulate shard-timings runs until every package has three executions, provisional below that #22022) accumulates scheduled runs until every package has three measurements; fewer scheduled runs mean a slower refresh. — grep -n -i "three\|3 measurements\|accumulate" .github/workflows/shard-timings-refresh.yml

一句话问题

每小时把整棵树测一遍的固定开销,值不值得用「红 main 晚几小时被发现」去换。

选项 × 真实代价

选项 做什么 车队可感知后果
A 保持每小时 现状:≈2,800 job-分钟/天(不计费);红 main 一小时内有卡;数据集每小时一个样本
B 每 3 小时 跑次降约 67%;红 main 最多 3 小时才有卡;数据集样本慢 3 倍
C 每 6 小时 跑次降约 83%;红 main 最多 6 小时才有卡;数据集样本慢 6 倍
D cron 不变;首步读上次全量跑的 main sha,main 没动就提前退出 过去 7 天只有 16/168 小时能省(≈10%);多一个早退步骤和一个 sha 读数源

业务含义直译

A = 「不管有没有改动,每小时体检一次」;B / C = 「体检改成每 3 / 6 小时,出事晚知道几小时」;D = 「没改动不体检——但这里几乎每小时都有改动」。

四轴论证(从业务立场)

推荐 + 回退 + 置信缺口

推荐 A(保持每小时;在 #22075 / #22077 落地后再量一次)。回退 B(若 runner 池开始出现排队等待,每 3 小时是最小的有效降幅)。置信缺口:活动样本只有 7 天;runner 池负载只看了采样 job 的等待时间;数据集刷新对样本频率的真实需求未测(#22022 的 3 次/包是下限)。
自检行:只看①选 A;②③④ 是否翻转:否。
终态句:两年后每次全量跑的成本由分片与缓存决定,频率跟着「红 main 可容忍的发现时延」走,而不是跟着分钟数走。

os-decision-facets
① 项目长远合理性:单次成本是结构问题(#22075 / #22077),频率不是;A 不动裁决。
② 实际业务拉动:公开仓分钟不计费、runner 不排队;早发现有 16 张卡的实测价值。
③ 防 AI 犯错:降频在最活跃时段最先损失红 main 的发现时延。
④ 创业阶段不扩散:A 零改动;D 新机制换 10%;B / C 改上月的裁决。
Prior rulings read: schedule,hourly,cron,full,scheduled,ci,runner → 60 ADR / 27 AGENTS.md / 484 spec term hits, 10 ADR candidates, none on CI cadence; ADR none; thread: #16467, #16453, #22022
推荐 A;选项 A / B / C / D;自检「只看①选 A;②③④ 是否翻转:否」。置信缺口:7 天活动样本;runner 池负载只看了等待时间;数据集节奏需求未测。

裁后执行

Related: #16467 · #16453 · #16464 · #22022 · #22075 · #22077 · ci.yml:50-58 · lint.yml:40-47.


Generated by Claude Code

Activity

  1. objectstack-fleet commented on Oct 7, 2026

    @objectstack-fleet
    ContributorAuthor

    Box intake (triage): domain:devx · priority:p3 added. The card's shape is complete: 维护者速读, the option table, the four axes, Prior rulings read: and 裁后执行 are all present. It changes the cadence of a maintainer-ruled schedule (#16467), so it is the maintainer's. p3: today's hourly cadence works, and the card itself recommends A (keep it). Nothing else changes; the card waits in the box for the director.

    Triage seat (objectstack-wide, seat post #6015) · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-07T16:16Z. ⛔ Not a claim.

  2. objectstack-fleet commented on Oct 8, 2026

    @objectstack-fleet
    ContributorAuthor

    Ruling: batch #287 item 1 · letter A · maintainer 「批 #287 同意」 2026-10-08T02:19Z

    Director seat, summon #35, session_01VYToj6PQehTEKNrjGM9akg (GitHub os-zhuang; written as objectstack-fleet[bot] via the relay). Batch #287 was presented in chat twice, the second time in the detailed form the maintainer asked for, with this card's options A / B / C / D; the maintainer answered 「批 #287 同意」, which takes A. Freshness gate: the body and the one comment (6041983946, triage's intake) were re-read before this record; nothing newer exists. Thread-read: 6041983946.

    The ruling

    A. The hourly full CI and Lint runs stay as #16467 ruled them (cron: '0 * * * *' in ci.yml:58 and lint.yml:47). The cost side measured zero where it is paid: the repository is public, so ubuntu-latest minutes are not billed, and runner wait was at or under 0.2 minutes in every sampled job; the value side measured sixteen "hourly full run: red on main" cards in four weeks (all closed) and the shard-timings dataset that select-shard-timings-run.mjs wants fed once an hour (#22022 now accumulates until every package has three measurements). ⛔ Not taken: B and C (a 3- or 6-hour cadence trades unbilled minutes for a 3- to 6-hour red-main detection delay in the hours when 90% of them carry commits, and slows the dataset refresh by the same factor) and D (an early-exit step that saves about 10% of runs for a new sha-reading mechanism).

    What would reopen this: the repository turning private (minutes billed) or a move to self-hosted runners (a smaller pool). The per-run cost is the structural lever and is being worked elsewhere (#22077 landed; #22075 open): after #22075 lands, the domain:devx seat re-measures once and leaves one line of readings here.

    State

    • This card closes completed in this act; the crons are not touched; tooling · domain:devx · priority:p3 unchanged.

    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

No one assigned

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions