RIL(Read It Later,稍后读)
> 核心一句话:用户发任何 URL / 文章 / 图片 → 静默入库到本地 Read Later.md → 只回一行 ✅ 已收到。不打摘要、不问选项、不展开、不打扰。
0. ⛔ 铁律(必读,写在第一行防漏看)
- ✅ 任何 URL = 默认 RIL(2026-07-15 11:16 安先生拍板终版,无需触发词)
- ✅ chat 回复固定一行:
✅ 已收到或✅ 已处理 - ❌ 禁止在 chat 发摘要 / 分类 / URL 回顾 / 标题
- ❌ 禁止问"是 RIL 还是想聊聊" / "要不要展开" / 多选项
- ❌ 禁止把 "RIL" 当 Reliance Industries(信实工业) briefing 触发
- ❌ 禁止入库前给"下一步建议 / 关联 RIL 表格 / 与用户相关性"
判别口诀:
> "用户发 URL / 文章 / 图片? → 静默抓 → 静默写文件 → 静默分类 → 静默标签 → 一行 ✅ → 完。没有别的动作。"
1. 适用场景
| 触发形式 | 用户意图 | 处理动作 |
|---|---|---|
RIL [URL] |
保存这个 URL | web_fetch → 分类打标签 → 写文件 → ✅ |
RIL [文章/文本] |
保存这段内容 | 解析内容 → 分类打标签 → 写文件 → ✅ |
RIL [图片] |
保存这张图片 | image 分析 → 写文件 → ✅ |
任何 URL 单独(无 RIL / 无问题) |
默认 RIL(2026-07-15 终版) | 同上 |
URL + 显式问题/指示文本 |
想讨论 / 分析 | 正常聊天:读 URL + 回答问题(非 RIL) |
RIL 单独(无内容) |
想存东西但没带 | 写占位条目(标题="空 RIL")→ ✅ |
关键判别(2026-07-15 11:16 用户拍板):
> "以后但凡我发给你的 URL,你都默认为是 RIL 就好了,我也不再添加 RIL 的提示。如果有特殊需求,我会跟你讲的。"
2. 工作流(必走的 5 步)
Step 1:识别 + 解析内容
# 伪代码
content = extract_url_or_text(message) # URL / 图片 / 文本
if is_empty(message):
create_placeholder_entry() # 标题="空 RIL"
Step 2:抓全文(URL)/ 分析(图片)
- URL →
web_fetch(LLM-driven 网页提取) - 图片 →
image工具(vision model) - 文本 → 直接入库,无需抓取
Step 3:标题硬规则(2026-07-09 22:10 用户拍板)
| 情况 | 标题写法 |
|---|---|
| ✅ web_fetch 拿到原文标题 | 直接用原文标题(不改写、不添加) |
| ⚠️ 抓取失败,但有作者 bio / 账号画像 | 基于已知信息写一个内容向标题 |
| ⚠️ 抓取失败,信息极少 | 基于最少信息写方向性标题,末尾加"(全文待补)" |
禁止:
- ❌ "XXX 推文" / "XXX 的内容" / "未命名" / "TBD"
- ❌ 把 URL slug 当标题(如 https://x.com/xxx/status/123)
- ❌ 只写"作者 + 转推"格式(不推荐)
Step 4:写入文件
- 文件路径:
/Users/alonan/AlonDocs/05_Resources/RIL/Read Later.md - 追加位置:按时间倒序追加到末尾
-
条目格式(详见 §3.4.2):
```markdown
## YYYY-MM-DD HH:MM — 标题 -
URL: ...
- 分类: 工具 / AI
- 标签: ai, productivity
- 状态: 📖 待读
### 摘要(M3 总结)
- 要点 1
- 要点 2
### 原文片段(保留前 1500 字)
> ...
```
Step 5:chat 回复(一行)
✅ 已收到
或:
✅ 已处理
只此一行。❌ 不展开标题、URL、分类、摘要。
3. web_fetch 失败兜底(2026-07-20 11:19 立,2026-07-15 11:16 强化)
触发场景:web_fetch 抓取失败(x.com block / 4xx / 5xx / 反爬墙 / 网络中断 / paywall 等)
强制要求:
1. ❌ 禁止因为失败就放弃整个 RIL 流程
2. ❌ 禁止给用户报"抓不到、要不要换源、要不你手动复制"等多选项
3. ✅ 必须继续往下走,写一个最小化条目(含 URL + 作者 + 状态 📖 待读 / ⚠️ 全文未抓取 + 标签含 待补全文 + 抓取说明段)
4. ✅ 必须回 ✅ 已收到 一行
已知会 block 的域名:
- x.com / twitter.com — OpenClaw runtime 网络层拦截
- youtube.com / youtu.be — 部分视频需要登录/地区限制
- medium.com — 部分 paywall
- 微信公众号文章链接 — 反爬强
正面参考:2026-07-17 08:54 @0xluffy_eth 案例(同因 block,agent 走完"最小化条目 + 注明原因 + 补救路径"流程,没卡)。
4. 查询触发("打开稍后看")
触发词:
- "打开稍后看"
- "show read later"
- "打开稍后阅读"
- "RIL 列表"
预期输出格式(2026-07-09 22:08 用户拍板):
📚 稍后看清单 · 共 N 条 · 待读 X / 已简要 Y
| # | 标题(点击打开) | 分类 | 状态 | 一句话摘要 |
|---|---|---|---|---|
| 1 | [**标题文字**](URL) | 投资/退休 | 📖 | 一句话超短摘要 |
| 2 | ... |
状态图例:
| 图标 | 名称 | 触发条件 |
|---|---|---|
| 📖 | 待读 | 入库后还没展开读全文 |
| ✅ | 已简要 | 已出过 briefing 摘要,但还没点开原文读 |
| ⭐ | 已读 | 点开过原文读完(目前 0 条) |
字段优先级(用户在意):标题(必带超链接)→ 一句话摘要 → 状态 → 分类
字段黑名单:❌ 作者、❌ 互动数(likes/replies/views)、❌ 时间、标签默认隐藏
辅助查询脚本:scripts/ril_query.py(按分类 / 状态 / 标签筛选)
5. ⛔ 反模式(绝对禁止)
反模式 1:入库前给摘要 / 选项
# ❌ 错
"我看到了一个 SVScholar 关于寿险的文章,要不要我展开讲讲?
还是先存着回头看?或者对比下其他文章?"
# ✅ 对
(静默抓全文 → 写文件 → 一行 ✅)
反模式 2:把 RIL 当 Reliance briefing
# ❌ 错
"RIL 是 Reliance Industries Limited,印度信实工业。
最近股价 X 卢比,要不要看 AGM 速览?"
# ✅ 对
(RIL = 100% 稍后读,无例外)
反模式 3:web_fetch 失败就卡住
# ❌ 错
web_fetch 返 "Blocked" → 报给用户"抓不到,要不要换源?"
# ✅ 对
web_fetch 失败 → 写最小化条目 → ✅
反模式 4:入库后还复述标题 / URL
# ❌ 错
"✅ 已收到。已存《如何购买人寿保险》https://x.com/..."
# ✅ 对
"✅ 已收到"
反模式 5:空 RIL 追问
# ❌ 错
"你说 RIL 但没带内容,想存什么?"
# ✅ 对
"✅ 已收到" + 占位条目
6. 配套基础设施
6.1 数据文件
- 路径:
/Users/alonan/AlonDocs/05_Resources/RIL/Read Later.md - 历史数据:57+ 条(截至 2026-07-24)
- 结构:每条
## YYYY-MM-DD HH:MM — 标题块 + 元数据 + 摘要 + 原文片段
6.2 每日 21:20 提醒 cron
- 脚本:
~/.openclaw/workspace/productivity/bin/ril-daily-reminder-2120.sh - 调度:macOS 系统 crontab(不是 openclaw cron,走 Aqua session 才能用 osascript 本地通知)
- 推送通道:macOS 本地通知(osascript → Notification Center),不准改回 iMessage / 飞书 / 微信(2026-07-12 22:46 安先生拍板)
6.3 iMessage cron 兜底
- cron ID:
memo-imsg-watch(9dbb73b8-...) - 职责:每 5min 扫 iMessage,URL-only 消息自动按 RIL 流程入库
- 2026-07-26 08:20 改造:prompt 加 ack-skip 逻辑(避免 double-ack)
6.4 dispatcher 路由
- dispatcher agent:iMessage 入口唯一 catch-all
- 触发分支:
^(?i)(稍后读|read\s*later|ril|待读)或^https?://\S+\s*$→ RIL agent - 2026-07-27 17:12 立:dispatcher 是新建 agent(之前不存在),main agent 终于能收到 iMessage
7. 设计文档(唯一权威)
~/.openclaw/workspace/files/productivity/read-later-system.md §3.3 / §3.3.1 / §3.3.2 / §3.4 / §3.5
> 本 SKILL.md 是 fleet-wide 入口规范;上述设计文档是单条条目的完整规范。两边不一致时以设计文档为准。
8. 历史教训(踩坑汇总)
| 时间 | 错误 | 修正 |
|---|---|---|
| 2026-07-09 08:12 / 08:15 / 15:01 / 15:07 | RIL 误判为 Reliance briefing(4 次) | 21:46 立"RIL = 100% 稍后读"规则 |
| 2026-07-13 07:33–07:59 | 8 次 RIL 入库前给长篇分析 + 3-4 个选项 | 11:15 立"入库前静默"规则,11:20 升 fleet-wide |
| 2026-07-13 11:11 | 用户明确投诉"已讲过很多次" | 11:20 加 dispatcher / 所有 channel 都要遵守 |
| 2026-07-15 08:08 / 08:14 | URL 单独发送被误判"想讨论"(2 次 4-section 解读) | 08:21 立"URL 单独 = 隐性 RIL" |
| 2026-07-15 11:16 | 用户拍板"任何 URL = 默认 RIL" | 规则终版:URL = 默认 RIL,无需触发词 |
| 2026-07-20 11:15–11:18 | web_fetch 失败后 agent 卡住,4 分钟没回 | 11:19 立"web_fetch 失败兜底"必走"最小化条目 + ✅" |
| 2026-07-26 07:41 | iMessage URL-only 漏到 main agent → 长篇 briefing | 08:20 改造 memo-imsg-watch cron 加 RIL fallback |
| 2026-07-28 09:03 | dispatcher LLM 自动生成"Routed to RIL" status 文本 | 立"中间 agent status 永不入用户渠道"规则(NO_REPLY) |
9. 相关文件
- 数据文件:
/Users/alonan/AlonDocs/05_Resources/RIL/Read Later.md(2947 行) - 设计文档:
~/.openclaw/workspace/files/productivity/read-later-system.md(唯一权威,221 行) - 辅助脚本:
scripts/ril_query.py(按分类 / 状态筛选) - 配套 cron:
productivity/bin/ril-daily-reminder-2120.sh(21:20 提醒) - MEMORY.md 同名段:
MEMORY.md§"🚨 RIL 触发词 = 100% 稍后读,无例外" + §"🚨 任何 URL = 默认 RIL,无需触发词" - AGENTS.md §9 永久规则:RIL 触发 = 100% 静默入库 + 一行 "✅ 已收到"