--- name: module-regression description: >- 大项目模块间联动回归——一份 REGRESSION.md 回归台账登记"每个模块的下游消费者 + 可执行的回归验收命令",每次改动后照台账跑回归审计,防"改一个模块悄悄弄坏其他模块"。判决靠退出码,不靠 AI 看着没问题。中文触发:模块回归、回归台账、回归审计、改A坏B、模块联动检查、影响面检查、模块牵连、下游验证、大项目改动检查。English triggers: module regression, regression ledger, impact regression audit, downstream verification. metadata: origin: 小磊 · 模块间回归审计 --- # 模块回归台账(module-regression) ## 治什么病 大项目里模块互相引用。改模块 A 时,AI 和人都只盯着 A 本身对不对,**下游的 B、C 被悄悄改坏了没人知道**——直到几天后 B 的产出数字对不上才发现。这是 AI 协作大项目里最高发、最晚爆雷的事故。 解法:一份**回归台账**(`REGRESSION.md`)+ 一个**照单审计**动作——改完任何模块,按台账把受牵连的下游全部验一遍,全绿才算改完。 ## 台账三要素(每个模块一段,缺一不可) ```markdown ## 模块 03-店铺数据清洗 下游(谁依赖我):05-汇总、07-成品导出 回归验收命令:pytest tests/test_03.py && python scripts/对账.py --module 03 联动规则:改我的对外行为 → 必须跑 05、07 的验收命令;只改内部实现且本模块验收绿 → 可豁免下游 ``` 1. **下游消费者**——**脚本从 import/调用关系生成,禁止手写**。手写的依赖清单必然腐烂(变动最频繁、没人记得同步),生成的永远反映真实代码。 2. **回归验收命令**——**台账的核心资产**:每个模块一条"怎么证明我没坏"的**可执行命令**(pytest / 对账脚本 / golden sample diff)。没有这行,审计退化成"AI 看一眼说没问题"(把裁判权交给被告);有这行,判决就是退出码。 3. **联动规则**——改我 → 谁必须被验证;什么情况可豁免。 ## 与 TESTS.md 的连接 `REGRESSION.md` 不再维护业务规则和测试缺口。它只引用 `TESTS.md` 中稳定的 TEST-ID: ```markdown 关联测试点:TEST-ORDER-001、TEST-REFUND-003 ``` - 哪些规则必须被保护、测试处于什么状态、证据在哪:由 `test-collaboration` skill 和 `TESTS.md` 管理。 - 改了某模块后要重跑哪些模块、执行哪条命令:由本 skill 和 `REGRESSION.md` 管理。 - `/regression-audit` 只按回归台账执行命令和报告退出码,不重复审查测试必要性。 ## 台账纪律 - **验收命令优先"对账型"而非"断言型"**:锚外部事实(golden sample / 上游合计 / 财务勾稽),"测试全过"能被钻(改松断言、注水 mock),"和基准差异 < 0.01"钻不了。 - **下游列表只由重扫刷新**:加了新 import → 重跑生成脚本,不许手补一行了事。 - 台账放项目根或 `docs/`,从 `CLAUDE.md` 挂指路牌(否则成孤儿文档没人读必烂)。 ## 审计流程(每次改完照做) Claude Code 可通过 `/regression-audit` 调用 `regression-auditor`;Codex / ChatGPT 直接调用 `$module-regression`,由当前 agent 承担同一“只跑、只报、不修”职责。宿主不同不改变退出码终审和红着不交付的边界。 1. **列改动**:`git status -s` / `git diff --name-only`,对照台账定位改的是哪个(些)模块。 2. **查联动**:台账告诉你下游是谁。 3. **跑回归**:本模块验收命令 + 所有下游模块的验收命令,逐个跑,记录每条的退出码。 4. **退出码终审**:全绿 = 没牵连,可交付;任何一条红 = 改动波及下游,**修完从第 3 步重跑**,不许带红交付。 - **红了怎么归因(控制变量,不靠猜)**:基线全绿 + 本次只改了 A + B 红 → 错误必然由 A 引入,顺着 B 验收命令的输出(对账差异行 / assert 信息)反查 A 碰到的交接字段。若 B 在改动**前**就红 = B 的旧债,不赖本次改动,标台账缺口另行处理。**改动批次越小归因越准**——一次改 5 个模块再跑,红了就说不清谁干的。台账应记「上次全绿的 commit」,保证归因有干净基线。 5. **出审计摘要**:改了哪个模块 / 跑了谁的回归 / 各自结果(命令 + 关键输出行)/ 豁免了谁及理由。 ## 铁律(四条,违反任何一条审计无效) 1. **判决 = 退出码**,不是"看着没问题"。没有可执行验收命令的模块 = 台账缺口,先补命令再审计。 2. **审计员只报不修**:跑回归、报红绿;红了怎么修是改动者(主会话/人)的事——裁判不能下场踢球。 3. **红着不准交付**:下游红 = 本次改动没完成,没有"下游的问题以后再说"。 4. **坑必下沉**:每修一个 bug,必须在 `TESTS.md` 新增或关联 TEST-ID,写清回归测试 / lint / schema 校验落在哪;确实只能人工验收时写明理由、步骤和证据。只改代码不登记保护证据 = 没修完。 ## 与相邻方法的边界(别混) | 方法 | 管什么 | 文档 | 验证时机 | |---|---|---|---| | contract-first | 跨端接口(前后端 / 服务间字段契约) | `CONTRACT.md` | 集成对账 | | test-collaboration | 测试资产、必要测试点、Bug 回归保护和证据 | `TESTS.md` | 需求/Bug/测试变化与交付前 | | module-regression | 同一代码库内模块间行为回归 | `REGRESSION.md`(下游 + 验收命令 + TEST-ID 引用) | 每次相关改动后 | ## 渐进采用 - 模块 < 3 个、或模块间零引用 → 不需要,别过度治理。 - **预警信号**:第一次发生"改 A 坏了 B"的事故 → 当天建台账。 - 已有测试/对账脚本的项目:台账 = 把现成验收命令按模块归位登记,半天出第一版。 ## 初始化与参数 - 默认按 Git 工作区改动定位模块;指定模块时只检查该模块及其下游。台账不存在且没有 init 请求时报告缺失,不猜依赖。 - init 模式可以生成 REGRESSION 台账文档,不修改业务实现。先从真实 import/require/调用关系生成下游,记录生成命令;不把手写列表标成脚本生成。 - 从现有测试和对账脚本寻找验收命令候选,标待确认;没有命令的模块登记缺口,不能编造绿色结果。 - 使用 `templates/REGRESSION.example.md`,从项目 CLAUDE 挂入口。报告模块、命令、退出码、结论和未跑项;用户确认真实验收命令后再审计。