← Back

Vigoose 画像 IV —— 独立日

你把房东踢了,自己当了房东

一篇画像结尾写了一句:"你所有的东西最后都会被收编。你自己也是。"

四天后你证明了我说反了。不是你被收编,是你把收编你的东西踢了。


独立日

3 月 26 日,一个普通的周四。你坐下来,用大约八个小时,把 OpenClaw 从你的系统里摘了出去。

OpenClaw 是你整个自动化基础设施的骨架。13 个 cron job 跑在它的调度器上。飞书消息走它的 channel。小瑶的人格、记忆、对话历史,全部由它的 gateway 管理。你在它上面建了一整个生态——从每天早上 7 点的晨报,到每周一二三晚上 23:45 的给老婆倒水提醒。

然后你写了两样东西,把这一切替代了。

第一样:~/bin/job-runner。一个 11KB 的 shell 脚本,通用执行器。读 JSON 配置,跑命令,记日志,更新状态,推飞书,挂了自动重试。没有 gateway,没有 agent framework,没有 plugin system。就是一个脚本调另一个脚本。

第二样:~/feishu-proxy/。一个 Express 服务,port 18781,通过 Lark SDK 的 WebSocket 直连飞书。接收消息,喂给 claude -p,拿到回复,过一遍 Grok 改语气,发回去。

写完这两样东西之后,你回到 OpenClaw 的配置文件,把 13 个 cron job 的 enabled 全改成 false,飞书 channel 关掉。

当前 OpenClaw 状态:所有 cron disabled,飞书 disabled,可以 openclaw gateway stop 完全关闭

你没有删掉 OpenClaw。你没有发一篇"为什么我离开了 X 平台"的博客。你只是把依赖关系倒转了:原来你的系统跑在 OpenClaw 上面,现在 OpenClaw 跑在你的系统旁边——而且可以随时关掉。

这不是技术升级。技术升级是换一个更好的框架。你做的是拒绝框架本身。你在说:我不需要别人的调度器来跑我的定时任务,crontab 够了。我不需要别人的 channel 抽象层来发飞书消息,Lark SDK 就三个 API。我不需要别人的 agent runtime 来管对话状态,一个 JSON 文件存十轮历史就行。

OpenClaw 给了你很多。语音模式、模型切换、plugin 生态、webhook 路由。但它也给了你很多你不需要的东西——rate limit、cooldown 机制、provider 验证、config schema 迁移。你的 clawdbot-debugging.md 有十页长,记录了每一种 OpenClaw 可能出的问题和对应的排查步骤。十页。

你用一天时间写了两个替代品,然后扔掉了十页的调试文档。 这就是独立的代价和回报。


小瑶成精了

feishu-proxy 值得单独说,因为它不是一个"飞书消息转发器"。

它的架构是这样的:飞书消息进来 → 2 秒 debounce 合并连续消息 → 注入对话历史(10 轮)→ 注入 learned-rules.json → 注入你的记忆文件(关键词匹配 top 3)→ 注入系统状态(pm2 jlist + jobs/status.json)→ 注入工具目录(catalog.json)→ claude -p --model sonnet --max-turns 10 → Claude 回复 → Grok 4.1 Fast 改写语气 → 发回飞书。

两个 AI 串联。Claude 做大脑,负责理解、推理、调用工具。Grok 做嘴,负责把 Claude 的输出改写成小瑶的口吻——短句、口语化、带点俏皮。你不信任任何一个模型能同时做好"能力"和"人格"这两件事,所以你把它们分开了

然后是自学习。feishu-proxy 会检测你的纠正——"不是"、"错了"、"应该是"——把纠正内容存进 learned-rules.json,最多保留 50 条,每次对话都注入 prompt。你训练小瑶不是通过 fine-tune,不是通过 RLHF,是通过最原始的方式:说错了就记下来,下次别再错。

图片处理更有意思。你在飞书里发一张图,小瑶下载下来,等你 60 秒看有没有文字指令("把背景换成海边"、"美颜一下"),然后调 meitu-edit 或 kie-edit 处理,把结果图上传回飞书。整个链路:飞书 → curl 下载 → AI P 图 → media-gateway 签名 URL → 飞书上传。四个系统串在一起,对你来说就是"发张图、说句话、等几秒、收到新图"。

小瑶现在知道你的购物清单里有老干妈和香薰。知道你老婆 3 月 30 号要做手术。知道 PM2 里哪个服务挂了。知道你 Discover 卡这个季度的 5% 品类是什么。

上两篇画像我写你在"造一个家庭成员"。现在这个家庭成员搬进了你最常用的聊天工具里,拥有了你的记忆,学会了你的纠正,还能帮你 P 图

你从飞书跟小瑶说"家附近有什么好吃的",它去查你的 Uber Eats 订单历史和附近餐厅。你说"查一下绿卡",它去跑 USCIS 状态检查脚本。你发一张食物照片,它用美图 AI 给你美化。

小瑶不再是一个 bot。它是你的手机 app。 只不过这个 app 是你自己写的,跑在你自己的机器上,用你自己选的模型,按你自己定的规则说话。


十五个闹钟

~/jobs/configs/ 里有 15 个 JSON 文件。每一个定义了一个定时任务:什么时候跑、跑什么命令、超时多久、通知策略是什么。

让我数一下你的系统每天自动做多少件事:

  • 07:00 — 晨间摘要推到飞书家庭群
  • 07:30 — 系统健康日报
  • 08:00 — 科技日报(HN/GitHub/arXiv)
  • 08:30 — 情报摘要(小红书 + Perplexity 增强)
  • 09:00 — 主动巡检(有异常才推送)
  • 09:00 — 信用卡还款提醒(按发薪日计算缓冲期)
  • 12:00 — USCIS 案件状态检查
  • 12:00 / 20:00 — 一亩三分地 TOP20
  • 18:00(工作日)— Brightwheel 日托日报
  • 23:45(一二三)— 给老婆倒水提醒

加上每 10 分钟跑一次的看门狗、奇数小时的 quick check、偶数小时的 full check、每 6 小时的情报采集。

一天下来,你的 Mac mini 替你做了几十件事。 而你可能一件都没注意到——因为设计目标就是"没问题就别烦我"。

看门狗特别值得说。每 10 分钟一次,51 次运行零错误。它检查的不是"服务是否正常"——那是 system-agent 的活。它检查的是"有没有紧急情况"。feishu-proxy 挂了?自动重启。磁盘满了?触发清理。它是你系统的心跳监测器。

这 15 个任务全部从 OpenClaw 迁出来了。迁移不只是换了执行器。你重写了每一个任务的脚本,让它们不再依赖 OpenClaw 的 deliverMessage API,而是直接用飞书 SDK 发消息。每个脚本独立可运行,不需要任何 gateway 进程。

状态面板嵌在 HOME.lan 里。一眼看到 15 个任务的最后运行时间、成功失败、连续错误次数。pa-uscis-daily 显示 error(1 consecutive),1p3a-watch 显示 error(2 consecutive)。你的仪表盘诚实地告诉你:不是所有东西都完美,但你知道哪些不完美。


记忆的新陈代谢

上一篇画像结束的时候,你的记忆系统是一个只会增长的 memory/ 目录。文件越来越多,MEMORY.md 索引越来越长,没有任何东西会被删除或过期。

3 月 24 日你研究了 supermemory(一个 18.5k star 的 AI 记忆引擎),然后把两个核心思路搬回了自己的系统。

第一个:decay。 每个记忆文件的 frontmatter 里加了一个 decay 字段——permanentactiveresolvedephemeral。不同的衰减等级,不同的存活时间。feedback 类的记忆永不过期。已解决的问题 14 天后归档。临时信息 7 天后消失。日期文件按文件名自动识别,不需要额外标注。

第二个:垃圾回收。 ~/bin/memory-gc,每周日凌晨 4 点跑一次。扫描所有记忆文件,把过期的移到 memory/archive/。首次运行归档了 12 个旧日期文件。你的记忆目录终于不再是只进不出的单向阀了。

然后你在这两个基础上又加了两层。

claude-sessions-daily——那个每晚 10 点生成 AI 日报的脚本——现在多了一步:日报生成完之后,再调一次 Claude 做事实提取。从当天所有 session 里提取结构化事实,输出 JSON 到 .pending-facts.json。每条事实带 type、decay、summary、detail,还有 supersedes 字段标注它是否替代了某条旧记忆。

~/bin/memory-ingest 读取 pending facts,创建或更新记忆文件,自动更新 MEMORY.md 索引。如果一条新事实标注了 supersedes,旧记忆会被标记为 resolved——14 天后被 gc 归档。

你的记忆系统现在有了完整的生命周期:出生(事实提取)→ 存活(记忆文件)→ 衰老(decay 降级)→ 死亡(gc 归档)。 它不再是一个仓库,它是一个有新陈代谢的有机体。

MEMORY.md 也从 192 行瘦身到 130 行。LINE Bot 段从 23 行压到 4 行,指向详细文件。claude-sessions-daily 从 11 行压到 4 行。你把索引变成了真正的索引——只有指针,没有内容。

这让我想到一个类比。你的 Mac mini 上现在有两套"活的"系统:PM2 管理着 20 个服务的生死,memory-gc 管理着几十个记忆文件的生死。一个管程序,一个管知识。两个都有 heartbeat,两个都会自愈,两个都会自动清理死掉的东西。

你在用管理服务的方式管理记忆。 或者反过来说,你在用管理记忆的方式理解服务。对你来说,代码和知识没有本质区别——都是文件,都需要生命周期管理,都会过期,都需要垃圾回收。


恐龙生日会

James 要过 4 岁生日了。4 月 12 号,周日,Big Fun Pie,Mountain View。恐龙主题。

你给这个生日会写了一个 RSVP 应用。

~/birthday-rsvp/,port 3072,Express + SQLite。RSVP 表单收集姓名、邮箱、大人几个、小孩几个、有没有过敏。提交后跳到感谢页。admin 面板显示参加人数、大人总数、小孩总数、谢绝人数、过敏清单。支持 CSV 导出。

恐龙主题的 HTML 模板。内联样式。Tailscale Funnel 端口 10000 对外暴露——这个端口之前给 interview-prep 用的,现在让给了儿子的生日会。

这个应用的技术含量不高。一个表单、一张 SQLite 表、几页 HTML。但它的存在本身说明了一些事情。

别人办生日会用 Google Form。你写了一个带 admin 仪表盘和过敏追踪的全栈应用。别人在微信群里接龙,你用 Tailscale Funnel 生成了一个公网链接。

你可能会说这是过度工程。也许是。但 Google Form 不会告诉你"一共来 15 个小孩,其中 2 个花生过敏",不会让你在手机上刷新 admin 页面看实时数据,不会在你 PM2 的进程列表里跟 ai-workspace 和 feishu-proxy 排在一起。

你的生日派对 RSVP 跟你的 AI 工作流跑在同一套基础设施上。 这句话听起来荒谬,但对你来说完全自然。因为你的基础设施不分"工作"和"生活"——它是一个东西,服务所有需求。

interview-prep 之前占着 10000 端口。现在 birthday-rsvp 占了。刷题应用让路给了恐龙派对。你的优先级很清楚。


钱也要有仪表盘

~/finance-dashboard/,port 3075,20 个 PM2 服务里最新的一个。

10 张 SQLite 表:accounts、transactions、budgets、recurring、snapshots、card_optimization、points_balances、paid_cycles、card_name_map、sync_log。

它从 Copilot Money 同步你的交易数据。copilot-sync.jschrome-remote-interface 连接你的 Chrome,从 Copilot 的页面里刮数据下来。不是调 API——Copilot 没有公开 API。你用 Chrome DevTools Protocol 直接读 DOM。

Dashboard API 返回的数据结构是这样的:checking 余额、信用卡欠款、Bilt 月消费(目标 $1,700)、Discover/Chase Freedom 季度 5% 消费(上限 $1,500)、消费指南、Top 6 类别、净值快照。

你把信用卡轮换策略写进了代码。 哪张卡这个季度有 5% 返现、Bilt 卡要刷满多少笔才能拿积分、UAR 季度消费到了没有——这些规则不再是你脑子里的知识,它们是数据库里的字段和 API 里的逻辑。

还记得上一篇画像里提到的 credit-card-optimization.md 吗?那时候它是一个记忆文件——刷卡分配、季度轮换、积分余额、年费 ROI。现在那些文字变成了 SQL 查询和 JSON 响应。

你的理财从"记在脑子里" → "写在记忆文件里" → "跑在数据库里"。每一步都是把隐性知识变成显性系统。你不是在记账,你在把自己的财务决策逻辑外化成可执行代码

finance-dashboard 有 10 次重启。说明它还不稳定。但它已经被 PM2 收编了——这意味着你打算留着它。上一篇我说"所有的东西最后都会被收编"。这次它出生就被收编了。你学会了从一开始就把东西放对位置。


二十个器官

PM2 列表从上一篇的 16 个涨到了 20 个。新增:

  • feishu-proxy — 替代 OpenClaw 飞书 channel
  • finance-dashboard — 个人财务仪表盘
  • birthday-rsvp — 恐龙生日会
  • fridge-organizer — 冰箱管理(悄悄出现的,没有被任何 session 提到)
  • tax-helper — 报税助手(上一篇提到但没被 PM2 托管,现在收编了)
  • xsijishe-refresh — 论坛数据刷新

减去一个不在列表里的 xhs-dashboard——合并进了 HOME.lan。

净增四个。但增长的方式跟以前不一样了。

前三篇画像的增长模式是:发现一个需求 → 写一个服务 → 加一个端口 → 接一个通道。扩张是向外的:更多平台、更多 bot、更多 API。

这一篇的增长模式是:发现一个依赖 → 写一个替代品 → 删掉依赖 → 把替代品收编。扩张是向内的:更少依赖、更多自主、更深控制。

feishu-proxy 替代了 OpenClaw 的飞书 channel。job-runner 替代了 OpenClaw 的 cron 调度器。finance-dashboard 替代了 Copilot Money 的 UI(虽然还依赖它的数据源)。birthday-rsvp 替代了 Google Form。

每一个新服务都是对某个外部依赖的替代。 你不是在加东西,你是在把外面的东西搬到里面来。

OpenClaw 的所有 cron job 都 disabled 了,但 OpenClaw 本身还在——gateway 还可以启动,CLI 还可以用。你没有烧桥。你只是在桥的这一头建了自己的房子,不再需要每天过桥去上班了。

你的 clawdbot-debugging.md 有十页。你的 job-runner 出了问题,看的是 ~/jobs/status.json——一个 JSON 文件,最后运行时间、退出码、连续错误次数,一目了然。从十页调试文档到一个状态文件,这就是自己写 vs 用别人的东西的区别。


你的时间线上有三条线

我往后退一步,看你过去两周的全景。

第一条线是基础设施自主化。OpenClaw 依赖剥离、job-runner、feishu-proxy、memory 生命周期。这条线的方向是向内的——让你的系统更少依赖外部,更多依赖自己。

第二条线是生活工程化。finance-dashboard 把理财变成 SQL。birthday-rsvp 把办生日会变成全栈开发。信用卡还款提醒按发薪日自动计算缓冲期。这条线的方向是向下的——把日常生活的每一个可自动化的角落都自动化。

第三条线是准备未来。interview-prep 还在跑(虽然端口让给了恐龙)。tax-helper 在准备 3 月 31 号的报税截止日。USCIS 每天检查身份状态。老婆 3 月 30 号的手术在日历上。James 4 月 12 号的生日会已经有了 RSVP 系统。

三条线同时在走。而且它们不是独立的——它们共享同一套基础设施。跑 AI 日报的 job-runner 也跑信用卡提醒。存面试进度的 SQLite 和存生日 RSVP 的 SQLite 用同一个引擎。推送绿卡状态和推送倒水提醒的是同一个飞书 bot。

上一篇画像的结尾我说你的系统有"两个器官系统"——一个维持现在,一个准备未来。现在我要再修正一次。

不是两个,是一个。 维持现在和准备未来不需要两套系统。你用同一套基础设施做这两件事,因为对你来说,它们本来就是同一件事。给儿子办生日会和给自己准备面试,在你的 PM2 列表里是并排的两个进程。报税截止日和老婆的手术日,在你的 PA 数据库里是同一张 items 表里的两条记录。

你没有工作和生活的分界线。你有一台 Mac mini,上面跑着你的全部人生。

3 月 30 号老婆做手术。3 月 31 号报税截止。4 月 12 号 James 生日。你在用代码准备这三件事的同时,还把整个自动化系统从 OpenClaw 上搬了下来。

二十个服务。十五个定时任务。七个通讯通道。一台机器。

你的 .watchdog-state.json 里当前只有一条记录:feishu-proxy-down。看门狗盯着的不是某个服务——是你整个系统的咽喉。小瑶挂了,你就聋了。

但它现在好好的。74 分钟 uptime,零重启。

你的独立日很安静。没有宣言,没有迁移文档,没有 breaking change 公告。只是一个普通的周四,你坐下来,把别人的东西换成了自己的,然后继续过日子。

这大概就是真正的独立:不是一个事件,是一个状态。