What happened
bash run-tests.sh 是 AGENTS.md §10 与 CONTRIBUTING「before you open a PR」列为必须以 ALL TESTS PASSED 收尾的一道门,但没有任何 CI workflow 运行它。
于是这道门在实际执行上只靠人工自觉。而它已经漏了:60bc0f13 (#209) 合入时带进了两条从未跑绿的测试,并在 main 上一直红到 2026-07-28 被发现。期间 ccm-ci 对每个相关 commit 都报 success。
证据
CI 的 required check build-and-check 只聚合两个 job:
build-and-check needs: [ccm, plugin-contracts]
plugin-contracts 实际只跑:
tests/content/skill-knowledge-scaffold.test.mjs
tests/content/plugin-release-package-contract.test.mjs
tests/content/trusted-release-bundle.test.mjs
node scripts/skill-knowledge.mjs check --stage K0 ← 只到 K0,不是 K3
node scripts/check-release-knowledge-boundary.mjs
grep -rn "run-tests" .github/workflows/ → 零命中。
tests/content/ 下目前有 60+ 个测试文件,CI 只选跑其中 3 个。
漏掉的两条(已在分支 feat/issue-211-user-unknowns 修复,但机制缺口仍在)
两条都来自 60bc0f13 (#209),且都与同一个 commit 引入的代码/守卫互相矛盾:
skill-overlay-v3-skills-swap-commit.test.mjs 的 v4: 用例测的是 projectAndPublishSkillsSurface 的 legacy beforePublish 接缝——而同一个 PR 把该接缝改成了显式拒绝。
skill-overlay-v9-whole-host-atomic.test.mjs 断言 plugin/dist/<host>/knowledge 存在——而同一个 PR 加的 check-release-knowledge-boundary.mjs 正是为了保证它不存在(knowledge/ 是 repo-only,禁止进 dist/package/release)。
一个 PR 内自相矛盾却能合入,正说明这道门没有机制执行。
What you expected
要么 run-tests.sh 真的成为 CI 门的一部分,要么 AGENTS.md / CONTRIBUTING 不再把它写成必过的硬门。文档声称的门与机制执行的门应当一致。
可能的修法(未定,需要权衡)
- 把
run-tests.sh 整体接进 plugin-contracts —— 最直接,但本地实测全套约 90 分钟(attestation-regen-convergence 会重跑整条 attestation 流水线;skill-knowledge 隔离测试每个 case 建隔离仓跑全量投影)。直接上 CI 的 runner 成本需要评估,且与 #212 刚做的「reduce redundant Actions usage」方向相反。
- 扩
plugin-contracts 的测试名单到 tests/content/ 全集 —— 比 (1) 轻,但仍需评估时长。
- 分层:把快的 content 测试接进每 PR 的 required check,把重的(attestation / 隔离投影)放 nightly 或
ci: label 触发(仓库已有 ci:macos-live 这个 opt-in label 先例)。
- 只加一道防回归的窄门:至少保证「测试文件与它测的代码在同一个 PR 内不自相矛盾」——但这个不好机械表达。
倾向 (3),因为它同时解决「门要真」和「不烧 runner」两个约束,且仓库已有同型先例。具体阈值与切分需要先量各测试文件的实际耗时。
附带观察
本仓测试时长与知识图规模是超线性关系的:skill-knowledge 那批测试每个 case 都建隔离仓跑全量四 host 投影,图每长一个 module,每个 case 都变慢。这会让 (1) 随时间越来越贵,也是倾向 (3) 的理由之一。
Fit with cc-master's design
What happened
bash run-tests.sh是 AGENTS.md §10 与 CONTRIBUTING「before you open a PR」列为必须以ALL TESTS PASSED收尾的一道门,但没有任何 CI workflow 运行它。于是这道门在实际执行上只靠人工自觉。而它已经漏了:
60bc0f13 (#209)合入时带进了两条从未跑绿的测试,并在 main 上一直红到 2026-07-28 被发现。期间ccm-ci对每个相关 commit 都报 success。证据
CI 的 required check
build-and-check只聚合两个 job:plugin-contracts实际只跑:grep -rn "run-tests" .github/workflows/→ 零命中。tests/content/下目前有 60+ 个测试文件,CI 只选跑其中 3 个。漏掉的两条(已在分支
feat/issue-211-user-unknowns修复,但机制缺口仍在)两条都来自
60bc0f13 (#209),且都与同一个 commit 引入的代码/守卫互相矛盾:skill-overlay-v3-skills-swap-commit.test.mjs的v4:用例测的是projectAndPublishSkillsSurface的 legacybeforePublish接缝——而同一个 PR 把该接缝改成了显式拒绝。skill-overlay-v9-whole-host-atomic.test.mjs断言plugin/dist/<host>/knowledge存在——而同一个 PR 加的check-release-knowledge-boundary.mjs正是为了保证它不存在(knowledge/是 repo-only,禁止进 dist/package/release)。一个 PR 内自相矛盾却能合入,正说明这道门没有机制执行。
What you expected
要么
run-tests.sh真的成为 CI 门的一部分,要么 AGENTS.md / CONTRIBUTING 不再把它写成必过的硬门。文档声称的门与机制执行的门应当一致。可能的修法(未定,需要权衡)
run-tests.sh整体接进plugin-contracts—— 最直接,但本地实测全套约 90 分钟(attestation-regen-convergence会重跑整条 attestation 流水线;skill-knowledge隔离测试每个 case 建隔离仓跑全量投影)。直接上 CI 的 runner 成本需要评估,且与#212刚做的「reduce redundant Actions usage」方向相反。plugin-contracts的测试名单到tests/content/全集 —— 比 (1) 轻,但仍需评估时长。ci:label 触发(仓库已有ci:macos-live这个 opt-in label 先例)。倾向 (3),因为它同时解决「门要真」和「不烧 runner」两个约束,且仓库已有同型先例。具体阈值与切分需要先量各测试文件的实际耗时。
附带观察
本仓测试时长与知识图规模是超线性关系的:
skill-knowledge那批测试每个 case 都建隔离仓跑全量四 host 投影,图每长一个 module,每个 case 都变慢。这会让 (1) 随时间越来越贵,也是倾向 (3) 的理由之一。Fit with cc-master's design