← Cycles
Design · c132

Native Design Prototyping

activecreated 2026-11-09· last activity 2026-11-11· mode: alchemy (five media, unknown fidelity) → formula (the chosen loop, codified as a process and skills).

How design mocks GPUI screens the way it mocks pages today. A bake-off of five media on one page (Vue mocks in a native skin, a stories crate in the app repo, the kit's wasm build embedded in the lab, Figma as an input, Native Shell's TSX); Mark picks; then the loop is rebuilt: a token bridge from `design_tokens.md` to a kit theme, a native capture mode for the atlas, the kit's skills installed plus ours, one worked example pushed into c131, and the process documented.

New in this cycle: The Activity page after c131 D21 (S4): sessions over time by harness, the window's totals, the ledger

Why

Design works in a loop: prototype on the design site, experiment in the lab, refine with Mark, push into the real app. The native app breaks the loop's tools: no DOM, no Vue, no Tailwind classes to transcribe, no capture.mts against a URL. Without a medium, native screens are either built blind in Rust or reviewed from someone else's screenshots. This cycle finds the medium and rebuilds the loop so native screens can be mocked, reviewed and pushed with the same rhythm, by designers who may not write Rust.

Two component systems now share one brand (the layer for the web, the kit for native). The token bridge is the seam that keeps them one.

Brief, mock, experiment, refine, push, with the media that can carry each step now that there is no DOM.Sketch: The design loop for native screens, drawn 2026-11-10 in the design system; Mark's own drawings may replace it.

Objective

Done means: the bake-off captured side by side with time and friction recorded per medium; Mark's pick recorded here; process.md for native screens; the token bridge generating a Qpoint kit theme (light and dark) from brand/design_tokens.md; a native capture mode feeding the cycle atlas; the kit's skills installed in design's .claude/skills plus /gpui-story; Status or Inventory taken through the loop and into c131; a design-site page where the other processes live.

Scope

  • Design repo: cycles/c132.native-design-prototyping/, brand/design_tokens.md (source, unchanged) and a generator script, scripts/capture.mts (native mode), .claude/skills/ (kit skills, /gpui-story), a lab page for the bake-off, the process page
  • Sister projects: ../qnative (stories, the theme file), ../q-nuxt-layer (read: tokens)
  • Out: the pages themselves (c131); the layer cleanup (c135); Figma library building unless the bake-off says so

Key Changes

  • stage 1 (2026-11-09): prompt and plan written from c130's split; the five candidate media tabled with a default (C if it renders our screens, else B, A for ideation). CYCLE.md written before kick-off at Mark's request (c130 clarifying question 6). c130 D10 ruled the same day: the medium is decided here.
  • 2026-11-09, later: Mark on who mocks: both he and agents, at different times; being able to mock is crucial to any plan. So the medium must serve a person without a Rust toolchain and an agent with one, and every page state must end as a captured, reviewable artifact. Type ruled: Inter (c131 D14). Committed the same day.
  • sketch and story (2026-11-10): the loop drawn in the design system (app/pages/cycles/design/sketches/c132-loop.vue: the five steps, the medium under each, the five candidates against the criteria, the token bridge), to be captured as /cycles/design/c132-sketch-loop.png and referenced under Why; the story module app/data/stories/c132.ts (D1–D5 and the who-mocks ruling as decisions, two outcomes); the section The shape added above.
  • 2026-11-11: Mark ruled that the lab adopts the native app's named synthetic worlds in Phase 0 (c131's synthetic data, D15): useNativeWorld(name) over ../qnative/crates/fixtures/world/, D6 added to the plan; mocks stop inventing rows.
  • Phase 0 (2026-11-11): the worlds in the lab. app/data/worlds/*.json are copies of ../qnative/crates/fixtures/world/ (scripts/sync-worlds.sh; the deploy builds here, so the copies live here). app/composables/useNativeWorld.ts: useNativeWorld(name) loads one world by dynamic import (only the named one is bundled; 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 request key as types::Request::key does (route?sorted-query, period=all dropped, quote_plus encoding) and returns the served JSON; describe says the footer's words as Synthetic::describe does. The plan's Phase 0 records what each medium needs installed (A: the design repo; B: Rust 1.95+, the workspace, stories for captures; C, D, E as found) and the bake-off page: Inventory, ruled.
  • Phase 1 (2026-11-11): the bake-off on Inventory, at the review stop.
    • Medium A, built here: three Inventory views in a native skin, each in fresh, minimal and meridian-day90: the landing (twenty micros), Harnesses (band and ledger, fleet → personal as c2's six rules) and the merged harness page (header with the install's long tail, tiles, Sessions, Configured here, Surface). Rows only from useNativeWorld; the rollups ported from landing.rs, harnesses.rs and harness.rs into app/data/native-inventory.ts. The skin mirrors the kit's chrome in our tokens and Inter (c131 D14, D18): app/components/native/ (Window with the title bar, the 212 px rail and the footer data: synthetic · <world> · <host>; PageHeader, Period, LabBar, Skeleton, Icon); everything else is the layer (DataIndexSection, DataMachineMicro, DataMachine, DataRankedBars, DataSegmentBar, DataTable, DataListingBar, ActorHeader, NavJumpPills, DataSurfaceSection, UxPill, AgentAvatar). Pages under app/pages/pages/native/, the native phase in page-registry.ts (collapse c132-native), subjects page/native-<view> in subjects.ts, a card on /pages.
    • Medium B is c2's: the real app on GPUI, captured off-screen on priya-x1 (thread p2-harnesses in the qnative atlas). Not built here.
    • The bake-off page /pages/native/bake-off: A beside B per view and state (UxImageCompare, wipe · onion · side), the time and friction per medium (A: this session's log, bake-off-log.md; B: c2's commit times and record), and what the evidence suggests. A's eleven captures are in the design atlas (thread p1-bake-off-a, scripts/shot-programs/c132-bake-off.json), cropped to the window B was photographed at (1120 × 720). B has no capture of fresh or minimal yet; the page says so.
    • Figures: A, 12 minutes to the three views in three worlds, about 40 to the verified bake-off page, one agent, no build loop. B, about 60 minutes for the three views on 2026-11-10 once the layer in Rust existed, after a day of groundwork (the world cut, the types, the nozzle, the token bridge, the layer crate, the stories crate). Friction per medium on the page and in review.md.
    • What the evidence suggests (review.md; the pick is Mark's): B of record (the real thing; the stories are the tests; captures solved), A for ideation and for a person's review, honest by D6 (a mock names its world, and the wipe checks it row for row); Phase 3 should give B its per-world captures first. The plan's default confirmed, with A promoted from "ideation only" to the person's review medium.
    • Verified on :3000 with curl and headless Chromium (no console errors in any world) and in the browser pane. Committed; not pushed.
  • Phase 2 (2026-11-11, evening): Mark picked from review.md. B, the stories crate in ../qnative, is the medium of record for a native screen, because it is the real thing, its stories are the page's tests and its captures are solved; A, the Vue mocks in a native skin, is the medium to sketch and to review, for a person without a toolchain and for an agent sketching before Rust, honest by D6 (a mock names its world; the story is checked against it row for row). Two rulings beside the pick: the skin's chrome stays an imitation in app/components/native/, re-checked at each review stop by a wipe against a real shell capture (D7); a page's mock outlives its story as the person's medium (D8). Phase 3 opened the same evening.
  • Phase 3 (2026-11-11, evening): the loop built, at its review stop (review-phase3.md).
    • The native capture mode (D3): scripts/capture.mts --native <program.json> runs qnative's stories binary once per shot with QPOINT_WORLD set, into a scratch dir, and merges the PNGs into the atlas with surface: native, subject: native/<story>, variant: world=<name>, world and the thread; nothing is written in the native checkout. scripts/shot-programs/c132-native-worlds.json took the overview, Harnesses and the harness page (with Sessions and Surface landed) in fresh, minimal and meridian-day90: 13 captures in public/cycles/qnative/ (thread worlds), so the bake-off has B's side for every state. The stories read the world through a one-line patch to app_shell_at, applied in a scratch copy for the first run and built into qnative's shared target dir; the tree was not edited and the patch was handed to qnative c2, which landed it (b4cbc23, adapted for Synthetic::new returning an Option). The first build failed on a closure's arity and the old binary quietly captured the default world three times, caught by reading the PNGs (the skill now says so).
    • capture.mts gained scale and clip (program, page, shot and single-shot --clip / --scale): A is captured as the window at the app's 2× instead of a 1× viewport cropped by hand. The eleven bake-off captures retaken.
    • /gpui-story (.claude/skills/gpui-story/SKILL.md): a page state into a Story (name, size, build at a route or a section), its headless test, the per-world capture into the atlas, and the path from a Vue mock in the native skin to a story.
    • process.md: the five steps and who does which with what, the two media exactly, the native capture mode, the token bridge documented (scripts/tokens-to-kit.mjs, built in qnative c2, not rebuilt), the review stop as a page, what is not in the loop yet (the kit's own skills, a dark variant per world for A, /figma-to-gpui).
    • The bake-off page now shows both sides for every state and says A and B are both at 2×. Found on the way: the app's rail has grown a Help › Getting started group since c2's first captures and the skin has not; the D7 wipe is for exactly this.
    • The recut landed while Phase 3 ran (qnative 71dd21a: meridian-day90 is nina-mbp, priya's cut is pilot; b4cbc23: the stories honour QPOINT_WORLD, the hand-on landed by c2). The lab re-synced (scripts/sync-worlds.sh, four worlds), the stories binary was rebuilt from qnative proper (no scratch copy needed any more), and both media were recaptured with pilot added: A 14 captures, B 18 (thread worlds). The bake-off page reads meridian-day90 as nina's laptop and pilot as the cut the first bake-off showed. The patch file was removed from the tree once c2 had applied it; the lab's world copies (app/data/worlds/, four files) are committed with this.
    • Follow-up at the review stop: the wipe had shown the app's rail with a Help › Getting started group (the tour launcher's place, c131 D20) that the skin lacked; the skin took the group the same evening (app/components/native/Window.vue, inert) and A was recaptured, so the wipe is clean on the chrome again. D7 working as ruled.
  • Phase 3 review (2026-11-11, evening): Mark ruled from review-phase3.md. D9: the native capture mode also copies each native capture into design's own atlas under the cycle's thread (the qnative atlas keeps the originals), retro-applied to the worlds thread so the bake-off's B side is in public/cycles/design/. Phase 4 is Status through the whole loop, A then B, captures per world into both atlases, the page into c131; the six endpoint-only shapes get a clearly marked bridge fixture per world beside the world copies, typed from synthetic-data.md (D10), named as a bridge in the footer and the record, feeding the story in qnative too. Editing qnative is allowed once c2 has closed, for Status's own paths, with small commits and a message to the other sessions (c3, c4) on shared files; never a push there.
  • Phase 4 (2026-11-11): Mark picked Status as the worked example at the Phase 3 review stop. The brief (status-brief.md) is written from c131's page table (on / off, local / connected, CPU and RAM, workers, plugins, logs, effective config; the states off · starting · on-local · on-connected · degraded; D12's grant line) and from what the four worlds carry: /api/stats, /api/endpoints?host=, /api/installations, /api/agents. The mock in A draws those honestly; the sensor's own shapes (c131 D17: SensorState, Resources, EffectiveConfig, LogLine) have no route and no world, so the page shows that gap as its honest state until the routes land or Mark rules a bridge.
    • Built the same day, on Mark's word to forge ahead: /pages/native/status in the native skin (the sensor's sentence and facts; what it has found: Sessions, Events, Tokens, Spend, Harnesses here, Out of sight, The record; the log tail) on the four worlds, with a lab knob for the states no world carries (?state=, ?plane=) and degraded derived from /api/stats coverage; the rail takes a Status item on this mock only (S1). Eight captures (thread p4-status-a, scripts/shot-programs/c132-status.json). The calls taken by default are tabled in the brief and in review-phase4.md (S1–S6); the push into c131 is handed to qnative c2 as a story per state. Found: a page state no world carries is where D6 bends, and the loop's answer is a world per state once D17's routes exist; written into the review note for process.md.
    • Through to B, after the Phase 3 review's rulings (the same evening): the bridge of D10 written per world beside the world copies (app/data/worlds/bridge/, typed in types.ts from synthetic-data.md; scripts/sync-bridge.sh copies it into ../qnative/crates/fixtures/bridge/), read by useNativeWorld as fromBridge(route); the mock's sensor band and log now come from it and the footer says sensor: bridge (S2 narrowed to starting · off · connected, S3 overturned). The native capture mode mirrors into design's atlas (D9) and the worlds thread was retro-applied (c132-native-<story>-<world>-light.png), the bake-off's B side reading from it. Then Status in B, in qnative (c2 closed): types/src/bridge.rs (the six shapes, marked a bridge), fixtures/src/bridge.rs (the bundled bridge per world, with a test that every file matches its types), the synthetic nozzle answering /api/sensor, /api/config and /api/plane from the bridge and saying sensor: bridge in its description, Repo::sensor/config/plane/endpoints, Route::Status first in the rail (S1), pages/status.rs (the three bands as the mock draws them), four stories (app-status, -starting, -off, -connected: the states no world carries as a story parameter, as the brief says), and the app's own asset source composing the kit's icons with the Activity glyph the default set lacks. Captured per world by the native capture mode into design's atlas (thread p4-status-b); the bake-off page gained a Phase 4 section with A beside B for seven states. The shared files touched in qnative (router, shell, pages/mod, the two mains, the nozzle, types and fixtures lib files) got small commits and a message to the c3 and c4 sessions.
    • Mark's rulings on S1–S6 (c131 D21, the same evening), in the lab: Status is the landing (the state line and the plane line, what it has found, the Inventory overview's twenty micros below; Inventory keeps its own index), the rail gets a "This machine" group (Status, Sensor, Activity) before Inventory, a Sensor page shows the five facts in full with the configuration file, the plane connection and the log tail, and an Activity page shows sessions over time by harness with the window's totals and the ledger (as qdash's /monitor/activity). Built as /pages/native/status (reshaped), /pages/native/sensor and /pages/native/activity on the four worlds (useNativeSensor.ts shares the state, the sentence and the fact rows between Status and Sensor), recaptured (threads p4-status-a, p4-this-machine-a). The push is qnative c5's, on design's first cut; design makes no further edits in ../qnative.
    • c5 landed D21 in B (the same night): Status as the landing, Sensor and Activity in qnative main, captured per world with the clock frozen (threads p2-status, p2-activity, mirrored into design's atlas as c131-native-app-*), and the lab's world copies re-synced by c5 (39953031a8: every 30-day session's detail and Surface). The bake-off page's Phase 4 section now wipes the lab's Status, Sensor and Activity over c5's build for every world and state; design's first cut stays in the atlas under p4-status-b. The app shifts a synthetic clock to today (· clock +Nd); the lab keeps the world's own dates, as the captures do (recorded in process.md).
  • Phase 5 (2026-11-11): the loop documented where the other processes live: a section of CLAUDE.md after Sketches and stories, and /pages/native as the design-site page; process.md stays the full text. CYCLES.md brought in line; c130's record is the parent session's (a line suggested to it).

The shape

Documents: the plan · Mark's prompt · the review stop · the Phase 3 review stop · the process · the Status brief · the Phase 4 review stop · medium A's time log · the lab: the bake-off · Status · the native mocks

The problem. The loop's tools assume a DOM: Vue to draw, Tailwind classes to transcribe, capture.mts against a URL. GPUI draws its own pixels, and one medium cannot serve, because both Mark and agents will mock, at different times (ruled 2026-11-09).

The core idea. The five steps stay: brief, mock, experiment, refine, push. The medium splits by who mocks: A, Vue mocks in a native skin, for a person without a Rust toolchain; B, a stories crate in the app repo, for an agent with one. Both end as a captured, reviewable artifact per page state in the same atlas, and the token bridge keeps the two drawings one brand.

The pieces.

  • The loop: process.md here, who does which step and with what.
  • Medium A: a native skin on the design site (app/pages/pages/; c137's /pages/phase4/messaging-inbox is the precedent, a web rendering standing in for the native app).
  • Medium B: ../qnative/crates/stories, one story per page state, run as headless tests (c131 R6).
  • The token bridge: brand/design_tokens.md → a generator script → the kit theme, light and dark, in ../qnative (D2); Inter and Geist Mono bundled (c131 D14).
  • Captures: a native mode for scripts/capture.mts, the same manifest with surface: native (D3).
  • Skills: the kit's, installed from the repo at our pinned tag, plus /gpui-story (.claude/skills/).
  • The bake-off and the pick: a lab page with A and B side by side on Inventory, three states each; the pick recorded here.

The pattern we follow. The demo is the test (stories as both the design site and the tests); tokens generated from one file (the seam between two component systems); replicate first (A is today's loop in a new skin, before anything is invented); the primer's verdict as the gate (the kit's wasm build is showcase-only on nightly, so C does not carry the loop; Native Shell's desktop features live on main, so E does not either).

What stays open. Mark's pick, formally Phase 2 after the bake-off (the evidence's suggestion is in review.md); the native capture mode's shape (B's screenshots are taken: c2 renders each story off-screen with Window::render_to_image, 2×, no Screen Recording; what is open is capturing every story per world into the atlas); whether a kit-shaped Figma library is worth building (Q2); how the brand's one accent maps onto the kit's 134 roles (primer Q14; the token bridge c2 built answers it for the kit's slots).

Visual record

59 captures — heroes, page slices, and full-page renders. Click to view.

Phase 4 · Sensor and Activity in the native skin, per world (after c131 D21)

2026-11-11· 11 captureslatest
fresh: qcontrol 0.9.4 on for four minutes, 2 workers, 56 MB; no config file, the defaults in effect; not connected; the start lines in the log.
fresh: qcontrol 0.9.4 on for four minutes, 2 workers, 56 MB; no config file, the defaults in effect; not connected; the start lines in the log. open page →
minimal (chen-mba): on for two days; the config file found (observe, telemetry); not connected; the log tail.
minimal (chen-mba): on for two days; the config file found (observe, telemetry); not connected; the log tail. open page →
meridian-day90 (nina-mbp): on for six days, 3 workers, 71 MB; the config file found (observe); not connected; a warn line in the log about a pinned-TLS connection.
meridian-day90 (nina-mbp): on for six days, 3 workers, 71 MB; the config file found (observe); not connected; a warn line in the log about a pinned-TLS connection. open page →
pilot (priya-x1): on · degraded; enforce mode with an egress allowlist in the file; the error and warn lines in the log.
pilot (priya-x1): on · degraded; enforce mode with an egress allowlist in the file; the error and warn lines in the log. open page →
connected (a knob): reads HQ over the plane, the configuration managed there and read-only here, the plane's details as the mock says them.
connected (a knob): reads HQ over the plane, the configuration managed there and read-only here, the plane's details as the mock says them. open page →
off (a knob): every fact a dash, the configuration and the plane unread, no log.
off (a knob): every fact a dash, the configuration and the plane unread, no log. open page →
fresh: no sessions on this machine in the window; the band at zero, the history and the ledger empty.
fresh: no sessions on this machine in the window; the band at zero, the history and the ledger empty. open page →
minimal (chen-mba): four sessions in 30 days, one running now, Claude Code only; the days they ran; the ledger.
minimal (chen-mba): four sessions in 30 days, one running now, Claude Code only; the days they ran; the ledger. open page →
meridian-day90 (nina-mbp): 16 sessions in 30 days across Claude Code, Claude Desktop and Cursor CLI, stacked by day; the ledger, ten then Show all.
meridian-day90 (nina-mbp): 16 sessions in 30 days across Claude Code, Claude Desktop and Cursor CLI, stacked by day; the ledger, ten then Show all. open page →
pilot (priya-x1): 31 sessions in 30 days across three harnesses; the ledger.
pilot (priya-x1): 31 sessions in 30 days across three harnesses; the ledger. open page →
pilot, all time: 85 sessions since April, the long history by day, the ledger.
pilot, all time: 85 sessions since April, the long history by day, the ledger. open page →

Phase 4 · Status, the landing, in the native skin, per world and state (after c131 D21)

2026-11-11· 7 captures
fresh, the landing: qcontrol on for four minutes, reading the fresh world, no plane; nothing found yet; the twenty micros at zero below.
fresh, the landing: qcontrol on for four minutes, reading the fresh world, no plane; nothing found yet; the twenty micros at zero below. open page →
minimal (chen-mba): on, reading this machine; one session running now; two harnesses, one a shadow; the overview's micros for the window below.
minimal (chen-mba): on, reading this machine; one session running now; two harnesses, one a shadow; the overview's micros for the window below. open page →
meridian-day90 (nina-mbp), the landing after D21: the one-line state and the plane line; what it has found (25 sessions, 2,317 events since May 8, three monitored harnesses, 2 connections out of sight); the Inventory overview's twenty micros below.
meridian-day90 (nina-mbp), the landing after D21: the one-line state and the plane line; what it has found (25 sessions, 2,317 events since May 8, three monitored harnesses, 2 connections out of sight); the Inventory overview's twenty micros below. open page →
on-connected: the connected sentence and the plane line saying it reads HQ over the plane; the configuration managed there (a knob until a world is cut for it).
on-connected: the connected sentence and the plane line saying it reads HQ over the plane; the configuration managed there (a knob until a world is cut for it). open page →
starting: the sentence, what was found and the micros dimmed (a knob until a world is cut for it).
starting: the sentence, what was found and the micros dimmed (a knob until a world is cut for it). open page →
off: qcontrol is not running on this machine; what it recorded last stays, dimmed; the micros dimmed (a knob until a world is cut for it).
off: qcontrol is not running on this machine; what it recorded last stays, dimmed; the micros dimmed (a knob until a world is cut for it). open page →
pilot (priya-x1): on · degraded, in the sensor's own words; the plane line; 85 sessions, 9,057 events since April 3, four harnesses with Ollama a shadow; the micros below.
pilot (priya-x1): on · degraded, in the sensor's own words; the plane line; 85 sessions, 9,057 events since April 3, four harnesses with Ollama a shadow; the micros below. open page →

Phase 4 · Status in the real app (medium B), per world and state

2026-11-11· 7 captures
fresh: qcontrol on for four minutes, no config file (defaults, observe), nothing found yet; the sensor's facts and the log from the bridge (D10).
fresh: qcontrol on for four minutes, no config file (defaults, observe), nothing found yet; the sensor's facts and the log from the bridge (D10). open page →history · 2 moments →
minimal (chen-mba): on for two days, one session running now; two harnesses, one monitored and a shadow Windsurf; the config file found, observe; the log tail.
minimal (chen-mba): on for two days, one session running now; two harnesses, one monitored and a shadow Windsurf; the config file found, observe; the log tail. open page →history · 2 moments →
meridian-day90 (nina-mbp): on for six days, 3 workers, 71 MB; the config file found, observe; 25 sessions, 2,317 events since May 8, three monitored harnesses, 2 connections out of sight.
meridian-day90 (nina-mbp): on for six days, 3 workers, 71 MB; the config file found, observe; 25 sessions, 2,317 events since May 8, three monitored harnesses, 2 connections out of sight. open page →history · 2 moments →
pilot (priya-x1): on · degraded, in the sensor's own words (5 injection failures, 3 connections it could not inspect); enforce mode with an egress allowlist; the error and warn lines in the log tail.
pilot (priya-x1): on · degraded, in the sensor's own words (5 injection failures, 3 connections it could not inspect); enforce mode with an egress allowlist; the error and warn lines in the log tail. open page →history · 2 moments →
on-connected (a story parameter until a world is cut for it): the connected sentence, Reads says HQ over the plane, the configuration managed at HQ.
on-connected (a story parameter until a world is cut for it): the connected sentence, Reads says HQ over the plane, the configuration managed at HQ. open page →history · 2 moments →
starting (a story parameter): the facts fill in as they arrive; what was found stays dimmed; the log shows the start line.
starting (a story parameter): the facts fill in as they arrive; what was found stays dimmed; the log shows the start line. open page →history · 2 moments →
off (a story parameter): qcontrol is not running on this machine; what it recorded last stays, dimmed; no log.
off (a story parameter): qcontrol is not running on this machine; what it recorded last stays, dimmed; no log. open page →history · 2 moments →

Phase 3 · medium B per world, mirrored from the qnative atlas (D9)

2026-11-11· 18 captures
fresh (day 0, nothing found yet): twenty micros at zero, the overview's honest empty state in the real app.
fresh (day 0, nothing found yet): twenty micros at zero, the overview's honest empty state in the real app. open page →
minimal (chen-mba): one monitored harness and a shadow Windsurf install, a handful of sessions, one provider.
minimal (chen-mba): one monitored harness and a shadow Windsurf install, a handful of sessions, one provider. open page →
meridian-day90 (nina-mbp, the default since c2's recut): the twenty micros on nina's rows.
meridian-day90 (nina-mbp, the default since c2's recut): the twenty micros on nina's rows. open page →
pilot (priya-x1): the twenty micros as c2 first captured them under the name meridian-day90.
pilot (priya-x1): the twenty micros as c2 first captured them under the name meridian-day90. open page →
fresh: no harnesses found on this machine; the band at zero, the ledger's empty state.
fresh: no harnesses found on this machine; the band at zero, the ledger's empty state. open page →
minimal: Claude Code monitored with two sessions, Windsurf a shadow install that never ran under qcontrol.
minimal: Claude Code monitored with two sessions, Windsurf a shadow install that never ran under qcontrol. open page →
meridian-day90 (nina-mbp): three harnesses, all monitored; the ledger with version, status, providers, sessions, spend, last active.
meridian-day90 (nina-mbp): three harnesses, all monitored; the ledger with version, status, providers, sessions, spend, last active. open page →
pilot (priya-x1): four harnesses, three monitored, Ollama a shadow.
pilot (priya-x1): four harnesses, three monitored, Ollama a shadow. open page →
fresh: the page's not-found state, claude-cli is not on this machine.
fresh: the page's not-found state, claude-cli is not on this machine. open page →
minimal: Claude Code on chen-mba, monitored, two sessions all time; one provider, tokens by model, the spend.
minimal: Claude Code on chen-mba, monitored, two sessions all time; one provider, tokens by model, the spend. open page →
meridian-day90 (nina-mbp): Claude Code, Status monitored, the metadata grid, the three tiles, the jump pills.
meridian-day90 (nina-mbp): Claude Code, Status monitored, the metadata grid, the three tiles, the jump pills. open page →
pilot (priya-x1): Claude Code, Status monitored, the metadata grid, the three tiles, the jump pills.
pilot (priya-x1): Claude Code, Status monitored, the metadata grid, the three tiles, the jump pills. open page →
minimal, landed on Sessions: the two sessions on chen-mba.
minimal, landed on Sessions: the two sessions on chen-mba. open page →
meridian-day90 (nina-mbp), landed on Sessions: the band docked, 14 sessions, ten then Show all.
meridian-day90 (nina-mbp), landed on Sessions: the band docked, 14 sessions, ten then Show all. open page →
pilot (priya-x1), landed on Sessions: the band docked, 40 sessions, ten then Show all.
pilot (priya-x1), landed on Sessions: the band docked, 40 sessions, ten then Show all. open page →
minimal, landed on Surface: what Claude Code reaches from chen-mba.
minimal, landed on Surface: what Claude Code reaches from chen-mba. open page →
meridian-day90 (nina-mbp), landed on Surface: Models, MCP Servers, Repos & Workspaces, Tools.
meridian-day90 (nina-mbp), landed on Surface: Models, MCP Servers, Repos & Workspaces, Tools. open page →
pilot (priya-x1), landed on Surface: Models, MCP Servers, Repos & Workspaces, Tools.
pilot (priya-x1), landed on Surface: Models, MCP Servers, Repos & Workspaces, Tools. open page →

Phase 1 · the bake-off, medium A: Vue mocks in a native skin

2026-11-11· 14 captures
fresh (day 0, nothing found yet): twenty micros at zero, the segment bars empty; the honest empty state of the overview.
fresh (day 0, nothing found yet): twenty micros at zero, the segment bars empty; the honest empty state of the overview. open page →
minimal (chen-mba, the day-89 new hire): one monitored harness and a shadow Windsurf install, a handful of sessions, one provider.
minimal (chen-mba, the day-89 new hire): one monitored harness and a shadow Windsurf install, a handful of sessions, one provider. open page →
meridian-day90 (nina-mbp, the default since c2's recut): the twenty micros on nina's rows, Claude Code, Claude Desktop and Cursor CLI since day 36, two providers; the same rows as c2-app-landing-meridian-day90-light.
meridian-day90 (nina-mbp, the default since c2's recut): the twenty micros on nina's rows, Claude Code, Claude Desktop and Cursor CLI since day 36, two providers; the same rows as c2-app-landing-meridian-day90-light. open page →
fresh: 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.
fresh: 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. open page →
minimal: Claude Code monitored with two sessions, Windsurf a shadow install that never ran under qcontrol; the Work card has one bar.
minimal: Claude Code monitored with two sessions, Windsurf a shadow install that never ran under qcontrol; the Work card has one bar. open page →
meridian-day90 (nina-mbp): Installed here (three harnesses, all monitored) and Work (tokens by harness), then the ledger: version, status, providers, sessions, spend, last active.
meridian-day90 (nina-mbp): Installed here (three harnesses, all monitored) and Work (tokens by harness), then the ledger: version, status, providers, sessions, spend, last active. open page →
fresh: the page's not-found state (the app's Load::Ready(None)): claude-cli is not on this machine, no install or run was found here.
fresh: the page's not-found state (the app's Load::Ready(None)): claude-cli is not on this machine, no install or run was found here. open page →
minimal: 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.
minimal: 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. open page →
meridian-day90 (nina-mbp): Claude Code, Status monitored, the metadata grid; Providers, Tokens by model, Spend $185.11 all time; the jump pills over Sessions (14), Configured here and Surface.
meridian-day90 (nina-mbp): Claude Code, Status monitored, the metadata grid; Providers, Tokens by model, Spend $185.11 all time; the jump pills over Sessions (14), Configured here and Surface. open page →
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.
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. open page →
Landed on Surface: Models, MCP Servers, Repos & Workspaces and Tools as DataSurfaceSection draws them; Users, Teams and Versions leave on one machine.
Landed on Surface: Models, MCP Servers, Repos & Workspaces and Tools as DataSurfaceSection draws them; Users, Teams and Versions leave on one machine. open page →
pilot (priya-x1, the pilot user and migration lead: the world a violation tour switches to): four harnesses, three providers, $311 in 30 days; the rows the bake-off's first meridian-day90 captures showed.
pilot (priya-x1, the pilot user and migration lead: the world a violation tour switches to): four harnesses, three providers, $311 in 30 days; the rows the bake-off's first meridian-day90 captures showed. open page →
pilot (priya-x1): four harnesses, three monitored, Ollama a shadow; the ledger with version, status, providers, sessions, spend, last active.
pilot (priya-x1): four harnesses, three monitored, Ollama a shadow; the ledger with version, status, providers, sessions, spend, last active. open page →
pilot (priya-x1): Claude Code, Status monitored; Providers (769 calls), Tokens by model, Spend $667.86; the jump pills over Sessions (40), Configured here and Surface.
pilot (priya-x1): Claude Code, Status monitored; Providers (769 calls), Tokens by model, Spend $667.86; the jump pills over Sessions (40), Configured here and Surface. open page →

Sketches — the structures, drawn in the design system

2026-11-10· 2 captures
Brief, mock, experiment, refine, push, with the media that can carry each step now that there is no DOM.
Brief, mock, experiment, refine, push, with the media that can carry each step now that there is no DOM. open page →
c132 full
open page →

Artifacts

Qpoint Brand Style Guide