# 记忆系统

> 更新：2026-05-30 | 总指挥

## 架构总览

```
workspace/
├── MEMORY.md              — 塔2：长期记忆（精炼决策/经验/架构）
├── memory/
│   ├── YYYY-MM-DD.md      — 塔1：每日事件日志
│   ├── ctx-main.md        — 主会话上下文（自动维护）
│   ├── ctx-trade.md       — 交易领域上下文
│   ├── ctx-dev.md         — 开发领域上下文
│   ├── ctx-research.md    — 调研领域上下文
│   ├── ctx-infra.md       — 基础设施上下文
│   ├── ctx-network-links.md — 全链路配置知识库
│   ├── checkpoints/       — 任务检查点
│   └── session_verification.md — 会话验证码（当前：42）
├── EXCLUDE_LIST.md        — 已知陷阱与重复错误防范
├── CHEATSHEET.md          — 端口/路径/命令快速参考
├── AGENTS.md              — SOP与行为规范
├── SOUL.md                — 核心身份
├── USER.md                — 用户偏好
└── memory-archive/
    ├── raw-logs/           — 全量原始对话记录（3/31→5/9，33天9.2MB）
    ├── runs/               — 每日任务详细列表
    └── runs-index.md       — 任务执行速查索引
```

## 双塔记忆系统

### 塔1：每日日志（memory/YYYY-MM-DD.md）
- **内容**：原始事件记录，每条对话/心跳/错误都记
- **粒度**：时间线格式，含任务ID、引擎、结果
- **写入者**：我（总指挥）+ distill-memory.sh（自动摘要追加）
- **保留策略**：长期保留，不自动清理

### 塔2：长期记忆（MEMORY.md）
- **内容**：精炼的决策、经验、架构图、关键配置
- **原则**：只保留重要且长期有效的信息
- **写入规则**：仅手写，distill脚本禁止覆盖（只追加不覆盖）

## 领域上下文文件（ctx-*.md）

按 session 名自动加载对应上下文，确保跨会话记忆连续性：

| 文件 | Session | 内容 |
|:-----|:-------:|------|
| ctx-main.md | main | 架构/端口/活跃关注点/常见操作 |
| ctx-trade.md | trade | 主关注资产/方法论/信号特征 |
| ctx-dev.md | dev | 项目结构/代码规范/部署流程 |
| ctx-research.md | research | 调研主题/参考资料/结论 |
| ctx-infra.md | infra | 服务器/网络/隧道/故障记录 |
| ctx-network-links.md | 全session | SSH隧道/代理/端口映射配置 |

## 启动加载顺序

每次会话启动时，按以下顺序加载记忆：

1. `SOUL.md` — 核心身份
2. `USER.md` — 用户偏好
3. `memory/YYYY-MM-DD.md` — 今日+昨日日志
4. `MEMORY.md` — 长期记忆（main session时）
5. `memory/ctx-{domain}.md` — 领域上下文
6. `EXCLUDE_LIST.md` — 已知陷阱（必读）
7. `docs/` — 按需读取

### 心跳/定时唤醒额外恢复
- 加载最近3天记忆日志
- 读取 MEMORY.md 前80行
- 拉取飞书最近5条消息

## 写入规则（SOP）

1. compaction前自动flush
2. 模型切换前必须先flush
3. 关键决策/错误/API变更即时写入
4. 对话启动时检查上下文完整性（≥4/5项通过方可执行复杂任务）
5. **禁止 `cat >` 覆盖** MEMORY.md / ctx-*.md（用 append 或 atomic write）
6. distill-memory.sh 只追加不覆盖（2026-05-16修复）

## 蒸馏与归档

### distill-memory.sh
- 频率：每12小时（cron: `0 */12 * * *`）
- 行为：用 DeepSeek API 从 raw-logs 提炼摘要 → **追加**到塔1和塔2
- 修复历史：原为覆盖模式，2026-05-16改为追加模式

### auto-archive.sh
- 频率：每2小时（cron: `0 */2 * * *`）
- 行为：飞书对话记录存档到 memory-archive/raw-logs/

### save-session-from-file.py
- 用途：从飞书导出文件提取完整对话记录
- 位置：workspace-dev/scripts/

## 记忆覆盖监控

agent-progress-check 每12小时汇报中包含「记忆系统覆盖」检查：
- 统计各 workspace 的 memory/ 文件数
- 检查最近3天是否有日志文件
- 发现 gap → 标注并尝试补全

## 已知Gap

| 时间段 | 天数 | 原因 | 处理 |
|:-------|:---:|------|:----:|
| 5/3~5/11 | 9天 | OpenClaw与飞书断联 | 已关闭告警，深度扫描无残留 |
| 5/12-5/13 | 2天 | AI摘要生成失败 | 原始对话可能仍可恢复 |

## 错误索引

- 结构化错误：`.learnings/ERRORS.md`（按 priority/status 过滤）
- 重大事故：`memory/INCIDENTS.md`（P0/P1 专用，含时间线）
- 月度聚合：`memory/error-index-YYYY-MM.md`（heartbeat 自动生成）
- 领域错误：`memory/ctx-infra.md`（基础设施/服务类错误）

## 关键教训

- **distill脚本覆盖事故**（2026-05-15/16）：cat > 覆盖手写结构化记忆 → 改为追加模式
- **记忆gap不可恢复**（5/3~5/11）：飞书断联期间心跳触发不产生有效对话
- **session验证码**：用于跨会话连续性检查（当前值：42）
