Source: c132 Native Design Prototyping — Phase 1, 2026-11-11 · A captured by scripts/shot-programs/c132-bake-off.json · B captured by qnative c2 (stories, off-screen, thread p2-harnesses) · the pick is Mark's, review.md
../qnative, c131 Phase 2), photographed off-screen. Both read the same world files, so the rows are the same. Drag the wipe to compare. Phase 1 had B for one world only; Phase 3's native capture mode took every story per world (the stories honour QPOINT_WORLD through a one-line hand-on patch to qnative c2), so every state now has both sides. qnative c2 recut the default world to nina-mbp and kept priya's cut as pilot while Phase 3 ran; the lab re-synced and both media were recaptured, so meridian-day90 below is nina's laptop and pilot is the cut the first bake-off showed. clip, scale), B rendered off-screen per world by the native capture mode (Phase 3).The Inventory overview
Twenty micros from the seven listings on one machine, four to a row on the sunken canvas, the shared period at the right. A composes DataIndexSection and DataMachineMicro from the layer; B draws the same family in Rust (layer::data).


A. Twenty micros at zero, the segment bars empty: the overview's honest empty state.
B. The real overview on the fresh world: twenty micros at zero.
minimal
chen-mba at day 90: the day-89 new hire, one monitored agent, a shadow Windsurf installopen A live →

A. One monitored harness and a shadow Windsurf install, a handful of sessions, one provider.
B. The real overview on chen-mba.
meridian-day90
nina-mbp at day 90, the default since qnative c2's recut (2026-11-11): a quiet laptop, three monitored harnesses, nothing in the arcopen A live →

A. The twenty micros on nina-mbp's rows: 2 providers, 3 harnesses here (Claude Code, Claude Desktop, Cursor CLI), 4 models, 5 MCP servers, 22 tools.
B. The real overview on nina-mbp, taken by the native capture mode after the recut, mirrored into design's atlas (D9).
pilot
priya-x1 at day 90: the pilot user and migration lead, the world a violation tour switches to (the bake-off's first meridian-day90 captures were this cut)open A live →

A. The twenty micros on priya-x1's rows: 3 providers, 9.4m tokens, $311, 4 harnesses here, 5 models, 5 MCP servers, 23 tools, 187 tool invocations.
B. The real overview on priya-x1 (c2's first capture was of this cut, then named meridian-day90): twenty micros from the seven listings, four to a row on qdash's grey canvas, the shared period on the right.
Harnesses
The listing translated fleet → personal (c2's six rules): Installed here with a monitored or shadow mark per harness, Work by tokens; the ledger without endpoints, with version and last active brought forward; Kind / Provider quick filter and the column picker.


A. No harnesses found on this machine: the band says 0 harnesses and nothing observed; the ledger says the list fills in when the scan finds one.
B. The real listing on the fresh world: the band at zero, the ledger's empty state. The rail's Help › Getting started group (the tour launcher, c131 D20) showed up as a drift in the first wipe; the skin took it at the Phase 3 review stop.
minimal
chen-mba at day 90: the day-89 new hire, one monitored agent, a shadow Windsurf installopen A live →

A. Claude Code monitored with two sessions; Windsurf a shadow install that never ran under qcontrol; the Work card has one bar.
B. The real listing on chen-mba: Claude Code monitored, Windsurf a shadow.
meridian-day90
nina-mbp at day 90, the default since qnative c2's recut (2026-11-11): a quiet laptop, three monitored harnesses, nothing in the arcopen A live →

A. Installed here (three harnesses, all monitored) and Work (tokens by harness), then the ledger: Claude Code 9 sessions, Claude Desktop 4, Cursor CLI 3.
B. The real listing on nina-mbp, taken by the native capture mode after the recut, mirrored into design's atlas (D9).
pilot
priya-x1 at day 90: the pilot user and migration lead, the world a violation tour switches to (the bake-off's first meridian-day90 captures were this cut)open A live →

A. Installed here (four harnesses, three monitored, Ollama a shadow) and Work (tokens by harness), then the ledger: version, status, providers, sessions, spend, last active.
B. The real listing on priya-x1 (c2's first capture was of this cut): Installed here and Work; the ledger without endpoints, with version and last active brought forward; Kind/Provider quick filter, column picker, sort.
The harness page
Harness detail and Harness install detail merged (rule 3): the identity header with Status and the install's long tail, tiles Providers · Tokens by model · Spend, jump pills over Sessions, Configured here and Surface.


A. The not-found state (the app's Load::Ready(None)): claude-cli is not on this machine; no install or run was found here.
B. The real page's not-found state on the fresh world.
minimal
chen-mba at day 90: the day-89 new hire, one monitored agent, a shadow Windsurf installopen A live →

A. Claude Code on chen-mba, monitored, two sessions all time; one provider, tokens by model, the spend; the install's config behind Show All Metadata.
B. The real page on chen-mba: 17 calls, 478k tokens by three models, $17.97.
meridian-day90
nina-mbp at day 90, the default since qnative c2's recut (2026-11-11): a quiet laptop, three monitored harnesses, nothing in the arcopen A live →

A. Claude Code on nina-mbp: Status monitored and the metadata grid; Providers, Tokens by model, Spend $185.11 all time; the jump pills over Sessions (14), Configured here and Surface.
B. The real page on nina-mbp, taken by the native capture mode after the recut, mirrored into design's atlas (D9).
pilot
priya-x1 at day 90: the pilot user and migration lead, the world a violation tour switches to (the bake-off's first meridian-day90 captures were this cut)open A live →

A. Claude Code on priya-x1: Status monitored and the metadata grid; Providers (769 calls), Tokens by model, Spend $667.86; the jump pills over Sessions (40), Configured here and Surface.
B. The real page on priya-x1 (c2's first capture was of this cut): the identity header with its Status and the metadata grid; tiles Providers, Tokens by model, Spend; the jump pills.
meridian-day90
nina-mbp at day 90, the default since qnative c2's recut (2026-11-11): a quiet laptop, three monitored harnesses, nothing in the arcopen A live →

A. Landed on Sessions: ten of the 14 sessions on nina-mbp, sortable, then Show all. The mock's pills stay inline; the band does not dock inside the window's own scroll box.
B. Landed on Sessions in the real app on nina-mbp: the band docks with the crumb trail and compact pills; 14 sessions, ten then Show all.
meridian-day90
nina-mbp at day 90, the default since qnative c2's recut (2026-11-11): a quiet laptop, three monitored harnesses, nothing in the arcopen A live →

A. Landed on Surface: Models, MCP Servers, Repos & Workspaces and Tools as DataSurfaceSection draws them; Users, Teams and Versions leave on one machine.
B. Landed on Surface in the real app on nina-mbp: Models, MCP Servers, Repos & Workspaces, Tools (framed panels, label columns as wide as their widest label, flat 15 % primary bars). Users, Teams and Versions leave on one machine.
Phase 4 · Status through the loop
Mark's worked example (2026-11-11): the page briefed (status-brief.md), mocked in A on the four worlds, then built in B from the brief and the mock, with the sensor's six shapes served by the bridge beside each world (D10) until c131 D17's routes exist. The states no world carries (starting, off, connected) are a knob in A and a story parameter in B; both say so. Then c131 D21 reshaped the page the same evening: Status became the landing (the state line and the plane line, what it has found, the overview's twenty micros below), the facts in full and the log moved to a Sensor page, and an Activity page joined. Both media followed: A below is the lab's; B is qnative c5's build of D21, captured per world with the clock frozen at the world's own dates (threads p2-status and p2-activity, mirrored into this atlas), so the rows agree to the digit. The running app shifts a synthetic world's clock to today and says so in its footer; the lab keeps the world's dates, since the captures do.


A. The landing after D21: on, reading the fresh world, no plane; nothing found yet; the twenty micros at zero.
B. The real landing on the fresh world (c5): qcontrol on, reads this machine with no records yet; nothing found; the micros at zero.
minimal
chen-mba at day 90: the day-89 new hire, one monitored agent, a shadow Windsurf installopen A live →

A. The landing after D21: on; one session running now; two harnesses, one a shadow; the micros for the window below.
B. The real landing on chen-mba (c5): on; two sessions, 211 events since May 3, one monitored harness and a shadow.
meridian-day90
nina-mbp at day 90, the default since qnative c2's recut (2026-11-11): a quiet laptop, three monitored harnesses, nothing in the arcopen A live →

A. The landing after D21: the state line and the plane line; 25 sessions, 2,317 events since May 8, three monitored harnesses, 2 connections out of sight; the twenty micros below.
B. The real landing on nina-mbp (c5): on, as the bridge says it; 25 sessions, 2,317 events; the micros below.
pilot
priya-x1 at day 90: the pilot user and migration lead, the world a violation tour switches to (the bake-off's first meridian-day90 captures were this cut)open A live →

A. The landing after D21: on · degraded in the sensor's own words; the plane line; 85 sessions, four harnesses with Ollama a shadow; the micros below.
B. The real landing on priya-x1 (c5): on · degraded in the sensor's own words.
meridian-day90 · connected
the plane connected: a knob in A, a story parameter in B, until a world is cut for itopen A live →

A. The connected sentence; Reads says HQ over the plane; the configuration managed at HQ.
B. The real app over a plane source (a fixture plane serving nina's world, c5): the connected sentence; the sensor's facts not served by a plane.


A. The facts fill in as they arrive; what was found stays dimmed.
B. The real app starting (forced, the footer says so): the facts fill in as they arrive.


A. qcontrol is not running on this machine; what it recorded last stays, dimmed; no log.
B. The real app off (forced, the footer says so): what it recorded last stays.


A. On for four minutes, 2 workers, 56 MB; no config file, the defaults; not connected; the start lines in the log.
B. The real Sensor page on the fresh world (c5), the same bridge behind it.
Sensor · minimal
chen-mba at day 90: the day-89 new hire, one monitored agent, a shadow Windsurf installopen A live →

A. On for two days; the config file found (observe, telemetry); not connected; the log tail.
B. The real Sensor page on chen-mba (c5).
Sensor · meridian-day90
nina-mbp at day 90, the default since qnative c2's recut (2026-11-11): a quiet laptop, three monitored harnesses, nothing in the arcopen A live →

A. On for six days, 3 workers, 71 MB; the config file found (observe); a warn line about a pinned-TLS connection.
B. The real Sensor page on nina-mbp (c5).
Sensor · pilot
priya-x1 at day 90: the pilot user and migration lead, the world a violation tour switches to (the bake-off's first meridian-day90 captures were this cut)open A live →

A. On · degraded; enforce mode with an egress allowlist in the file; the error and warn lines in the log.
B. The real Sensor page on priya-x1 (c5).


A. Reads HQ over the plane; the configuration managed there; the plane's details as the mock says them.
B. The real app over a plane source (c5): the sensor's own facts are not served by a plane (D13, D17), so each row says so.


A. No sessions in the window; the band at zero, the history and the ledger empty.
B. The real Activity page on the fresh world (c5): no sessions captured yet.
Activity · minimal
chen-mba at day 90: the day-89 new hire, one monitored agent, a shadow Windsurf installopen A live →

A. Four sessions in 30 days, one running now, Claude Code only; the days they ran; the ledger.
B. The real Activity page on chen-mba (c5): four sessions, one running; tokens and cost by the day.
Activity · meridian-day90
nina-mbp at day 90, the default since qnative c2's recut (2026-11-11): a quiet laptop, three monitored harnesses, nothing in the arcopen A live →

A. 16 sessions in 30 days across Claude Code, Claude Desktop and Cursor CLI, stacked by day; the ledger.
B. The real Activity page on nina-mbp (c5): 16 sessions per day, the non-compliant ones marked; the lab's history is by harness, the app's by compliance.
Activity · pilot
priya-x1 at day 90: the pilot user and migration lead, the world a violation tour switches to (the bake-off's first meridian-day90 captures were this cut)open A live →

A. 31 sessions in 30 days across three harnesses; the ledger.
B. The real Activity page on priya-x1 (c5): the flagged days in the warning tone.
Time and friction
A's figures are this session's wall clock (bake-off-log.md, an agent building with the layer and the worlds already in hand). B's are qnative c2's commit times on 2026-11-10 and its record (c2, design's c131 Key Changes); c2's session start is not in the log, so its groundwork is bounded from above by the day. Neither figure is a person mocking: no person has mocked in either medium yet (Q1).
| A · Vue mocks in a native skin | B · the stories crate in ../qnative | |
|---|---|---|
| The three views, three states | 12 minutes of wall clock from the first line to the three views answering on :3000 in all three worlds (09:14 → 09:26 MST, 2026-11-11); about 40 minutes to the captured, cropped and verified bake-off page. One agent, no build loop, hot reload. | About 60 minutes between review stop 1's follow-up (17:52) and review stop 2 (18:52) on 2026-11-10, which also built the layer in Rust the three views stand on (the Data Machine family, the small pieces, the furniture, the ledger, the Surface). One agent, Rust builds of 2–5 s incremental. |
| Groundwork the views stood on | The layer (exists, the web app's), the worlds (copied by Phase 0 prep), the capture system (c69–c71), the design site. Built new: useNativeWorld (one file), the native skin (six small components), the three rollup ports (one file). | The world cut and its crawl, 72 generated types with a strict drift test, the generic nozzle and repositories, the token bridge and the Qpoint kit theme, the layer crate, the stories crate and off-screen capture, the Dev section and native component docs: c2's kick-off to 17:52 the same day (the session's start is not logged; the c1 spike closed at 09:56). |
| The rest of the section | Not built: Providers, Models, MCP Servers, Skills, Tools, Repos & Workspaces and their details are inert in the rail. | 1 h 43 (18:52 → 20:35): six listings and seven details, each to a spec measured on qdash, with the table expand row and the skill file editor. |
| States exercised | Three worlds × three views, plus Sessions and Surface landed: eleven captures. Loading (em-dash per value, skeleton rows), empty, not-found, minimal, typical. | In Phase 1, one world (priya-x1) × three views, plus Sessions, Configured here and Surface landed, two in dark: nine captures in thread p2-harnesses. In Phase 3 the native capture mode took the three views in all three worlds plus Sessions and Surface in two: thirteen more (thread worlds), so every state above has both sides. |
| Friction met | The layer's DataTable sorts by column label, so initialSort takes the label; NavJumpPills spies on window.scrollY, so inside the window's own scroll box the highlight does not follow (the jump works); the layer has no Lucide glyphs, so the rail's icons are hand-drawn; in Phase 1 the capture was a 1× viewport shot cropped to the window by hand (capture.mts had no scale or clip flag; Phase 3 added both); the world loads after hydration, so every page shows its loading state for a frame; ActorHeader's metadata cell wraps under the identity at 844 px where B keeps three cells in a row. | From c2's record: CSS subgrid became one flex row per grid row; fit-content(45%) became two flex columns; auto-fill reads a width probe one frame late; the kit's DataTable has one fixed row height, so the expand row was built on GPUI's variable-height list; GPUI records child bounds before the scroll offset (the docked pills fix); the bundled variable Inter drew every weight regular (five static faces bundled instead); macOS clamps a window to the display height, so a story must fit about 900 points; seven places where qdash serves what its TypeScript does not say became generator overrides. |
| Who can mock | A person at a laptop with a browser, or an agent; nothing to install beyond the design repo. The lab's tools work unchanged (the review walk, Illustrator from the DOM, the capture program). | An agent with Rust 1.95+ and the workspace. A person reviews a built binary or the PNGs; a person mocking in Rust is untested. |
| Fidelity and drift | The layer's real Vue components, the kit's chrome imitated. It can draw what the kit cannot and cannot show what the kit does differently (text input, the fixed-height table, the docked band). Drift is the risk D1 names. | The real thing: what the story draws is what ships. Fidelity against the design site is the scorecard's (28 of 36 components at 3). |
| Captures | capture.mts, a shot program with the world in each route, scale 2 and clip .native-window (Phase 3); subject page/native-<view>, variant world=<name>; in the design atlas under thread p1-bake-off-a. | The stories binary: Window::render_to_image at 2× off-screen, no Screen Recording. Phase 3's native capture mode (capture.mts --native) runs it per world with QPOINT_WORLD and merges the PNGs into public/cycles/qnative/ with surface: native and variant world=<name> (thread worlds); the stories read QPOINT_WORLD through a one-line patch handed to qnative c2. |
What the evidence suggests
Written in full in review.md, where Mark's rulings of 2026-11-11 (D1, D7, D8) are recorded; the short form as it stood at the review stop, with its last point updated by Phase 3:
- B is the medium of record for a native screen. It is the real thing, its stories are the page's tests, its captures are solved (off-screen, 2×, light and dark), and once the layer in Rust existed the three views took an agent about an hour. Nothing A draws can be shipped; everything B draws is shipped.
- A is the ideation and review medium, for a person without a toolchain and for an agent sketching before committing to Rust: twelve minutes to the three views in three worlds with no build loop, every lab tool working unchanged. Its rule is D6: an A mock names its world, so the B story that follows can be checked against it row for row.
- The seam is the world, not the token bridge alone. The token bridge keeps the two drawings one colour; the shared world keeps them one truth. The bake-off's clearest finding is that a mock and a story on the same world are comparable with a wipe, which is what a review stop needs.
- Phase 3 gave B its per-world captures (the native capture mode, D3: every story per world into the atlas with
surface: native), so B's side of a comparison has no holes; Mark ruled on 2026-11-11: B of record, A to sketch and review, the chrome an imitation checked by a wipe, a mock outliving its story.