NAC3 v2.3 / Migration paper
← spec home  ·  600-run benchmark →  ·  2026-05-20
Migration paper · 3 paths · 1 app · byte-by-byte diff

From raw HTML to NAC3,
three different ways.

One vanilla calculator. Three decoration paths: Forge silent (one-shot Claude Sonnet 4.6, no human input), Forge assisted (same call plus an ambiguity round), and Sumi manual (hand-decorated by Claude Code in ~30 min). All three end up 5/5 functional on the same agentic-driver task set. The interesting reading is in the deltas: id naming, role taxonomy, label density, and the dollar cost of each path over thousands of dispatches.

1 fixturevanilla calculator (16 buttons, 4 ops)
3 decorationssilent · assisted · manual
5 driver tasks3+4 · 12+15 · 7x8 · 100/4 · clear+2+2+2
15/15 OKfunctional success, all three
Decoration cost
$0.045
Forge one-shot per app, Sonnet 4.6, ~25 s
Driver cost / 5 tasks
$0.028
Forge silent · Sonnet 4.6
Manual vs Forge
+24%
Manual's i18n bloat costs more per dispatch
Functional success
15/15
All three drove the calc to the right answer
01 / The three papers

What we measured, and how to reproduce it.

Three paper pages. Results covers tokens, latency, success rate, and the cost of ownership over N dispatches. Methodology documents the harness, the dispatch loop, and the role-taxonomy decisions. Byte-by-byte diff is a side-by-side of every NAC attribute set on every interactive element, plus the manifest entry comparison, plus the divergence list.

02 / Live demos

Open each decoration in your browser.

Four pages: the raw calculator (no NAC3 at all), and the three NAC3-decorated versions. Each NAC3 build is drop-in -- includes the runtime, the nac-bridge, and Yujin Pilot (the floating chat that drives the calc via voice + multi-provider LLM). To use Pilot, click the floating sumi-e branch, open Configuracion, paste at least one API key (Anthropic / OpenAI / Google / DeepSeek / Groq), then ask "calcula 3 mas 4".

Baseline / no NAC3

calc-raw

The original vanilla calculator. No data-nac attributes, no manifest, no runtime. Anchors what the "before" of every migration looks like.

Note: Pilot will not appear here -- this fixture is intentionally untouched. Open the other three to see the floating button.
Open calc-raw  ↗
Path 01 / Forge silent

calc-forge-silent

Output of yf migrate --ai-silent. Claude Sonnet 4.6 decorated the page in one shot, no questions, no human input.

Verbs are shortened (add, subtract, multiply, divide). Display and history are role=field. No label_i18n on non-action elements.
Open silent demo  ↗
Path 02 / Forge assisted

calc-forge-assisted

Output of yf migrate --ai-assisted. Same model + tooling as silent, but allowed to flag ambiguities. For a calculator the model raised none -- output matches silent.

Assisted only diverges from silent on apps with genuine ambiguity (e.g. two buttons that could both reasonably be a "save" verb). Calc has none.
Open assisted demo  ↗
Path 03 / Sumi manual

calc-sumi-manual

Hand-decorated by Sumi (the Claude Code agent that ran this experiment). Includes the cleaner taxonomy: an explicit keypad region, label_i18n on every element including fields and regions, op-prefixed action ids.

More structurally honest, but also +24% more input tokens per dispatch. Useful as a reference for what a "by-the-book" NAC3 decoration looks like.
Open manual demo  ↗

Reading the demos -- what to look at first

1. Open calc-raw in one tab + any of the three decorated demos in another. The visible UI is byte-identical. NAC3 is purely additive -- decoration never changes what the user sees or how the calc behaves to mouse clicks.

2. Right-click → View Source on any decorated demo. Inspect the data-nac-* attributes. Notice how Forge keeps the manifest tight while Sumi-manual carries label_i18n on every element.

3. Click the floating sumi-e branch (bottom-right). Open Configuracion. Paste an Anthropic API key (Claude Sonnet 4.6 default). Ask: "calcula 3 mas 4". Watch the manifest verbs dispatch in the pizarra panel. Voice STT works in Chrome / Edge.

4. Each demo is fully self-contained -- nac.browser.js, nac-bridge.js, pilot.bundle.js all served from the same directory. No CDN dependencies at runtime.

03 / The toolchain

Forge + Pilot. Build once, drive forever.

Yujin Forge turned calc-raw into calc-forge-silent in 23 seconds for $0.045. Yujin Pilot embeds the multi-provider chat + voice cockpit in any Forge-decorated page. Both ship today -- Forge as a CLI (npm i -g @yujin/forge + yf migrate), Pilot as a single-file IIFE bundle injected by yf pilot install.