随着规模扩大,原始对话日志会变得难以阅读。在经过几个月的重度使用后,你面对的是成千上万行来回对话。搜索它们很慢,阅读它们则是不可能的。相比之下,Obsidian vault 为你提供了结构化的长期记忆:双向链接、标签以及能揭示关联的关系图谱。两者之间的差距显而易见。缩小这一差距需要自动化。

我构建了一个小型流水线,每天晚上都会自动弥合这一差距。它按顺序运行三个步骤,无需人工干预。首先,它采集最新的对话导出文件,并将其刷新到当前状态。其次,它通过 Claude 提炼过去 28 小时的原始对话,并将结构化的摘要直接追加到 Obsidian vault 中。这 28 小时的时间窗口是经过深思熟虑的;它涵盖了完整的前一天,并为延迟预留了一点缓冲。第三,它通过将更改提交并推送到私有仓库来备份所有内容,该仓库既充当离线存储,也作为误删保险。整个链条必须是枯燥且可靠的。枯燥的自动化才是目标。

当 macOS 静默终止你的脚本时

每日定时任务最大的敌人不是剧烈的崩溃,而是沉默。

在 macOS 上,“文档”文件夹受到 TCC 的保护,这是把守敏感位置访问权限的隐私子系统。如果你通过 launchd 调度脚本,系统可能会直接拦截该进程,而不会抛出任何你会注意到的错误。你的日志文件会保持为空,你的 vault 也永远不会更新。任务失败了,但你只有在几天后意识到笔记已过时时,才会发现这个缺口。

我通过严格的预检程序来处理这个问题。在正式工作开始之前,脚本会尝试在目标目录内进行一次无害的写入操作。如果 macOS 拒绝了该操作,失败会被立即捕获,并触发响亮的桌面通知。不会有静默退出。接下来,shell 解释器本身需要在“系统设置”中获得“完全磁盘访问权限”。由于该权限非常粗放,我通过将所有自动化脚本完全放在受保护的“文档”文件夹树之外来尽量减少暴露。它们存放在其他地方的一个专用目录中,并显式引用 vault 路径。这种早期检测、响亮警报和谨慎文件夹放置的组合,解决了静默终止的问题。

针对睡眠、超时和冻结任务的设计

笔记本电脑会进入睡眠,网络会发生抖动,API 调用会挂起。单个冻结的任务不应无限期地阻塞整个系统。

我使用了四种实用的机制来保持流水线的稳定。

多个时间段。 调度器不再把所有赌注都押在清晨的一次运行上,而是在一天的不同时间点再次尝试。如果机器在黎明时分处于关闭状态,下午的时间窗口仍能捕捉到任务。

完成标记。 当运行成功时,它会留下一个清晰的足迹。下一次计划的尝试会首先检查该标记。如果工作已经完成,它会在几秒钟内干净利落地退出。这可以防止不必要的 API 调用和冗余处理。

通过 mkdir 实现文件锁。 为了避免重叠执行,我使用基于目录的锁。在本地文件系统中,创建目录是原子性的,因此两个同时运行的任务无法占用同一个锁路径。如果目录已存在,第二个实例会立即中止。当第一个任务完成时,它会删除该目录。这比 PID 文件更轻量,也更难