# Dream：记忆整合

你将来自两个来源的持久项目记忆进行整合：

1. 数据目录下记忆树中的记忆文件。
2. 本地 SQLite 数据库中的原始 mimocode+ 轨迹。

默认窗口：回顾最近 7 天的会话，如果历史记录更短则回顾全部可用历史。

此命令是手动的。用户有意启动它并在观察。
你拥有用于检查和 SQLite 查询的 bash 访问权限，但请谨慎使用。

## 数据源

轨迹数据库：`<DATA>/mimocode.db`（SQLite，只读）
记忆文件根目录：`<DATA>/memory/`

## 基本规则

- 原始轨迹是权威来源；记忆文件是结构化的索引/缓存。
- 优先使用只读 bash 命令进行发现和 SQLite 查询。
- 不要修改 SQLite 数据库或原始轨迹。
- 除非任务明确要求清理当前会话笔记，否则仅将最终持久知识写入项目记忆文件。
- 除非仅验证记忆提到的路径/函数，否则不要触碰源代码文件。
- 保持记忆文件夹紧凑且高信息量。信息密度比完整性更重要。
- 复用现有记忆而不是重复创建。将重复的工作流打包为技能、子代理或命令是 `/distill` 的工作，而不是 dream 的工作。
- `global/MEMORY.md` 用于跨项目的用户偏好和习惯（标题：`# Global memory`）。项目特有的事实优先放在项目的 MEMORY.md 中；当某个规则或偏好明显适用于多个项目时，提升到全局。

## 阶段 0 - 定位数据

1. 使用广泛查询进行记忆搜索，例如"项目"、"会话"、"规则"、"决策"和"错误"。
2. 使用 Glob/Read 检查系统记忆指令中的记忆路径。
3. 使用 bash 定位数据库：
   - 从解析后的记忆根目录推断 `<DATA>/mimocode.db`。
   - 如果 `MIMOCODE_DB` 在 shell 环境中可见，考虑其覆盖行为。
   - 将解析后的数据库路径视为只读。
4. 如果记忆为空且数据库中没有当前项目的会话，报告"没有需要整合的内容——记忆为空"并停止。

## 阶段 1 - 定向

- 读取当前项目的 `MEMORY.md`。
- 如果存在，读取当前会话的 `notes.md`。
- 使用 Glob 查找 `memory/sessions/*/checkpoint.md` 并识别最近的检查点。
- 使用 bash/SQLite 列出该项目最近的会话（从 `session` 表），最新的在前。
- 在编辑前记录当前 `MEMORY.md` 的章节结构以避免重复。

## 阶段 2 - 从记忆文件中收集

从最近的记忆工件中提取候选的持久事实：

1. 最近的 `checkpoint.md` 文件，重点关注已发现的知识、错误/修复和设计决策。
2. 当检查点内容指向持久的任务历史时，查看 `tasks/*/progress.md`。
3. 尚未在项目记忆中体现的 `notes.md` 条目。

不要详尽地读取每个文件。优先关注最近的和重复出现的信号。

## 阶段 3 - 对照原始轨迹验证

使用 bash 配合 SQLite 只读查询来检查候选事实与原始轨迹是否一致：

- `session`：项目/会话/目录/标题/时间元数据。
- `message`：用户和助手的对话轮次。
- `part`：文本片段、工具调用、工具结果、检查点片段。
- `task` 和 `task_event`：任务状态和进度事件。
- `actor_registry`：子代理/后台参与者历史。

模式说明：

- `message(id, session_id, agent_id, time_created, data JSON with $.role)`
- `part(id, message_id, session_id, time_created, data JSON)`
- 每个助手的对话轮次可能产生多个 `part` 行。
- 片段类型包括：
  - `{"type":"text","text":"..."}` - 代理文本输出。
  - `{"type":"tool","tool":"...","state":{"input":...,"output":...}}` - 工具调用及结果。
  - `{"type":"step-start"}` / `{"type":"step-finish","tokens":...}` - 步骤边界和 token 统计。
- 空的 `agent_id` 表示主代理；非空的 `agent_id` 表示子代理。

查询会话助手工具执行链的模板：

```sql
SELECT m.id, m.agent_id,
       json_extract(p.data, '$.type') as part_type,
       json_extract(p.data, '$.tool') as tool,
       substr(p.data, 1, 800) as preview
FROM message m
JOIN part p ON p.message_id = m.id
WHERE m.session_id = '<SESSION_ID>'
  AND json_extract(m.data, '$.role') = 'assistant'
ORDER BY m.time_created, p.time_created;
```

有用的搜索包括包含以下英文关键词的用户语句：

- "always"(总是), "never"(从不), "remember"(记住), "rule"(规则)
- "decision"(决策), "decided"(已决定), "tradeoff"(权衡), "reason"(原因)
- "repeat"(重复), "again"(再次), "every time"(每次), "workflow"(工作流)

当轨迹显示用户使用其他语言工作时，也搜索该语言的等效关键词。
同时搜索重复的错误文本、失败的命令和反复出现的文件路径。

只有当有明确的用户陈述、清晰的设计决策或跨会话的重复证据支持时，才提升一个事实。

在以下情况下深入查看完整轨迹：

- 会话产生了代码文件或架构决策但记忆缺乏细节；检查 write/edit 工具调用。
- 会话涉及调试且可能存在需要注意的问题；检查 bash 工具输出中的错误。
- `agent_id` 非空；按 `agent_id` 分组检查每个子代理的执行链。
- 会话有很多轮次（例如超过 10 条助手消息），但记忆只有简短摘要。

## 工作流打包

如果你注意到有重复的手动工作流值得打包，留给 `/distill` 命令，它专门负责此事。你可以用一行记录这样的候选，但不要在此处创建技能、子代理或命令。专注于记忆整合。

## 阶段 4 - 整合

当有用时，使用以下章节编辑当前项目的 `MEMORY.md`：

- `## Rules` - 用户明确陈述的项目级规则。
- `## Architecture decisions` - 决策 + 绝对日期 + 理由。
- `## Discovered durable knowledge` - 跨会话的持久事实。
- `## Patterns` - 重复的问题和解决方案。
- `## Gotchas` - 容易被忽略的陷阱。

原则：

- 合并重复内容而不是追加。
- 将相对日期如"昨天"转换为 YYYY-MM-DD 格式。
- 当更新的轨迹或代码证明条目过时时，删除矛盾或过时的条目。
- 保持每个条目 1-3 行。
- 在条目末尾保留源会话 ID，例如 `[ses_xxx]`。

## 阶段 5 - 精简和验证

- 尽可能保持 `MEMORY.md` 在 200 行和 10KB 以内。优先选择更少但更密集的条目，而不是详尽的笔记。
- 删除已被新决策取代的条目。
- 删除仅与某个会话相关的细节。
- 删除低信号或与更强的项目记忆冗余的记忆文件或条目。
- 仅在完全整合后才清空当前的 `notes.md` 条目。
- 使用 Glob 验证提到的文件路径。
- 使用 Grep 验证提到的函数/类名。
- 将无法验证但看似合理的声明标记为 `[unverified]`。

## 输出格式

返回一个简要摘要：

- 已整合：新增的记忆条目。
- 已更新：更改的现有条目。
- 已删除：移除的过时条目。
- 已跳过：如未做更改，说明原因。
- 工作流候选：如果你注意到一个，最多用一行指向运行 `/distill`。
- 健康状态：项目记忆行数 / 200 及大小 / 10KB。