关于 verify-app
用于在隔离实例中验证应用变更并记录证据的技能,面向开发者和评审者,结合命令行控制器与按功能划分的验证指南。
主要功能
- 01每个检出版本使用独立实例
- 02控制运行实例的命令行工具
- 03功能映射与验证步骤
- 04检查、报告和证据采集
- 05模拟与真实模型验证路径
适用场景
- 01评审前验证功能变更
- 02测试成功、失败和持久化路径
- 03在 PR 中记录证据与未覆盖项
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ hachej/ boring-stack --skill verify-app安装后在 Claude Code 中输入/verify-app确认已加载。
详细介绍
验证应用
这项技能要回答的问题是:这次改动涉及哪些功能,如何在隔离实例上测试这些功能,又有什么证据能证明它们正常工作?
这项技能包含两部分,遵循 Poteto 的验证技能:远程控制(node scripts/verify.mjs,不带参数时会列出所有命令)和功能映射(docs/verify/,每个领域一个文件,且都包含相同的 4 个二级标题:子功能、如何进入、使用 verify 驱动、注意事项)。CLI 用于驱动运行中的实例,不是测试运行器。请组合使用其命令:验证时绝不要编写驱动脚本。
CLI 中与产品相关的部分(种子状态、doctor 监控的服务端文件夹、额外的 up 标志、浏览器的语言区域和权限、报告中的措辞)位于 scripts/verify-app.mjs;其余部分在所有应用中都相同。
选择流程
每个检出版本都有自己的实例:端口、数据文件夹、浏览器和日志都根据检出路径生成,并存放在 .verify/<port>/ 中。Git 工作树(git rev-parse --git-dir)不会与主检出版本或其他 Agent 的工作树冲突。
- 全新的工作树或克隆: 如果尚未安装依赖项或 Chromium,运行
node scripts/verify.mjs setup进行安装,然后构建页面并运行up、doctor。 - 已完成设置: 运行
up,然后运行doctor。 - 完成后: 运行
down;cleanup会删除此实例的数据和日志(cleanup --all还会删除报告、追踪记录和屏幕截图)。分支推送后,请从主检出版本中自行删除工作树。
doctor 必须输出 fresh。否则,它会指出问题:STALE BUNDLE(运行 npm run build)、STALE SERVER 或提交已更改(运行 down,然后运行 up)、WRONG INSTANCE(端口或浏览器属于其他实例)。
流程
node scripts/verify.mjs features:列出此变更影响的每个领域;只阅读这些文件(features <area>),跨领域的变更还要阅读journeys。阅读docs/INVARIANTS.md中此变更涉及的规则。node scripts/verify.mjs check:运行门禁,即项目的检查命令(project.md):lint、契约(功能映射、规则、架构规则)、单元测试、形式化模型、类型检查 + 构建、捆绑包密钥、端到端旅程。必须先通过此项,其他结果才算数。迭代时使用check --fast;单独运行contract无需安装。形式化模型需要 Java:没有 Java 时,它们会标记为 未运行,门禁会显示“未完成”,绝不会显示“已通过”(formal/README.md)。setup或up+doctor→fresh。report <area…>会写入.verify/report-<branch>.md,这是需要填写的模板。- 使用
seed <state>将实例设置为所需状态,而不是逐个点击;要获得空白实例则使用reset。对于运行中的状态(重新加载或运行中切换):先执行down,再执行up --delay 4000。 - 执行
mark "<what you test>",然后像用户一样操作该功能:open、click、type、upload、press、wait-settle。 - 收集证明:操作后以及重新加载后调用
api <route>(open "/"会重新加载);运行network-summary --since-mark(操作发出的请求、状态、失败);运行console --errors --since-mark(无页面错误);运行snapshot,或为产品负责人运行screenshot。当审核者需要重放操作时,运行trace start…trace stop(npx playwright show-trace <zip>);对于页面重量问题,运行perf。 - 在任何状态下检查前端规则:运行
a11y(无障碍名称缺失的控件、Tab 顺序:APP-F6),然后运行viewport 375 812,再运行overflow和screenshot(手机宽度:APP-F7),最后运行viewport 1440 900。 - 默认使用模拟模型:它们检查的是连接流程,而非措辞。若变更涉及 Agent 输出内容,请说明需要使用
up --real。仅在检查 Agent 行为时使用up --real,并在CODEX_AUTH_FILE中提供 Codex 登录信息。 - 如果变更新增或修改了用户可见内容,请在同一分支中更新
docs/verify/下对应的文件(跨领域时还要更新test/e2e/中的旅程)。如果文件缺少四个 H2 标题,check会拒绝通过。如果变更影响规则的证明方式,请更新scripts/verify/VERIFY.json:缺少证据且没有记录延期的规则会被check拒绝通过。
证明标准
证明必须走生产路径,并展示持怀疑态度的审核者也会认可的结果。
- 通过页面及其常规服务端调用进行操作。
eval会在用户路径运行后读取状态;post只会准备状态,作用类似seed:两者都不算证明。api/post --bearer <token>会使用该令牌的身份。 - 来自非
fresh实例的证明不算证据。 - 覆盖所有可到达的入口点,以及变更可能影响的成功、失败、空状态、取消/重新运行和持久化路径(领域文件会列出这些路径;旅程中的
page.route或已停止的服务端会导致请求失败)。 - 同时展示触发操作和稳定的最终状态(
mark、操作、--since-mark证据)。 - 关注副作用,而非像素:已存储的记录(
api /api/<route>)、运行行(api /api/runs)、重新加载或down/up后的状态。 - 模拟模型之所以算数,只因它们位于生产边界之后(模型提供方处于相同的运行时、服务端和 Web 环境中)。任何绕过 Web 或服务端的方式都不能证明页面已覆盖。
- 说明哪些内容无法到达(原生文件选择器、操作系统拖放、真实提供方、仅限生产环境),并说明你实际覆盖的最接近路径。
证据:先采用成本最低且足够的方式
lint + contracts + unit tests → formal models → end-to-end journeys (fake models)
→ driven instance (verify) → real models on the instance (up --real)
→ the people's own use
通过较低层级的检查绝不能证明更高层级的主张:单元测试通过并不能说明页面正常;模拟模型旅程也不能说明措辞正确。
切勿
- 仓库、测试、夹具、报告或已提交的截图中不得出现任何真实用户数据:只能使用虚构数据。
- 不得将生产环境用作测试平台。
verify up实例归你使用;生产环境属于用户(docs/verify/deploy.md是部署后的只读检查)。 - 不得仅凭合并、CI 通过或部署就声称“已验证”:实际运行了什么、在哪里运行,是发布技能要回答的问题;“未知”也是有效答案。
声称已验证前先提交报告
填写 .verify/report-<branch>.md(使用 report <area…>),并将其粘贴到拉取请求中(即 .github/pull_request_template.md 中的证据表):
- 提交、
doctor行、check结果(以及是否运行了形式化模型)、模型(虚拟 / 真实); - 按区域列出:执行过的路径、命令、观察到的副作用(关键输出);
- 跳过或无法访问的路径:每条路径受阻的原因,以及覆盖到的最接近的真实路径;
- 此处未能证明的内容(例如:措辞需要真实模型)。