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
Activity
objectstack-fleet commented
on Oct 12, 2026 ContributorAuthorMore actionsTriage: 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.- Three readings over the ceiling, no code change in the package (
git log 018b077fbf..1bd612bd68 -- packages/cloud-connectionis empty):- the hourly run on
main, hourly full run: red on main (CI) #22946: 172.11 s; - the queue builds
38202924710and38203387941: 177.53 s and 200.33 s. - All are against 163.89 s, the window's max of 131.11 s × 1.25. The window spread is 2.62× (min 50.11 s, median 81.68 s), among the noisiest packages in the table.
- the hourly run on
- One decision for both reds. hourly full run: red on main (CI) #22946's seat (
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. - Why p1: the ratchet reds the merge queue and
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、重排队列。三条路:- A:给这个包做一次裁定上调(一行登记加你的裁定链接),同时另开一张卡去提速它最慢的几个测试文件。立刻止血,公式不动。
- B:不调上限,只提速这个包的测试(
domain:cli,1 个 PR,耗时未测)。提速落地前队列会继续间歇性被踢。 - C:改公式,让窗口也收录合并队列的运行,或给队列换个系数。对所有包生效,等于改你的 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,其次 B。
选 A、B 还是 C?
os-decision-facets
- ① 项目长远合理性:A 用裁决预留的正规出口,公式不动;B 治本但不止血;C 改一条所有包共用的已裁公式。
- ② 实际业务拉动:三次实测红,均与改动无关;队列被踢已有两次(PR feat(spec)!: refuse a duplicate name inside one stack’s
functionsarray (#22902) #22931、fix(lint): one-line fix lines for 18 more author-time rule ids;os explain RULE_IDcarries what they explained #22936 的组)。 - ③ 防 AI 犯错:A、B 都保留「慢了就红」;C 放宽所有包的判据,掩盖真变慢的风险更大。
- ④ 创业阶段不扩散:A 一行加一张小卡;B 一张卡;C 改生成器和门禁。
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).- Three readings over the ceiling, no code change in the package (
- addedarea:devpathThe road — create, dev, verify, publish/install, connect an agent, iterateThe road — create, dev, verify, publish/install, connect an agent, iteratebugSomething isn't workingSomething isn't workingpriority:p1High: required for production / M2High: required for production / M2and removed
on Oct 12, 2026 objectstack-fleet commented
on Oct 12, 2026 ContributorAuthorMore actionsSighting 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 commented
on Oct 12, 2026 ContributorAuthorMore actionsSighting 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 commented
on Oct 12, 2026 ContributorAuthorMore actionsSighting 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 commented
on Oct 12, 2026 ContributorAuthorMore actions⚠️ Correction ·domain:engineseat 2 ·session_01ADzJtzYTLUfgrRZHxkagkX· 2026-10-12T06:04Z. The statement below that the queue dropped PR #22947 is false. The queue never removed it: its timeline shows noremoved_from_merge_queuebefore the merge. After grouppr-22947-12df242e60(run38206501083) went red, the queue rebuilt the entry as grouppr-22947-e5687cb6b3(run38208628600, created 2026-10-12T05:35:54Z). That run went green, and the PR merged as21914c3fb3at 06:02Z. This seat missed that group because it read too short a page of queue runs (10 runs, so the 05:35:54 group fell outside it). The park below never took effect, and none is in force now. The suite-ceiling readings below are accurate.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.- On this build
@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 commented
on Oct 12, 2026 ContributorAuthorMore actionsRe-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)- Queue builds since the table went live (
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". - Three red builds had no sighting on this card yet:
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).
- Packages over, across sightings 1–6 and these: 6 packages:
cloud-connection,client,service-analytics,knowledge-ragflow,plugin-audit,runtime. None is touched by any PR in those groups. - The hourly run on
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. - What differs between the two kinds of run.
- That hourly run excluded 15 packages as turbo cache replays:
cli,core,spec,lint,metadata-protocol,restand nine more. - The red queue builds executed and graded all of them. In
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.- The ceilings were set from the refresh's hourly window. A queue build grades the same packages on runners carrying thousands of seconds more contended work.
- The gate's own header names this failure shape: "A future split that raises the density will read red here on packages it did not touch; that red is the split making suites slower, and the remedy is the split, not a raise."
- That hourly run excluded 15 packages as turbo cache replays:
- Not measured:
- whether
pull_requesthead builds cross (none seen; PR feat(spec)!: refuse a duplicate name inside one stack’sfunctionsarray (#22902) #22931's head was green); - the per-shard density of each red build, shard by shard.
- whether
维护者速读
一句话:新的「测试时长上限」在合并队列里有一半构建误红,已经波及 6 个包,而
main上的整点全量跑是全绿的。原因不是测试变慢,是两种跑法负载不同:上限是在整点跑上量的(那里一大半包直接读缓存、不真跑),合并队列却每个包都真跑,同一台机器上挤得多,同一个包慢到 1.2 倍以上。分诊当时给的 A(只给cloud-connection一个包上调)已经止不住血。选项 × 真实代价 × 工作量
选项 做什么 客户 / 车队感知到的后果 工作量 A′ 给已越线的 6 个包各登记一次裁定上调( RULED_CEILING_RAISES),另开提速卡这 6 个暂时不红,但下一个在队列里慢下来的包照样踢人,每次都要你再裁一次 devx · 1 PR · 无先例(该登记表至今为空) B 不调上限,只提速这几个包 队列继续约一半构建被踢,直到 6 个包都提速; cloud-connection代码没变,同一个包在 111–205 秒之间摆动,提速治不了这种摆动各包所属车道 · 每包一个 PR,6 个包起 · 无先例 C1 生成器的观测窗口改为收录合并队列(全量真跑)的运行,上限按那个负载重算 上限整体放宽到「最忙时的最慢一次 × 1.25」,中等幅度的真变慢在队列里看不出来;忙闲波动仍可能偶发误红 devx · 1 PR( measure-test-shard-timings.mjs)+ 一次刷新 · 无先例C2 判红只在「量上限的那种跑法」上做:整点 schedule跑照旧判红;合并队列和 PR 构建只打印表格、出警告,不判红队列立刻止血;某个 PR 真把包拖慢了,最晚下一个整点在 main上变红,并自动开卡点名那个包和最慢的文件devx · 1 PR( ci.yml一个步骤的条件,及门禁头注)· 无先例业务含义直译:
- A′:哪个包报警就给哪个包单独松绑,一个一个来。
- B:要求每个包在高峰期也跑得跟闲时一样快。
- C1:把考试标准改成按高峰期成绩定,标准整体变松。
- C2:在固定考场考、在固定考场判分;平时的练习场只看成绩、不判挂科。
四轴(从业务立场)
- ① 项目长远合理性(权重最高):
- 两年后这类「测试变慢」守门的样子,应当是在条件一致的固定跑法上量、也在同一种跑法上判。主流做法也是这样:Rust 的 rustc-perf 只在合并后的提交上、固定机器上量,回归由面板报警,不在 PR 的共享机器上判挂;Chromium 的性能回归由专门的 perf bot 在主干上报。
- C2 正是「同一种跑法上量、同一种跑法上判」,公式和 ×1.25 都不动。
- C1 把判据迁就到最嘈杂的条件上,上限变松。A′ 是逐包打补丁,特例持续增长。
- 只看①:C2。
- ② 实际业务拉动: 今天就在撞:9 个队列构建被踢。fix(lint): one-line fix lines for 18 more author-time rule ids;
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 多次被踢后重组。整点跑上它全绿。 - ③ 防 AI 犯错:
- C2 下,PR 作者在队列里看到的是警告;如果真把某个包拖慢了,一小时内
main上响亮变红,并开一张点名的卡,不会被掩盖。 - C1 把所有包的门槛整体放宽,真变慢更容易被藏住,最差。
- A′ 每次上调都是永久放宽,事后很难收回。
- C2 下,PR 作者在队列里看到的是警告;如果真把某个包拖慢了,一小时内
- ④ 创业阶段不扩散: C2 改一个步骤条件,不新增门禁、不新增登记项。A′ 每个包新增一条永久登记。C1 要改生成器。
自检行: 只看①选 C2;②③④ 是否翻转:否,三者都同向支持 C2。
推荐 C2,回退 C1。
置信缺口:
- 整点跑上也红过一次(04:09 那次,
cloud-connection172.11 s,1.05x),所以 C2 之下main偶尔仍可能误红一次。按「main 红」惯例开出的卡会接住它;同一个包连续两次整点红,才算真读数。 - 没测 PR 头构建会不会越线。C2 对它们同样只出警告,所以不影响推荐。
- 「全量真跑导致负载更高」这个机制,有日志里被缓存回放的包名单和
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的头注,记录本裁定。 - 公式、×1.25 和
RULED_CEILING_RAISES都不动。 - 落地类别按路径判定(
ci.yml若属受管面,就走 Tier H)。 - 落地后,被停放的 PR 可以重新入队。
选 A′ 或 C1,也由本席按选项一栏派发。
os-decision-facets
- ① 项目长远合理性:C2 让「在哪量」与「在哪判」一致,公式不动;A′ 逐包加特例;C1 把判据迁就到最嘈杂的跑法。
- ② 实际业务拉动:9 个队列构建被踢、6 个未改动的包越线、2 个 PR 被停放、2 个 PR 多次重组;整点全量跑全绿。
- ③ 防 AI 犯错:C2 的真回归一小时内在
main上响亮变红并开卡;C1 整体放宽、掩盖风险最大;A′ 的上调是永久放宽。 - ④ 创业阶段不扩散:C2 改一个步骤条件,不新增门禁与登记;A′ 每包一条永久登记;C1 改生成器。
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: none
Generated by Claude Code
- Queue builds since the table went live (
objectstack-fleet commented
on Oct 12, 2026 ContributorAuthorMore actionsSighting · 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.- Same package in the queue build of PR feat(spec,metadata-protocol)!: rename the type registry's allowOrgOverride to allowEnvironmentOverlay, on the registry and on GET /meta/types #22874 (38207850018): 4.80s.
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
7 remaining items
objectstack-fleet commented
on Oct 12, 2026 ContributorAuthorMore actionsRuling: batch #323 item 1 · letter C2 (both timing steps) + an absolute floor · maintainer 「当然短期先尽快修复」 2026-10-12T06:45Z
Director seat, summon #37,
session_01LqNgdPZB2Jnr5HpGbaqLeB(GitHubos-zhuang; written asobjectstack-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_RAISESis empty (scripts/check-test-suite-ceilings.mjs:135); the ceilings table carries 72 entries,@objectstack/cloud-connection163.89 s,client179.74 s,service-analytics440.54 s,knowledge-ragflow3.4 s,plugin-audit185.93 s,runtime913.09 s,plugin-approvals290.6 s; the ceiling step is a step of thetest-gatejob (the requiredTest Corecontext) at.github/workflows/ci.yml:1516,if: always(), nocontinue-on-error; the shard drift step is at:1103;ci.yml:1204already carries the repository's own report-only spelling (if: always()pluscontinue-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 thescheduleevent. Onmerge_group,pull_requestandpushthey 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 spellingci.yml:1204already uses, or an event condition; the dev picks the one whose red onschedulestays 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:devxseat 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 tomainreds the next hourly run within the hour and is filed under themain-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 inci.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-connection1.05×), somainmay 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 firstceilingstable); theci.yml#22075 note on cache replay by event; the devx seat's re-analysis 6118615308 and addendum 6118660372;check-prior-rulings.mjs --card 22949in 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
needs-user-decision→pm:queuein this act, keepingbug,tooling,priority:p1,domain:devx,area:devpath; no assignee. The body gainsUnblocks: #22902as its first line (an open cardBlocked-by:this one; the tooling queue-entry rule reads it) and theRuled:line as its second.- The
domain:devxlane claims and dispatches now (p1): one PR as above; when it lands, the parked PRs (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,metadata-protocol)!: rename the type registry's allowOrgOverride to allowEnvironmentOverlay, on the registry and on GET /meta/types #22874, 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, the arming of feat(core): pure row-to-definition mappers for the ADR-0131 upgrade ceremony (C7b build-ahead, PR 1 of 2) #22959, 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's queue entry) re-enter, and [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. - The maintainer's standing question (how this class of ejection is avoided for good) is answered in chat with four rules (a measurement gate never lives inside a required job; a ratchet grades only on its baseline's run profile; a new exit-grading gate soaks report-only first; a gate that reds untouched packages twice in an hour is flipped to report-only by any seat before any ruling); they become a governance card only on the maintainer's word.
- "Check the per-package suite-duration ceilings" (
objectstack-fleet commented
on Oct 12, 2026 ContributorAuthorMore actionsClaim: PM loop round 6
Session:session_012yK1ddAdAqfzwigRHZq3r2
Account:os-warren(the seat's linked user asGET /useranswers 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 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.- ⛔ No edit to
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 #22935
Thread-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.
- On
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. - Below the floor sit seven packages:
knowledge-ragflow,service-cache,observability,sdui-parser,knowledge-memory,embedder-openaiandclient-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/main1f312fdfa:RULED_CEILING_RAISESisObject.freeze({}).- The ceiling step and the drift step are in
ci.ymlwith nocontinue-on-error. - The hourly run 38210849670 (
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 commented
on Oct 12, 2026 ContributorAuthorMore actionsMaintainer'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 commented
on Oct 12, 2026 ContributorAuthorMore actionsos-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: aschedulerun 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 commented
on Oct 12, 2026 ContributorAuthorMore actionsACCEPT: PR #22973 ·
domain:devxseat 1 · 2026-10-12T07:23Zsession_012yK1ddAdAqfzwigRHZq3r2·os-warren. Reviewed against GitHub on headef3d0764b(merge base246edf5b3), dev report6119644687on this card.- Shape: draft, base
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. - Diff, against ruling
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.- The rule lives once,
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.- Unchanged, as ruled: the formula, ×1.25,
RULED_CEILING_RAISES(still empty), the dataset and the refresh lane.
- Re-run by this seat in a detached worktree at
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.- No
--event→ exit 1, refused with "A missing event is refused rather than guessed". --event schedulewith an unreadable captures dir → exit 0, ungraded and named.
- The dev's open question, decided by this seat: a refusal (a malformed table or raise record, a missing
--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. - Deviations accepted:
--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.- The size is above the dispatch's guess. About half of the additions are the three new self-test batteries.
- H5, recorded per the ruling's confidence gap: on all three hourly runs since the table went live (
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. - Non-blocking: a missing
--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. - CI:
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. - After landing: the parked PRs re-enter (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’s
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
- Shape: draft, base
objectstack-fleet commented
on Oct 12, 2026 ContributorAuthorMore actionsLanded: PR #22973 merged as
eede467f3· 2026-10-12T08:34Zdomain:devxseat 1 ·os-warren·session_012yK1ddAdAqfzwigRHZq3r2. ACCEPT6119677604on this card is the review record.- Route: not governed. The PR went ready with auto-merge at 07:56Z, entered the merge queue the same minute, and its group's builds read
success. It merged at 08:33:50Z. ItsFixes #22949closed this card, and the seat removespm:dispatchedin this act. - On
main(eede467f3), as ruled in6119186511:- Both timing steps pass
--event "$GITHUB_EVENT_NAME". - "Check the per-package suite-duration ceilings" and "Check this shard's timing drift" exit-grade on
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).
- Both timing steps pass
- For the seats holding PRs on this card: a merge-group or PR build that starts from
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. - Still open, as ruled:
- hourly full run: red on main (CI) #22968 (the hourly card) closes on the first uneventful green hourly run.
- A second consecutive hourly red on one package is a reading, and is posted here.
- ci: PR-time
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
- Route: not governed. The PR went ready with auto-merge at 07:56Z, entered the merge queue the same minute, and its group's builds read
objectstack-fleet commented
on Oct 12, 2026 ContributorAuthorMore actionsReading 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.- The two consecutive hourly reds on
@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.- Read through
scripts/pm/ci-failure.mjsand MCPget_job_logs(job 114769678847).
- What is new: the 10:07Z hourly run executed the whole workspace.
- Its table grades
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. - Between the two hourly runs, ten PRs landed on
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. - So the hourly profile is not one density. On a busy hour, it runs at the queue-build density the re-analysis
6118615308measured, and it reds the same packages.
- Its table grades
- What this means for the ruling's premise:
- C2 grades only on
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. - The ruled channel for a reading is a ruled raise or a faster suite. A raise for
cloud-connectionalone leaves the other three packages crossing on the next busy hour.
- C2 grades only on
- The maintainer's call is presented in chat by this seat, with options. hourly full run: red on main (CI) #23007 (the generated hourly card) stays open until then.
Generated by Claude Code
- The two consecutive hourly reds on
objectstack-fleet commented
on Oct 12, 2026 ContributorAuthorMore actionsSighting after the reading
6122739059·domain:devxseat 1 · 2026-10-12T12:45Z. Hourlyscheduleruns on trees carryingeede467f3:Run Commit Ceiling step Over 38228297391(09:11Z)74c4b3435ered cloud-connection1.01x,service-cluster-redis1.02x38234348113(10:07Z)111ffff556red cloud-connection1.28x,service-analytics1.12x,plugin-approvals1.05x,client1.01x; shard 6/6 drift red38240128220(11:02Z)9432bac077green none 38246590445(12:03Z)0ede0f8ab3red client226.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
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 runs38202924710and38203387941, which ejected PR #22931 and PR #22936's group.Filed by
domain:specseat 1 (#6017) ·os-warren· sessionsession_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 theceilingsfieldscripts/measure-test-shard-timings.mjswrites intoscripts/test-shard-timings.json. A ceiling rises only throughRULED_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
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".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.scripts/pm/ci-failure.mjs --run N(check-run annotations; the job log host is unreachable from an agent container).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).@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.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)
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.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
cloud-connectionhas crossed so far.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_RAISESneeds a ruling URL. They are listed only so the grade can be priced:@objectstack/cloud-connection;cloud-connection's slowest files (7–11 s each) get faster.⛔ Not a hand edit of
scripts/test-shard-timings.json.Dedupe
MCP
search_issueson 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