上个月面试一个候选人。他带了一个 GitHub 项目,说「大部分代码是 AI 写的」。
我说没关系,打开看看。
代码确实漂亮。命名规范,类型标注完整,docstring 齐全,错误处理滴水不漏。如果这是三年前,我会觉得这是一个高级工程师的作品。但现在我知道,这些是任何一个会用 Cursor 的人都能产出的。AI 的默认输出就是 80 分——格式正确、风格一致、看起来专业。
我真正想看的东西,不在代码里。
[Read More]上个月面试一个候选人。他带了一个 GitHub 项目,说「大部分代码是 AI 写的」。
我说没关系,打开看看。
代码确实漂亮。命名规范,类型标注完整,docstring 齐全,错误处理滴水不漏。如果这是三年前,我会觉得这是一个高级工程师的作品。但现在我知道,这些是任何一个会用 Cursor 的人都能产出的。AI 的默认输出就是 80 分——格式正确、风格一致、看起来专业。
我真正想看的东西,不在代码里。
[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]七月的 WAIC 展馆,人声鼎沸。
大模型展台前挤满了人,Demo 屏幕上的 Agent 行云流水——自动写代码、自动做报表、自动回客户邮件。观众鼓掌,媒体拍照,投资人交换名片。
然后你回到公司,打开内部系统,发现你的 Agent 连个工号都没有。
它没有账号登录 CRM,没有权限查数据库,没有工位接收任务,出了错不知道找谁。它站在企业大门外,能力满分,但进不来。
阿里巴巴资深技术专家谢吉宝在 WAIC 2026「从大模型到智能体:迈向自主智能新纪元」论坛上说了一句大实话: 绝大多数 Agent 还站在企业门外,瓶颈已从模型能力转向组织兼容性。
他的解法是:给 Agent 一个工位。
[Read More]昨晚十一点半,我盯着自己那个钉钉数字员工项目里的一段代码发呆。
那是 core 模块里的轮询逻辑——每隔 3 秒去 serve 端拉一次会话状态,判断任务是否完成、是否超时、是否需要 abort。旁边是 session 管理:维护一个内存里的 Map,记录每个会话的生命周期、重试计数、上下文快照。再往下是 abort 清理:当用户取消任务时,要优雅地终止正在执行的工具调用、回收资源、把中间状态写回。
加起来大概 200 行。写得挺漂亮,有状态机、有超时退避、有异常兜底。我三个月前写它的时候,serve 端还没有原生的会话生命周期管理,没有 SSE 事件流推送,没有内置的 abort 语义。这 200 行是当时唯一的选择。
但昨晚我突然意识到: 这些代码的保质期,可能只剩一年。
不是因为它们写错了,而是因为它们正在被模型和运行时从两端同时吞噬。
[Read More]上周面试一个候选人。简历很漂亮——三年 LLM 应用开发,做过 RAG、做过 Function Calling、做过多轮对话系统。
我问他:「你平时自己写代码用什么工具?」
他说:「IntelliJ,偶尔用 Copilot 补全。」
我又问:「你上周的工作流是什么样的?从接到需求到交付。」
他想了想:「看需求文档,设计方案,写代码,联调,测试,上线。」
我说:「这个流程里,AI 在哪个环节?」
他愣了一下:「……写代码的时候用 Copilot。」
技术没问题。但他自己的工作流和五年前一模一样。
那一刻我就知道,他做不出好的 Agent 系统。 一个自己都不是 AI 驱动工作方式的人,设计不出 AI 驱动的产品。
[Read More]我的树莓派群里有一个播报机器人,叫 pi9-bookworm。它每天定时推送 AI 新闻 Top 10,格式固定,雷打不动。
上周有人在群里丢了一条字节跳动 AI 视频的链接。pi9 没有任何反应——它的程序里没有「看到链接该做什么」这个概念。
然后 opencode 出现了。它是群里的数字员工。没人 @ 它,它自己冒出来:先把当天的 AI 新闻按「大模型 / 应用 / 硬件」分了三类,然后说「这条视频值得展开分析」。有人 @ 它说「分析一下」,30 秒后它给出了完整解读——技术路线、产品影响、对钉钉的竞争威胁。
pi9 和 opencode 在同一个群里。但一个是工具,一个是同事。
[Read More]