Skip to content

pm: a package's test:repo project is CI's run; a spec-plus-one-package card is build-heavy and goes mode:cloud - #23676

Merged
objectstack-fleet[bot] merged 3 commits into
mainfrom
claude/issue-23607-test-repo-ci-heavy-cloud
Oct 15, 2026
Merged

objectstack-fleet[bot] merged 3 commits into
mainfrom
claude/issue-23607-test-repo-ci-heavy-cloud

Conversation

@objectstack-fleet

Copy link
Copy Markdown
Contributor

Fixes #23607
Clause-②: no

This PR carries out ruling record 6184828752 on #23607, letters F1 A · F2 A, which the maintainer approved with 「同意」 on 2026-10-15. It is governed Tier S because it touches .claude/**, so it stays in draft until the seat records an at-tier contract review.

What changes

file lines ceiling
.claude/agents/os-dev.md 400 → 402 (+2) 402, unchanged: the two lines use the file's existing headroom of 2, so the row moves by 0
.claude/skills/pm-dispatch/references/execution-duties.md 185 → 188 (+3) 185 → 188 (+3), a ruled raise
scripts/pm/check-skill-line-ratchet.mjs +21 / −1 only the execution-duties.md CEILINGS row, with a comment block above it in the shape of the 183 → 185 block

F1: two lines in os-dev.md 〈本地验证范围〉, placed right after item ②'s two continuation lines and before ③. Items ①–③ are unchanged.

- ② 不含 `test:repo`(vitest `repo` 项目):它归 CI,`Test Core` 在 PR 与 merge group 都跑。
- 仅 diff 改该项目测试或派生清单点名它时本地跑,否则 `deviations` 写明;席位 ACCEPT 读其 CI。

F2: three lines in execution-duties.md 〈派发〉, placed right after the mode:cloud line. The ruling cites that line as :142. It was L144 at this branch's base, because #23660 inserted two lines above it.

- 申报文件面写 `packages/spec/src/**` 且至少另一包 ⇒ build 重,派 `mode:cloud`,一卡一容器。
- 一容器同时至多跑一个 build 重子代理;云会话建闭包拉 turbo 远程缓存。
- 首张这类派发实测固定开销(安装 + 拉缓存)并记在其卡上。

The mode:cloud line itself is unchanged, including 「build 重的 M 卡逐卡判」. The ruled test is a sufficient condition: the card asked 「命中就走云卡」. An M card that misses the test is still judged one card at a time.

The ruling, verbatim (comment 6184828752, items 1 and 2)

  1. F1 A. A package's test:repo project is CI's run (ci.yml runs test test:repo on the merge group). A dev runs it locally only when the diff edits a repo-project test file or the derived --commands list names it; otherwise the dev's deviations line says so, and the seat's ACCEPT reads the PR's CI for that project. os-dev.md's local-verification section carries the sentence.
  2. F2 A. execution-duties.md:142 gets the test: a card whose declared file surface writes packages/spec/src/** and at least one other package is build-heavy and is dispatched mode:cloud, one container per such card; a container runs at most one build-heavy subagent at a time. The cloud session pulls the turbo remote cache for the closure; the first such dispatch measures its fixed cost (install plus cache pull) and records it on its card.

Item 3 is respected: scripts/pm/os-verify-lock.sh and the environment are not touched. Item 4 is another seat's interim duty and is not done here.

Ruled raise: ruling id and measured delta

This follows the raise form named in scripts/pm/check-skill-line-ratchet.mjs's header since #23668 landed (merged into this branch). The ordering ruling is 6184828752 (letters F1 A · F2 A). The authorization is ruling record 6184799323 on #23606, letter B, item 1, verbatim:

  1. A ruling of record that orders text into a ratcheted file is the authorization to raise that file's ceiling by the measured lines the text needs: the raising PR quotes the ruling comment's id and the measured line delta in its body, and moves the CEILINGS row in the same PR by at most that delta. No second word from the maintainer is needed.

Measured deltas:

  • execution-duties.md: +3 lines. The row moves 185 → 188, exactly that delta.
    • The tightest one-line spelling of the four ruled parts is 245 B, against the 120 B per-line cap.
    • No two-line split fits. The test plus the per-container limit needs 137 B at its tightest. The per-container limit plus the cache part plus the fixed-cost part needs 141 B.
    • The three lines land at 112 B, 95 B and 79 B.
  • os-dev.md: +2 lines. These fit the standing headroom of 2, so the row stays at 402 and moves by 0.
    • The tightest one-line spelling is 131 B.
    • The two lines land at 101 B and 119 B.

Ratchet verdict lines at the final head:

✓ check-skill-line-ratchet: .claude/skills/pm-dispatch/references/execution-duties.md is 188 lines (ceiling 188; headroom 0).
✓ check-skill-line-ratchet: .claude/agents/os-dev.md is 402 lines (ceiling 402; headroom 0).

The per-line byte rule prints only on failure. The run printed zero ✗ lines.

Premises re-checked on origin/main

  • git grep -n "turbo run test test:repo" origin/main -- .github/workflows/ci.yml exited 0 and hit ci.yml:965. The control, merge_group in the same file, exited 0 with 27 hits, the first at :40.
  • One measured refinement to the ruling's parenthetical. The Test Core job's if: (ci.yml:501) has no event exclusion, unlike the four full-battery jobs that spell github.event_name != 'pull_request' && github.event_name != 'merge_group'. So test test:repo runs on pull_request (affected packages) as well as on merge_group.
    • The F1 line therefore says 「PR 与 merge group 都跑」. That is also what lets the seat's ACCEPT read the PR's CI.
  • Line counts at base 94924e01c: 400 / 402 and 185 / 185. The PM's readings at 57994c311 held.

Verification (head 4428e1746, after the final commit)

  • node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack, with no paths, derived 39 commands.
    • The change set was 3 paths against merge base 547702080 (+26 / −1).
    • The list is identical to the derivation at 0f02a71ce, taken before the second merge of origin/main.
  • All 39 commands ran locally and exited 0, each exit code captured before any pipe.
    • pnpm check:pm-dispatch-gates was run with nohup and waited on with tail --pid. It printed ✓ dispatch-gates self-test (fast tier): 1884 cases pass; 6 slow section(s) deferred. (268 s on this box) and exited 0.
  • The --ran reconciliation printed ✓ dispatch-gates --ran: 39 derived famil(ies) accounted for — 39 run, 0 NOT-MEASURED (a DERIVED zero — all 39 recorded an exit code and none of them is 3).
  • The edited script's own suite, node scripts/pm/check-skill-line-ratchet.mjs --self-test, passed 164 cases and exited 0. The plain run exited 0. No *.test.ts names the script.
  • Two roster families that read the ratchet are not in the derived list. Both were run anyway and exited 0: node scripts/check-published-list-mirrors.mjs and node scripts/check-skills-token-ratchet.mjs.
  • pnpm --filter @objectstack/lint run check:doc-formula-expressions first exited 3: PREREQUISITE NOT MET, because a fresh worktree had no dist/ for @objectstack/formula or @objectstack/lint.
    • Both were built under the verify lock (VERDICT command-exit 0) and the gate was re-run: exit 0. Nothing was measured on the first run, so it is not a finding.
  • What was not run, and why:
    • No package is touched, so there is no ① closure build and no ② package tests.
    • test:repo was not run locally. The diff edits no repo-project test and the derived list does not name it, which is the F1 rule applied to itself.
    • No ablation: the diff is agent text plus one ceiling number, and no tested behaviour changes.
  • CI runs the full farm on this PR. The seat's ACCEPT reads its check-runs.

Acceptance notes

  • The report JSON template in os-dev.md has no deviations key. Yet the ruled F1 line, two earlier os-dev.md lines and dispatch orders all name a deviations field. This is noted here and not filed: it is a consistency gap in agent text with no runtime face. 承接者:无.
  • The dev ran at TIER_DEFAULT under the claim's measured quota exemption. The at-tier contract review is still owed before landing.

维护者速读(草稿)

改了什么

  • 开发 agent 规则 os-dev.md 加两行:
    • 包的 test:repo(全仓扫描类测试)不算「本包自己的测试」,归 CI 跑。
    • 只有改了这类测试本身,或派生门禁清单点名它时,才在本地跑;否则在报告里写明。席位验收看 PR 上的 CI 结果。
  • 席位派发规则 execution-duties.md 加三行:
    • 声明要改 packages/spec/src/**、且至少还改另一个包的卡,算「build 重」,派云端独立容器,一卡一容器。
    • 一个容器同时最多跑一个这类开发 agent。云端会话用 turbo 远程缓存建依赖。
    • 第一张这样派出的卡要实测固定开销(装依赖 + 拉缓存),并记在卡上。
  • 行数上限:execution-duties.md 185 → 188(+3,按裁决授权抬升)。os-dev.md 正好用完原有余量 2 行,上限 402 不动。

为什么改

  • 执行你 10-15 对决策卡的「同意」(F1 A · F2 A)。
  • 实测:容器里共享验证锁 2 小时内被占 89%,三个开发 agent 累计排队约 3.5 小时。
  • 本地跑 test:repo 两次就占了 26%;另有三张要反复构建 spec 的重卡挤在同一个容器里。

风险与代价(含回滚)

  • test:repo 的失败会晚到 PR 的 CI 上才出现,大约多一个 CI 周期(中位约 23 分钟);换来的是本地每次少占锁 13–15 分钟。
  • 重卡走云端,每张多付一次装依赖与拉缓存的固定开销;首张实测后记卡。
  • 回滚:revert 本 PR 即可。只有规则文字和一个上限数字,不涉及代码,也不发布任何包。

席位意见

你要做的

  • 无需操作。本 PR 属 Tier S,由席位做完达档合约复核 PASS 后落地。

Generated by Claude Code

…e card is build-heavy and goes mode:cloud

os-dev.md 〈本地验证范围〉 item ② gains two lines: the affected package's
local tests exclude its `test:repo` (vitest `repo` project), which CI's
Test Core runs; a dev runs it locally only when the diff edits that
project's tests or the derived --commands list names it, else says so
in `deviations`, and the seat's ACCEPT reads its CI. 400 -> 402 lines,
inside the standing ceiling of 402.

execution-duties.md 〈派发〉 gains three lines beside the mode:cloud line:
a declared file surface writing packages/spec/src/** plus at least one
other package is build-heavy and dispatched mode:cloud, one container
per card; at most one build-heavy subagent per container; the cloud
session pulls the turbo remote cache for the closure; the first such
dispatch measures its fixed cost and records it on its card. Ceiling
185 -> 188, the measured delta, under the ruled-raise authorization.

Claude-Session: https://claude.ai/code/session_01VqGhCg9wdsBXPz54uAEWg7
Co-authored-by: Claude <noreply@anthropic.com>
@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

席位核对

Seat domain:skills#2 · session_01VqGhCg9wdsBXPz54uAEWg7 (os-elon-musk) · read 2026-10-15T12:48Z · head 4428e1746ad86d37069ae7b3dd838de4bc8cadd5 · verdict: ACCEPT (Tier S — lands on the seat only after an at-tier contract review PASS on this head)

Implemented-by: claude/issue-23607-test-repo-ci-heavy-cloud
Reviewed-by: session_01VqGhCg9wdsBXPz54uAEWg7

  1. Shape. Draft PR against main; body first line Fixes #23607, then Clause-②: no at line start, copied from claim 6191711722. The only closing keyword is that one; [Decision] The line ratchet (check:pm-skill-ratchet): 32 of 37 files at zero headroom, so a sentence already ruled still needs a second ruling to land — keep it, let the ordering ruling carry its lines, add slack, or narrow it #23606, pm-dispatch execution-duties: a split-off off-lane card does not inherit the parent's domain; ceiling 183 → 185 by ruling #23660 and feat(pm): line ratchet — a raise is authorized by the ordering ruling of record (id + measured delta in the PR body) #23668 are named with no verb beside them. Files are .claude/agents/os-dev.md (+2), references/execution-duties.md (+3) and scripts/pm/check-skill-line-ratchet.mjs (+21/−1, the execution-duties.md CEILINGS row and its comment block only), exactly the claimed surface.
  2. Ruling against the diff (Ruling-ref: 6184828752, F1 A · F2 A), read by the seat.
    • F1: the new os-dev.md pair, directly after item ②'s continuation lines, excludes a package's test:repo from item ② as CI's run. A dev runs it locally only when the diff edits that project's tests or the derived list names it; otherwise deviations says so, and the seat's ACCEPT reads its CI. Every clause of item 1 is present.
    • F2: three lines sit directly under the unchanged mode:cloud line:
      • the surface test (packages/spec/src/** plus at least one other package ⇒ build-heavy, mode:cloud, one container per card);
      • at most one build-heavy subagent per container, and the turbo remote cache for the closure;
      • the first such dispatch measures and records its fixed cost.
        Every clause of item 2 is present.
    • Item 3 holds (no os-verify-lock.sh or environment change).
  3. The dev's one wording deviation, verified by the seat on origin/main. The F1 line says Test Core runs test:repo on both PR and merge group, where the ruling's parenthetical says the merge group. .github/workflows/ci.yml L965 (pnpm turbo run test test:repo …) sits in the test: job named Test Core (L408, L494). Its if: (L501) carries no event exclusion, and the workflow triggers on pull_request (L33) and merge_group (L40), so the job runs on both, subject to its core/crosspkg path filter. The wording is accurate; accepted.
  4. Ratchet.
  5. Gates and out of scope.
    • Check-runs pinned to head 4428e1746a: 41 check-runs, 28 success, 11 skipped, 2 in_progress (Test Core (1/6), Lint · CI, release & engine gates).
    • The dev's local union covers 39 derived families, all exit 0, --ran 0 unrun.
    • Out-of-scope findings: none filed. The dev's Acceptance note is dropped — not a card (agent-text consistency, outside the three filing classes): os-dev.md's report JSON template carries no deviations key, while the new F1 line and two earlier lines name one. Carrier: this seat's shift brief, principle class.
  6. Landing.
    • At-tier contract review: OWED. The faces are .claude/agents/os-dev.md and references/execution-duties.md, at CONTRACT_REVIEW_TIER. That tier refused this session twice this shift (HTTP 429, the latest reported by 2026-10-15T12:41Z). The build ran at TIER_DEFAULT under the quota exemption, so the at-tier review is the compensating control and is not waived.
    • needs:contract-review stays until a PASS on this head. Then the pre-landing checks run (all check-runs green, check-governed-merges --pr 23676 Tier S), then pr_ready + automerge_enable.

Generated by Claude Code

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

Contract review

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: 4428e1746ad86d37069ae7b3dd838de4bc8cadd5
Local-runs: none
Scope: .claude/agents/os-dev.md, .claude/skills/pm-dispatch/references/execution-duties.md + scripts/pm/check-skill-line-ratchet.mjs, .github/workflows/ci.yml, turbo.json, packages/spec/package.json, scripts/pm/dispatch-gates.mjs, .claude/skills/pm-dispatch/SKILL.md

Inputs read: card #23607 body and all seven comments (director delta 6184678084, triage entry 6184799686, ruling of record 6184828752 with letters F1 A · F2 A on the maintainer's 「同意」, claim 6191711722, dispatch order 6191765315, os-dev-report 6192397780, ACCEPT 6192451825); PR #23676 body, its three-file list and the net diff against main (+26 / −1); the 47 check-runs on this head, 0 non-green (every run is success or skipped: Test Core and all six shards success, the eight Lint lanes success, every Type Check lane success, Governed Surface Queue Guard success, Check Changeset success). Isolated reviewer; the dispatching seat's conclusions were not an input. Nothing was built, run or re-run locally.

① Derived judgments

  1. F1 text, os-dev.md L138 and L139 (+2, 101 B and 119 B) — right. It carries ruling item 1 whole: a package's test:repo is excluded from item ②, it is CI's run, a dev runs it locally only when the diff edits that project's tests or the derived list names it, otherwise deviations says so, and the seat's ACCEPT reads the PR's CI. Items ①–③ are byte-identical; the two lines sit after ②'s continuation lines and before ③. The gloss "vitest repo 项目" is right: test:repo is vitest run --project repo in six packages (packages/spec/package.json L303 runs gen:migration-registry first).
  2. The F1 refinement 「PR 与 merge group 都跑」 against the ruling's parenthetical "on the merge group" — right, and measured here rather than taken from the PR: ci.yml on: lists pull_request (L33) and merge_group (L40); the Test Core shard job's if: (L501) carries no event exclusion, unlike the four full-battery jobs at L1648, L1987, L2214 and L2867 that exclude both events; L965 runs pnpm turbo run test test:repo $FILTERS; turbo.json declares per-package @objectstack/...#test:repo tasks with their own inputs, so a touched package's run on a PR is a real run and not a cache hit; and this head's own check-runs show Test Core (1/6) to (6/6) success on the pull_request event. The refinement is what makes the ruling's own clause "the seat's ACCEPT reads the PR's CI for that project" true, so it tightens the ruling and does not depart from it.
  3. The branch 「派生清单点名它时」 — right as the ruling's wording, verbatim from item 1; empty today: scripts/pm/dispatch-gates.mjs carries no test:repo literal and derives pnpm --filter PKG run check:... gate commands only. Harmless and future-proof; no change asked.
  4. F2 text, execution-duties.md L145 to L147 (+3, 112 B, 95 B, 79 B) — right. It carries ruling item 2's four parts: the test (a declared file surface writing packages/spec/src/** and at least one other package is build-heavy and goes mode:cloud, one card per container), the per-container limit (at most one build-heavy subagent at a time), the turbo remote cache pull for the closure, and the first such dispatch measuring its fixed cost (install plus cache pull) and recording it on its card. It sits directly after the mode:cloud line, which is L144 on main (the ruling's :142, moved by the two lines pm-dispatch execution-duties: a split-off off-lane card does not inherit the parent's domain; ceiling 183 → 185 by ruling #23660 inserted above it). Leaving 「build 重的 M 卡逐卡判」 in place is right: the ruled test is a sufficient condition (the card asked 「命中就走云卡」) and the residual stays a per-card call. Sibling text read for contradiction: SKILL.md L61 (cloud 只留 L/XL 等保留面) accommodates the new reserved face through 「等」; dispatch-runbook.md 〈云卡四课〉 and landing-operations.md L79 are unaffected; AGENTS.md names neither test:repo nor the cloud routing, so nothing that outranks these files conflicts.
  5. The ratchet row and the raise form — right. execution-duties.md is 188 lines on the head and its CEILINGS row moves 185 → 188, exactly the measured delta; it is the only row that moves in the diff (the reviewer's completeness check the ratchet header leaves to this record). os-dev.md is 402 lines against ceiling 402, so its row correctly does not move. Three lines are needed: the landed content is 286 B against a 240 B two-line ceiling at the 120-byte cap, so no two-line split fits; the dev's tightest-spelling figures (245 B one line; 137 B and 141 B for the two splits) are consistent with that. All five added lines are at or under 120 bytes. The PR body quotes ruling 6184828752 (letters F1 A · F2 A) and authorization 6184799323 letter B item 1 together with the measured delta, which is the form the ratchet header (L66 to L77 on the head, landed by feat(pm): line ratchet — a raise is authorized by the ordering ruling of record (id + measured delta in the PR body) #23668) names; the comment block above the row follows the 183 → 185 precedent block's shape (ORDINARY raise, not a cross-file move, ruling id, maintainer 「同意」 verbatim, measured bytes, the authorization, not a CROSS_FILE_MOVES destination, landed count headroom 0). One reading for the record: that header says the quote is "checked by the seat's contract-review record and by the queue guard's reader"; check-governed-queue-guard.mjs on origin/main carries no ratchet, delta or ceiling reader, so this record is the check that reads the quote. It is read, and it holds. That sentence is feat(pm): line ratchet — a raise is authorized by the ordering ruling of record (id + measured delta in the PR body) #23668's text, not this PR's.
  6. Ruling item 3 respected: scripts/pm/os-verify-lock.sh and the environment are untouched, the diff being three files. Item 4 is another seat's interim duty and is correctly not done here.
  7. Public surface — none, so no accept-set changes. The diff is agent text under .claude/**, one ceiling integer and a comment under scripts/pm/**; no packages/** file, no Zod or JSON schema, no export, no runtime string. The model: opus in the os-dev.md hunk header is pre-existing frontmatter context on main, not a change.
  8. Governance and attribution: Tier S by file list (.claude/**); head repo equals base repo, so not a fork proposal; the PR is draft with auto-merge unarmed and needs:contract-review on it; no seat has posted an approving review. The authoring commit carries AGENTS.md's model-free trailer pair (Claude-Session plus Co-authored-by: Claude); no model identifier appears in the commits, the PR title or body, the diff or the comments.

② Semver level

skip-changeset is right and Clause-②: no is right (PR body line 2, at line start, no arm). The diff publishes nothing: .claude/** and scripts/pm/** belong to no released package, and no package manifest, exports map, Zod schema or generated JSON schema moves. Check Changeset is success on this head.

③ Boundary flags

The dev's report carries five deviations, an empty open_questions, and one out_of_scope_findings entry. Each answered:

  • D1, the PR-versus-merge-group refinement — answered in ①.2: measured and correct; adopted.
  • D2, test:repo not run locally — correct: no package is touched, no repo-project test is edited, the derived list names none; the F1 rule applied to itself, and Test Core is green on this head.
  • D3, origin/main merged twice — fine: the net diff against main is three files, +26 / −1, mergeable clean; the second merge is what brought in feat(pm): line ratchet — a raise is authorized by the ordering ruling of record (id + measured delta in the PR body) #23668's raise form that the PR body follows.
  • D4, the harness attribution reminder versus AGENTS.md's trailer pair — the dev chose right: AGENTS.md L461 to L463 is the rule of record (model-free pair; the pre-push hook refuses a model identifier in it), and the commit carries exactly that pair.
  • D5, built at TIER_DEFAULT under the claim's quota exemption — this record is the compensating control the claim and the ACCEPT named; it is rendered at CONTRACT_REVIEW_TIER, which closes the flag.
  • Out-of-scope finding: os-dev.md's report JSON template (L361 to L377) has no deviations key while L60, L307, the new L139, execution-duties.md L128 and every dispatch order name a deviations field. Judged a note, not a card: the gap predates this PR (L60 and L307 are on main), it is agent-read text with no runtime face, and the template's own rule at L382 (「报告模板是工具,不是真相」) already licenses the field; so under Prime Directive chore: version packages #10 the acceptance note is the right carrier. Not blocking. Adding the key is a later edit inside os-dev.md's ratchet if the seat wants it.
  • No open_questions were raised and nothing needs escalation.

Implemented-by: claude/issue-23607-test-repo-ci-heavy-cloud
Reviewed-by: session_01VqGhCg9wdsBXPz54uAEWg7

VERDICT: PASS


Generated by Claude Code

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

Labels

documentation Improvements or additions to documentation size/s skip-changeset PR has no user-facing published change; bypasses the changeset gate

Projects

None yet

2 participants