← Design · c132

review.md

c132 review stop: the bake-off on Inventory (Phase 1, 2026-11-11)

Reader: Mark. The decision: the medium for native screens (Phase 2, D1). What to look at: the bake-off page (A beside B, wipe them), the mocks live in each world, and the figures below. Phase 2 is your pick, not the evidence's; this note says what the evidence suggests and why.

What was built

  • Phase 0. app/composables/useNativeWorld.ts: useNativeWorld(name) loads app/data/worlds/<name>.json (one dynamic import per world, so only the named world is bundled; loaded on the client, so the server renders the loading state and the payload carries no rows) and exposes the manifest and get(route, params?), which builds the nozzle's key (route?sorted-query; period=all dropped; quote_plus encoding) from types::Request::key. The plan's Phase 0 records what each medium needs installed and the bake-off page (Inventory, ruled).
  • Phase 1, medium A. Three Inventory views in a native skin: the landing (twenty micros), Harnesses (band and ledger, fleet → personal as c2 did) and the merged harness page (header, tiles, Sessions, Configured here, Surface), each in fresh, minimal and meridian-day90, rows only from useNativeWorld. The skin is the kit's chrome in our tokens and Inter (app/components/native/: Window, PageHeader, Period, LabBar, Skeleton, Icon); the pages compose the layer (DataIndexSection, DataMachineMicro, DataMachine, DataRankedBars, DataSegmentBar, DataTable, DataListingBar, ActorHeader, NavJumpPills, DataSurfaceSection, UxPill, AgentAvatar). The rollups are ported from landing.rs, harnesses.rs and harness.rs (app/data/native-inventory.ts). Registered as the native phase of /pages.
  • Medium B is c2's: the real app on GPUI, captured off-screen on priya-x1 (thread p2-harnesses). Not built here.
  • The bake-off page /pages/native/bake-off: A beside B per view and state (UxImageCompare: wipe, onion, side by side), the time and friction per medium, and this note's short form. Eleven A captures in the atlas (thread p1-bake-off-a, subjects page/native-inventory, page/native-harnesses, page/native-harness, variant world=<name>), cropped to the window B was photographed at (1120 × 720 points).

The figures

A · Vue mocks in a native skinB · the stories crate
The three views in three states12 min of wall clock to the three views answering on :3000 in all three worlds (09:14 → 09:26); about 40 min to the captured, cropped and verified bake-off page (the log). One agent, no build loop.About 60 min between 17:52 and 18:52 on 2026-11-10 (c2's commits), which also built the layer in Rust the views stand on. One agent, 2–5 s incremental builds.
The groundworkThe layer (the web app's), the worlds (Phase 0 prep), the capture system, the design site. New: one composable, six small components, one rollup file.The world cut, 72 generated types with a strict drift test, the nozzle and repositories, the token bridge and theme, the layer crate, the stories crate and off-screen capture, the Dev section and component docs: c2's kick-off to 17:52 the same day.
The rest of the sectionNot built; the other rail items are inert.1 h 43 (18:52 → 20:35): six listings and seven details to specs measured on qdash, the expand row, the skill editor.
States photographed3 worlds × 3 views, plus Sessions and Surface landed: 11.1 world × 3 views, plus Sessions, Configured here and Surface, two in dark: 9. minimal and fresh exist in the app (--world) and are unphotographed.
FrictionDataTable sorts by column label; NavJumpPills spies on window.scrollY, so inside the window's scroll box the highlight does not follow; no Lucide glyphs in the layer (hand-drawn); the capture is a 1× viewport shot cropped with PIL (capture.mts has no scale or clip flag); the program's hideCss hid the rail until it became an aside; ActorHeader's metadata cell wraps under the identity at 844 px where B keeps three cells in a row.From c2's record: subgrid → one flex row per grid row; fit-content(45%) → two flex columns; auto-fill reads a width probe one frame late; the kit's table has one fixed row height (the expand row on GPUI's list); child bounds recorded before the scroll offset; variable Inter drew every weight regular (five static faces bundled); a story must fit about 900 points; seven contract overrides.
Who can mockA person with a browser, or an agent. Every lab tool works unchanged.An agent with Rust 1.95+ and the workspace. A person reviews a binary or PNGs; a person mocking in Rust is untested.
Fidelity and driftThe layer's real components, the kit's chrome imitated: it can draw what the kit cannot and cannot show what the kit does differently.The real thing; 28 of 36 components at fidelity 3 on the scorecard.

What the evidence suggests

  1. B is the medium of record for a native screen. It is the real thing, its stories are the page's tests (R6), its captures are solved (2×, off-screen, light and dark), and once the layer in Rust existed the three views took an agent an hour. Nothing A draws ships; everything B draws does.
  2. 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 three views in three worlds, every lab tool working unchanged. Its rule is D6: an A mock names its world, so the B story that follows is checked against it row for row. The wipe on the bake-off page is that check.
  3. The shared world is the seam, with the token bridge. The bridge keeps the two drawings one colour; the world keeps them one truth. Where both captures exist, the rows agree to the digit (the three meridian-day90 pairs).
  4. Phase 3 should give B its per-world captures first (the native capture mode, D3): every story per world into the atlas with surface: native, so B's side of a comparison never has the six holes the page shows today. A's side needs a --clip (or a scale) flag on capture.mts so the window is captured as the window.

This is the plan's default (D1: B, with A for ideation) confirmed by evidence rather than overturned; the one amendment is that A is not "ideation only" but the review medium for people, with D6 making it honest.

Open for you — answered 2026-11-11 (evening)

  • The pick (Phase 2) Ruled: B of record, A to sketch and to review (D1), with D6 holding and the amendment standing: A is the review medium for people, not ideation only.
  • The chrome Ruled: keep the imitation in app/components/native/, re-checked at each review stop by a wipe against a real shell capture; no Vue port of the kit's Shell, no compositing into shell PNGs (D7).
  • Mock lifetime Ruled: a mock outlives its story as the person's medium, naming its world so the story stays checkable against it (D8).
  • The recut (meridian-day90 → nina-mbp, priya's cut as pilot) is c2's; when it lands the lab re-syncs (scripts/sync-worlds.sh) and the default world's captures are retaken. Phase 3 takes the per-world native captures after it if it lands while Phase 3 runs, else captures what exists and notes the recapture.

Qpoint Brand Style Guide