agentscope-ai / agentscope-ai/agentscope-java

MemoryConsolidator 在 MEMORY.md 缺失或为空时,已有水位导致旧账本不参与重建

Đang mở
#3,090 2 bình luận 0 reaction 0 người được giao Xem trên GitHub
area/harness
Ngôn ngữ chính
Java
Star
5.6k
Fork
1.3k
Merge trung bình
4 ngày 12 giờ
Pull request đã merge (30 ngày)
77

Mô tả

## 环境

- `agentscope-harness` 2.0.3:经由集成该版本的应用端到端复现(MEMORY.md 缺失时,合并结果只包含水位之后账本的内容)
- 当前 `main`:父提交 `c6af7818` 经代码走读确认缺陷仍在;修复提交 `246c3b3f` 基于该提交
- 影响所有文件系统后端(Local / Sandbox / Remote)——`MemoryConsolidator` 与后端无关

## 问题描述

Harness 的记忆模型分两层:只追加的每日账本(`memory/YYYY-MM-DD.md`)和由 `MemoryConsolidator` 定期重写的策划层 `MEMORY.md`。每次合并的输入组装方式是:

> 当前 MEMORY.md(为空时用占位符 `(empty)`)+ 水位(`memory/.consolidation_state`)之后修改的每日账本 → 覆写 MEMORY.md → 推进水位

该机制依赖一个从未被校验的前提:**MEMORY.md 承载着此前合并保留下来的长期记忆**。当 MEMORY.md 确实缺失或为空、而隐藏的水位文件还在时(例如手动清理或误删了 MEMORY.md 但没有删除水位),下一次合并就会把"水位之后的账本"合并进 `(empty)` 并整体覆写文件。此后:

- 水位之前**未再次修改**的旧账本不会自动重新纳入;
- 整个过程缺少针对该状态的告警,合并正常完成、水位照常推进,无法事后察觉。

每日账本(事实源头)仍然保有这些内容,数据原则上可恢复——但策划视图不会自行回到正确状态。

## 复现步骤

确定性复现——缺陷出在输入组装阶段,与模型的返回无关:

1. 准备一个工作区:
- `memory/2025-06-14.md`(mtime 早于水位),内容 "older day facts"
- `memory/2025-06-16.md`(mtime 晚于水位),内容 "fresh day facts"
- `memory/.consolidation_state` = `2025-06-15T12:00:00Z`
- 不存在 `MEMORY.md`
2. 调用 `MemoryConsolidator.consolidate(rc)`。
3. 检查发给模型的 user 消息:只有 `### 2025-06-16.md` 和 `(empty)`——`2025-06-14.md` 被水位过滤掉了。模型输出随后覆写 `MEMORY.md`,水位照常推进。

**期望行为:** 策划视图缺失或为空而水位已存在时,应识别为"视图丢失",从**全部**每日账本重建(与首次运行相同的输入组装)——或者至少拒绝合并并记录警告,而不是静默覆写。

## 相关问题(本补丁不解决)

- `WorkspaceManager.readMemoryMd()` 在瞬时读取失败(I/O 错误等)时同样返回 `""`,与"文件确实为空"无法区分;此时即使 MEMORY.md 本身完好,也会进入同一条重建路径。
- 部分账本读取失败目前不会阻止合并继续执行。

## 建议修复

在 `MemoryConsolidator.consolidate()` 中,读取当前 MEMORY.md 之后:

```java
if (currentMemory.isBlank() && !watermark.equals(Instant.EPOCH)) {
log.warn("MEMORY.md is blank while a consolidation watermark exists ({}) — "
+ "rebuilding from all daily ledgers", watermark);
watermark = Instant.EPOCH;
}
```

把本次运行的局部 `watermark` 归零后,全部账本自动进入合并输入,且误导性的 `(since ...)` 提示词标签也会随之消失——两者共用同一个变量。MEMORY.md 是账本的派生视图,从事实源头重建才能让语义自洽;"无新账本则跳过"的短路逻辑在视图存在时依然适用。稍后提交 PR。

Hướng dẫn đóng góp

Mở hướng dẫn đóng góp

Đánh giá

Issue này chưa được đánh giá.

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.