定时触发
launchd · 20:57 每晚
1定时触发
launchd · com.zen.daily-digest
macOS 后台任务调度器 launchd每晚 20:57 唤醒一个名为 com.zen.daily-digest 的作业,运行脚本 bin/run-digest.sh选在这个时间点,是为了让 Zen 当晚就能读到今日情报,并有机会在睡前试一试“今日上手”里的那件小事。
为何这样设计用系统级定时任务而非人工触发,保证即使无人操作,每天也有一期见报。
唤起编辑部
claude -p · headless
2唤起编辑部
run-digest.sh → claude -p
run-digest.sh 以无头模式(claude -p --dangerously-skip-permissions)唤起 Claude Code,交给它 /daily-digest这份技能说明就是本报的“AI 编辑部”:没有编辑室,没有值班人,只有一份写清楚流程的技能文件,和一次性运行的无头进程。
为何这样设计无头运行意味着当晚很可能连不上浏览器(小红书/X 需要登录态的 Chrome 会话),所以编辑部必须首先保证“常驻无头”的两条带能扫到东西——见下一版。
扫读两带
headless × 2 ・ enrichment × 2
3扫读 · 常驻无头双带
YouTube ・ 文摘/Digest
YouTube(9 频道)
通过 RSS 抓取近 48 小时更新,长视频用 yt-dlp取全文转录,由编辑部代读——Zen 不必自己看完每一条长视频。
frontier: Karpathy / Anthropic / OpenAI / Dwarkesh builder: AI Engineer / Latent Space pm-strategy: Lenny's / No Priors curator: Zara Zhang
文摘 / Digest(5 源)
全部走 RSS / 前端页面,headless 可达,不依赖任何登录态——正是这条带的存在,让 9 点无浏览器的自动跑也能凑齐“≥2 来源平台”,几乎不必触发 partial。
Hacker News (front page) ・ Import AI ・ TLDR AI ・ Latent Space(newsletter)・ Simon Willison
为何这样设计YouTube + 文摘两条带都不需要浏览器登录态,是“打不开 Chrome 也能成报”的底线保证。
4扫读 · 选配增强带
X ・ 小红书 · 需要 Chrome,可跳过
X(选配增强)
已登录的 x.com 时间线 + 逐账号页面,用 get_page_text读取推文正文与互动数。仅当 Chrome/claude-in-chrome 可用时才尝试;无头跑通常会跳过。
karpathy ・ simonw ・ swyx ・ bcherny ・ zarazhangrui ・ AnthropicAI ・ OpenAI
小红书 / XHS(选配增强)
同样依赖已登录的浏览器会话,一旦不可达即跳过,不影响成稿——只要 YouTube + 文摘两条底线带已经达标。
⚠ 这两条带明确标注为“可选增强”:能扫到就更丰富,扫不到不拦发布。
提炼成稿
择要 · 去重 · 加料
5提炼
编辑部对当晚扫到的所有条目择要,跨平台去重(一事一处,同一件事在多条带出现时择强合一),归纳出“今日可行动”的具体动作项,并写一段本报社评。
6加料
在正文之外再加四样:头版要图;“今日上手”——一件今晚就能试的具体小事;编辑部 OTA 自我升级(今日所学 + 新增能力);以及全字段的 _en双语版本,供中英切换按钮读取。
为何这样设计本报每天真正“学习”的不是读者,而是 Zen 的 Claude Code:每期 OTA 先读 ota-ledger.md 台账,挑一个建立在昨日之上、不重复的能力落地实现,再追加回台账——能力逐日复利。选题也偏向 AI 的应用 / GTM / 产品面,因为那正是能直接迁进 Zen 工作的部分。
7成稿
digests/YYYY-MM-DD.json
编辑部把当晚的所有内容写成一份 digests/<date>.json,并把这一天追加进 digests/index.json索引——首页正是靠这份索引找到“最新一期”和“往期合订本”里的每一天。
◆ 多样性闸门bin/validate-digest.py
发布前,bin/publish.sh 会先跑 bin/validate-digest.py做“来源多样性校验”——防止一期报纸只靠单一来源撑起门面。
| 门槛 | 要求 |
| 来源平台数 | ≥ 2 个不同 platform(各至少 1 条) |
| 总条目数 | ≥ 4 条 |
- 达标 → 正常发布,闸门放行。
- 不达标但真的只够 1 个平台(例如纯无头跑,YouTube 都没扫到东西)→ 顶层字段 "partial": true → 首页顶部带出“⚠ 本期部分来源缺席(无头运行),稍后补全”的横幅照常发出,留待下一次交互式运行补全。
- 既不达标、又没设 partial → 发布被直接拦截,退出码 1。
发布晋级
preview → 人工晋级
9预览发布
bin/publish.sh
闸门放行后,publish.sh 执行 git commit,随后 vercel deploy——注意这是 PREVIEW部署,从不直接碰生产环境。
10人工晋级
次日,Zen 审阅这份预览,确认无误后手动执行 vercel --prod,报纸才真正上线 mrqb.space。全流程唯一的人工步骤,就是这最后一次“点头”。
为何这样设计AI 编辑部可以自动写稿、自动校验、自动发预览,但“公开上线”这一下,永远留给人来按。