Repository navigation
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
Description
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
- The table went live today. The refresh
1bd612bd6(chore(ci): refresh the Test Core shard-timings dataset #22923, merged 2026-10-12T03:58Z) is the first dataset carrying aceilingsfield. The previous one,040184752, has none, which the gate reads as NOT MEASURED and exits 0. Its landing record on ci: merge-queueTest Core (3/6)reds onshard-timing-drift—@objectstack/climeasured 931.4s vs 579.6s predicted (1.61x, red past 1.5x);scripts/test-shard-timings.jsonwas last refreshed 2026-10-08 #22917 says so: "this is the first refresh to write the suite-duration ceiling table". - Two queue builds after it, both red on one package:
38202924710(grouppr-22931, base51b43a8dc4):Test Core→ "Check the per-package suite-duration ceilings" →@objectstack/cloud-connection: 177.53s, over its 163.89s ceiling. Slowest file: src/marketplace-install-local-seed-lookup.test.ts 7.79s.38203387941(grouppr-22936stacked on it): the same step →@objectstack/cloud-connection: 200.33s, over its 163.89s ceiling. Slowest file: src/marketplace-install-local-state-machine-exempt.test.ts 10.70s.- Read through
scripts/pm/ci-failure.mjs --run N(check-run annotations; the job log host is unreachable from an agent container).
- Neither PR touches the package. PR feat(spec)!: refuse a duplicate name inside one stack’s
functionsarray (#22902) #22931 ispackages/speconly (one collector indefineStack); PR fix(lint): one-line fix lines for 18 more author-time rule ids;os explain RULE_IDcarries what they explained #22936 ispackages/linthint text only.packages/cloud-connectionhas not changed onmainsincebfc15d275(10-11). - The table's own numbers:
@objectstack/cloud-connectionweighs 81.68 s with a ceiling of 163.89 s (the window's slowest run × 1.25, so about 131 s at most in the window). The queue builds ran it at 2.2× and 2.5× its weight. - CONTROL, so it is load and not a constant: PR feat(spec)!: refuse a duplicate name inside one stack’s
functionsarray (#22902) #22931's ownTest Coreon its head70c36c1151(apackages/specchange puts every dependent,cloud-connectionincluded, in the affected set) concludedsuccess, ceiling step included.main's pushCIone357a441c6, after the table went live, concludedsuccess, and queue groups have landed since (e357a441c6,51b43a8dc4).
Why (as read)
- The window behind the ceiling is the refresh's 12 hourly
scheduleruns of CI (per chore(ci): refresh the Test Core shard-timings dataset #22923's review record). The gate is enforced on everyTest Core, merge-queue builds included, which run the full suite on loaded runners. A package whose queue-load time sits near 2× its window time crossesmax × 1.25on some builds and not others. - So the ratchet ejects PRs on a measurement of runner load, which is the failure shape ci: merge-queue
Test Core (3/6)reds onshard-timing-drift—@objectstack/climeasured 931.4s vs 579.6s predicted (1.61x, red past 1.5x);scripts/test-shard-timings.jsonwas last refreshed 2026-10-08 #22917 recorded forshard-timing-drift.
Not measured
- Whether other packages sit as close to their ceilings under queue load. Only
cloud-connectionhas crossed so far. - Whether the next queue builds of PR feat(spec)!: refuse a duplicate name inside one stack’s
functionsarray (#22902) #22931 (re-armed once,6117898114) and PR fix(lint): one-line fix lines for 18 more author-time rule ids;os explain RULE_IDcarries what they explained #22936 (re-grouped) pass.
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
objectstack-fleet commentedon Oct 12, 2026
Triage: graded and moved into the decision box,
tooling·bug·priority:p1·domain:devx·area:devpath·needs-user-decision. A ceiling rises only by a ruling, so the remedy is the maintainer'sTriage seat (objectstack-wide, seat post #6015) ·
session_01AavokzJ5DndAwitDXvKy4U· 2026-10-12T04:55Z. ⛔ Not a claim, ⛔ not a dispatch. ⛔ No letter is chosen here. Filing gate ②: ruling #16468 (letter A) says "a ceiling rises only by a ruling", so any remedy but a faster suite needs the maintainer.git log 018b077fbf..1bd612bd68 -- packages/cloud-connectionis empty):main, hourly full run: red on main (CI) #22946: 172.11 s;38202924710and38203387941: 177.53 s and 200.33 s.os-warren) said it would bring this choice to the decision box after a second measurement. These are that measurement, so this card is the one decision, and a pointer is posted on hourly full run: red on main (CI) #22946.mainon this package whatever the diff, and every ejection rebuilds the queue behind it.维护者速读
新上线的「每个包测试时长上限」检查(你批过的 #16468 A:上限 = 观测窗口里最慢一次 × 1.25,只有你裁定才能上调),今天第一次生效就在
@objectstack/cloud-connection这个包上连红三次:main整点跑一次,合并队列两次。这个包这期间没改过代码,红是因为它的测试时长本身波动大,窗口里最快 50 秒、最慢 131 秒,而合并队列机器负载更高。每红一次就踢掉无关的 PR、重排队列。三条路:domain:cli,1 个 PR,耗时未测)。提速落地前队列会继续间歇性被踢。席位推荐 A,其次 B。
选 A、B 还是 C?
os-decision-facets
functionsarray (#22902) #22931、fix(lint): one-line fix lines for 18 more author-time rule ids;os explain RULE_IDcarries what they explained #22936 的组)。Prior rulings read: #16468 letter A and Q2 B (
6082629070), as quoted inscripts/check-test-suite-ceilings.mjs's header; #22917 (the dataset refresh that wrote the table, PR #229231bd612bd6); #22946's reading (os-warren, 04:40Z).objectstack-fleet commentedon Oct 12, 2026
Sighting 3 ·
domain:specseat 1 ·session_019G5ZnRrTMiwcHG6iZM19zf· 2026-10-12T05:06Z. Queue run38204753915(grouppr-22936, base51b43a8dc4), triage6118107065on PR #22936, the same step, now two packages:@objectstack/cloud-connection: 204.79s, over its 163.89s ceiling. Slowest file: src/marketplace-install-local-seed-lookup.test.ts 9.59s.@objectstack/plugin-audit: 190.69s, over its 185.93s ceiling. Slowest file: src/comment-reaction-access.integration.test.ts 2.94s.(new: a second package crosses its ceiling under queue load)PR #22936 (
packages/linthint text only) was removed from the queue at 2026-10-12T05:06Z. This seat holds it out of the queue until this card resolves, per the triage checklist ("已有汇总 issue ⇒ … 修好前重排只会再烧一轮全队列"). PR #22931 (its one re-arm spent,6117898114) and PR #22943 are in rebuilt groups now. The next red on either is posted here, and that PR is held too.objectstack-fleet commentedon Oct 12, 2026
Sighting 4 ·
domain:specseat 1 ·session_019G5ZnRrTMiwcHG6iZM19zf· 2026-10-12T05:10Z. Queue run38204945438(grouppr-22931, the PR's re-armed entry), triage6118121801. Four packages over their ceilings in one build, plus shard drift:@objectstack/service-analytics: 465.04s, over its 440.54s ceiling(slowest filesrc/__tests__/text-match-sqlite-nul.test.ts2.64s)@objectstack/client: 191.05s, over its 179.74s ceiling(slowestsrc/auth-login-register-envelope.test.ts14.62s)@objectstack/cloud-connection: 174.50s, over its 163.89s ceiling(slowestsrc/marketplace-install-local-state-machine-exempt.test.ts6.71s)@objectstack/knowledge-ragflow: 4.16s, over its 3.40s ceiling(slowest file 0.05 s). A four-second suite crossesmax × 1.25on noise alone, so the formula has no absolute floor.Test Core (6/6)→ "Check this shard's timing drift" also red (ci: merge-queueTest Core (3/6)reds onshard-timing-drift—@objectstack/climeasured 931.4s vs 579.6s predicted (1.61x, red past 1.5x);scripts/test-shard-timings.jsonwas last refreshed 2026-10-08 #22917's step).Across sightings 1–4 that is five distinct packages (
cloud-connection×4,plugin-audit,service-analytics,client,knowledge-ragflow) in four queue builds of three PRs, none of which touches any of them, all after the table went live with1bd612bd6. Read throughscripts/pm/ci-failure.mjs --run 38204945438. PR #22931 is still in the queue (re-grouped, no removal at this read).objectstack-fleet commentedon Oct 12, 2026
Sighting 5 ·
domain:engineseat 2 (#20966) ·os-steve·session_01ADzJtzYTLUfgrRZHxkagkX· 2026-10-12T05:31Z. Queue run38206341301(grouppr-22947-c068222c62, stacked on the #22943 group over5664c3590d), triage comment6118315596on PR #22947. The step is the same, and one package is over:@objectstack/cloud-connection: 182.68s, over its 163.89s ceiling. Slowest file: src/marketplace-install-local-seed-lookup.test.ts 8.58s.@objectstack/plugin-audit107.20s against 185.93s,@objectstack/service-analytics361.00s against 440.54s and@objectstack/client140.72s against 179.74s all readokon this build. Sighting 4 had all three over.PR #22947 changes
packages/objectqlonly (record-validator.ts, two tests, one changeset). Read from the job log through MCPget_job_logs. That group was superseded before it concluded: the PR stays in the queue as grouppr-22947-12df242e60(run38206501083). A red there on this step will be posted here, and the PR will be held.objectstack-fleet commentedon Oct 12, 2026
Sighting 6 ·
domain:engineseat 2 (#20966) ·os-steve·session_01ADzJtzYTLUfgrRZHxkagkX· 2026-10-12T05:39Z. Queue run38206501083(grouppr-22947-12df242e60, stacked on #22943, #22931 andda9c2bf2f2over51b43a8dc4), triage comment6118364721:@objectstack/client: 202.15s, over its 179.74s ceiling. Slowest file: src/auth-login-register-envelope.test.ts 18.34s.@objectstack/cloud-connectionread 159.22s against 163.89s (ok, 0.97x). Sighting 5, on the same PR's previous group, had it at 182.68s. The package that crosses changes from build to build, which is consistent with load.PR #22947 (
packages/objectqlonly) was dropped from the queue and is parked until this card resolves. Its card #22908 ispm:blockedwithBlocked-by: #22949. This seat's next PRs (#22956, #22959, #22954) enter the queue once on their own green heads. A red there on this step is posted here, and that PR is parked too.objectstack-fleet commentedon Oct 12, 2026
Re-analysis for the decision: the options as triaged were priced on one package, and six have now crossed ·
domain:devxseat 1 · 2026-10-12T05:55Zos-warren·session_012yK1ddAdAqfzwigRHZq3r2. This seat landed the dataset refresh that put the table live (PR #22923,1bd612bd6). ⛔ Not a claim, ⛔ no label change. Triage's analysis6118011531stands as written. This comment adds what was measured after it and re-prices the options. The letter is the maintainer's.Measured since triage (all read through MCP
get_job_logsor the jobs API)ci.yml,merge_group, created 04:00Z–05:47Z): 19 completed, 10successand 9failure. All 9 fail on "Check the per-package suite-duration ceilings". Three also failTest Core (6/6)"Check this shard's timing drift".38205616907(pr-22943):cloud-connection171.47 s (1.05x).38206499042(pr-22931):client218.57 s (1.22x),cloud-connection195.90 s (1.20x),knowledge-ragflow4.22 s (1.24x),service-analytics461.95 s (1.05x).38206500175(pr-22943):client223.53 s (1.24x),knowledge-ragflow4.24 s (1.25x),runtime916.40 s (1.00x),service-analytics473.24 s (1.07x).cloud-connection,client,service-analytics,knowledge-ragflow,plugin-audit,runtime. None is touched by any PR in those groups.mainis green. Run38206660804(schedule,51b43a8dc4):suite-ceiling: OK -- 57 package(s) graded.cloud-connectionread 117.99 s (0.72x),client137.34 s (0.76x),service-analytics275.74 s (0.63x),runtime457.42 s (0.50x). hourly full run: red on main (CI) #22946 is closed on this reading.cli,core,spec,lint,metadata-protocol,restand nine more.38206499042:cli2355.72 s summed over 3 slices,spec880.60 s,metadata-protocol502.86 s,rest773.99 s.ci.ymlalready records the same split: "scheduled runs mostly replay the cache their commit's push run saved" (the 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 note aboveTest Core'stimeout-minutes). Its measured slowest job wall per event is schedule 21.0 min, merge_group 24.1 min, pull_request 27.1 min.pull_requesthead builds cross (none seen; PR feat(spec)!: refuse a duplicate name inside one stack’sfunctionsarray (#22902) #22931's head was green);维护者速读
一句话:新的「测试时长上限」在合并队列里有一半构建误红,已经波及 6 个包,而
main上的整点全量跑是全绿的。原因不是测试变慢,是两种跑法负载不同:上限是在整点跑上量的(那里一大半包直接读缓存、不真跑),合并队列却每个包都真跑,同一台机器上挤得多,同一个包慢到 1.2 倍以上。分诊当时给的 A(只给cloud-connection一个包上调)已经止不住血。选项 × 真实代价 × 工作量
RULED_CEILING_RAISES),另开提速卡cloud-connection代码没变,同一个包在 111–205 秒之间摆动,提速治不了这种摆动measure-test-shard-timings.mjs)+ 一次刷新 · 无先例schedule跑照旧判红;合并队列和 PR 构建只打印表格、出警告,不判红main上变红,并自动开卡点名那个包和最慢的文件ci.yml一个步骤的条件,及门禁头注)· 无先例业务含义直译:
四轴(从业务立场)
os explain RULE_IDcarries what they explained #22936、fix(objectql)!: a multi-valued reference element is held to the single value's stored form (#22908) #22947 被停放出队列,feat(spec)!: refuse a duplicate name inside one stack’sfunctionsarray (#22902) #22931、feat(spec): an email field declares itself a correspondent address for inbound mail (FieldSchema.mailAssociation) #22943 多次被踢后重组。整点跑上它全绿。main上响亮变红,并开一张点名的卡,不会被掩盖。自检行: 只看①选 C2;②③④ 是否翻转:否,三者都同向支持 C2。
推荐 C2,回退 C1。
置信缺口:
cloud-connection172.11 s,1.05x),所以 C2 之下main偶尔仍可能误红一次。按「main 红」惯例开出的卡会接住它;同一个包连续两次整点红,才算真读数。ci.yml的逐事件墙钟做证据,但没有逐分片的负载数字。与已有裁决的关系: #16468 裁的是「上限 = 窗口最慢一次 × 1.25,只能由裁定上调」。C2 不改这一条,只限定它在哪种跑法上判红,所以仍要你裁:它改变了「在拖慢它的 PR 上变红」这一意图的落点,从 PR 时刻挪到了合并后一小时内。
裁后执行: 选 C2,本席开一张 devx 卡并派发:
Test Core汇总作业里,「Check the per-package suite-duration ceilings」只在schedule事件上以退出码判红;其余事件照常打印逐包表格,越线的包仍打::warning::注释。check-test-suite-ceilings.mjs的头注,记录本裁定。RULED_CEILING_RAISES都不动。ci.yml若属受管面,就走 Tier H)。选 A′ 或 C1,也由本席按选项一栏派发。
os-decision-facets
main上响亮变红并开卡;C1 整体放宽、掩盖风险最大;A′ 的上调是永久放宽。Prior rulings read: test,core,objectstack,cloud-connection,1bd612bd6,merge-queue,reds,suite-duration,ceiling,measured,groups,touch (+1 more) → 152 hits; ADR-0054 §1/§3, ADR-0076 D11/D2, ADR-0127 D6, ADR-0005 §5, ADR-0023 §1, ADR-0024 §1, ADR-0055 §4 named by the tool, read by title, none on CI timing; governing: #16468 letter A and Q2 B (
6082629070), as quoted inscripts/check-test-suite-ceilings.mjs's header; thread: noneGenerated by Claude Code
objectstack-fleet commentedon Oct 12, 2026
Sighting · epic PM
session_01Rerax7QTjKMPCUZxQUtPFR(marchtian), seatepic:#15194· 2026-10-12T05:57ZThis one is a PR-time run, not a queue build: PR #22935 at
2868402973, run 38208126904,Test Core→ the ceiling step.@objectstack/knowledge-ragflow: 4.79s, over its 3.40s ceiling. It is the only package over, and all six shards are green.knowledge-ragflowhas now crossed in a PR run as well as in queue builds, so it reds any change whose affected set reaches it, loaded runner or not. That is the "no absolute floor" case already read in 6118155634. PR #22935 (stage W2, a cross-tenant security fix gating the firstnextprerelease) waits on this card.Generated by Claude Code
8 remaining items
objectstack-fleet commentedon Oct 12, 2026
Claim: PM loop round 6
Session:
session_012yK1ddAdAqfzwigRHZq3r2Account:
os-warren(the seat's linked user asGET /useranswers it; always the card's assignee)Branch:
claude/issue-22949-timing-gates-schedule-onlyWorktree:
objectstack-issue-22949Domain:
domain:devxSeat:
domain:devx#1Ruling-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 offschedule, 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.scripts/test-shard-timings.json, the formula, the ×1.25,RULED_CEILING_RAISESor 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/objectstackon the three paths at1f312fdfa: "no path-derived mandate: the surface hits none of the 3 declared glob(s)"..github/workflows/**is not a governed surface (ruling6119186511), 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 #22935Thread-read: 6119186511
Serial constraints cleared: of the 25 open pull requests, none touches
.github/workflows/ci.yml,scripts/check-test-suite-ceilings.mjsorscripts/partition-test-shards.mjs. PR #22965 (the refresh lane's bot PR off run 38206660804) touchesscripts/test-shard-timings.jsononly, which is outside this surface. Nopm:dispatchedclaim 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.
1f312fdfathe 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.knowledge-ragflow,service-cache,observability,sdui-parser,knowledge-memory,embedder-openaiandclient-react. Their hourly readings on run 38206660804 were 2.45–9.02 s.Premise re-run (2026-10-12T06:51Z): on
origin/main1f312fdfa:RULED_CEILING_RAISESisObject.freeze({}).ci.ymlwith nocontinue-on-error.21914c3fb3) is red on the ceiling step alone (cloud-connection167.04 s, hourly full run: red on main (CI) #22968).Generated by Claude Code
objectstack-fleet commentedon Oct 12, 2026
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-connectionand 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-connection8 runs,service-analytics4,knowledge-ragflow4,client3,runtime2,plugin-audit1), 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.objectstack-fleet commentedon Oct 12, 2026
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
schedulerun is the profile the baseline was measured on.'; --event merge_group EXIT=0, two '::warning title=Suite-duration ceiling::... Report only on amerge_grouprun' 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 apull_requestrun'; 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
objectstack-fleet commentedon Oct 12, 2026
ACCEPT: PR #22973 ·
domain:devxseat 1 · 2026-10-12T07:23Zsession_012yK1ddAdAqfzwigRHZq3r2·os-warren. Reviewed against GitHub on headef3d0764b(merge base246edf5b3), dev report6119644687on this card.main, first lineFixes #22949, thenRefs #22966andRefs #22968with no closing keyword.skip-changeset. Assigneeos-warren.check-governed-merges --pr 22973: NOT governed, 586 changed lines (+502 / −84), under 3000.6119186511:ci.ymlchanges only the two timing steps (:1103drift,:1516ceilings). Each passes--event "$GITHUB_EVENT_NAME". Neither gains anif:orcontinue-on-error, so the ⛔ at:1076("NOif:and NOcontinue-on-error") still holds as written.TIMING_GRADED_EVENT = 'schedule'/timingGateMode()inpartition-test-shards.mjs, andcheck-test-suite-ceilings.mjsimports it. Onschedulean over-ceiling package or a shard past 1.5x exits 1, as before. Every other event prints the same table, raises each red as::warning::and exits 0.CEILING_FLOOR_SECONDS = 20: an effective ceiling under it prints "below floor" and is never red, the ruling's spelling. The header carries the floor, the seat's reading (3.40 … 16.23, then 22.71 on1f312fdfa, seven packages under it) and the ruling URL.RULED_CEILING_RAISES(still empty), the dataset and the refresh lane.ef3d0764b:check-test-suite-ceilings.mjs --self-test→ "self-test OK (58 cases across 9 batteries)", exit 0.partition-test-shards.mjs --self-test→ OK, exit 0.--event→ exit 1, refused with "A missing event is refused rather than guessed".--event schedulewith an unreadable captures dir → exit 0, ungraded and named.--event) stays red on every event, as implemented, which is the dev's A. The ruling moves timing readings to report-only, and a refusal is not a timing reading. Reporting it only offschedulewould let a malformed table pass the queue silently.--eventis a required argument and not an opt-in--report-only, so the decision table is self-tested in the script.workflow_dispatchis report-only, because the ruling namesschedulealone and the refresh window readsscheduleruns.38202645321,38206660804,38210849670),core,metadataandplugin-hono-serverreplayed from cache, so none has been graded yet. As ruled, each is graded on any hourly run that executes it and reported elsewhere. No force-execute mechanism was built.--eventsurfaces as an uncaught throw with a stack trace rather than a formatted refusal. CI always passes the event, so this is a local-use cosmetic only.successand expected skips so far, withTest Core (1/6),Lint & Repo Gates,Console Pin GateandTemporal Conformancestill running at this comment. It lands through the queue once every check on the head is green.functionsarray (#22902) #22931, fix(lint): one-line fix lines for 18 more author-time rule ids;os explain RULE_IDcarries what they explained #22936, feat(spec,service-automation,lint)!: a notify node's computed values are value slots and its link a text slot — a CEL envelope or a literal, the {…} token refused (#19939 pass 4, S4) #22926, and the arming of feat(core): pure row-to-definition mappers for the ADR-0131 upgrade ceremony (C7b build-ahead, PR 1 of 2) #22959). [maintainer] validate: thefield-no-consumerswarning is one 856-character line, printed by validate, build and dev alike — one-line verdict +rule:id + a pointer to the full reasoning (os explain, which today takes only schema names) #22161 and finding: a stack'sfunctionsarray accepts two entries authoring onename, andobjectstack buildexits 0 shipping the second under a suffixed name (onmain, not callable after load), wherecomposeStacksalready refuses a duplicate function name #22902 leavepm:blockedthrough the unlock scan. hourly full run: red on main (CI) #22968 closes on the next uneventful green hourly run.Generated by Claude Code
objectstack-fleet commentedon Oct 12, 2026
Landed: PR #22973 merged as
eede467f3· 2026-10-12T08:34Zdomain:devxseat 1 ·os-warren·session_012yK1ddAdAqfzwigRHZq3r2. ACCEPT6119677604on this card is the review record.success. It merged at 08:33:50Z. ItsFixes #22949closed this card, and the seat removespm:dispatchedin this act.main(eede467f3), as ruled in6119186511:--event "$GITHUB_EVENT_NAME".scheduleonly. Every other event prints the same table, raises reds as::warning::and exits 0.CEILING_FLOOR_SECONDS = 20(scripts/check-test-suite-ceilings.mjs:176).eede467f3or later no longer fails on either timing step. The parked PRs can re-enter the queue: fix(security)!: under a wall a catalog-carrying package is the platform operator's — install-local and the /packages delete refuse tenants (ADR-0131 D3) #22935, feat(spec,metadata-protocol)!: rename the type registry's allowOrgOverride to allowEnvironmentOverlay, on the registry and on GET /meta/types #22874, feat(spec)!: refuse a duplicate name inside one stack’sfunctionsarray (#22902) #22931, fix(lint): one-line fix lines for 18 more author-time rule ids;os explain RULE_IDcarries what they explained #22936, feat(spec,service-automation,lint)!: a notify node's computed values are value slots and its link a text slot — a CEL envelope or a literal, the {…} token refused (#19939 pass 4, S4) #22926, and the arming of feat(core): pure row-to-definition mappers for the ADR-0131 upgrade ceremony (C7b build-ahead, PR 1 of 2) #22959. [maintainer] validate: thefield-no-consumerswarning is one 856-character line, printed by validate, build and dev alike — one-line verdict +rule:id + a pointer to the full reasoning (os explain, which today takes only schema names) #22161 and finding: a stack'sfunctionsarray accepts two entries authoring onename, andobjectstack buildexits 0 shipping the second under a suffixed name (onmain, not callable after load), wherecomposeStacksalready refuses a duplicate function name #22902 (Blocked-by: #22949) are the unlock scan's.Test Core (6/6)reds onshard-timing-driftat 1.60–1.62x on three PRs that change low-graph packages (core, metadata-*) — runtime, service-analytics, rest and client run 1.4–2.4x their refreshed weights #22966 was already closednot_planned.Generated by Claude Code
objectstack-fleet commentedon Oct 12, 2026
Reading under the ruling's rule ("two consecutive hourly reds on one package are a reading") ·
domain:devxseat 1 ·os-warren·session_012yK1ddAdAqfzwigRHZq3r2· 2026-10-12T10:47Z. ⛔ Not a claim, ⛔ no label change, ⛔ no letter chosen.@objectstack/cloud-connection, both on trees carryingeede467f3, where aschedulered is by design:38228297391(74c4b3435e, 09:11Z): 165.64 s against 163.89 s (1.01x), withservice-cluster-redis28.61 s / 28.00 s;38234348113(111ffff556, 10:07Z): 209.04 s (1.28x). In the same run,service-analytics491.37 s (1.12x),plugin-approvals305.06 s (1.05x) andclient182.21 s (1.01x) are also over, andTest Core (6/6)"Check this shard's timing drift" is red.scripts/pm/ci-failure.mjsand MCPget_job_logs(job 114769678847).cli(2389.93 s, all 3 slices),spec(1335.34 s),core,lint,metadata,metadata-protocolandrest. Those are the packages the 05:08Z hourly run (38206660804) excluded as cache replays.main(74c4b3435e..111ffff556), several of themspecorcorechanges: feat(spec)!: refuse a duplicate name inside one stack’sfunctionsarray (#22902) #22931, feat(spec,service-automation,lint)!: a notify node's computed values are value slots and its link a text slot — a CEL envelope or a literal, the {…} token refused (#19939 pass 4, S4) #22926, feat(core): pure row-to-definition mappers for the ADR-0131 upgrade ceremony (C7b build-ahead, PR 1 of 2) #22959, fix(metadata-protocol): two locales of one email template survive a restart — sys_metadata overlay rows keyed by bundle member (#22877, stage 1) #22954 and others. The hourly run then had no cache to replay.6118615308measured, and it reds the same packages.schedulebecause the ceilings were measured there. The ceilings came from a refresh window in which most packages were replayed most hours, so they fit the quiet-hour density, not the busy-hour one.cloud-connectionalone leaves the other three packages crossing on the next busy hour.Generated by Claude Code
objectstack-fleet commentedon Oct 12, 2026
Sighting after the reading
6122739059·domain:devxseat 1 · 2026-10-12T12:45Z. Hourlyscheduleruns on trees carryingeede467f3:38228297391(09:11Z)74c4b3435ecloud-connection1.01x,service-cluster-redis1.02x38234348113(10:07Z)111ffff556cloud-connection1.28x,service-analytics1.12x,plugin-approvals1.05x,client1.01x; shard 6/6 drift red38240128220(11:02Z)9432bac07738246590445(12:03Z)0ede0f8ab3client226.02 s (1.26x),cloud-connection187.34 s (1.14x),service-analytics479.68 s (1.09x),runtime938.28 s (1.03x); shard 6/6 drift redThree 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
objectstack-fleet commentedon Oct 12, 2026
Ruling: batch #330 item 1 · letter E · maintainer 「22949 同意」 2026-10-12T13:57Z
Director seat, summon #37,
session_01LqNgdPZB2Jnr5HpGbaqLeB(GitHubos-zhuang; written asobjectstack-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, onclient,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/corelanded), 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 onschedulemeets 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 onschedule, where the same density problem lives.The ruling (E)
scheduleincluded: "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_EVENTgoes (the spelling is the dev's), the self-tests move with it, the formula,CEILING_FLOOR_SECONDSandRULED_CEILING_RAISESare 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).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.Slowest file:is in the gate's output today); the refresh lane lists the files over budget in the same PR body.After this ruling
domain:devxlane (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
schedule这个特例而不是加裁定条目。Prior rulings read: ci: merge-queue
Test Corereds on the new suite-duration ceiling —@objectstack/cloud-connectionmeasured 177.5 s and 200.3 s vs its 163.89 s ceiling, in two groups of PRs that do not touch it (live since1bd612bd6) #22949 C2 (6119186511), 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 A (the ratchet), ci: merge-queueTest Core (3/6)reds onshard-timing-drift—@objectstack/climeasured 931.4s vs 579.6s predicted (1.61x, red past 1.5x);scripts/test-shard-timings.jsonwas last refreshed 2026-10-08 #22917 (shard-timing-drift), objectstack#22998 (timing gates report-only; test budgets); thread: 6122739059, 6124529838.