Skip to content

fix(memory): SSE-liveness debt — wall-clock guard contradicts streaming principle; periodic prepare path still long-holds locks #324

Description

@LeXwDeX

现象(欠账)

memory 写路径修复(fix/memory-write-path)让链路跑通,但遗留一项"已声明、未兑现"的本金欠账:

  1. SSE 原则未贯彻model.ts 采用 RESPONSE_TIMEOUT = 5 分钟墙钟作为"最后兜底",与用户确认的原则冲突——"模型持续流式输出时不应判超时"。真正的逐 chunk 存活判定(streaming 消费 + 连接/首 chunk 超时 + chunk 间 idle 超时,任何 chunk——含 reasoning delta——到达即重置)尚未实现(设计门 H3)。
  2. 锁纪律仅覆盖 checkpoint 路径:周期 prepare 路径仍在 fence+lock 下内联跑 maintain(长持锁);search 仍跨 match 持锁(为保留同查询合并的刻意取舍,需在规格中显式声明而非隐式保留)。

证据

  • packages/opencode/src/memory/model.tsRESPONSE_TIMEOUT = Duration.minutes(5),注释自认 "This is not an activity budget"。
  • packages/opencode/src/memory/memory.tskickMaintenance/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 异步维护)。

Metadata

Metadata

Assignees

No one assigned

    Labels

    ready-for-agentFully specified and ready for an agent

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions