diff --git a/.github/scripts/check-ci-gates.py b/.github/scripts/check-ci-gates.py index e25d3e10..e0137dc3 100755 --- a/.github/scripts/check-ci-gates.py +++ b/.github/scripts/check-ci-gates.py @@ -168,16 +168,32 @@ else: "守卫不能把「排除项删干净」与「漏写标记」混为一谈") # ── 反向:空体没有任何标记 ⇒ 必须红(这就是 ID:19 的假绿入口)── - for _bad_name, _bad_inner in [ + # + # ★ 样本数必须被断言(ID:19 变异 M8 抓出来的缺口): + # 上面这组反向自测自己也可能被改坏 —— 把容器换成 `[] and [...]` + # 或 `[] or [...]` 后循环空转、一条都不跑,而**没人发现**。 + # 实测:那份变异下本脚本 exit=0、零失败(自测静默死掉)。 + # 所以先把样本集固化成一个常量,再断言它的长度, + # 这样"改坏容器"与"删掉样本"都会红。 + _EMPTY_BAD_CASES = [ ("完全空体", ""), ("只有空行", "\n"), ("只有空行+空白", "\n \n"), ("非显式标记的注释", "# 无排除项"), - ]: + ] + if len(_EMPTY_BAD_CASES) != 4: + fails.append("空表反向样本数变了(期望 4,实际 %d)—— 除新增样本,否则说明样本被删" + % len(_EMPTY_BAD_CASES)) + for _bad_name, _bad_inner in _EMPTY_BAD_CASES: if _run_body(_replace_table(_bad_inner)).returncode == 0: fails.append( "空表形态「%s」竟通过 ⇒ 空表显式声明守卫已失效" "(表被删空与有意清空无法区分,排除项漏删会静默变绿)" % _bad_name) + # 且必须真的跑了 4 条(防容器被换成 `[] and [...]` 这类空转写法) + _ran = sum(1 for _n, _i in _EMPTY_BAD_CASES + if _run_body(_replace_table(_i)).returncode != 0) + if _ran != 4: + fails.append("空表反向自测实际只咬了 %d/4 条 —— 自测自身被改坏或空转" % _ran) _probe = "test|internal/probe/synthetic|TestSyntheticProbe" # 只打 reason:reason 空、ticket 有效 diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f1bbfd27..ac6f0a90 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -225,7 +225,7 @@ jobs: set -euo pipefail # 列名:粒度|目标|原因|修复单号 (用 | 分隔,原因内可含空格) read -r -d '' TABLE <<'EOF' || true - pkg|internal/kernelmod/all|*(整包)|该包把真实整机装起来(bootgraph_test.go 的整机判据) ⇒ 第 4 层 agent 与 plugin-host 并行 Init 时,双方都无锁直写同一 plugin.Registry 的 7 个 Set*(SetLuaVM/SetBaseAPIKey/SetSupervisor/SetTracker/SetConfig/SetStageHost/SetIndexer,registry.go:231-284)。竞争在**内核装配**里,不在本包代码里;任何装整机的用例都会撞上。★ 目标包随 ID:13 迁到此(原 internal/kernelboot/modules 已删)|KERNEL-REGISTRY-SETLOCK + # none EOF tests=""; pkgs=""; n=0