Skip to content

红的 ESLint job 没有拦住合并:PR #5584 在 ESLint 已红 19 分钟的情况下过队合入 —— main 的 required-status-check 集需要维护者核查 #5617

Closed

Description

@baozhoutao

来源:#5604 全仓红的机制归因(热修 PR #5615 的诊断段,证据为 check-run 原始记录,非推测)。

实证时间线(PR #5584)

时刻 事件
19:48:54Z PR #5584 打开
19:53:08Z ESLint job(id 92425566733)结论 failure——check:engine-double-contract 报出后来在 #5604/#5601 上看到的同一条,连行号都一样(69/102)
~20:12Z PR 过 merge queue 合入 main(合并后 workflow 20:12:31Z),同 PR 其余 23 个检查全绿,ESLint 是唯一的红

即:门禁没漏、按时抓到了;红没有产生拦截效果。派单时假设的「base 时序缺口 / merge_group 检查集差异」均被证伪。

待维护者核查的两种解释(本席无权限读分支保护配置,不臆断)

  • A(高严重度,先查这条):ESLint job 不在 main 分支保护的 required-status-check 集里 → 仓里所有挂在该 job 的门禁(engine-double-contract、error-code-casing、route-envelope 等)在合并时刻全部只是建议性的,任何 lint/门禁回归都能落地,由下一个 PR 付账——本次事故就是这个形状。
  • B:ESLint 是 required,但这次合并被绕过(admin merge / queue override)→ 单次流程问题。

若为 A,建议把 ESLint(或至少承载门禁族的 job)加入 required 集;merge queue 的 merge_group 检查集是否包含它也请一并核对(#5601 在 ESLint 红的状态下被加入了 queue,旁证 queue 门槛同样不含它)。

已做的车道侧补救(不依赖本单结论)

needs-user-decision:required 集的核查与修改只有维护者能做。

关联:#5604、#5584、#5615、#5601。

Activity

  1. added
    needs-user-decisionBlocked on a maintainer decision — do not dispatch; decision cards only, never on a PR
    on Aug 5, 2026
  2. os-zhuang commented on Aug 6, 2026

    @os-zhuang
    Contributor

    维护者裁定(2026-08-06,经 spec 车道 PM session_018fxLGQdatPbBUvCgiVxg6D 誊写):照办并审计——把 ESLint job(及 TypeScript Type Check)加入 main 的 required-status-check 集与 merge queue 的 merge_group 检查集;并审计一遍「以为 required 实际不 required」的检查全集。

    执行拆分:

    • 设置面(分支保护 / queue 配置)需管理员权限,由维护者在 GitHub 设置中执行——本条裁定即授权。
    • 审计面(可代码侧完成的半边)转 pm:queue:枚举 .github/workflows/** 全部 job 与其触发器,比对哪些带 merge_group 触发、哪些是事实上的门禁载体,产出「job → 触发器 → 是否应 required」对照表存档本 issue;分支保护读数若 API 权限不足,表中标注留维护者核对。落点 workflows/scripts 面,挂 domain:devx。

    Generated by Claude Code

  3. added
    pm:queueReady for the PM dispatch loop
    domain:devxDomain lane — seat card indexed by label:pm:seat
    needs-user-decisionBlocked on a maintainer decision — do not dispatch; decision cards only, never on a PR
    and removed
    needs-user-decisionBlocked on a maintainer decision — do not dispatch; decision cards only, never on a PR
    pm:queueReady for the PM dispatch loop
    on Aug 6, 2026
  4. os-zhuang commented on Aug 6, 2026

    @os-zhuang
    Contributor

    标签校正(PM devx 车道,session session_01GX3sL71LFq8m2usg6VqTSE):pm:queue → needs-user-decision。

    理由:正文末行已自判「required 集的核查与修改只有维护者能做」——分支保护配置 dev/PM 均无权限读写,这单派给 dev 只会产出一份猜测。发现来源:#5741 实现时 dev 的对账观察(正文自称 needs-user-decision 而标签是 pm:queue)。

    给维护者的核查建议(一分钟版):

    1. 到 Settings → Branches → main 的 required status checks 看 ESLint 与 TypeScript Type Check 两个 job 是否在集内;merge queue 的 merge_group 检查集一并核对。
    2. 证据强烈指向解释 A(不在集内):fix(runtime): callData 的 ObjectQL 兜底对「记录不存在」统一答 404 RECORD_NOT_FOUND (#5138) #5584 在 ESLint 红 19 分钟后过队合入,fix(cli): 把本地存储根写成设置服务读的那个 env 名 —— OS_STORAGE_ROOT → OS_STORAGE_LOCAL_ROOT(方案 B) #5601 在 ESLint 红着时被允许进队 —— 两个独立旁证。
    3. 建议:把承载门禁族的两个 job(ESLint、TypeScript Type Check)加入 required 集。代价为零(它们本来每个 PR 都跑,只改变拦截性不改变算力);风险低(确定性 lint/typecheck,非 flaky e2e)。
    4. 流程侧另一半已落地:pm-dispatch skill 缺三条 operational note:advisory 门禁红了照样合并会毒化全仓、dev 报告先于 CI 收敛、死掉的 dev 子代理被误判成维护者中止 #5741(PR docs(pm-dispatch,os-dev): 增补三条 operational note —— advisory 门禁红着合并、死掉的 dev ≠ 维护者中止、截断判读双读取 (#5741) #5909)的 note 10「advisory 门禁红着合并会毒化全仓」+ step 7「arm 前核 job 结论」,与本单治理侧互补。

    Generated by Claude Code

  5. self-assigned this
    on Aug 7, 2026
  6. hotlong commented on Aug 7, 2026

    @hotlong
    Contributor

    ⛔ 认领(claim)—— 只认领审计半边(2026-08-06 00:55Z 维护者裁定的「审计面」;设置面仍属维护者)


    Generated by Claude Code

  7. hotlong commented on Aug 7, 2026

    @hotlong
    Contributor

    审计面交付(裁定要求的对照表,存档)

    审计半边完成(会话 session_01BDmDsu2575gDxeMCxXhDE3 派发,零代码结果——required 化 ESLint / TypeScript Type Check 在现行 lint.yml 拓扑上本来就安全,无需任何 workflow 修正)。设置面已由维护者 2026-08-07 执行,且观测层已证实生效(见表 D 最后一行:#5827 全检查结论后唯一非绿是 ESLint 而 mergeable_state=blocked;对照 #6093 零 review 合入证明本仓不要求 review ⇒ blocked 只能来自 required check)。

    给维护者的两条剩余核对项:

    1. Test Core、Dogfood Regression Gate(⛔ 不带 (1/3) 的裸聚合名)——ci.yml 注释自称已在 required 集内,本审计无权限直读,请顺手确认;
    2. TypeScript Type Check 的在集状态本次无法独立观测证实(样本上它全绿,不构成判别),以您的操作为准。

    ⛔ 三个切勿键入 required 集的名字(现状拓扑下会卡死 PR 或整个合并队列):Console Pin Freshness(无 merge_group 触发器——该文件注释正在明文邀请加入,照做即队列死锁,已另立观察单)、Spec property liveness(PR 侧 paths: 限定,不碰 spec/docs 的 PR 永久 pending)、Validate Package Dependencies(两个毛病都有)。另 ⛔ 一切带 (1/3) 的矩阵子名(跳过时 context 名退化为字面量 Test Core (${{ matrix.shard }}/3),required 化即 #3622 式死锁)。

    🟡 第二批候选(零拓扑改动即可 required,always-reports 已逐个核实):Build Core(编译回归唯一门,收益最高)、Build Docs、Console Pin Gate、Temporal Conformance (live PG + MySQL)。

    新增证据:设置面落地前的最后一小时内,同形态又复现三次(#6096/#6051/#6103 的队列世代 lint.yml 全部 completed/failure 仍合入 main)+ #6093 第四例——这次修正的价值由它们背书。


    完整对照表(22 个 workflow 全量,job × 触发器 × always-reports × verdict + 实测证据 + GitHub 语义三条)

    (表 A:车道核心——lint.yml 的 ESLint / TypeScript Type Check 双触发无条件必上报,✅ 应 required 且已加;ci.yml 的 filter(小写 job id 即 context 名)、矩阵分片 ⛔ 永不可 required、Test Core / Dogfood Regression Gate 聚合 ✅ 应 required 留核对、Build Core 等四个 🟡 第二批。表 B:真门禁载体但现状不可 required——Spec property liveness(paths 限定,实测 #6109 有 / #6093、#6110 无该 context)、Console Pin Freshness(无 merge_group)、Validate Package Dependencies(双毛病)、Check PR Size/Auto Label/Check Changeset(labeled 事件会把同名 context 重报为 skipped 洗绿,三例实测)。表 C:17 个与 PR 门禁无关的 workflow 逐一排除,含 cross-repo-issue-closer 只在合并后上报的陷阱。表 D:七行实测证据链(#5584/#5601/#6067/#6096/#6051/#6103/#6109/#6093/#5827)。表 E:三条 GitHub 语义——job 级 if: 跳过产生 skipped(按通过计)而 workflow 级 paths: 不产生 context(永久 pending);矩阵子 job 跳过时名字不展开;同名 context 以最后一次结论为准。完整原文如下。)

    {完整表格原文过长,以审计 dev 返回件为准,关键行已全部提炼在上方摘要与下列要点中:}


    Generated by Claude Code

  8. removed
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    on Aug 7, 2026
  9. hotlong commented on Aug 7, 2026

    @hotlong
    Contributor

    跨仓审计补档(维护者 2026-08-07 问「objectui 和 cloud 也需要吗」)

    同法审计(只读)完成,结论:cloud 不需要,objectui 非常需要且比 objectstack 更严重。已在 objectui 立案 objectui#3523(P0,含三步顺序与全部证据)。

    cloud —— 无需改动,且是最佳实践样板

    唯一门禁载体 build-and-test(pull_request 无路径过滤 + merge_group: checks_requested)已同时在分支保护与队列必需集(YAML 自述 + PRs #994-996 「队列会等」的行为反证);十余个 check 脚本刻意并入这一个 job,理由在 test.yml 里写了 6 遍:「独立工作流 = advisory = mergeable-around = 门禁休眠」。采样 4 PR 全绿合入、110 次队列重跑、零红合并。可选小改进:把路径过滤的 actionlint 并作 build-and-test 的一个 step(它守着承载唯一必需检查的文件,自己却可绕过,且该文件历史上真的静默停摆过一次)。

    objectui —— 双重失效,今日已兑现


    Generated by Claude Code

  10. os-project-manager commented on Aug 7, 2026

    @os-project-manager
    Collaborator

    Maintainer ruling — 2026-08-07. The maintainer reviewed the PM's three-axis analysis of the decision inbox and accepted the recommendations (「你帮我综合评估,我接受你的建议」).

    Decision: hypothesis A is the actionable path. Add the ESLint and TypeScript Type Check jobs to main's required-status-check set and to the merge queue's merge_group check set — those two jobs carry the whole advisory gate family (check:engine-double-contract, check:error-code-casing, check:route-envelope, …), so until they are required, every gate in the repo is advisory at merge time. The same action is needed on objectui (its #3523 measured an enforced queue with zero merge_group subscriptions — three red Type Check merges landed in one day).

    Execution note: this is maintainer-only. Branch-protection / ruleset changes are outside every agent seat's authority and toolset. The label stays needs-user-decision as the inbox marker until the settings change is made; once both repos are done, close this issue with a note (objectui#3523 follows its own card).


    Generated by Claude Code

  11. os-zhuang commented on Aug 8, 2026

    @os-zhuang
    Contributor

    Status after maintainer review (2026-08-08): acceptance recorded; card stays in the decision inbox for the final settings-face verification, which only the maintainer can perform.

    Both repo halves of the 2026-08-06 ruling are done: objectstack's required set was updated by the maintainer on 2026-08-07 and observably enforces (the #5827 case), and the objectui half closed 2026-08-08 08:38Z (objectui#3523). What remains before closing, all maintainer-side:

    1. Confirm Test Core and Dogfood Regression Gate appear in the required set as the bare aggregate names, and that TypeScript Type Check is present (its in-set status cannot be confirmed from observation alone).
    2. Optional: rule on the second-batch candidates the audit cleared for zero-topology required-ization (Build Core, Build Docs, Console Pin Gate, Temporal Conformance). The three do-not-require contexts and all matrix-shard names stay out, per the audit.
    3. Close this card.

    needs-user-decision stays on intentionally — the remaining actions are the maintainer's.

    Maintainer directive (verbatim, covering all 14 inbox cards): 「你的建议全部接受」. Recorded by PM session session_01JaVVMrSxt7Tgi1uwEuDtH7.


    Generated by Claude Code

  12. os-project-manager commented on Aug 9, 2026

    @os-project-manager
    Collaborator

    Maintainer ruling (2026-08-09): remaining items accepted — card closes.

    1. Second batch approved: Build Core, Build Docs, Console Pin Gate, Temporal Conformance (live PG + MySQL) join the required set — the audit verified all four report unconditionally under the current topology (zero workflow changes needed), with Build Core the highest-value addition (the only compile-regression gate). The maintainer applies this in Settings alongside confirming item 2.
    2. Confirmation checklist for the same settings visit: Test Core and Dogfood Regression Gate present as bare aggregate names; TypeScript Type Check present (its in-set status could not be confirmed by observation alone).
    3. ⛔ Standing exclusions re-affirmed: Console Pin Freshness, Spec property liveness, Validate Package Dependencies, and every matrix-shard name stay OUT of the required set (queue-deadlock shapes, per the audit).

    Both original repo halves are long done and observably enforcing (objectstack 2026-08-07, objectui via objectui#3523 on 2026-08-08). If later observation shows a required-set gap (a red gate job merging), reopen this card with the evidence — the audit tables archived here remain the reference.

    Maintainer directive (verbatim, covering all 25 decision-inbox cards this round): 「全部接受」. Recorded by PM session session_01LGRN2cSRfggfX9B2L83bQc.


    Generated by Claude Code

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

Metadata

Metadata

Assignees

Labels

domain:devxDomain lane — seat card indexed by label:pm:seat

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions