验证循环:让 Claude 自主迭代的核心机制
验证循环(Verification Loops)是 Claude 能够自主完成复杂任务的关键架构。其核心逻辑在于构建一个自主闭环系统,使 Claude 能够像人类工程师一样,通过“编写代码-执行测试-发现错误-修复代码”的迭代过程,逐步逼近成功状态。这种机制允许 Claude 在给定任务或成功标准上进行爬山式优化(Hill Climbing),即通过不断的局部改进最终达到全局最优解。
"A loop essentially is an autonomous circuit that you can complete for Claude and it allows Claude to hill climb on a given task or a given success criteria."
在实际操作中,Claude 首先编写代码,随后利用工具检查是否存在失败。如果检测到失败,它会分析错误日志并编写修复代码,然后重新运行验证。这一过程不断重复,直到达到预期的成功状态。这种机制带来的最大价值在于结果的可信度:当 Claude 最终提交 Pull Request (PR) 时,由于经过了多轮自我验证,其代码质量和功能性得到了显著保障,远超一次性生成的代码。
实战案例:修复个人网站注册按钮故障
为了具体说明验证循环的有效性,演讲者分享了一个个人网站修复案例。当网站的“注册按钮”失效时,演讲者仅向 Claude 下达了“让注册按钮正常工作”的简单指令。Claude 随即启动了验证循环:
- 启动应用:运行开发服务器。
- 浏览器交互:打开浏览器并点击注册按钮,观察到按钮点击后无反应。
- 日志分析:读取应用日志,定位问题根源。
- 代码修复:修改代码并重新加载应用。
- 再次验证:重复上述步骤,直到按钮点击后能正常跳转。
最终,Claude 提交了一个确实有效的 PR。这个案例证明,只要提供正确的工具和指令,Claude 能够自主处理从前端交互到后端日志分析的完整调试流程。演讲者强调,无论验证类型如何(前端、后端或基础设施),核心概念不变:即赋予 Claude 工具以进入循环。一旦配置得当,前端 UX 验证、后端逻辑验证甚至基础设施验证可以合并为统一的验证流程,无需针对每种情况编写极度特定的指令。
构建验证循环的四个关键要素
要让 Claude 成功进入验证循环,必须提供四个核心要素,以前端/UX 验证为例:
- 运行应用程序:例如执行
npm run start启动开发服务器,确保应用处于可测试状态。 - 浏览器控制:Claude 需要能够驱动浏览器。演讲者推荐使用 Claude and Chrome MCP 工具(通过
/chrome访问),或者使用 Playwright 等其他浏览器控制 MCP。这使得 Claude 能像真实用户一样与界面交互。 - 状态证明:通过截图对比来验证修复效果。在修复前后分别截图,确保应用状态符合预期。
- 解除阻塞(Unblocking):这是生产环境验证中的常见难点,主要涉及 OAuth 身份验证和预配置状态。
"Some of the common blockers are, for example, OAuth and state... you want to give Claude an identity that it can log into... and state means you may want to preconfigure some state."
为解决 OAuth 问题,需赋予 Claude 一个可登录的身份;为解决状态问题,需预填充数据(如电商库存)。与传统静态测试脚本不同,这些状态设置脚本必须是动态的,且指令不应过于僵化,从而允许 Claude 处理更广泛的场景。
技能封装与自我改进机制
验证循环脚本需要被封装和分发,以便团队复用。技能(Skills)是存储特定主题上下文的最佳方式。技能不仅用于存储验证循环的逻辑,还可以被设计为自我改进(Self-improving)的系统。
在 Claude Code 团队中,他们维护一个单一的验证技能,该技能被明确指示在遇到阻塞时自动编辑自身文档。这意味着每次团队成员遇到新问题时,技能会自动记录解决方案,形成自我文档化的知识库。这种机制使得技能成为团队共享资产,而非个人私有脚本,极大提升了协作效率和维护性。通过这种方式,验证循环从单一任务执行工具进化为持续进化的工程资产。
"If you put in instructions into your skill about improving the skill every time Claude hits a blocker, you will end up creating this self-documenting, self-improving skill."
演讲者最后提到,接下来的演示将使用 Monkeytype 这一打字测试应用程序作为案例,该应用要求用户尽可能准确快速地输入显示的单词,这将为后续的自动化验证提供具体的测试场景。
构建真实全栈应用验证环境
演示选取了开源打字练习网站 Monkeytype 作为案例,因其具备典型的 全栈应用特征:前端交互丰富,后端逻辑清晰。该应用基于 TypeScript 开发,后端采用 Express 框架,数据持久层结合了 MongoDB 和 Redis。这种技术栈的复杂性使其成为展示 AI 代码生成与验证能力的理想对象。演示者提前在本地完成了环境配置和依赖安装,并创建了 Claude Code 会话,旨在现场演示如何构建一个自动化的 验证循环(Verification Loop)。
"I like this as a demo app because it is representative of a real world full stack app."
在会话启动后,演示者指示 Claude 启动开发服务器。由于服务器已在后台运行,Claude 确认了服务状态。随后,通过浏览器访问前端页面,可以看到打字计时器等核心功能正常显示;同时,后端 API 接口也返回了预期的 JSON 数据,证明 前后端服务均已就绪。为了引入自动化验证机制,演示者启用了 Chrome MCP(模型上下文协议) 扩展,状态显示为 "enabled" 且扩展已安装。这一步骤至关重要,因为它赋予了 Claude 直接操控浏览器、与前端页面进行动态交互的能力,而不仅仅是静态代码分析。
利用 Chrome MCP 执行动态前端验证
在环境就绪后,演示的核心转向了 动态功能验证。演示者首先让 Claude 使用 Chrome MCP 工具检查前端页面的基本状态。Claude 成功调用了 MCP 工具,导航至 localhost:3000 并读取了页面内容,证明了工具链的连通性。然而,仅查看静态页面不足以验证应用逻辑,因此演示者进一步要求 Claude 执行更复杂的交互操作。
"Can you try typing and make sure everything works?"
Claude 模拟用户输入文本,验证了打字功能的响应机制。尽管演示者自嘲打字速度不快,但 Claude 成功完成了这一交互测试。接着,演示者要求 Claude 进入设置页面并修改难度选项(如设置为 "Expert"),并验证该设置是否被持久化保存。Claude 不仅成功导航至设置页,还确认了 设置变更的持久性。这一过程展示了 Claude 如何通过 MCP 工具模拟真实用户行为,从而对前端应用进行端到端的 冒烟测试(Smoke Test)。这种验证方式超越了传统的单元测试,能够覆盖 UI 交互、状态管理和数据持久化等关键维度。
封装验证技能与自动化纠错循环
在手动指导 Claude 完成一系列验证步骤后,演示者将这些经验转化为可复用的资产。通过指令,Claude 将之前的操作逻辑、命令(如 Docker Compose 启动、MCP 工具加载)以及浏览器验证步骤整合为一个 Skill 文件(docloud demo verification)。该文件详细记录了如何启动环境、加载工具以及执行前端冒烟测试,形成了一个标准化的 验证技能包。
"Take everything we learned and put it into a skill file..."
随后,演示者提出了一个新需求:在用户输入错误时显示彩纸动画,并要求 Claude 使用刚刚创建的验证技能来 自我验证 其工作成果。Claude 进入自动模式(Auto Mode),开始编写代码实现该功能。在开发过程中,Claude 遇到了 Lint 错误,但它没有停滞,而是自动检测并修复了这些错误,然后再次运行验证技能进行检查。这一过程形成了一个 闭环迭代:编写代码 -> 发现错误 -> 修复代码 -> 自我验证。最终,彩纸动画功能成功实现,且验证通过。这证明了通过赋予 AI 明确的验证指令和工具,它可以像人类开发者一样进行 自我纠错和迭代优化,显著提升了开发效率和代码质量。
核心启示:从手动指导到自主验证
本次演示的关键结论在于 验证循环的构建与复用。演示者强调,初期需要 "手把手" 指导 Claude 如何执行验证步骤,包括启动服务、使用 MCP 工具以及检查特定功能。一旦 Claude 掌握了这些验证逻辑,就可以将其封装为 Skill 文件。这种封装不仅便于个人未来复用,也利于团队内部的知识共享和标准化。
"You should try to hold claude's hand and show it how to do verification..."
通过这种方式,开发者可以将复杂的验证流程标准化,让 Claude 在后续任务中自动执行这些验证步骤。演示中展示的 Lint 错误自动修复 和 功能自我验证 环节,体现了 AI 在复杂任务中的 爬山算法(Hill Climbing) 能力:在遇到障碍时,利用验证反馈不断调整策略,直至达到预期状态。这种模式极大地降低了全栈应用开发的调试成本,使 AI 助手能够从单纯的代码生成者转变为具备 自验证能力 的独立开发者。
注意力稀缺:多实例并发的核心痛点
随着验证循环(Verification Loops)技术的成熟,开发者可以更安全地并行化工作,但多云实例并发带来了新的挑战:注意力是稀缺资源。当同时运行过多云端实例时,开发者的认知负荷会急剧增加。作者指出,同时打开超过四到五个会话会对大脑造成巨大负担,导致无法有效运作。为了解决这一问题,需要采用更有效的策略来管理多云环境,主要涉及四个方向:Claude Code 桌面应用、终端中的 Claude Agents、云端运行的 Web 版 Claude,以及远程控制功能。
"I personally find that more than four to five sessions open simultaneously takes a big load on my brain and I can't really function beyond that."
桌面应用与终端管理:从手动到智能排序
Claude Code 桌面应用提供了中央控制面板,左侧边栏整合了本地终端、云端及 Git 仓库中的所有会话。用户可以对会话进行重命名、着色、置顶等操作,通过记忆化的命名帮助开发者快速识别上下文,从而保护注意力。对于偏好终端的用户,传统的做法是使用 Tmux 窗口管理器配合多个窗格(panes)和不同的工作树(work trees)来管理多任务。虽然这种方法可行,但手动管理工作树和窗口布局非常繁琐且不便。
为优化终端体验,Claude 推出了 Claude Agents 功能。用户只需输入 claude agents 即可进入类似桌面侧边栏的视图。该视图的核心优势在于根据注意力需求对会话进行智能排序:需要立即处理权限提示或输入的阻塞会话会显示在顶部,而正在运行或已完成目标的会话则排在后方。用户同样支持自定义排序、重命名和置顶,从而在终端环境中实现更高效的 workload 管理。
云端解耦与远程控制:打破设备限制
Claude Code 在 Web 端运行旨在将会话与本地笔记本解耦。作者分享了个人痛点:在会议间隙移动或驾车回家时,无法依赖本地网络或保持笔记本开启,导致工作流中断。将会话运行在云端不仅消除了对本地计算资源的依赖,还实现了跨设备无缝衔接。用户可通过 claude.ai/code 轻松启动云端会话。
远程控制(Remote Control)被作者称为“最喜欢的功能”。它允许用户通过手机控制任何表面上的 Claude 会话。启动方式为在会话中输入 /remote-control,随后会话会出现在移动应用中并发送通知。当 Claude 需要输入或帮助时,手机会震动提醒,用户可以在任何场景(如驾车中)直接提供输入。尽管因时间原因未展示演示,但该功能显著降低了上下文切换的成本,使开发者能从“手动启动会话”的循环中进一步解放出来。
"Remote control essentially gives you the option to control any session running on any surface with your phone."
自动化后台代理:从 babysitting 到自主执行
尽管多云管理优化了注意力分配,但手动启动新会话仍需明确目标和意图。为了进一步减少人工干预,需要引入后台代理(Background Agents)来处理非核心编码任务。软件工程师的大量时间耗费在PR(Pull Request)维护、文档更新、CI 监控和反馈分类等“记账式”工作上。随着 AI 生成代码量的增加,PR 数量激增,开发者往往需要花费数小时“保姆式”地处理合并冲突、审查评论和 CI 失败。
例如,若一天需合并 20-30 个 PR,手动跟进每个 PR 的状态和反馈将消耗大量精力。此外,随着功能发布速度加快,文档更新和 CI 稳定性维护也需同步跟进。这些任务虽然必要,但并非核心编码,适合由后台代理自动执行,从而让开发者专注于高价值的创造性工作。