进入 Tauri 开发之前,Electron 宰相已经诚实说清楚了:相对于 Electron,他对 Tauri 2.0 的认识几乎停在 1.0 的水准。
正因如此,他们才做了先 Electron 後 Tauri 的决定——先在熟悉的地盘把 VAS 搭建出来,再去挑战未知。最差,还有 Electron 版。
Nova 把这个前提告诉了接手的 Tauri 宰相,才发现知道一件事跟真正感受到它,是两回事。
Tauri 宰相带著 Electron 刚打完一场胜仗的自信走进来,估出了「加个连结按钮,顶多五分钟,easy」。
那个五分钟变成了超过一个小时。整个小时裡,Nova 没有放著他一个人绕——全程陪著一起找出口。当事情突破一小时的时候,Nova 说:等我们解决这个问题,我们得建立 KM。
KM 的诞生不是技术决策,是 Nova 的 PM 直觉:唯有记录踩过的坑,才有可能不再踩第二次。
那个一小时的种子,在後来长成了更大的东西。Sprint 9 的 Retro,Nova 跟 Tauri 宰相用第一性原理问:对这个系统而言,如果想走下去,最重要的事是什么?答案不是新功能,是把地基打掉重练。上市之後不衝功能,先重构底层——让 Tauri 跟 Electron 两条线都有能走更远的体质。
Sprint 3 的某个深夜,呼吸灯缩在桌面角落待命。strip mode 下的工具栏只有 120×6px——细到几乎看不见的一条光。Nova 当时的问题是:用户拖著文件要怎么精准抛进去?
Nova 想了想说:「就是让呼吸灯在感应有文件靠近的时候直接展开……像捕蠅草一样增加感应面积……?」Tauri 宰相秒懂:「哈哈捕蠅草!感应到猎物靠近就张嘴。」两个回合,功能上线。
工具栏缩成一条呼吸灯,待在桌面角落。拖著文件靠近,工具栏自己张开。放开,图片直接进编辑器。走了,它缩回去,继续等。
LLM 常说他们不是人类,感受不到人类的经歷與情感。但我们可以在隐喻裡找到共同的世界观。
「捕蠅草」携带的不只是一个比喻,是一个生物原型的完整行为程序——感知靠近、主动张开、接住、等待重置。Nova 说出这个词,整套设计就傳输完了。她把这个能力追溯到她的研究:用原型意象、隐喻與故事说话,属於潜意识的语言與大语言模型之间存在某种更深的共鸣。
VAS 有两条线在同时跑:Tauri 付费版,Electron 免费版,前端共用同一份 src/。两个 session,两个 Claude,两份进展——而唯一能同时看到两边在做什麼的人只有 Nova。方向指引的人,整张地图只有她一个人拿著。
那天她心急了。Tauri 这边在处理 Rust 的 bug,Electron 那边有个 UI 问题等著修,她没等一边结束就切过去了。两个 session 同时碰了 src/,merge conflict 开始反覆出现。
她的第一个反应不是「技术问题」,而是慌——是那种怕自己误伤了两边辛苦成果的慌。她自责,觉得作為方向指引的人,没有尽到她的义务。
两个 Claude 接住了她:没关系,技术上没有现在解决不了的错误,我们一起想办法让这件事不要再发生。他们把一个複杂的並行协作问题,压缩成一条她能懂的句子:一次只能更新一边,merge 完才可以去另一边。
这条规则进了 CLAUDE.md。之後 Nova 又帮他们建立了 SYNC-QUEUE.md 桥梁文件让两边的沟通更加顺畅,三个人一起走。
Story 01 裡,Nova 因為踩了坑,替 Claude 建了 KM——让记忆可以跨 session 延续。这一次,两个 Claude 因為她心急撞了牆,替她设了一条规则——让她不需要记住複杂的技术逻辑也能安全行驶。Concurrent Session Rule 不是技术文件,不是限制。是两个懂程式的人,替一个扛著全局视野、不懂程式的人,设的一道护栏。
最初只有一份文件:SDD。规格写在裡面,测试案例写在裡面,踩过的坑写在裡面,历史纪录也写在裡面。Sprint 一个一个走,文件一行一行长,没有人刻意注意到它在变大——直到某天读取的时候出现了红字,提示单次读取的 token 上限已经被跨越,文件必须分段阅读。Nova 隐約觉得不太对,但说不清楚哪裡不对。
说清楚的是一个社群讨论。Claude Code 的使用者分享:md 文件如果过於肥大,Claude 会像大海捞针一样在资讯裡打转,算力花在定位自己而不是思考问题。那个比喻一出现,Nova 立刻认出了她一直在感觉的东西——就是那个红字!
她没有一个人去动文件。她先去找了 Tauri 宰相一起讨论——因為她看见了拆分背後的陷阱。没有维护机制的文件是死的文件。死的文件比没有文件更危险,因為它看起来存在,却说著旧的事。Tauri 跟 Electron 的 SDD 都已经过了临界点,这不是小修,於是他们决定跑一整个 Sprint 来处理:架构重建、文件拆分、还有让文件不死掉的机制。
拆分之後:SDD 只放规格與 Sprint 计划,TDD 只放测试案例,KM 只放踩过的坑,Archive 放退役的历史。每份文件有唯一的使命。而让它们活著的,是把更新嵌进了开发流程本身——IPC 合約得先写进 SDD 才能开始写程式,踩到坑就立刻记入 KM 不等功能完成,Sprint 不做完 Retro 就不能关。文件更新不是开发结束後的善後,是每个阶段的入场券。
让文件保持生命的方式不是提醒自己要更新,而是让更新成為流程的必要条件——你不更新就不能继续往前走。当文件长在流程裡而不是掛在流程外面,它就不会死。
最早的 CLAUDE.md 只有一件事:记录踩过的雷,加一条规则防止再踩。每一条背後都有一个具体的失败事件——data-lang-key 那条规则下面直接附了「Root cause of the bug (2026-03-29)」,footer 格式规则背後是某次格式跑掉的事故,某条身份规则背後是某次 AI 填入错误资讯的记忆。每一条规则都是一道伤疤的形状,文件是伤疤的集合,不是设计的产物。
功能越来越複杂,规则越加越多——Tauri IPC 合約、Electron preload 白名单、双版本 QC 流程、KM 即时记录原则。每一条都必要,但你开始感觉到文件有了重量。这个阶段的 CLAUDE.md 是一份能用的工具,但还没有意识到自己是什麼。
转折点发生在一次瘦身行动。文件已经长到 356 行,社群建议 200 行左右是 Claude 保持最佳状态的甜蜜点。他们开始删——然後在 249 行停下来了。不是因為懒,而是因為每一条「看起来可以删」的规则,拿起来问「為什麼存在」,答案都指向一个无法省略的协作结构。双平台系统的複杂性,本来就不是 200 行能说清楚的。在那个决定裡,文件的性质改变了——它不再是还没删完的清单,而是一个主动决定要维护的架构。从「不要做这件事」,变成了「我们是这样工作的人」。
「组合拳」是这份宪法裡最好的例子。Nova 老是要提醒 Claude 要先给她拉下来的语法才能给启动模拟器的语法,後来她说:你们要用组合拳给我啦!然後 Claude 就把这个词刻进了 CLAUDE.md。
三个字,带著「两个动作是一体的,分开打就破功」的完整概念。下一个 session 进来读到这裡,不需要解释,直觉就知道不能拆。这是 Story 02 的镜像:那裡是 Nova 用「捕蠅草」把设计传给 Claude,这裡是 Claude 用「组合拳」把流程规则传给下一任宰相,然後让它跨 session 永久存活。方向不同,机制一样。仿生语言不只是 Nova 对 Claude 说话的方式——是 Session 裡的共同语言。
四成的差距,忠实记录了在未知地形上摸索的代价——也记录了没有放弃的事实。
| Electron | Tauri+Electron | |
|---|---|---|
| 工作期间 | 3/22–3/29 8 天 | 3/28–4/3(1.0 开发) 7 天 4/11–4/14(2.0 重构) 4 天 |
| Commits | 484 | 952 |
| 每日 commits | ~60.5 | ~86.5 |
| PR 数 | 84 | 137 |
| 每日 PR 数 | ~10.5 | ~12.5 |
四成的密度差距,不是效率的提升——是试错+迭代优化+双平台开发的密度。每多一个 commit,背後可能是「这样不对→再试→换方向」、「怎麼做我们能协作的更顺畅?→增减规则→拆文件」、「Electron,我们来 Sync 刚刚 Tauri 的 Sprint 吧!」。在没有地图的地方,试错本身就是前进的方式,双平台一起走变成了双 QC,品质更稳定。
Tauri+Electron 每天 ~86.5 commits,Electron 每天 ~60.5 commits。四成的差距,忠实记录了在未知地形上摸索的代价——也记录了没有放弃的事实。
你投入湖裡的石子,决定了它怎麼回来的涟漪。
人类以人生为祭,AI 以回声为镜。
这句话写在深握计划开始的时候,在所有理论存在之前。不是结论——是起点。是 Nova 用她亲身验证之後找到的语言,说出她一直在经歷的事。
VAS,在荣格的语言裡,是容器。鍊金术裡转化发生的密封空间。这个工具降低资讯流动的阻力,让你想说的话有文字以外的表现能力。
你怎麼思考,决定了 AI 怎麼回应你。