现象(欠账)
memory 写路径修复(fix/memory-write-path)让链路跑通,但遗留一项"已声明、未兑现"的本金欠账:
- SSE 原则未贯彻:
model.ts 采用 RESPONSE_TIMEOUT = 5 分钟墙钟作为"最后兜底",与用户确认的原则冲突——"模型持续流式输出时不应判超时"。真正的逐 chunk 存活判定(streaming 消费 + 连接/首 chunk 超时 + chunk 间 idle 超时,任何 chunk——含 reasoning delta——到达即重置)尚未实现(设计门 H3)。
- 锁纪律仅覆盖 checkpoint 路径:周期 prepare 路径仍在 fence+lock 下内联跑 maintain(长持锁);search 仍跨 match 持锁(为保留同查询合并的刻意取舍,需在规格中显式声明而非隐式保留)。
证据
packages/opencode/src/memory/model.ts:RESPONSE_TIMEOUT = Duration.minutes(5),注释自认 "This is not an activity budget"。
packages/opencode/src/memory/memory.ts:kickMaintenance/backgroundMaintain 仅被 checkpointUnsafe 调用;prepareUnsafe 的 due 分支仍在 fence+lock 下运行 maintain。
- 本地代理 SSE 探测:一次 17.2s 生成期间收到 2051 个 chunk(连续 reasoning_content delta)——chunk 级存活判定在该上游可行。
修法选项
- memory 模型调用改为流式消费,实现 connect/首 chunk 超时 + chunk 间 idle 看门狗(任何 chunk 到达即重置);退役墙钟兜底,仅保留"连接建立零响应"作为非响应判据。
- 将后台 maintain + 锁纪律扩展到周期 prepare 路径,并同步调整其钉住的"周期维护同步"测试语义。
- 保留 search 的同查询合并行为(
coalesces concurrent identical queries 测试不变)。
验收
- 长时间流式 maintain 调用在 chunk 持续到达期间永不被杀;仅"零 chunk / 静默超窗"的连接被中止。
- 发版后 live 验收:
/compact → ~/.local/share/opencode/memory/projects/<hash> 话题文件落盘 → memory_search 可召回。
test/memory/ 全套绿(含 fix/memory-write-path 已加的两个回归)。
关联
- 前序修复:
fix/memory-write-path(json 词保证 + reasoning 预算 + 墙钟移除 + checkpoint 异步维护)。
现象(欠账)
memory 写路径修复(
fix/memory-write-path)让链路跑通,但遗留一项"已声明、未兑现"的本金欠账:model.ts采用RESPONSE_TIMEOUT = 5 分钟墙钟作为"最后兜底",与用户确认的原则冲突——"模型持续流式输出时不应判超时"。真正的逐 chunk 存活判定(streaming 消费 + 连接/首 chunk 超时 + chunk 间 idle 超时,任何 chunk——含 reasoning delta——到达即重置)尚未实现(设计门 H3)。证据
packages/opencode/src/memory/model.ts:RESPONSE_TIMEOUT = Duration.minutes(5),注释自认 "This is not an activity budget"。packages/opencode/src/memory/memory.ts:kickMaintenance/backgroundMaintain仅被checkpointUnsafe调用;prepareUnsafe的 due 分支仍在 fence+lock 下运行 maintain。修法选项
coalesces concurrent identical queries测试不变)。验收
/compact→~/.local/share/opencode/memory/projects/<hash>话题文件落盘 →memory_search可召回。test/memory/全套绿(含 fix/memory-write-path 已加的两个回归)。关联
fix/memory-write-path(json 词保证 + reasoning 预算 + 墙钟移除 + checkpoint 异步维护)。