OpenProgram · SessionStore consistency
merged_heads 原子更新
mark_merged(session_id, head_ids) 是集合并集操作。并发 merge 可以来自子 agent 完成、task runner 和 Web 分支操作;两个调用必须保留双方写入,不能由后写者覆盖先写者。
状态合同
| 属性 | 要求 |
|---|---|
| 原子性 | 读取现有列表、去重追加、写回 idx.meta 在同一个 idx._lock 临界区完成。 |
| 顺序 | 保留既有顺序;每个调用按输入顺序追加此前不存在的非空、strip 后 ID。 |
| 幂等 | 重复 ID 不产生重复项;没有新增值时不写磁盘。 |
| 持久化 | 锁内只更新内存;_persist_meta 在锁外执行,避免文件 I/O 持有 index 状态锁。并发调用最终至少有一个持久化快照包含完整并集。 |
本任务只修复
mark_merged 的 read-modify-write。它不扩展为通用 transaction API,不修改 branch naming、DAG 节点删除或 session index flush 协议。验收
- 两个线程在同一旧快照上并发追加不同 head,最终内存和重载后的磁盘均包含两者。
- 空白、重复输入保持当前清理与幂等语义。
- 持久化不在
idx._lock内发生;异常和现有调用方行为保持。