TestSpec TestLib 审计
铁律:审计期间绝不修改、合并、移动、废弃、归档或验证任何 TestLib 用例。
TestSpec 审计进度:
- [ ] 步骤 1:定位 TestLib 和当前 PRD 证据 ⚠️ 必需
- [ ] 步骤 2:执行结构与语义联合审计
- [ ] 步骤 3:依据当前 PRD 对发现分类
- [ ] 步骤 4:为具体用例生成生命周期建议
- [ ] 步骤 5:确认审计全程只读 ⚠️ 必需
- [ ] 步骤 6:报告健康状况、阻塞项和明确交接
权威顺序与范围
按以下顺序判断:
- 当前
requirements.md、PRD、产品答复和验收标准 - 明确的 API、UI 与可观察行为证据
- TestLib 历史记录,仅作为候选知识
- 仅在用户明确授权代码作为验证或变更证据时使用代码
无法访问代码不影响审计。代码与 PRD 冲突时只报告冲突,不得把实现行为提升为产品意图。
本 skill 永久只读。用户确认的生命周期建议必须交接给:
- 新增或同 ID 内容更新 →
testspec-publish - 退役、移动或合并维护 → 单独授权且范围明确的维护任务
不得在 testspec-audit 内执行这些写操作。
仅在判断权威或可信度时加载 ../_testspec-shared/references/source-provenance.md。生成生命周期建议前加载 references/audit-contract.md。
执行联合审计
python "<testspec-audit-skill-dir>/scripts/audit_testlib.py" \
--testlib "testspec/testlib"
该命令同时执行:
- 结构校验:JSON、必填字段、ID、引用、索引和统计信息
- 语义审计:重复 ID/标题/正文候选、模块错放、provenance 缺口和仍为 active 的未验证导入
结果分别给出 structural_health 和 semantic_health。只有两项都通过时,整体 health 才能为 clean。
仅在用户要求时保存报告:
python "<testspec-audit-skill-dir>/scripts/audit_testlib.py" \
--testlib "testspec/testlib" \
--output "testspec/audits/testlib-audit.json"
默认不覆盖已有报告。只有得到明确授权后才能使用 --overwrite。
对生命周期候选分类
依据当前 PRD 证据使用:
keep:仍满足当前验收标准revise:意图仍有效,但操作或 oracle 已过时merge:另一用例表达相同的当前意图relocate:用例位于错误的模块或功能下retire:当前 PRD 明确移除了该行为reconcile:历史导入缺少当前 PRD 可追溯性unresolved:证据不足,登记稳定的Q-*
TestLib 不能自证正确。每项建议都必须记录用例 ID、当前 REQ-*/AC-*、必要时的稳定 Q-*、建议动作、影响和复审要求。重复检测只产生候选信号,绝不是自动合并的授权。
反模式
| 反模式 | 必需修正 |
|---|---|
只扫描模块文件就报告 clean |
同时要求结构和语义健康 |
| 因为用例已存在就保留 | 引用当前 PRD/AC 证据 |
| 自动合并规范化标题相同的用例 | 展示候选对并请求单独维护决策 |
| 审计期间修改用例状态 | 停止修改,只生成生命周期建议 |
| 未明确授权就使用代码 | 保持 code_evidence.role=none |
| 把真实 TestLib 数据复制到公开 eval | 使用完全合成的 fixture |
交付前检查
- 结构和语义两部分都已执行。
-
clean表示结构错误和语义警告均为零。 - 每项生命周期建议都注明用例 ID 和当前证据。
- 未决事项使用稳定
Q-*,不做猜测。 - 未修改 TestLib、索引、配置、变更日志或用例状态。
- 报告声明
mutation_performed=false。 - 最终答复指出后续独立动作,但没有执行它。
公开 eval 必须完全合成且不可识别。私有源材料只能放在被忽略的私有 fixture 路径中。