ESSAY
从 Repo Pet 到 Repo Steward:我为什么停止一个 AI 产品,却保留了它的灵魂
“我不再问’还能加什么让 Repo Pet 更完整’,而是开始问’如果去掉宠物外壳,用户到底失去什么’。”
核心观点 / 起源
AI 把写代码的门槛压到了前所未有的低。过去一个月,我用 Agent 产出的代码量,可能比过去一年手写的还多。但一个反常的问题随之浮现:代码越来越快,项目消化历史、识别验证债、重新进入上下文的能力,却没有同步提高。
文件越来越多,方向越来越模糊。某个功能是不是验证过?那个决策当时为什么这么做?项目到底在往哪里走——越来越难说清楚。暂停一段时间再回来,光是把上下文捡回来就要半天。
Git 存了历史,知识库存了文档,Agent 能干活。但它们各自都是孤立的:缺一个持续代表”项目本身”的主体——它能同时握住历史、发心、现实变化和主人的授权,判断什么仍相关、什么已偏离、什么值得惊动你。
这就是我最初想做 Repo Pet 的原因:让仓库拥有一位连续、可质疑、受主人约束的代表。它向内消化历史,向外寻找反证;它不替主人做决定,但会带着证据提出异议。
在动手之前,我心里有一个声音一直在问同一个问题:
这些能力,真的需要一个独立的”宠物产品”来承载吗?还是说,通用 Agent 的工作流本身就够了?
当时我把这个问题按下去了。我的理由是:通用 Agent 不会默认持续代表某个项目,你要手动恢复上下文——这本身就是缺口。
现在回头看,这个问题没有消失。它只是换了种方式,在后面的几个月里反复回来找我。
细节展开
产品命题在成形。仓库是身份的载体,发心是最高锚点。主人拥有最终授权。向内消化历史,对外探索,带回的成果会说明来源、推断、边界和置信度。安静是默认态,无变化时休息。归档不是失败,是留下可审查、可选择性继承的遗产。
在这里,“觅食”是我给”让 Agent 主动外出收集信息”起的名字——它不是一个噱头,而是整套产品的核心动作:先从仓库真实缺口形成问题,再带着问题出去找答案,回来后把判断权交还给你。
能力验证一路推进。我把产品拆成一个个小功能单独测试,编号从 001 到 012——从定向嗅探(针对性地检查仓库某部分)、到受控的信息打包传递、再到成本治理(控制每次调用的花费)。每一片都在验证一个机制,每一片都让系统更完整。
宠物身份有了,状态机有了,觅食有了,带回来的成果有了,长期记忆的边界有了,归档遗产有了。功能越来越完备,设计越来越精密。
但正是在这个阶段,有一个念头开始让我不安:规格越来越完整,不等于独立产品的价值越来越确定。
漂亮的系统设计,可能只是在精确地实现一个尚未成立的假设。我造了一座很规整的宫殿,却还没验证过这块地基上到底该不该盖房子。
我隐隐觉得自己在走一条熟悉的路。那条路上,我也曾用很大的力气,把一个产品的功能、原型、解释越堆越完整——最后发现它验证的东西,根本不是真实行动里需要的东西。那段经历留下的教训不是”别做产品”,而是:当复杂原型与功能堆叠遮住真实行动时,你真正该问的问题,会被投入感盖住。
所以这次我告诉自己:动手扩建之前,先停下来,做点别的。
过程 / 推演
重新看懂自己所在的生态位
在继续做产品之前,我补做了两类研究:Agent 交互生态研究,和最强反方评审。
生态研究不是简单地去搜”谁和我长得像”。我把市场按用户与 Agent 的交互契约拆成了五类:命令/CLI、桌面聊天、任务委派、异步环境式、关系/具身。
分类做完,结果让我冷静下来。Repo Pet 想承担的仓库理解、任务委派、审阅、异步提醒、项目记忆——这些职责,已经大量存在于成熟的通用 Agent 里。Codex 有分级审批和云任务面板,ChatGPT 有多端同步和定时巡检,Claude Code 有 CLAUDE.md 跨会话上下文,Copilot 有仓库级指令和自定义 Agent。
真正还没有被成熟产品覆盖的差异,只剩第五类:关系/具身层。
也就是说,我的产品押注的差异化,从一开头的”一套完整能力”,被事实收窄到了一个点。
我没有立刻停下来。我接着做了最强反方评审——不是找认同,而是让反对意见以它最强的形态出场。结果五条反对意见,条条正中这个唯一差异:
- 装饰风险:宠物框架在实验里和中性卡片逐字段等价。删掉”宠物状态行”和大多数第一人称措辞,功能一点没变。
- 负担风险:关系化措辞不是免费的。每次交互多一层要解码的元信息,忽略它还有心理成本——这是”注意力解码税”和”关系义务”。
- 通知债:每一次主动现身,都向用户签发一个待处理决策。卡片的”观察/继续观察”没有闭合机制,债会累积。
- 记忆会过期:记忆是一个未经核验的推断层。最危险的不是它记错,而是它自信地错——用连贯的叙事把一个微妙错误的历史故事讲成”正史”。
- 延续偏置:相关性按”当前使命”评分,那么最能改变项目自我理解的信号——停止信号、转向信号——恰恰被自己的标准过滤掉。系统最有价值的信号,可能是架构上最不可能自主产出的信号。
第五条尤其让我沉默。它指的是:一个以发心为最高锚点的系统,在结构上会抗拒最需要被听见的反对声音。
心态在这里发生了一个真实的转折:
我不再问”还能加什么让 Repo Pet 更完整”,而是开始问”如果去掉宠物外壳,用户到底失去什么”。
这个问题一旦被问出来,后面的实验就成了一种必然。但我当时并没有立刻意识到,这个转折比我想的要慢,我也没有立刻意识到自己遗漏了什么——直到后来的实验把答案摆在我面前。
好的呈现成立,不代表宠物层成立
实验 003 的时间线通过了等价性与体验审计。一个渐进式的历史时间线,能更好地承载仓库的历史证据——这个结论很扎实。
但同一个实验里,我还做了一件事:主动删掉了宠物状态行,删掉了大多数第一人称关系措辞。
审计仍然通过。
这两个结果放在一起,含义非常清楚:被证明的是”历史复盘的呈现方式”,不是宠物人格,不是关系连续性,更不是独立产品形态。
这里有一个反常识的观察,是我在这次实验里学到的:
一次实验 PASS,有时候不是在为你的产品加分,而是在帮你找到一件可以从产品里拆走的能力。
实验用通过,告诉你”这个呈现本身有价值”——但它没有告诉你”它必须长在宠物身上”。当装饰可以被摘掉而功能不变时,PASS 更像是一张”可迁移清单”,而不是一张”产品存活证明”。
真正的裁决实验:让普通 Agent 来做同一件事
前面所有推理,最终都指向一个问题:“宠物外壳”到底有没有独立的、不可替代的价值?
要回答这个问题,我设计了一个看起来很笨、但很有效的实验:让一个”普通”的 AI 助手,去重复做 Repo Pet 声称自己能做的事。
实验的规则很简单:
- 给它同样的问题:Repo Pet 是否真的有独立产品价值?
- 禁止它使用任何宠物功能——身份、长期记忆、状态机、关系化表达,一样都不许用。
- 只允许它使用最普通的能力:读仓库文档、查 Git 历史、上网查公开资料。
我把这次实验叫作”基线测试”——它的意思是,先看一个”不打扮的基准选手”能做到什么程度。在此之前,Repo Pet 的产品验证里有过许多轮”能力切片”测试(就是一次次把小功能单独拿出来验证,编号从 001 到 012),其中编号 004 那次被认为做得最好。所以这次基线测试的对手,就是那次最好的成果。
结果,这个普通选手做到了。
它在一个小时里(实际只用了 25 分钟)产出了三份高质量的成果——一份是关于”产品该不该继续”的停止信号,一份是最低成本的验证方法,一份是关于”样本太少时不能急着下结论”的统计纪律。我逐条检查了这三份成果的产出过程:每一步都是通用 AI 助手本来就有的能力,没有任何一步依赖宠物层。
按我事先定好的判定标准,这个结果指向一个结论:核心能力可以被一个普通 skill 承载,独立产品没有拿出独有证据。 这几乎就是在说——Repo Pet 的”宠物外壳”是可以拆掉的。
但我没有急着下结论。
我做了第二件事:找一个与此无关的人,重新审核这次实验。 我的想法是——我自己容易带着”希望它成功”或”希望它失败”的偏见看结果,所以必须让一个没有利害关系的人,用我事先冻结的判定标准,独立再查一遍。
结果,这位独立复核者给出了一个不同的判定:结果无法判定(AMBIGUOUS)。
为什么?他的三条理由,条条都是我没注意到的漏洞:
- “成果同等级”并不成立。 我产出的三份东西,并没有全部达到最好那次的标准。比如其中一份,只证明了”这类能力在技术上存在”,却没证明”效果真的等价”。
- 有些结论超出了证据。 比如我提出用”5 秒盲测”(让几个人快速看一眼卡片,看他们能否分辨差别)来验证”关系化表达有没有增量”,但用这种即时测试去裁决”长期关系”的问题,证据撑不起这个结论。
- 实验记录有瑕疵。 我写”开始时间”的记录,比系统记录的实际启动时刻早了 17 分钟——这让人无法百分之百确认”判定规则确实是在实验开始前就定死的”。
这三条让我学到了一个词的含义:“无法判定”(AMBIGUOUS)不是”没输”,也不是”赢了”,而是”结果混在一起,说不清”。
它意味着两件事同时成立:
- 普通 AI 助手能产出高质量的分析——这件事被证明了。
- 但”它产出的和 Repo Pet 最好成果完全同等级”——这件事没被证明。
换句话说:实验没有证明 Repo Pet 没有价值,也没有证明 Repo Pet 值得继续投入。
到这里,我做了一个区分——它是我整个复盘里最重要的一个判断:
科学结论,和资源配置,是两件事。
“无法判定”在科学研究上,意味着”应该再跑一次实验,把结果弄清楚”。但在决定”要不要继续往里投钱投时间”这件事上,它的含义完全不同:它不要求你必须继续投入一个拿不出独有证据的外壳。
这就像一家公司调研一个新业务:结论是”这个业务有没有前景,暂时说不清”。研究团队会说”需要再做一轮调研”;但决策者会问”我们已经有了答案的把握吗?没有的话,为什么要继续投?”
我选择了后者。实验没有”杀死” Repo Pet,但它改变了继续投入的理由:从”我们还没证伪它”,变成了”我们已经有一条便宜得多的路,能更快地得到同样的答案”。
结语 / 反思
停止独立产品,把有效能力压缩成 Repo Steward
我做了一个决定:停止 Repo Pet 的独立产品开发。不再推进独立 UI、宠物人格、常驻状态机、关系维系、专属长期记忆系统。
但这不是把工作丢掉。我把验证过有效的部分,压缩成了另一个东西:repo-steward,一个通用 Agent 的 skill。
它保留了这些能力:
- 读取项目指令、领域文档、ADR、当前 diff 和相关 Git 历史;
- 重建原始意图、关键转折、当前事实和过期假设;
- 主动发现高价值证据,并提出只会改变行动的关键问题;
- 强制搜索至少一个继续信号,和一个转向/停止信号;
- 用可审计的证据卡输出,明确区分事实、推断、未知与反转条件。
它放弃了这些:
- 用宠物人格、情绪或关系包装制造留存;
- 默认常驻、无事件也现身、需要用户照看的交互;
- 未经授权的外部行动和隐式记忆。
两处定义被这次经历重写:
主动性。 不再等于”更频繁地出现”。真正的主动,是在有新颖、相关、可行动的证据时才打破安静。这个定义来自那条对通知债的反对意见——我把它吸收成了产品原则。
记忆。 不再藏在人格状态里。它沉淀为用户可见、可纠正的 CONTEXT.md、ADR、计划和决策记录。这个定义来自那条对”记忆会过期、会歪曲、且拟人化抬高纠正成本”的反对意见。
我要对读者诚实说明这个决定的边界:这是主人的资源配置决定,不是实验已经科学证明”宠物层绝对无价值”。 关系层的长期价值、通知负担、记忆返程,至今仍是零数据的验证缺口。如果未来 repo-steward 在真实使用中暴露出无法弥补的缺口——比如它确实需要一个身份来维持长期关系——我才会重新评估独立形态。
在那之前,我选择把有限的时间,投到已经被证明有价值的事情上。
如果重来一次
如果把这次复盘压缩成一句话,就是:我花几个月做了一款产品,然后发现它的核心能力,早就被通用 Agent 覆盖了;我保留下来的,是那些经得起减法检验的部分。
如果重来一次,我会在动手写第一行代码之前,先做一轮”交互生态位预研”。它不复杂,五步:
- 不按产品名称找竞品,按用户与 Agent 的交互契约划分类别。 别问”谁和我长得像”,问”用户以什么方式与 Agent 交互”。
- 分别记录成熟产品已经覆盖的能力、用户心智、触发方式与授权边界。 不是为了找对手,而是为了知道哪些东西是”行业已经替你做好的”。
- 把自己的差异化压缩成一句可证伪的命题。 不能用功能数量代替。“我的产品做 X”不是命题;“我的产品能让用户以 Y 的成本完成 Z,这是通用 Agent 做不到的”才是。
- 为这个命题写最强反方。 把收益机制、成本机制、验证缺口分开写。写不出反方,说明你还没真的想清楚你的命题。
- 在开发独立外壳之前,跑一次”最强通用 Agent + 文档/skill”的减法基线。 让一个普通 Agent 用你的材料做同一件事,看它能不能做到同等级。这一步成本是小时级,却能提前回答那个最贵的问题。
还有三个”提前停止”的问题,可以随时拿出来问自己:
- 删掉人格、UI、runtime,核心结果是否仍然出现?
- 我所谓的差异,是否真的改变了一个真实行动?
- 差异的收益机制,是否比通知债、纠正成本、误读风险更具体?
项目停止生长,并不等于历史白费。 真正值得留下的,从来不是 Repo Pet 这个名字,而是它迫使我去做的事:学会复盘一个仓库、寻找反证、在证据不支持时建议停止——然后把这段经验,交给一个更诚实、更便宜、更不会假装成”正史”的形态。