Skip to content

F2|可抄清单与反模式:先抄分层,别抄功能清单 ​

先别从 Pets 和 Voice 开始「做一个 Codex」 ​

A0 说过:这个仓库值得拆的是 harness,不是开源了整个产品。抄的时候最容易拿错层——把 TUI 当智能、把 --yolo 当默认、把 Memories 当 AGENTS.md。

判断先说清楚:先抄协议、turn 循环、Prompt 三块、可恢复 PTY、审批-沙箱-ExecPolicy、可重建的历史。 工具列表、slash 菜单、云端、宠物最后抄。下面是可搬运的设计;后面三条是本仓库自己用帮助文本和闸门骂过的反模式。


1. 可抄:骨架 ​

UI 不实现智能。 Session 拥有 SQ/EQ;EventMsg 按职分流,oneshot 不是 Event(B1)。TUI / exec / IDE 只提交、投影、守 I/O 契约(E1)。library 禁止 println!。审批是 overlay 回 RPC,不是 widget 改 SandboxPolicy。抄:事件总线 + 适配器;不要抄 chatwidget 当内核。

一枪是 Prompt 三块。 历史投影、这一 Step 的 tools、base 指令(B7)。AGENTS.md 在 input 里,不进 base。技能要点名,记忆要开闸。流才重试,窗口满走 compact,工具失败当下一枪的 item。打出去是 turn-scoped 的 Responses 客户端(G1),不是一个 URL。抄:类型化指令栈;不要 system +=。

能力与同意分离。 能力是 permission profile(三档只是内置档案),AskForApproval 管问不问,ExecPolicy 管哪些前缀永远不许(B3)。可以「有写能力但每次都问」,也可以「没能力所以问了也升不上去」。Guardian 是同意链上的评审员,不是第四套 OS 沙箱。抄:独立旋钮;不要一个 safe: bool。

结构化工具优于万能 shell;默认 exec 是 PTY。 Spec / Handler / Runtime / Orchestrator 拆开(B2)。改文件走 apply_patch;跑命令走可恢复 PTY(Interrupt 不杀进程,附录 B)。shell 里的 apply_patch 还要拦截。并行默认关。抄:副作用分类 + 同一条编排流水线;不要一次 sh -c 冒充 Codex exec。

未信任项目不执行项目层配置。 项目 .codex/ 会读但 disabled(B5)。AGENTS.md 不读(C1),hooks 不加载(D4),审批走 UnlessTrusted。信任记在用户 [projects],不在仓库里自己给自己开门。抄:clone ≠ RCE;denylist 挡住 model_provider。

记忆默关、读写分离;宠物不准进工具层。 Memories feature 默认关,use_memories / generate_memories 分开(C2),不替代 AGENTS.md。Pets 只投影四态,不进 ToolRouter(E8)。抄:跨会话笔记是本机 opt-in;装饰层零副作用。

新能力先问 Extension 缝。 Memories / Skills / Goal / imagegen / git-attribution 是 install() 进 ExtensionRegistry 的 contributor(B2),不是 handlers/mod.rs 再加一个文件。Plugin 是用户包装盒(D2)。抄:进程内贡献点和用户安装单元分开;不要每加功能就胀 core。

可观测性是 Event 的投影。 otel 进项目 denylist(B5);analytics/ / otel/ 不当产品层。抄:先有按职分流的 Event,再挂 span;不要让仓库 toml 决定遥测打到哪。

其余按需:fragment+rollout(B4)、JSONL 真相 vs Thread Store 索引(G2)、执行环境可远程但决策留在 Orchestrator(B6)、Skill 渐进披露(D1)、MCP 是 client 且 stdio 启动即执行(D3)、子代理显式 spawn(D5)、并行 Goal 配 worktree(E2)、多前端插座(G3)。这些是骨架上的筋,不是第一周的骨头。


2. 反模式:本仓库已经标明危险的三条 ​

--yolo 当默认。 真名 --dangerously-bypass-approvals-and-sandbox。帮助文本:EXTREMELY DANGEROUS,只给外层已经隔离的环境(B3)。它同时拧成 Never + DangerFullAccess。交互 TUI、仓库 config.toml、团队 dotfiles 拿它当默认,等于拆掉三套旋钮。合法位置:容器、CI 独立 VM。非法位置:开发者笔记本。没有这条纪律会怎样?「我嫌弹窗烦」变成笔记本上的一次误点等于裸跑。

项目 MCP 自动启用。 stdio 在 initialize 就执行(D3)。未信任闸挡住的是项目 config 层;一旦用户或插件把 server 写进 用户 config 且 enabled = true,clone 不需要,开机就会跑别人的 npx。插件 MCP 必须能在 spawn 前 enabled = false(D2)。反模式:仓库 .mcp.json 当「装了就能跑」、市场安装默认拉起全部服务器、把 MCP 当成已被 Seatbelt 罩住。没有「spawn 前能关」会怎样?装插件等于立刻执行包装盒里每一条 npx。

用记忆当政策。 Memories 不进 git、默关、会脱敏但仍是明文(C2)。把 just test -p X、禁区、密钥写进 MEMORY.md:队友 clone 没有政策;你的下一轮 thread 却可能读到密钥形态漏网的内容。政策进 AGENTS.md,硬拦截进 ExecPolicy,个人偏好才进记忆。Chronicle/屏幕文本当指令(C3)是这个反模式的加强版。没有这层切开会怎样?政策随人走、不随仓库走,下一台机器上的 agent 不认得禁区。

顺手再钉三个轻量反模式(F1 拇指规则的倒置):

  • 在 UI 里调模型或自己 Command::new
  • Skill/AGENTS.md 里写「请不要 sudo」代替 forbidden
  • 子代理或 Compact 时 rewrite 历史

3. 明确不要先抄的 ​

第一周不做:Pets、Voice、Computer Use、插件市场、远程 compact v2、多 agent、Guardian v2 评审员 Session、云端 kernel。F3 按 P0–P3 切开。抄产品全家桶会把闭源壳和开源 harness 焊回去——A0 的边界就白读了。


4. 结语:带走一句话 ​

可抄的是「总线和 Event 谱、Prompt 三块、可恢复 PTY、两套旋钮、结构化补丁、未信任默认、记忆默关、Extension 缝」——--yolo 当默认、项目 MCP 自动 spawn、用 MEMORY.md 当 AGENTS.md,是本仓库已经写进帮助文本和闸门里的反模式。