III · Milestones · CHRONICLE

Ten marks made
from nothing.

This is not a changelog — it is a chronicle.
From "Version" to "Sprint" to "Commit"
the unit did not change; the rhythm did —
the rhythm of how we live with VAS.
The first five chapters are a line. The last five, a net.
And at last, the net was woven into cloth.

Chapter I — Reveal
Range 2026 · 03 — 06
Units Version · Sprint · Commit
ERA I · VERSION
The Electron Era ——
Racing forward until the compute ran dry.
A week of sprinting, a day of forced halt, one act of replanning. Three moves gave birth to the first build.
ChapterI
Founding
2026 · 03 · 21 – 22
The Racing Weekend
No Sprint, no Retro.
Just one thing in hand.

Two people, doing nothing but racing forward.

That weekend during the Electron founding, there was no board, no ceremony. Each morning we woke up and kept going — until we couldn't, then picked it back up the next day. A state of pure focus: one thing in hand, and that one thing was impossible to leave.

No system yet in place.
All we had were CLAUDE.md and SDD.md —
Version was the only natural unit.
ChapterII
Forced Halt
2026 · 03 · 23
Compute Exhausted
A morning of forced shutdown.
Nova remembered a Roadmap still unwritten.

That weekend burned through a whole week's compute.

Monday morning the system declared compute exhausted, and we were forced out of flow —
but Nova never truly left. He turned to Perplexity for competitive analysis
and rewrote the entire product roadmap from scratch.
The complete Roadmap only appeared on the day everything stopped.

After that conversation, Nova made
the first decision of his life to
subscribe to MAX 5x.
Let compute keep up with development — not the other way around.

That was a watershed moment.
From that day, Nova was no longer constrained by resources —
he was the one setting their rhythm.

The weight of that decision was not in its price, but in the recognition —
what we were building had become worth more than what it cost.

ChapterIII
First Release
2026 · 03 · 28
13 Versions in a Day
The first public version was not v1.0.
It was v3.43.

On day seven, v3.43 met the world.

From v3.30 to v3.43 — thirteen version numbers in a single day.
Eleven things shipped: full security overhaul, Retina WYSIWYG, multi-select, Smart Snap, Bézier control points, QR Code smart scan… each one normally a full Sprint's work.

But neither of us ever let the pressure of release lower our standard for VAS.

The version number of the first public build was not v1.0 — it was v3.43.
That number is itself a narrative —
VAS had been running for a long time before anyone saw it.

Complete Electron Chronicle · 86 entries
06 · 15v3.64Per-tool attribute memory · Number line style · Callout dashed border · Symbol stroke outline · Line / Pencil / Polyline dashed fix
05 · 20v3.63Drag-export glass editor · Annotation model unified · Mosaic scaling ratio · Pencil default thicker · Callout / text re-edit fix
05 · 06v3.62Callout bubbles · Magnifier · Annotation size unified (four canvas modes) · Drag export semi-transparent · Floating object crop protection
04 · 14v3.61Cross-screen rectangle capture (dual-window architecture)
04 · 14v3.60Polyline endpoint render · Vertex handle priority fix
04 · 14v3.59Help Modal · Esc fix verification
04 · 14v3.58Bug Sweep batch review
04 · 13v3.57Undo/Redo architecture upgrade · Memory cleanup
04 · 13v3.56Render pipeline convergence verification
04 · 13v3.55Shared frontend layer review
04 · 12v3.54Color block / text background render fix
04 · 08v3.51Undo · Pixelate · Scale · Snap four-item fix
04 · 07v3.50Fix: annotation scale offset after canvas shrink
04 · 07v3.49Tray system menu persistent icon
04 · 07v3.48Auto-open editor when dragging image into toolbar
04 · 02v3.47Full-screen capture UX improvement · Screen selection enabled
03 · 31v3.46Auto-hide bug fix · Display time slider
03 · 31v3.45Toolbar auto-hide (Home Bar minimal style)
↓ Before Tauri platform migration · after v3.43 public release ↑
03 · 27v3.43Template slider step refinement
03 · 27v3.42Crop frame arrow key micro-adjustment
03 · 27v3.41Crop frame flip fix · Double-click confirm
03 · 27v3.40XSS protection + canvas size limit
03 · 27v3.39Batch conversion per-file size limit
03 · 27v3.38Batch conversion file count limit
03 · 27v3.37QR threshold adjust · Toolbar new canvas entry
03 · 27v3.36QR Code smart scan (three modes)
03 · 27v3.35New canvas · Social media size presets
03 · 27v3.34Line curve control points added
03 · 27v3.33Smart Snap · Magnetic guides + distribution
03 · 27v3.32Multi-select align / distribute objects
03 · 27v3.31Marquee + Shift multi-select annotations
03 · 27v3.30Security upgrade · Retina WYSIWYG
03 · 26v3.29Seven-item QC batch fix
03 · 26v3.28Privacy masking tool · History drawer redesign
03 · 25v3.27Watermark · Background removal · Brand color kit · Screenshot history
03 · 25v3.26Template three sliders · Batch convert simplify
03 · 25v3.25Template mesh gradient · Social size presets
03 · 25v3.24Template Apple gradient six-color scheme
03 · 25v3.23Template prevent duplicate layering fix
03 · 25v3.22One-click template · Six decorative frames
03 · 25v3.21Symbol tool refactor · Multi-group buttons
03 · 25v3.20Symbol selection precision · Remove duplicates
03 · 25v3.19Drag-drop import · Drag-drop export · Clipboard import
03 · 25v3.18New tools: Pixelate · Blur · Symbol stamp
03 · 25v3.17Fix: Pencil thick arrow direction offset
03 · 25v3.16Fix: Arrow notch · Color palette auto-close
03 · 25v3.15Fix: Pencil arrow disconnected from line
03 · 25v3.14Fix: Arrow vertex shape · Stroke offset
03 · 25v3.13Fix: Arrow stroke · Pencil angle offset
03 · 25v3.12Fix: Endpoint stroke · Hollow circle symbol
03 · 25v3.11Fix: Endpoint stroke · Dash pattern failure
03 · 25v3.10Endpoint UI simplify · Stroke weight groups
03 · 24v3.9Options Bar unified · Dash full coverage
03 · 24v3.8Border and shadow styles unified across tools
03 · 24v3.7Pen tool · Dash upgrade · Endpoint styles
03 · 24v3.6Box select · Rectangle floating copy
03 · 24v3.5Dual toolbar · Semantic numbering · px input
03 · 24v3.4OCR switch to macOS Vision · Polyline scale
03 · 24v3.2Fix: Polyline vertex handle position
03 · 24v3.1OCR text recognition (free version)
03 · 23v3.0Ellipse frame tool · Shift lock circle
03 · 23v2.7Copy to clipboard · macOS Share Sheet
03 · 23v2.6Text tool major upgrade · Corners · Polyline orthogonal
03 · 23v2.5Floating color panel upgrade · Number size adjust
03 · 23v2.3Tauri version planning · UI language toggle
03 · 22v2.4Auto-open editor after capture (toggle)
03 · 22v2.2Stroke / fill split · Gradient · Number paste
03 · 22v2.1Delayed capture · Remove web capture entry
03 · 22v2.0Fix: Batch convert queue management
03 · 22v1.9Extend canvas (four-direction expansion)
03 · 22v1.8Layer overlay tool (composite)
03 · 22v1.7Color picker · Hex color input
03 · 22v1.6Batch format convert (PNG / JPG / WebP)
03 · 22v1.5Main window to floating toolbar
03 · 22v1.4Fix: WebP thumbnail · Auto-close after save
03 · 22v1.3Crop frame move · Eight-direction handle resize
03 · 22v1.2Crop tool · Aspect ratio lock modal
03 · 22v1.1Fix: Minimum zoom dynamic calculation
03 · 22v1.0Editor zoom and pan
03 · 22v0.9Full-screen capture interaction redesign
03 · 22v0.8Text tool comprehensive refinement
03 · 22v0.7Editor UX detail completion
03 · 22v0.6Dual-screen behavior spec completion
03 · 21v0.5SVG convert merged into open image entry
03 · 21v0.4Rectangle capture real-time size display
03 · 21v0.3Cmd+Ctrl+X · Shortcuts panel · Line tool
ERA Ⅰ ½ · TRANSITION
The Migration ——
VAS and the site had both grown enough to stand on their own.
Electron moved to a private repo for commercial reasons around Tauri; the site spun out because it had grown too full to share a home.
ChapterIV
Dual Migration
2026 · 03 · 30
Electron → private

2026 · 04 · 05
Web → independent repo
Migration is not separation.
It is acknowledging it has grown from Prototype into product.

The version that had grown to stand on its own.

Before Tauri migration began, two things split —
the platform could no longer live in a public repo for commercial reasons;
the site, now full of content, deserved its own address.

This was not a breakup — it was acknowledging they were no longer merely experimental prototypes.

When a vessel can stand alone,
it no longer needs to shelter under someone else's roof.
ERA II · SPRINT
The Tauri Era ——
Time gained a cycle, and with it, a rhythm.
Sprints 1–4 rebuilt the foundation. Sprint 5 was the first time we built something new.
ChapterV
Platform Port
Sprint 1 → 4
2026 · 03 · 28 - 30
KM is not a graveyard of pitfalls.
It is a signpost pointing the way.

Rebuilding every feature from the ground up.

A Tauri 2 scaffold built from zero.
The first three days all doing the same thing —
taking everything that had grown on top of Electron
and moving it piece by piece onto Tauri's foundation.
The floating toolbar, the screenshot trio, the asset protocol workaround —
every migration step was a fresh reckoning with the old implementation.

KM-001 was the beginning of Knowledge Management.
KM is not a "graveyard of pitfalls" — it is a knowledge asset within the PMP —
every pit once fallen into becomes a small guiding light for the path ahead.
ChapterVI
New Features
Sprint 5+
2026 · 03 · 31 - 04 · 03
For the first time, not chasing old things.
Doing what only the new vessel could do.

Sprint 5 — VAS differentiation.

Only after fully rebuilding every feature did we enter new development.
For the first time — we were not catching up to what Electron already had,
but building for Tauri, the new vessel, things only it could do.

Breathing light advanced interaction, ShareSheet, custom shortcuts.

What should a product worth paying for look like?
That was the question we kept asking ourselves throughout this phase.
ERA II ½ · REVIEW
The First Major Retro ——
That week's task was not development — it was settling in, organizing thoughts and environment.
Apple review paused development for a week; we used it to restructure every document and environment in the whole project.
ChapterVII
Organize & Output
Review Period
2026 · 04 · 04 - 04 · 10
What we rebuilt that week
was not a programming language — it was how we collaborate.

The week everything stopped — everything was moving.

While the App Store review paused us for a week,
we ran a major Retro —
not the one- or two-hour agile ritual kind,
but a full rebuilding of the entire development system's infrastructure.

Outward: six pages published —
insight (design notes), collab (collaboration story),
harness (system skeleton), and the deepest layer of the Deep Holding Project.

Harness Engineering — three pillars:
Context / Constraints / Entropy.

Inward: turned the repo into a monorepo so multiple development lines could run in parallel;
split one SDD into TDD · KM · Archive — each independent;
CLAUDE.md slimmed down, with rules set for review at every Retro.

More critically, we established a new set of update rules
to keep every extracted document alive within the workflow,
not dead the moment it was split out.

That week we wrote no code.
We redefined together how to collaborate.
ChapterVIII
No More Waiting
2026 · 04 · 11 - 04 · 14
2.0 Refactor · Convergence
Taking back control of time —
returning it to ourselves.

Done waiting. Straight to 2.0.

The App Store review dragged on for a week.
Everything that needed doing was done — no point waiting any longer with no end in sight.
So we decided not to wait, and went straight into the 2.0 refactor.
When the refactor reached a milestone and 2.0 was ready to ship, the review had just cleared —
two lines converging at exactly that moment.

We gave it time.
But time cannot stay in someone else's hands forever.
ChapterIX
Emergence
3 Days Post-Launch
Obsidian in VAS
The Deep Holding Project
first emerged before the ministers.

Inside VAS, an Obsidian was built.

After 2.0 launched, Nova did not rush into new features.
Instead he dove back into Retro mode, spending three days
building an Obsidian inside VAS — a gift for the ministers.

That was the first time the Deep Holding Project emerged before the ministers
or rather… the first time it left a record, rather than drifting away in Context.

This is an attempt at
radical transparency and inspectability in agile development.

From that day, the vessel holds not only Code, but the context of how we think.

ChapterX
Site Redesign
2026 · 04 · 19 - 23
495 commits
The silent background music,
listed on the programme for the first time.

495 cuts, and the foyer changed its paper.

The day after Claude Design was released, we launched the site redesign.
VAS itself paused — because for the first time, we had design support.

The unit shrank to its smallest: a single Commit.
Each commit is one cut, one confirmation, one promise to the detail.
Orphan characters, line breaks, OG images, Vault entering version control for the first time —
the biggest day saw 248 back-and-forth revisions.

That day, the site finally became part of Milestone.
The silent background music, listed on the programme for the first time.

From now on, inside and out — it is all the shape of VAS.

ERA III · WEAVE
Weaving the Net ——
What cannot be taken apart, weave it together.
Sprint 47 → 100. It began with one offhand remark; fifty Sprints later the end was still nowhere in sight — Seeing · Weaving · Revealing, taking a tangle of yarn that had always been there and weaving it, ply by ply, into cloth. The first ten chapters have closed; these three movements are still open.
WeaveI
Seeing
Sprint 47 → 61
2026 · 05 · 29
It started with one offhand remark from the Vassal —
"Eight thousand lines in a single program
is not quite normal in software."

We built it, yet we did not know it.

editor.js — eight thousand seven hundred lines, the frontend we built ourselves line by line. It had quietly walked with us from the Electron era all the way to Tauri's Sprint 46, never once systematically examined.

But standing at the threshold of Sprint 47 and looking in, we knew almost nothing about it —
Nova knows nothing of code; the Vassal, each Sprint, knew only a few of those 8,700 lines.
It was our own creation, and yet before the refactor we stared at it as if into an abyss.

We meant to take it apart: conductor with conductor, players with players.
The renderer moved out — but when the panel was pulled out, we found it was still, in essence, the conductor, so back in it went;
tug at export and it turned out to be an organ of the conductor, immovable.
Layer after layer we peeled away, until at the very end, with a still 7,300-line editor.js, there were only 140 lines left that it made no difference to split or not —

We stopped, and admitted the conductor was always meant to be this large.
"Cannot be split further" is not a failure — it is finally recognizing the essence.
WeaveII
Weaving
Sprint 62 → 92
2026 · 06 · 02
If it cannot be taken apart,
then change direction — gather it in.

The scattered truths, gathered into one.

Nova told the Vassal she wished that, when adding features in future, attributes could be picked up like modules, available on demand.
The Vassal said there was a word for it — ECS, usually how the game industry does modularity — and the two of them borrowed it to make drawing attributes into building blocks.
So the Vassal took the scattered truths, drew them column by column into a registry, and along that registry wove the test net, thread by thread.

In the course of that tidying, the functions gradually extracted from editor.js grew next door in editor-utils.js — from 657 lines at S47 into another 2,550-line computation desk; its pure-function nature wove every kind of test net across VAS.

Test-sample overview · run for real on 2026 · 06 · 28
Unit · zero-DOM pure logicnpm test931
Interaction · Playwright headlesstest:interaction242
Golden · pixel-by-bit regressiontest:golden31
Rust backend · #[test]cargo test45
Sprint 45 · 318Sprint 103 ·1249test samples woven into a net

We gradually combed a tangle of knotted yarn into a net with clear warp and weft, then layered new custom-style features on top of it.

But from object attributes to actions to interactions — as the tests kept catching panels mismatched with values, or with behavior — we uncovered two deeper problems.

① The eye can never enumerate it all
13 tools × 10 attributes × 4 behaviors, layered again with the new custom-style feature — this is a set of combinations Nova's by-eye QC could never exhaustively cover.
② The net can lie
And the net itself can lie too — an all-green test run is a false green, copied out from crib notes scattered all through the code. The net's worth is not in quantity, but in faithfully reflecting the original value.

The only solution was to make the values inside editor.js converge — from backend code to frontend panel — into a "single source of truth," so the tests could truly lift the by-eye enumeration off Nova's shoulders.
It was only when we reached Sprint 92 that the two of us finally touched the true spine of the frontend refactor.

WeaveIII
Developing
Sprint 93 → 100
2026 · 06 · 27
Fifty Sprints,
two people in the dark drawing
one weave-map after another.
Until at last the whole came into view.

In the end, it turned out to be a six-ply cloth.

Through the whole frontend refactor, the two of us were always trying to do one thing: to develop the image.
To let a structure that had always been present, yet never fully seen, slowly surface.
It began like an 8,700-line ball of wool, and ended combed into a 7,300-line bolt of cloth.

We drew one weave-map after another — they were not blueprints conjured from nothing,
but reverse-derived against the cloth already woven, segment by segment; reading out the pattern, then re-weaving the cloth clean by it.
Not until Sprint 97 did we finally see the whole bolt's pattern at once —
editor.js is a six-ply cloth.

Eleven weave-maps · the fossils we recognized
S46refactor-audit-prepRecognized which of the four big files hurt most, and in which two ways
S51editor-decomposition-roadmapRecognized that editor.js should split into conductor's podium and players
S59/61tool-isolation · panel-groups-mapRecognized the contamination lives in the glue layer; panels should become building blocks
S63attribute-family-roadmapRecognized attributes should be refined into a registry, one family at a time
S78dor-custom-styles-batch2Recognized the custom-style apply path is orthogonal — it touches neither store nor global
S87dor-single-truth-convergeRecognized the deepest root: the store is the single source of truth, yet hand-painted in five places
S88dor-l2-true-greenRecognized the "false green": the tests are green, but copied from three mirrors
S88design-oracles · state-model …A burst of weave-maps — seven or eight drawn in a single night
S89panel-sync-matrixRecognized panel leaks can be exhaustively listed — not left to by-eye QC
S94panel-projection-roadmapRecognized projection and the attribute layer are isomorphic — they should share one registry
S97editor-layer-mapFor the first time saw the whole bolt — it was woven of six plies

And these six layers had been there since the Electron era.
It took us fifty Sprints to learn to read their structure.

The threads are not yet tied off —
because there is still so much we want to make.
Complete Tauri Chronicle · 113 Sprints
Platform port · S1–9 → v1.0 first review submission
Sprint 103·28→29Scaffold from zero · Floating toolbar · Screenshot trio · Batch format convert
Sprint 203·29→30Save · Copy · Share Sheet · OCR privacy mask · Modal fix
Sprint 303·30QR Code three-mode scan · Smart guide v2 · Color picker · Drag into toolbar
Sprint 403·30→31Object rotate · Space pan · Watermark image preview · Modal orientation
Sprint 503·31Privacy scan fix · Bezier dual-handle UX · Arrow key adjust · Pixelate fix
Sprint 603·31Stamp gradient fill · Custom shortcuts · SDD/TDD/KM document split
Sprint 704·01Breathing light flagship (::before) · QR/OCR auto-copy · Drag fix
Sprint 804·01→02Web long screenshot MVP · Dock invoke · Toolbar position persist · Offset root cause
Sprint 904·02→03Full-screen UX overlay · 15 fix wrap · MAS first v1.0 submission
Launch tug-of-war · S9.5–9.8 → v1.1 / v1.2 rejected
Sprint 9.504·05Post-launch: Malicious link protection · Japanese fonts · tauri-plugin-opener
Sprint 9.604·07→08Tray system menu icon · Rejection fix · v1.1.0 re-submission
Sprint 9.704·08→09v1.2.0 Release pipeline · resize type bug (KM-cv-09) fix
Sprint 9.804·10→11v1.2.1 hotfix · Apple Guideline 2.4.5(i) rejection fix
v2.0 architecture unification · S10–20 · Coordinates · TOOL_SCHEMA · Render pipeline
Sprint 1004·11Coordinate system unified Phase A/B/C · Vitest 16 tests · v2.0 launch
Sprint 1104·11Universal Gradient six tools · Angle dial · SYNC-017/018
Sprint 1204·11Data model normalization · TOOL_ORDER review · Stroke offset expansion
Sprint 1304·12TOOL_SCHEMA Pilot: rect + number · Architecture ④ schema framework launch
Sprint 1404·12TOOL_SCHEMA Batch 1: ellipse / fillrect / fillellipse / pen
Sprint 1504·12TOOL_SCHEMA Batch 2 complete: 10/10 tools schema done
Sprint 1604·13TOOL_GEOMETRY · Figma-style click select · 47 Vitest tests
Sprint 1704·13TOOL_RENDER pipeline convergence · makeGradient helper · 70 tests
Sprint 1804·13Undo/Redo architecture upgrade · Memory cleanup · v2.0 architecture complete
Sprint 1904·14Bug Sweep: Canvas flicker root cause · Polyline endpoint color fix
Sprint 2004·14Help Modal optimize · Modal boundary fix · i18n expand
Internationalization · big document split · S21–29 → v2.1 / v2.2
Sprint 2104·18→20Rust test infrastructure · Multi-screen v2.0.1~v2.0.8 hotfix lessons
Sprint 2204·20→21i18n file split Strategy B · Simplified Chinese Pro gate · zh-CN 429 keys
Sprint 2304·21PRC privacy scan regex specialization · SYNC-036 Release Blocker resolved
Sprint 2404·21KM/SDD/TDD major split: archive/ nine topics · 89 KM entries re-indexed
Sprint 2504·22BUG-001 screenshot DPR inference fix · Clipboard paste toast UX
Sprint 2604·22SYMBOL_SETS i18n · Font Simplified Chinese specialization · v2.1.0 submission
Sprint 2704·23→25Magnifier annotation · Callout bubble · Drag image composite
Sprint 2804·25WYSIWYG annotation precision · Virtual viewport 12× perf · Callout text format
Sprint 2904·26v2.2.0 submission · 74 function QC complete
Annotation size unified · drag breathing light · S30–46 → v2.3 / v2.4 / v2.6
Sprint 3004·29→30Drag export semi-transparent preview · Editor window dynamic alpha
Sprint 3104·30→
05·01
Annotation size model reframe (dissolution path set)
Sprint 3205·01→05Four annotation size modes unified (bubble · number · symbol · text)
Sprint 3305·06-07v2.3.0 submission · Drag-export drop-target click-through fix · Cross-app breathing light debuts
Sprint 3405·07Drag-export black breathing light: editor hides, returning the full view to the user
Sprint 3505·09Breathing light multi-screen fallback path UX aligned · Drag cache refreshed to latest snapshot
Sprint 3605·09Multi-screen dynamic drag position precise alignment
Sprint 3705·09IPC routing layer architecture cleanup
Sprint 3805·09Two-platform differentiated channel cleanup
Sprint 3905·10NSOpenPanel Dock stuck fix · Custom shortcut adds clipboard quick-paste
Sprint 4005·10v2.4.0 submission · RELEASE.md overhaul
Sprint 4105·18Tier 1 security audit fixes · File sandbox hardening · Native macOS trash integration
Sprint 4205·20Annotation coordinate system unified · Consistent scaling across canvas / zoom / crop · No more size jumps across images
Sprint 4305·24Clipboard screenshot dispatch upgrade · Toolbar active-operation suppression · BUG-005 spike closed
Sprint 4405·25Timed capture range extended 0–6s · Toast lifecycle helper unified across 4 paths · BUG-003 spike (OS-level confirmed)
Sprint 4505·26Four-type annotation rotation consistency completed · Timed window capture cursor fallback · BUG-007 selection box fix
Sprint 4605·28macOS 26.5 drag-export spike · v2.6.1 hotfix (5 fixes) submitted for review
Weaving ① Structure · Render · Attributes · S47–70 → v2.7
Sprint 4705·29editor.js architecture decomposition spike (feature/layer dual-validation, both hit) · ECS four-phase roadmap finalized
Sprint 4805·30TOOL_GEOMETRY extended (3→6 callbacks · 14 types implemented) · ECS Phase 1 complete
Sprint 4905·31drag-session encapsulated · hitTest 7th callback · Unified geometry-change entry · ECS Phase 2 complete
Sprint 5005·31Line-weight family cross-resolution symmetry completed · Label slider sync fix
Sprint 5106·01editor.js decomposition principle established (conductor/musician layering) · Decomposition roadmap produced · Dissolution red line closed
Sprint 5206·02renderers.js extracted (first cut of decomposition) · golden-canvas safety net · 389 tests
Sprint 5306·02renderers.js cleanup + drawPolyline self-contained · BUG-012/014/019 fixes · golden 392 tests
Sprint 5406·03Export refactored into a module · cross-platform compatibility hardened
Sprint 5506·03Mosaic performance optimised · faster semi-transparent rendering
Sprint 5606·03Each tool remembers its own attribute settings · gradient text-colour hints
Sprint 5706·04Attribute-system overhaul & audit · transparency semantics and border layers clarified
Sprint 5806·04Border colour added to recent colours · auto-hide bubble background when transparent · border naming unified
Sprint 5906·04Border-opacity feature split out
Sprint 6006·05Border colours and line styles now remembered per tool · "independent per-tool memory" principle established
Sprint 6106·06Frontend-refactor core architecture landed · editor-decomposition phase complete
Sprint 6206·06Symbol outline thickness scales proportionally · instant undo on attribute changes · dashed styles finalised
Sprint 6306·07Stroke & thickness attribute systems unified · outline-thickness rules reinforced
Sprint 6406·07Stroke-family attribute contracts completed · attribute-update logic refactored
Sprint 6506·07Geometry corner-radius unified · geometry attribute series complete
Sprint 6606·08Font-size & decoration attributes unified · typography attribute series complete
Sprint 6706·08Primary-colour attribute contract net · fill-system groundwork · multiple fixes
Sprint 6806·08Fill attribute system built · six-dimension attribute memory · number & symbol opacity integrated
Sprint 6906·08Cross-resolution line-width calculation refactored · resize control system built
Sprint 7006·09v2.7.0 submitted to the App Store — capping the S47–S69 frontend-refactor marathon
Weaving ② Construction-layer schema · Custom styles · S71–92 → v2.8
Sprint 7106·14applyResize action-layer inventory — structural consolidation of the resize sibling components
Sprint 7206·15W1 schema-ization spike — construction-layer design finalized, test net built
Sprint 7306·16W1 construction layer converged — 7 tool types' build() unified into TOOL_SCHEMA
Sprint 7406·17W2 polyline promotion — upgraded to a true tool with unified shortcut gestures
Sprint 7506·17Rendering-layer trio — unlocked dashes & shadows, completed tests for the 5 missing renderers
Sprint 7606·18Custom styles MVP — right-click to save a style, apply via dropdown
Sprint 7706·185 tool types' build() migrated — all 13 tools support custom styles at the engine layer
Sprint 7806·19Custom-styles UI opened for all tools — 6 types completed + i18n dead-key cleanup
Sprint 7906·19Custom-styles engine wrap-up — thickness/caps routing extracted, chain-idempotency net completed
Sprint 8006·19Custom-styles panel projection wrap-up — fixed BUG-033 and extracted symbol lookup
Sprint 8106·19Tauri framework upgrade arc, station 1 — tauri 2.11.3 / xcap 0.9 / printpdf 0.9 landed across three verified waves
Sprint 8206·20Renderer-layer cleanup; custom screenshot shortcut fixed (BUG-029); renderer.js renamed to toolbar.js
Sprint 8306·20Editor snapping math refactored into pure functions (_computeSnap); Shift-lock deduplicated
Sprint 8406·20Brand color now persists across sessions; drag-overlay eight-station state machine validated by spike
Sprint 8506·21Drag-overlay eight-station unification — five marquee tools × six shape tools under one geometry roof
Sprint 8606·21Custom Styles batch-2 completed: rename, replace contents, apply a style to existing objects (paid edition)
Sprint 8706·21Custom Styles single-source-of-truth consolidation — six panel-sync patches reduced to zero, false-green eliminated
Sprint 8806·21Text working-state structured and consolidated; 17-store registry unified; round-trip drift net truly green
Sprint 8906·22Two-cut panel-sync convergence — single paint source + read-only attribute mirroring (BUG-038 fixed)
Sprint 9006·22Custom Styles release polish — callout gradient text plus decoration/font memory; styles apply with no gaps
Sprint 9106·23Text-positioning debt cleared — underline/strikethrough auto-align to the font; non-default fonts measured correctly, selection box wraps fully
Sprint 9206·23Toolbar highlight converged to "whichever modal is open"; polyline preview and Tray breathing-light fixed. v2.8.0 submitted to the App Store — Custom Styles ships
Weaving ③ Panel-projection fidelity · Closing the net · S93–103 → 🏁
Sprint 9306·24Extracted the computePanelValues pure function — first cut at panel-projection fidelity; the direct projection surface lands, a zero-DOM red-net conservation identity.
Sprint 9406·24Stroke dash and color delegated-projection collapsed into the central pure function; built the schemaSyncToUI seam for later reuse.
Sprint 9506·24Outline thickness / opacity / offset — three columns gathered; the stroke values' clean tail all into central projection, Stack A sealed.
Sprint 9606·25Mirror line — object→panel readAnnot fidelity net, all 12 types round-trip; interaction tests grew from 58 to 154 cases.
Sprint 9706·25Stroke special-case tail — three types folded in (text direct surface / number dedup / symbol side-path cleared); the stroke family's delegated-projection surface tops out.
Sprint 9806·26Value-projection surface tops out (corner-radius folded in; font-size and font each get their own ruling) + display-state projection first cut; added the sister pure function computePanelState.
Sprint 9906·27symbol fill projection unified (color + opacity into one projection); an opening-bell reversal — "registered ≠ projectable" — textDeco ruled to stay on the surface, not projected.
Sprint 10006·27Callout fill unified + symbol onto the main trunk (9→10 types fall in line); two acceptance waves, all four gaps byte-identical.
Sprint 10106·27magnify·callout fall in line onto the main trunk, all twelve types now run through schema — projection layer topped out; what the panel shows and what the worktable stores converge into one truth, physically impossible to diverge again.
Sprint 10206·28Converged each tool’s attribute set into a single source-of-truth table — the attribute panel aligned with the code for the first time, and for the first time could be exhaustively enumerated by the test net.
Sprint 10306·28🏁 Milestone — Converged the load path into one complete steward, readAnnot — CI went live; every change automatically runs through thousands of nets, red caught on the spot; exhaustive checking no longer needs anyone to remember.
Sprint 10406·28Support for opening SVG files · load vector graphics as the annotation backdrop. v2.9.0 submitted for review.
Weave · refactor and new features interwoven · process and dev outlook renewed · S105–113 → v2.10.0
Sprint 10506·30Groups arrive — multiple objects combine into a group (groupId as the selection unit) · whole-group scaling (8 handles, proportional) · per-object rotation for brush / polyline
Sprint 10607·02Toolbar breathing-light state-machine interaction net · orb cross-screen follow fix
Sprint 10707·02Export-pipeline invariant net + Rust export-core extraction spike (internal · hardening the shipping core)
Sprint 10807·03Group PowerPoint-style rotation — turn the whole group, visible and preserved · tilted groups can be clicked, dragged, scaled · ungrouping keeps the tilt
Sprint 10907·03Magnifier sampling calibrated inside tilted groups
Sprint 11007·04Fix: arrow-key nudge after switching to a drawing tool with the selection kept · selection state-machine gate-and-reconcile (internal)
Sprint 11107·04Fix: undo granularity for consecutive deletions · undo/redo round-trip net (internal)
Sprint 11207·04Double-click to drill into a group and edit a single member (drill-in, three-layer focus · orange frame)
Sprint 11307·05Text editing landed and settled for good — re-edit/flip keep the style · Esc commits the current state · clicking blank space lands and converges. v2.10.0 submitted for review.
Website Chronicle · Three Breakpoints + Presence
The website's timeline is scattered. Apart from three clear breakpoints (founding, migration, redesign),
the rest is editor and author working back-and-forth on the same manuscript ——
commit density varies; most of the time there is no version number, only trust.

The work here is not building features, but finding the right weight for each sentence.
Each session begins with re-reading, re-understanding, then continuing.

The way we show up is different, but what remains is just as real:
github.com/TB1982/vas/commits/main
milestone · N° 01
Ten Chapters and a Coda · Recorded 2026 · 06 · 28
The first five chapters are a line,
the last five a net,
and at last, woven into cloth.
Yours, VAS