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 异步维护)。

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions