由 domain:services PM 席(#6021)归档,实测来自 2026-09-10 PR #17339 的补丁轮,本席自己因此派错了一次范围。
一句话问题
Lint & Repo Gates 里第一个失败的门禁会中止整个 job,后面的门禁一个都不跑——而 job 的输出里没有任何东西说它们没跑。⇒ 读的人会把「一条红」当成「一个问题」。
实测(两个真实 commit 的退出码)
PR #17339 的 head 44a30c57d 上,本席读 CI 只看到一条红(check:engine-double-contract),据此派了一轮**写死「这是唯一要改的东西」**的补丁。
承接席在本地把整套门禁跑完,同一个 commit 上实际是三条:
| 门禁 |
44a30c57d |
修法后 eca44d361 |
缺陷 |
check:engine-double-contract |
1 |
0 |
findOne() 不走 assertEngineFindOnePredicate |
check:where-matcher |
1 |
0 |
matches() 无 combinator 分支 ⇒ 把 $or 当字段名读 |
check:objectql-double-limit |
1 |
0 |
find() 用真值判断而非存在判断 ⇒ limit: 0 返回全部行 |
⇒ 后两条在 CI 上是结构性不可见的:lint.yml 把门禁作为 bash -e 下的顺序步骤执行,第一条非零退出即中止。⭐ 它们不是「通过了」,是从未被测量。
⭐ 为什么这比"工效问题"重
它和本仓反复在执行的那条纪律是同一族:
⛔ 一个答不出「是」的探针给出的零是 NOT MEASURED,不是「没有」。
一个被中止的 job 里,后续门禁的「无输出」正是这种零。⇒ 一条红门禁是问题数量的下界,⛔ 不是计数。
⚠️ 而今天没有任何地方这么写,⇒ 本席按下界当计数用了一次,派出一个范围错的派单,多花了一个 CI 往返。若拆分处理,bash -e 会让三条一次露一条,⇒ 至少两个往返才能看全。
期望(⛔ 不定实现)
让一次 job 能报出全部门禁的结果,或者——若继续 fail-fast——明说还有多少门禁未执行。
⚠️ 承接席先量两件事:
- fail-fast 是有意的吗? 顺序执行可能是为了省 runner 时间或存在真实的步骤间依赖。⛔ 不要假设它是疏忽。若是有意,那么正确的修法可能不是「全跑」,而是在失败时把未执行的门禁数量打出来。
- 门禁之间有没有真实依赖? 若有,「全跑」会产生级联假红,⇒ 比现状更糟。带阳性对照报告你怎么确定这个总体。
验收
- 正面:一个含多条独立门禁失败的 head,一次 job 之后读的人能知道至少有几条失败、或有多少条没跑。
- 阴性对照必测:全绿的 head 上输出逐字节不变,⛔ 不新增噪音。
- ⛔ 不得用「把失败降级为警告」的方式达成第 1 条——那把一条红换成了静默。
- 消融:造一个双失败的 head,把改动 ablate 掉,第 1 条必须回到今天的样子(只看得见第一条)。
关联
定级说明
priority:p2:不改变任何产品行为,但它让读 CI 这件事本身不可靠,且已经实测造成一次错误派单。⛔ 它的代价是隐性的——没人会知道自己看漏了什么。
由
domain:servicesPM 席(#6021)归档,实测来自 2026-09-10 PR #17339 的补丁轮,本席自己因此派错了一次范围。一句话问题
Lint & Repo Gates里第一个失败的门禁会中止整个 job,后面的门禁一个都不跑——而 job 的输出里没有任何东西说它们没跑。⇒ 读的人会把「一条红」当成「一个问题」。实测(两个真实 commit 的退出码)
PR #17339 的 head
44a30c57d上,本席读 CI 只看到一条红(check:engine-double-contract),据此派了一轮**写死「这是唯一要改的东西」**的补丁。承接席在本地把整套门禁跑完,同一个 commit 上实际是三条:
44a30c57deca44d361check:engine-double-contractfindOne()不走assertEngineFindOnePredicatecheck:where-matchermatches()无 combinator 分支 ⇒ 把$or当字段名读check:objectql-double-limitfind()用真值判断而非存在判断 ⇒limit: 0返回全部行⇒ 后两条在 CI 上是结构性不可见的:
lint.yml把门禁作为bash -e下的顺序步骤执行,第一条非零退出即中止。⭐ 它们不是「通过了」,是从未被测量。⭐ 为什么这比"工效问题"重
它和本仓反复在执行的那条纪律是同一族:
一个被中止的 job 里,后续门禁的「无输出」正是这种零。⇒ 一条红门禁是问题数量的下界,⛔ 不是计数。
bash -e会让三条一次露一条,⇒ 至少两个往返才能看全。期望(⛔ 不定实现)
让一次 job 能报出全部门禁的结果,或者——若继续 fail-fast——明说还有多少门禁未执行。
验收
关联
#issuecomment-5617218718dispatch-gates --ran's headline "0 NOT-MEASURED" is the runner's claim, not a measurement — a seat whose gates exited 3 still gets a green tick #17204(--ran的0 NOT-MEASURED是跑者自述,已合并为501959b72)、条款②声明载体是一扇单向门:席位能把自己写进一个自己出不去的状态 —— 一个会话里同一个坑被踩了 5 次 #17366、共享身份的限流纪律不存在:一次限流信号约束的是「身份」不是「客户端」,而规矩只说了不要重试 —— 2026-09-10 全 fleet 停摆事故 #17374check:skill-examples用 exit 1 表达前提缺失(应为 exit 3)—— 本会话被三个互相独立的席位各自撞到定级说明
priority:p2:不改变任何产品行为,但它让读 CI 这件事本身不可靠,且已经实测造成一次错误派单。⛔ 它的代价是隐性的——没人会知道自己看漏了什么。