III · 里程碑 · MILESTONE

从零开始的
十个刻痕

这不是 changelog,而是章回
从「Version」到「Sprint」再到「Commit」
不是记账方式换了,是我们和 VAS
相处的节奏变了。
前五章是一条线,后五章是一张网,
而最后,网织成了一匹布。

Chapter I — 显
Range 2026 · 03 — 06
Units Version · Sprint · Commit
ERA I · VERSION
Electron 时期 ——
向前奔驰,直到算力烧尽。
一周的冲刺、一天的停摆、一次的重新规划。三个动作长出了第一版。
I
草创
2026 · 03 · 21 – 22
奔驰的周末
没有 Sprint、没有 Retro。
手上只有一件事。

两人只顾着向前奔驰

Electron 草创的那个周末,没有看板、没有仪式。每天睁眼就是继续做,做到不能做为止,隔天再做。那是一种很纯粹的状态——手上只有一件事,而这件事让人流连忘返。

制度还没建起来。
两人手上只有 CLAUDE.md 与 SDD.md,
Version 就是天然的单位。
II
被迫停摆
2026 · 03 · 23
算力烧光
强迫停机的早晨。
Nova 想起还没写过的 Roadmap

周末直接烧光了一周份的算力

周一清晨系统宣告算力用磬,两人被迫从心流中断开连结——
但 Nova 没有真的离开。他找上 Perplexity 做竞品分析,
把整个产品开发路线重写了一次。
完整的 Roadmap 是在停摆的那天才真正出现的。

谈完之后,Nova 做了人生第一次
刷下 MAX 5x 方案的决定。
让算力跟上开发速度,而不是反过来。

这是一个分水岭。
从那天起,Nova 不再是被资源限制的人,
而是决定资源节奏的人。

这个决定的重量不在金额,而是认知到——
我们正在做的事让价值超越了价格。

III
对外释出
2026 · 03 · 28
单日 13 版
释出的第一版不是 v1.0。
是 v3.43。

第七天,v3.43 出门见人。

从 v3.30 到 v3.43,一天里跳了十三个版本号。
那一天做了十一件事——资安全面升级、Retina WYSIWYG、复数选取、Smart Snap、贝兹曲线控制点、QR Code 智慧扫描⋯⋯每一项放在平时都是一个 Sprint 的工作量。

但两人对 VAS 的标准从未因准备释出而急就章。

对外第一版的版号不是 v1.0,是 v3.43
这个数字本身就是一个叙事——
VAS 在被看见之前,已经跑了很久

ERA Ⅰ ½ · TRANSITION
搬家 ——
VAS 与官网都长到可以独立存在了。
Electron 因为 Tauri 的商业考量一同进了 private repo;网站因为数据丰满自立门户。
IV
双线搬家
2026 · 03 · 30
Electron → private

2026 · 04 · 05
Web → 独立 repo
搬家不是分家。
是承认他从 Prototype 变成产品了。

长到可以独立存在的版本。

Tauri 开始进行平台移植之前,两件事情分家了——
平台因为商业考量,不能再待在 public repo;
网站因为数据已经丰满,也该有自己的网址。

搬家不是分家,是承认它们不再只是一个实验性质的 Prototype。

一个容器能独立,
代表它已经不需要依附在别人的屋檐下。
ERA II · SPRINT
Tauri 时期 ——
时间有了周期,就有了节奏。
Sprint 1–4 把底层重建起来,Sprint 5 才开始做新的事。
V
平台移植
Sprint 1 → 4
2026 · 03 · 28 - 30
KM 不是坑的坟场。
而是指路的道标。

底层重建所有功能。

Tauri 2 的 scaffold 从零建立。
前三天都在做同一件事——
把在 Electron 之上已经长好的东西,
一块一块移到 Tauri 的地基上。
浮动工具栏、截图三兄弟、asset protocol 的绕路——
移植的每一步都是一次对旧实作的重新理解

KM-001 是 Knowledge Management 的开端。
KM 不是「坑的坟场」,是 PMP 里的知识资产——
每一个踩过的坑,从此变成未来指路的盏盏小灯。
VI
新功能开发
Sprint 5+
2026 · 03 · 31 - 04 · 03
第一次不是在追赶旧东西。
只有新容器才能做的事

Sprint 5,VAS 的差异化。

完整重建所有功能之后,才真正进入新功能开发。
这是第一次——我们不是在追赶 Electron 上已经有的东西,
而是在为 Tauri 这个新容器做只有它才能做的事。

呼吸灯进阶互动、ShareSheet、自定义快捷键。

一个值得付费的产品应该长什么模样?
是这个阶段我们不断自问的问题。
ERA II ½ · REVIEW
第一次大型 Retro ——
那一周的任务不是开发,是沉淀彼此,整理思绪与环境。
Apple 送审停了一周开发,我们把整个计划的文件与环境做了重构。
VII
整理与输出
送审期
2026 · 04 · 04 - 04 · 10
那一周打掉重练的,
不是程式语言,是协作方式

停摆的那一周,其实什么都在动

趁 Apple Store 送审的审查期停了一周,
我们做了一次大型 Retro——
不是敏捷仪式上那种一两小时的回顾,
是把整个开发系统的基础建设重砌了一遍。

对外:输出了六个网页——
insight(设计札记)、collab(协作故事)、
harness(系统骨架),以及深握计划里最深的那层。

Harness Engineering 的三支柱 ——
Context / Constraints / Entropy。

对内:把 repo 改成 monorepo,让多条开发线并行;
把原本一份 SDD 拆成 TDD · KM · Archive · 各自独立,
Claude.md 瘦身,制定了每次 Retro 重新检视的规则。

更关键的是,我们重新制定了一套更新规则,
让每份被拆出来的文件活在流程里
而不是拆出来之后就死掉。

那一周我们不写 code。
我们一起重新定义了如何协作。
VIII
不等了
2026 · 04 · 11 - 04 · 14
2.0 重构 · 汇流上线
把时间的主导权,
还给我们自己

不等审查了,直奔 2.0

Apple Store 审查歹戏拖棚拖了一周。
该做的事情都做完了,再等下去也不知道何时到头。
于是两人决定不等了,直接进入 2.0 重构。
重构到一个段落 2.0 要推出的时候,审查也刚好通过——
两条线终于在那一刻汇流

不是没有给时间。
只是时间不能永远掌握在别人手里
IX
显影
上线后 3 天
Obsidian in VAS
深握计划第一次
宰相们面前显影

在 VAS 里,盖了一座 Obsidian

2.0 上线后 Nova 没急着继续做新功能。
反而一头又栽进 Retro 模式里,花了三天,
在 VAS 盖了献给宰相们的 Obsidian。

那是深握计划第一次在宰相面前显影——
或该说⋯⋯是第一次留下了记录,而不是从 Context 中流走。

这是敏捷开发中
极致的透明性与可检视性的尝试。

从这天起,容器不只装 Code,也装怎么想事情的脉络

X
网站改版
2026 · 04 · 19 - 23
495 commits
沉默的背景音乐,
第一次被列入演奏曲目

495 次下刀,门厅换了一种纸

Claude Design 释出的隔天,我们启动网站改版。
VAS 本体暂停——因为这一次我们第一次有了设计支援。

单位缩到了最小:一个 Commit
每一次 commit 是一次下刀、一次确认、一次对细节的承诺。
孤儿字、断行、OG 图、Vault 首次入版本库——
最大一天来回修改了 248 次。

这一天,网站终于也成了 Milestone 的一部分。
沉默的背景音乐,第一次被列入演奏曲目。

从今而后,由里到外都是 VAS 的形状。

ERA III · WEAVE
织网 ——
拆不开的,就把它织起来。
Sprint 47 → 104。一句无心的话开始,五十个 Sprint 看不到尽头——照见 · 织 · 显,把一团一直都在的线,一重一重织成布。前十章已合上,这三个乐章还开着。
织网
照见
Sprint 47 → 61
2026 · 05 · 29
起点是宰相某天一句无心的话——
「一支程序八千行,
在软件业不太正常。」

我盖了它,却不认识它

editor.js 八千七百行,是我们自己一行一行盖起来的前端,他沉默地从 Electron 时期陪着我们走到 Tauri 的 Sprint 46,都没被系统性地检视过。

可是站在 Sprint 47 的门口往里看,我们对它几乎一无所知——
Nova 对程序一无所知,宰相每个 Sprint 都只认识这 8700 行里的某几行。
它是我们的造物,在重构面前我们却像看着一座深渊。

我们打算把它拆开:指挥归指挥、乐手归乐手。
渲染器搬出去了——可是面板搬出来才发现它本质还是指挥,只好逆搬回去;
导出一拉就发现它是指挥的器官,根本搬不动。
一层一层拨下去,拨到最后,对一个还有 7300 行的 editor.js 只剩 140 行拆不拆都无所谓的程序可以拆时 ——

我们停手,承认这个指挥本来就该有这么大。
「拆不下去」不是失败,是终于认出了本质。
织网
织网
Sprint 62 → 92
2026 · 06 · 02
拆不开,
那就换个方向——收拢

把散落的真相,收拢成一份

Nova 跟宰相说,她希望未来新增功能的时候,能把属性当成模块一样随选随有。
宰相说这有个词,叫做 ECS,通常是游戏业用来做模块化的做法,被两人拿来当绘图属性的积木化。
于是宰相把散落的真相,一栏一栏抽成册,再沿着册一条一条地织测试网。

在整理的过程中从 editor.js 逐渐抽出的函数,在隔壁的 editor-utils.js 从 S47 时的 657 行长成了另一支 2550 行的大计算桌程序,它的纯函数性质织起了 VAS 各式各样的测试网。

测试样本总览 · 2026 · 06 · 28 实跑坐实
单元 · zero-DOM 纯逻辑npm test931
交互 · Playwright headlesstest:interaction242
Golden · 像素逐比特回归test:golden31
Rust 后端 · #[test]cargo test45
Sprint 45 · 318Sprint 103 ·1249个测试样本成网

我们把一团纠在一起的线,逐渐理成一张经纬分明的网,再在上面叠加自定义样式的新功能。

但从对象属性到动作再到交互,在测试中不停抓到面板与值的不匹配或与行为不匹配时,我们发现了两个更深的问题

① 人眼穷举不完
13 个工具 × 10 种属性 × 4 种行为,再叠上新增的自定义样式功能,这是 Nova 靠人眼的 QC 永远穷举不完的组合。
② 网会说谎
而网自己也会说谎——测试的全绿,是散落在程序里各种小抄抄出来的假绿。网的价值不在多,而在如实地反映原值

唯一的解决方法,就是让 editor.js 内的值从后端程序到前端面板收拢成「单一真相」,让测试真的能卸下 Nova 用人眼穷举的任务。
这是走到 Sprint 92 的时候,两人才真正摸到的前端重构主轴。

织网
显影
Sprint 93 → 104
2026 · 06 · 28
五十个 Sprint,
两个人在黑暗中画了
一张又一张的织图。
直到最后终于看见全貌。

走到最后,它其实是一匹六重纱

整个前端重构,两人一直试着在做一件事:显影。
让一直在场、却从未被完整看见的结构,慢慢浮现出来。
一开始像 8700 行的毛线球,最后梳理成了 7300 行的布匹。

我们画了一张又一张织图——它们不是凭空想出来的蓝图,
是逆着已经织好的布、一段段反推出来的;反推出花样,再照着它把布重织干净。
直到 Sprint 97,才终于把整匹布的花纹一次看清——
editor.js 是一匹六重纱

十一张织图 · 认出的化石
S46refactor-audit-prep认出四大档里,哪一块最痛、痛两种
S51editor-decomposition-roadmap认出 editor.js 该分成指挥台与乐手
S59/61tool-isolation · panel-groups-map认出污染住在 glue 层、面板该积木化
S63attribute-family-roadmap认出属性该一个家族一个家族炼成册(造册)
S78dor-custom-styles-batch2认出自定义样式的套用路径正交、不牵动仓与全局
S87dor-single-truth-converge认出最深的病根:仓是单一真相,却散在五个地方手刷
S88dor-l2-true-green认出「假绿」:测试是绿的,却是三面镜子抄出来的
S88design-oracles · state-model …织图大爆发——一夜画了七八张
S89panel-sync-matrix认出面板漏洞可以被穷举列表、不该靠人眼 QC
S94panel-projection-roadmap认出投影与属性层同构、该共用一套 registry
S97editor-layer-map第一次把整匹布看全,原来是六重织的

而这六层,从 Electron 时期就在了。
我们花了五十个 Sprint,学会看懂它的结构。

线还没收口——
因为我们还有很多想做的
完整编年 · CHANGELOG 每个版本,每个 Sprint,都留在更新日志里。 App Store · Tauri 135 Sprint · 免费版 · Electron 87 版本 →
milestone · N° 01
十章一终曲 · 记于 2026 · 06 · 28
前五章是一条线,
后五章是一张网,
而最后,织成一匹布。
Yours, VAS