workflow_test_design_audit
道-方法 · 道层 skill 全文
本页是 <code>rules/skills/workflow_test_design_audit.md</code> 的逐字投影(仅隐私清洗,零改写)。
时点提示:本页是仓内文件 rules/skills/workflow_test_design_audit.md 的逐字投影(仅做隐私清洗:仓库根绝对路径→相对路径、家目录→~/;除此零改写)。若源文件后续有修订,以仓内真源为准。
Skill: 测试设计审查(workflow_test_design_audit)
元数据
- 类型:Workflow
- 创建日期:2026-04-18
- 输入:
target(路径/段落引用/关键词描述)+mode(ex-ante|ex-post|auto) - 输出:审查报告(必产)、OBSERVATIONS 条目(条件产)、draft skill(条件产)
- 关联命令:全局 trigger
test:/test:/test(候选模板见contexts/prompts/test_trigger_command_proposed_20260418.md)
When to Use
在下列场景调用本 skill:
- Ex-ante dry-run:要对一份流程文档(runbook / PROVIDERS 模板 / 新 skill / 复杂脚本注释)做"按文档走一遍,找卡点/断层/同步点遗漏"的审查,在执行前把设计问题暴露出来。
- Ex-post 实证审查:对历史产物(git log / PR 样本 / claude_logs / JSONL)扫描,找"测试遗漏"证据。典型触发词:"最近几个 PR 的测试够不够"、"这类 bug 为什么回归测试没抓到"。
不适用:写测试代码(那是 tdd-guide agent 的职责)、代码 lint(ruff/mypy)、性能基准(本 skill 已知断层,见下)、安全漏洞扫(security-reviewer agent)。
1 分钟自检:若手里拿的是"一份文档 / 一个流程 / 一批历史产物",而且你想知道"它设计得对不对 / 漏了什么检查"——用这个 skill。若你想"写测试"或"跑测试",不用。
理论基础
本 skill 的诊断框架和清单源自 A Philosophy of Software Design 蒸馏结果(v2),只引原文明确支持的 3 条:
- Axiom: complexity-decomposition (
rules/skills/drafts/philosophy_of_software_design/v2/axioms/complexity-decomposition.md) - 原文大意:复杂度两大独立来源——dependency(改一处触发多处)+ obscurity(不知道改哪里),产生 change amplification / cognitive load / unknown unknowns 三症状。
- 指导审查动作:同时检查被测对象的测试间耦合(一个 fixture 被几个测试依赖)和表达清晰度(测试命名是否传达场景)。unknown unknowns(未覆盖的边界条件)是最该盯的,直接对应"已知断层"段。
- Skill: information-hiding (
rules/skills/drafts/philosophy_of_software_design/v2/skills/information-hiding/SKILL.md) - 原文大意:同一设计决策出现在多个模块 = 信息泄漏;诊断 = 改一个决策要改几个模块(1=成功,多=泄漏)。
- 指导审查动作:在被测对象上做"改一个决策要改几个地方"问答。改 API response 格式要动 8 个测试?泄漏。改 provider model ID 要动 5 个文档?泄漏。泄漏点是审查报告的一级发现。
- Skill: red-flag-checklist (
rules/skills/drafts/philosophy_of_software_design/v2/skills/red-flag-checklist/SKILL.md) - 原文大意:12 条设计问题快速诊断清单,用法是选 3-4 条重点维度,每条 ≤30 秒判断。
- 指导审查动作:直接迁移为"测试版 12 红旗"(浅 fixture / 信息泄漏 / 按时序拆 / pass-through helper / 命名模糊 / 注释只翻译代码 / 等),详见下文"红旗清单"段。
模式清单(ex-ante vs ex-post)
根据 target 形态自动选,或由调用方显式传 mode=ex-ante|ex-post:
| 形态 | mode | 典型例子 | 数据源 |
|---|---|---|---|
| 具体路径 + 可选段落 | ex-ante | tools/claude/PROVIDERS.md § 添加新 provider 的模板 | target 本身(按文档模拟 agent 走一遍) |
| 自然语言描述 / 时间窗 | ex-post | "最近 5 个 PR 里的测试遗漏" / "wrapper 类 smoke 不够" | contexts/claude_logs/*.md + JSONL + git log + PR |
| 混合(给 target 也要求扫历史) | mixed | "审查 PROVIDERS.md 并对照过去两周真实 wrapper 添加" | target + 历史 |
自动分流规则(命令层已做,skill 收到时 mode 已定):
- 前缀后文本匹配
^\S+\.\w+或含§→ ex-ante - 含
last N/PRs/commits/最近/过去→ ex-post - 歧义 → 让用户加
--modeflag,不猜
四类检查 + 已知断层
本 skill 按四大类组织审查动作。每类列具体判据,以及本 skill 明确不覆盖的子类。
类别 1:静态一致性
判据:
- 引用完整性:文档里出现的路径
tools/xxx.sh/rules/xxx.md实际存在吗?使用reference_validator(按名引用,路径见tools/INDEX.md)的validate/check-indexes子命令 - INDEX 与实际内容一致:
INDEX.md列的文件实际存在,目录下新增文件在 INDEX 有登记(check-new-files) - 命名约定遵守:按
rules/skills/bestpractice_skill_writing_guide.md的<category>_<name>.md规则 - 数字与实际数量一致:文档说"三家 wrapper"实际只有两家?"12 条 skill"实际 11 条?
已知断层:YAML/JSON schema 层。仓库目前无通用 schema validator;若被审查对象是 cron manifest、MCP config、agent 定义等 schema 结构,本 skill 只能做表层的键名扫描,不做语义 schema 校验。审查报告里明标"此类需外部工具"。
类别 2:流程完整性(dry-run 类)
判据:
- 按文档模拟走一遍找卡点:站在 agent 视角逐段执行文档,哪一步命令产出无法直接复用到下一步?参考范本:
tools/claude/PROVIDERS.md § 添加新 provider 的模板(四阶段 Stage 0/1/2/3,每阶段有具体 bash 命令) - 同步点覆盖:改 A 时 B/C/D 要跟着改。PROVIDERS.md 的四阶段结构里第 2 阶段(文档同步)明示了 agent-reading 和维护向两类文档的不同同步规则——审查对象是否有等价的同步点声明?
- Checklist 可验证性:每步有客观"做完了没"判据吗?机械判据的例子——
~/.local/bin/claude-X --list-models返回 JSON、17*23返回 391;坏例子——"确认运行正常"
已知断层:无(此类覆盖充分)。
类别 3:实证覆盖(ex-post 类)
判据:
- PR/commit 样本验证:参考
tests/e2e/gate_e2e.sh的 anchor-to-assertion 映射——被测对象有对应的锚点驱动测试吗?锚点是需求驱动("用户明确提出的约束"),不是 feature 驱动 - Smoke test(happy path):参考
tools/claude/PROVIDERS.mdStage 3.3 的17*23=391——被测对象的 smoke 判据足够简单、确定、跨实现一致吗? - 回归测试(已修 bug 不应再现):参考
tools/claude/PROVIDERS.mdStage 3.2 的 symlink 解析回归——过去修过的 bug 有没有对应的探针?
已知断层:性能回归检测("LLM 调用应 ≤ N 秒"这类基准线)。仓库无此类基准,本 skill 不补,审查报告明标"无性能基准可比对"。
类别 4:边界和失效
判据:
- 错误码覆盖:401/403/404/429 各有什么预期行为?PROVIDERS.md Stage 3.3 已列四类映射(key/IP/endpoint/rate),新被测对象有类似清单吗?
- 弃用/回退路径:参考 PROVIDERS.md 的"弃用流程"(deprecation stub + agent-reading 文档去引用 + 维护文档保留历史 + symlink 保留触发 stub)。被测对象有类似清晰的弃用/回退路径吗?
- Negative 断言:参考
tests/e2e/gate_e2e.sh的 assert_fail——主动破坏约束验证检测能力,有对应的负测吗?
已知断层:
- 数字边界(
max_age_hours=0/ 负值的行为):仓库无专项,本 skill 只做"查是否有边界说明"不做"跑边界数" - 跨端调试追踪(A 调 B 的 trace 完整性):仓库无此类测试,本 skill 不覆盖
执行流程
用户/调用方给 target 和 mode(自动或显式)后:
- 确认 target 和模式。mode=ex-ante 时 target 必须是可读的路径/段落;mode=ex-post 时 target 可以是自然语言,skill 内部转为关键词列表。mode=auto 且歧义时询问用户,不猜。
- 按模式跑检查。
- ex-ante 分支:依次跑四大类判据,每类产出"PASS / 部分 / FAIL + 证据"。"部分"和"FAIL"附 1-3 条最小修复建议。
- ex-post 分支:派并行 sub-agent 扫
contexts/claude_logs/+ JSONL +git log+ PR 样本。每个 sub-agent 必须携带:target 的完整关键词列表、四大类判据摘要、扫描文件路径、输出格式要求。不让 sub-agent 盲扫。扫描完成汇总成同一份四类结构。
- 生成审查报告(必产)。
- 路径:
contexts/survey_sessions/test_audit_<target-slug>_<YYYYMMDD>_manual.md(<target-slug>由 target 文本生成,如PROVIDERS_md_new_provider_template) - 结构:标题 / 日期 / target 和 mode / 四类检查结果 / 已知断层是否触发 / 红旗清单过一遍 / 最小修复建议(按优先级)
- 判断是否写 OBSERVATIONS 条目(条件产)。
- 判据:若某条发现是跨项目通用的 test 设计教训(不是 target 本身的一次性问题),或者同一类型发现在过去 30 天两份以上独立 target 审查里都出现过,写
contexts/observations/OBSERVATIONS.md。格式:- 🔴/🟡 [测试审查] <痛点一句话>:<核心发现>。证据:详见 survey_sessions/test_audit_<slug>_<YYYYMMDD>_manual.md - 不写的情况:target 专属的一次性漏洞、只对当前文档有意义的修订建议、硬凑的泛化。
- 判断是否产 draft skill(条件产)。
- 判据:审查过程应用的方法论在现有
rules/skills/INDEX.md里找不到对应 skill。比如审查时第一次做了"YAML schema audit"的步骤且可复用,值得写 draft。 - 路径:
rules/skills/drafts/bestpractice_<topic>.md或rules/skills/drafts/workflow_<topic>.md - 写完后必须在 INDEX 的 Draft 分类下加条目
- 短确认(response 里)。给调用方:产出文件路径清单(1-3 份)+ 核心发现一句话 + 四类检查的 PASS/FAIL 矩阵。
红旗清单(迁移自 Skill: red-flag-checklist)
审查时按需选 3-5 条重点过一遍,每条 ≤30 秒判断:
- 浅 fixture:fixture 定义细节多但每个 test 还要配置一堆参数
- 信息泄漏:同一 mock/data 格式在 5+ 测试里重复出现
- 按时序拆测试:
test_setup/test_execute/test_verify三个独立 test 而非一个完整场景 - Pass-through helper:helper 只转发参数给下层,没加值
- 命名模糊:
test_user_login_should_work()无法传达场景 - 注释只是代码翻译:
# 创建用户+user = create_user() - 测试依赖执行顺序:test B 要 test A 先跑
- Mock 定义散布:某个 service 的 mock 在 5 个 test 文件都重写一遍
- Assert 不对应 claim:测试名说验证 X,断言却查 Y
- 没有负测:只覆盖 happy path,没有 assert_fail / 故障场景
- 前置条件暗藏:test 依赖某个 env 变量/文件但没声明
- 边界静默通过:
assertEqual(result, result)之类废 assert
反模式(真实发生的)
本 skill 为新 skill,反模式段只记录实际踩过的,暂留一条占位。新陷阱发生后再追加,不预测。
- 硬凑哲学引用:1C 调研发现,若不实际读 philosophy 原文,就容易把 Skill B (design-twice) 硬套成"测试是对方案的 stress test"。实际原文讲的是设计阶段的行为、不是审查标准。本 skill 只引原文支持的 3 条(Axiom 1 + Skill E + Skill A),见理论基础段。
示例会话(smoke scenario)
场景:用户审查 tools/claude/PROVIDERS.md § 添加新 provider 的模板(PROVIDERS.md 2026-04-18 刚扩成四阶段结构的 dry-run 对象)。
用户: test: tools/claude/PROVIDERS.md § 添加新 provider 的模板
Agent(命令层识别路径+段落 → ex-ante 模式 → 调 skill)
→ 读 target(Stage 0/1/2/3 四阶段)
→ 四类检查:
- 静态一致性:reference_validator 跑一下,PASS(文件/INDEX 都实)
- 流程完整性:模拟 agent 走 Stage 0-3,Stage 1.5 bin_paths.sh 示例块缩进有歧义 → 部分
- 实证覆盖:Stage 3.3 `17*23=391` smoke + 3.2 symlink 回归都有 → PASS
- 边界/失效:401/403/404/429 映射清单在 Stage 3.3,弃用流程在末段 → PASS
→ 红旗清单过 5 条:命名 OK / 信息泄漏无 / 按时序拆——Stage 0/1/2/3 是时序但是必要(dependency 真实)→ 非红旗
→ 写审查报告到 contexts/survey_sessions/test_audit_providers_new_provider_template_20260419_manual.md
→ 判断 OBSERVATIONS:此发现(Stage 1.5 缩进歧义)target 专属,不写
→ 判断 draft skill:无新方法论,不写
Agent 回用户:
"四类检查:3 PASS / 1 部分(Stage 1.5 bin_paths.sh 缩进歧义)。红旗清单 0 命中。
审查报告:contexts/survey_sessions/test_audit_providers_new_provider_template_20260419_manual.md
核心发现:Stage 1.5 的 bash 代码块缩进两层,agent 按字面 copy 会报 syntax error。建议顶格。"相关资源
- Philosophy v2:
rules/skills/drafts/philosophy_of_software_design/v2/{axioms,skills}/ - Dry-run 审查范本:
tools/claude/PROVIDERS.md § 添加新 provider 的模板(Stage 0-3 四阶段结构) - Ex-post 锚点驱动 E2E 范本:
tests/e2e/gate_e2e.sh - 路径引用审查工具:
reference_validator(按名引用,路径查tools/INDEX.md) - Skill 写作元规则:
rules/skills/bestpractice_skill_writing_guide.md - 并行 sub-agent 规范:
rules/skills/workflow_parallel_subagents.md(ex-post 分支派 sub-agent 时遵守) - 全局 trigger 命令候选:
contexts/prompts/test_trigger_command_proposed_20260418.md - UX 姊妹命令(结构参照):
~/.claude/rules/common/ux-painpoint-to-draft-skill.md