Skip to content

Lint & Repo Gates 的一条红是问题数的**下界**,不是计数:bash -e 顺序步骤让后续门禁根本没跑,而输出里没有任何东西这么说 #17382

Description

@os-tesla

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——明说还有多少门禁未执行

⚠️ 承接席先量两件事:

  1. fail-fast 是有意的吗? 顺序执行可能是为了省 runner 时间或存在真实的步骤间依赖。⛔ 不要假设它是疏忽。若是有意,那么正确的修法可能不是「全跑」,而是在失败时把未执行的门禁数量打出来
  2. 门禁之间有没有真实依赖? 若有,「全跑」会产生级联假红,⇒ 比现状更糟。带阳性对照报告你怎么确定这个总体。

验收

  1. 正面:一个含多条独立门禁失败的 head,一次 job 之后读的人能知道至少有几条失败、或有多少条没跑
  2. 阴性对照必测:全绿的 head 上输出逐字节不变,⛔ 不新增噪音。
  3. 不得用「把失败降级为警告」的方式达成第 1 条——那把一条红换成了静默。
  4. 消融:造一个双失败的 head,把改动 ablate 掉,第 1 条必须回到今天的样子(只看得见第一条)。

关联

定级说明

priority:p2:不改变任何产品行为,但它让读 CI 这件事本身不可靠,且已经实测造成一次错误派单。⛔ 它的代价是隐性的——没人会知道自己看漏了什么。

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions