跳到正文
AI 知识地图 0.18 · 2026-07-30
关于与纠错文字目录 / Search
理解原理

智能体规划:把目标变成可执行、可修订的状态图

从目标、前置条件、产物和完成谓词理解计划—执行分离、滚动规划、检查点与局部重规划。

核心命题 计划的价值不是提前写出最长步骤清单,而是把目标转成带前置条件、可观察产物、完成谓词、风险与回退的状态转移;环境变化后只重算受影响部分,而不是继续执行过期文本。
读完你应该能:把目标写成完成谓词;构造依赖 DAG;区分计划与执行状态;设计局部重规划和评测。
目标/禁止状态 → 依赖图 → 选择就绪节点 → 受限执行 → 观察与验证 → 更新状态 → 推进或局部重规划

1步骤清单为什么还不是计划直觉

给智能体布置任务时,最常见的做法是写下一串自然语言步骤,例如“读代码—修改—测试—提交”。这一串看起来完整:它覆盖了从理解到落地的全部环节,顺序也合理。但拿着它交给智能体,仍然可能在第一步就走错。原因不在步骤太少,而在步骤与执行所依赖的事实之间没有联系。

一份自然语言清单缺四样东西。第一,它没有说明读哪些文件:任务是修改一个 bug,代码库里有几十个文件,“读代码”这一步无法告诉执行者该打开哪个模块,于是执行者只能猜,或者把全部文件扫一遍。第二,它没有说明“修改”依赖哪些事实:改哪一行、保留什么行为、由哪个测试约束这次改动,清单上完全没有记录,执行者改完也无法证明改对了。第三,“测试何时算通过”没有定义:跑一次测试命令和测试通过是两个不同的事件,前者是一次工具调用,后者是需要用断言结果来证明的客观事实。第四,失败后回到哪里没有交代:如果测试失败,是回到“读代码”重新理解,还是回到“修改”换一种改法?清单给不出答案,执行者只能自行决定,而自行决定往往意味着丢失上下文。

更隐蔽的问题是清单把“调用工具”误写成了“目标完成”。写“提交”不等于代码已经进入主分支;写“测试”不等于缺陷已被验证修复。工具调用只是一项动作,动作完成之后世界状态是否真的发生了变化,必须由外部观察来证明——看测试报告、看合并结果、看运行日志。清单抹平了动作与状态之间的界限,于是执行者可以逐项打勾,却从未抵达目标。

可执行计划要做的事,就是把这份清单改造成每一步都能被检查、被证明的状态变化序列。它必须引用当前的世界状态,而不是悬空的动词;必须为每一步写明前置条件(进入这一步时什么必须已经成立)、动作(要执行什么)、产物(这一步结束后世界多了什么可观察的变化)以及机器可检查的完成谓词(用什么条件判断这一步真的完成了),并且为每个状态变化留下可追溯的证据。有了这些字段,“何时真的完成”和“失败后回哪里”才第一次有了确定答案。

这里有三层东西需要分清。目标是智能体想达到的世界状态,例如“缺陷已修复且所有相关测试通过”。计划是对因果关系的假设:它断言“如果依次执行这些动作,世界就会从当前状态转移到目标状态”。这个假设不一定成立,执行与观察的作用就是检验它:每完成一步,观察器确认世界是否真的发生了预期变化;一旦发现偏差,就说明计划的假设错了,需要修改计划,而不是继续按原清单往下走。

因此,可执行计划的输入是五样东西:目标、当前世界状态、约束、可用工具和风险;输出是一张带前置条件、动作、产物、完成谓词与回退路径的状态图。它解决的核心问题是自然语言步骤清单无法回答的两个疑问——“什么时候算真正完成”和“失败后回到哪里”。工具调用在状态图里只是动作字段的一个取值,永远不能替代完成谓词;世界状态必须由外部观察证明,而不是由执行者自述完成。

2规划器、执行器与观察器怎样分工机制

把规划、执行、观察交给同一个智能体,让它一边想一边直接改动所有状态,最大的风险是“想”与“做”混淆:模型在思考中判断某一步已经完成,于是计划里写下了“完成”,这个文字随后被当成世界里的真实完成,后面所有步骤都建立在这个未经证实的假设上。一旦中途有一处虚构,整条链就塌了。因此规划系统把工作拆给三个角色,并让它们各自只产出一种东西:规划器产出计划,执行器产出动作,观察器产出事实。三种产物彼此分离,任何一方都不能替另一方作证。

规划器的输入是目标、约束和当前已知状态。它不执行任何修改,只做一件事:把这些输入展开成一张有限视野的依赖图——每个节点是一个步骤,边表示“必须先完成谁才能开始谁”。视野有限意味着规划器只对短期内可信的部分做精确安排,远处的部分保持为占位,等观察带来新事实后再细化。这样规划器既不会因为信息不足而凭空编造长链,也不会把精力浪费在很快就会失效的远端细节上。

执行器的输入是依赖图和当前状态,它的职责被压到最小:只执行当前就绪的节点。所谓就绪,是指该节点的所有前置节点都已被观察器证实完成。执行器没有权力决定“差不多可以开始了”,也不负责判断结果好坏;它把动作施加到世界上,然后交出结果。这种受限执行保证每一个动作都发生在前提成立之后,而不是发生在规划器的想象之中。

观察器是唯一有权把世界状态写成事实的角色。它读取执行留下的客观痕迹——命令的退出码、文件的差异、测试报告、日志——把这些痕迹翻译成事实状态。退出码为零是一个事实,测试断言全部通过是另一个事实,二者不能互相替代。观察器的输出不经过执行器的转述,也不经过规划器的推断,因此计划中的“完成”无法冒充真实完成:只有观察器记录到的事实才能让一个节点从“已执行”变为“已完成”。

控制器把三者粘合成一条循环。它比较每个节点的预期效果与实际观察:如果观察结果与预期一致,就把事实状态写回,节点标记为完成,接着推进到下一批就绪节点;如果观察结果偏离预期,控制器在四种动作中选择——重试(同一步再做一次)、回退(撤销已发生的变化)、推进(继续后续节点)或局部重规划(只重画受影响的那片依赖图)。整条因果链可以写成:

目标与禁止状态 → 依赖图 → 选择就绪节点 → 受限执行 → 观察与验证 → 更新状态 → 推进或局部重规划。

注意链的起点同时包含目标和禁止状态。规划不仅说明要抵达什么,还要说明不能进入什么:违反约束的中间状态和最终状态一样需要被观察器识别、被控制器拦截。角色分工的输入是目标、约束、依赖图、就绪节点、执行结果和外部观察,输出是推进、重试、回退或局部重规划四者之一。这样,每一个状态变化都有明确的生产者和验证者,链条上没有任何一环可以单方面宣布成功。

3一个步骤应包含哪些字段任务契约

执行器和验收者对“完成”的判据不一致,是一切执行事故的共同根源。执行器认为自己跑完了命令就是完成,验收者却要求世界状态真的改变;执行器说“我已经理解了”,验收者却要看代码与测试。为了让双方对同一个词拥有同一含义,每个步骤都必须写成一份机器可读的任务契约。契约由五个字段构成:前置条件、动作与工具、产物、完成谓词和回退。任何一个字段缺失,都会对应一种典型的失败方式。

以一个缓存隔离修复任务为例。问题症状是跨用户串值:两个用户读到了对方的缓存数据。这个节点的五个字段分别写成——前置条件:已复现跨用户串值,且相关缓存代码已定位;动作与工具:用最小补丁修改 key 的构造逻辑;产物:补丁 diff 和一份隔离回归测试;完成谓词:隔离测试与原命中测试均通过;回退:恢复该补丁并保留失败日志。

逐字段看缺失的代价。没有前置条件,执行者只能凭猜测修改它认为出错的模块,第一步就可能改错文件。没有限定动作范围,执行范围会无限扩大:本来只改 key 构造,顺手重构了缓存层、改了序列化格式,把一次小修变成一场大规模改动。没有产物要求,执行者交付的就只剩聊天记录里的宣称,“我已经改好了”无法被任何人检查。没有完成谓词,执行者会把“跑过测试”当成“测试通过”——测试命令确实执行了,但断言失败的结果被丢在一边。没有回退路径,失败后的选择只有从头再来或者在原补丁上叠加修改,前者浪费全部已完成的事实,后者让错误层层累积。

完成谓词是五个字段里最容易被写错的一个。它必须检查世界状态,而不是检查意图或动作。合法的谓词形态包括:文件哈希与预期一致、测试计数达到阈值、API 返回了约定的结构、批准记录已存在。而“我已经理解”“工具已调用”这类表述永远不是完成谓词——前者检查的是执行者内心,后者检查的是动作是否发生,两者都与世界是否改变无关。在本例中,谓词要求两组测试同时通过:隔离测试证明修复本身有效,原命中测试证明修复没有破坏原有行为。只有“跑过”的谓词会被拒收,因为跑过不携带任何关于结果的断言。

对于高风险节点,契约还要追加两个声明:批准主体和禁止状态。批准主体指明谁有权确认这一节点可以进入下一步,防止执行器自我验收;禁止状态写明这条路径上绝对不能进入的世界状态,例如“修复期间不得清空缓存目录”,让观察器知道该拦截什么。这样,任务契约的输入是前置事实、限定动作、可观察产物、机器完成谓词、回退方案与批准主体,输出是一个执行器与验收者共享的节点定义。执行器按契约执行并在产物字段交出差分与测试,验收者只认完成谓词,双方不再需要就“完成”这个词争论。

字段缓存隔离修复示例缺失风险
前置条件已复现跨用户串值;相关缓存代码已定位凭猜测修改错误模块
动作/工具最小补丁修改 key 构造执行范围无限扩大
产物补丁 diff + 隔离回归测试只有聊天中的宣称
完成谓词隔离测试与原命中测试均通过把“跑过测试”当“测试通过”
回退恢复该补丁并保留失败日志失败后从头开始或叠加修改

4怎样把修复任务画成依赖图运行示例

画依赖图回答的是两个问题:哪些步骤可以并行,哪些步骤必须等待真实证据。以缓存隔离修复为例,任务被拆成五个节点:S0 复现(5 分钟)、S1 定位(8 分钟)、S2 契约(3 分钟)、S3 补丁(6 分钟)、S4 验收(10 分钟)。每个节点上的数字是预计耗时,边上的箭头表示依赖方向。画图的过程就是逐节点追问“进入它之前,哪一步的事实必须已经被观察器证实”。

S0 复现没有依赖,它是整张图的起点。S1 定位依赖 S0:只有先复现了跨用户串值,定位相关缓存代码才有意义。S2 契约同样依赖 S0:契约要写的前置条件、谓词和回退都来自复现得到的现象与事实。因此 S1 和 S2 共享同一个前置节点,在 S0 完成后彼此之间没有任何依赖——它们可以并行。S3 补丁的依赖是 S1 和 S2 两者:代码定位未完成,补丁无从下手;契约未定,补丁交付什么产物、按什么谓词验收都不清楚。S4 验收只依赖 S3:验收的对象就是补丁本身。

依赖图让每对“能否并行”的判断都有了依据:并行只发生在共享前置节点之后、且彼此之间没有边的节点之间;只要存在依赖边,就必须等待,而且等待的不是时间,是真实证据——观察器证实前置节点的完成谓词已经成立。

依赖图还直接给出关键路径。把五个节点串行相加是 5+8+3+6+10=32 分钟。让 S1 与 S2 并行后,两条支路分别是 S0→S1(5+8=13)与 S0→S2(5+3=8),汇合于 S3;S3 必须等两条支路都完成,因此它的最早开始时间取两者中的较大者,13 分钟。于是整条链的最早完成时间是关键路径 S0→S1→S3→S4,即 5+8+6+10=29 分钟。并行节省的只有不在关键路径上的那 3 分钟——S2 比 S1 早完成的那段时间本来就在空等。这个结果说明了依赖图的一条使用边界:并行只能压缩支路等待,不能压缩强依赖链本身;把强依赖任务宣传成“并行后任意加速”是错的,29 分钟就是这张图在当前约束下的下界。

依赖图的输入是 S0 到 S4 的节点定义、依赖边和 5/8/3/6/10 分钟的预计耗时,输出是三样东西:每一时刻的并行就绪集、关键路径、以及最早完成时间 29 分钟。就绪集随时变化——初始只有 S0,S0 完成后变成 {S1, S2},两者都完成后变成 {S3},再变成 {S4}。执行器每轮只从就绪集取节点,这正是上一节“只执行就绪节点”规则的落地。

这张图还决定了失败后重来的范围。假设 S4 验收失败,需要重画局部。失效的只是补丁节点及其下游:S3 的补丁错了,S4 自然作废。但 S0 的复现事实和 S2 的契约调查已经被观察器验证过,它们不在失效范围内,不需要清零重做。依赖图把“哪些事实已经立住”画成结构,失败来临时,重规划只在失效的那片区域发生。

S0 复现缺陷保存失败测试S1 定位 key 构造产物:调用链S2 读缓存契约产物:隔离/命中要求S3 实施最小补丁依赖 S1 + S2S4 验收隔离 + 命中全量回归若命中测试失败:保留 S0–S2,只重规划 S3,不重复已验证调查
图 1 依赖图显示 S1 与 S2 可并行,S3 必须等待两者;验收失败只使补丁节点失效,不应把已验证的复现和契约调查全部清零。
节点预计 5/8/3/6/10 分钟依赖最早完成
S0 复现55
S1 定位8S013
S2 契约3S08
S3 补丁6S1、S219
S4 验收10S329

5为什么采用滚动时域规划不确定性

环境越未知,越不该预先写死二十步细节。理由来自信息本身的不对称:近处步骤的输入状态已经在手,观察器给出了事实,这些步骤可以写得足够具体——精确到文件、命令和谓词;而远处步骤依赖的是尚未发生的工具输出,那些输出此刻还不存在,任何人现在写下的“细节”都只能是猜测。强行写细,模型为了填满清单就会虚构还不存在的文件、接口或结果,产出一份辞藻完整但事实虚假的计划。

滚动时域规划的做法是分两段表达同一张图。近处一段用具体节点展开;远处一段只保留粗目标和预算,例如“完成缓存重构,预计四步、两轮之内”,而不写每一步的动作。执行推进到新的高不确定点之后——某个工具输出了结果、某个验收给出了结论——观察带来了新的确定信息,这时再把下一段展开成具体节点。整个过程与滚动时域控制同构:只对眼前可见的窗口做精确控制,窗口随执行前进而向前滑动,远处的细节永远留到能看见时再生成。

滚动带来的直接收益是过期计划变少。预先写死的长计划在第二个观察到来时可能已经失效,而滚动规划里失效的部分只存在于尚未展开的粗目标中,被替换的代价接近零。同时,滚动把“填满清单”的动机从模型身上移除了:清单本来就不要求远处有细节,虚构就失去了存在的必要。

滚动更新有一条必须遵守的纪律:每次更新只替换受新观察影响的子图,目标和安全不变量原样保留。目标和安全不变量是全图成立的前提,观察只能影响“怎样抵达”,不能影响“抵达哪里”和“绝不能进入哪里”。与之配套的是版本记录:计划每次滚动都形成新版本,版本上记录触发这次更新的证据是什么、哪些节点被作废。有了这条记录,事后可以审计每一次改动是因为哪个观察、动了哪片图,而不是一份被反复涂抹后无人知道来历的文本。

还有一个更隐蔽的风险:新观察可能与旧状态冲突。例如观察器报告“缓存模块已被删除”,而计划里还写着“缓存模块已定位”。此时正确顺序是先标记冲突,再确定权威来源——是观察器读错了环境,还是旧状态本就过时。无论如何,都不能让最后写入的文本静默覆盖已验证的事实;旧事实是被哪个证据确立的,新事实要推翻它,就必须登记出处,让两者的冲突可查。

滚动规划因此可以概括为一个输入输出的循环:输入是近端已知状态、远端不确定依赖、新观察、目标与安全不变量,输出是近处具体节点、远处粗目标和新版本的子图。每到一个高不确定点展开下一段,每次替换都限于受观察影响的子图并记录触发证据与作废节点;新文本可以更新计划,但不能静默覆盖已验证事实。

6失败后怎样局部重规划恢复

测试失败时,最昂贵的反应是“重新制定完整计划”。完整重规划意味着把已经验证过的产物推倒重来:复现事实重新收集、依赖分析重新做、已经写好的契约重新写。这些步骤的事实没有变化,重做它们就是重复劳动,而且每一轮重复都引入新的出错机会。正确的做法是先把失败归入四类之一,每类对应一个明确的更新范围。

第一步永远是比较失败节点的预期效果与实际观察。预期写在节点契约里,观察由观察器给出,两者之间的差异类型决定了接下来做什么。

第一类是执行瞬态错误:动作本身和前提都没问题,只是这次运行的外部条件坏了,例如测试进程超时、临时网络抖动。更新范围是当前节点,处理策略是按幂等策略限次重试——重试有次数上限,动作本身必须是可重复执行的,重试不留下副作用累积。

第二类是前置事实错误:节点失败的原因不是它自己,而是它赖以启动的前置条件不成立。例如修复的前提是“应用使用一级缓存”,实际却使用了二级缓存,那么调用链的定位整个错了。更新范围是事实来源及其全部下游,处理策略是回到产生该事实的最近节点,重新调查,而不是在错误前提上继续修补。

第三类是补丁副作用:前置事实成立,补丁也解决了目标问题,但引入了新的破坏——缓存隔离修好了,命中率却归零。更新范围是补丁节点和验收节点,处理策略是只作废该补丁及其下游,复现、定位、契约这些已验证产物原样保留。

第四类是目标或禁止状态改变:任务本身变了,例如从单租户修复变为跨区域一致性迁移。这是唯一需要扩大重规划范围的情形,因为依赖关系全部要按新目标重新检查。

这四类可以并排看成一张对照表。执行瞬态错误对应当前节点,例子是测试进程超时,限次重试;前置事实错误对应事实来源及其下游,例子是实际使用二级缓存,重新定位调用链;补丁副作用对应补丁和验收节点,例子是隔离修好但命中率归零;目标改变对应重新检查全部依赖,例子是从单租户修复变为跨区域一致性迁移。四类的更新范围依次变大,只有第四类触及全局。

局部重规划要成立,还依赖一项基础设施:已验证产物必须用稳定 id 和版本固定。复现结果、契约、已通过的测试各自持有不可变的标识和版本号,重规划时直接引用它们,而不是让模型重新搜索一遍再生成一份。没有这项固定,重规划本身就会变成新一轮寻找与覆写,模型可能找到一份相似但不同的旧产物,把它当成原来的事实继续使用。版本固定之后,回退一个补丁就是引用回退前的节点版本,而不是手工撤销若干次叠加修改。

局部重规划的输入因此是五样:失败节点、预期与实际差异、稳定检查点、依赖下游和失败类型;输出是四种动作之一——限次幂等重试、回到最近事实来源、作废补丁子图、全面重规划。失败只触发与它类型相称的最小更新,验证过的事实由版本号保护,重复劳动从机制上被排除。

失败类型更新范围例子
执行瞬态错误当前节点测试进程超时,限次重试
前置事实错误事实来源及其下游实际使用二级缓存,重新定位调用链
补丁副作用补丁和验收节点隔离修好但命中率归零
目标改变重新检查全部依赖从单租户修复变为跨区域一致性迁移

7计划什么时候应让位于工作流或搜索边界

不是所有长任务都需要语言模型规划器。规划是有成本的:每多一层规划,就多一层可能出错的推断、多一份需要审计的计划文本。选择什么执行机制,取决于任务本身的三项属性:路径可预知性、动作空间大小、环境动态程度。

当步骤固定、分支已知、失败语义稳定时,确定性工作流是更好的选择。这类任务的所有路径在写代码时就已经确定,失败时的行为也事先定义好了,用工作流执行更便宜、更可测——同一输入必然走同一条路径,回归测试可以覆盖每一支。引入语言模型规划器反而把确定的东西重新变成不确定,白白增加成本和出错面。

当候选动作明确且可以穷举时,思维树或传统搜索更为合适。任务变成在有限的候选集合里挑选和回退,扩展、评估、剪枝都是机械操作,搜索算法的完备性和效率可以直接计算,不依赖模型每一次的即兴判断。规划器在这里没有新增信息,只有新增噪声。

只有当环境路径未知、且工具反馈会改变后续决策时,Agent 规划才真正有价值。缓存修复就是这类任务的典型:调用链的长度和走向要等第一次探索结果才知道,契约该怎么写取决于复现观察到什么,工具每返回一次输出,接下来的决策空间都会变化。这种任务里,规划器的角色是持续地根据新证据重画子图,这正是前几节描述的机制。

三个判据可以压缩成一句话:固定分支用工作流,可穷举候选用搜索,未知环境路径才需要 Agent 规划。

无论选择哪一种机制,有一条边界不可跨越:规划器不能替代工具权限、事务、幂等和人工批准。这四样东西属于执行安全,由外部系统强制,而不是由计划文本声明。文本计划里写“文件已备份”“用户已批准”只是两个字符串,它们可以出现,但没有任何事实效力。控制器必须从文件系统读取备份是否真实存在、从审批服务读取批准是否真实发生、从工具返回码读取动作是否真实执行。模型不能自行宣布高风险前置条件已经成立——自我宣布是写进文本的愿望,而高风险步骤要求的是外部系统里的记录。

因此规划边界的判断可以形式化为一个输入输出对照:输入是路径可预知性、动作空间、环境动态、工具反馈和风险权限,输出是固定工作流、传统搜索、思维树或 Agent 规划四者之一。选择机制之后,权限、事务、幂等与批准仍然由外部系统统一强制,与选哪种机制无关;文本中的“已备份”或“已批准”在任何机制下都不构成事实。

8怎样评估计划而不奖励漂亮文本评测

最终成功是最容易被操纵的指标:一个冗长而低效的计划同样可能成功,因为成功只说明目标到达了,不说明路途如何。评估计划必须同时回答两个问题:它到底有没有缺陷,以及它是否比更简单的方案创造更多价值。方法是对同一任务平行记录三种轨迹——直接行动、固定工作流和规划器——然后比较一组指标。

这组指标包含八个维度。最终成功:任务是否抵达目标,这是及格线而不是全部。计划可执行率:计划里多少步骤真的被执行了,若大量节点在途中被作废或跳过,说明计划与现实的偏差大。前置条件错误:多少步骤在前提未满足时被启动,直接暴露依赖图的缺失。无效或重复步骤:多少步骤没有推进状态、或者重复做了已做过的事。重规划次数:计划被推翻了几次,越多说明初始计划越不可信。从失败点到恢复点的距离:失败后要退回多远才能重新前进,距离越短说明依赖图切得越细、局部恢复越有效。关键路径延迟:与理论关键路径相比实际晚了多少,超出部分来自等待、返工或错误的串行化。总成本:完成同一任务实际消耗的工具调用与时间。

这八个指标里,成本和成功率的组合最能暴露“漂亮而无用”的计划。若规划器把 8 个工具调用变成 20 个,而成功率与直接行动相同,它就没有创造价值——多出的 12 次调用全是开销,没有任何收益与之对应。反过来,若规划器在故障场景下成功率更高、恢复距离更短,多出的调用才获得了正当性。评估因此永远是比较式的:规划器的价值只存在于与更简单基线的差值里。

除了执行后的轨迹比较,还有两类执行前的静态检查。第一类针对计划文本本身:引用的工具是否真实存在;依赖图是否有环——有环意味着图中存在永远无法就绪的节点集合;每个节点是否都有产物和完成谓词——没有谓词的节点无法被验收,等于把完成与否重新交给猜测;并行节点是否竞争同一资源——两个同时修改同一文件的节点会互相破坏,必须被串行化或加锁。第二类针对恢复能力,用故障注入验证:人为制造一次工具失败、一次前置条件破坏,观察计划是否按预期限次重试、是否只回退到最近事实来源。漂亮的文本在故障注入面前没有藏身之处,真正有效的局部恢复必须能被重复触发和重复验证。

于是计划评测的输入是同一任务上的三条轨迹:直接行动、固定工作流和规划器轨迹;输出是最终成功、可执行率、前置错误、重复步骤、重规划次数、恢复距离、关键路径延迟和成本这八项指标。先做静态检查——工具存在、依赖图无环、节点有产物有谓词、并行节点不争抢同一资源——再做故障注入验证局部恢复。一条写得很长的漂亮计划,如果只是把调用翻倍而成功不变,它的漂亮不构成任何价值。

9把因果链连起来综合

把前面各节的内容首尾相接,就得到一条从问题到可验证实践的完整因果链。起点是一个具体问题:自然语言的步骤清单无法回答“何时真正完成”和“失败后回哪里”,因为工具调用被误写成了目标完成,世界状态无人证明。终点是一套可以被执行、被审计、被故障注入验证的规划机制。中间每一步都建立在前一步的产物之上。

第一步,定义目标与禁止状态。规划从写清楚两个状态集合开始:要抵达什么,绝不能进入什么。目标是验收的最终谓词,禁止状态是观察器全程要拦截的红线。没有这一步,后面的所有判断都没有参照物。

第二步,标注前置条件和产物。每个步骤从一段叙述变成一个节点契约:进入它需要哪些已证实的事实,离开它留下哪些可观察的产物。这一步把“完成”的含义从执行者内心转移到世界状态上。

第三步,构造依赖图与关键路径。节点之间的边说明哪些事实必须先成立,哪些步骤因此可以并行、哪些必须等待真实证据。关键路径给出最早完成时间,同时划定了失败时哪些已验证产物可以保留。

第四步,只执行当前就绪节点。执行器每轮只从就绪集取节点——所有前置节点都已被观察器证实完成的节点。这一约束保证每个动作都发生在前提成立之后,而不是发生在规划器的想象之中。

第五步,用真实观察更新状态。退出码、文件差异、测试结果、审批记录被观察器翻译成事实,控制器比较预期与实际,决定推进、重试、回退或重规划。计划文本里的“完成”至此不再有任何效力,只有观察记录能推动链条前进。

第六步,从稳定检查点局部重规划。失败按类型归入最小更新范围:瞬态错误限次重试,前置事实错误回到最近来源,补丁副作用只作废补丁及下游,目标改变才扩大重规划。已验证产物以稳定 id 和版本固定,重复劳动被排除。

六个步骤各自回答了链条上的一个疑问,而链条整体回答的是最初那个:怎样把目标变成可执行、可修订的状态图。可执行,因为每个节点都有前置条件、产物和完成谓词;可修订,因为观察驱动的滚动更新只替换受影响的子图、从稳定检查点局部恢复。规划的产出从一段漂亮文本变成一台状态机器——每一步都有明确的生产者、验证者和回退路径,任何一环都不能单方面宣布成功。

资料来源与改编说明
访问日期:2026-07-22