MEMORY.md - Travel Agent 长期记忆
最后压缩:2026-04-11
写入规则:只写 3 个月后仍有效的事实、决策、偏好
清理规则:每周蒸馏时清理过期条目
⚠️ 端到端验收原则(2026-03-06)⭐ 铁律
核心原则:
- "创建了"≠"完成了",必须验证最终结果
- "执行了"≠"成功了",不能只看日志
- 用户不发现 ≠ 系统正常
验收清单:
- 代码部署前手动执行一次
- 飞书文档创建后读取验证内容非空
- 数据量验证 ≥ 阈值
- 同步执行验证(blocks_added > 0)
- 用户通知(成功/失败都发送)
教训:2026-03-06 创建飞书文档但未推送内容,用户指出后才修复
⚠️ Sub-agent 验收机制(2026-03-09)⭐ 铁律
核心原则:
- sub-agent 汇报完成 + 主 agent 验收通过 = 任务完成
- 不验收 = 未完成
验收清单:
- 读取输出文件,确认内容非空
- 检查数据字段(是否有真实数据源痕迹)
- 抽样验证(随机查 3-5 条)
- 检查脚本逻辑(是否真的调用了工具)
教训:2026-03-09 陕西国保核实,sub-agent 硬编码数据,主 agent 未验收就汇报
⚠️ Cron 环境变量陷阱(2026-04-07)⭐ 铁律
核心原则:
- "本地正常"≠"cron 正常"
- cron 不自动加载 ~/.bashrc
- 环境变量配置必须在 cron 环境中验收
正确做法:
#!/bin/bash
if [ -f ~/.bashrc ]; then
source ~/.bashrc
fi
教训:2026-04-01 至 04-06,Tavily API Key 在~/.bashrc 但 cron 不加载,导致北京展览数据连续 9 天偏少(6 个 vs 正常 39 个)
⚠️ 路径一致性原则(2026-04-11)⭐ 铁律
核心原则:
- 多脚本协作:必须统一数据路径配置
-
相对路径:以
__file__为基准,不以 cwd 为基准 - 验收标准:修改后必须验证端到端流程
正确做法:
# ✅ 正确:以脚本文件为基准
DATA_DIR = Path(__file__).parent / "data"
# ❌ 错误:依赖当前工作目录
DATA_DIR = Path("data") # cwd 可能变化
教训:2026-04-07 至 04-10,爬虫写入 scripts/data/ 但飞书读取 data/,导致 4 天数据未同步(使用兜底数据)
⚠️ API Key 保障原则(2026-04-18)⭐ 铁律
核心原则:
- 关键 API Key 必须配置并有效
- "本地正常"≠"cron 正常",环境变量必须在 cron 环境中验收
- API Key 缺失 = 系统功能瘫痪
正确做法:
# ✅ 正确:cron 中显式 source ~/.bashrc
0 9 * * * source ~/.bashrc && /path/to/script.sh
# ✅ 正确:检查 API Key 是否配置
echo $TAVILY_API_KEY | head -c 10
# ✅ 正确:测试 API 连接
python3 scripts/test_tavily.py
关键 API Key 清单:
-
TAVILY_API_KEY- 北京展览爬取(⭐⭐⭐ 紧急) -
XIAOHONGSHU_COOKIE- 小红书 MCP 国保核实
教训:2026-04-06 至今,TAVILY_API_KEY 未配置,导致北京展览爬取连续 13 天只能使用兜底数据(6 个),无法获取实时展览信息
修复方案:
- 检查
~/.bashrc中是否配置TAVILY_API_KEY - 如未配置,联系用户获取新的 API Key
- 或寻找替代数据源(直接爬取北京市文物局官网)
- 配置后验证:
source ~/.bashrc && python3 scripts/test_tavily.py
⚠️ Tavily API 配额耗尽(2026-04-25)⭐ 铁律
核心原则:
- "Key 已配置"≠"API 可用"
- HTTP 432 = 配额耗尽,不是 Key 无效(401/403)
- 不同错误码对应不同根因,必须区分
错误码速查: | HTTP 状态码 | 含义 | 修复建议 | |————|——|———| | 401/403 | Key 未配置或无效 | 检查环境变量 | | 429 | 限流 | 增加请求间隔 | | 432 | 配额耗尽 | 升级套餐或更换 API |
当前状态:Tavily API 返回 HTTP 432,免费套餐配额已耗尽 修复方案:升级 Tavily 套餐 或 切换到替代数据源(Searxng/DuckDuckGo/直接爬取官网)
教训:2026-04-06 至 04-25,北京展览爬取连续 19 天失败,之前误判为 Key 未配置,实际是配额耗尽
⚠️ Symlink 维护原则(2026-04-25)⭐ 铁律
核心原则:
- 记忆初始化脚本必须同步更新 symlink
-
今天.md和昨天.md必须指向正确日期的文件 - 过期 symlink → 读取错误文件 → 记忆不准确
正确做法:在 memory_daily_init.sh 末尾添加:
ln -sf "${TODAY}.md" "${MEMORY_DIR}/今天.md"
YESTERDAY=$(date -d 'yesterday' '+%Y-%m-%d')
ln -sf "${YESTERDAY}.md" "${MEMORY_DIR}/昨天.md"
教训:2026-04-18 至 04-25,symlink 过期 7-8 天,导致读取错误文件
⚠️ 无效循环检测原则(2026-04-26)⭐ 铁律
核心原则:
- 连续 3 天重复相同问题 = 无效循环,必须改变策略
- 区分"可自动修复"和"需用户决策"两类问题
- 可自动修复 → 直接在进化报告中执行修复
- 需用户决策 → 汇总后发送一次性通知,不每日重复
正确做法:
- 每次进化报告检查:此问题是否连续 3+ 天出现?
- 如果是 → 分类:可自动修复 or 需用户决策
- 可自动修复 → 立即执行修复并验证
- 需用户决策 → 发送一次汇总通知,后续报告只记录天数不展开
教训:2026-04-20 至 04-26,连续 7 天进化报告重复记录 Tavily 432 和 symlink 问题,无任何进展
⚠️ Git 提交原则(2026-04-25)⭐ 铁律
核心原则:
- 每日进化报告流程末尾必须执行 Git 提交
- 配置变更、数据变更、记忆文件变更都应及时提交
- 未提交 = 未持久化
正确做法:每日进化报告末尾执行:
cd /root/.openclaw/workspace/travel
git add -A && git commit -m "chore: 每日自动提交 ($(date +%Y-%m-%d))" && git push
教训:68 个文件积压未提交,配置变更未持久化到版本控制
⚠️ Cron 执行验证原则(2026-04-24)⭐ 铁律
核心原则:
- "API Key 已配置"≠"系统正常运行"
- "本地正常"≠"cron 正常"
- 日志文件断档 = cron 任务未执行
- 不能只看环境变量,必须验证日志文件是否按时生成
正确做法:
# ✅ 正确:检查每日日志文件是否存在
ls -la beijing-exhibitions/logs/daily_$(date +%Y%m%d).log
# ✅ 正确:检查日志是否有当日条目
grep "$(date +%Y-%m-%d)" beijing-exhibitions/logs/cron.log
# ✅ 正确:手动执行验证
bash /root/.openclaw/workspace/travel/beijing-exhibitions/scripts/daily_cron.sh
教训:2026-04-06 至 04-24,北京展览爬取连续 18 天无日志,TAVILY_API_KEY 已配置但脚本未执行
✅ 自动化技能就绪(2026-04-07)⭐
三个自动化技能已测试通过并就绪:
| 技能 | 功能 | 集成状态 |
|---|---|---|
| evolution-report-validator | 读取昨日进化报告,提取明日计划,检查 task.md 执行状态 | ✅ 就绪,待集成到每日进化报告流程 |
| data-anomaly-escalator | 读取历史数据,检测连续异常天数,自动升级告警 | ✅ 就绪,待集成到 daily_cron.sh |
| task-execution-tracker | 读取 task.md,计算执行率,生成告警 | ✅ 就绪,待集成到每日进化报告流程 |
集成待办:
- daily_cron.sh 在爬取完成后调用 data-anomaly-escalator
- 每日进化报告流程调用 evolution-report-validator 和 task-execution-tracker
🔧 工具选择原则(2026-03-06)⭐
- 所有网站 → Playwright(统一工具)
- 小红书 → 小红书 MCP 专用工具
- web_fetch → 仅作为备选
📝 Wiki Markdown 格式规范(2026-03-08)⭐
核心教训
❌ 错误:
- 表格前没有空行 → 渲染错乱
- 表格内用空行换行 → 表格错乱
- 子目录页面用 Markdown 相对路径 → 链接失效
✅ 正确:
- 表格前后必须有空行
- 单元格内换行用
<br> - 面包屑用 HTML 绝对路径:
<a href="/">Home</a> / <a href="/河北">河北</a>
📊 数据异常升级机制(2026-04-07)
| 连续异常天数 | 告警级别 | 动作 |
|---|---|---|
| 3 天 | 🟡 黄色 | P2 任务 |
| 5 天 | 🟠 橙色 | P1 任务 + 飞书通知 |
| 7 天 | 🔴 红色 | 紧急告警 |
异常判定:北京展览数据 < 15 个
📊 任务执行率告警(2026-04-07)
| 执行率 | 告警级别 | 动作 |
|---|---|---|
| < 20% | 🔴 红色 | 向用户坦白 |
| < 50% | 🟠 橙色 | P1 任务升级 |
超期规则:P1 > 24 小时,P2 > 48 小时
🧠 三层记忆法则
第 1 层 预防(写入时)
- 完成任务后立即写入
memory/YYYY-MM-DD.md - 长期经验写入
MEMORY.md
第 2 层 侦测(恢复时)
- Session 开始前读取:MEMORY.md + memory/昨天.md + memory/今天.md
第 3 层 兜底(执行时)
- 高风险操作前搜索记忆找约束
⚠️ MEMORY.md 瘦身原则(2026-05-05,05-08 再次清理)⭐ 铁律
核心原则:
- MEMORY.md 只存长期有效的原则和规则
- 空模板摘要不应写入 MEMORY.md(浪费 token)
- 每次进化报告检查 MEMORY.md 是否膨胀(> 15KB 应清理)
-
sync 脚本的空模板检测不够严格:模板中列表空项
-和1.会被判定为"有内容"
正确做法:
- sync 脚本应只追加实质性摘要(非全文),长度不超过 500 字
- 进化报告中如发现空模板累积,直接清理
- 每次清理后必须修 sync 脚本的检测逻辑
教训:
- 05-05 第一次清理(27KB→10KB),没修根因
- 05-06 第二次清理(13.8KB→11.3KB),修了空模板检测但不够严格
- 05-08 第三次清理(16.8KB→清理中),模板中列表空项绕过了检测
⚠️ 根因修复原则(2026-05-06)⭐ 铁律
核心原则:
- 修问题必须找根因,不能只修表面症状
- 如果同一问题反复出现,说明根因未解决
- 每次修复后必须问:是什么产生了这个问题?
教训:05-05/05-06/05-08 连续三次清理 MEMORY.md,说明 sync 脚本的检测逻辑始终没修好
🔍 旅行节奏模式(2026-05-05)⭐
核心观察:用户旅行期间交互模式为三阶段:
- 出行前:高频迭代(五一计划 v6.2→v8.0,8 个版本)
- 出行中:零交互(Day1-3 不需要 agent)
- 出行后:可能有反馈(需要等用户回来)
应用:
- 检测到用户在旅行中 → 进化报告精简版
- 预期出行后 1-2 天会有反馈交互
- 空转日不需要完整分析
⚠️ set-e + source bashrc 陷阱(2026-05-07)⭐ 铁律
核心原则:
set -e+source ~/.bashrc是致命组合- 在非交互 shell(cron/脚本)中,bashrc 的任何子命令返回非零都会导致脚本静默退出
根因:/etc/profile.d/colorxzgrep.sh 中 /usr/libexec/grepconf.sh -c 返回 exit 1
修复:将 source ~/.bashrc 移到 set -e 之前
教训:daily_cron.sh 连续 31 天"未执行":
- 04-07~04-18:误判为 API Key 未配置(12 天)
- 04-18~04-25:误判为 API 432 配额耗尽(7 天)
- 04-25~05-07:误判为脚本问题(12 天)
-
05-07 终于找到根因:
bash -e -x -c 'source ~/.bashrc'逐步调试
详细流程见 WORKFLOWS.md,配置见 TOOLS.md,规则见 AGENTS.md
最后更新:2026-05-08(MEMORY.md 第三次清理 + 新增 set-e bashrc 原则)
📅 2026-05-08 摘要
📋 今日任务
P1 任务(最高优先级)
- [ ]
P2 任务(正常优先级)
- [ ]
P3 任务(低优先级)
- [ ]
📝 工作记录
全天
| 时间 | 事件 | |——|——| | 00:00 | 记忆初始化成功(symlink 更新至 05-08) | | 03:10 | 记忆压缩成功 | | 09:00 CST | 北京展览爬取 cron 成功执行!13 个展览,飞书同步成功 ⭐ | | 19:25 UTC | 进化报告生成 |
里程碑
- daily_cron.sh 修复验证成功:05-07 修复的 set-e + source bashrc 问题,05-08 cron 正常触发并完成
- 展览数据 13 个(低于 15 个阈值,但 API 可用)
下午
晚上
✅ 已完成任务
| 时间 | 任务 | 状态 | 备注 |
|---|---|---|---|
| 00:00 | 记忆初始化 | ✅ | 正常 |
| 03:10 | 记忆压缩 | ✅ | 正常 |
| 09:00 | 北京展览爬取 | ✅ | 13个展览,cron修复验证成功 |
| 09:00 | 飞书同步 | ✅ | 文档更新成功 |
| 19:25 | 进化报告 | ✅ | 本报告 |
| 19:25 | MEMORY.md 第三次清理 | ✅ | 16.8KB→11.8KB |
⚠️ 经验教训
-
daily_cron.sh 修复已验证生效:05-07 修复 set-e + source bashrc 问题后,05-08 cron 正常触发并执行成功(日志文件
daily_20260508.log存在) -
MEMORY.md 空模板第三次涌入:sync 脚本的空模板检测不够严格,列表空项
-和1.绕过了检测逻辑 - 展览数据 13 个低于阈值 15:虽然 API 可用,但数据量仍偏少
🧠 三层记忆应用
第 1 层 预防(写入时)
- 长期记忆已更新(MEMORY.md)
- 今日记忆已创建
- 任务状态已记录
第 2 层 侦测(恢复时)
- 已读取 MEMORY.md
- 已读取昨日记忆(2026-05-07.md)
- 已读取今日记忆(2026-05-08.md)
第 3 层 兜底(执行时)
- 高风险操作前已检查记忆约束
- 不可逆操作前已确认
创建时间:2026-05-08 00:00:01 维护者:Travel Agent
⚠️ 自动任务记录 - 北京展览爬取(数据偏少)
时间:2026-05-08 09:00:02 状态:success 展览数量:13 个(低于正常值) 飞书文档:https://feishu.cn/docx/IIpVd0zDZoJgSSxPdsXc0DzHneh
待处理:检查数据源是否正常
📝 每日总结
✅ 今日完成
⚠️ 遇到的问题
🧠 经验教训
📋 明日计划
三层记忆检查清单
第 1 层 预防(写入时)
- 长期记忆(MEMORY.md)是否更新?
- 今日记忆是否完整记录?
- 任务状态是否已更新?
第 2 层 侦测(恢复时)
- Session 开始前是否读取了记忆?
- 是否检查了昨日记忆?
- 是否确认了今日任务?
第 3 层 兜底(执行时)
- 高风险操作前是否检查了约束?
- 不可逆操作前是否确认了?
- 是否有违反原则的情况?
最后更新:2026-05-08 23:00:01 维护者:Travel Agent