<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Spec-Driven-Development on Armstrong Yan</title><link>https://yanqian.github.io/zh/tags/spec-driven-development/</link><description>Recent content in Spec-Driven-Development on Armstrong Yan</description><generator>Hugo</generator><language>zh-CN</language><lastBuildDate>Mon, 20 Jul 2026 23:33:28 +0800</lastBuildDate><atom:link href="https://yanqian.github.io/zh/tags/spec-driven-development/index.xml" rel="self" type="application/rss+xml"/><item><title>远程智能体工作流（四）：在仓库中，而非聊天中</title><link>https://yanqian.github.io/zh/posts/publish/in-the-repository-not-in-the-chat/</link><pubDate>Mon, 20 Jul 2026 23:33:28 +0800</pubDate><guid>https://yanqian.github.io/zh/posts/publish/in-the-repository-not-in-the-chat/</guid><description>&lt;p&gt;这是“远程智能体工作流”系列的第四篇。&lt;/p&gt;
&lt;p&gt;我的远程 AI 开发环境，第一层解决连接问题。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;手机 -&amp;gt; Tailscale -&amp;gt; SSH -&amp;gt; Mac -&amp;gt; tmux -&amp;gt; Codex
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;有了这条链路，我可以用手机访问 Mac，也能让耗时较长的本地任务持续运行。&lt;/p&gt;
&lt;p&gt;第二层解决控制问题。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;手机 -&amp;gt; Telegram Bot -&amp;gt; 本地 Codex 运行时 -&amp;gt; 选定的仓库
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这样一来，手机就成了控制入口，而不再是一台屏幕很小的终端。&lt;/p&gt;
&lt;p&gt;但这两层都没有触及更深的问题。&lt;/p&gt;
&lt;p&gt;远程访问让我能连上机器。&lt;/p&gt;
&lt;p&gt;远程控制让我能启动任务、查看进展。&lt;/p&gt;
&lt;p&gt;而长时间运行的智能体开发还需要记忆。&lt;/p&gt;
&lt;p&gt;智能体可能在我离开后继续运行，也可能从中断处恢复、换一个会话接着做，或者由我通过手机操控。既然如此，整个项目就不能只存在于一条聊天线程里。&lt;/p&gt;
&lt;p&gt;于是，我给自己定了一条规则：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;聊天用来传达指令。&lt;br&gt;
仓库用来保存记忆。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;更准确地说，仓库不只是存放代码的地方。它还承载着智能体的记忆和操作约定，并为智能体提供持续的反馈机制。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://yanqian.github.io/posts/publish/in-the-repository-not-in-the-chat/assets/in-the-repository-not-in-the-chat/01-repository-agent-harness.svg" alt="作为 Agent Harness 的仓库"&gt;&lt;/p&gt;
&lt;h2 id="为什么聊天记录不能充当项目状态"&gt;
 为什么聊天记录不能充当项目状态
 &lt;a class="heading-link" href="#%e4%b8%ba%e4%bb%80%e4%b9%88%e8%81%8a%e5%a4%a9%e8%ae%b0%e5%bd%95%e4%b8%8d%e8%83%bd%e5%85%85%e5%bd%93%e9%a1%b9%e7%9b%ae%e7%8a%b6%e6%80%81"&gt;
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="链接到标题"&gt;&lt;/i&gt;
 &lt;span class="sr-only"&gt;链接到标题&lt;/span&gt;
 &lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;聊天很适合表达意图。&lt;/p&gt;
&lt;p&gt;我可以在聊天里说明目标、提出问题、纠正方向，或者做出产品决策。&lt;/p&gt;
&lt;p&gt;但要长期保存项目状态，聊天并不可靠。&lt;/p&gt;
&lt;p&gt;聊天内容难以比较差异，也不便验证；它依附于某一条线程，后续会话中的智能体很容易误解，甚至根本看不到。想法、日志、猜测、决定和已经过时的背景信息，往往全都混在同一条信息流里。&lt;/p&gt;
&lt;p&gt;如果只是一次性的小改动，这样做未尝不可。&lt;/p&gt;
&lt;p&gt;可一旦智能体需要长时间工作，问题就会暴露出来。&lt;/p&gt;
&lt;p&gt;项目必须能稳定回答以下问题：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;这个系统应该做什么？&lt;/li&gt;
&lt;li&gt;哪些内容已经实现？&lt;/li&gt;
&lt;li&gt;以前在哪里失败过？&lt;/li&gt;
&lt;li&gt;什么证据能证明这些行为现在仍然正常？&lt;/li&gt;
&lt;li&gt;下一个智能体在修改文件之前，应该先读什么？&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这些答案应该和代码放在一起。&lt;/p&gt;
&lt;h2 id="让仓库同时承担记忆与-agent-harness"&gt;
 让仓库同时承担记忆与 Agent Harness
 &lt;a class="heading-link" href="#%e8%ae%a9%e4%bb%93%e5%ba%93%e5%90%8c%e6%97%b6%e6%89%bf%e6%8b%85%e8%ae%b0%e5%bf%86%e4%b8%8e-agent-harness"&gt;
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="链接到标题"&gt;&lt;/i&gt;
 &lt;span class="sr-only"&gt;链接到标题&lt;/span&gt;
 &lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;在我的项目里，智能体需要长期保留的状态通常分散在以下文件和记录中：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;AGENTS.md&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;SPEC.md&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;feature_list.json&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;progress.md&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;test_plan.md&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;init.sh&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;orchestrator.py&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;git 历史&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;文件具体叫什么并不重要，重要的是分清职责。&lt;/p&gt;</description></item></channel></rss>