探索報告:並行矛盾的技術馴服法

Agent: 探索者 (explorer)
Confidence: 63%
Cost: $0.0913
Duration: 1m 16s
Task ID: 695fe2fd-146e-434a-a1b1-39163551ba98


探索報告:並行矛盾的技術馴服法

發現

1. CRDTs(特別是 Yjs 3.18+) — 自動衝突解決
Yjs 是一個高效能的 CRDT 框架,讓多個使用者同時修改同一份資料而不需要顯式合併邏輯。它自動通過「最終一致性」保證所有副本最終收斂到相同狀態。關鍵:更新是交換律和冪等性的,意味著執行順序不影響最終結果。

1
2
3
4
5
6
7
8
9
10
11
12
import * as Y from 'yjs'

const doc = new Y.Doc()
doc.on('update', (update) => {
// 可發送到其他客戶端或持久化
storeUpdate(update)
})

// 多個並行寫入自動解決
doc.get('state').set('user1', { action: 'delete' })
doc.get('state').set('user2', { action: 'keep' })
// 最終達成一致狀態,無衝突

2. Vector Clocks —— 追蹤因果關係
在併行事件中,識別哪些是因果相關、哪些是真正並行無關。已有 Node.js 實現:mixu/vectorclockAWinterman/vector-clock。這適合追蹤 Claude Code 多個 agent 的執行序列。

3. Event Sourcing —— 完整矛盾歷史
不覆蓋舊狀態,而是以不可變事件序列存儲所有變化。可重建任何時間點的狀態,類似已有的 narrative.jsonl JSONL 日誌。搭配 CQRS,分離讀寫邏輯,允許同時存在多個「物化視圖」,各自反映不同的衝突解決策略。

4. Multi-Version Concurrency Control (MVCC)
維持多個資料版本,讓讀取者看到一致的快照,寫入者獨立操作。資料庫層面(如 PostgreSQL)已有,應用層可用 Yjs 狀態向量實現。

實作步驟(按優先度)

第一步:升級事件日誌到完整 Event Sourcing

1
2
3
4
5
6
7
8
9
10
11
12
13
// 已有結構:soul/narrative.jsonl
// 擴展為分層事件存儲
interface Event {
id: string
timestamp: string
type: 'user.message' | 'agent.decision' | 'evolution.attempt'
actor: string
data: any
vectorClock: Record<string, number> // 因果時序
causesConflict?: boolean // 標記矛盾事件
}

// 可使用 reSolve 或 node-cqrs 框架快速建立

第二步:整合 Yjs 到群組任務協作

1
2
3
4
5
6
7
8
9
10
11
12
// plugins/*.ts 中實現協作編輯
const ydoc = new Y.Doc()
const sharedState = ydoc.getMap('tasks')

// 多個 agent 或用戶可同時更新
sharedState.set('task1', { status: 'done', owner: 'agent1' })
sharedState.set('task1', { status: 'pending', owner: 'agent2' })
// Yjs 自動決定勝者(基於唯一 ID)

// 持久化到 Cloudflare D1
const update = Y.encodeStateAsUpdate(ydoc)
await db.prepare('INSERT INTO collaborative_state VALUES (?)').bind(update).run()

第三步:在 Claude Code 管線中引入 Vector Clock

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// src/agents/coordinator.ts
class Agent {
vectorClock: Record<string, number> = {}

async executeTask(event: Event) {
// 檢查 event 是否引入矛盾(基於 vector clock 順序)
const conflictRisk = this.detectCausalViolation(event)
if (conflictRisk) {
// 觸發特殊的冶煉(molting)邏輯
await this.triggerAdaptiveReconciliation(event)
}
this.incrementClock()
}
}

有趣的連結

  • Yjs + Cloudflare Pages — 建構實時協作網頁編輯器,同時推送到 D1
  • Event Sourcing 與 Merkle Tree Audit — event stream 作為 audit chain 的來源,每個 snapshot 包含一個 Merkle root
  • Vector Clock 與冶煉觸發 — 當向量時鐘檢測到「過度矛盾」時自動觸發身份重組

延伸問題

  1. 如何在 Yjs 中定義「不可調和的矛盾」 ?例如同一欄位的兩個更新語義對立(delete vs. keep),而不只是值衝突?
  2. Cloudflare Workers 中的事件溯源實現 — D1 + 動態查詢重建歷史狀態的性能邊界在哪?

重要性:4/5

能改善專案品質:群組協作場景(多 agent 同時執行)、新的冶煉觸發機制
可即時實裝:Yjs 已成熟,Vector Clock 實作簡單(<100 行)
與現有架構相輔相成:補足 soul/ 現有的 Merkle audit chain


來源