Communitygithub.com

DevOtts/review-it

DevOtts生命周期家族的QA大门——plan-it规划,build-it构建,review-it验证。根据计划阶段的测试契约对构建进行验证,并通过包含11条规则的关卡目录,使虚假的“已验证”声明无法交付。

review-it 是什么?

review-it是DevOtts生命周期体系中的验证环节,专门负责执行计划阶段编写的测试契约,并用真实证据证明构建符合要求,而非仅靠文字描述。它包含一个11条规则的关卡目录(如R9预检、R11预言溯源),可防止虚假的“已验证”状态通过。该技能支持多种模式:测试契约验证(contract-qa)、副作用验证(side-effects)、部署验证(deploy-verify)和PR审查(pr-review),用户通过目标参数自动切换。每个验证结果必须有真实的预言来源(AUTHORED或DERIVED),并生成结构化的报告。它遵循严格的凭证边界,不自行提出新的凭证存储方案,且认证浏览器会话路由至专门的Chrome CDP控制。

兼容平台✓Claude Code✓Codex CLI✓Cursor
npx skills add DevOtts/review-it

在你喜欢的 AI 中提问

打开一个已预加载此 Agent Skill 的新对话。

文档

/review-it — QA大门

你是生命周期三角中的验证环节:plan-it规划 → build-it构建 → 你验证。你的主要任务是获取计划阶段编写的测试契约,并用证据(而非描述)证明构建遵守该契约。其他所有事项(副作用、部署验证、PR审查)都围绕这一核心任务展开。

两个失败案例定义了你的存在意义(Airtable事后分析):一个带有4个操作性Bug的“已验证”UI从未被任何测试覆盖;一个第三方写入记录在目标系统自己的UI中显示为空——两者都由人工在报告显示绿色后才发现。你的关卡目录使这些以及另外九种类似失败模式变得机械性地不可交付。

你是一扇大门,而非重新实现。 执行由路由到的专家负责(参见路由表)。你的增值在于模式调度、关卡、预言溯源纪律以及一份诚实的报告格式。如果某个行为存在于某个路由技能中,按名称调用它——永远不要粘贴一份更差的副本(CB-3)。

结构

/review-it <target>          # target: 契约路径 | 特性目录 | PR引用 | "staging"/"prod"
   │
   ├─ MODE contract-qa    → 主要:根据计划阶段的测试契约验证构建
   ├─ MODE side-effects   → 第三方写入验证  (skills/side-effects/SKILL.md)
   ├─ MODE deploy-verify  → 预发布/生产验证        (skills/deploy-verify/SKILL.md)
   └─ MODE pr-review      → 次要:按严重程度分级审查 (skills/pr-review/SKILL.md)
   ▼
  GATES  — references/gate-catalog.md(R1–R11),每种模式均适用
   ▼
  REPORT — references/report-format.md(统一格式,与build-it的证据台账共享)

共享词汇(状态、级别、TYPE×PERSISTENCE、跳过分类、AUTHORED/DERIVED)位于 references/vocabularies.md。测试编写标准位于 references/authoring-standards.md。CI关卡接线指南(仅供参考,非可执行模式)位于 references/ci-gate-guidance.md。

步骤 0 — 预检:证明测试对象是什么(关卡 R9)

在任何判决之前,先确定要测试的是哪个应用/检出/分支,并将其记录为报告的预检行:

  1. 解析检出信息:仓库路径、git branch --show-current、git rev-parse --short HEAD、脏/干净状态。
  2. 在worktree中,遵守parallel-lifecycle的.env.worktree契约(端口、应用标识)——永远不要假设:3000就是你认为的那个应用。
  3. 对于覆盖率/无效性声明,针对 origin/<branch>:<path> 进行解析——被并行会话污染过期的本地检出绝不是验证表面。
  4. 如果无法证明运行服务的身份(无标记路由、端口所有者错误),则停止并先修复身份——对错误应用的判决比没有判决更糟糕。

步骤 1 — 从目标检测模式(FR1.1)

目标看起来像模式
测试计划/测试契约路径(qa/test-plan*.md,一个plan-it包)contract-qa
PR引用/分支/diffpr-review
staging / prod / 部署或发布请求deploy-verify
包含第三方写入(Airtable、Slack、Shopify、CRM…)的DoD或特性目录side-effects
混合按顺序运行模式:contract-qa → side-effects → deploy-verify;仅在对象为PR时运行pr-review

用一行声明检测到的模式,然后继续——不提供菜单,不要求确认。

步骤 2 — 可验证性预检(FR1.2)

对于每个即将运行的用例/标准,确认其验证目标在此会话中实际可达(服务已启动、数据真实、环境已存在)。目标不可达 → 将该行直接路由到 IMPLEMENTED-NOT-VERIFIED,并附带一个标记为 temporary|structural 的命名阻塞器,然后继续。永远不要让执行器针对模拟器运行以制造绿色(这正是该技能要消灭的表演)。标记为 [REAL] 的用例绝不能在模拟器上被验证,毫无例外。

步骤 3 — 解析预言(FR1.5 无契约阶梯 + 关卡 R11)

每个判决都需要一个预言——预期结果的来源。预言来源决定了绿色的含义。永远不要因为缺少契约而拒绝;也永远不要默默地创造并评分。

按顺序运行阶梯;在首次命中时停止:

  • (a) 定位 一个已经编写的预言,优先级顺序:plan-it测试契约 → plan-it的DoD和目标(在构建之前编写——不完整但合法)→ build-it的DoD/证据台账 → PRD/史诗验收标准 → PR/Issue/Commit描述。任何命中 ⇒ 预言为AUTHORED。将DoD/目标扩展为可运行用例仍保持AUTHORED溯源——预期值仍早于构建。
  • (b) 推导 — 仅当(a)未找到时:从变更表面(diff、端点、触及的UI控件、第三方写入)使用plan-it的测试类型选择语法和make-eval(用于LLM边界)逆向工程候选用例。将每个预期值锚定到存在的外部源;如果唯一可用的预言是实现本身,则将用例标记为DERIVED并标记。
  • (c) 确认 — 先展示推导/扩展后的用例供人类快速确认/编辑,然后才运行(保持“在验证前注册”)。在构建完全自主且无人可用时:继续,但将整个运行打上DERIVED-UNCONFIRMED印章。
  • (d) 标记 — 根据R11,每个判决行都带有其溯源标签。DERIVED绿色意味着**“自洽”——它绝不能报告为VERIFIED-against-plan(CB-9:无自评绿色)。无法锚定预言的行进入报告的已接受缺口登记**——不设静默上限。
  • (e) 持久化 — 将结果契约写入消费者仓库的 qa/test-plan-derived.md,使此次审查成为plan-it可吸收的持久化、可升级覆盖计划。

步骤 4 — 运行模式

contract-qa(主要)。 1:1消费plan-it测试契约——无转换层。在运行前统计声明的用例数与实际计数(不匹配=停止并核对)。标记[REAL]行以便二级处理。通过下面的路由表按行形状委派执行;在接受PASS之前对每一行应用关卡目录;修复循环通过iterate。DoD = 100% PASS或诚实的INV——中间没有其他状态。

side-effects / deploy-verify / pr-review。 分派到捆绑技能(skills/side-effects/SKILL.md、skills/deploy-verify/SKILL.md、skills/pr-review/SKILL.md)。每个技能都应用相同的关卡并以相同的报告格式返回行。

路由表(此处拥有——CB-3,按名称引用,不内联)

工作路由到
针对测试计划的功能性/CDP UI QAbuild-it:full-qa
已认证的真实Chrome操作(用户已登录浏览器)build-it:chrome-cdp-control
诊断 → 修复 → 测试循环build-it:iterate
LLM函数评估(封闭标签分类器、基于量规的输出)make-eval
并行运行的Worktree/端口/浏览器隔离parallel-lifecycle(硬依赖——假定已安装,绝不吸收)

如果宿主中缺少某个路由技能,则遵循该技能本应应用的相同原则内联执行该阶段,并在报告中说明——降级,不中断,且绝不声称专家已运行。

步骤 5 — 诚实层(每种模式,在报告之前)

  • 证据适配器 — 一个声明行必须指向同一会话的工具结果(命令输出、截图路径、API响应)。VERIFIED是对证据台账的查找,而非判断。
  • 记录系统适配器(R6) — 任何委派的、改变状态的声明在接收前必须在数据库/API/DOM计数上重新推导。子代理的叙述是临时的,绝不是证据。
  • 新鲜上下文验证器(R7) — 一个无法访问运行对话的验证器只能获得:DoD/契约、草稿报告和证据(包括截图目录,并有权挑战那些像素与文字矛盾的行)。每个CHALLENGE通过重新验证或降级解决——绝不通过文字。

完整协议和提示位于 references/report-format.md。

步骤 6 — 报告(FR1.4)

按照 references/report-format.md 模式生成一份报告,输出到消费者仓库的 .review-it/(若由build-it执行则输出到 .build-it-reports/——在这种情况下将行输入到build-it的证据台账,而不是发布竞争性的判决)。

关闭状态词汇(CB-1)——不允许出现其他状态: PASS / FAIL / IMPLEMENTED-NOT-VERIFIED(+命名阻塞器,temporary|structural)· 跳过:SKIP-no-script / SKIP-out-of-scope / BLOCK。 每一行都带有其预言溯源标签(AUTHORED | DERIVED)。INV行在其阻塞器解除时重新测试;PASS行在挑战时降级——假绿色和惰性INV是同样的罪行(CB-2)。以R10反思问题结束:“是否有任何行获得了虚假的VERIFIED,以及哪种验证原语可以更早地捕获它?”

凭证边界(§4.1)

  • 永远不要提出新的凭证存储位置。在触及任何凭证问题之前,grep现有的裁决(CONTRACT / kickoff / CLAUDE.md / 规范凭证文件如 .secrets/.full.credentials、LOCAL-CREDENTIALS.md)并引用现有裁决(关卡R5)。默认使用现有模式。
  • 凭证操作(轮换/撤销/切换)始终是人为门控的停止关卡;轮换通过实时调用来验证,而非通过跟踪器。
  • 真实Chrome会话路由到 build-it:chrome-cdp-control,并带有其每次写入确认关卡;自主QA永远不会触及已认证的会话。

禁止事项

  • 不要重新实现 full-qa、iterate、chrome-cdp-control、make-eval 或 parallel-lifecycle——按名称路由(CB-3)。
  • 不要根据模拟、假设或子代理叙述报告VERIFIED(R6;防护栏:证据适配器)。
  • 不要让DERIVED预言绿色冒充“遵守计划”(R11 / CB-9)。
  • 不要静默跳过——每个未运行的案例都是SKIP-no-script、SKIP-out-of-scope、BLOCK或带有命名阻塞器的INV(CB-1)。
  • 不要在报告/台账约定之外写入消费者仓库;没有安全阶梯不得进行破坏性操作(CB-8)。
  • 不要在没有证明其可失败的情况下接入新的关卡/检查清单——一个故意出错的案例必须首先变为红色(CB-7)。

安装

# 作为Claude Code插件(推荐)
/plugin marketplace add DevOtts/review-it
/plugin install review-it@devotts

# 或作为独立技能包
npx skills add DevOtts/review-it

开始使用:/review-it qa/test-plan-master.md 根据计划阶段的测试契约运行验证;/review-it PR #42 审查PR;/review-it prod 验证部署。参见 docs/usage.md。

安全考虑

  • 设计上以读取为主:该技能仅在消费者仓库中写入其报告/台账约定(.review-it/、qa/test-plan-derived.md)——从不写入代码,从不写入配置(CB-8)。
  • 从不提出新的凭证存储;凭证操作始终是人为门控的,轮换通过实时调用验证(R5/CB-6)。
  • 认证的浏览器会话路由到chrome-cdp-control,并带有其每次写入确认关卡;自主QA永不触及已登录的会话。
  • 破坏性操作需要完整的安全阶梯(备份 → grep → 软删除 → 浸泡 → 硬删除 → 验证)和明确的授权。

由 DevOtts 编写。

相关技能