
1. 当 Agent 说「已完成」它到底完成了什么你大概率遇到过这种场面让 Claude Code 或 Cursor 改一个 React 组件它噼里啪啦输出一堆 diff最后来一句「UI 已完成可以提交了」。你打开浏览器一看按钮点下去没反应空状态直接白屏。后端更离谱接口 handler 写得有模有样你问它测过没有它说「逻辑上没问题」——但那个 400 分支从来没被执行过。这不是模型能力问题是完成定义的问题。Agent 默认把「代码写出来了」等同于「功能做完了」而工程上真正的完成应该是前端被真实点击过后端被真实跑红过。Webproof 就是干这件事的——它不是又一个编码 Agent而是套在你现有 Agent 上的一套纪律核心就一句话没点过、没红过就不许说 done。这篇面向三类人用 Claude Code / Cursor / Codex 做 Web 全栈的开发者、被 Agent「假交付」坑过的团队、想把验收标准落到可复现证据上的人。我会给出 Webproof 的验收清单、可复制的 settings.json / config.toml 骨架并演示怎么通过 TaoToken 统一 Key 通道接入这三个工具最后跑一次「点过、红过」的完整验证动作。2. 先解决通道问题TaoToken 统一 Key 与 API 接入在讲 Webproof 之前得先把 Agent 的模型通道理顺。Claude Code、Cursor、Codex 各自有独立的配置文件和鉴权方式如果你每个工具都单独配一遍 Key切换和排障会非常痛苦。TaoToken 提供的是统一的 API 通道一个 Key 走多个模型配置入口在官网 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 基址是 https://taotoken.net/api 。你需要先拿到 Key入口在控制台的 API Keys 页面https://taotoken.net/console/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi_keysutm_campaignrewrite 。拿到之后不要硬编码进代码统一放到环境变量里三个工具共用同一个值export TAOTOKEN_API_KEYsk-你的key export TAOTOKEN_BASE_URLhttps://taotoken.net/api这样做的价值在于Webproof 的验收流程会反复调用模型生成测试、跑红、点击脚本如果通道不统一你很难判断某次失败是模型问题还是配置问题。统一通道后排障边界就清晰了。3. 可复制配置Claude Code / Cursor / Codex 三件套3.1 Claude Code 的 settings.jsonClaude Code 读取项目级或用户级的 settings.json。把模型通道指向 TaoToken同时把 Webproof 的 Skill 目录挂进去{ env: { ANTHROPIC_BASE_URL: https://taotoken.net/api, ANTHROPIC_API_KEY: sk-你的key }, permissions: { allow: [ Bash(python webproof/scripts/webproof.py:*), Bash(npm run test:*), Bash(npx playwright:*) ] }, skills: { paths: [./webproof/skills] } }注意permissions.allow这一段Webproof 的验收动作需要跑测试和浏览器脚本如果不放行Agent 会在「真点击」这一步被权限拦住然后它很可能直接跳过回到「假装验收过」的老路。3.2 Cursor 的 config.tomlCursor 走的是 OpenAI 兼容风格配置放在~/.cursor/config.toml或项目级.cursor/config.toml[model] provider openai-compatible base_url https://taotoken.net/api api_key sk-你的key model claude-sonnet-4 [agent] skills_dir ./webproof/skills require_proof true [proof] proof_file .webproof/proof.md block_without_browser truerequire_proof true是关键开关它让 Cursor 在宣称完成前必须检查.webproof/proof.md里有没有本轮证据。block_without_browser true对应 Webproof 那条铁律没浏览器就报 blocked不准假装验收过。3.3 Codex 的配置Codex 用环境变量加配置文件组合。先设通道export OPENAI_BASE_URLhttps://taotoken.net/api export OPENAI_API_KEYsk-你的key然后在项目根目录的AGENTS.md里声明 Webproof 纪律Webproof 安装脚本默认就会写这个文件## 完成定义 - 后端必须先看到测试红再写实现 - 前端必须按用户路径真实点击含空状态与错误态 - 布局变更桌面 手机双视口 - 无本轮证明禁止说 done / 修了 / 可以 PR三个工具配完后用同一个 Key 跑一次连通性验证确认通道没问题再进 Webproof 流程。4. 安装 Webproof 并跑一次「点过、红过」4.1 安装与 doctor 自检Webproof 的安装很轻默认只写 Skill 目录和 AGENTS.md不联网、不装系统包、不碰密钥git clone https://github.com/Wanbinyu/webproof.git python webproof/scripts/webproof.py install --harness all python webproof/scripts/webproof.py doctordoctor会识别你的技术栈Next / React / Vue、FastAPI / Django / Express / Go 等并告诉你这一单该走哪些 Skill。典型顺序是shape-the-change→接口变了就contract-before-ui→backend-red-green→ 写 UI →frontend-click-through→done-means-proven。4.2 后端先红backend-red-green假设你要加一个POST /api/orders接口。按 Webproof 纪律先写一个必然失败的消费测试# tests/test_orders.py def test_create_order_rejects_empty_items(client): resp client.post(/api/orders, json{items: []}) assert resp.status_code 422 assert items in resp.json()[detail]现在跑它必须是红的——因为接口还没实现。这一步的意义在于你亲眼看到了失败用例而不是「逻辑上应该会失败」。跑红之后再去写 handler然后重跑看到绿。这个红→绿的过程会被记进.webproof/proof.md。4.3 前端真点击frontend-click-through前端不能只看截图或编译通过。用 Playwright 按用户路径真实点击覆盖空状态和错误态// webproof/click-through.spec.js const { test, expect } require(playwright/test); test(订单页空状态与提交路径, async ({ page }) { await page.goto(http://localhost:3000/orders); await expect(page.getByText(暂无订单)).toBeVisible(); await page.getByRole(button, { name: 新建订单 }).click(); await page.getByRole(button, { name: 提交 }).click(); await expect(page.getByText(请至少添加一件商品)).toBeVisible(); await page.getByRole(button, { name: 添加商品 }).click(); await page.getByRole(button, { name: 提交 }).click(); await expect(page.getByText(订单创建成功)).toBeVisible(); });布局有改动时再加一个移动端视口跑同一套路径。跑通后.webproof/proof.md里会留下本轮点击记录这才是「点过」的证据。5. 本篇常见错排查报错一Agent 说 done 但 proof.md 是空的。说明require_proof没生效检查 Cursor 的 config.toml 是否被项目级配置覆盖或 Claude Code 的 skills 路径是否指对了。报错二真点击步骤被权限拦截。Claude Code 里表现为 Bash 命令被拒回到 settings.json 的permissions.allow补上 playwright 和测试命令。报错三doctor 识别不出技术栈。通常是项目根目录没有标准依赖文件package.json / pyproject.toml / go.mod补上后重跑 doctor。报错四模型通道 401。先确认TAOTOKEN_API_KEY是否导出到当前 shell再确认 base_url 是https://taotoken.net/api而不是带路径的地址。通道问题统一在 API Keys 页面核对https://taotoken.net/console/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi_keysutm_campaignrewrite 。报错五后端测试一直绿。说明你写的是「实现后补的测试」不是先红的测试。删掉实现确认测试变红再重新写。6. 把完成定义落到证据上Webproof 的价值不在于多一个工具而在于它把「完成」从一句主观判断变成了.webproof/proof.md里可复现的记录。你可以在 Claude Code 里用模型对话快速生成测试骨架https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_contentmodelsutm_campaignrewrite 长期跑编码和 Agent 任务的话Coding Plan 更适合持续验收场景https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding_planutm_campaignrewrite 接入细节和参数说明看文档https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 。我自己的习惯是每次 Agent 说完成先不看它的总结直接打开 proof.md 找两样东西——那条先红的测试记录和那次真实点击的路径。找不到就让它回去重跑。这个动作坚持两周后Agent 的「假交付」会明显变少因为它知道你会查证据。