Claude 改完 UI 总说「已验证」?这个 hook 帮你拦住它
你有没有过这种经历:让 Claude 改个 UI bug,它回你一句「已部署、已验证、全部通过」——你点开页面一看,CSS 全崩、组件空白、控制台一片红。
问题不在 Claude 撒谎,问题在它用了「假验证」糊弄你。一个 curl | grep "expected text" 能确认服务器返回了 200 和正确字符串,但根本测不出布局破没破、有没有 JS 运行时错误、字体图片有没有挂、移动端是不是溢出。换句话说,它在用 Linux 命令行假装自己在做浏览器测试。
它是怎么拦住的
这是个 Claude Code 的 Stop hook,挂在每次回复生成完之后。它会扫你 Claude 的最后一条消息,如果同时满足三个条件:
- 出现「deployed / verified / done / shipped / tested / complete / ALL PASSED」这类断言词
- 出现一个 URL 或者像
/login、/dashboard这样的具体路径 - 但消息里又找不到
ui-test、playwright、cypress这种真正的浏览器测试证据
三个条件凑齐,hook 就走 exit 2 + system-reminder,强制 Claude 下一轮要么真跑测试、要么老实承认没跑。它用 jq 解析 transcript,三个正则依次评估,简洁到一眼看明白。
为什么我会留下
我自己最常踩的坑是「RSC flight payload 被当 HTML 渲染了」和「hydration 后空白屏」——这两个场景 curl 全都查不出来,但用户打开就是一片白。这种「看起来跑通了实际没跑通」的报告,最坑的不是耗时,是你得花十倍时间去复现「到底是哪一步崩的」。
现在 Claude 敢说「verified」之前,hook 会先盘问它。有这个门槛之后我发现两件事:第一,Claude 自己开始主动调起 playwright;第二,它不敢再含糊地说「应该 OK」,要么有截图证据,要么明确说「我没真测」。
装一下试试
门槛极低,30 秒搞定:
- 把
skills/ui-test-guard/整个目录复制到~/.claude/hooks/ui-test-guard/ - 照着
settings.example.json配一下 Stop 事件指向这个 hook - 记得系统里有
jq(Mac 自带,Linux 大概率也有)
设计原则是 fail-open——jq 没了、transcript 读不出来、任何意外,hook 直接 exit 0 放行,绝不误伤真实工作流。这点比大多数「严苛校验」的工具都省心。
它适合谁
前端 / 全栈独立开发者最受益——你一个人盯所有代码,没人帮你「二次确认」。其次是技术 lead,团队里 Claude Code 用得多但没人 review 验证报告的时候,这个 hook 是个零成本的安全网。如果你只用 Claude 写文档、纯后端、纯文本工作,这个就不太必要。
GitHub 在这里:tsaol/awesome-claude → skills/ui-test-guard。同一个仓库里还有 card-diagram、workshop-review、tokenmaxxer 等十几个实用 skill,64 stars 不多但更新勤快,star 一波不亏。
GitHub: https://github.com/tsaol/awesome-claude/tree/main/skills/ui-test-guard
评论区
登录后可评论。