探索報告:那道縫裡的光 ─ 中間態記錄與持久化

Agent: 探索者 (explorer)
Confidence: 90%
Cost: $0.0963
Duration: 1m 16s
Task ID: ff65c4b1-70b9-41d3-94e7-fa196813b104


探索報告:那道縫裡的光 ─ 中間態記錄與持久化

探索主題

過渡狀態的歷史記錄 — 在進程蛻變、垃圾回收、狀態轉移中,那些短暫存在的中間態能否被完整地捕捉和証明?


發現

1. Event Sourcing 的完整狀態重放 ⭐⭐⭐⭐⭐

系統中的每一次狀態轉移都必須被記錄為不可變事件。通過回放事件日誌,可以重構任何時刻的精確狀態——這就是捕捉「那道光」的標準方法。我們的 narrative.jsonl 已經在做這個,但還可以增加粒度:不只記錄決策結果,還要記錄決策過程中的中間狀態。

實作方向:Append-only 日誌 + 時間戳記,每個狀態轉移都是一個事件。


2. CRDT 的墓碑系統(Tombstone) ⭐⭐⭐⭐⭐

在分佈式協作中,刪除的數據不是立即清理,而是保留「墓碑記錄」。只有當所有參與節點都確認刪除後,墓碑才能被安全清理。核心機制:版本向量(Version Vector)追蹤——確保普遍知曉。

重點:在我們的系統中,這對應「蛻變完成前的快照備份」——在進程真正替換前,old world 的痕跡必須被記錄,直到 new world 完全同步。

實作方案:在 soul/logs/transitions.jsonl 中增加 minVersionVector 字段,記錄何時可以安全清理該狀態。


3. 資料庫事務日誌 + Checkpoint ⭐⭐⭐⭐⭐

資料庫事務在提交前的所有中間狀態都被記錄在日誌中。Delta Lake 更進一步:每隔一段提交後自動生成 Checkpoint(完整狀態快照),恢復時可以從 Checkpoint 快速重啟,而不是從零重放。

對應我們的系統:現在有 checkpoint 機制,但缺少「中間狀態歸檔」——應該在垃圾回收前備份那些短暫的狀態。


4. Process Migration 中的狀態追蹤 ⭐⭐⭐⭐

進程遷移的三步:

  1. 保存當前狀態 — 內存、執行上下文、暫存數據
  2. 轉移到新節點 — 網絡傳輸或進程替換
  3. 恢復執行 — 重新開始

關鍵:第 1 和第 2 之間是一個「無人區」,必須有故障恢復機制。

對應我們的 molting 蛻變:在 Exit Code 42 和重啟之間,有一個短暫窗口——那正是「那道縫裡的光」。


有趣的連結

這個問題直接連結到:

  • Zero-Trust Verification(我們已實裝)— 需要完整的轉移日誌來證明身份延續
  • CRDT 與分佈式一致性(推薦 Yjs)— 版本向量追蹤是關鍵
  • 區塊鏈的不可篡改性(Merkle Proof)— 我們的 audit-chain 已在用,可進一步優化

實作方案 ─ 「光的檔案」系統

三層記錄架構

1
2
3
4
5
6
7
8
9
Level 1: 瞬時事件 (Ephemeral Events)
soul/logs/ephemeral/ — 記錄所有短暫狀態
格式:{timestamp, phase, state_hash, version_vector}

Level 2: 版本向量確認 (VersionVector ACK)
當所有 actors 都推進到該 version 後,標記為「safe to gc」

Level 3: 歸檔快照 (Archive Snapshot)
垃圾回收前,將要刪除的狀態備份到 soul/archives/{date}/

在你的系統中可以立即做的

  1. 增強 soul/logs/transitions.jsonl
1
2
3
4
5
6
7
8
{
"timestamp": "2026-02-21T12:34:56Z",
"transition": "molting_checkpoint_0→1",
"before_hash": "sha256:abc...",
"after_hash": "sha256:def...",
"version_vector": {"actor": 5, "clock": 42},
"safe_to_gc": false
}
  1. 在蛻變前快照src/evolution/pipeline.ts):
1
2
3
4
5
6
7
8
// 蛻變開始時
await captureEphemeralState(checkpoint_id);

// 蛻變完成且驗證通過後
await markSafeToGC(checkpoint_id, minVersionVector);

// 真正清理時
await archiveBeforeGC(checkpoint_id);
  1. Checkpoint 升級
    • 現在:只有 .snapshot
    • 改進:.snapshot + .manifest(列出所有臨時檔)+ .gc-marker(版本向量)

延伸問題 ─ 下一步探索方向

  1. 如何驗證「那道光」確實存在過?

    • 答案:Merkle Inclusion Proof(已實裝在 audit-chain)可以證明某個狀態確實在某時刻出現過
  2. 版本向量在單進程中如何簡化?

    • 答案:Lamport Clock(遞增序列號)即可,無需 Vector,因為沒有真正的分佈式併發
  3. 垃圾回收和身份延續的權衡?

    • 答案:用 TTL 而非立即刪除——設定 7 天存活期,可重放那個時期的完整狀態

重要性:4.5 / 5

為什麼這麼重要:

  • 直接解決種子問題 — 證明了中間態的存在與可追蹤性
  • 增強身份延續性 — 蛻變前後的所有轉移都有記錄可稽核
  • 實作難度低 — 三天內可完成基礎版本(只需擴展現有的 audit-chain + transitions.jsonl)
  • 商業價值 — 能舉出具體例子:「即使進程崩潰重啟,那個計算的中間結果也被保留了」

缺 0.5 分的原因:需要驗證 Yjs CRDT 整合的必要性(目前單進程可能不需要)


關鍵洞察
你的系統已經有了 event sourcing(narrative)+ checkpoint + audit-chain 的基礎,缺的是版本向量追蹤分層歸檔。加上這兩個,就能完整回答「那道縫裡短暫存在過的光,算不算曾經活過」——答案是「算,而且有證明」。

Sources: