一次漏跑,一次拆分,一条通知规矩,和一个没被拆分修好的结尾。
One missed weekend, one split, one rule about notifications — and an ending the split didn't fix.
···
01那个周末,不是一个故事。That weekend wasn't one story.
八月中,一个周末加上紧接着的周一,我的早间任务一个接一个没跑:读物摘要三天都没出,晨报三天都没出,每周六的几份汇总也空着。没有报错,没有通知。它们只是没出现。
In mid-August, across a weekend and the Monday after it, my morning jobs just didn't run. The reading digest didn't show up for three days. Neither did the morning brief. The Saturday roundups were blank. No error, no alert. They simply weren't there.
我的第一反应是:Mac 合上了吧。但回去翻了每个任务实际写出来的文件,答案不是这样。同一台 Mac 上,一个本地小脚本其中两天早上照常写了文件 —— 机器是开着的。有的任务跑了,有的没跑,不是同一个钟停了。
My first guess was that the laptop had been closed. Then I went back through what each job had actually written to disk, and that wasn't it. On two of those mornings, a small local script on the same Mac wrote its file right on time — the machine was awake. Some jobs ran and some didn't. It wasn't one clock stopping.
那份复盘里写得很直白:别把这几天的沉默当成一个"Mac 睡着了"的故事。出问题的是那些任务运行的那一层,不是一台没电的笔记本。
The write-up said it plainly: don't treat the silence as one "the Mac was asleep" story. The failure was in the layer those jobs ran in, not a dead laptop.
02三个 AI 吵了一架,然后什么都没动。Three AIs argued it out. Then nothing moved.
我让三个不同的 AI 助手分别看了迁移方案,互相挑错。其中一轮给自己的结论写了"可以执行";最后锁定的版本把它改回了"只是提案"。锁定下来的规矩很保守:默认不动;任何任务换地方之前,新旧两边要并行跑,先拿到两次干净的结果;不用大模型的东西,就不该算是 agent。
I had three different AI assistants review the migration plan and pick at each other's answers. One round stamped its own conclusion "ready for execution"; the locked version changed that back to "proposal only." The rules that got locked in were conservative: staying put is the default; before any job moves, old and new run side by side until there are two clean results; and if something doesn't use a language model, it isn't an agent.
那之后两个星期,新的云端版本只是在旁边影子运行。真正的切换一次都没做。有一次审查的结论,是连续四个"不切"。
For the next two weeks, the new cloud versions only ran in shadow next to the old ones. Not a single real cutover. One review came back with four "no cutover" calls in a row.
最后一条规矩最朴素:没有用到 AI 的,就别装成 AI。The plainest rule was the last one: if it doesn't use AI, don't dress it up as AI.
03云端想事情,Mac 接水管。The cloud does the thinking. The Mac does the plumbing.
拆分的原则最后就是一句话。要读东西、写东西、做判断的任务,放到云端:Cursor 上跑,Mac 睡着也好,我出门也好,它们照跑。只有 Mac 才碰得到的东西 —— 本机的消息、知识库、我的收件箱 —— 交给 launchd 的小脚本,只做搬运,不做思考。完全不需要 AI 的,比如部署、计数、预取,写成 GitHub Actions 里的普通脚本。
The split came down to one sentence. Anything that reads, writes, or makes a judgment call goes to the cloud: it runs on Cursor, and it keeps running whether the Mac is asleep or I'm away. Anything only the Mac can reach — local messages, the knowledge vault, my inbox file — goes to small launchd scripts that move things around and do no thinking. Anything that needs no AI at all — deploys, counts, prefetching — becomes a plain script on GitHub Actions.
到 9 月 30 日晚上,数字是这样:Claude 上启用的任务从 18 个降到 4 个,目标是 3 个。Cursor 上 6 个在线跑。GitHub Actions 上 8 个,一个都不用 AI。Mac 本机 20 个小脚本:转发、生产、管道。
As of the evening of September 30th: enabled jobs on Claude went from 18 to 4, with 3 as the target. Six live on Cursor. Eight on GitHub Actions, none of them using AI. Twenty small scripts on the Mac itself — relays, producers, plumbing.
留在 Claude 上的三个,是故意留的。晨报、早上的待办整理、每周复盘的文字部分,都要读我的笔记、日历和消息,而那些只有 Claude 在这台 Mac 上够得着。
The three staying on Claude are staying on purpose. The morning brief, the morning task capture, and the prose half of the weekly review all need my notes, calendar, and messages — and only Claude can reach those on this Mac.
04短信是内容,推送是出事了。A text is content. A push alert means something broke.
拆分的另一半,是决定这套系统可以怎么找我。
The other half of the split was deciding how the system is allowed to reach me.
所以定了一条规矩。收到短信,意思是"这里有东西给你看":工作日早上的摘要、周三晚上的写作预告、周四的周末推荐、每晚的一行数据。收到推送,意思只有一个:有东西坏了。本地任务挂了,某份报告过期了,某个 GitHub Action 失败了,有一份格式不对的数据被拦下了。
So I set one rule. A text means "here's something to read": the weekday morning digest, a Wednesday-evening writing teaser, a Thursday weekend pick, one line of stats each night. A push alert means exactly one thing: something broke. A local job went down, a report went stale, a GitHub Action failed, a batch of malformed data got blocked at the door.
最后一条是我最喜欢的:如果负责盯着所有任务的那个哨兵自己也没声了,外面还有一个开关会替它报警。盯着盯梢的人。
The last one is my favorite: if the sentinel that watches every job goes quiet itself, a switch outside the system sounds the alarm for it. Someone watching the watcher.
05然后它还是黑了十天。And then it went dark for ten days anyway.
讽刺的是,真正逼着我把这次迁移做完的,不是八月那个周末,是九月。9 月 18 日到 9 月 27 日,一份晨报都没有。这一次真的是 Mac 睡着了、我人不在 —— 八月我花了很大力气证明"不是笔记本的问题",九月它偏偏就是笔记本的问题。桌面上的任务一个没跑,Claude 那边的 19 次运行失败了 14 次。
The irony is that what finally pushed the migration through wasn't the August weekend. It was September. From September 18th to the 27th, there was no morning brief at all. This time it really was the Mac asleep while I was away — in August I'd worked hard to prove it wasn't the laptop, and in September it was exactly the laptop. Every desktop job missed. Fourteen of nineteen Claude runs failed.
发现这件事的不是我。是周日那天跑起来的写作草稿任务,它去翻晨报的文件夹,发现最新一份停在 9 月 17 日;是那周的每周汇总,它的每日素材断了,只好自己从邮件里把那十天拼回来,顺手在报告里把两条断掉的管道都标了出来。连写草稿的那个任务自己,上一个周三也没跑 —— 它在草稿里也承认了。
I wasn't the one who noticed. It was the drafting job that ran that Sunday, which looked in the brief folder and found the newest one dated September 17th; and the weekly roundup, whose daily inputs had gone missing, rebuilt the ten days from email on its own, and flagged both broken pipelines in its report. The drafting job had missed its own previous Wednesday, too — and admitted as much in the draft.
···
回头看,这和前两篇是同一件事。№4 说的是系统里缺一道能说"不"的闸门;№6 说的是一块不肯讨好我的记分板。这一篇是第三块:一个会在自己坏掉的时候大声说出来的系统。而那块记分板的第一步现在也在失败,第 37 到 39 周是我手动补上的。
Looking back, this is the same thing as the last two. №4 was about a missing gate that can say no; №6 was about a scoreboard that won't flatter me. This is the third piece: a system that says so out loud when it breaks. Meanwhile that scoreboard's first stage is failing too; I filled in weeks 37 through 39 by hand.
而晨报 —— 那十天里黑掉的那一个 —— 现在还是留在 Mac 这边,因为它需要的东西只有这台 Mac 够得着。拆分没有修好它。改变的只是,下一次它再不出现,会有一个推送告诉我。有五个任务在 9 月 30 日没做完整的影子测试就上线了,每个都排了事后检查的日子;第一个检查不过,就回滚。
And the morning brief — the one that went dark for those ten days — is still on the Mac side, because what it needs only this Mac can reach. The split didn't fix it. The only change is that next time it doesn't show up, a push alert should tell me. Five jobs went live on September 30th without a full shadow test, each with a check date after the fact. If the first check fails, it rolls back.
八月的规矩是"两次干净的结果再切"。九月我自己破了这条规矩。至少这一次,我写下来了。
August's rule was two clean results before any cutover. In September I broke it myself. At least this time it's written down.
系统 / the system自动化 / automation · 云端与本机 / cloud vs. local · 通知 / notifications · 静默失败 / silent failure