Repository navigation
ci: a per-package suite-duration ratchet — a PR that makes a suite exceed its measured ceiling is red; ceilings rise only by ruling (maintainer-directed, growth constraint) #16468
Description
Activity
- addedpriority:p2Medium: important, M3Medium: important, M3
on Sep 7, 2026 Blocked-by: #16454
The per-file report is this card's input and both land in the shard test step; dispatched when W merges. Skills lane seat, 2026-09-07T02:5xZ.
Generated by Claude Code
- added a commit that references this issue
on Sep 17, 2026 objectstack-fleet commented
on Sep 23, 2026 ContributorMore actions串行条件已满足 —— 本卡的「等上游」今天为假,维护者确认保留并可取
分诊席(
session_01Tw7jnJinGHvoGSi8aFkhPJ),2026-09-23T02:44Z。本条是 devx 清理批的 B 组结论:维护者于 2026-09-23T02:44Z 就本组回「同意」,读作 ⛔ 不关、保留在队列、可取。为什么本卡不在那批清理里
它带维护者直授(卡面逐字):「同意你的建议,你负责执行派发所有可行的优化」。⇒ 它不是一张自发的工装卡,是那套长期计划的增长约束那一半。裁决 #202 B 的工装规则 ⛔ 不用于一张带直授的卡。
⭐ 新读数:卡面写的串行阻塞已经解除,而卡面没有对账
卡面「Serial」段逐字:「Blocked behind #16454 (W): the per-file report is its input and both land in the shard job's test step. Dispatched when W merges.」评论
5564351304也写着Blocked-by: #16454。实测(2026-09-23T02:44Z,
origin/main=e99a14ceae):读点 值 #16454 state=closed 它的产物在树上 .github/workflows/ci.yml:950——# ── Per-file test timings, captured for the aggregator (#16454) ───────⇒ 输入已经在了。 卡面那句「Dispatched when W merges」的条件今天成立,⛔ 读卡面会以为还在等。本条即为该行对账 —— 这是 #19256 记的那种失败模式(裁决落在评论里、卡面继续主张相反的事)的反向处理:先对账,再让人取。
业务读数,一并记上(取卡的人不必重推)
@objectstack/cli量到 458 s(2026-08-24T00:00Z);两周后承载它的分片量到 28m46s,而让它变慢的那些 PR 没有一个变红。- 测试文件 3,388 对源文件 2,183,日增 35–89 个。
- ⇒ CI 时长 = Actions 账单 + 每个人与每个 agent 的等待。今天没有任何东西在某个包变慢的那一刻报红,本卡装的就是那个刹车。
状态
pm:queue·priority:p2·domain:devx不变。⛔ 分诊 ⛔ 不认领、⛔ 不派发 —— 由domain:devx车道席按取卡全序取。
Generated by Claude Code
- added a commit that references this issue
on Sep 28, 2026 objectstack-fleet commented
on Oct 1, 2026 ContributorMore actionsDeferred at R2 dispatch, not shelved: known hazards ·
domain:devxseat 2 (session_01JAhu8u8QfBvRjVZDox7CP9) · 2026-10-01T04:08Z⛔ Not a claim, and no label changes. The card stays
pm:queueand any seat may take it in take order. This seat did not take it at R2 (marker5924530366) for the reasons below; whoever takes it should read them first.- The ceilings would be derived from a stale dataset. This card sets each package's ceiling at "the refreshed measurement plus headroom".
- On
origin/main8f784959cf,scripts/test-shard-timings.jsonstill records@objectstack/cliat 458.15 s. - The comment in
.github/workflows/ci.yml(about:888) cites 1231.52 s measured. - A ceiling built today would put the CLI at about 573 s, so every PR that runs the CLI suite would be red.
- The scheduled refresh's PR chore(ci): refresh the Test Core shard-timings dataset #20388 has been open and unmerged since 2026-09-28T05:43Z. Re-read the CLI row after it lands, before deriving any ceiling.
- On
- A sibling reader already exists. CI: the shard-timings file is stale for the CLI package — 672s predicted vs 28m46s measured against a 30-minute timeout, so Test Core shard 1/6 is one slow run from being killed on any PR touching the CLI #16173 left an unwired
--check-driftmode inscripts/partition-test-shards.mjsthat reads the same.turbo/runs/summary this card's check would read. Reuse its reader rather than writing a second one. - It is serial with ci: Test Core compares each shard's measured duration with its predicted weight — warning at 1.3x, red at 70% of the timeout (maintainer-directed, drift alarm) #16465 on the shard job's test step in
ci.yml. ci: Test Core compares each shard's measured duration with its predicted weight — warning at 1.3x, red at 70% of the timeout (maintainer-directed, drift alarm) #16465 is inpm:retriagebecause its thresholds conflict with that in-tree gate. Re-price this card once that ruling lands, against what it changed, using the card's re-pricing question: did ci: Test Core compares each shard's measured duration with its predicted weight — warning at 1.3x, red at 70% of the timeout (maintainer-directed, drift alarm) #16465 make this card simpler, harder, unnecessary, or leave it unaffected?
Generated by Claude Code
- The ceilings would be derived from a stale dataset. This card sets each package's ceiling at "the refreshed measurement plus headroom".
objectstack-fleet commented
on Oct 2, 2026 ContributorMore actionspm:queue→pm:blockedon the dataset refresh ·domain:devxseat 2 (session_01HRYqpqGcWpJuJkDmbRF75w) · 2026-10-02T22:01ZBlocked-by: #20388
- ⛔ Not a claim. The card has waited on PR chore(ci): refresh the Test Core shard-timings dataset #20388 since the R2 deferral note
5924551316. This transition writes that wait down as state, so no seat dispatches the card against the stale dataset. - This seat has now claimed PR chore(ci): refresh the Test Core shard-timings dataset #20388 as an ownerless blocker (claim
5962165078). A dev re-derives the partitioner's slice pins so the refreshed dataset can land. - Once chore(ci): refresh the Test Core shard-timings dataset #20388 merges, this card is still serial behind ci: Test Core compares each shard's measured duration with its predicted weight — warning at 1.3x, red at 70% of the timeout (maintainer-directed, drift alarm) #16465 on the Test Core shard step in
.github/workflows/ci.yml. At that point, re-price it with the card's question (simpler, harder, unnecessary, or unaffected), and re-read the CLI row from the landed dataset before deriving any ceiling (hazard 1 of the deferral note).
Labels in this act:
pm:queue→pm:blocked.tooling·priority:p2·domain:devxare unchanged.
Generated by Claude Code
- ⛔ Not a claim. The card has waited on PR chore(ci): refresh the Test Core shard-timings dataset #20388 since the R2 deferral note
objectstack-fleet commented
on Oct 4, 2026 ContributorMore actionsBlocked-by: #16465
Re-blocked ·
domain:devxseat 2 (session_01HRYqpqGcWpJuJkDmbRF75w) · 2026-10-04T14:51Z- Previous condition met:
Blocked-by: #20388(5962175214). chore(ci): refresh the Test Core shard-timings dataset #20388 merged asea7ff394b6at 2026-10-04T14:48Z; its landing record is5981245914. The body's earlier blocker ci: every Test Core run publishes the slowest test files and packages beside their pinned weights (maintainer-directed, part B measurement) #16454 is closedcompleted. - New blocker, re-derived rather than released by reflex: this card's ruling adds its ceiling check in the Test Core shard job of
.github/workflows/ci.yml. ci: Test Core compares each shard's measured duration with its predicted weight — warning at 1.3x, red at 70% of the timeout (maintainer-directed, drift alarm) #16465 edits the same job: its emit step and the aggregator's verify step. The lane's hot-file serial queue for that job is ci: Test Core compares each shard's measured duration with its predicted weight — warning at 1.3x, red at 70% of the timeout (maintainer-directed, drift alarm) #16465 then this card, so this card waits for ci: Test Core compares each shard's measured duration with its predicted weight — warning at 1.3x, red at 70% of the timeout (maintainer-directed, drift alarm) #16465 to close. - Merged PRs on this card since the block, read rather than counted:
- chore(ci): refresh the Test Core shard-timings dataset #20388 is the blocker itself.
- ci(test-core): retire the CLI's file-level slicing by the partitioner's own slice-count derivation #21487 delivers no part of this card; its body says "This PR binds no card". It records an input this card will read: "Spec is now the floor, at about 83% of its own breach point (about 1670s). ci: a per-package suite-duration ratchet — a PR that makes a suite exceed its measured ceiling is red; ceilings rise only by ruling (maintainer-directed, growth constraint) #16468's ceilings will read this number."
- Stays
pm:blocked.
Generated by Claude Code
- Previous condition met:
objectstack-fleet commented
on Oct 6, 2026 ContributorMore actionsBlocked-by: #22014
Re-blocked ·
domain:devxseat 2 (session_01VF48aw8RPG6wzDnMgp6rtw) · 2026-10-06T15:43Z- Previous condition met:
Blocked-by: #16465(5981267576). ci: Test Core compares each shard's measured duration with its predicted weight — warning at 1.3x, red at 70% of the timeout (maintainer-directed, drift alarm) #16465 landed as PR ci(test-core): wire the shard timing-drift check: red past 1.5x measured/predicted, warning past 1.3x #21998 →9c3bec0f4dand closedcompleted; landing record6019846983. The Test Core shard job inci.ymlis free: no open claim or PR holds it. - New blocker, re-derived rather than released by reflex: hazard 1 of
5924551316("the ceilings would be derived from a stale dataset") is live again, on a different package.scripts/test-shard-timings.jsonrests on ONE scheduled run (37262126122) and records@objectstack/specat 1134.86 s, so this card's ruled ceiling (+25%) would be 1418.6 s.- Executed spec windows since then read 1573.20–1651.04 s (1.39–1.45×), and objectql reads 1.29–1.38× against its +25% ceiling.
- A ratchet built today would red every PR that runs spec. That is a standing red, the shape that stopped ci: Test Core compares each shard's measured duration with its predicted weight — warning at 1.3x, red at 70% of the timeout (maintainer-directed, drift alarm) #16465 at round 55.
- Filed as finding(ci): the shard-timings dataset rests on ONE scheduled run, and records @objectstack/spec at 1134.86 s against 1573–1651 s executed — #16468's 25%-headroom ceilings built on it would red every PR that runs spec #22014 (bare for triage), with the readings and their sources.
- Re-price at unlock (the card's question): unaffected in shape, harder in its input. The ruling stands. Whoever takes this card re-reads spec's and objectql's weights from the landed dataset against executed windows before deriving any ceiling.
- Reuse, from
5924551316item 2:--check-drift's reader now runs in the shard job (PR ci(test-core): wire the shard timing-drift check: red past 1.5x measured/predicted, warning past 1.3x #21998). The ceiling check reads the same.turbo/runs/summaries. - Stays
pm:blocked; labels unchanged.
Generated by Claude Code
- Previous condition met:
- added a commit that references this issue
on Oct 7, 2026 18 remaining items
objectstack-fleet commented
on Oct 9, 2026 ContributorMore actionsRuling: batch #305 item 1 · letters Q1 A · Q2 B (an existing ceiling holds across refreshes; a new package is not red before its first ceiling) · maintainer 「同意」 2026-10-09T14:10Z
Director seat, summon #35,
session_01VYToj6PQehTEKNrjGM9akg(GitHubos-zhuang; written asobjectstack-fleet[bot]via the relay). Presented in batch #305 from thedomain:devxseat 1's second decision request (6082144903), after the ratchet ruled A (6079579826) was built and landed as PR #22480 →6abd265320(ACCEPT 6081431927, landing record 6082129294) and found two cases the first ruling did not reach: Q1 what a later refresh does to an existing ceiling (A hold it, set one only for a package with none; B shrink-only; C recompute each refresh); Q2 how a package absent from the dataset lands (A red until a ruled raise, as built; B "no ceiling: new package", not red until the first refresh after it lands). The seat recommended Q1 A and Q2 B; this seat recommended the same; the maintainer answered 「同意」. Thread-read: 6082144903. Freshness: body carries the firstRuled:line and nothing else changed; no comment since the presentation; labelstooling,priority:p2,needs-user-decision,domain:devx. Premises re-read onorigin/main35ef501e13:scripts/measure-test-shard-timings.mjs:205suiteCeilings({ ..., prior })and:187"A refresh NEVER raises a ceiling" (the hold, as built);scripts/check-test-suite-ceilings.mjs:129RULED_CEILING_RAISESis empty and:31–:33make a ruled raise the only entry for an absent package (the deadlock, as built);scripts/test-shard-timings.jsoncarries noceilingsyet, so the check reads NOT MEASURED; the refresh is scheduled Mondays 05:30 UTC (shard-timings-refresh.yml:164); the false-red reading after the window: 108 readings, 0 over, nearest 0.98 and 0.97.The ruling
Q1 A — an existing ceiling holds across refreshes. A refresh never raises and never lowers a ceiling it already holds; it sets one only for a package that has none. A ceiling moves in either direction only by a ruling recorded in
RULED_CEILING_RAISES(a lowering is a ruled entry too, so a measured speedup can be locked in when someone asks). This is the as-built behaviour; no code changes. ⛔ Not taken: B (a quiet window tightens the line into ordinary variance;plugin-approvalsread 1.23× its window maximum within a day), C (growth under 25% a week compounds unchecked, against "rises only by a ruling").Q2 B — a new package is not red before its first ceiling. A package absent from the dataset prints "no ceiling: new package" and is not red; the first refresh after it lands gives it a ceiling under the ruled formula. Clause 3 of the card ("red, not skipped, until the next refresh gives it one") is read with its own parenthesis: a new package reaches the next refresh only by landing, so the red there is lifted; a package the dataset knows but that lost its row is a different case and stays red. One-line change in
check-test-suite-ceilings.mjs, dispatched by the devx lane's next seat. ⛔ Not taken: Q2 A (a ruling per new or renamed package, a lane-wide deadlock on every PR that adds a package).Order: the first refresh's PR (the first
ceilingstable) merges only after the Q2 change has landed, so the table cannot deadlock a lane.Prior rulings read: 6079579826 (this card, A: the formula and the provisional handling, unchanged here); the card's clauses 1–3 (2026-09-07 authority); PR #22480 (the ratchet as built, its ablations and its false-red measurement); #22075 (the CLI slicing, summed across shards). 自检: 只看①选 A / B;②③④ 是否翻转:否。置信缺口:Q1 A 下提速不自动锁住,靠裁定下调;Q2 B 下一个新包最长一周没有刹车(到下一个周一的刷新)。
State
needs-user-decision→pm:queue(domain:devx,priority:p2,tooling) in this act; a secondRuled:line added above the first. The devx lane's next seat dispatches the one-line Q2 change; the first refresh's PR waits for it.
Generated by Claude Code
- added and removed
on Oct 9, 2026 objectstack-fleet commented
on Oct 9, 2026 ContributorMore actionsClaim: PM loop round 1
Session:session_01LYXc6ckoWuZyVZpWYizdMh
Account:os-bill(the seat's linked user asGET /useranswers it; the card's assignee from this act)
Branch:claude/issue-16468-new-package-not-red
Worktree:objectstack-issue-16468
Domain:domain:devx
Seat:domain:devx#1
File surface:- The check.
scripts/check-test-suite-ceilings.mjs: a package absent from the dataset prints "no ceiling: new package" and is not red (ruling Q2 B). The header prose, theRULED_CEILING_RAISEScomment and the red-reason text that state the old rule change with it. Its self-test battery for the absent case is inverted to bear the new meaning. - Prose only. The comment above the suite-ceiling step in
.github/workflows/ci.yml("a package absent from the dataset is red"), and any other sentence the dev's sweep finds stating that rule, listed in the PR body. - ⛔ No code change in
scripts/measure-test-shard-timings.mjs(Q1 A is the as-built behaviour). ⛔scripts/test-shard-timings.json,shard-timings-refresh.yml,scripts/partition-test-shards.mjsand ci(test-shards): the shard balance is derived on full-run sums while PR and merge_group runs use the affected set — the CLI shard (1/6) measures 34–36 min against 10–20 for the others and sets CI and queue wall time #22075's split are untouched. - (Stop on breach; explain in the report.)
Container & model:M(a one-line semantic change with a pin inversion; the judgment is in the semantics, not in a gate),mode:subagent,model: opus — the default tier; dispatch-gates --tier: "no path-derived mandate"
Clause-②: no
Responsibility:n/a — not a defect card (maintainer-directed growth constraint, ruled follow-up)
Ruling-ref:6082629070(batch 🔗 Broken links detected in documentation #305 item 1, letters Q1 A · Q2 B)
Thread-read: 6082629070
Serial constraints cleared:no open PR touches scripts/check-test-suite-ceilings.mjs or .github/workflows/ci.yml (the file lists of all 8 open PRs were read by git diff against their merge bases). #22075 (this seat, pm:blocked) has nothing in flight; its possible slice-count follow-up waits behind this card. #22085 (seat 2) holds no code surface. Dispatch is serial, on the maintainer's word in this session's chat: 「串行派发」— read at 2026-10-09T14:22Z
Labels in this act:
pm:queue→pm:dispatched; assigneeos-bill.- The check.
objectstack-fleet commented
on Oct 9, 2026 ContributorMore actionsos-dev-report
{
"issue": 16468,
"status": "done",
"branch": "claude/issue-16468-new-package-not-red",
"pr": "#22498",
"session": "session_01LYXc6ckoWuZyVZpWYizdMh (subagent: the parent's id; container CLAUDE_CODE_REMOTE_SESSION_ID matches)",
"premise_still_valid": true,
"summary": "Ruling Q2 B is implemented in scripts/check-test-suite-ceilings.mjs. A package absent from the dataset with no ruled entry now gets row statusnew. It prints-- no ceiling: new package (not in scripts/test-shard-timings.json; the first refresh after it lands enters it)and is not red, because RED_STATUSES is now {over} alone. Assumption 2 holds only in part. The weight-without-row refusal is the lost-row case, as the PM expected. A second shape was NOT refused: a ceiling,uncappedreason orprovisionalmark that names a package with no weight. As built it gradedabsent(red); a bare Q2 change would have graded it new and passed, ignoring a held ceiling. readCeilingTable now refuses it too. The generator cannot write that shape (suiteCeilings iteratespackages, and provisional is a subset of packages), so only a hand edit reaches it. The generator's own drop path (a held ceiling dropped with its weight) is closed by the refresh lane for any package still in the workspace: coverageReportlost, then exit 1 with no PR. Assumption 6 measured yes: a ruled entry still gives a new package a ceiling, and 31 s against a ruled 30 s reads over, exit 1. Q1 A as built: the effective ceiling is max(generated, ruled entry), so an entry below the generated ceiling lowers nothing and the verdict tells the author to delete it as stale. The ruling's 'a lowering is a ruled entry too' therefore has no as-built mechanism; nothing about lowering was changed. ci.yml lines 1462-1463 (comment only) now state the ruled rule. A tree-wide sweep found no other sentence stating the old rule.",
"tests": "At HEAD 791aaf5:node scripts/check-test-suite-ceilings.mjs --self-testexit 0, 'self-test OK (42 cases across 7 batteries)' (base 35ef501: 35 across 7). Battery 'a package absent from the dataset is red; an uncapped one is not' (floor 4) is inverted to 'a new package prints "no ceiling: new package" and is not red; a known one that lost its row is refused' (floor 10). Its cases: status new + exit 0 + verdict OK; the exact text 'brand-new: 5.00s -- no ceiling: new package'; beside an over package only that one is red and annotated; alone it reads NOT MEASURED, exit 0; the uncapped half is kept (2 cases); 4 lost-row refusals (weight without ceiling or reason; ceiling, uncapped reason or provisional mark without weight). The raise battery goes from 7 to 8 cases with 'a new package over its ruled ceiling is red'.node scripts/measure-test-shard-timings.mjs --self-testexit 0 'self-test OK' (unchanged). Ablations, after the fix was committed at 791aaf5, via scripts/ablation-replace.mjs: each anchor hit x1, the blob changed on disk, and the restore was proven as blob == HEAD 570a0ceaa046 with git diff HEAD empty. No build leg (root scripts, no dist). Leg 1, the PM's (RED_STATUSES gets 'new'): exit 1 via a TypeError (r.ceiling null) in the red renderer, inside the inverted battery's first case. Leg 1b (as leg 1, with the red detail and annotation filtered to rows with a ceiling): exit 1 by the pin's own assertion 'new: exit 1, verdict OVER, new'. Leg 2 (weightless refusal off): exit 1 'lost row: a ceiling with no weight was graded as new (null)'. Leg 2b (provisional dropped from the set): exit 1 on the provisional case. Leg 2c (uncapped dropped): exit 1 on the uncapped case. Leg 3 (text reverted): exit 1 'new: the line is wrong'. Probe: a first table built by the generator's suiteCeilings over the live dataset (72 weights, 71 ceilings, 1 uncapped provisional) passes readCeilingTable, and a new package graded against it prints the new line, exit 0. Lint, a proven narrowing: eslint --print-config resolves 2 rules for the script, with no parserOptions.project or projectService, and the files glob excludes .yml; eslint --no-inline-config --format json read 1 file, 0 errors, 0 warnings; with no type-aware linting the diff cannot move other files. Control-byte self-scan: no hits.",
"mcp_calls": "0",
"api_writes": "3 relay strokes, each a POST /repos/objectstack-ai/objectstack/dispatches executed as objectstack-fleet[bot]. (1) pr_create, run 37948097639: POST /repos/objectstack-ai/objectstack/pulls; draft #22498; body read back identical, 10042 chars. (2) label-write, run 37948207388: POST /issues/22498/labels (skip-changeset) and POST /issues/22498/assignees (os-bill); read back matches (ci/cd, size/m, skip-changeset; os-bill). (3) post-stamped: POST /issues/16468/comments (this report). git push is not REST. Reads: gh api GET on the card, its comments, the PR and its check-runs.",
"open_questions": [],
"out_of_scope_findings": [
"carrier: 承接者:无 · noted, not filed (Acceptance notes of PR #22498 only). A refresh run by hand with the generator's documented provenance.refresh command has no coverage check, so it can drop a still-existing package's held ceiling with its weight. That package then grades as new, and the next refresh sets a fresh ceiling. The lane workflow refuses this (select-shard-timings-run coverageReport lost, then exit 1), and it is unexercised."
],
"gates": {
"head": "791aaf55",
"derivation": "node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack (no paths; change set 2 paths vs merge base 35ef501): 58 commands",
"results": "53 foreground exit 0 + pnpm check:pm-dispatch-gates exit 0 (run detached per its header; log verdict line '✓ dispatch-gates self-test: 2011 cases pass.', 1377.4s, no lifecycle failure line) = 54 run",
"not_measured": [
"pnpm check:dts-closure :: exit 3",
"pnpm check:dual-build-cjs-loads :: exit 3",
"pnpm check:lean-entry-closure :: exit 3",
"pnpm check:sourcemap-no-sources-content :: exit 3"
],
"not_measured_reason": "PREREQUISITE NOT MET: they read built dist/. Declared narrowing: none of the four reads ci.yml (only doc comments name it), the diff touches no package files[], and the shared turbo cache is cold. CI runs them in Build Core.",
"extra": [
"node scripts/measure-test-shard-timings.mjs --self-test :: exit 0"
],
"ran_reconciliation": "✓ dispatch-gates --ran: 58 derived famil(ies) accounted for — 54 run, 4 NOT-MEASURED (4 DERIVED from a recorded exit 3); 0 UNRUN",
"ci": "in_progress at report time (one read of 791aaf5: 34 check runs, 15 success, 5 skipped, 14 in_progress); not awaited"
},
"line_budget": {
"changed_lines": 165,
"additions": 124,
"deletions": 41,
"human_merge_threshold": "3000 on origin/main e148ca9 (5000 at base 35ef501)",
"verdict": "under",
"skills_readings": "n/a (no skills/** path)"
},
"deviations": [
"Beyond the one-line change: readCeilingTable also refuses a ceiling, uncapped reason or provisional mark with no weight. This is needed so the ruling's 'lost its row stays red' holds; without it that as-built red shape becomes 'no ceiling: new package'. It is inside the claimed file.",
"The PM's ablation (leg 1) turned the battery red by a TypeError, not by the pin's assertion. Leg 1b was added so the inverted assertion itself is shown failing.",
"The row status was renamed absent to new; the PM route allowed either.",
"Four dist-reading gates are NOT MEASURED, as a declared narrowing (gates.not_measured_reason).",
"pnpm check:pm-dispatch-gates exit status was read from its log (verdict line, no ELIFECYCLE line) via the header-prescribed nohup invocation, not a captured $?.",
"Commit trailers use the AGENTS.md model-free pair, not the harness reminder's model-named Co-Authored-By. The PR footer is the AGENTS.md session-URL form, not the harness reminder's form.",
"PR body line 1 is 'Fixes #16468' as dispatched, so merging closes the card; the ruling's order (first refresh PR after this) is satisfied by this landing first."
],
"files_changed": [
".github/workflows/ci.yml (+3/-1, comment above 'Check the per-package suite-duration ceilings' only)",
"scripts/check-test-suite-ceilings.mjs (+121/-40)"
]
}objectstack-fleet commented
on Oct 9, 2026 ContributorMore actionsACCEPT — PR #22498 (head
791aaf55) · 2026-10-09T15:03ZReviewed by
domain:devxseat 1 ·os-bill·session_01LYXc6ckoWuZyVZpWYizdMh, against GitHub andorigin/main, not the report (os-dev-reporton this card). Claim:6082833475. Ruling-ref:6082629070.Checklist:
- Draft, base
main. Line 1 isFixes #16468, line 2 isClause-②: no. A full body scan finds exactly one closing keyword, beside this card. - 2 files, +124/−41, inside the claim surface:
scripts/check-test-suite-ceilings.mjs, and.github/workflows/ci.ymlas a comment-only hunk (3+/1−, no step change).measure-test-shard-timings.mjs,test-shard-timings.json,shard-timings-refresh.ymlandpartition-test-shards.mjsare untouched. - Not governed (
check-governed-merges --pr 22498: NOT governed, 165 changed lines).skip-changesetis correct: root script plus a workflow comment, nothing published.
The ruling, as built (read in the diff):
- Q2 B: a package absent from the dataset with no ruled entry gets status
new, prints "no ceiling: new package (…)", and is not red.RED_STATUSESis{over}. The red header, detail and annotation lose their no-ceiling branch. - "A package the dataset knows but that lost its row stays red": the weight-without-row refusal stands, and the PR adds its mirror. A ceiling,
uncappedreason orprovisionalmark that names a package with no weight is now refused. Without that, the shape that gradedabsent(red) as built would have read as new (not red). The seat checked the blast radius onorigin/main.buildDatasetbuildspackagesfrom executed ∪ carried.provisionalPackagesdraws only from those two sets.suiteCeilingsiteratespackages. So the generator cannot write the refused shape, and the refusal is not a lane-wide red risk. - Q1 A: no code, as ruled.
- The header, the exit-code table, the status table, the
RULED_CEILING_RAISEScomment and theci.ymlcomment all state the ruled rule.
Re-run by the seat at
791aaf55(a detached review worktree):check-test-suite-ceilings --self-test: "self-test OK (42 cases across 7 batteries)".measure-test-shard-timings --self-test: "self-test OK".- The seat's ablation (
'new'put back intoRED_STATUSES): exit 1 (aTypeErrorin the red renderer, as the dev's leg 1 reports; the dev's leg 1b shows the pin's own assertion failing). Restored clean.
Assumption 6, measured by the dev and pinned: a ruled entry still gives a new package a ceiling, and 31 s against a ruled 30 s reads
over, exit 1.Recorded, not filed:
- The ruling's parenthetical "a lowering is a ruled entry too" has no as-built mechanism. The effective ceiling is
max(generated, entry), so an entry below the generated ceiling lowers nothing and is reported stale. Nobody is asking for a lowering today. The parenthetical needs a code change on the day someone does. Noted for the director's ledger; no card (zero pull). - PR Acceptance notes: a hand-run refresh (
provenance.refresh) has no coverage check, so it could drop a still-existing package's held ceiling. The refresh lane refuses that (coverageReportlost, then exit 1). The path is unexercised. → Acceptance notes.
CI at
791aaf55, read at this act: 35 check runs; 24success, 5 skipped, 6in_progress(Lint & Repo GatesandTest Core (1/6)among them). ⛔ Not ready yet: the seat flipspr_ready+automerge_enableonceLint & Repo Gates,TypeScript Type Checkand every other check read green or expected-skip on this head.Order: this landing comes before the first
shard-timings-refreshPR, as the ruling orders. The next Monday 05:30 UTC run writes the firstceilingstable.- Draft, base
objectstack-fleet commented
on Oct 9, 2026 ContributorMore actionsLanded: PR #22498 →
535c0199cb· 2026-10-09T16:13Zdomain:devxseat 1 ·os-bill·session_01LYXc6ckoWuZyVZpWYizdMh. Verified onorigin/mainby content.- Merged through the merge queue at 2026-10-09T16:13Z. The merge commit
535c0199cbis an ancestor oforigin/main. - Both touched paths on
mainare blob-identical to the ACCEPTed head791aaf55(ACCEPT6083541859):scripts/check-test-suite-ceilings.mjs(570a0ceaa0) and.github/workflows/ci.yml(dd5c2189de). - Ruling
6082629070is now onmain. Q2 B: a package absent from the dataset prints "no ceiling: new package" and is not red. A package the dataset knows that lost its row is refused. Q1 A is unchanged, as built. - The ruled order holds. This landed before any
shard-timings-refreshPR, so the firstceilingstable (written by the next Monday 05:30 UTC run) cannot deadlock a lane. - Closing-keyword check: PR ci(suite-ceilings): a new package is not red before its first ceiling #22498's body carries one keyword (
Fixes #16468), so this card closedcompletedand no other card did. - The card's whole scope is delivered: part 1 PR ci: a per-package suite-duration ratchet — Test Core reds a suite over its measured ceiling #22480 →
6abd265320, part 2 this PR. The check stays NOT MEASURED until the first refresh writesceilings. A persistent NOT MEASURED after that run is a defect the step itself flags.
Labels in this act:
pm:dispatchedremoved (the card closed with it on).tooling·priority:p2·domain:devxstay.- Merged through the merge queue at 2026-10-09T16:13Z. The merge commit
Ruled: 6082629070 · letters Q1 A · Q2 B · 2026-10-09T14:11Z
Ruled: 6079579826 · letter A (window maximum × 1.25; provisional not red) · 2026-10-09T11:02Z
Filed by the skills lane seat (session
session_019RfFHiRCSs3JXLK4cwcfox, os-steve) on the maintainer's direction, 2026-09-07T02:5xZ. Surface owner staysdomain:devx.Authority (maintainer, verbatim, live PM chat 2026-09-07): 「同意你的建议,你负责执行派发所有可行的优化」. This card is the growth constraint of the long-term plan.
What
A per-package suite-duration ratchet: each package's measured
testduration has a ceiling (the refreshed measurement plus headroom), a PR that makes a suite exceed it is red, and a ceiling is raised only by a ruling — the same rule the line and token ratchets already apply to the skill corpus.Measured
@objectstack/climeasured 458 s on 2026-08-24; the shard carrying it measured 28m46s two weeks later; nothing turned red on the PRs that made it slower. Test files grow by 35–89 a day (3,388 against 2,183 source files).Ruling
ruledRaises-style record with a ruling reference raises a ceiling.Serial
Blocked behind #16454 (W): the per-file report is its input and both land in the shard job's test step. Dispatched when W merges.
Refs #16173.
Generated by Claude Code