# reader 日报链路在 OpenClaw/Feishu 外层执行中被 SIGTERM 截断 ## 背景 2026-04-06 在 OpenClaw 中执行 reader 日报流程时,出现多次“前半段有产物、最终产物缺失”的现象。 典型表现: - 能生成 `raw/freshrss.raw.json` - 能部分生成 `extracted/item-xx.extracted.json` - 但经常拿不到: - `run-report.json` - `candidates/openclaw-delivery-payload.json` - `candidates/digest-brief.json` - 外层日志多次出现 `Exec failed (..., signal SIGTERM)` ## 已确认结论 ### 1. RSS 抓取与排序正常 已确认: - FreshRSS API 正常 - 原始 raw 数据能拉到 - 默认排序正常(默认相当于 `r=d`,新到旧) 因此问题不在: - RSS 接口 - 鉴权 - 排序规则 ### 2. reader 前半段模块正常 已确认: - 单篇 summary 能成功 - 单篇 filter + candidate 构建能成功 因此问题不在: - summary 模块整体损坏 - candidate 构建整体损坏 ### 3. 真正问题在长链路执行方式 更合理的判断是: > 整条 reader 日报 pipeline 是长串行任务,在 OpenClaw / Feishu 当前这条外层执行链路里,容易被外层执行环境提前 `SIGTERM`。 也就是说: - 不是 reader 总是自己抛 Python 异常退出 - 更多是脚本尚未跑完,外层执行会话先被终止 ## 关键认知 当天很多排障与补跑步骤,实际不是通过稳定常驻的 MCP 服务在跑,而是直接执行 reader 仓库里的 Python 脚本: - `python scripts/run_freshrss_pipeline.py` - `python scripts/run_article_summaries.py` 因此更准确地说: > 当前 reader 正式日报运行入口偏 CLI/脚本模式,而不是稳定 MCP 服务调用模式。 这也是为什么长任务更容易受外层 exec 生命周期影响。 ## 为什么前几次没问题 可能原因: 1. 之前任务更短、内容更轻,刚好能在外层执行环境截断前跑完 2. 之前不是链路天然稳,而是还没撞上边界条件 3. 当前正式链路缺少稳健的断点恢复能力,因此一旦遇到较重任务,就暴露出问题 ## 当天动作记录 ### 做过的排查 - 确认 FreshRSS 默认排序 - 确认 raw 文件能生成 - 确认 extracted 文件能部分生成 - 单独验证单篇 summary 成功 - 单独验证单篇 filter / candidate 成功 ### 做过的临时修复 当天曾尝试加入: - `--resume` - 中间产物复用 - 断点恢复思路 目的是降低 SIGTERM 后的损失。 ### 当前状态 这些临时代码修改已全部回滚,reader 工作区已恢复干净。 ## 当天结果 虽然正式链路异常,但通过手工恢复推进,最终仍补齐了: - `candidates/openclaw-delivery-payload.json` - `candidates/digest-brief.json` - `run-report.json` 当天最终保留文章: - 1 - 3 ## 后续建议 ### 短期 - CLI 仅保留为 debug / fallback - 不再把正式生产日报流主要建立在长脚本入口上 ### 中期 - 将 reader 作为正式 MCP 服务 - OpenClaw 正式通过 MCP tool 调用: - `run_freshrss_openclaw_pipeline` - `generate_article_summaries` ### 长期 让 reader 的正式能力具备: - run_id - status 查询 - resume - 中间产物复用 - 分阶段补跑