Daily News Digest
实时演示 conventions/ 中全部四条工程公约的完整集成:
- state-file-pattern — STATE.md 跨运行状态
- control-flow-separation — 抓取用代码 / 摘要用 LLM
- maker-checker — Checker 五维验证摘要质量
- error-compact-pattern — 错误不炸上下文
工作流
Step 1: 读取状态(确定性)✅
从 STATE.md 读取上次运行状态和 idempotency keys。
Step 2: 抓取 RSS(确定性)✅
# 零 LLM 成本。只处理上次运行后新增的文章。
import feedparser
for url in RSS_SOURCES:
feed = feedparser.parse(url)
new = [entry for entry in feed.entries
if entry.id not in state.get("idempotency_keys", [])]
Step 3: LLM 摘要(概率性)❌
# 每日限 5 篇,控制 token 开销。
for article in new[:5]:
summary = await llm.complete(
f"按三点总结,每条不超过20字:\n标题:{article.title}\n{article.description}"
)
Step 4: Checker 验证(概率性)❌
独立 Agent 对摘要做五维评分,≥ 40/50 PASS。
Step 5: 更新状态(确定性)✅
state["progress"]["articles_summarized"] += len(passed)
state["idempotency_keys"].extend([a.id for a in processed])
atomic_write("STATE.md", state) # 原子写入 + 文件锁
错误处理
# 按 error-compact-pattern 压缩错误
try:
feed = feedparser.parse(url)
except Exception as e:
compact = f"[STEP_FAILED] fetch_rss@{now}\n Error: {type(e).__name__} - {str(e)[:80]}\n Recoverable: YES (retry with backoff)"
context.append(compact)
输出格式
# 新闻摘要 {YYYY-MM-DD}
## 📰 {article.title}
- {point 1}
- {point 2}
- {point 3}