Files
HomeAgent/.github/workflows
JianFeeeee 49141fe6f0 ci: 把 check-ci-gates.py 接进 go job,CI 自己检查自己的配置不许静默退化
背景:.github/scripts/check-ci-gates.py 上一轮已写好并入仓(ed8f28e),
但它**没被任何 workflow 调用** —— `grep check-ci-gates .github/workflows/ci.yml`
零命中。等于判据只活在评审口径里,CI 实际上不跑它。本次把它接上。

## 一、ci.yml:新增 2 步(go job,插在 go vet 之后、go test 之前)

- `actions/setup-python@v7`(3.12)
- `CI 配置门禁自检(动态枚举 / 排除表 / 启动图判据不许静默退化)`

位置为什么在 go test ./... **之前**而不是之后:

  · 该步骤是纯静态检查 —— 只读 ci.yml,秒级,无网络、无 cgo、
    不建 SQLite、不占端口;而 go test ./... 要跑 20 分钟。
  · 「门禁本身坏掉」应该第一时间红。放后面会让一次坏配置白白消耗
    20 分钟机器时间才发现,也让失败信号埋在 93 个包的输出后面。

runner 的 pyyaml **不假设自带**:先 `python3 -c 'import yaml'` 探测,
缺了才 `pip install pyyaml`(幂等,几秒)。本机实测 pyyaml 6.0.3 已有,
但本机的 Python 环境不等于 runner —— 所以做探测而不是赌。

## 二、顺手纳管 internal/kernelboot/modules/registry.go 的注释改动

该文件 +6/−3 的改动是**纯注释**,内容为 11:08 那轮已拍板要记进文件头的说明:
真相源为什么刻意不扫 `kernelmod.Register(...)` 调用点 ——
删掉某模块的 init() 后调用点消失,源码侧与登记表侧会同时少一个,
比对照样相等 ⇒ 假绿。手写模块名清单同理。故真相源取
「目录+类型名复合键 + 四方法齐全」的类型,而不是要检测对象的入口。

★ 这点在 commit message 里点明,是为了不让它变成夹带:它不是本次新写的代码,
  是上一轮已定但未提交的说明文字,与本次「门禁入 CI」同一主题(判据不许假绿)。

## 三、验证(先证能红,再证能绿,都不靠嘴说)

从 ci.yml 里**抽出该 step 的 run 块原样执行**(不是手敲等价命令):
  · 变色前(动态枚举改回写死 ./internal/agent/core/ ./cmd/waiter/)
    → EXIT=1,报 `race job 应恰有一步用 go list ./... 动态枚举包(实际 0 步)`
  · 还原后 → EXIT=0,报「CI 门禁自检通过:动态枚举 / 排除表校验 / 启动图判据步骤 / 交叉枚举 / 全部 run 步骤语法」

另在临时副本里抽查 5 个变异,4 个如期变红(写死枚举 / 去掉 -count=1 /
-race 不吃枚举 / cross 写死 cmd)。第 5 个「删掉排除表的原因校验」**没红** ——
已定位为脚本自身缺口,见下条,不在本次授权范围故未改。

## 四、已知遗留(未修,留给后续)

check-ci-gates.py 第 100 行用的是 `any("没有写原因" in r for ...)` ——
它只检查**提示文案还在**,不检查那段 `if [ -z "${reason// /}" ]` 校验逻辑本身。
于是把条件改成 `if false;` 而保留文案,断言仍然绿(实测 EXIT=0)。
判据被注释/文案顶包,与它自己在 docstring 里批判的「注释骗过 grep」是同一类错误。
属于该脚本的缺陷,本次任务授权只到「接进 CI」,故只记录不修。
2026-10-24 11:55:28 +08:00
..