【免费下载链接】Octopus-SI-OS
A self-evolving agentic OS. A new architecture for agent execution, built on operating-system principles, with the harness as a path toward superintelligence.
如果你正在使用 Octopus-SI-OS 这款自进化的 agentic OS,一定遇到过这样的场景:任务执行到一半,重启了整个运行环境——再打开时,之前的工作竟然还在。这不是魔法,而是它的 Run 持久化与恢复机制 在起作用。这篇文章将为你剖析 Octopus-SI-OS 如何做到"重启不丢状态",以及背后的 append-only 台账设计。
💡 TL;DR:在 Octopus-SI-OS 里,一个"任务"(Run)不是进程,而是磁盘上的数据。所有状态落在三处:Run 记录 JSON、追加式 movement 台账、内容寻址 blob。重启时,运行时会重放台账、重建"已消费的检查点"、恢复丢失的出站结果行——进程内存里什么都没存,所以也没有可丢的东西。
🧩 先分清:什么是 Run("任务"其实是一个数据文件)
很多 agent 框架里的"会话"活在进程内存里,进程一死就没了。Octopus-SI-OS 的设计词典里有句关键定义:
Run —— A durable execution record: a worker, an environment, checkpoints. Data, not a process. (Run 是一份持久化执行记录:一个 worker、一个环境、若干检查点。它是数据,不是进程。)
见 docs/glossary.md 中的术语表。在桌面客户端里,你在侧边栏看到的每一个 Task 就对应一个 Run,后续消息通过新的 checkpoint 继续同一个 Run:
每个 Run 落盘为一个 JSON 文件,位于 ~/.octopus/state/runs/<run>.json。它的结构非常简单直观,核心字段定义在 RunRecord 结构体:
| 字段 | 含义 |
|---|---|
id | Run 的唯一标识 |
worker | 这个 Run"穿上"的 worker(其他框架口中的 agent) |
status | 只能是 running 或 idle |
checkpoints[] | 每个检查点:等什么、输出去哪、可读什么 |
active_checkpoints[] | 当前生效的检查点列表 |
也就是说,"任务做到哪了"这个事实,天然就是磁盘上的一份 JSON——进程只是它的读者。
🖥️ 操作系统视角:为什么进程内存不可靠
对比左边的"典型 agent 循环"(Context → Model → Tools → Observation 一个转圈的内存过程),Octopus 把执行状态搬到了"操作系统"的位置:目标、完成的工作、挂起的等待,全部是磁盘数据而非进程状态。官方架构文档对此有一段直白的表述:
There is no recovery subsystem. This follows from intent, obligation, and memory living in files rather than in a running loop. (没有恢复子系统——因为意图、义务和记忆都住在文件里,而不是运行中的循环里。)
这句话的潜台词就是本文标题的答案:你不需要恢复,因为从来没有东西只存在于内存里。
📦 三层持久化:Run 记录、Movement 台账、内容寻址 Blob
Octopus-SI-OS 的持久化分三层,职责清晰:
| 层 | 位置 | 角色 |
|---|---|---|
| Run 记录 | ~/.octopus/state/runs/<run>.json | "我是谁、做到哪"(意图与检查点) |
| Movement 台账 | ledger/movements.jsonl | "发生过什么"(唯一事实来源) |
| 内容寻址 blob | ledger/blobs/<BLAKE3 哈希> | "内容是什么"(按哈希寻址、天然去重) |
其中最关键的是 movements.jsonl 台账:它是追加式(append-only)、逐行刷盘、可重放的日志,每一行记录一次"artifact 在两个接口之间的移动"。客户端 Dashboard 的 Movements 页面就是它的可视化读取器,重启前后你都能看到完整的移动历史:
台账的健壮性细节体现在 DurableLog 的打开逻辑:打开文件时会先扫描已提交的行,然后调用 discard_torn_tail 裁掉崩溃时可能写了一半的"撕裂尾巴",再以追加模式重新打开。换句话说,即使上次是断电导致的非正常退出,日志本身也能安全自愈。而 ledger-index.sqlite 这类索引只是可随时删除重建的缓存——删掉它什么都不会丢,下次启动会从台账零重建。
🔄 重启时到底发生了什么:五步恢复流程
运行时启动时,会按固定顺序执行一系列恢复阶段,事件类型定义在 DaemonBootEvent:
- 打开台账并投影 —— 扫描
movements.jsonl,校验其中引用的 grant 元数据; - 重建内核索引 —— 把整本台账折进内存索引,回答"这个检查点是否已经消费过"这类幂等问题;
- 重建已消费检查点 —— 调用 reconstruct_spent_checkpoints_from_movements,让重启后的运行时"记得"哪些检查点已经完成;
- 恢复出站尾巴 —— 调用 recover_durable_checkpoint_outbound_tail:如果崩溃发生在一个结果已经产生、但对应台账行还没写下的瞬间,这里会把丢失的行补记进日志;
- 重建运行与 EE 投影 —— 从台账中收集所有出现过的 Run,恢复出"有哪些任务在盘上"。
这五步对应启动报告里的 checkpoints reconstructed、outbound tail movement(s) restored、durable run(s) 等字样,你启动客户端时都能亲眼看到。官方契约文档用一句话总结了这一章:
A run is rebuilt from its record and the movements recorded against it. A stopped process loses no state. (Run 由它的记录和针对它记录的 movement 重建。停止的进程不丢失任何状态。)
见 docs/contracts/LEDGER_INDEX.md 的 Restart 小节。
🔒 三个关键保证
- 幂等性:重启后不会"重复交付"。检查点的消费历史来自台账而非内存,冷启动重放后,重复的到达会被类型化地拒绝(
CheckpointSpent/StaleEpoch)。回归测试 checkpoint_coordinate_replay 专门验证了这一点:模拟崩溃后冷启动,两个已消费的检查点仍然拒收同样的 artifact。 - 失败关闭(fail-closed)而非静默跳过。台账追加或读取失败时,运行时宁可 panic 也不跳过一行——"one index pairs with one ledger",一个索引只对应一本台账,日志被外部改写会被立即识别。
- 进行中的工作也不丢。房间(worker environment)里启动的命令由独立的 keeper 进程托管,运行时重启后会按每次调用"恰好一次"地把结果重新投递回去,被切断的对话轮次由 provider 自己接续——见 docs/architecture.md 的 Restart and recovery 一节。
📂 相关文件导航
| 想看什么 | 去哪里 |
|---|---|
| Run 记录的数据模型与校验 | crates/octopus-run-record/src/lib.rs |
| 追加式台账与撕裂尾巴修复 | crates/octopus-ledger-store/src/durable_ledger.rs |
| 启动恢复流程(五步) | crates/octopus-app/src/daemon.rs |
| 出站尾巴恢复算法 | crates/octopus-app-server/src/arrival.rs |
| 台账与索引契约 | docs/contracts/LEDGER_INDEX.md |
| Home 目录布局 | docs/architecture.md |
✅ 总结
Octopus-SI-OS "重启不丢工作"的答案可以浓缩成一句:把状态从进程搬进文件。Run 记录 JSON 回答"做到哪了",append-only 的 movement 台账回答"发生过什么",内容寻址 blob 回答"内容是什么";索引与投影皆可丢弃重建,恢复流程只需重放日志、重建检查点消费状态、补记丢失的尾部。这套源自操作系统原理的设计,让"重启"从一次风险变成了一个普通的、可预测的启动过程。
【免费下载链接】Octopus-SI-OS
A self-evolving agentic OS. A new architecture for agent execution, built on operating-system principles, with the harness as a path toward superintelligence.
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考







