---
title: "Agent 编程最隐蔽的盲区：你出了 loop，谁来替你摸 Tab 键 | 行开心的颠倒世界"
description: "Agent 写的代码逻辑通、测试也过，用户的手却按不对地方：OpenCode 作者让 agent 处理焦点切换，它选了 f 键，而所有人的手指记得 Tab。agent 生成的是 plausible，不是 right；执行可以外包，品味判断不行。"
canonical: "https://xingkaixin.me/posts/stay-in-the-loop/"
language: "zh-CN"
---

# Agent 编程最隐蔽的盲区：你出了 loop，谁来替你摸 Tab 键

Agent 写的代码逻辑通、测试也过，用户的手却按不对地方：OpenCode 作者让 agent 处理焦点切换，它选了 f 键，而所有人的手指记得 Tab。agent 生成的是 plausible，不是 right；执行可以外包，品味判断不行。

2026年6月18日·1,297 字·4 分钟

[AI编程](https://xingkaixin.me/tags/AI%E7%BC%96%E7%A8%8B/)[工程实践](https://xingkaixin.me/tags/%E5%B7%A5%E7%A8%8B%E5%AE%9E%E8%B7%B5/)用户体验[Agentic](https://xingkaixin.me/tags/Agentic/)

![Agent 编程最隐蔽的盲区：你出了 loop，谁来替你摸 Tab 键](https://xingkaixin.me/cover/stay-in-the-loop.webp)

Agent 帮我接管了一个模块的 UI 细节。

我定好需求，写清楚约束，agent 生成代码，我看最终 diff，跑一下测试，感觉没问题就合并。没有逐行 review，也没有亲自打开产品试。我把这理解成”提效”——人把时间留给更高层次的决策，执行的事交给 agent 跑。

效果确实快。快到我开始觉得这就是正确的姿势。

* * *

jlongster 在做 OpenCode 的 diff viewer 时遇到了一个细节问题。文件树和 diff 区域并列，用户按方向键，应该滚动 diff，还是移到文件树的下一个文件？两个区域都在，谁响应键盘是个判断。

他让 agent 处理了焦点逻辑。Agent 给的方案是用 `f` 键切换文件树的 focus 状态——f 代表 focus，语义清楚，没跟别的快捷键冲突。他看了 diff，觉得说得通，合并了。

后来他真的去用这个功能，手自然地按了 Tab。

就是 Tab。Web 和原生 app 几十年来切换 focus 的方式。所有人的手指都记得 Tab，没有人的手指记得 `f`。

他在原文里写：等一下，当然是 Tab！这就是所有 web 和原生 app 的工作方式。

但 agent 没有”当然”。它没有在任何一个真实界面上摸过 Tab 键，它只有从上下文里搜集来的下一个 token。`f` 这个答案，在推理层面是合理的。在使用层面是错的。

![手记得的，文档不会写](https://xingkaixin.me/posts/images/stay-in-the-loop/stay-in-the-loop-01.webp)

* * *

## agent 生成的是 plausible，不是 right

Plausible 是：逻辑说得通，测试能过，代码审查找不出明显问题。Right 是：用户坐在那里的时候，手会自然落在对的地方。

“用户的手会自然落在哪里”这件事，不在任何文档里，不在平台设计规范里，不在 CLAUDE.md 里。它在肌肉记忆里，在你每天打开十几个 app 的经验里。你让 agent 遵循”平台交互惯例”，它能找到写下来的那部分，找不到从来没人写出来的那部分。

这不是 prompt 写得不够细的问题。你可以把需求描述得更详细，但你需要描述的恰恰是那些”这还用说吗”的东西——而那些东西之所以没被写出来，就是因为你觉得不用说。

Plausible 和 right 之间有一条缝。这条缝，就是用户会掉进去的地方。

## “看 diff”和”在 loop 里”是两件事

我之前把这两件事混在一起了。

审 diff 能告诉你代码做了什么，感受不了 Tab 按下去的感觉对不对。这两个信息不是同一种信息。前者是结构层面的，后者是体验层面的。你只看前者，体验层面的判断就空着，然后 agent 的 plausible 就顺势填进去了。

jlongster 说他现在大部分时间活在 OpenCode 里，只在必要时打开编辑器。他不是在盯着 agent 的每一步，是**一直在旁边跑着自己的产品**。Agent 在改代码，他在用这个产品。

这两件事可以同时发生。冲突的不是”用 agent 跑”和”在 loop 里”——冲突的是把”agent 在跑”理解成”我可以不用了”。

## 品味的判断权不能外包

读完 jlongster 那篇，我把 agent 接管的那个模块打开，像新用户一样从头点了一遍。第三步我的手停住了：填完表单，手指习惯性地敲了回车，没反应——确认按钮在弹窗右下角，必须用鼠标去点。测试是过的，逻辑也没问题。这种”说不出哪里不对，但用着就是别扭”，是 review diff 找不出来的。

Agent 给不了你品味判断。倒不是说它傻，是说品味来自于使用，而 agent 不用你的产品。你把品味的判断权交出去，就是把它交给了一个从来不用你产品的东西去填。它填的是它训练数据里最常见的那种，不是最适合你产品的那种。

**你不用微观管理 agent 的每一行代码，但你必须保持使用这个产品的习惯。** 执行可以外包，品味判断不行。

## 越晚发现，越贵

有人会说：问题早晚会暴露，用户反馈，然后改。

改 `f` 键改成 Tab 键，一句话的事。但 agent 用的那个”拧巴的操作流程”，如果已经成了三个功能的交互基础，用户也开始有了肌肉记忆，这时候再改就是破坏。

而且更安静的情况是：用户不会告诉你”这个流程拧巴”。他们只是觉得不顺，然后用少了，然后流失了。你出了 loop，看不见这件事在发生。

jlongster 原文里有一句话值得直接引：你能出 loop，是因为 agent 给你了这个选项。但你的用户没有出 loop，他们每天都在用你做的东西。

![loop 外面看得见 diff，看不见人](https://xingkaixin.me/posts/images/stay-in-the-loop/stay-in-the-loop-02.webp)

* * *

用 agent 提速是真的——但前提是，你还在用你做的产品。不然快是快了，但快的方向是错的，你不知道。

你的用户没有出 loop。你凭什么出去？

## 版权声明

作者

XingKaiXin

标题

Agent 编程最隐蔽的盲区：你出了 loop，谁来替你摸 Tab 键

发布时间

2026年6月18日

文章链接

[https://xingkaixin.me/posts/stay-in-the-loop/](https://xingkaixin.me/posts/stay-in-the-loop/)

本作品采用[CC BY-NC-ND 4.0 DEED](https://creativecommons.org/licenses/by-nc-nd/4.0/deed.zh-hans)许可。

导览

展开导览
