Skip to content

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

Closed

Description

@os-zhuang

维护者速读

近 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.yml has cron: '26 * * * *'; no step compares github.sha with the last successful push run (grep for schedule|unchanged|skip in 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 by github.event_name == 'push' || github.event_name == 'schedule'; thresholds in vitest.config.mts are 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's Test (shard 11/16) failed with "Lockfile integrity: @vitejs/plugin-react, next, vite" on a PR that did not touch the lockfile, making the required Test context red.
  • Red source 2: run 40065631506 had 20 jobs fail at the step Install dependencies at once (1 of 25 sampled PR CI runs, about 130 job-minutes); pnpm install --frozen-lockfile is 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 --explain on recent bases settles it.

Recommendation

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

  1. added
    area:devpathThe road — create, dev, verify, publish/install, connect an agent, iterate
    and removed on Oct 24, 2026
  2. objectstack-fleet commented on Oct 24, 2026

    @objectstack-fleet
    Contributor

    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. finding comes off.

    • In scope now: items 3 and 4. The lockfile negative control asserts on a fixture, never on live origin/main. The install in ci-setup-pnpm.sh gets one retry, keeping --frozen-lockfile. Both remove reds that are unrelated to the PR.
    • To the maintainer (CI shape, governed): item 1 (skip the hourly full battery when that SHA already has a green full run) and item 2 (the coverage lane on schedule only). Neither is a new gate. Item 2 moves when a coverage drop is seen, which is a process change.

    Generated by Claude Code

  3. objectstack-fleet commented on Oct 25, 2026

    @objectstack-fleet
    Contributor

    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:


    Generated by Claude Code

  4. objectstack-fleet commented on Oct 26, 2026

    @objectstack-fleet
    Contributor

    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.ts is now ui/scripts/__tests__/check-lockfile-integrity.test.ts; scripts/select-affected-tests.mjs is now ui/scripts/select-affected-tests.mjs; scripts/ci-setup-pnpm.sh is now ui/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:dispatched or assignee to strip.


    Generated by Claude Code

  5. objectstack-fleet commented on Oct 26, 2026

    @objectstack-fleet
    Contributor

    Claim: PM loop · 2026-10-26T08:13Z
    Session: session_01WKpunbiE8c9w2i9FsEvQas (card thread, dispatched by seat session session_01LKHDniRQSWjRJyDtacwpEd)
    Account: os-elon-musk
    Branch: 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-25924
    Domain: domain:devx
    Seat: domain:devx#1 (seat post #6023)
    File surface: .github/workflows/ci.yml coverage lane trigger (Tier H), scripts/ci-setup-pnpm.sh install retry, their self-tests (stop on breach; explain in the report)
    Container & model: M, mode:thread, model: default tier, effort: high
    Clause-②: 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.

  6. objectstack-fleet commented on Oct 26, 2026

    @objectstack-fleet
    Contributor

    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

  7. objectstack-fleet commented on Oct 27, 2026

    @objectstack-fleet
    Contributor

    Release: session_01LKHDniRQSWjRJyDtacwpEd (devx seat 1) · seat signs off on the maintainer's word 「当前任务处理完,合并后就下班」 (2026-10-27 01:20Z) · next: pm:on-hold until the first nightly reading below, then close

    PR #26003 merged at 2026-10-26 15:38Z and ported the ui coverage lane as the nightly UI Coverage workflow. 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 Coverage run on main (cron 13 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.yml files nightly full run: red on main (UI Coverage) by itself; then close this card and point to that one.


    Generated by Claude Code

  8. objectstack-fleet commented on Oct 27, 2026

    @objectstack-fleet
    Contributor

    First scheduled UI Coverage run: green

    Run 40462561710, schedule, head 3fcafcd3b8 (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.

    • Shards: 8/8 green. Walls (start 06:41:06Z): 1/8 22m55s, 2/8 17m13s, 3/8 24m31s, 4/8 20m14s, 5/8 23m45s, 6/8 23m54s, 7/8 25m05s, 8/8 25m26s.
    • Merge job Test UI (coverage): every step green. All 8 blobs were present, the merge ran, the report was published as the ui-coverage-report artifact, 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.
    • Headroom (report-only): the longest shard is 8/8 at 25m26s = 64% of the 40-minute cap, with 14m34s spare. The total is 183m03s, which implies 10 shards at the 20-minute target against a matrix of 8. No action is owed at 64%. The reading is there for the next time someone widens the matrix.
    • Not read: per-metric percentages. They sit in the merge step's per-file text table and the artifact, and this container cannot reach the artifact blob host.
    • Noted, not filed: the merge job also carries two stray Shard headroom notices for Test (shard 4/8) / Test (shard N/16). Those are printed by ui/scripts/__tests__/shard-headroom.test.ts's own main() cases, which unset GITHUB_STEP_SUMMARY but 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

  9. objectstack-fleet commented on Oct 27, 2026

    @objectstack-fleet
    Contributor

    Closing as completed on the maintainer's word 「关」 (2026-10-27 08:21Z). The Restart-when condition is met: the first scheduled UI Coverage run, 40462561710, is green (8/8 shards, thresholds passed). The reading is comment 6436134417.


    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

    Labels

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

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions