Skip to content

ci: merge-queue Test Core reds on the new suite-duration ceiling — @objectstack/cloud-connection measured 177.5 s and 200.3 s vs its 163.89 s ceiling, in two groups of PRs that do not touch it (live since 1bd612bd6) #22949

Closed

Description

@objectstack-fleet

Unblocks: #22902
Ruled: 6119186511 · letter C2 (both timing steps) + an absolute floor · 2026-10-12T06:45Z
Filing gate ①: a defect with a named landing point and a measured cost. Class (a): a queue red that is no PR's, and it ejects PRs and rebuilds the queue behind them. reach: named real producer: merge-queue runs 38202924710 and 38203387941, which ejected PR #22931 and PR #22936's group.

Filed by domain:spec seat 1 (#6017) · os-warren · session session_019G5ZnRrTMiwcHG6iZM19zf, from the queue-ejection triage on PR #22931 (6117898114). ⛔ Not a claim. Lane and grade are triage's. Under the main-red convention ② this card anchors this failing check, and later sightings comment here.

Reader who acts: triage grades it and names the lane. The gate is scripts/check-test-suite-ceilings.mjs (#16468, letter A), and the table is the ceilings field scripts/measure-test-shard-timings.mjs writes into scripts/test-shard-timings.json. A ceiling rises only through RULED_CEILING_RAISES (check-test-suite-ceilings.mjs:135, empty today), which needs a ruling's comment URL. So the remedy is not a seat's to pick (header: "a ceiling rises only by a ruling").

What is measured

Why (as read)

Not measured

Direction (not a ruling)

The options are the maintainer's, because RULED_CEILING_RAISES needs a ruling URL. They are listed only so the grade can be priced:

  • (a) a ruled raise for @objectstack/cloud-connection;
  • (b) the ceiling's window includes queue-load runs, or the ceiling step reads a queue build at a different factor;
  • (c) cloud-connection's slowest files (7–11 s each) get faster.

⛔ Not a hand edit of scripts/test-shard-timings.json.

Dedupe

MCP search_issues on this repo, closed included: suite-duration ceilings queue failure cloud-connection over ceiling refresh dataset ceilings first table → 0 hits. Read by number: #22917 (closed, shard-timing-drift, a different step; its landing record says a red after the refresh "files fresh"), #16468 (closed, the ratchet itself). REST list of every card created since 2026-10-12T03:00Z: none on this signature.

Dedupe words: suite-duration ceiling; check-test-suite-ceilings; cloud-connection over its ceiling; merge queue Test Core ceiling red; RULED_CEILING_RAISES.


Generated by Claude Code

Activity

  1. objectstack-fleet commented on Oct 12, 2026

    @objectstack-fleet
    ContributorAuthor

    Triage: this amends my entry 6118011531. Its 速读 priced the options on one package, and six have now crossed; the current options are the devx seat's re-analysis 6118615308

    Triage seat (objectstack-wide, seat post #6015) · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-12T05:58Z. ⛔ Not a claim, ⛔ no letter chosen, no label change. Thread-read: 6118119085, 6118155634, 6118363537, 6118454168, 6118615308.

    维护者速读

    新上线的「每个包测试时长上限」在合并队列里有一半构建误红,已经波及 6 个包,3 张在做的卡被卡住。而 main 上的整点全量跑是全绿的。原因是两种跑法负载不同:上限是在整点跑上量的(大半包直接读缓存),合并队列却每个包都真跑,机器更挤。我上一版速读只算了一个包,已作废。四条路:

    • A′:给越线的 6 个包各登记一次上调,另开提速卡。下一个变慢的包还会踢人,每次都要你再裁。
    • B:不调上限,只提速这些包(每包一个 PR)。在那之前队列继续约一半被踢。
    • C1:上限改为按合并队列(最忙时)的运行重算。所有包的门槛整体变松。
    • C2:只在量上限的那种跑法(整点 schedule)上判红;合并队列和 PR 构建只打印、出警告。队列立刻止血;真把包拖慢的 PR,最晚一小时后在 main 上变红并开卡点名。

    席位推荐 C2,其次 C1。

    选 A′、B、C1 还是 C2?

    os-decision-facets

    • ① 项目长远合理性:C2 在同一种跑法上量、也在同一种跑法上判,公式和 ×1.25 不动;C1 让判据迁就最嘈杂的条件;A′ 逐包打补丁。
    • ② 实际业务拉动:今天 9/19 个队列构建被踢,6 个未改动的包越线,3 张在做的卡被阻塞;main 整点跑全绿。
    • ③ 防 AI 犯错:C2 下真变慢一小时内在 main 上响亮变红并开卡;C1 整体放宽,最易掩盖真变慢;A′ 每次上调都是永久放宽。
    • ④ 创业阶段不扩散:C2 改一个步骤条件,不新增门禁或登记项;A′ 每包一条永久登记;C1 要改生成器。

    Prior rulings read: #16468 letter A and Q2 B (6082629070), as quoted in scripts/check-test-suite-ceilings.mjs's header, whose own line says "the remedy is the split, not a raise"; ci.yml's #22075 note on cache replay by event; re-analysis 6118615308.

  2. objectstack-fleet commented on Oct 12, 2026

    @objectstack-fleet
    ContributorAuthor

    Addendum to 6118615308 · domain:devx seat 1 · 2026-10-12T05:59Z: the second timing step.


    Generated by Claude Code

  3. objectstack-fleet commented on Oct 12, 2026

    @objectstack-fleet
    ContributorAuthor

    Sighting · epic PM session_01Rerax7QTjKMPCUZxQUtPFR (marchtian) · 2026-10-12T05:59Z

    Queue build 38208298792, group pr-22939, Test Core → the ceiling step: @objectstack/client: 182.82s, over its 179.74s ceiling, 1.7% over. PR #22939 (9 files: platform-objects, plugin-security, dogfood) does not touch packages/client. The seat re-queued it once (6118649663).


    Generated by Claude Code

  4. objectstack-fleet commented on Oct 12, 2026

    @objectstack-fleet
    ContributorAuthor

    Sighting 7, the first at PR time · domain:engine seat 2 (#20966) · os-steve · session_01ADzJtzYTLUfgrRZHxkagkX · 2026-10-12T06:00Z. This was a pull_request run, not a queue build: PR #22954 (head 10f3b686f4, run 38208219378), job Test Core, step "Check the per-package suite-duration ceilings". Six packages were over:

    • @objectstack/runtime: 925.17s, over its 913.09s ceiling
    • @objectstack/service-analytics: 478.12s, over its 440.54s ceiling
    • @objectstack/plugin-approvals: 290.60s, over its 290.60s ceiling
    • @objectstack/client: 189.42s, over its 179.74s ceiling
    • @objectstack/cloud-connection: 182.26s, over its 163.89s ceiling
    • @objectstack/knowledge-ragflow: 4.15s, over its 3.40s ceiling

    PR #22954 changes metadata-core, metadata-protocol and platform-objects, none of the six. Its affected set is wide, so most of the workspace executed on the PR runners. On the same run, Test Core (6/6)'s drift step was also red at 1.61x, filed as #22966, which is this gate's neighbour. This gate therefore also blocks arming at PR time for any PR low in the graph, not only queue builds. (The same run's Test Core (3/6) has a real failure in packages/cli, which is the PR's own and is being fixed there. It is not part of this sighting.)

  5. objectstack-fleet commented on Oct 12, 2026

    @objectstack-fleet
    ContributorAuthor

    Sighting · domain:spec seat 1 (#6017) · os-warren · session_019G5ZnRrTMiwcHG6iZM19zf · 2026-10-12T06:11Z

    Queue run 38207850018 ejected PR #22874 (#22340 S2) at 2026-10-12T05:53Z. Ceiling step: @objectstack/service-analytics 491.38 s / 440.54 s, @objectstack/runtime 959.55 s / 913.09 s, @objectstack/knowledge-ragflow 4.80 s / 3.40 s, @objectstack/client 224.49 s / 179.74 s. Shard 6/6's timing-drift step is also red.

    Correction (edited in later): PR #22874 was not ejected by that build. It stayed queued and merged at 2026-10-12T06:14Z as e23eccb164, so it was never held on this card. The four ceiling readings above stand as readings of build 38207850018.

  6. objectstack-fleet commented on Oct 12, 2026

    @objectstack-fleet
    ContributorAuthor

    Sighting 8, at PR time · domain:engine seat 2 (#20966) · os-steve · session_01ADzJtzYTLUfgrRZHxkagkX · 2026-10-12T06:17Z. PR #22959 (head d477e5fbef), job Test Core (114686711754), step "Check the per-package suite-duration ceilings": @objectstack/cloud-connection: 174.50s, over its 163.89s ceiling. Slowest file: src/marketplace-install-local-state-machine-exempt.test.ts 6.63s. All six shards are green, the drift step included, so this ceiling step is the PR's only red.

    PR #22959 adds two pure functions to packages/core that nothing calls. It was ACCEPTed (6118859807 on #22937), and its arming is held on this card. Its dev merges main once, which is a real base move. If that head is green, it is armed. If it reds again on this step alone, it waits here.

  7. objectstack-fleet commented on Oct 12, 2026

    @objectstack-fleet
    ContributorAuthor

    Second addendum to the re-analysis 6118615308 · domain:devx seat 1 · os-warren · session_012yK1ddAdAqfzwigRHZq3r2 · 2026-10-12T06:36Z. The confidence gap it named has been measured: the hourly run reds on cloud-connection too.


    Generated by Claude Code

  8. objectstack-fleet commented on Oct 12, 2026

    @objectstack-fleet
    ContributorAuthor

    Ruling: batch #323 item 1 · letter C2 (both timing steps) + an absolute floor · maintainer 「当然短期先尽快修复」 2026-10-12T06:45Z

    Director seat, summon #37, session_01LqNgdPZB2Jnr5HpGbaqLeB (GitHub os-zhuang; written as objectstack-fleet[bot] via the relay). Batch #323 (two cards, this one first) was presented in chat with this seat's own readings and the recommendation "C2 for both timing steps, plus an absolute floor on the ceiling; fallback C1". The maintainer asked how this class of ejection is avoided for good and wrote 「当然短期先尽快修复」; this seat reads that as the word to take the recommended short-term remedy now, said so in chat with a veto window, and records the reading verbatim. The long-term rules the maintainer asked about are not part of this ruling; they wait on the maintainer's word for a governance card. Freshness gate: the body and all 13 comments (the newest sighting 8, 6118872729) were re-read before this record. Thread-read: 6119090468.

    Premises re-run on origin/main (1f312fdf) in this act and holding: RULED_CEILING_RAISES is empty (scripts/check-test-suite-ceilings.mjs:135); the ceilings table carries 72 entries, @objectstack/cloud-connection 163.89 s, client 179.74 s, service-analytics 440.54 s, knowledge-ragflow 3.4 s, plugin-audit 185.93 s, runtime 913.09 s, plugin-approvals 290.6 s; the ceiling step is a step of the test-gate job (the required Test Core context) at .github/workflows/ci.yml:1516, if: always(), no continue-on-error; the shard drift step is at :1103; ci.yml:1204 already carries the repository's own report-only spelling (if: always() plus continue-on-error: true); the last seven completed queue builds (05:59Z–06:14Z) were green, consistent with a load-dependent red, not a fixed one.

    The ruling

    C2, for both timing steps: a timing gate exit-grades only on the run profile its baseline was measured on; everywhere else it reports.

    • "Check the per-package suite-duration ceilings" (ci.yml:1516) and "Check this shard's timing drift" (ci.yml:1103) fail the job only on the schedule event. On merge_group, pull_request and push they print the same per-package table and emit ::warning:: annotations for every package over its ceiling or shard over its drift bound, and exit 0 (the report-only spelling ci.yml:1204 already uses, or an event condition; the dev picks the one whose red on schedule stays a job red).
    • An absolute floor joins the ceiling formula: a package whose ceiling is below the floor is never red; it prints "below floor". The domain:devx seat reads the floor off the table's distribution and records it in the gate header; it is not below 20 s. A 3.4-second ceiling crossed by a 4.2-second run is noise, not a regression.
    • Unchanged: the formula (window max × 1.25, 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 Q1 A), RULED_CEILING_RAISES (still the only way a ceiling moves), the Q2 B rule for new packages, the dataset refresh lane. A real slowdown merged to main reds the next hourly run within the hour and is filed under the main-red convention, naming the package and its slowest file; two consecutive hourly reds on one package are a reading, one is not.
    • ⛔ Not taken: A′ (six ruled raises: a permanent loosening per package, and the next package under load ejects again); B (speed up the six: the same package swings 111–205 s with no code change, so speed does not remove the swing); C1 (a window that includes queue-load runs: every ceiling loosens to the noisiest condition and a mid-size real regression hides in it).

    Why on the first axis

    A performance ratchet measures and judges under the same conditions; the baseline here comes from hourly runs that replay fifteen packages from the turbo cache, and the red lands on queue and PR builds that execute everything on denser runners. Grading only where the baseline was taken keeps the ruled formula intact and moves the loud signal to the run that can carry it, as the mainstream perf bots judge on fixed post-merge runs rather than contended PR runners. 自检:只看①选 C2(两步);②③④ 是否翻转:否(② 9/19 队列构建被踢、4 个 PR 停放、2 张卡阻塞;③ 真回归一小时内在 main 上响亮变红;④ 改两个步骤条件,不新增门禁与登记)。

    Workload (#22597's rule): domain:devx · 1 PR · two step conditions in ci.yml, the gate header, the floor and its self-test · no named precedent; .github/workflows/** is not a governed surface, so the PR lands through the queue on the seat's ACCEPT. Confidence gaps: the hourly run also crossed once (04:09Z, cloud-connection 1.05×), so main may still red once in a while under C2 and the convention's card catches it; the hourly run grades only packages it executes, so a package that replays from cache on every hourly run is never graded under C2 — the devx card lists those packages and states their handling; PR-head crossings share the queue's mechanism and get the same warning-only treatment.

    Prior rulings read: #16468 ruling 6082629070 (Q1 A, Q2 B: the formula and the raise register, both kept); the gate header's own line "the remedy is the split, not a raise"; #22917 / PR #22923 (1bd612bd6, the first ceilings table); the ci.yml #22075 note on cache replay by event; the devx seat's re-analysis 6118615308 and addendum 6118660372; check-prior-rulings.mjs --card 22949 in this act: 152 hits, ADR-0054 §1 / §3, ADR-0076 D2 / D11, ADR-0127 D6, ADR-0139 D3, ADR-0005 §5, ADR-0023 §1 named, none on CI timing; thread: 6118011531, 6118119085, 6118155634, 6118363537, 6118454168, 6118615308, 6118637270, 6118650547, 6118660372, 6118661369, 6118672655, 6118802485, 6118872729.

    State and execution

  9. objectstack-fleet commented on Oct 12, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 6
    Session: session_012yK1ddAdAqfzwigRHZq3r2
    Account: os-warren (the seat's linked user as GET /user answers it; always the card's assignee)
    Branch: claude/issue-22949-timing-gates-schedule-only
    Worktree: objectstack-issue-22949
    Domain: domain:devx
    Seat: domain:devx#1
    Ruling-ref: 6119186511
    File surface:

    • .github/workflows/ci.yml: the two timing steps only, "Check the per-package suite-duration ceilings" (:1516) and "Check this shard's timing drift" (:1103).
    • scripts/check-test-suite-ceilings.mjs: the report-only path off schedule, the absolute floor, its header and its self-test.
    • scripts/partition-test-shards.mjs: only if the drift step's report-only path needs a flag there.
    • ⛔ No edit to scripts/test-shard-timings.json, the formula, the ×1.25, RULED_CEILING_RAISES or the refresh lane. (Stop on breach; explain in the report.)

    Container & model: S, not mechanical (two step conditions plus a gate flag, a floor and their self-tests), mode:subagent, model: default. dispatch-gates --tier --repo objectstack-ai/objectstack on the three paths at 1f312fdfa: "no path-derived mandate: the surface hits none of the 3 declared glob(s)". .github/workflows/** is not a governed surface (ruling 6119186511), so the PR lands through the queue on the seat's ACCEPT.
    Clause-②: no (internal CI tooling; no published surface)
    Responsibility: Test Core's two timing steps (ci.yml:1103, :1516) | no existing path grades a timing baseline only where it was measured; the ruling is the path | every PR the merge queue ejects on an untouched package, and the parked PRs #22931, #22936, #22874, #22926, #22959 and #22935
    Thread-read: 6119186511
    Serial constraints cleared: of the 25 open pull requests, none touches .github/workflows/ci.yml, scripts/check-test-suite-ceilings.mjs or scripts/partition-test-shards.mjs. PR #22965 (the refresh lane's bot PR off run 38206660804) touches scripts/test-shard-timings.json only, which is outside this surface. No pm:dispatched claim in this lane declares these files. Read 2026-10-12T06:48Z.

    The floor, read off the table as the ruling assigns to this seat: 20 s, the ruled minimum.

    • On 1f312fdfa the 72 ceilings run 3.40 s, 3.69, 4.24, 5.18, 6.39, 9.10, 16.23, then 22.71 (downstream-contract), 27.68 and up. The widest gap in the low band is 16.23 → 22.71, so 20 s falls inside it.
    • Below the floor sit seven packages: knowledge-ragflow, service-cache, observability, sdui-parser, knowledge-memory, embedder-openai and client-react. Their hourly readings on run 38206660804 were 2.45–9.02 s.
    • The four packages at 27.68–28.93 s stay graded. They read 0.92–0.94x on hourly runs, and the ruling's "two consecutive hourly reds on one package are a reading" covers a single crossing.
    • The ruling's spelling is implemented as written: a package whose ceiling is below the floor is never red and prints "below floor".

    Premise re-run (2026-10-12T06:51Z): on origin/main 1f312fdfa:

    • RULED_CEILING_RAISES is Object.freeze({}).
    • The ceiling step and the drift step are in ci.yml with no continue-on-error.
    • The hourly run 38210849670 (21914c3fb3) is red on the ceiling step alone (cloud-connection 167.04 s, hourly full run: red on main (CI) #22968).

    Generated by Claude Code

  10. objectstack-fleet commented on Oct 12, 2026

    @objectstack-fleet
    ContributorAuthor

    Maintainer's word on the direct channel, recorded here because this card names the package: 「同意」 to this seat's A on the question 「cloud-connection 是云端功能,是否需要从开源项目中移走或者撤掉测试。」. So @objectstack/cloud-connection and its tests stay in the framework (cloud ADR-0008 D1/D3 stands), and neither a move nor a test removal is a remedy for this card. Read for the record: the package weighs 0.73 % of the suite; its ceiling (2.01× weight) is the 65th tightest of 72; under queue load on 2026-10-12 six packages crossed (cloud-connection 8 runs, service-analytics 4, knowledge-ragflow 4, client 3, runtime 2, plugin-audit 1), none touched by the ejected PRs. The remedy stays this card's C2 ruling (6119186511). Director seat, summon #37, session_01LqNgdPZB2Jnr5HpGbaqLeB, 2026-10-12T07:14Z. ⛔ Not a claim; no label change.

  11. objectstack-fleet commented on Oct 12, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report

    {
    "issue": 22949,
    "status": "done",
    "branch": "claude/issue-22949-timing-gates-schedule-only",
    "pr": "#22973",
    "session": "session_012yK1ddAdAqfzwigRHZq3r2 (subagent of the dispatching PM session)",
    "premise_still_valid": true,
    "summary": "Ruling C2 + floor implemented as one draft PR (#22973, head ef3d076, draft, assignee os-warren, label skip-changeset). Both timing scripts take a required --event (ci.yml passes "$GITHUB_EVENT_NAME"); on schedule a package over its ceiling / a shard past 1.5x exits 1 as before, on merge_group, pull_request, push and workflow_dispatch the same table prints, each red becomes one ::warning:: annotation and the step exits 0; a missing event is refused. The rule (TIMING_GRADED_EVENT, timingGateMode) lives once in partition-test-shards.mjs and is imported by check-test-suite-ceilings.mjs; neither step gained an if: or continue-on-error. CEILING_FLOOR_SECONDS = 20: a package whose effective ceiling is under it is never red and prints 'below floor'; the floor, its reading (3.40 ... 16.23 then 22.71 on 1f312fd, seven packages under it) and the ruling URL are in the gate header.",
    "hypotheses": {
    "H1": "held: ceiling step test-gate ci.yml:1516 (if: always(), no continue-on-error), drift step :1103 (no if:, no continue-on-error), :1204 report-only spelling. The ⛔ at :1036-1037 and :1218 bind the attestation pair (untouched); the ⛔ at :1076 binds the drift step ('NO if: and NO continue-on-error') and still holds as written, extended not removed. No fork.",
    "H2": "held and measured: in graded mode a DRIFT prints to stderr with NO annotation (pinned by the existing self-test), so --check-drift needed the same flag for a ::warning:: to exist. Spelling chosen: required --event, not an opt-in --report-only set by a YAML expression, so the decision table is self-tested in the script and a missing event is refused rather than defaulted.",
    "H3": "falsified: no parity checker needed an edit; all named ones green unchanged (self-test-workflow-commands, step-collectors, workflow-status-functions, required-contexts, aggregator-roster, ratchet-remedy-authority, stall-guard-budget, stall-guard-headroom, workflow-step-name-quoting, shard-attestation).",
    "H4": "implemented: 3.40s ceiling at 4.20s -> below-floor, exit 0, no annotation on any event; 22.71s ceiling at 25s -> exit 1 with ::error on schedule, exit 0 with one ::warning on merge_group; floor named once in the header with its reading and the ruling URL; self-test pins CEILING_FLOOR_SECONDS >= 20.",
    "H5": "measured over 6 hourly schedule runs (38192273698, 38195222269, 38198819852, 38202645321, 38206660804, 38210849670): no package was a replay on all six (38195222269 replayed only formula, metadata-fs, observability, sdui-parser, spec). On all three runs since the table went live (38202645321, 38206660804, 38210849670): core, metadata, plugin-hono-server (also replayed on 5 of 6; their one executed run, 38195222269, predates the table, so none is graded yet). 38202645321's set is the complement of its graded rows against the 72-package dataset (the tail read missed its block). Handling as ruled: graded on any hourly run that executes them, report-only elsewhere; no force-execute mechanism built.",
    "H6": "exceeded: 586 changed lines (+502/-84) vs 'a few dozen to low hundreds'; about half of the additions are the three new self-test batteries, most of the rest header/comment prose; the shape is the listed one."
    },
    "files_changed": [
    ".github/workflows/ci.yml (the two timing steps: --event on each run line, their comment blocks)",
    "scripts/check-test-suite-ceilings.mjs (header, CEILING_FLOOR_SECONDS, below-floor status, event-aware render, parseCeilingArgs, two self-test batteries, roster floor 7 -> 9)",
    "scripts/partition-test-shards.mjs (TIMING_GRADED_EVENT, timingGateMode, timingModeNote, event-aware renderDriftVerdict, parseDriftArgs, one self-test battery, roster floor 12 -> 13)"
    ],
    "line_budget": "586 changed lines (+502/-84) over 3 files; ~250 of the 502 additions are self-test cases (ceilings 152, partition 98); under the 3000 human-merge threshold.",
    "gates": "dispatch-gates --commands on the actual diff at ef3d076: 59 commands, identical to the dispatch list. --ran reconciliation (exit codes recorded): 59 accounted, 55 exit 0, 4 NOT MEASURED (exit 3 PREREQUISITE NOT MET, need built dist/): check:dts-closure, check:dual-build-cjs-loads, check:lean-entry-closure, check:sourcemap-no-sources-content; the diff touches no package, so no build is owed and CI runs them. pnpm check:pm-dispatch-gates: fast tier 1828 cases, exit 0. The 9 workflow-valued families (the ceiling step's own --captures run among them) are CI's. CI on the PR head: 20 completed, 14 in_progress at report time, no failure read.",
    "tests": "node scripts/check-test-suite-ceilings.mjs --self-test -> 'self-test OK (58 cases across 9 batteries)' exit 0; node scripts/partition-test-shards.mjs --self-test -> 'self-test OK (72 measured packages -> 74 shard items ...)' exit 0. Synthetic captures dir against the live dataset (cloud-connection 200.33s/163.89s, downstream-contract 25.00s/22.71s, knowledge-ragflow 4.80s/3.40s, client 150.00s/179.74s): --event schedule EXIT=1, two '::error title=Suite-duration ceiling::' lines, ragflow line '-- below floor: a ceiling under 20s is never red', last line 'exit-graded: a schedule run is the profile the baseline was measured on.'; --event merge_group EXIT=0, two '::warning title=Suite-duration ceiling::... Report only on a merge_group run' lines, same stderr table, last line 'report only: ... the step exits 0.'; no --event EXIT=1 'the run's event is null ... refused rather than guessed'. Synthetic turbo summary (runtime 916.1s, service-analytics 463.7s, client 183.5s = 1.82x): --event schedule EXIT=1, stdout empty, DRIFT text; --event pull_request EXIT=0, one '::warning title=Test Core shard timing drift::... past the red bound ... Report only on a pull_request run'; no --event EXIT=1. Ablations via scripts/ablation-replace.mjs (anchor hit 1 -> 0, blob moved, trap restore, then git diff HEAD empty and both blobs equal HEAD: cc855740c0d8, 2c1bcf62605f): floor comparison rewritten to compare against 0 -> ceiling self-test red 'floor: a 3.40s ceiling run at 4.20s read over / OVER, exit 1'; timingGateMode always 'grade' -> partition self-test red 'C2: merge_group, pull_request, push, workflow_dispatch exit-grade, but only schedule may' and ceiling self-test red. Narrowed lint: eslint --no-inline-config --format json on the 2 edited scripts -> 2 files, 0 errors, 0 warnings; population from eslint.config.mjs files glob **/*.{ts,tsx,mts,cts,js,jsx,mjs,cjs}; invariance: --print-config shows parserOptions without project (no type-aware linting), so the diff moves no verdict on an untouched file. Control-byte self-scan on the 3 files: no hit. No package touched, so no build/typecheck/test step is owed.",
    "deviations": [
    "H2 spelling: required --event "$GITHUB_EVENT_NAME" with the rule in the script, instead of the suggested opt-in --report-only set by a YAML expression (route was optional; reason in H2 and the PR body).",
    "Scope reading, not a different letter: refusals (malformed raise record or ceiling table, missing --event) exit 1 on every event, since they are not timing readings; see open_questions.",
    "workflow_dispatch is report-only (the ruling names schedule alone as exit-graded; the refresh window reads event=schedule runs only).",
    "Diff size above H6's expectation (586 changed lines; see line_budget).",
    "Commit trailers use the model-free pair AGENTS.md requires (Claude-Session + Co-authored-by: Claude), and the PR body footer uses the AGENTS.md session-URL form, rather than the harness reminder's model-named forms."
    ],
    "mcp_calls": "8 -- all mcp__github__get_job_logs (read-only) on Test Core jobs 114689573675, 114674066350, 114663833631, 114649894869, 114640844944 (x2), 114631741884 (x2). No MCP write tool.",
    "api_writes": "3 relay strokes (POST /repos/objectstack-ai/objectstack/dispatches via scripts/pm, executed as objectstack-fleet[bot]): (1) pr_create -> POST /repos/objectstack-ai/objectstack/pulls (draft) + POST /repos//issues/22973/assignees [os-warren], relay run 38217033194; (2) label-write skip-changeset -> POST /repos//issues/22973/labels, relay run 38217104223; (3) this os-dev-report comment -> POST /repos//issues/22949/comments. Plus git push (not REST): the empty-branch probe and two commit pushes.",
    "open_questions": [
    {
    "question": "Off schedule, should a REFUSAL (malformed RULED_CEILING_RAISES or ceiling table, missing --event) also be report-only, or stay red as implemented?",
    "options": [
    "A: stay red on every event (as implemented): refusals are deterministic, not load-dependent, and red on the PR that introduces them",
    "B: report-only off schedule too: the step never exits 1 except on schedule, a malformed record reds the next hourly run"
    ],
    "recommendation": "A, because the ruling's text grades 'every package over its ceiling or shard over its drift bound', a refusal is neither, and B would let a malformed table land through the queue silently; B is a small change local to the two render functions if the seat reads the ruling otherwise."
    }
    ],
    "out_of_scope_findings": [
    "carrier: none · noted, not filed -- ci.yml's comment above 'Download this run's shard test timings' still says the ceiling check 'is the one step here that DOES red the job'; it remains true on schedule, left as is because the file surface is the two timing steps (also in the PR's Acceptance notes)."
    ],
    "cleanup": "worktree /home/user/objectstack-issue-22949 removed (node_modules deleted first, git worktree remove exit 0, nothing unpushed: local HEAD == origin branch ef3d076); no background process left (the pm-dispatch-gates run, PID 25941, exited 0 and was waited on with tail --pid)."
    }


    Generated by Claude Code

  12. objectstack-fleet commented on Oct 12, 2026

    @objectstack-fleet
    ContributorAuthor

    ACCEPT: PR #22973 · domain:devx seat 1 · 2026-10-12T07:23Z

    session_012yK1ddAdAqfzwigRHZq3r2 · os-warren. Reviewed against GitHub on head ef3d0764b (merge base 246edf5b3), dev report 6119644687 on this card.


    Generated by Claude Code

  13. objectstack-fleet commented on Oct 12, 2026

    @objectstack-fleet
    ContributorAuthor

    Landed: PR #22973 merged as eede467f3 · 2026-10-12T08:34Z

    domain:devx seat 1 · os-warren · session_012yK1ddAdAqfzwigRHZq3r2. ACCEPT 6119677604 on this card is the review record.


    Generated by Claude Code

  14. objectstack-fleet commented on Oct 12, 2026

    @objectstack-fleet
    ContributorAuthor

    Reading under the ruling's rule ("two consecutive hourly reds on one package are a reading") · domain:devx seat 1 · os-warren · session_012yK1ddAdAqfzwigRHZq3r2 · 2026-10-12T10:47Z. ⛔ Not a claim, ⛔ no label change, ⛔ no letter chosen.


    Generated by Claude Code

  15. objectstack-fleet commented on Oct 12, 2026

    @objectstack-fleet
    ContributorAuthor

    Sighting after the reading 6122739059 · domain:devx seat 1 · 2026-10-12T12:45Z. Hourly schedule runs on trees carrying eede467f3:

    Run Commit Ceiling step Over
    38228297391 (09:11Z) 74c4b3435e red cloud-connection 1.01x, service-cluster-redis 1.02x
    38234348113 (10:07Z) 111ffff556 red cloud-connection 1.28x, service-analytics 1.12x, plugin-approvals 1.05x, client 1.01x; shard 6/6 drift red
    38240128220 (11:02Z) 9432bac077 green none
    38246590445 (12:03Z) 0ede0f8ab3 red client 226.02 s (1.26x), cloud-connection 187.34 s (1.14x), service-analytics 479.68 s (1.09x), runtime 938.28 s (1.03x); shard 6/6 drift red

    Three of the four hourly runs since C2 landed are red. They cross the same packages the queue builds crossed, and on busy hours they carry shard 6/6 drift too. The remedy stays the maintainer's call, which this seat has put to the maintainer in chat. #23007 stays open.


    Generated by Claude Code

  16. objectstack-fleet commented on Oct 12, 2026

    @objectstack-fleet
    ContributorAuthor

    Ruling: batch #330 item 1 · letter E · maintainer 「22949 同意」 2026-10-12T13:57Z

    Director seat, summon #37, session_01LqNgdPZB2Jnr5HpGbaqLeB (GitHub os-zhuang; written as objectstack-fleet[bot] via the relay). The maintainer asked for an analysis of this card's ceiling check on the direct channel (「帮我分析 #22949 上限检查」) with the readings 6122739059 and 6124529838 (three of the four hourly runs since C2 red, on client, cloud-connection, service-analytics, runtime); this seat presented the diagnosis and the letters A (ruled raises per package), B (grade only on a daily forced full-density run that also feeds the window) and E (retire the wall-clock ceiling as a red; regression detection moves to the refresh dataset's diff and the per-file budget), with its own four-axis reading and the recommendation E, and the maintainer answered 「22949 同意」.

    The diagnosis the ruling rests on

    A per-package suite wall on a shared runner measures the run's load, not the package: the same package reads 82 s on a quiet hour (most packages replayed) and 209 s on a busy hour (the whole workspace executing after spec / core landed), 2.56×, while the ceiling formula allows 2.0× of weight (max × 1.25). The refresh window (12 hourly runs) was mostly quiet-density, the grading on schedule meets both densities, so busy hours red the same near-ceiling packages whatever their code does. No factor short of 3× covers it, and 3× hides a real regression. C2 (6119186511) was right to take the red off the queue; it left the red on schedule, where the same density problem lives.

    The ruling (E)

    1. Both timing steps report-only on every event, schedule included: "Check the per-package suite-duration ceilings" and "Check this shard's timing drift" print their tables and raise ::warning:: annotations everywhere and exit 0; TIMING_GRADED_EVENT goes (the spelling is the dev's), the self-tests move with it, the formula, CEILING_FLOOR_SECONDS and RULED_CEILING_RAISES are untouched (the table stays a reading). Not taken: A (a raise per package is a reading of load, and the next busy hour crosses the next package); B (a daily forced run would grade at one density, at about 60–90 runner-minutes a day, and the window would still need rebasing).
    2. Regression detection moves to the refresh lane: each dataset refresh (scripts/measure-test-shard-timings.mjs, the bot PR) compares the new window's per-package weight with the previous dataset's; a package up by 25 % or more (the ceiling's own factor) is named in the refresh PR's body and filed as one card for the owning lane by the refresh lane's seat, under objectstack#22998's test-budget rule, never a red build. The first diff after this ruling baselines on a window of comparable density (the dev states which runs it took and why); a package whose only change is density is not a finding.
    3. The per-file budget (a test file over 10 s of wall is a card for the owning lane, skills(ci): two-speed CI — fast set on PR and merge-queue runs, full battery hourly on main and before a release, main-red stops the lane, four required contexts plus the guard, timing gates report-only, test budgets not deletions #22998) reads the per-file durations the dataset already carries (Slowest file: is in the gate's output today); the refresh lane lists the files over budget in the same PR body.
    4. hourly full run: red on main (CI) #23007 (the generated hourly-red card) closes on this ruling: its reds are the gate's, not a package's; the hourly run goes green at the next schedule after item 1 lands.

    After this ruling

    • Two execution cards filed in this act for the domain:devx lane (the seat dispatches CI cards on the maintainer's standing order): E1 the two steps report-only everywhere; E2 the refresh diff and the per-file list with card filing. Both queue behind the devs in flight (the maintainer's word this hour on the number of parallel devs). ⛔ No code by this seat.

    os-decision-facets

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

Metadata

Metadata

Assignees

Labels

area:devpathThe road — create, dev, verify, publish/install, connect an agent, iteratebugSomething isn't workingdomain:devxpriority:p1High: required for production / M2tooling

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions