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. added
    toolingFix lands in tooling, not a product package — enters pm:queue only with Unblocks: or a named surface
    needs-user-decisionBlocked on a maintainer decision — do not dispatch; decision cards only, never on a PR
    on Oct 7, 2026
  2. 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.

  3. 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

  4. removed
    needs-user-decisionBlocked on a maintainer decision — do not dispatch; decision cards only, never on a PR
    on Oct 8, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    domain:devxDomain lane — seat card indexed by label:pm:seatpriority:p3toolingFix lands in tooling, not a product package — enters pm:queue only with Unblocks: or a named surface

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions