# R8 | CI 门禁扩建（预计 1 天）

- 前置：R1（G7 的产物残留检查依赖 P0-10/R1.12 已修，否则上线即红）。
- 背景：审计三章 G 组 8 项。上线纪律：**每个新校验器先本地全绿再进 CI**；预期会暴露存量问题的（如 G1），先修存量再开闸。
- 校验器目录：`tools/`；CI 入口：`.github/workflows/ci.yml`。

## R8.0（新增前置检查）ci.yml 触发路径核对
- 现状疑点（2026-06-11 取证）：ci.yml 的 push/pull_request paths 列表未见 `tools/**`——若属实，改校验器本身不会触发 CI，属于门禁系统的自盲区。
- 修法：通读 ci.yml 全文核实；缺则在两处 paths 补 `"tools/**"`；顺带核对 `docs/**` 确实不触发（总纲依赖此假设）。
- 验收：改 tools/ 下任一文件的提交能触发 CI。

## R8.1（G1）ROUTER_EXAMPLES 必覆盖 28/28
- 现状：`tools/check_entry_docs.py:183` 必覆盖码仅 7 个。
- 修法：扩到全部 28 个技能码；先补 ROUTER_EXAMPLES.md 缺失技能的样例（每技能 ≥1 正例；易混对加反例——m07/m08、m09/m11、a02/orchestrator、R2 新增的交接/恢复边界），再开严校验。
- 验收：28/28 过；样例总数与校验器统计一致。

## R8.2（G2）WHATS_INCLUDED 模板/数据文件防漂移
- 修法：`check_skill_assets.py`（或 check_entry_docs）扩展：扫描 `skills/**/templates/*` 与登记表比对，缺登记/多登记都报错（现在只有 scripts 表有校验）。
- 验收：故意临时加一个未登记模板能被抓到（测完撤销）。

## R8.3（G3）README 中英结构同步 gate
- 修法：新检查（并入 check_entry_docs.py）：比对 README.md 与 README.en.md 的 `##` 标题数量与顺序（标题文本不要求逐字对应，结构必须同构）；R10 大改 README 时此 gate 保英文版不掉队。
- 验收：人为在英文版删一节能被抓到（测完恢复）。

## R8.4（G4）db09 项目卡 schema 校验
- 修法：`check_databases.py` 增 db09 规则：`projects/*/project_card.md` 必含 14 字段（CONVENTIONS §3 项目卡字段表为真相源）；**先补存量**——dairygoat 项目缺 `version_history.md`（a02 SKILL.md:31 已声明"待补建"，现在建：含至今真实版本记录，没有就只写当前态一行，不编历史）。
- 验收：校验器全绿且 dairygoat 四文件齐。

## R8.5（G5）SKILL.md 体量警戒 gate
- 修法：check_skills.py 增警戒：SKILL.md > 500 行或 description > 1024 字符 → 报错（当前最重 133 行/最长 626 字符，红线远未触及，纯防膨胀）；warn 档（> 300 行）只提示。
- 验收：阈值写成常量带注释说明依据。

## R8.6（G6）数据卡新鲜度检查 check_freshness.py
- 修法：新建 `tools/check_freshness.py`：扫 databases/ 所有卡的 `last_checked*` 字段，>90 天列 WARN 清单（**warn-only**，本地与 CI 均不红）；输出按库分组统计。README 的"每月/每季度更新"承诺改为指向"每月跑一次本脚本，按清单更新"的可执行流程（db01 README 同步）。
- 验收：对当前库跑出真实清单；CI 中以 continue-on-error 或纯输出方式接入。

## R8.7（G7）selftest 治理双 gate
- 修法：`run_skill_selftests.py` 增两项：
  1. **离线性**：跑 selftest 时设环境哨兵（如 socket 层 mock 或代理环境变量指向黑洞），有联网行为即失败——防未来脚本在 selftest 里打真网络；实现取折中方案即可（环境变量 `LIGHT_SELFTEST_OFFLINE=1` + 文档纪律 + 抽查），完美沙箱不强求，但要留升级注释；
  2. **产物残留**：全部 selftest 跑完后 `git status --porcelain` 非空即失败（堵 P0-10/R1.12 类问题，用其修复做回归验证）。
- 验收：两 gate 在本地与 CI 都生效；现存 45+ selftest 全绿通过。

## R8.8（G8）安装视角链接校验
- 修法：`check_skill_links.py` 增"安装后可达性"模式：技能内引用仓库级文件（CONVENTIONS/ROUTER/MODE_REGISTRY/docs/…）的，校验该文件在 install.sh/ps1 的安装清单内（R1.5 的修复做成永久 gate）；orchestrator 类"弱引用措辞"（不带相对路径的提及）放行。
- 验收：人为在某 SKILL.md 加一个 `../../docs/xxx.md` 引用能被抓到（测完撤销）。

## R8.9（新增）推荐配置口径纳入同步范围
- 修法：R6 改了 key 口径、R10 将加推荐配置节——把"README 关于 API key 节与 m16/m15 的 key 清单一致"加入人工 checklist（CONTRIBUTING 或 check 清单文档），自动化不强求。

## 上线顺序建议

R8.0 → R8.7(2 产物残留，已有修复可立即回归) → R8.1（工作量最大，样例补齐）→ R8.2/R8.3/R8.5（纯增量）→ R8.4（先补 dairygoat 存量）→ R8.6 → R8.7(1) → R8.8。

## 验收（全轮）

- [ ] 校验器 7 → ≥10 个（freshness/db09/同步 gate 至少三个新增点落地）。
- [ ] 全部新 gate 本地+CI 双绿；每个 gate 有一次"故意破坏→被抓→恢复"的验证记录（`_verification_log/` 留痕）。
- [ ] ROUTER_EXAMPLES 28/28。

## 提交切分建议

- `CI工作流:触发路径补tools目录`
- `入口文档校验:路由样例必覆盖扩至全部技能`
- `资产校验:模板登记防漂移与README中英结构同步`
- `数据库校验:db09项目卡schema与新鲜度警告`
- `自测执行器:离线性与产物残留双闸门`
- `链接校验:安装视角可达性模式`

## 收尾

总纲 §5 八步；PROGRESS 更新；打印 R9 启动提示词。
