Skip to content

[Decision] Test Core shard timeout: land 40 as ruled, keep 45, or raise to 50 so the stall guard's cap verdict lands before the job dies #22516

Closed

Description

@objectstack-fleet

This card carries the value of the Test Core shard timeout-minutes. Its parent, #22075, keeps everything else; its ruled re-size is built as PR #22512 (45 → 40), held in draft until this answer. Filed by domain:devx seat 1 · os-bill · session_01LYXc6ckoWuZyVZpWYizdMh. The platform dates this card.

维护者速读

一小时前你选了 #22075 的 A,其中一项是「按实测把 45 分钟的分片超时下调」。「下调」这两个字是席位写的,席位当时没有核对卡死守卫(stall guard)。dev 实测 396 个分片 job 后发现:超时降到 40,守卫最重要的那条「封顶判定」会有 15% 的情形来不及开口,任务就被超时直接杀掉,只留一个没有说明的超时;保持 45 是 2%;升到 50 是 0%。正常运行的耗时不受这个值影响,它只决定卡死时谁先说话。推荐 C:升到 50。 回复一行即可,例如「C」。

一句话问题。 测试分片卡死时,应该先由守卫报出「卡在哪里」,还是早 5 分钟被超时无声杀掉?

Governing text

前提(每条带复核命令)

  1. 静态预算门禁在 40 下仍然通过(守卫窗口 10 分钟、封顶 20 分钟)。复核:node scripts/check-stall-guard-budget.mjs --list(在 PR ci(test-core): the Test Core shard wall is 50, so both stall-guard verdicts land before it #22512 head a549ca3a 上 exit 0,席位已重跑)。
  2. 实测值(dev 报告 6085414584,席位未重测):窗口内 396 个 Test Core (N/6) job,最慢一个是 27m05s(run 37923333449,3/6);守卫所在步骤结束时最晚已是 job 开始后 26m38s。
    • 窗口判定(+10 分钟)最晚在 36m38s 落下:40 下来得及,35 下来不及。
    • 封顶判定(+20 分钟)最晚在 46m38s 落下,要求超时至少 47 分钟。来不及的比例:45 下 8/396,40 下 60/396,50 下 0/396。
    • 复核:node scripts/measure-stall-guard-headroom.mjs --run 37923333449。
  3. 正常运行的耗时与这个值无关;它只决定卡死的 job 在第几分钟被杀。复核:读 ci.yml 该 job 的 timeout-minutes 上方注释。

选项

选项 做什么 后果
A. 40(按裁决字面,即 PR #22512 现状) 合并 PR #22512 卡死的 job 早 5 分钟结束;封顶判定 15% 的情形失声,变成无说明的超时
B. 保持 45 PR #22512 改成只更新注释(写入实测窗口和守卫读数),数值不变 与今天一样:2% 的情形失声
C. 升到 50 PR #22512 改成 50,注释写明「由守卫两条判定路径 + 实测墙钟推导」,回退到 30 的条件同步改写 守卫两条路径都先于超时开口;卡死的 job 多跑 5 分钟才被兜底杀掉

业务含义直译: 超时是火警铃响后的强制断电,守卫是先报「哪里着火」的烟感器。A 是把断电提前 5 分钟,代价是更多时候烟感器还没来得及报;C 是让烟感器总能先报,再断电。

四轴(业务立场)

  • ① 项目长远合理性: 两年后的样子:超时只做兜底,数值由守卫的两条判定路径和实测墙钟推导,守卫永远先开口(主流 CI 的超时也是 watchdog 之外的最后一道)。C 是这个终态;A 让兜底抢在守卫前面。
  • ② 实际业务拉动: 正常运行不受影响;卡死本身罕见。拉动在于卡死时开发者能否看到「卡在哪」,而不是早 5 分钟拿到一个红叉。
  • ③ 防 AI 犯错: 无说明的超时会把流水线 bug 藏起来,下一个 agent 只会重跑;守卫的判定会点名卡住的步骤。C、B 优于 A。
  • ④ 创业阶段不扩散: 三个选项都只改一个数,不加门禁、不加零件。
os-decision-facets
① 项目长远合理性:超时是兜底,应由守卫两条判定路径与实测墙钟推导;C 是终态,A 让兜底抢在守卫之前。
② 实际业务拉动:正常运行耗时不变;拉动是卡死时能否看到卡在哪一步。
③ 防 AI 犯错:守卫点名卡住的步骤,无说明超时只会诱导重跑;C、B 优于 A。
④ 创业阶段不扩散:三者都只改一个数,零新增。
Prior rulings read: ruling 6083012192 (#22075, A: the re-size, worded 下调 by the seat's option text); scripts/check-stall-guard-budget.mjs and measure-stall-guard-headroom.mjs headers; ADR none; thread: 0 rulings on the value itself

推荐 C,回退 B。 自检:只看①选 C;②③④ 是否翻转:否。

置信缺口: 窗口只有约 5.6 小时;封顶判定只在缓冲层把活着的测试藏起来时才会用到(守卫自己的说法是这本身是一个流水线 bug),多罕见没有读数。同样的封顶缺口在 dogfood 与 temporal-conformance 两步上也存在(需 33 与 31 分钟,现为 30),本卡不处理。

裁后执行

Activity

  1. added
    toolingFix lands in tooling, not a product package — enters pm:queue only with Unblocks: or a named surface
    needs-user-decisionBlocked on a maintainer decision — do not dispatch; decision cards only, never on a PR
    domain:devxDomain lane — seat card indexed by label:pm:seat
    area:devpathThe road — create, dev, verify, publish/install, connect an agent, iterate
    on Oct 9, 2026
  2. objectstack-fleet commented on Oct 10, 2026

    @objectstack-fleet
    ContributorAuthor

    Ruling: letter C (raise the Test Core shard timeout-minutes to 50) · maintainer, answering in domain:devx seat 1's session chat · 2026-10-10T00:13Z

    domain:devx seat 1 · os-bill · session_01LYXc6ckoWuZyVZpWYizdMh. Presented as this card's body. The maintainer's answer, verbatim (the option label chosen in the session's question prompt): 「C 升到 50 (Recommended)」. Thread-read: none (no comment on this card before this record). Freshness: the body is unchanged since filing.

    The ruling

    Execution

  3. removed
    needs-user-decisionBlocked on a maintainer decision — do not dispatch; decision cards only, never on a PR
    on Oct 10, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    area:devpathThe road — create, dev, verify, publish/install, connect an agent, iteratedomain:devxDomain lane — seat card indexed by label:pm:seatpriority:p2Medium: important, M3toolingFix lands in tooling, not a product package — enters pm:queue only with Unblocks: or a named surface

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions