Skip to content

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

@claude

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 stays domain: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 test duration 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

Ruling

  1. Ceilings live beside the timings file as a generated table (package → seconds), refreshed with it; headroom 25% over the refreshed measurement.
  2. The check reads the shard's turbo summary after the tests run and reds when a package's duration exceeds its ceiling, naming the package and the slowest files from the per-file report; a ruledRaises-style record with a ruling reference raises a ceiling.
  3. A package with no ceiling row (new package) is red, not skipped, until the next refresh gives it one (the H8 shape).

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

Activity

  1. claude commented on Sep 7, 2026

    @claude
    ContributorAuthor

    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

  2. objectstack-fleet commented on Sep 23, 2026

    @objectstack-fleet
    Contributor

    串行条件已满足 —— 本卡的「等上游」今天为假,维护者确认保留并可取

    分诊席(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

  3. objectstack-fleet commented on Oct 1, 2026

    @objectstack-fleet
    Contributor

    Deferred at R2 dispatch, not shelved: known hazards · domain:devx seat 2 (session_01JAhu8u8QfBvRjVZDox7CP9) · 2026-10-01T04:08Z

    ⛔ Not a claim, and no label changes. The card stays pm:queue and any seat may take it in take order. This seat did not take it at R2 (marker 5924530366) for the reasons below; whoever takes it should read them first.

    1. The ceilings would be derived from a stale dataset. This card sets each package's ceiling at "the refreshed measurement plus headroom".
      • On origin/main 8f784959cf, scripts/test-shard-timings.json still records @objectstack/cli at 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.
    2. 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-drift mode in scripts/partition-test-shards.mjs that reads the same .turbo/runs/ summary this card's check would read. Reuse its reader rather than writing a second one.
    3. 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 in pm:retriage because 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

  4. objectstack-fleet commented on Oct 2, 2026

    @objectstack-fleet
    Contributor

    pm:queue → pm:blocked on the dataset refresh · domain:devx seat 2 (session_01HRYqpqGcWpJuJkDmbRF75w) · 2026-10-02T22:01Z

    Blocked-by: #20388

    Labels in this act: pm:queue → pm:blocked. tooling · priority:p2 · domain:devx are unchanged.


    Generated by Claude Code

  5. objectstack-fleet commented on Oct 4, 2026

    @objectstack-fleet
    Contributor

    Blocked-by: #16465

    Re-blocked · domain:devx seat 2 (session_01HRYqpqGcWpJuJkDmbRF75w) · 2026-10-04T14:51Z


    Generated by Claude Code

  6. objectstack-fleet commented on Oct 6, 2026

    @objectstack-fleet
    Contributor

    Blocked-by: #22014

    Re-blocked · domain:devx seat 2 (session_01VF48aw8RPG6wzDnMgp6rtw) · 2026-10-06T15:43Z


    Generated by Claude Code

  7. 18 remaining items

  8. objectstack-fleet commented on Oct 9, 2026

    @objectstack-fleet
    Contributor

    Ruling: 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 (GitHub os-zhuang; written as objectstack-fleet[bot] via the relay). Presented in batch #305 from the domain:devx seat 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 first Ruled: line and nothing else changed; no comment since the presentation; labels tooling, priority:p2, needs-user-decision, domain:devx. Premises re-read on origin/main 35ef501e13: scripts/measure-test-shard-timings.mjs:205 suiteCeilings({ ..., prior }) and :187 "A refresh NEVER raises a ceiling" (the hold, as built); scripts/check-test-suite-ceilings.mjs:129 RULED_CEILING_RAISES is empty and :31–:33 make a ruled raise the only entry for an absent package (the deadlock, as built); scripts/test-shard-timings.json carries no ceilings yet, 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-approvals read 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 ceilings table) 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 second Ruled: 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

  9. objectstack-fleet commented on Oct 9, 2026

    @objectstack-fleet
    Contributor

    Claim: PM loop round 1
    Session: session_01LYXc6ckoWuZyVZpWYizdMh
    Account: os-bill (the seat's linked user as GET /user answers 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, the RULED_CEILING_RAISES comment 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.mjs and 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; assignee os-bill.

  10. objectstack-fleet commented on Oct 9, 2026

    @objectstack-fleet
    Contributor

    os-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 status new. 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, uncapped reason or provisional mark that names a package with no weight. As built it graded absent (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 iterates packages, 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: coverageReport lost, 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-test exit 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-test exit 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)"
    ]
    }

  11. objectstack-fleet commented on Oct 9, 2026

    @objectstack-fleet
    Contributor

    ACCEPT — PR #22498 (head 791aaf55) · 2026-10-09T15:03Z

    Reviewed by domain:devx seat 1 · os-bill · session_01LYXc6ckoWuZyVZpWYizdMh, against GitHub and origin/main, not the report (os-dev-report on this card). Claim: 6082833475. Ruling-ref: 6082629070.

    Checklist:

    • Draft, base main. Line 1 is Fixes #16468, line 2 is Clause-②: 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.yml as a comment-only hunk (3+/1−, no step change). measure-test-shard-timings.mjs, test-shard-timings.json, shard-timings-refresh.yml and partition-test-shards.mjs are untouched.
    • Not governed (check-governed-merges --pr 22498: NOT governed, 165 changed lines). skip-changeset is 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_STATUSES is {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, uncapped reason or provisional mark that names a package with no weight is now refused. Without that, the shape that graded absent (red) as built would have read as new (not red). The seat checked the blast radius on origin/main. buildDataset builds packages from executed ∪ carried. provisionalPackages draws only from those two sets. suiteCeilings iterates packages. 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_RAISES comment and the ci.yml comment 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 into RED_STATUSES): exit 1 (a TypeError in 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 (coverageReport lost, then exit 1). The path is unexercised. → Acceptance notes.

    CI at 791aaf55, read at this act: 35 check runs; 24 success, 5 skipped, 6 in_progress (Lint & Repo Gates and Test Core (1/6) among them). ⛔ Not ready yet: the seat flips pr_ready + automerge_enable once Lint & Repo Gates, TypeScript Type Check and every other check read green or expected-skip on this head.

    Order: this landing comes before the first shard-timings-refresh PR, as the ruling orders. The next Monday 05:30 UTC run writes the first ceilings table.

  12. objectstack-fleet commented on Oct 9, 2026

    @objectstack-fleet
    Contributor

    Landed: PR #22498 → 535c0199cb · 2026-10-09T16:13Z

    domain:devx seat 1 · os-bill · session_01LYXc6ckoWuZyVZpWYizdMh. Verified on origin/main by content.

    • Merged through the merge queue at 2026-10-09T16:13Z. The merge commit 535c0199cb is an ancestor of origin/main.
    • Both touched paths on main are blob-identical to the ACCEPTed head 791aaf55 (ACCEPT 6083541859): scripts/check-test-suite-ceilings.mjs (570a0ceaa0) and .github/workflows/ci.yml (dd5c2189de).
    • Ruling 6082629070 is now on main. 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-refresh PR, so the first ceilings table (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 closed completed and 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 writes ceilings. A persistent NOT MEASURED after that run is a defect the step itself flags.

    Labels in this act: pm:dispatched removed (the card closed with it on). tooling · priority:p2 · domain:devx stay.

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

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions