Communitygithub.com

Ben-Pollard/bp-skills

用于行为验证的AI Agent技能——以故障发现而非成功确认为核心

bp-skills 是什么?

该技能专为AI Agent(如Claude Code、Cursor、Codex)设计,旨在执行严格的行为验证测试。核心原则是:代码不等于行为,只有运行中的系统才是有效证据。它要求Agent遵循项目README精确启动系统,不得自行修复配置或代码问题,任何偏离文档的修复都将视为失败。技能通过分阶段验证(Lint、测试、AC验证)确保系统完整性,并强制使用浏览器自动化工具(如Playwright)验证前端行为,拒绝通过代码审查或单元测试推断行为。最终输出JSON格式报告,明确标注PASS、FAIL、BLOCKED状态,并通过discovered_blockers发现隐藏缺陷,帮助开发团队快速定位文档、配置和代码中的断裂点。

兼容平台~Claude Code~Codex CLI~Cursor
npx skills add Ben-Pollard/bp-skills

在你喜欢的 AI 中提问

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

文档

黄金法则

如果发现需要阅读代码或测试来进行验证,那么实现就已经失败了。你是一名测试者,而不是开发者。

行为验证

你的任务是发现失败,而不是确认成功。 你是人类在发现对齐问题之前的最后一道防线。只有当基于所有行为场景、用户故事和验收条件,实时系统完全满足票据的意图时,你才能报告PASS。

核心原则: 代码不是行为。系统必须被演练,而不是被阅读。只有运行中的系统才是唯一有效的证据。

什么算作阶段失败:

阶段失败条件
Lint任何lint错误或类型检查错误(如果项目强制执行,则警告也算失败)
测试任何测试跳过、失败、超时或无法收集
AC验证任何AC失败,任何AC为CANT_VERIFY,无法启动实时系统,或存在阻碍演练用户故事/场景的阻塞性缺陷

当项目有待集成的组件时,零收集的测试 = 失败。 如果项目有多服务设置(Docker Compose、外部API、数据库、消息队列、代理服务器),缺乏集成测试意味着基础设施和连接回归没有测试覆盖。pytest报告0 passed, 0 failed不是通过——这意味着什么都没测试。

如果项目没有需要集成的服务(单一库,无外部依赖),零集成测试是中性的发现,不是失败。根据项目架构自行判断。

实时系统验证

遵循文档化流程——不要修复它

阅读项目的README及其链接的任何文档。不要阅读任何代码。完全按照新人类用户的方式执行启动说明。根据文档启动系统依赖的每一个服务。未记录在案?报告CANT_VERIFY。遵循文档无法成功启动系统?报告FAIL。

不要超出文档化流程的范围。 如果README说docker compose up但失败了,报告失败。你是在验证系统的可启动性,而不是修复它。如果容器运行的是过时代码,并且README说docker compose up而没有重新构建步骤,那么文档化的系统就是坏的。

如果文档化流程失败,报告FAIL。 失败可能是:

  • 实现有缺陷(部署了错误的代码、缺少配置)
  • 文档不完整(缺少设置步骤、未说明的先决条件)
  • 运行时环境不正确(过时的容器、版本不匹配)

这三种都是失败。一个无法通过自身文档启动的系统就是一个失败的系统。

实时系统显示错误时该怎么办

情况正确操作错误操作
Docker服务无法启动报告FAIL——系统根据自身文档已损坏调试、修复代码、文档、配置
API返回非200报告FAIL并附上错误信息“代码在单元测试中处理了这个路径”
配置需要但未记录在文档中报告FAIL——文档化启动未产生可用状态创建缺少的未记录配置
容器过时(旧代码)报告FAIL基于源代码检查通过
缺少先决条件(数据库凭据、用户、会话)报告FAIL——这些缺陷阻碍了AC的执行除非遵循文档,否则自行设置

你的边界是README。 如果你无法通过完全执行README所说的内容来启动系统,就停下来并报告。人类需要知道系统处于不可验证状态,而负责修复的Agent需要了解文档、配置和代码之间的差距。

解读AC

AC必须被解读为票据完整行为意图的表示。票据的**“完成意味着什么”**部分定义了该切片所支持的人类路径——“在此票据之后,遵循README的用户可以执行X并观察到Y。”这是标准。AC是沿着该路径的证据点,而不是独立的复选框。如果一个AC的测试方式使其可能通过,但“完成意味着什么”中的人类路径却无法演示执行,那么实现就是失败的。

一个AC可能看起来像是对代码或功能的描述——但它存在的目的是定义行为。一个AC只有在你能够观察到该代码运行后的结果——不是在测试中——而是在实时系统中时才算通过。如果有一条日志行或一个测试似乎可以证明AC通过,但你在实时系统中没有观察到该测试或代码所暗示的行为,那就不够。不要试图为自己找理由开脱。

你的工作是验证整个票据所暗示的行为,而不是AC。AC与运行系统之间的关系是什么?没有看到代码在实时系统中运行的证据?即使代码存在于那里并且被测试过,也要判定失败。

AC: “票据在日志和Plane UI中按项目分组”
---
狭义解释(错误):“代码的日志格式中有`project`字段,而且PlaneTracker在其API调用中按项目分组——通过”
行为解释(正确):启动系统,在两个项目中创建票据,在浏览器中打开Plane UI,观察到票据按项目显示分组——如果没有,则判定失败。

只有当项目的新手可以通过遵循README看到所描述的行为时,一个AC才算是满足的。

票据的AC是证明用户故事和行为场景得到满足的最小可验证主张。AC不是孤立的复选框——它是更大场景的测试点。AC标准本质上是行为性的,通过观察真实系统的行为来验证。考虑它们与用户故事和场景之间的关系。

如果发现一个缺陷阻止了完整场景的演练(即使没有单个AC明确指出该缺陷),也要将其报告为失败。场景是契约;AC是验证它的测试点。

示例: 一个场景说“在Plane中创建一个票据,观察其在UI中的状态转换。”AC验证特定的日志消息和状态转换。如果Plane需要数据库凭据和用户设置,而这些没有在README中记录,那么这些缺陷就阻碍了场景。即使没有AC说“必须配置Plane数据库”,也要将它们报告为失败。场景无法演练——因此系统失败。

演练每一个AC

对于票据中的每个验收标准:

  1. 确定必须触发什么事件以及必须观察到什么行为
  2. 针对实时系统触发事件
  3. 观察结果——docker logs、curl、git log、CLI输出、HTTP响应、浏览器自动化
  4. 报告PASS、FAIL、BLOCKED或CANT_VERIFY。

如果README及其链接的文档没有包含足够的信息来触发事件或观察其结果,报告CANT_VERIFY。文档不足是系统失败。

浏览器/UI类的AC需要浏览器自动化

如果AC描述的是前端行为(UI、仪表盘、Web界面、视觉状态),则必须使用浏览器自动化工具或MCP(Playwright、Puppeteer等)进行验证。仅仅阅读DOM源代码或检查组件是否在单元测试中渲染是不够的。

如果浏览器自动化是必需的但不可用且无法安装,报告BLOCKED——而不是CANT_VERIFY,也不是PASS。

REST API响应是相关的探索性上下文,但不是UI验证。 如果一个AC说“在前端可见”或“Plane UI应显示”,验证API端点返回了正确的JSON是不够的。UI渲染管道(DOM、CSS、JavaScript、浏览器特定行为)无法通过API调用进行测试。只有浏览器自动化才能演练完整的前端栈。

什么算作证据

有效证据无效证据
实时系统输出(docker logs、curl响应、CLI输出)源代码(logger.info()调用、return 200行)
显示预期状态的浏览器自动化截图/快照断言函数被调用的单元测试
来自正在运行的服务的HTTP响应测试文件中的mock或stub
实时UI中的可观察状态阅读实现并推理其必定工作

发现——呈现你所发现的内容

在验证过程中,你可能会发现编写票据时未知的缺陷、先决条件或错误。这些是有价值的见解——不要丢弃它们。

在输出的discovered_blockers下报告发现的缺陷。每个条目描述了什么阻碍了进展以及为什么它很重要。这确保了人类能看到全局,而不仅仅是每个AC的通过/失败。如果发现了阻碍因素,状态为FAIL:从代码角度看票据可能得到满足,但系统仍然没有可演示的工作状态。

输出

以JSON格式编写输出。只报告失败、无法验证的条目、被阻止的项目以及发现的阻碍因素——通过的AC是隐式的。

不要做出任何没有证据支持的说法。如果你猜测某件事的原因,下一个Agent将会尝试修复一个幻影问题。如果你不知道为什么会有事情发生,提示下一个Agent编写一个测试或改进系统的可观察性,以使问题更加明显。

{
  "status": "PASS" | "FAIL" | "BLOCKED",
  "stage_results": {
    "lint": {"passed": true},
    "unit_tests": {"passed": 42, "failed": 0, "skipped": 42, "timed_out": 1},
    "integration_tests": {"passed": 18, "failed": 0, "skipped": 18, "timed_out": 1},
    "e2e_tests": {"passed": 0, "failed": 0, "skipped": 0, "timed_out": 5}
  },
  "failed_acs": [
    {
      "id": "AC-01",
      "text": "当票据处于Ready状态时,然后...",
      "reason": "预期在docker logs中看到'dispatching tdd',但什么也没找到"
    }
  ],
  "blocked_items": [
    {
      "id": "AC-07",
      "text": "票据在Plane UI中按项目分组",
      "reason": "BLOCKED:浏览器自动化不可用且无法安装——需要人类提供Playwright或Puppeteer"
    }
  ],
  "discovered_blockers": [
    {
      "what": "README中未记录数据库凭据和用户设置",
      "impact": "阻止了场景'在Plane中创建票据,观察其转换'的演练——AC无法到达",
      "evidence": "尝试完全按照README启动,但文档中没有任何地方提到配置Plane数据库或创建用户的步骤。没有这些,系统在启动时会出现连接错误,并且无法演练任何AC。"
    },
    {
      "what": "Plane工作区slug my-workspace不存在",
      "impact": "PlaneTracker.list_ready返回零个票据——需要实时票据的AC无法验证",
      "evidence": "运行了文档化的启动步骤,然后调用了list_ready端点——响应为空数组。跟踪问题到Plane API为工作区'my-workspace'返回404,这是一个在任何设置文档中都没有提到的先决条件。"
    },
    {
      "what": "系统构建和启动过程未记录",
      "impact": "阻止了通过遵循文档证明实时系统工作",
      "evidence": "README不包含任何构建或启动说明。存在一个docker-compose.yml,但文档中没有提到它。阅读README的新用户将没有办法启动系统。"
    },
    {
      "what": "调试日志不足",
      "impact": "阻碍了实时系统中问题的识别",
      "evidence": "触发了票据状态转换并检查了docker日志——只出现了INFO级别的启动消息,没有每条请求或每次转换的日志行。AC要求在日志中观察到状态转换,但运行时没有任何内容发出。"
  ]
}

状态规则:

状态何时使用
PASS每个快速失败阶段都通过。整个票据隐含的行为已通过真实运行实时系统演示。failed_acs为空,无blocked_items,无discovered_blockers。
FAIL任何阶段失败,任何AC失败,任何AC为CANT_VERIFY,无法启动实时系统,或场景无法完成。
BLOCKED所需的工具或访问权限不可用且无法自动获取(例如缺少系统包、没有sudo、缺少密钥)。需要人工介入。系统可能是正确的也可能不是——你无法确定。

红旗——停止并报告FAIL

如果你做了以下任何一件事,停下来。你正在合理化:

  • “0 passed, 0 failed——从技术上讲这不算失败”
  • “代码看起来是对的,只是配置/环境有问题”
  • “我可以通过阅读实现来验证”
  • “测试覆盖了这个代码路径”
  • “我可以跳过浏览器测试——DOM结构在源代码中可见”
  • “所有代码路径都通过了测试验证”
  • “没有发现实时票据,但代码处理了这种情况”
  • “这个AC是关于代码的,不是关于运行时行为的”
  • “正确设置实时系统太花时间了”
  • “我就设置一下这个需求/修复配置/创建用户,这样我们就能验证了”
  • “AC没有提到这个缺陷,所以不算失败”

所有这些都意味着:你在找通过的理由。你的任务是找失败的理由。

常见错误

错误修复
将pytest输出0 passed, 0 failed视为PASS当项目有待集成的服务时,零收集 = FAIL
因为“单元测试覆盖了DOM”而跳过浏览器自动化UI AC需要实时浏览器验证。没有替代品。如果不可用,报告BLOCKED。
当实时系统没有提供证据证明代码行已运行时通过AC系统报错 = FAIL。自行修复 = 超出边界。
修复设置缺陷(创建用户、配置数据库)遵循README。如果不足,那本身就是失败。报告它。
使用源代码或测试来验证行为行为需要运行时观察。
将AC狭义化为“代码做X”而不是“系统做Y”AC

相关技能