现状:3 个 L1 套件改了不会触发跑它们的那道门
scripts/qa.sh 的 L1_TESTS 有 17 个套件,由 qa.yml 的 qa job 执行。
把这 17 个逐个与 qa.yml 的 paths: 过滤比对:
| 套件 |
paths 覆盖 |
qa-cli-01 … qa-node-03b(13 个) |
✅ 被 tests/qa-*/** 覆盖 |
test746-setup-bun-pin |
✅ paths 里显式列了 |
test686-rest-shape-golden |
❌ |
test765-batch-runtime-gate |
❌ |
test766-bunx-preflight |
❌ |
qa.yml 的 paths: 原文(origin/main):
pull_request.paths:
server/**
agent-network/**
agent-node/**
tests/qa-*/**
scripts/qa.sh
docs/qa/**
.github/workflows/qa.yml
tests/test725-agent-node-unit-ci/**
tests/test745-agent-network-unit-ci/**
tests/test746-setup-bun-pin/**
显式列了 test725 / test745 / test746,唯独漏了这三个;也没有 tests/** 这类兜底。
没有别的 workflow 兜底
$ git grep -c 'test686\|test765\|test766' origin/main -- '.github/**'
(三个都是 0 个文件命中)
全部 workflow 里提到 qa.sh 或这三个套件的:只有 .github/workflows/qa.yml
所以这三个套件在整个 CI 配置里没有被任何 paths 提及过。
后果
一个只改 tests/test686-rest-shape-golden/**(或 765 / 766)的 PR,
不会触发 qa.yml —— 跑它们的那道门根本不启动。把这三个门本身改坏、
改成永远通过、甚至删掉它们的断言,PR 都会全绿,要等别的改动顺带触发才暴露。
对照:test725 / test745 有自己的 Docker job 并且在 paths 里,不存在这个问题。
这是同一形状的第三例
共同点是**「在一处注册,在另一处忘了登记」**,而两处之间没有任何机制保证同步。
#835 那次的修法是把成因去掉(逐套件白名单 → 按套件名推导),
这里同样可以根除,而不是再补三行:
本 issue 只记录,未改动任何文件。
顺带:一处 push / pull_request 不对称
pull_request.paths 里有 docs/qa/**,push.paths 里没有。
不影响本条结论,但同一个 workflow 的两个触发器过滤不一致,通常不是有意的。
复现(只读)
git show origin/main:scripts/qa.sh | sed -n '/^L1_TESTS=(/,/^)/p'
git show origin/main:.github/workflows/qa.yml # 看 on.*.paths
git grep -c 'test686\|test765\|test766' origin/main -- '.github/**'
现状:3 个 L1 套件改了不会触发跑它们的那道门
scripts/qa.sh的L1_TESTS有 17 个套件,由qa.yml的qajob 执行。把这 17 个逐个与
qa.yml的paths:过滤比对:qa-cli-01…qa-node-03b(13 个)tests/qa-*/**覆盖test746-setup-bun-pintest686-rest-shape-goldentest765-batch-runtime-gatetest766-bunx-preflightqa.yml的paths:原文(origin/main):显式列了
test725/test745/test746,唯独漏了这三个;也没有tests/**这类兜底。没有别的 workflow 兜底
所以这三个套件在整个 CI 配置里没有被任何 paths 提及过。
后果
一个只改
tests/test686-rest-shape-golden/**(或 765 / 766)的 PR,不会触发
qa.yml—— 跑它们的那道门根本不启动。把这三个门本身改坏、改成永远通过、甚至删掉它们的断言,PR 都会全绿,要等别的改动顺带触发才暴露。
对照:
test725/test745有自己的 Docker job 并且在 paths 里,不存在这个问题。这是同一形状的第三例
run.sh要求TEST798_RUNSH_BLOB、Dockerfile接了线,qa.yml的docker build从没传 → ARG 空 → fail-closed。L1_TESTS,qa.sh的逐套件白名单没登记 →TEST823_SOURCE_COMMIT空串。L1_TESTS,qa.yml的 paths 没登记 → 门不触发。共同点是**「在一处注册,在另一处忘了登记」**,而两处之间没有任何机制保证同步。
#835 那次的修法是把成因去掉(逐套件白名单 → 按套件名推导),
这里同样可以根除,而不是再补三行:
tests/**(最省事,代价是任何 tests/ 改动都会触发整个 qa job);L1_TESTS生成 / 加一道门断言「L1_TESTS里每个套件的目录都在 paths 里」—— 后者与 ci: 元门 —— 新增测试文件不能落在所有聚合门的扫描范围之外(依赖 #798 #800) #801 的元门(ci: 元门 —— 新增测试文件不能落在所有聚合门的扫描范围之外(依赖 #798 #800) #801 本身就是「新增测试文件不能落在所有聚合门的扫描范围之外」)是同一类思路。
本 issue 只记录,未改动任何文件。
顺带:一处 push / pull_request 不对称
pull_request.paths里有docs/qa/**,push.paths里没有。不影响本条结论,但同一个 workflow 的两个触发器过滤不一致,通常不是有意的。
复现(只读)