恢复、自修复与运行边界¶
上一章说明一轮怎样留下可接受的结果。本章把时间拉长:会话更换、代码更新、权限撤销、外部请求超时以后,哪些工作可以沿用,哪些判断必须重做,什么时候应改路或停止。
恢复不是加载一段旧思维,而是重建当前行动条件。历史 transcript 可以按 Host 的规则保存并用于理解背景;它不是当前授权、有效验收或外部状态的替代品。恢复历史事实与批准下一次行动,始终是两个问题。
同一任务:响应丢失之后恢复哪一项¶
这是一个合成情境:T1 的某项受控操作已经提交,回执 R1 已持久化,但调用者没有收到响应。调用失败不能证明效果没发生。
sequenceDiagram
participant C as 调用者
participant O as 命令 owner
participant P as 选定 provider
C->>O: 提交原 operation
O->>P: 受控提交
P->>P: 保存结果与 R1
Note over C,P: 提交响应丢失
C->>O: 保持原 identity 恢复
O->>P: 读取原 receipt
alt 有效历史结果
P-->>O: 返回 R1
O-->>C: 恢复历史结果,不重复提交
else 仍无法确认
P-->>O: unavailable / unknown
O-->>C: 保留未知与恢复责任
end
图的第一条分支有“R1 确实存在且有效”的前提。只有错误输出而没有 provider 读回时,不能猜自己位于哪条分支。已确认 absent 后是否可以执行,仍取决于当前恢复合同、身份和授权,不是从缺失记录直接得到许可。
R1 恢复后,继续读取 T3 的当前条件。C1 的提交成功不能验收 C2;T1 的结算也不能替代 G1 对发布的决定。
历史恢复还是新的执行?¶
“保留原 identity”和“取得新的执行 key”看似矛盾,是因为它们回答不同问题。
| 情况 | 现在要确认的事实 | 身份处理 | 下一步与停止条件 |
|---|---|---|---|
| 原操作响应丢失,结果尚未确认 | 同一次操作到底发生了什么 | 保留原 operation / effect identity 与参数 | 由原 owner 读回,不申请新 key 掩盖未知 |
| 原操作确已提交,回执缺失 | 历史结果如何完整返回 | 按原操作恢复或重放回执 | 核对返回结果,不重新制造同一副作用 |
| 原执行已合法释放或结束,要开始新工作 | 当前工作、owner 和输入是否允许新执行 | 历史不删,新执行按准入取得新证明 | 条件不满足就拒绝,不能拿旧 receipt 复活权限 |
| 验证以后输入或要求改变 | 旧证据还适用于哪一部分 | 保留历史证据,绑定新输入重新验证 | 只更新受影响判断,不假造全局版本 |
租约回归测试给出具体例子:renew 后原 acquire 的读回保留 original receipt,却返回当前 lease;release 后复用退役 acquire key 被拒。历史说明与当前执行证明是两种材料,不能互相顶替。
恢复请求也不是允许修改原意图的窗口。某个接口要求重放原参数时,不能顺手换 receiver、Todo、TTL 或版本;要先确认原操作,再通过新的合法生命周期动作表达新意图。各接口的 request digest 和重放规则以当前合同为准。
不同版本分别防止什么错误?¶
| 标识或版本 | 回答的问题 | 不能替代 |
|---|---|---|
| artifact / commit revision | 哪一份产物被验证或投递? | provider 的提交版本、执行权限 |
| provider revision | 对应存储快照是否仍可提交? | 产物版本、lease epoch |
| lease version | 此次 lease 生命周期请求基于哪个当前记录? | 其他 Todo 或其他 provider 的版本 |
| lease epoch / execution key | 哪次执行持有当前证明,旧实例是否已退役? | 外部系统实际效果的读回 |
| Turn / operation identity | 哪次行动、写回或结算被关联与恢复? | 新一轮工作的准入 |
| evidence 时间与来源 | 观察来自哪里,是否仍适用? | 单靠“刚读过”保证对象和 scope 正确 |
当前系统没有一个整数可以同时代表这些维度。两次读取也未必来自同一原子快照。记录各自 basis 和来源;字段缺失时报告缺失,而不是自己补一个 version=0。相关 source、聚合与写入边界见状态章节和状态机专题。
C1 变成 C2 后,哪些东西失效?¶
C1 的检查仍是可信的历史事实,但不再自动证明 C2。首先确认实际变化:代码、验证声明、依赖、批准范围或运行环境中的哪一项变了?
只改文档排版,未必需要重复所有领域实验;改变输出 schema,则必须重新检查依赖它的代码、示例、验收与批准。这个影响判断应有 diff、当前要求和验证计划支持,不能凭“改动很小”跳过。
G1 是否仍覆盖 C2,取决于原决定绑定的对象和条件;不是所有决定都必然失效,也不能把一个历史 approved 永久沿用。通过原规划和决定入口修正适用关系,重新验证受影响的工作,再由当前准入选择下一步。
四种延续动作,修复四类问题¶
Continuation:目标和路线仍有效,开始下一段合法工作。即使 Host 能恢复旧 session,也重读当前 guard,不沿用旧 selected Todo。
Retry / reconcile:原意图仍成立,但需要确认或完成原操作。只对具有已核对幂等和恢复边界的操作重试;外部结果未知时,优先 reconcile / readback。unknown 不是失败的另一种拼写。
Replan:工作含义需要改变,例如新证据推翻方案、验收改变、工作候选耗尽但目标未满足。它应产生当前协议接受的 Todo、Vision、successor、acceptance 关系变化或有据的终止结果,不是再写一遍计划。
Self-Repair:目标工作可能仍然正确,但来源、投影、路由或回执链存在缺口。先定位 owner,再修具体缺口;不能把删 Gate、降低 validator 或清空历史当成修复。
Dreaming 产生候选方向或假设,不直接获得执行权。只有被当前规划/决定路径接受并通过相应 lifecycle 写入后,它才影响真实工作。Capability 与 Provider 的领域结果也通过各自合同进入控制面,不反过来拥有通用权限。
Material Evidence Delta:有活动不等于有进展¶
设想一个教学案例:一天里不断改笔记、补无关测试、重排目录,却没有降低目标的任何验收缺口。每项产物可能真实存在,但这不足以说明整体收敛;这也不是声称当前规则会无条件允许无限次同类工作。
Material Evidence Delta 关注新增的、能改变下一步判断的证据或状态,而不是只数 Turn、文件或字符。负面结果也可能有价值:排除一个假设、确认一个真实 blocker、缩小未知范围,都能改变后续路线。
Delivery Batch Scale 描述改动范围;Delivery Outcome 描述成果与目标的关系。multi_surface 或 implementation 不自动意味着完成 Goal。surface_only、outcome_gap、outcome_progress、primary_goal_outcome 要按对应合同解释;执行者选择一个好看的标签不能替代证据。
Vision checkpoint 与 baseline¶
Vision 是 per-Agent 的执行路线,不是随手笔记。适用的 material refresh 需要说明路线被 patch、保持不变的依据、retired/superseded 的关系,或该角色为何不需要 Vision。
“保持不变”需要可比较的 baseline。没有 baseline 时先建立当前路线;不能把从未检查过写成没有变化。出现 vision_checkpoint_missing 等 gap 时,回到负责的 checkpoint 入口,补实际关系,而不是增加愿景 prose。不同 replan/repair 的优先级仍由当前 owner 决定,不把这段教学说明变成所有 Host 的全局规则表。
六条收敛不变量¶
这六个问题用于检查完整性,不新增公共字段或一条自动通过算法:
- 方向:当前工作如何关联 Goal / Acceptance 与适用的 Vision?
- 权限:正确主体是否在正确对象和 scope 上具有当前资格?能力存在不等于得到授权。
- 证据:观察、验证与决定是否绑定正确输入和来源,仍满足新鲜度要求?
- Delta:新增了什么可重读事实,或确认了哪项合法等待?
- 活性:未完成目标还有工作、可执行观察、决定、修复或明确停止责任吗?
- 终局:后继、等待、回执与验收缺口是否按适用合同全部处理,而不是只看列表为空?
安全避免错误推进,活性避免在缺少下一入口时永久卡住;二者都不保证任意目标必然成功。更多案例见长程收敛专题和证据与修复课程。
两个页面不一致时,先修哪一个?¶
发现差异
→ 核对同一 Goal、来源、模式、时间与截断范围
→ 找负责该事实的 source
→ 区分未提交、source 错误、投影滞后、读取失败与迁移差异
→ 由相应 owner 修复
→ 读回并重新判断依赖该结果的工作
Legacy Markdown 可能仍是源;已选 canonical provider 的 Todo 不能从旧 Markdown 兜底。若源已提交但显示旧,修投影;若源本身错误,通过原 lifecycle 修正;若读取不可用,保留未知。让几个页面手工显示相同内容,不等于恢复了正确状态。
refresh-state 是受控写回,不是所有故障的通用查询。纯查看入口与 mutation 分开,参见现场查阅。Workspace 操作回执与页面状态的具体比较见暂停案例。
停止、闭环与补偿¶
Goal 被 owner 停止、quota 暂停或 Host 退出,不能反证目标已完成。terminal_no_followup 需要对应 frontier/acceptance 的终局条件;可见 Todo 数量为零不充分,因为列表可能截断,或还存在 Monitor、Gate、successor、handoff、replan 和结果交付责任。
若当前要求确实满足,按已有终局入口留下依据;若仍需工作,保留后继;若结果未知,保留观察或 blocker。被验证的负向结果和有覆盖依据的 no-follow-up 可以诚实结束一条路径,不需要伪造成功。
已经生效的错误操作需要补偿,不是删除历史。Rollback packet 协议帮助表达影响对象、来源、恢复选择、批准与验证,但 packet 不是执行许可。Revert、fix-forward、外部清理和支持请求有不同前提;回滚安装也不必然逆转状态格式或远端效果。
补偿完成后重新检查真实后置条件,并明确哪些结果仍需接受者确认。内部记录收口、收件人收到产物和整体验收是分开的,参见第一份交付。
恢复的代价与公开边界¶
恢复依赖可读的原记录、可用的 provider 读回与当前权限。缺少它们时可能需要人工或外部支持,不能靠换身份推断问题消失。反复修投影的成本也应成为工程问题,而不是把“系统能自修复”当成持续故障的理由。
证据采集消耗时间与资源,应与风险匹配;检查太少会漏掉变化,过度重复又可能吞噬交付。正文讨论的是如何保存最小充分证据,不要求把每段思考永久记录下来。
私有 registry、active state、lease、session handle、凭据和 raw transcript 不进入公开例子。Handoff 传递必要的 bounded refs、freshness 和合法获取入口,不复制全部私有材料。项目的 .loopx/、.loopx/goals/、.local/ 需要按实际用途建立 Git 边界;忽略规则不是凭据扫描或已提交历史检查的替代品。
读完后应能给一次中断归类、指出要保留的原身份、要重新观察的条件、负责恢复的入口及其停止条件。无法确认结果时,可以明确交还恢复责任;不应只说“再跑一次看看”。
只有同时满足下列条件,一次 writeback 才可以把 vision 标记为 unchanged:
- 存在可比较的 baseline(上一轮已写入的 vision);
- 本轮 delivery 确实没有改变任何 vision 前提;
- 写回时用
--vision-unchanged-reason给出“不变”理由;LoopX 会自动把已有 vision 绑定为 baseline, 不需要另外传入 revision。
如果 baseline 缺失但 agent 仍声称 unchanged,quota 会产生 vision_checkpoint_missing gap。这不是
为了惩罚,而是为了防止 agent 在 never-checked 状态上积累错误假设。完整失败回放见
Control-Plane Course 第 8 讲。
Terminal Closure¶
Todo 全部 done 只说明当前列表结束,不自动证明 Goal 完成。Terminal audit 至少检查:
open todos = 0
due monitors = 0
unresolved blocking gates = 0
pending successors = 0
replan obligations = 0
acceptance gaps = 0
retryable postconditions = 0
required external readbacks are fresh
如果 acceptance 已满足且没有 follow-up,记录结构化 no-follow-up;如果仍有工作,创建 successor; 如果外部结果尚未确定,保持 monitor 或 blocker。不要为了让 Goal “看起来完成”而删除未闭合状态。
四种运行责任¶
长期 Agent 系统容易把所有组件都称为“工具”或“插件”。LoopX 使用四种运行责任:
| 责任 | 合同 |
|---|---|
| Agent / Executor | 在 Host 中规划并执行一个被允许的 bounded action |
| Provider | 调用外部系统,返回 observation、effect result 或 readback |
| Capability | 定义 caller outcome,规范 Provider 输出,应用 domain policy |
| LoopX Kernel | 接受或拒绝 proposal,拥有通用 Goal/Todo/Gate/Quota/Recovery state |
正常流向不是“Agent 调工具后直接写完成”:
Agent -> Capability -> Provider -> external system
Provider readback -> Capability validation/proposal -> LoopX transition
Capability 描述调用者可依赖的 outcome contract;Provider 实现或访问外部系统;Kernel 保持跨领域 生命周期。Issue-Fix、Explore 等领域结果可以拥有自己的 Domain State,但不能反向拥有通用 quota、 Gate 或 permission。
Extension 是交付与生命周期边界¶
Extension拥有独立的:
- packaging;
- installation;
- enable / disable;
- upgrade / rollback;
- compatibility;
- provider ownership。
它不是第五种运行责任,也不自动获得 domain authority:
Extension package
└── delivers Provider
└── participates in Agent -> Capability -> Provider -> Kernel flow
对于零权限、确定性的 standalone Extension,LoopX 可以通过 managed runtime 调用 bounded request/response command。一旦操作需要 read、write、send、publish 或 manage authority,就必须 进入能检查 permission、decision scope 与 domain policy 的 Capability 或领域命令。
“安装成功”“doctor ready”和“有权执行某次 effect”是三个不同状态。
谁拥有事实¶
LoopX canonical state¶
LoopX 拥有工作生命周期事实:
- Goal、Todo、Gate;
- claim、lease、dependency 与 successor;
- quota、monitor、scheduler hint;
- accepted evidence pointer 与 receipt;
- event lineage、Vision checkpoint 和 projection inputs。
外部系统¶
外部系统继续拥有自己的事实:
- Git 拥有 commit 与 branch;
- GitHub 拥有 PR、Issue 与 check 当前状态;
- CI 拥有 job 结果;
- cloud service 拥有资源实际状态;
- Host 拥有 session 与真实唤醒效果。
LoopX 可以保存 bounded observation、readback 和 evidence pointer,但不能让一份过期复制品替代 外部权威。
Host 与 Agent¶
Host 拥有 session、模型 Turn、工具表面和实际唤醒机制。Agent 拥有当前推理与临时计划。两者都 不能成为项目 Goal state 的唯一持有者。
Host 应服从 current interaction_contract 与 scheduler_hint,不能把项目专属控制逻辑永久复制
进 heartbeat prompt。Agent 也不能因为“上一轮做过类似动作”而推断本轮仍有 authority。
Public 与 Private Boundary¶
项目状态常包含不能公开提交的内容:
- 本地 registry 与 active goal state;
- task lease、Host session handle;
- raw transcript、trajectory 与 verifier tail;
- credentials 与 provider private config;
- 本机路径、内部链接和私有组织叙事;
- 未脱敏的外部 evidence。
项目接入章要求将以下目录排除在 Git 外:
忽略规则只是第一层保护。公开提交前仍要扫描 credentials、absolute paths、raw logs、private links 和 runtime artifacts。需要长期公开保存的结论应先压缩成 public-safe behavior、schema、fixture 或 evidence pointer。
Handoff 也不能把 private material 复制到另一个公开 packet。它只传 stable ids、bounded refs、 freshness、omission note 与重新获取材料所需的合法路由。
LoopX 不替代什么¶
LoopX 不替代:
- Agent runtime:模型仍负责推理;
- Host scheduler:Host 仍负责实际唤醒;
- Git:代码历史和 branch 仍由 Git 管理;
- CI:测试执行和 check 状态仍由 CI 管理;
- 外部服务认证:TurnEnvelope 和 receipt 都不是 security token;
- domain system:LoopX 不伪造外部资源事实;
- independent validator:Executor 自述不能单独证明 completion。
这个边界会支撑后续两条实践主线:
- 接入现有项目:复用这些协议,不修改 LoopX 源码;
- 开发者贡献:从调用者结果和协议选择 owning boundary,可交付 Control Plane、 Capability/Domain State、Provider、Host/Runner、Projection/Dashboard、Docs/fixtures 或 Extension。
Extension 是开发者贡献中的独立 packaging/lifecycle 路径,不是所有贡献的统一抽象。两条主线共享 同一控制面模型,但不互相要求。下一部分先从最常见的项目接入开始。