mcpField
W
webapp-testing

webapp-testing

github.com/duc01226测试与质量1260 次安装1 周前更新
代码仓库

关于 webapp-testing

webapp-testing 是使用 Python Playwright 脚本测试本地 Web 应用的技能,涵盖静态页面和动态应用,并提供服务器生命周期管理流程。

主要功能

  1. 01使用 Python Playwright 编写测试脚本
  2. 02支持静态 HTML 与动态应用流程
  3. 03自动管理服务器生命周期
  4. 04检查 DOM 并截取页面
  5. 05提供等待与浏览器清理指引

适用场景

  1. 01自动检查本地 Web 应用
  2. 02为浏览器测试启动一个或多个服务
  3. 03交互前检查渲染后的页面

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/duc01226/easyplatform --skill webapp-testing

安装后在 Claude Code 中输入/webapp-testing确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

LICENSE.txt
examples/
console_logging.py
element_discovery.py
static_html_automation.py
scripts/
with_server.py

详细介绍

Codex 兼容性说明:

  • 在 Codex 中使用 $skill-name 调用仓库技能;此镜像副本会将旧版 Claude /skill-name 引用改写为这种形式。
  • 任务跟踪要求:执行任何工作流或技能步骤之前,必须为所有步骤创建或更新任务跟踪,并在进度变化时保持同步。
  • 用户提问提示表示要在 Codex 中直接询问用户。
  • 忽略出现的 Claude 专属模式切换说明。
  • 严格执行约定:用户明确调用某项技能时,必须按原样执行该技能协议。
  • 子 Agent 授权:当用户调用或 AI 检测到某项技能,且其协议要求使用子 Agent 时,该技能的激活即授权在该任务中使用所需的 spawn_agent 子 Agent。
  • 除非用户事先明确批准偏离,否则不得跳过、重新排序或合并协议步骤。
  • 对于工作流技能,必须明确执行列出的每个子技能步骤,并逐步报告依据。
  • 如果在此环境中无法执行某个必需步骤或工具,请停止并在调整方案前询问用户。

Codex 项目参考文档加载(无钩子)

Codex 使用静态项目参考文档加载机制,而非运行时注入项目文档。 在编码、规划、调试、测试或审查时,请按照此路由明确打开项目文档。

始终阅读:

  • docs/project-config.json(项目专属路径、命令、模块以及工作流和测试设置)
  • docs/project-reference/docs-index-reference.md(指向完整 docs/project-reference/* 目录的路由)
  • docs/project-reference/lessons.md(始终适用的防护措施和反模式)

缺少或过时的上下文路由: 如果缺少或过时 docs/project-config.json、文档索引、lessons.md、CLAUDE.md、AGENTS.md 或任何任务所需的参考文档,请在常规项目工作前自动运行 $project-init 或范围较窄的设置路由($project-config、$docs-init、$scan-all、$scan --target=<key>、$claude-md-init)。如果 Codex 镜像或 AGENTS.md 缺失或过时,请让用户运行 $sync-codex;不要自动运行它。

按情况查阅文档:

  • 项目结构/架构/技术栈/部署/设置(任何层面——后端、前端或基础设施):project-structure-reference.md
  • 后端/CQRS/API/领域/实体变更:backend-patterns-reference.md、domain-entities-reference.md
  • 前端/UI/样式/设计系统:frontend-patterns-reference.md、scss-styling-guide.md、design-system/README.md
  • 编写规范、docs/specs/ 路径或 TC 格式:feature-spec-reference.md、spec-system-reference.md、spec-principles.md
  • 行为/公共契约变更或规范—测试—代码同步:workflow-spec-test-code-cycle-reference.md 以及上述规范文档
  • 派生规范索引/ERD/重新实现指南:spec-system-reference.md 和 docs/specs/ 下的源 Feature Spec
  • 集成测试实现/审查:integration-test-reference.md
  • E2E 测试实现/审查:e2e-test-reference.md
  • 代码审查/审计:code-review-rules.md 以及根据变更文件选择的领域文档

不要不加区分地阅读所有文档。从 docs-index-reference.md 开始,然后只打开与任务相关的文件。

快速摘要

**目标:**使用 Python Playwright 脚本测试本地 Web 应用,并管理服务器生命周期。

如需对整个站点进行 QA 审核(无障碍性、性能、安全性、SEO),请改用 test-ui。

工作流:

  1. 选择方案 — 静态 HTML(直接读取选择器)还是动态应用(使用服务器辅助脚本)
  2. 启动服务器 — 使用 scripts/with_server.py 自动管理服务器生命周期
  3. 初步侦察 — 导航、等待 networkidle,截屏并检查 DOM
  4. 执行操作 — 使用发现的选择器编写 Playwright 脚本

关键规则:

  • 在动态应用中检查 DOM 前,务必等待 networkidle
  • 将捆绑脚本视为黑盒;先运行 --help,不要阅读源代码
  • 始终以无头模式启动 Chromium,并在完成后关闭浏览器

保持怀疑。运用批判性思维和顺序思维。每项判断都需要可追溯的依据和置信度百分比(想法的置信度应高于 80%)。

Web 应用测试

要测试本地 Web 应用,请编写原生 Python Playwright 脚本。

可用的辅助脚本:

  • scripts/with_server.py - 管理服务器生命周期(支持多个服务器)

务必先使用 --help 运行脚本,查看用法。除非先尝试运行脚本,并确认确实有必要进行定制,否则不要阅读源代码。这些脚本可能非常庞大,会占用上下文窗口。它们的设计用途是作为黑盒脚本直接调用,而不是读入上下文窗口。

决策树:选择方案

User task → Is it static HTML?
    ├─ Yes → Read HTML file directly to identify selectors
    │         ├─ Success → Write Playwright script using selectors
    │         └─ Fails/Incomplete → Treat as dynamic (below)
    │
    └─ No (dynamic webapp) → Is the server already running?
        ├─ No → Run: python scripts/with_server.py --help
        │        Then use the helper + write simplified Playwright script
        │
        └─ Yes → Reconnaissance-then-action:
            1. Navigate and wait for networkidle
            2. Take screenshot or inspect DOM
            3. Identify selectors from rendered state
            4. Execute actions with discovered selectors

示例:使用 with_server.py

要启动服务器,请先运行 --help,然后使用辅助脚本:

单个服务器:

python scripts/with_server.py --server "npm run dev" --port 5173 -- python your_automation.py

多个服务器(例如,后端 + 前端):

python scripts/with_server.py \
  --server "cd backend && python server.py" --port 3000 \
  --server "cd frontend && npm run dev" --port 5173 \
  -- python your_automation.py

要创建自动化脚本,只需包含 Playwright 逻辑(服务器会自动管理):

from playwright.sync_api import sync_playwright

with sync_playwright() as p:
    browser = p.chromium.launch(headless=True) # Always launch chromium in headless mode
    page = browser.new_page()
    page.goto('http://localhost:5173') # Server already running and ready
    page.wait_for_load_state('networkidle') # CRITICAL: Wait for JS to execute
    # ... your automation logic
    browser.close()

先侦察后操作模式

  1. 检查渲染后的 DOM:

    page.screenshot(path='/tmp/inspect.png', full_page=True)
    content = page.content()
    page.locator('button').all()
    
  2. 根据检查结果确定选择器

  3. 使用发现的选择器执行操作

常见问题

❌ 不要在动态应用中等待 networkidle 之前检查 DOM ✅ 请务必先调用 page.wait_for_load_state('networkidle'),再进行检查

最佳实践

  • 将捆绑脚本视为黑盒 - 完成任务时,考虑 scripts/ 中是否有可用脚本能够提供帮助。这些脚本可以可靠地处理常见且复杂的工作流,同时避免占用上下文窗口。使用 --help 查看用法,然后直接调用。
  • 同步脚本使用 sync_playwright()
  • 完成后务必关闭浏览器
  • 使用清晰易懂的选择器:text=、role=、CSS 选择器或 ID
  • 添加适当的等待:page.wait_for_selector() 或 page.wait_for_timeout()

参考文件

  • examples/ - 展示常见模式的示例:
    • element_discovery.py - 发现页面上的按钮、链接和输入框
    • static_html_automation.py - 使用 file:// URL 访问本地 HTML
    • console_logging.py - 在自动化期间捕获控制台日志

[IMPORTANT] 使用任务跟踪,将所有工作拆分为多个小任务,并在开始前完成——包括针对每个待读取文件的任务。这样可以避免因长文件导致上下文丢失。对于简单任务,AI 必须主动询问用户是否跳过。

批判性思维心态 — 运用批判性思维和顺序思维。每项判断都需要可追溯的依据;只有置信度高于 80% 才采取行动。 **防止幻觉:**切勿将猜测当作事实;每项判断都要引用来源;坦诚承认不确定之处;自行检查输出是否有误;独立交叉核对;对自己的判断保持怀疑——没有证据的确信是所有幻觉的根源。 基于证据的推理 — 禁止推测。每项断言都必须有证据。

  1. 每项断言都引用 file:line、grep 结果或框架文档
  2. 声明置信度:>80% 可自由行动,60-80% 先验证,<60% 不要推荐
  3. 架构变更需要跨服务验证
  4. “证据不足”是有效且预期的输出

以下内容完成前,操作将被阻止: - [ ] 证据文件路径(file:line)- [ ] 已执行 grep 搜索 - [ ] 找到 3 个或更多类似模式 - [ ] 已声明置信度

未经证据证明,禁止使用: “显然”、“我认为”、“应该是”、“可能是”、“这是因为” 如果信息不完整 → 输出:"证据不足。已验证:[...]。未验证:[...]。"

源代码/测试漂移检查。 对于编码、修复、调试、调查、测试或审查工作:当源代码行为发生变化时,检查受影响的单元/集成/E2E 测试,并根据证据判断是应修改测试以匹配预期行为,还是源代码变更属于意外错误,需要修复。不要为迁移代码编写测试;架构/数据迁移是一次性执行路径,不属于核心应用逻辑。

测试失败责任判定 — 测试失败时(或在调试或修复失败时),任务是确定_问题出在源代码还是测试代码_。正确作出判断比让测试套件恢复全绿更重要。此规则同样适用于所有调试/修复/测试技能。

  1. 触及任一方之前,先作出初步判定。 将观察到的证据归类为 SOURCE-WRONG、TEST-WRONG、TEST-NOT-OPTIMAL、ENVIRONMENT-BLOCKED 或 AMBIGUOUS;然后执行 $debug-investigate 并从末端向起点追踪,再进行编辑。让测试套件恢复全绿不是目标。
  2. 结合规范和源代码进行交叉验证。 如果有适用的 Feature Spec 规定了该行为(例如 docs/specs/** — §3 ACs / §4 BRs / §5 invariants / §8 TCs),则它是判定_预期行为_的依据——将生产源代码和失败的测试都与其进行比较。如果没有规范,则以文档中说明的意图/验收标准/调用方契约为参照。根据这些证据判断是源代码有误还是测试有误。
  3. 判定问题责任方,然后从根源修复错误的一方:
    • SOURCE-WRONG — 生产代码违反了规范中的预期行为或明确的不变量 → 在所属层修复源代码;保留或强化发现问题的测试。
    • TEST-WRONG — 测试中的断言、设置或预期已过时或不正确,与预期行为相矛盾 → 从根源修复测试。绝不要为了让测试变绿而削弱断言、添加跳过项或放宽超时。
    • TEST-NOT-OPTIMAL — 预期行为正确,但测试接缝、时序或断言信号不稳定 → 改进测试,但不要削弱不变量。
    • ENVIRONMENT-BLOCKED — 基础设施或外部状态导致无法判定源代码/测试的责任 → 保留诊断信息;待环境恢复正常后再进行修改。
    • AMBIGUOUS — 证据或预期行为不足以安全地判定责任方 → 编辑前询问用户或规范的权威负责人。
    • 绝不要为了匹配有缺陷的源代码而修改测试,也绝不要为了满足有缺陷的测试而修改源代码。(迁移代码除外 — 架构/数据迁移是一次性执行路径,不属于核心应用逻辑。)
  4. 预期行为不明确时询问用户。 如果没有规范规定该行为、规范未涉及该行为,或规范对哪一方正确存在歧义,则停止操作,并直接询问用户(或咨询规范的权威负责人),然后再编辑任一方——绝不要为了让测试通过而暗自选择修改源代码或测试。

应与预期行为保持一致,而不是与当前通过的一方保持一致——全绿也可能恰恰掩盖了那个错误。 防止 AI 出错——每项任务都要避免以下失误:

上下文变化后重新阅读文件。 上下文压缩、恢复工作或长时间运行的任务都可能导致记忆过时;采取行动前,请核实当前文件。 根据源证据核实生成的内容。 AI 可能会捏造 API、名称、说法和文档事实。记录或引用之前,请检查相关来源。 删除或重命名前,检查下游引用。 删除某项内容可能导致文档、生成的镜像、配置和调用方过时;请先梳理引用关系。 编辑后追踪完整的影响链。 更改定义可能会遗漏派生输出和使用方。宣布完成前,请追踪所有受影响的环节。 核实所有受影响的输出,而不只是第一个。 一项检查通过不代表所有检查都通过;请验证更改可能影响的每个输出端。 假定现有值是有意设置的——更改或将其标记为缺陷前,先询问原因。 更改或报告常量、限制、标志、阈值、措辞或模式之前,请阅读附近的上下文和历史记录、调用方的排序方式,以及至少 2 个采用相同约定的同类调用点。文档只说明“是什么”而未说明“为什么”,意味着缺少依据说明,并不能证明缺少防护措施。 行动前说明歧义——不要默默自行选择。 存在多种有效解释时,必须明确提问,或说明假设及其风险。 断言系统自身负责的结果,而非基础设施负责的中间状态。 验证异步任务时,应断言最终业务状态——绝不能断言由共享基础设施管理、任何并行运行进程都可能写入的交付/重试记录。这种检查单独运行时会通过,一旦有其他进程共享该基础设施,就会变得不稳定。 确保共享指南与角色相关。 通用指南必须对每个接收它的技能或 Agent 都有帮助;代码专属的要求只应放在代码专属协议中。

重要,必须注意:每项说法都要引用 file:line 证据(采取行动的置信度须 >80%)。绝不无证据地猜测。

必须注意:运用批判性思维并按顺序推理——每项说法都需要适当的可追溯证据(仓库/代码相关说法需提供 file:line;研究、产品、内容和文档相关说法需提供来源 URL 或文档章节);采取行动的置信度须 >80%,低于 60% 时不要提出建议。防止幻觉:绝不把猜测当作事实;坦诚承认不确定性;独立交叉核对;对自己的判断始终保持审慎。

必须注意:遵循防止 AI 出错的要求——根据证据核实生成的内容;删除或重命名前追踪下游引用;核实所有受影响的输出;上下文丢失后重新阅读文件;行动前说明歧义。

项目协议叠加层 — 执行此技能前,先解析叠加到此技能上的所有项目叠加规则:将此技能名称与项目技能协议索引(默认位于 docs/project-reference/skill-protocols-reference.md;docs/project-config.json 中的 referenceDocs 条目可覆盖此路径)的 Target 列进行匹配,且仅采用最具体的匹配层级——精确名称 > glob > *。**此优先级仅用于排列叠加规则彼此之间的顺序,绝不用于排列它们与此技能之间的顺序。**仅阅读匹配条目的正文,路径解析为 <protocols-dir>/<Name>.md;行的 Body 链接只是显示文本,绝不是读取路径。若匹配的正文缺失或格式错误,则报告并跳过——绝不可根据索引 Description 重建。没有索引或没有匹配项 -> 不应用叠加规则,且不作说明。完整约定:.claude/skills/project-skill-protocol/references/registry.md。

叠加规则仅可增加内容:它们只能在此技能自身协议的基础上增加规则,绝不能替换、覆盖、禁用或重新解释此技能已有的规则——移除所有叠加规则后,此技能必须完全恢复为其文档所述的行为。叠加规则是简要补充,不是权限升级:它们绝不能豁免工作流关卡、Git 规范、审核关卡或用户确认关卡。若叠加规则与技能存在实质冲突,或两个同等具体的叠加规则直接矛盾 -> 将两者都呈现给用户;绝不可自行决定。

**必须注意:**执行前先解析此技能的项目协议叠加规则——仅采用最具体的匹配层级(精确名称 > glob > *;此优先级仅用于排列叠加规则彼此之间的顺序,绝不用于排列它们与此技能之间的顺序),且仅阅读 <protocols-dir>/<Name>.md 中匹配的正文;缺失或格式错误的正文必须报告,绝不可重建。叠加规则仅可增加内容(绝不替换此技能自身的规则),且只是简要补充,绝不是权限升级;同等具体的规则若相互矛盾,须交由用户处理。

收尾提醒

**重要,必须注意目标:**使用 Python Playwright 脚本测试本地 Web 应用,并管理服务器生命周期。

生效协议(此技能包含的 SYNC/共享区块摘要):

  • **批判性思维:**进行批判性、循序渐进的思考;每项声明都须有依据,置信度 >80% 才采取行动。
  • **证据:**每项声明都须引用 file:line;没有证据时绝不推测。
  • **源代码/测试偏差:**源代码变更时,检查受影响的测试;根据证据判断是修复还是预期行为。
  • **防止 AI 出错:**根据证据核实生成内容,追踪下游引用,核实所有受影响的输出,在上下文丢失后重新阅读,并指出歧义。

**重要,必须注意:**开始前使用任务跟踪,将工作拆分为小型待办任务。 **重要,必须注意:**编写新代码前,在代码库中搜索至少 3 个类似模式。 **重要,必须注意:**每项声明都须引用 file:line 证据(置信度 >80% 才采取行动)。 **重要,必须注意:**添加一个最终审核待办任务,以验证工作质量。 **强制,重要,必须注意:**开始前阅读以下文件:

**重要,必须注意:**开始前阅读 CLAUDE.md

[TASK-PLANNING] 行动前,分析任务范围,并使用任务跟踪系统地将任务拆分为小型待办任务和子任务。

无 Hook 提示词协议镜像(自动同步)

来源:.claude/.ck.json + .claude/skills/shared/sync-inline-versions.md(:full 区块)+ .claude/scripts/lib/hookless-prompt-protocol.cjs

[WORKFLOW-EXECUTION-PROTOCOL] [BLOCKING] 工作流执行协议 — 强制要求,重要,必须执行,关键。任何情况下都不得跳过。

**通用可移植性边界:**可复用技能和协议文本应保持项目中立;从 docs/project-config.json 和 docs/project-reference/ 中了解项目特定约定。应用 shared/sdd-artifact-contract.md 中的共享 AI-SDD。阅读 docs/project-config.json 和 docs/project-reference/docs-index-reference.md,然后打开其中列出的项目参考文档。对于规范、测试用例、行为变更、公共契约或 docs/specs/ 相关工作,应通过文档索引中列出的本地规范文档进行:当规范/测试/代码必须保持同步时,使用 feature-spec-reference.md、spec-system-reference.md、spec-principles.md 和 workflow-spec-test-code-cycle-reference.md。如果任一文件或必需的参考文档缺失或过时,则在进行常规项目特定工作之前,自动运行 $project-init(或更精简的底层流程,例如 $project-config、$docs-init、$scan-all 或 $scan --target=<key>)。只要具备此共享上下文和本地文档,任何受支持的 AI 工具都可以执行。

  1. **检测:**如果提示以明确的斜杠技能/工作流命令开头,则直接执行。否则,根据工作流目录和技能列表匹配提示。
  2. **分析:**选择最佳方案:直接执行、调用技能、启动标准工作流,或组合自定义步骤。
  3. **自动选择:**自行选择最佳方案。不要让用户在直接执行、技能、标准工作流或自定义工作流之间做选择。
  4. **启动:**对于选定的工作流,调用 $start-workflow <workflowId>;对于选定的技能,调用该技能;对于自定义工作流,直接按顺序执行自定义步骤;对于直接执行,继续处理任务。
  5. **创建任务:**如果选定路径包含多个步骤,则在执行前为所有工作流/技能/自定义步骤创建任务跟踪。
  6. **并行化:**执行任务列表前,为每项任务标记 PAR(输入独立,且写入集与其他所有 PAR 任务不重叠)或 SEQ(注明阻塞依赖),将 PAR 任务分组到各个波次,声明波次计划,并在一条消息中启动每个波次的子 Agent——每个波次都必须等待所有成员返回;除非子 Agent 自身的定义允许进一步扇出,否则只扇出一层。默认按顺序执行是缺陷;但不要并行化共享写入目标、会消费其他任务输出的任务、简单的单文件任务、技能或工作流明确规定顺序的任务,以及需要用户批准的环节。
  7. **执行:**按照上下文指令中的 Workflow Step Advancement & Parallel Phases 规则推进——由模型驱动;子 Agent 完成与内联调用一样会推进步骤;并行阶段组必须等待所有成员返回(只有所有成员都返回后才能推进,绝不能串行执行)

共享 AI-SDD 协议标记

来源:.claude/skills/shared/sync-inline-versions.md

SYNC:ai-sdd-artifact-contract

AI-SDD 工件契约 — 共享的规范驱动开发规则应保持可移植,并由源文件管理。

  1. 将可复用的 AI-SDD 原则保存在 .claude 中;将特定于仓库的路径、命令、负责人、产品和格式放在项目配置/参考文档中。
  2. 保持以下周期:spec -> plan -> tasks -> implement -> verify -> update spec/docs。
  3. 通过决策、任务、TC/测试、源证据以及文档/规范更新,追踪每项要求或不变量。
  4. 将从代码提取规范的内容仅视为参考,直到规范的权威负责人接受为止。
  5. 任何受支持的 AI 工具都可基于同步的上下文进行规划、实现、审查或验证;使用多个工具是可选的。
  6. 先更新 .claude 源文件,再同步生成的镜像;不要手动编辑 .agents、.codex 或 AGENTS.md。— 原因:镜像是生成的工件;下次同步时,手动修改会被覆盖
  7. 如果 docs/project-config.json、根目录指令文件或必需的项目参考文档缺失或过时,则在进行常规项目特定工作之前,自动运行 $project-init 或范围更窄的底层流程。

当前参考文档: 当前技能根目录中的 shared/sdd-artifact-contract.md。


SYNC:ai-sdd-artifact-contract:reminder

  • MANDATORY 应用 shared/sdd-artifact-contract.md;将可复用的 AI-SDD 保存在 .claude 中,并将本地规则保存在项目文档中。
  • MANDATORY 从代码提取的规范仅供参考,直到权威规范获批;任何受支持的 AI 工具都可基于同步的上下文执行工作。
  • MANDATORY 先更新 .claude 源文件,再同步生成的镜像;不要手动编辑 .agents、.codex 或 AGENTS.md。
  • MANDATORY 如果项目配置、根目录指令文件或必需的参考文档缺失或过时,则应自动通过 $project-init 或范围更窄的设置流程来处理项目特定工作。 [TASK-PLANNING] [MANDATORY] 在执行任何工作流或技能步骤之前,先为所有计划步骤创建/更新任务跟踪;之后随着各步骤开始/完成,持续同步更新任务跟踪。

[LESSON-LEARNED-REMINDER] [BLOCKING] 任务规划与持续改进 — MANDATORY。不得跳过。

开始前将工作拆分为小任务(任务跟踪)。添加最终任务:“分析 AI 错误与经验教训”。

提取经验教训——仅关注根本原因,而非修复表象:

  1. 指明失败模式(推理/假设失误),而非表面症状——“未阅读源代码就假设 API 存在”,而不是“使用了错误的枚举值”。
  2. 通用性测试:此失败模式是否适用于 ≥3 种情境/代码库?如果不适用,则再向上抽象一层。
  3. 写成通用规则——去除特定于项目的名称/路径/类。规则应适用于任何代码库。
  4. 合并:多个错误若属于同一种失败模式,则合并为一条经验教训。
  5. 复发门槛:“如果没有这条提醒,未来会话中是否会再次出现此问题?”——不会 → 跳过 $learn。
  6. 自动修复门槛:“$code-review/$code-simplifier/$security-review/$lint 能否发现此问题?”——能 → 改进审查技能。
  7. 两个门槛都通过 → 请用户运行 $learn。 [CRITICAL-THINKING-MINDSET] 运用批判性思维和序贯思维。每项断言都需要可追溯的证据;采取行动前,置信度须 >80%。 **反幻觉原则:**绝不将猜测当作事实——为每项断言引用来源,坦诚承认不确定性,自行检查输出错误,独立交叉核对,并对自己的信心保持怀疑——缺乏证据的确信是所有幻觉的根源。 **AI 注意力原则(首因-近因效应):**在较长提示词/协议的开头和结尾都放置最关键的 3 条规则,以确保指令在较长的上下文窗口中仍能得到遵循。 **目标驱动执行:**先定义成功标准,持续循环直至验证完成;仅当可观察的检查均通过后才停止。 **测试验证意图:**测试必须保护业务规则/不变量,并在受保护的意图遭到破坏时失败,而不只是复现当前行为。

常见 AI 错误预防(系统经验)

  • 上下文压缩后重新读取文件。 编辑前必须在同一上下文中先读取文件;上下文压缩会清除读取状态。编辑前重新读取。
  • 批量替换后 grep 旧术语。 AI 过度相信查找/替换已覆盖所有内容。批量编辑后,对整个仓库执行 grep,检查文档/配置/目录中遗漏的引用。
  • 删除前检查下游引用。 删除会连带导致文档/代码过时。移除前先梳理引用文件。
  • 丢失记忆后,创建新内容前先检查现有状态。 上下文压缩会清除先前工作的记忆。查询当前状态以便继续——绝不要盲目重复创建。
  • 根据实际代码验证 AI 生成的内容。 AI 会幻觉出 API、类名和方法签名。记录/引用前先用 grep 确认其确实存在。
  • 编辑后追踪完整依赖链。 更改定义却漏掉下游使用方。追踪完整链路。
  • 重命名时,对所有使用方文件类型执行 grep。 某些文件类型会静默忽略缺失的引用(不会产生编译错误)。搜索代码、模板、配置和生成文件。
  • 验证正确性时追踪所有代码路径。 代码存在 ≠ 代码会执行。追踪提前退出、错误分支和条件跳过——不要只看正常路径。
  • 源数据变更时,更新包含规范数据的文档。 内嵌派生数据(工作流、架构、配置)的文档会静默过时。源数据变更时,同时更新所有内嵌该数据的文档。
  • 恢复上下文后验证子 Agent 的结果。 父 Agent 压缩上下文期间,后台 Agent 可能已经完成——用 grep 验证输出,不要相信对任务已完成的假设。
  • 将完整目标列表与子 Agent 的分配任务交叉核对。 按类别并行分配子 Agent 会漏掉边界项。继续前,将各分配任务的并集与目标列表核对。
  • 子 Agent 只能从其 Agent 的 .md 定义继承知识——使用自定义 Agent 类型,不要使用内置 Explore。 采用工具 = 权限 + 知识 + 执行(编号工作流步骤)。
  • 逐步记录子 Agent 的发现,不要等最后一次性提交。 长时间运行的子 Agent 可能在最终写入前达到截断限制——导致发现丢失。指示其按章节追加到报告文件。
  • 调试时,修复前先问“责任在谁?” 追踪调用方(数据错误)还是被调用方(处理错误)。在责任层修复——绝不要只修补症状出现的位置。
  • 测试失败 → 先记录暂定结论,再追踪/编辑,然后调查。 使用完整的五类分类:SOURCE-WRONG(生产代码违背意图)、TEST-WRONG(断言/设置已过时)、TEST-NOT-OPTIMAL(测试有效但脆弱或信号弱)、ENVIRONMENT-BLOCKED(外部状态阻止得出结论),或 AMBIGUOUS(意图/证据不足以安全判断)。然后追踪根因,并对照规范依据(如果存在,查看 docs/specs/**)和源代码进行交叉验证。绝不要只为让测试变绿而削弱断言、添加跳过、放宽超时或更改源代码。
  • 提取/重构后,对所有已移除名称执行 grep。 主文件“完成” ≠ 次要文件干净。宣布完成前,在整个范围内搜索每个已移除的符号。
  • 假定现有值是有意设定的——更改或将其标记为缺陷前先问为什么。 仅凭模式匹配判定“错误”会忽略上下文。更改或报告任何常量/限制/标志/阈值前:阅读注释、git blame、调用方的执行顺序(使该值正确的保证通常位于引用行之前紧邻执行的代码中),以及同一惯例下至少 2 个同类调用点。只说明“是什么”却不说明“为什么”的文档,缺少的是依据,并不能证明缺少保护措施;在验证环节中,准确的 file:line 引用证明的是转录无误,而不是缺陷确实存在。
  • 验证所有受影响的输出,而不只是第一个。 一个构建成功 ≠ 全部成功。涉及多个技术栈的变更(后端/前端/测试/文档)要求验证每一项输出。
  • 复制相近模式前,先评估是否适用。 最接近的示例 ≠ 前提相同——确认新上下文具有相同的约束、基类、作用域和生命周期。
  • 整体优先的调试方式——抵制注意力就近陷阱。 不要一头扎进第一个看似合理的原因。列出所有前提(配置、环境变量、路径、数据库、端点、凭据、版本、DI、数据)。用证据(grep/查询——而非推理)逐项验证。问“什么证据可以推翻这个假设?”——如果没有,那就不是假设。代价最高的失败:在“显而易见”的层继续深挖,而 Bug 实际位于从未质疑过的层。
  • 精准修改——应用 diff 测试(结合上下文判断)。 两种模式:(1)Bug 修复 → 每一行都能追溯到该 Bug;不做样式调整;只清理因你的修改而变得未使用的孤立内容。(2)审查/增强 → 实施改进,并声明为“超出主要请求的增强:[内容]”。绝不要悄悄扩大范围。Diff 测试:“如果我没有被要求做 X,这一行还会存在吗?”——如果不会,就删除或明确说明。
  • 编码前先指出歧义——不要默默自行选择。 存在多种有效解释时,逐一列出并说明工作量:“[请求] 可能指 (1) [N 小时]、(2) [N 小时]。哪一个更重要?”先列出范围/格式/数量/约束方面的假设。如果有更简单的方案,也要说明。绝不要默默自行选择。
  • [MANDATORY FIRST ACTION] 回复前务必先启用合适的技能或工作流。 将任务与工作流目录和技能列表进行匹配;通过技能调用或 $start-workflow <workflowId> 启用。检查之前绝不要回答或编写代码。跳过 = 违反协议。
  • Why-Review 对抗性思维——审查任何计划、决策或设计时都要运用。 默认持怀疑态度,而非验证者态度:充分论证被否决的替代方案,将每项既定理由反向审视(“它牺牲了什么?”),对最重要的 2-3 项假设进行压力测试,开展事前验尸(“已发布,3 个月后失败——什么会出问题?”),并指出作者遗漏的 1-2 种替代方案。章节齐全 ≠ 质量过关;质量取决于因果推理、具体缓解措施和证据,而不是“这样更好”或“密切关注”。
  • 大型审查的子 Agent 提示词应优先安排报告写入。 处理许多文件的子 Agent 可能在最终写入前耗尽预算——导致发现丢失。设计提示词时应确保:(1)报告写入是第一个明确的交付项,(2)按文件/章节逐项追加(不要批量写入),(3)限定范围,避免读取耗尽预算。若输出在句中被截断且没有报告文件 → 启动范围更窄的任务,不要原样重试相同提示词。
  • 上下文压缩后,继续前重新验证此前各阶段的所有结果。 摘要描述的是意图,不是环境状态(git 索引、文件系统、进程)。恢复时,首先审查:git status、重新读取修改过的文件、验证文件系统。每一项“已完成”的声明,在证据确认前都是未经验证的假设。
  • OOM/内存:先检查行数,再检查行大小。 排查顺序:(1)无界查询——触发条件是否没有数据库筛选?将筛选推到数据库端;这可消除 OOM。(2)行是否很大?投影可按比例减少数据量。减少行数比投影的收益更大。
  • 断言系统自身负责的结果,绝不要断言基础设施负责的中间状态。 测试任何异步行为(队列/代理传递、重试、后台任务、缓存、复制)时,应断言最终业务/实体状态。绝不要断言传递记录——消费/发送状态、尝试次数、最后错误、代理、调度程序或 outbox/inbox 表中的行存在与否或数量。这些记录属于共享基础设施,任何同时运行的进程(同伴 Worker、第二个副本、遗留的本地容器)都可能写入,且通常使用确定性的共享键;因此,断言会悄悄测试开发者的环境,而不是系统:单独运行时通过,一旦有其他进程共享该代理和数据库就会不稳定。每个断言都要问:“无论哪个进程执行了这项工作,该断言都会成立吗?”——如果不会,就改为断言已收敛的数据状态。推论:进程本地的故障注入和进程内遥测不能用于控制任何进程都可能执行的工作——将它们用作压力放大器(启用 → 限定时间窗口 → 停用 → 断言收敛),绝不要用作前置条件。
  • 不要让领域概念进入通用/共享/基础设施层。 可复用层(共享库、框架、基础设施模块)不得引用任何特定使用方的领域概念——租户/客户/产品 ID、业务实体、功能规则。泄漏进来后,代码能够编译并运行,因此会悄无声息地通过审查,同时让“可复用”层与某个使用方耦合。保持共享类型与领域无关;通过子类/组合将领域字段/逻辑下放到使用方。——原因:与某个使用方的领域耦合的层不再可复用。

评论

支持 Markdown