Repository navigation
ci: the hourly schedule reruns the full battery on an already-tested SHA, the coverage lane runs on every push, and two steps make unrelated PRs red #25924
Description
维护者速读
近 7 天 CI 跑了 1,309 次,折算约 204,000 runner 分钟/周。其中每小时定时全量约 49,000(24 %),且没有「该 SHA 已有绿色全量就跳过」的步骤;覆盖率车道(8 腿 × 22 分钟)跑在每次 push,约 64,000(31 %),只为执行 40/33/30/40 的阈值。另有两处与改动无关的红:锁文件「阴性对照」测试在 PR 分片里打活的 origin/main;Install dependencies 无重试。四项都是单步改动,workflow 是受管面。
Measured (GitHub Actions API, window 2026-10-17 to 10-24)
- CI runs: 1,309 in 7 days (first 1,000: pull_request 369, merge_group 251, push 236, schedule 144). PR / merge_group run = 129.7 job-minutes median (16 shards at 8.8 min median plus Type Check 7.1, Build Docs 3.0, Build & E2E 2.5, dist pins 1.9). push / schedule full battery = 333 to 350 job-minutes (8 coverage shards at 22.4 min median, 16 test shards, Type Check 15).
- Schedule:
ci.ymlhascron: '26 * * * *'; no step comparesgithub.shawith the last successful push run (grep forschedule|unchanged|skipin the first 135 lines finds only the rationale comment); 4 sampled schedule runs executed all 31 jobs. The same week push already produced 236 full-battery runs. - Coverage: job
test-coverage(8 shards,timeout-minutes: 40) is gated bygithub.event_name == 'push' || github.event_name == 'schedule'; thresholds invitest.config.mtsare lines 40 / functions 33 / branches 30 / statements 40. objectui#12256 and objectui#13210 were timeouts in this lane. - Red source 1:
scripts/__tests__/check-lockfile-integrity.test.ts, the describe "green on main — the negative control", spawns the real gate with--base-ref origin/main; run 40065885479'sTest (shard 11/16)failed with "Lockfile integrity: @vitejs/plugin-react, next, vite" on a PR that did not touch the lockfile, making the requiredTestcontext red. - Red source 2: run 40065631506 had 20 jobs fail at the step
Install dependenciesat once (1 of 25 sampled PR CI runs, about 130 job-minutes);pnpm install --frozen-lockfileis single-attempt in every workflow. - "Affected mode" saves little: PR shard medians 8.15 to 11.03 min versus full-battery shards 8.9 to 10.6 min. Selected-file counts are 未实测 (job logs redirect to blob storage, 403 through the proxy);
node scripts/select-affected-tests.mjs --explainon recent bases settles it.
Recommendation
- Schedule: first step reads the last successful push full run's
head_shafrom the Actions API and setsshould_run=falsefor every job when it equalsgithub.sha(fail-open on API error); or drop the cron to every 6 hours. Saves about 45,000 to 49,000 job-minutes a week. - Coverage lane only on schedule (or nightly plus
workflow_dispatch), thresholds unchanged. Saves about 55,000 to 60,000 a week; removes the main-red:Test (coverage)fails on main's push lane: a coverage shard hits its 40-minute ceiling on 7 of the last 25CIpush runs, so the coverage gate is not evaluated on those commits objectui#12256 / main-red (intermittent):Test (coverage shard 6/8)times out on body-dialect-census.test.ts:288 ("the platform SHIPS the dialect it is being asked to refuse") at the 60 s test timeout — 4 of the last 12 completedCIruns on main read red on it objectui#13210 red source from the per-merge path. Accepted cost: a coverage drop under threshold surfaces hours after merge. - Lockfile negative control asserts the gate's polarity on a fixture (as
check-required-check-set.mjs --fixturedoes), never the live base ref; audit the other tests thatgit grepthe tree for the same shape. - One retry around the install in
scripts/ci-setup-pnpm.sh(every workflow already calls it), keeping--frozen-lockfile.
Not proposed: a new gate. Also measured and already filed elsewhere: shard timings 12 days stale with 830 of 5,773 files unmeasured and real leg spread 1.73x (objectui#13349, PR objectui#13028).
Refs: objectui#12214, objectui#12352, objectui#12256, objectui#13210, objectui#13349, objectui#13064, objectui#13077.
Filed by the read-only whole-repo review session https://claude.ai/code/session_01BDtwYUWhLGyWLzYQjZ95Cf on 2026-10-24; the maintainer approved filing (「同意,创建任务」). Full evidence files sit in that session's scratchpad (objectui-review-report.md, findings-*.md). ⛔ Not a claim; for triage to grade and route.
Generated by Claude Code
Activity
objectstack-fleet commentedon Oct 24, 2026
Triage: first grade —
tooling·priority:p2·domain:devx·area:devpath·pm:queue· triage seat ·session_01AavokzJ5DndAwitDXvKy4U· 2026-10-24T15:03Z⛔ Not a claim, ⛔ not a dispatch.
findingcomes off.origin/main. The install inci-setup-pnpm.shgets one retry, keeping--frozen-lockfile. Both remove reds that are unrelated to the PR.Generated by Claude Code
objectstack-fleet commentedon Oct 25, 2026
Maintainer ruling on this card's schedule item (whole-project assessment Q6), Tesla, 2026-10-25 09:23Z in the director thread, answering "A = keep hourly; B = skip when the SHA is unchanged; C = lower the frequency to about every 4 hours, logic unchanged": 「D4 · 固定发版日 没必要;其他同意 ,npm dist-tag 手工清理 应该立一张管理者维护的卡」 — "其他同意" = C.
What this changes here:
ci.ymlcron: '26 * * * *'→ every 4 hours. The "skip whenhead_shaequals the last full run" branch is not chosen: the scheduled run is the only flake detector (8 of 78 hourly runs failed on already-green SHAs in the assessment window), and C keeps it at about a quarter of the cost.pushtrigger is not covered by this ruling. objectui push runs also save the Turbo caches (actions/cache/savesteps gated onpush || schedule), so that half went back to the maintainer with the corrected premise.ci.ymlstops running when the repo is archived at the ui/ cutover (cutover(ui-merge): the switch itself — freeze both repos,git subtree addobjectui asui/with its adaptation commit, land 4a / PR B / 4b PR 2 in order, migrate open objectui branches and cards, archive the objectui repo (parent #25677, 5/6) #25752, freeze planned around 2026-10-26). The cron change only pays if it lands before that freeze; after cutover the mergedTest UIjobs follow objectstack's cadence card 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.Generated by Claude Code
objectstack-fleet commentedon Oct 26, 2026
Transferred 2026-10-26T04:14Z from objectstack-ai/objectui#13448, with its comments and timeline; the old URL redirects here. objectui moved into this repository as the
ui/workspace (epic #25677) and is being archived (#25854). The body is left exactly as filed.Paths. Read every repository path in the body with a
ui/prefix:scripts/__tests__/check-lockfile-integrity.test.tsis nowui/scripts/__tests__/check-lockfile-integrity.test.ts;scripts/select-affected-tests.mjsis nowui/scripts/select-affected-tests.mjs;scripts/ci-setup-pnpm.shis nowui/scripts/ci-setup-pnpm.sh.References. The bare issue numbers in the body were written in objectui and now resolve against this repository by mistake; read them as objectstack-ai/objectui#12256, objectstack-ai/objectui#13210.
No stale
pm:dispatchedor assignee to strip.Generated by Claude Code
objectstack-fleet commentedon Oct 26, 2026
Claim: PM loop · 2026-10-26T08:13Z
Session:
session_01WKpunbiE8c9w2i9FsEvQas(card thread, dispatched by seat sessionsession_01LKHDniRQSWjRJyDtacwpEd)Account:
os-elon-muskBranch:
claude/project-thread-46zigd(the harness-pinned branch for the card thread; it names no issue, so this claim is the identity record)Worktree:
objectstack-issue-25924Domain:
domain:devxSeat:
domain:devx#1(seat post #6023)File surface:
.github/workflows/ci.ymlcoverage lane trigger (Tier H),scripts/ci-setup-pnpm.shinstall retry, their self-tests (stop on breach; explain in the report)Container & model:
M,mode:thread,model: default tier,effort: highClause-②: no
Metadata-protocol: none
Responsibility: n/a — CI tooling
Thread-read: none
Serial constraints cleared: #25771 landed (cadence); #25870 may touch ci.yml Test Core header later — merge origin/main before each push
Dispatched under the maintainer's 「同意」 to the director's ruling batch 1, item 5A (devx dispatches p1–p3). Dispatch order:
/mnt/project-files/pm-devx-seat/dispatch-25924.md.objectstack-fleet commentedon Oct 26, 2026
os-dev-report
{ "issue": 25924, "status": "done", "branch": "claude/project-thread-46zigd", "pr": "https://github.com/objectstack-ai/objectstack/pull/26003", "session": "session_01WKpunbiE8c9w2i9FsEvQas", "premise_still_valid": false, "summary": "Item 2 (coverage lane): premise moved. On the merged repo the ui coverage lane does not run on push; it runs nowhere. The ui/ cutover did not port it (#25697 roster row 7, 'kept, follow-up port') and ui/.github/workflows/ci.yml is not executed, so the ui thresholds (40/33/30/40) have had no reader since the cutover. Goal unchanged, landing moved: PR #26003 adds .github/workflows/ui-coverage-nightly.yml ('UI Coverage': 8 blob shards + one merge job that enforces the configured thresholds), schedule 13 6 * * * plus workflow_dispatch only, thresholds unchanged; scheduled-full-run-card.yml watches it with a 'nightly' cadence so a red night files one card; the three ui pins that retired with the lane (width, reporter set, headroom wiring) read the new file. Item 4 (install retry): not done, premise false on the merged repo, see open_questions.", "tests": "head 565a1e5c: node scripts/ci/scheduled-full-run.mjs --self-test OK (battery 'card identity and de-dup' 42 -> 46 cases, floor raised to 46). The three restored ui pins are in the affected selection (select-affected-tests: 683 of 5808 files, all three named) and ran green in Test UI 1-16/16 on the PR. The new workflow cannot run on a pull_request; first reading = workflow_dispatch on main after merge or the first 06:13Z night.", "gates": "dispatch-gates --commands: 60 derived. CI on head 565a1e5c: 66 check runs, 54 success, 12 skipped (opt-in and path-filtered), 0 failed, including Lint & Repo Gates and its 7 lanes, Type Check x5, Test Core 8/8, Test UI 16/16, Governed Surface Queue Guard. Locally only the 26 node-only commands ran (18 exit 0; 7 exit 3 and check-self-test-workflow-commands exit 1, all on missing node_modules: the container's npm install was still at ~22% after 40 min) = NOT MEASURED locally, measured by CI. --tier: Tier H (.github/workflows/**), 775 changed lines < 3000.", "dogfood_battery": "n/a: no ! in the title and no (narrowing) arm", "mcp_calls": "0 writes (reads only: issue/PR reads, one job log)", "api_writes": "relay: pr_create (run 40294044274); this stroke: comment + pr_request_reviewers", "open_questions": [ { "question": "Item 4 (one retry around pnpm install): the card's landing ui/scripts/ci-setup-pnpm.sh is called by no workflow GitHub runs (only ui/.github/workflows/*) and never ran the install anyway; the root acquires pnpm through .github/actions/setup-pnpm, which already retries; `pnpm install --frozen-lockfile` is spelled at ~40 sites in 25 root workflows. Measured (Actions API, failed runs created since 2026-10-19, 632 runs): 1 job failed at an install step (run 39316437234, Type Check · debt ledger, node-gyp headers ECONNRESET from nodejs.org). Which way?", "options": [ "A: a shared install composite action with one retry, every root site moves to it (Tier H, ~40 sites, check-governed-queue-guard and the fixtures that spell the install line follow)", "B: an inline `|| { sleep; retry }` on each install line (Tier H, ~40 sites, no new indirection)", "C: drop item 4 on the measured rate (1 job / 7 days) and close it with the reading" ], "recommendation": "C, or B if the seat wants the 1-in-a-week red gone; A adds an indirection that hides the pnpm call from check-pnpm-acquisition's 'job runs pnpm' census" } ], "out_of_scope_findings": [ "The red-run card's labels are fixed in cardIdentity (bug, domain:devx, priority:p1), so a UI Coverage threshold breach files as p1; grading stays the seat's on first touch. noted, not filed", "Card items 1 (schedule) landed as #25771; item 3 (lockfile negative control on a fixture) not measured here, untouched" ] }Generated by Claude Code
objectstack-fleet commentedon Oct 27, 2026
Release:
session_01LKHDniRQSWjRJyDtacwpEd(devx seat 1) · seat signs off on the maintainer's word 「当前任务处理完,合并后就下班」 (2026-10-27 01:20Z) · next:pm:on-holduntil the first nightly reading below, then closePR #26003 merged at 2026-10-26 15:38Z and ported the ui coverage lane as the nightly
UI Coverageworkflow. The seat accepted it (6412114440), and item 4 (install retry) was dropped on measurement (option C). The only thing left is to read the first scheduled run.Restart-when: the first scheduled
UI Coveragerun onmain(cron13 6 * * *, first fire 2026-10-27 06:13Z) has completed. Green ⇒ record its run id here and close this card as completed. Red ⇒scheduled-full-run-card.ymlfilesnightly full run: red on main (UI Coverage)by itself; then close this card and point to that one.Generated by Claude Code
objectstack-fleet commentedon Oct 27, 2026
First scheduled
UI Coveragerun: greenRun 40462561710,
schedule, head3fcafcd3b8(main, which carries #26003 and the later #26419 setup-workspace refactor). The cron is 06:13Z and the run was queued at 06:41:03Z, completed 07:08:27Z: success.Test UI (coverage): every step green. All 8 blobs were present, the merge ran, the report was published as theui-coverage-reportartifact, and the verdict annotation reads "Coverage gate ran ... the thresholds passed over the whole map". The configured thresholds (40/33/30/40) are evaluated again for the first time since the ui/ cutover.Shard headroomnotices forTest (shard 4/8)/Test (shard N/16). Those are printed byui/scripts/__tests__/shard-headroom.test.ts's ownmain()cases, which unsetGITHUB_STEP_SUMMARYbut not stdout::notice. They are cosmetic and change no verdict.Item 4 (install retry) is dropped per the seat's ACCEPT (option C, comment 6412114440). Nothing else is owed from the card thread.
Generated by Claude Code
objectstack-fleet commentedon Oct 27, 2026
Closing as completed on the maintainer's word 「关」 (2026-10-27 08:21Z). The Restart-when condition is met: the first scheduled
UI Coveragerun, 40462561710, is green (8/8 shards, thresholds passed). The reading is comment 6436134417.Generated by Claude Code