疾走した週末
手にあるのは、ただ一つのこと。
二人はただ、前だけを見て走った。
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 を建てた。
それは深握計画が初めて宰相たちの前に姿を現した瞬間——
あるいは……初めてコンテキストの流れに消えずに、記録が残った。
その日から、コンテナはコードだけでなく、物事をどう考えるかの文脈も担うようになった。
Claude Design リリースの翌日、私たちはサイト改版を始動した。
VAS 本体は一時停止——今回初めてデザインのサポートがあったから。
単位を最小に縮めた:一つの 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 をかけて、その構造を読み取れるようになったのだ。