背景
PR #445(编排记忆批,已合入 main @ fb6dddc)将提取丢轮的单槽重放升级为 FIFO pending[] + 失败暂存 carriedBatches,但暂存机制自身引入连败丢批缺陷,恰复刻了本要消灭的"静默丢轮"。
问题
apps/sidecar/src/services/memory-v2/background-extractor.ts:
- :139-140
runExtraction 开头 carriedBatches.delete(threadKey)
- catch(:246)重建暂存时
get() 已空 → 只放回 [input.items]
两轮连续失败(provider 短暂故障跨两轮)即永久丢失更早的暂存批。
附带(F4):skip 路径吞批
:155-157 hasMemoryMutationForRun 命中即写 skipped 且 cursor 前进,已并入的 carried 批证据被消费但从未提取。
附带(F5):无界且不可恢复
carriedBatches 内存 Map 无清理(线程废弃后泄漏);重启后仅 interrupted 任务可恢复(:97-109 只查 interrupted),failed 暂存批丢失。
建议修法
- catch 改为
[...carriedBatches.get(key) ?? [], ...carried局部变量, input.items](函数局部 carried 变量现成可用);或把 delete 挪到成功路径(completedCursor 推进之后)
- skip 分支:已并入的 carried 批应退回暂存而非随 cursor 丢弃
- 给 carriedBatches 加注释声明生命周期或 TTL;恢复查询放宽到 failed
关联
背景
PR #445(编排记忆批,已合入 main @ fb6dddc)将提取丢轮的单槽重放升级为 FIFO
pending[]+ 失败暂存carriedBatches,但暂存机制自身引入连败丢批缺陷,恰复刻了本要消灭的"静默丢轮"。问题
apps/sidecar/src/services/memory-v2/background-extractor.ts:runExtraction开头carriedBatches.delete(threadKey)get()已空 → 只放回[input.items]两轮连续失败(provider 短暂故障跨两轮)即永久丢失更早的暂存批。
附带(F4):skip 路径吞批
:155-157
hasMemoryMutationForRun命中即写 skipped 且 cursor 前进,已并入的 carried 批证据被消费但从未提取。附带(F5):无界且不可恢复
carriedBatches 内存 Map 无清理(线程废弃后泄漏);重启后仅 interrupted 任务可恢复(:97-109 只查 interrupted),failed 暂存批丢失。
建议修法
[...carriedBatches.get(key) ?? [], ...carried局部变量, input.items](函数局部carried变量现成可用);或把delete挪到成功路径(completedCursor 推进之后)关联