2026 年 3 月 1 日,一个系统交付了。它通过了全部验收标准。从需求确认到部署上线,两个人类工程师与十一个自主编码 Agent 协作了九天——同等规模的系统在传统方法论下需要十一周。
交付会议上没有人问:「这个系统是怎么工作的?」
不是因为答案不重要。是因为这个问题在新的工作流中已经不再自然。你不会问烤箱「你是怎么把面包烤熟的」。你检查面包是否熟了。
面包熟了。系统能跑。
这篇文章关心的不是面包。是烤箱深处那些正在缓慢氧化的、你看不见的加热元件。它们会在某个你不在场的早晨烧穿。届时,没有人能解释为什么——因为从一开始就没有人理解它们是如何工作的。
幕一:T0——沉积
九天。十一个 Agent。一个能跑的系统。
交付日的代码库像一块刚刚沉积的河床。表层是新鲜的淤泥,每一层对应一次 Agent 会话的产物:最上面是修复边界条件的那次会话,再下面是重构数据库查询的那次,再下面是认证模块、路由层、基础设施配置——一层压一层,九天的时间压成了几十条地层。
它们是化石——在你看见它们的那一刻就已经是了。
化石不是贬义词。化石是曾经活着的东西留下的矿物痕迹。那些活着的东西——Agent 的推理链、它权衡的替代方案、它放弃的路径、它对你含糊 prompt 的特定解读——在会话窗口关闭的那一秒就开始分解了。留下的只有代码:结构完整、语法正确、测试通过的矿物遗骸。
交付日,有人做了一件在 2024 年还很正常、在 2026 年已经渐渐不再发生的事:她试图阅读代码。
她读了大约四十分钟,然后停下来。不是因为代码写得差——Agent 生成的代码通常在局部层面上可读性极好,变量命名合理,函数边界清晰。她停下来是因为她意识到一件事:
她能理解每一行在做什么,但无法理解为什么这些行以这种方式组合在一起。
局部清晰,全局不透明。每一块化石都可以被辨认——这是一片叶脉的印记,那是一段骨骼的轮廓。但这些化石属于什么物种、彼此之间是什么生态关系、这片地层记录的是什么样的古环境——这些信息不在化石中。它在产生化石的生命过程中,而那个过程已经结束了。
亨利·柏格森在一百多年前区分了两种时间。钟表时间(temps)是空间化的、同质的、可分割的——冲刺看板上的天数,部署流水线的分钟数,SLA 承诺的毫秒数。绵延(durée)是异质的、不可分割的、只能被经历而不能被测量的——一个心智与一段复杂性真正相遇时所展开的、不可压缩的理解过程。
在手写代码的时代,这两种时间被焊接在一起。你不可能在钟表时间中交付,而不同时在绵延中栖居——因为写下每一行代码的行为本身迫使你穿越系统的逻辑,以你自己的认知速度。空间性的技艺(结构、语法、局部因果)自动附带了时间性的投资(理解)。你不需要刻意去理解——写作本身就是理解。
当然,古典时代也有它自己的化石地层。十五年的巨石系统、三十个离职工程师的遗产、没有人能完整理解的百万行代码库——「屎山」从来不是 Vibe Coding 的发明。Vibe Coding 的不同,不在于它创造了断层,而在于它把断层的形成从「多年偶发」压缩成了「短期常态」——九天之内,沉积出传统团队需要数年才能堆积的不透明性。
但压缩只是表象。更根本的变化是:Vibe Coding 切断了钟表时间与绵延之间的焊接点。
你可以在九天的钟表时间内交付,而你在这个系统的绵延中停留的时间为零。Agent 占据了空间——它们写下代码、构建结构。你只占据了钟表时间——你等待它们完成,你验收输出。
系统作为空间性的存在是完整的:它有结构,它能运行。
系统作为时间性的存在是空洞的:没有人类心智曾经穿越过它的逻辑。
这个空洞在交付日不可见。面包是熟的。没有人检查加热元件。
第一层沉积完成。河水继续流。
幕间:一个需要被命名的东西
在进入下一幕之前,我们需要为一种特定的负债找到名字。
技术债务是一个空间概念。代码库中存在结构性缺陷——重复、耦合、命名混乱——它们占据着可辨识的空间,等待被修复。你可以指着它说:这里。你可以估算修复的工时。技术债务令人不快,但它是可见的。
认知债务是一个个体概念。某个工程师对某个模块缺乏理解——一处知识的空洞,可以通过学习来填补。它驻留在特定的头脑中,原则上可以被偿还。
两者都不精确地描述 Vibe Coding 所创造的那种东西。
那种东西不占据空间(代码是干净的)。不驻留在个体中(它不是某个人的知识空洞——没有任何人曾经拥有过这份知识)。它存在于时间中:它是系统的因果历史与任何人类心智之间不断拉大的距离。
我将它命名为溯因债(Retroductive Debt)。这里的「溯因」指从结果倒推意图与决策链的能力——不是追问「这段代码做了什么」(空间性的阅读即可回答),而是追问「这段代码为何以这种方式存在」(只有回溯因果历史才能回答)。
溯因债:当一个系统的实现被交付,但产生该实现的因果链——从人类意图到 Agent 推理到代码决策的完整路径——未以可回溯的形式保存时,所欠下的、以时间为单位计量的债务。
它与技术债务的区别:技术债务是你看见了问题但推迟修复。溯因债是你看不见问题——因为看见问题所需的信息已经不存在,或已被淹没在不可处理的噪音中。
它与认知债务的区别:认知债务可以通过个体学习偿还。溯因债无法通过学习偿还——因为需要被学习的东西(Agent 的推理过程、prompt 的特定语境、被拒绝的替代路径)要么已从世界中消失,要么以数百万 token 的原始轨迹存在,其信噪比低到没有人类心智能够处理。你不能学习一样已经蒸散的东西——但你也不能学习一片意义已经坍塌的洪水。
三条判定标准
一、因果可达性。 从系统当前的任一行为出发,能否在有限步骤内抵达产生该行为的人类意图?如果链条中存在不可恢复的断裂——Agent 的决策轨迹已被丢弃、prompt 会话已过期、决策上下文未被记录——则该行为承载正的溯因债。断裂越多、越深,债务越大。
二、证据半衰期。 支撑因果链的制品——prompt 日志、Agent 决策轨迹、变更说明、被拒绝方案的记录——其可检索存续时间是多少?如果这些制品在三个月后不可检索(存储过期、平台迁移后格式失效、供应商更换导致 trace 断档),则溯因债以证据半衰期的倒数速率增长。半衰期越短,债务积累越快。
三、移交可完成性。 一个无先验上下文的维护者,能否在声明的时间预算内、仅依靠现存制品重建系统的意图史?如果不能——如果理解这个系统所需的时间已超出任何合理的人力预算——则溯因债已超过偿还能力。系统不是「有债」,它是破产。
第三持存
贝尔纳·斯蒂格勒将人类记忆区分为三种持存。初级持存:当下的感知——你此刻正在读的这个句子。次级持存:个人回忆——你昨天读的那段代码在脑中留下的痕迹。第三持存:技术性的外部记忆——文字、录音、日志、文档——它使知识得以超越个体记忆的生物限度而存续。
代码本身就是一种第三持存。在手写代码的时代,它同时也是初级持存和次级持存的沉淀物——你写下这行代码时的感知经验和你对「为什么这样写」的记忆,都以某种方式编码在代码的结构中。读你代码的人可以部分地逆向重建你的意图——因为代码是你的思维过程的化石,而化石保留了生命的形态。
Agent 生成的代码是一种孤儿制品——它与任何人的初级持存或次级持存都没有对应关系。没有人感知过写下这段代码时的推理过程(那是 Agent 的前向传播,不是人类经验)。没有人拥有关于「这段代码为何如此」的个人记忆。代码作为第三持存存在,但它是一份没有证人的记录——一块没有任何活着的记忆与之关联的化石。
在默认工作流里,Agent 通常不是持存者——它默认没有可被组织依赖的次级持存。不是说 Agent 在技术上不能拥有持久化记忆(checkpoint、外部日志、会话回放都是已知的能力),而是说当前的工作流没有将 Agent 的推理制度化为可回溯的第三持存。能力存在,制度缺席。而在制度缺席的地方,能力等于零。
溯因债的本质,用斯蒂格勒的语言说,就是第三持存与初级/次级持存之间的系统性断裂。当这个断裂覆盖了整个系统——当没有任何活着的人对系统的任何部分拥有初级或次级持存——系统就成了一座没有活着的记忆的遗址。
一座等待被发掘的地层。
幕二:T+6m——断层
九月的第三个星期二,凌晨两点十七分,告警触发。
不是宕机。更棘手:系统的输出在特定条件下开始偏移——一种微妙的、非崩溃性的行为漂移。用户看到的是「数据偶尔不太对」——同一用户在高并发下偶发看到上一次请求的缓存影子;幂等键在某个分支被静默重写,导致重试变成重复扣费。工程师看到的是一个他们无法在本地复现的幽灵。
事后复盘是一场非自愿的考古发掘。
团队开始向下挖掘代码库的地层。最上面几层——最近六周的变更——还算新鲜,prompt 日志尚可检索,能被理解。再往下,三个月前的一层:Agent 在那次会话中重新组织了数据流管道的处理顺序。为什么?prompt 记录显示当时的指令是「优化查询性能」。Agent 选择了一种特定的实现策略。但为什么选这种而非另一种?Agent 的决策轨迹没有被保存。那次会话的上下文窗口早已关闭并被回收。
再往下。四个月前的地层。一个函数被引入,它做了一件微妙的事:在特定条件下静默地修改了一个共享状态。这是一个 bug 还是一个有意的设计?代码中没有注释(Agent 不写解释性注释——从它的角度看,代码结构就是解释)。变更记录只说「修复了边界情况」。什么边界情况?对应的工单已被归档系统自动清理。
这里出现了一条地质断层。
在地质学中,断层是地层的不连续面——两侧的岩层无法对齐,因为中间发生了位移。时间的记录在断面处断裂了。你能看见断层两侧的地层,但你无法复原断裂发生时的力学过程。
团队在代码库中发现了至少三条这样的断层。三处「为什么这样做」的因果链已不可恢复。不是因为信息被故意删除——而是因为它从未被创建为持久的制品。Agent 的推理过程不是被遗忘的——它从来没有被记住过。它不是次级持存的衰退。它从未进入过任何形式的持存。
但更可怕的版本也同时出现了。其中一条断层附近,决策轨迹并未蒸散——它被完整保存为数十万 token 的 trace,包含 Agent 无数次检索、试错、反转与旁路的完整记录。证据在场,但信噪比已经坍塌——维护者面对的不是遗忘,而是无法阅读的记忆洪水。一个工程师花了六小时试图从中提取有用信息,最终放弃。
溯因债有两种面孔:证据的蒸散,与证据的淹没。两者同样致命。
柏格森会指出一个残酷的对称:团队在这六个月的钟表时间里,本可以积累对系统的绵延——通过阅读、运行、修改、跟踪来逐渐建立与系统逻辑的直觉性亲密。但他们没有。不是因为懒惰——而是因为系统一直在正常运行,而正常运行的系统不邀请你进入它的绵延。你只在它出故障时才被迫进入——而此时你面对的不是一个你可以逐步理解的活体,而是一座你必须发掘的化石遗址。
他们花了四天定位问题。在手写代码的时代,类似复杂度的问题通常在数小时内被定位——不是因为旧代码更好,而是因为至少有一个人曾经穿越过那段代码的绵延。理解是预先支付的。
在 Vibe Coding 的时代,理解是事后追索的。而事后追索的成本远高于预先支付——因为你现在是在挖掘化石,而不是在调取活着的记忆。
溯因债的第一笔利息到期了。
幕三:T+6y——发掘
2032 年。
原始团队的两个人类工程师一个已经离职两年,一个在另一个产品线上。系统仍在运行——经历了数百次 Agent 驱动的迭代,每一次沉积新的地层。地层的总厚度早已超出任何一个人的可发掘能力。
一个新团队被指派来评估系统。它需要被迁移到新的基础设施——或者,如果迁移不可行,被重写。
他们面对的是一座深层遗址。
最上层的沉积——最近一年的变更——尚有一定可读性。越往下越困难。不仅因为代码在变旧,更因为每一层的产生环境都已不存在了:2027 年的 Agent 使用的推理模式与 2026 年的不同;2029 年的模型版本引入了当时流行但后来被废弃的代码范式;2031 年的一次「全局重构」在地层记录中留下了一条巨大的不整合面——不整合面上方和下方的地层在逻辑上无法对齐,中间的决策过程像被侵蚀掉的岩层一样缺失。
新团队用三周时间完成了初步评估。他们的报告中有一段话值得逐字引用:
系统的若干行为只能通过假设来解释。没有任何现存的制品——代码、日志、文档、prompt 记录——能确证这些行为是有意设计还是偶然产生。它们是功能还是 bug?架构决策还是历史事故?我们无法判断。不是因为我们能力不足——而是因为做出判断所需的信息已经不存在于任何可访问的介质中。
系统在 T0 的真实是:它能跑。
系统在 T+6m 的真实是:它在以我们无法解释的方式跑。
系统在 T+6y 的真实是:我们无法判断它是否应该以这种方式跑,因为判断所需的证据已不存在。
三个时刻,同一个系统,三种无法互相还原的「真实」。
柏格森说,钟表时间的诱惑在于它看起来是可逆的——你可以沿时间轴往回移动,就像在空间中回头走。但绵延是严格不可逆的:你不能「回到」一段你从未经历过的理解。新团队不能通过投入足够多的钟表时间来追溯购买他们从未积累过的绵延。绵延不可追溯购买。这是溯因债区别于一切空间性债务的根本特征——空间性债务可以在任何时候偿还(你可以在明天重构今天的烂代码),时间性债务只能在发生的时刻偿还,一旦错过,偿还窗口永久关闭。
斯蒂格勒说,第三持存的意义在于使知识超越个体生命的限度。但前提是第三持存被创建了。一个从未被外化为技术记忆的推理过程,在推理者离场后就永久消散。而一个被完整保存但无法被人类心智处理的推理过程,同样不构成有效的第三持存——它是格式正确但语义不可达的死信。
当推理者不持存,记忆者不外化,证人不在场——系统就成了一座地层完整但化石不可解读的遗址。不是因为遗址被破坏了,而是因为生成这些地层的古生态从未被记录,或记录已碎裂为噪音。
溯因债在六年的钟表时间中静默地复利增长。到清算日,本金已不可计量。
编程的时间性转向
三幕看完,论题可以被完整地陈述了。
传统编程是一种空间技艺。你阅读代码,像阅读建筑图纸——结构、层级、依赖关系、数据流向。理解是空间性的操作:你在代码的结构中定位自己,你「看见」系统的工作方式。这种理解是共时性的——它不要求你知道代码是怎么写出来的,只要求你理解它此刻是什么。一个优秀的手写代码库可以被一个从未见过它的工程师在合理时间内「读懂」——因为理解所需的一切信息都在代码的空间结构中。
Vibe Coded 系统打破了这个前提。
它的代码是几十次、几百次 Agent 会话的沉积物。其空间结构不反映任何单一的设计意图,而是叠加了多个 Agent、多个模型版本、多个 prompt 语境的历史决策。当前代码的形态不能自我解释——它是一个果,而因已经消散或淹没。理解它不能通过「看」它的当前结构(空间操作),只能通过「回溯」它的形成历史(时间操作)。
你不再是在读建筑图纸。你是在做地层学研究——通过沉积序列、化石组合和断层位置来推断一段你从未亲历的地质史。
核心论题: Vibe Coding 让编程从空间性的工艺(结构 / 语法 / 局部因果——通过阅读当前状态来理解系统)转向时间性的责任(回放 / 证据 / 可复现 / 可交接——通过回溯因果历史来理解系统)。
当理解的操作从空间转向时间,工程伦理的重心随之转移。
空间性的工程伦理问的是:「这个结构是否合理?」 答案可以在当下被检验。
时间性的工程伦理问的是:「未来的维护者是否有能力理解这个系统?」 答案只能在未来被揭示——届时你不在场,而她在。
这不是更高的标准。这是不同种类的标准。它要求你为一个你无法在场的时刻承担责任。你今天选择保存或不保存的制品,将决定 2032 年的某个凌晨、某个你永远不会认识的工程师是在五小时内定位问题,还是在五周内绝望地对着一座不可解读的遗址挖掘。
《维护契约》
以下八条不是最佳实践。它们是在 Agentic Coding 时代,为了不将溯因债转嫁给未来,团队必须维护的时间性基础设施的最低宪章。
第一条 因果清单(Causal Manifest)。 每一次 Agent 会话的产出物在合入代码库时,必须附带因果清单:人类意图的自然语言表述、Agent 被给予的关键约束、Agent 选择的实现方案、至少一个被考虑但未被选择的替代方案。因果清单是一等制品,其存续期不得短于它所描述的代码。缺失因果清单的变更不得合入主干。
第二条 决策轨迹的持久化。 Agent 的决策轨迹(关键分支、工具调用序列、约束与权衡摘要、不确定性标记、被拒绝方案的简述)必须以结构化格式持久保存。Prompt 会话不是聊天记录,它是第三持存。其存储标准等同于源代码,而非等同于运行日志。
第三条 考古学家(Archaeologist Agent)。 系统必须配备可在故障时复现回放的考古学家 Agent:它读取决策轨迹、工具调用与版本历史,自动产出人类可读的因果摘要与替代方案对照。契约不是约束人类去逐行阅读数百万 token 的原始 trace——而是约束系统以机器可审计的格式生成证据,再由专职 Agent 将证据转译为人类可判断的叙事。否则,保存再多原始轨迹也只是不可读的地层。
但需要被看见的是:考古学家 Agent 本身也是一个 Agent,它的摘要同样是没有证人的制品。工具在这里触到了自身的边界——用 Agent 偿还 Agent 欠下的溯因债,链条不会在工具层面闭合。它只能在某一层上被人以判断力终止。
第四条 不整合面标注。 当一次变更创造了与先前地层不连续的结构(重构、架构迁移、大规模重写),该变更必须被显式标注为不整合面,并附带说明:旧地层的哪些假设在新地层中不再成立。未标注的不整合面是未记录的断层——它将在未来的发掘中制造不可解释的跳变。
第五条 可逆性声明。 每一次变更必须声明其可逆性等级:完全可逆、部分可逆(可回滚但有数据损失)、不可逆。不可逆变更在合入前须通过额外审查——审查的不是代码质量,而是:如果这是错的,我们是否仍有能力撤回。不可逆变更在因果链断裂时将造成无法回退的永久损伤——它不仅欠下溯因债,还封死了偿还的最后窗口。
第六条 移交演练。 每季度进行一次移交演练:一名未参与该系统的工程师,在不超过三个工作日的预算内,仅依靠现存制品(含考古学家 Agent 的摘要输出)尝试理解一个核心模块。若失败,功能开发暂停,直至溯因债降至可移交水平。
第七条 溯因预算(Retroductive Budget)。 每个系统在部署时必须声明:一个新维护者理解该系统应当花费的最大时间。此预算作为工程指标持续追踪。当实际理解时间超出预算 200%,系统进入溯因债红区,触发强制偿还流程。
第八条 证据不可蒸散原则。 未来维护者对系统的完整因果历史拥有访问权。任何使因果历史不可访问的操作——删除 prompt 日志、清除决策轨迹、在格式迁移中丢弃元数据——等同于对未来维护者时间的征用,必须被审批为显式决策而非例行清理。
存储可以压缩。证据不得蒸散。
尾声
你可以把上面八条当作过度审慎的官僚主义。在一个以交付速度论英雄的行业里,谁会花时间为每个 Agent 会话写因果清单?
这八条契约注定会被嫌弃、被绕过、被视为老派的摩擦力。因为在一个生成代码成本趋近于零的时代,没有人愿意为「理解」支付高昂的溢价——直到代价以一种摧毁性的方式降临。
但你也可以把它当作一封信。
收信人是六年后的一个人。她在凌晨两点被告警叫醒,面对一座她从未见过的系统,试图判断一个她没有足够信息来判断的问题。她不认识你。她不知道你在 2026 年三月的那九天里做了什么选择、放弃了什么替代方案、对 Agent 的哪些输出感到过犹豫。
她手里唯一的东西,是你留下的地层。
那些地层是完整的还是断裂的、清晰的还是模糊的、可被解读的还是已经碎裂为不可恢复的矿物噪声——这不取决于你用了多好的模型,不取决于你的 Agent 多么强大。
它取决于你是否认为她的时间值得被保护。
你欠她的不是更好的代码。
你欠她的是可以被回溯的时间。
而时间,一旦没有被记录,就是永久地失去了。
不是遗忘。是不可逆的消散。
地层合上。河水继续流。下一层沉积已经开始了。