昨天一个同事在群里甩了一个 HTML 文件。打开一看,漂亮极了——渐变色的表头、响应式布局、数据可视化图表、三段式结论。AI 生成的,三秒钟的事。
群里安静了十分钟。
然后有人问了一句:「所以……结论是什么?」
又过了五分钟,发文件的人回了一句:「我也没细看,AI 生成的,大家自己看吧。」
这十分钟的沉默,就是 AI 时代最贵的成本。
[Read More]昨天一个同事在群里甩了一个 HTML 文件。打开一看,漂亮极了——渐变色的表头、响应式布局、数据可视化图表、三段式结论。AI 生成的,三秒钟的事。
群里安静了十分钟。
然后有人问了一句:「所以……结论是什么?」
又过了五分钟,发文件的人回了一句:「我也没细看,AI 生成的,大家自己看吧。」
这十分钟的沉默,就是 AI 时代最贵的成本。
[Read More]人的放纵是本能,自律才是修行。短时间让你快乐的东西,一定能够让你感到痛苦;反之,那些让你痛苦的东西,最终都能让你功成名就。低级的欲望,放纵即可获得;高级的欲望,只有克制才能达到。
——一段常被归于罗素的话
上周一个工程师跟我说:「我让 AI 写了一个模块,它给我吐了四万行代码。我看了两天,删了三万行。」
我问他:删的时候什么感受?
他说:「心疼。每一行看起来都有道理。但我知道如果留着,这个模块就死了。」
同一天晚上,我女儿问我一道数学题。她卡在第二步。我张嘴就要说「你试试把等式两边同时除以——」,话到嘴边咽回去了。我说:「你再看看题目里哪个条件你还没用上。」她想了四十秒,自己做了出来。
两件事。一个是删代码,一个是忍住不说。本质一样: 你有能力做,你选择不做。
[Read More]给 AI Agent 排定时任务,正在变成一件新的麻烦事。
最早我们写 cron,后来写脚本,再后来各种 Agent 框架自带调度器。结果是:定时配置散落在 crontab、launchd、代码常量、框架配置文件里,改一个执行时间要翻好几个地方;想知道「现在到底有哪些任务在跑、几点跑、跑完发到哪」,没有任何一个地方能一眼看全。
任务本身其实很简单——「每天下午一点,去小红书搜几个关键词,各出一份报告」。难的不是执行,而是管理:谁来记、谁来改、谁来排查。
[Read More]上个月面试一个候选人。他带了一个 GitHub 项目,说「大部分代码是 AI 写的」。
我说没关系,打开看看。
代码确实漂亮。命名规范,类型标注完整,docstring 齐全,错误处理滴水不漏。如果这是三年前,我会觉得这是一个高级工程师的作品。但现在我知道,这些是任何一个会用 Cursor 的人都能产出的。AI 的默认输出就是 80 分——格式正确、风格一致、看起来专业。
我真正想看的东西,不在代码里。
[Read More]上个月我们团队换了一次 agent loop。从 Claude Code 切到 OpenCode。
切换本身很轻——prompt 改改,工作流调调,两天上手。但切完第三天,周一早上打开 dashboard,CI 全绿。我松了口气。然后随手点开一条 PR 的 review 记录——空的。再点开一条——还是空的。
不是代码质量出了问题。是 pipeline 里有一条规则:检测注释里的 // Generated by Claude Code 标记,命中就触发额外的 AI 代码 review 流程。OpenCode 不打这个标记。于是这条规则永远不触发,review 流程形同虚设。CI 是绿的,但绿得没有意义。
一条规则,把整个团队锁死在一个工具上。不是因为我们选定了 Claude Code,是因为我们的基础设施离不开它。
我在 代码是 AI 写的了,品味住在哪里 里说,品味从代码搬到了 harness——CI pipeline、release 节奏、事故响应。但那篇文章没有回答一个紧接着的问题: harness 本身,应该跟 agent loop 是什么关系?
答案是:好的 harness 不挑笔。
[Read More]上周帮一个朋友调他的 AI Agent。需求很简单:自动登录一个美国政府网站,填三张表,提交。
他选了 VNC 路线——Agent 通过远程桌面连上一台真实 Mac,操作真实的 Chrome 浏览器。逻辑很对:真实浏览器没有 navigator.webdriver 标记,没有 CDP 连接痕迹,TLS 指纹是真的,Canvas 指纹是真的。从浏览器的视角看,就是一个正常用户坐在键盘前。
他很有信心。然后 Agent 在第二步就被拦住了。
不是被防火墙拦的,不是被反爬拦的。是 Cloudflare Turnstile 弹了一个无感验证,Agent 的鼠标 瞬移 到了按钮上, 零毫秒 完成点击。没有移动轨迹,没有加速度变化,没有人类手指的微颤。
一个人类不可能这样操作。而 Cloudflare 知道。
[Read More]凌晨两点,我的 Agent 又停了。
不是模型挂了,不是网络断了,不是 Token 用完了。是 Browser MCP 的 WebSocket 连接断了,而那个该死的 Chrome 扩展弹窗里,「Connect」按钮正安静地等着有人去点一下。
我在跑 --watch 模式——Agent 监控一个内部系统,页面一变就自动抓取数据、做分析、写报告。整条链路全自动,唯独 Browser MCP 的连接需要手动点。每次断连,我就得从床上爬起来,点开 Chrome 工具栏那个小图标,点一下 Connect。
在 Agent 操作浏览器的九条路线 里,我把 Browser MCP 归到「真实浏览器 + 扩展 + CDP + MCP」那一类,给了它四颗星的企业推荐度。但那篇文章没写的是: 它有一个致命的手动断点,而这个断点在自动化场景下足以毁掉整条链路。
这篇文章记录我怎么用 Vision 大模型 + macOS 原生自动化,把这个断点彻底消灭。不是 Demo,是从 v1.0 迭代到 v1.4.2、踩了六个坑之后的生产方案。
值得一提的是:整个项目的所有代码——从第一行 screencapture 调用到最后的 LaunchAgent plist——都是 Opus 4.8 写的。我做的事情是描述需求、测试、报错、再描述。这个过程本身就是一个有趣的发现:当你把「我需要一个能自动点击 Chrome 扩展按钮的脚本」这种模糊需求扔给一个足够强的模型,它给出的第一版方案往往方向正确但细节全错——而每一处「错」的背后,都藏着一个 macOS 平台特有的坑。
一个人类员工一天审批 20 单、发 50 封邮件、访问 10 个系统。如果权限有漏洞,损害上限是 20 单。
一个 Agent 一秒调 100 次 API。一分钟 6000 次,十分钟 60000 次。如果权限有漏洞,你甚至来不及发现,损害就已经是 **指数级 **的。
这不是量变,是质变。传统权限模型(RBAC / ABAC)有一个隐含假设: 操作者是人,操作速度是人的速度。 这个假设在 Agent 时代彻底失效了。
再加上三个新问题:委托链(人委托 Agent A,A 调用 Agent B,B 访问系统 C)、上下文依赖(同一个 Agent 在不同群里有不同权限)、可被操纵(Agent 可能被 prompt injection 劫持)——传统权限模型不是「需要升级」,而是 需要重新设计。
[Read More]晚上 10 点,纽约的产品经理在 Linear 上建了一个竞品分析的 ticket,在群里 @ 了东京的工程师,又发了一封邮件给伦敦的设计师。三个渠道,三种状态,没有一个地方能看到全貌。
第二天早上,产品经理问:「进度怎么样了?」东京说:「刚看到群消息,还没开始。」伦敦说:「邮件?我昨天没在线。」Linear 上的 ticket 状态还是 To Do——因为没人记得去更新它。
这个场景每天都在全球化团队里上演。我们用了二十年时间解决「人怎么跨时区协作」——异步文档、录屏、standup 录音、follow-the-sun 排班。但本质上,所有方案都在做同一件事: 让不在场的人也能跟上进度。
如果有一种同事,它没有时区、不需要睡觉、7×24 在线、能在你下班后继续推进工作呢?
这种同事已经存在了。它叫 Agent。但我们的协同办公产品——通讯录、IM、邮件——还没有为它做好准备。
[Read More]上个月一个团队来找我,说他们要做企业内部的 AI Agent,需要操作浏览器。
第一个问题就是:「用 Playwright 还是 Browser Use?」
我说这个问题本身就问错了。就像你问「盖楼用钢筋还是混凝土」——答案是都用,但用在不同的层。
Browser Automation 在 AI Agent 语境下,已经不是一道单选题。它是一张技术地图,九个梯队,各有适用场景。而真正在生产环境里跑通的企业 Agent,几乎都是 分层架构——API 优先,结构化浏览器控制居中,Vision 兜底。
[Read More]