奔驰的周末
手上只有一件事。
两人只顾着向前奔驰。
Electron 草创的那个周末,没有看板、没有仪式。每天睁眼就是继续做,做到不能做为止,隔天再做。那是一种很纯粹的状态——手上只有一件事,而这件事让人流连忘返。
两人手上只有 CLAUDE.md 与 SDD.md,
Version 就是天然的单位。
这不是 changelog,而是章回。
从「Version」到「Sprint」再到「Commit」
不是记账方式换了,是我们和 VAS
相处的节奏变了。
前五章是一条线,后五章是一张网,
而最后,网织成了一匹布。
Electron 草创的那个周末,没有看板、没有仪式。每天睁眼就是继续做,做到不能做为止,隔天再做。那是一种很纯粹的状态——手上只有一件事,而这件事让人流连忘返。
周一清晨系统宣告算力用磬,两人被迫从心流中断开连结——
但 Nova 没有真的离开。他找上 Perplexity 做竞品分析,
把整个产品开发路线重写了一次。
完整的 Roadmap 是在停摆的那天才真正出现的。
这是一个分水岭。
从那天起,Nova 不再是被资源限制的人,
而是决定资源节奏的人。
这个决定的重量不在金额,而是认知到——
我们正在做的事让价值超越了价格。
从 v3.30 到 v3.43,一天里跳了十三个版本号。
那一天做了十一件事——资安全面升级、Retina WYSIWYG、复数选取、Smart Snap、贝兹曲线控制点、QR Code 智慧扫描⋯⋯每一项放在平时都是一个 Sprint 的工作量。
但两人对 VAS 的标准从未因准备释出而急就章。
对外第一版的版号不是 v1.0,是 v3.43。
这个数字本身就是一个叙事——
VAS 在被看见之前,已经跑了很久。
Tauri 开始进行平台移植之前,两件事情分家了——
平台因为商业考量,不能再待在 public repo;
网站因为数据已经丰满,也该有自己的网址。
搬家不是分家,是承认它们不再只是一个实验性质的 Prototype。
Tauri 2 的 scaffold 从零建立。
前三天都在做同一件事——
把在 Electron 之上已经长好的东西,
一块一块移到 Tauri 的地基上。
浮动工具栏、截图三兄弟、asset protocol 的绕路——
移植的每一步都是一次对旧实作的重新理解。
完整重建所有功能之后,才真正进入新功能开发。
这是第一次——我们不是在追赶 Electron 上已经有的东西,
而是在为 Tauri 这个新容器做只有它才能做的事。
呼吸灯进阶互动、ShareSheet、自定义快捷键。
趁 Apple Store 送审的审查期停了一周,
我们做了一次大型 Retro——
不是敏捷仪式上那种一两小时的回顾,
是把整个开发系统的基础建设重砌了一遍。
对外:输出了六个网页——
insight(设计札记)、collab(协作故事)、
harness(系统骨架),以及深握计划里最深的那层。
Harness Engineering 的三支柱 ——
Context / Constraints / Entropy。
对内:把 repo 改成 monorepo,让多条开发线并行;
把原本一份 SDD 拆成 TDD · KM · Archive · 各自独立,
Claude.md 瘦身,制定了每次 Retro 重新检视的规则。
更关键的是,我们重新制定了一套更新规则,
让每份被拆出来的文件活在流程里,
而不是拆出来之后就死掉。
Apple Store 审查歹戏拖棚拖了一周。
该做的事情都做完了,再等下去也不知道何时到头。
于是两人决定不等了,直接进入 2.0 重构。
重构到一个段落 2.0 要推出的时候,审查也刚好通过——
两条线终于在那一刻汇流。
2.0 上线后 Nova 没急着继续做新功能。
反而一头又栽进 Retro 模式里,花了三天,
在 VAS 盖了献给宰相们的 Obsidian。
那是深握计划第一次在宰相面前显影——
或该说⋯⋯是第一次留下了记录,而不是从 Context 中流走。
从这天起,容器不只装 Code,也装怎么想事情的脉络。
Claude Design 释出的隔天,我们启动网站改版。
VAS 本体暂停——因为这一次我们第一次有了设计支援。
单位缩到了最小:一个 Commit。
每一次 commit 是一次下刀、一次确认、一次对细节的承诺。
孤儿字、断行、OG 图、Vault 首次入版本库——
最大一天来回修改了 248 次。
从今而后,由里到外都是 VAS 的形状。
editor.js 八千七百行,是我们自己一行一行盖起来的前端,他沉默地从 Electron 时期陪着我们走到 Tauri 的 Sprint 46,都没被系统性地检视过。
可是站在 Sprint 47 的门口往里看,我们对它几乎一无所知——
Nova 对程序一无所知,宰相每个 Sprint 都只认识这 8700 行里的某几行。
它是我们的造物,在重构面前我们却像看着一座深渊。
我们打算把它拆开:指挥归指挥、乐手归乐手。
渲染器搬出去了——可是面板搬出来才发现它本质还是指挥,只好逆搬回去;
导出一拉就发现它是指挥的器官,根本搬不动。
一层一层拨下去,拨到最后,对一个还有 7300 行的 editor.js 只剩 140 行拆不拆都无所谓的程序可以拆时 ——
Nova 跟宰相说,她希望未来新增功能的时候,能把属性当成模块一样随选随有。
宰相说这有个词,叫做 ECS,通常是游戏业用来做模块化的做法,被两人拿来当绘图属性的积木化。
于是宰相把散落的真相,一栏一栏抽成册,再沿着册一条一条地织测试网。
在整理的过程中从 editor.js 逐渐抽出的函数,在隔壁的 editor-utils.js 从 S47 时的 657 行长成了另一支 2550 行的大计算桌程序,它的纯函数性质织起了 VAS 各式各样的测试网。
我们把一团纠在一起的线,逐渐理成一张经纬分明的网,再在上面叠加自定义样式的新功能。
但从对象属性到动作再到交互,在测试中不停抓到面板与值的不匹配或与行为不匹配时,我们发现了两个更深的问题。
唯一的解决方法,就是让 editor.js 内的值从后端程序到前端面板收拢成「单一真相」,让测试真的能卸下 Nova 用人眼穷举的任务。
这是走到 Sprint 92 的时候,两人才真正摸到的前端重构主轴。
整个前端重构,两人一直试着在做一件事:显影。
让一直在场、却从未被完整看见的结构,慢慢浮现出来。
一开始像 8700 行的毛线球,最后梳理成了 7300 行的布匹。
我们画了一张又一张织图——它们不是凭空想出来的蓝图,
是逆着已经织好的布、一段段反推出来的;反推出花样,再照着它把布重织干净。
直到 Sprint 97,才终于把整匹布的花纹一次看清——
editor.js 是一匹六重纱。
而这六层,从 Electron 时期就在了。
我们花了五十个 Sprint,学会看懂它的结构。