Cycles by week
This week · Nov 9

34 started, 6 closed, 27 carried live.

Busiest record: c133 Remediation Training (27 entries) · 67 carried cycles have gone quiet · layer v0.9.38 → v0.9.39

Started
34
Still open
94
Closed
6
Record entries
253
Commits
325
Captures
473
Releases · deploys
18
Back on Trainings after the take: Secrets in prompts reads Recorded, passed 3 of 3 on 1 November, on your own; Unapproved MCP servers stays recorded for F-A; Personal accounts for work still waits on F-C.
c133Remediation Training87 captures · 27 log entries — the week's busiest recordSee all 87 shots ↓

The library after a training taken on its own: the row reads Recorded, on your own

Commits

325 commits across 8 repos, on each repo's checked-out branch.

Cycles

Started 34

c147Findings, a Common Tongue

The native app's Safety & Security section as this machine's findings: design's phase-4 Findings copied first, then made the person's, in one finding shape the company's plane speaks too (findings bubble up, trainings and follow-ups bubble down).

started Nov 1312 in the log
c146Config File

One page in the native app, under This machine, that manages qcontrol's config.yaml in three modes: edit it here (in an editor, from a library of starters), governed by the company's plane, or fetched once from a published file. An agent drafts the file over the app's MCP server from the person's plain instructions. The draft is checked by qcontrol and applied by the person.

started Nov 1316 in the log
c13Safety & Security: FindingsQnative (provisional)

The native app's **Safety & Security → Findings · Settings** in place of c4's Messages section: this machine's findings, in the person's words, on the same record the company's plane keeps (one finding, append-only events, three writers). c4's notification plumbing, tray, quiet hours and Focus stay and announce findings.

started Nov 138 in the log
c12Punch ListQnative (provisional)

Small, ad-hoc changes to the native app and its component library (QGUIkit, crates/qguikit), and to the web layer (q-nuxt-layer) when an item reaches it.

started Nov 13
c11Config FileQnative (provisional)

The Config page under This machine, and the guide's config tools. An agent reads, checks and proposes the person's config.yaml; only the person applies it.

started Nov 13
c10Guide WalkQnative (provisional)

the guide walk's report (cycles/notes/2026-11-13-guide-agent-walk.md): what an evaluator's agent driving the guide MCP server needs, in the report's order.

started Nov 13
c144Theatre Mode

Tours the person's own agent can give over our MCP server. *New here*, at a level the person picks, from ELI5 to "I have networking degrees". *AI, on your own machine*, an AI primer with the person's computer as the subject. And the *doomsday scenarios*: stories of AI going wrong, played out in the dashboard on synthetic data, in **theatre mode**. Every theatre tour begins with the person and the agent switching synthetic data on together and ends with switching it off. Each scenario's beats double as acceptance tests for the dashboard.

started Nov 124 in the log
c143Loose Ends

Every thread's new work merged into main and pulled locally, across design, qnative, the layer and the sister repos, with conflicts untangled by hand, and one place that holds what is still open.

started Nov 126 in the log
c142Cycle Tours

Model a new mode with Mark, the guided tour of a cycle, by giving real tours of recent cycles on the generated pages of the design site and writing down what worked, so the mode can become a skill or extend an existing one.

started Nov 124 in the log
c140Surface Evaluation

An honest evaluation of our component system as drawn in Rust on GPUI (the native app's layer crate and its pages), scored per principle against our foundation docs, with the course corrections, the cost of keeping two surfaces, and the skills and tools the work around the GPUI layer calls for. Opens the glossary with Surface.

started Nov 125 in the log
c139Updates

The user-facing half of updating the native app: Settings → Updates with the current and new version and release notes, a preference that can make updates invisible, the trace a quiet install leaves, and the difference between the build-partner era (one channel, internal notes) and a later structured rollout (channels, staged percentages, public notes, organisation policy). The low-level update (qupdate) exists; engineering calls go to Tyler.

started Nov 117 in the log
c138Developer Mode

The native app's developer mode: the live viewer replicated from qdash and improved, Kamal's monitor TUI replicated as Monitor, a Sensor page that makes the data switch a working control, a Config page with three modes, the Guide that tells Kamal how to hook a live sensor, and a curated Events page as the layer of meaning over the same stream. All of it behind a gate that can switch it off or ship without it, with the cost measured.

started Nov 1122 in the log
c7Web RailQnative (provisional)

The native app's left rail replicates the web app's: section headers as small uppercase labels, entries as plain text with no icons, the active entry marked the way the web app marks it, a gap between sections. Nothing else in the window changes.

started Nov 113 in the log
c6Panel TogglesQnative (provisional)

Two toggles in the open info panel, settable while it is open: **Help Mode** (on / off) and **Dev Mode** (on / off). Dev Mode is developer mode's own switch, the one the tray menu carries, in a second seat. Help Mode is the guide layer staying on as the person moves. Opening the panel switches nothing on.

started Nov 116 in the log
c5StatusQnative (provisional)

The Status page, the app's first page and the tray's long form: is qcontrol on, what is it reading, what has it found. Built from design c132's Phase 4 brief and mock (the worked example of the loop for native screens) as the loop's push: the page on our layer, a story per state, the state read from the source and the data and never from a flag in the page, captured per world into both atlases, the budget read with strobe.

started Nov 117 in the log
c4MessagingQnative (provisional)

The V1 slice of the message channel between the control plane and the person at this machine (design c137, Phase 3): the bones as types, the inbox store, the four ports as far as the endpoint owns them (inbox, tray, OS notification; the web app is c134's), the person's controls over delivery, and the one message that flows in V1, the identity confirmation on Connect. The enforcement notice is drawn from the fixture and flows only in synthetic worlds until qcontrol sends it.

started Nov 118 in the log
c3Developer ModeQnative (provisional)

The app's developer mode, and the Events page above it. Live (qdash's live viewer, replicated on the sensor's current event schema and improved), Monitor (Kamal's monitor TUI, replicated), Sensor (the data switch as a working control), Config (three modes), Guide (how to hook a live sensor). Developer mode is an extension behind one Cargo feature, so a build can carry none of it; where it is allowed, the person can still turn it off. Events, the curated layer of meaning over the same stream, is an ordinary page.

started Nov 117 in the log
c2Expressive RangeQnative (provisional)

c131 Phase 2. The whole qdash Inventory section in this app: seven listings, nine detail pages and the landing, in the Qpoint skin, on the data the web pages show, cut to one machine. We build our components in Rust (crates/layer, with the web layer's names) on top of the kit, and record per component how close it came and what it cost. Stretch: the Tour guide, with Info View and the qpoint-guide MCP driving the app. Extra stretch: the table with an expand row at full fidelity.

started Nov 1021 in the log
c137App Messaging, Overseer and Citizen

The ports and bones of every message between the overseer (the control plane and the people who run it) and the citizen (the employee at the endpoint): one schema, the channels (inbox, tray, OS notification, web app), the inventory of message types the roadmap implies, and the citizen's control over what reaches them. Simple, and never a bombardment.

started Nov 913 in the log
c136Mechanic Access

Time-boxed, categorised, audited access a build partner grants Qpoint on their running plane: "three days to fix this documented problem". The categories (diagnose · fix · implement · hot-fix), the levels (observe · operate · change), the window, the named people, the record; the grant screen in the web app and one honest line in the native app.

started Nov 94 in the log
c135Component Cleanup

The layer catalog audited against Mark's five checks (modular, clean, documented with code annotation, shaped per the component principles, a good docs page), group by group: duplicates and near cousins named and resolved (merge, split, alias and deprecate, retire, extract), every docs page showing the dashboard's real flavors with adminProps, an annotation standard and lint, one release per group. The qdash LAYER-CANDIDATES.md and the Opus track's 59 fixes merge into the work.

started Nov 94 in the log
c134Control Plane Web App

qdash leaves qcontrol and becomes the control plane's UI, offered as SaaS and as a self-hosted Docker image (Pulse repurposed with a new data model, Postgres and ClickHouse, no Firebase; Tyler, session 1b21a3ce). app.qpoint.io is the model. Design's slice is the seam: the shell decision (qdash's shell in app.qpoint.io's auth and org frame), the API contract Kamal implements, identity and access without Firebase (including the endpoint's connect credential and mechanic-access grants), the install experience on the wizard kit, and the port plan.

started Nov 97 in the log
c133Remediation Training

A finding is a teaching moment. Short trainings (one to three minutes: an illustration or animation, what to do instead, a check that it landed), assigned by a policy, an operator or HQ, opened from the native app's message on the web app, and recorded in the audit log as proof of correction. Concrete, respectful, with a path to IT. Three pilots on the lab's top policies.

started Nov 927 in the log
c132Native Design Prototyping

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.

started Nov 911 in the log
c131Native App V1

Our V1 of the native desktop app in GPUI Kit: the one-machine slice of qdash (Status, Inventory, Events, Config, Connect) and the tray, two states (local and editable, connected and read-only), the DataNozzle with three sources (synthetic, local, plane), the message channel's ports and bones, stories that are tests, packaged for three OSes, measured against a budget with strobe, handed to the engineers as option B.

started Nov 924 in the log
c130Native App (program)

The 2026-11-05 roadmap pivot, run as a design program. qdash leaves qcontrol. A native desktop app (GPUI Kit, carrying the tray) becomes priority one, followed by the control plane as a self-hostable web app. This cycle holds the roadmap, the GPUI ecosystem primer for designers and builders, the proposed shape of the native app, and the gates for the cycles it spawns: c131 Native App V1, c132 Native Design Prototyping, c133 Remediation Training, c134 Control Plane Web App, c135 Component Cleanup; since the 2026-11-09 rulings also c136 Mechanic Access, c137 App Messaging (overseer and citizen), and c0 Call My Name, the naming cycle in the app's own repo (../qnative, provisional name).

started Nov 912 in the log
c1SpikeQnative (provisional)

c131 Phase 0: a hello app on GPUI Kit 0.9.1 that answers the platform questions before anything is promised. One window with a sidebar and a data table bound to a JSON inventory; a tray icon beside GPUI's event loop; the DataNozzle with its three transports (synthetic, local, plane) behind one process-wide switch; the footprint measured with strobe; Windows and Linux builds attempted in CI; the findings written back to design's primer.

started Nov 96 in the log
c0Call My NameQnative (provisional)

The names, before the code: the native desktop app (and whether "Qdash" moves to it), the control plane (publicly "Qplane" since 2025 Q3), the third data source and the thing a base URL points at, the two roles (working words: overseer and citizen), and this repository. Grounded in the customer's own words from the market-analyst corpus, the brand's writing rules and the neighbours' precedents; decided in a shared team session with an agent.

started Nov 92 in the log

Still open 27

c113qdash Baked Demo

Serve the qdash demo as pre-computed worlds (sizes, scenarios, First run stages) from files, switchable instantly, baked daily, with no containers at serve time

started Oct 66 wks · moved this week
c99Nuxt Backend Interface

Audit every qdash page's data provenance, write the front-end data-interface bible (page → context component → library component; composables modelled on app.qpoint.io's), then plan and execute the conversion of the qdash UI's vibe-coded data layer onto it

started Sep 278 wks · moved this week
c12Micro ProblemsMarket Analyst

Reshape market-analyst into a design tool first — the source of truth for Qpoint's problem space — by adding a micro-problem layer (use case → micro problem → observations) on top of the existing market lens, with a curated registry, extraction-proposed candidates, computed standing, product surfaces, document intake, and briefs/stories that cite problems.

started Sep 218 wks · moved this week1 in the log
c128Reports

A time-windowed Reports section for qdash. It gives C-level people, auditors and others who see data but get no controls what the dashboard already shows, as documents they can hand on. The two categories are Security (Posture) and IT (Inventory, Deployment status). Every report reads one window: rolling, calendar or custom from–to, with a comparison period.

started Nov 32 wks · quiet 1
c29look-and-feelQmap

Visual look and feel, hierarchy, and labeling — tuned by hand

started Nov 32 wks · quiet 1
c126Policies Final Pass

A final, hand-tuned pass over the policy surfaces in the phase-4 lab. We walk each aspect in turn (the listing, the policy header, mode and Until, severity, exceptions, frameworks, findings, history, Policy Config, team Policies) and sand each one by hand. Along the way, each fact about a policy gets one home, and every other place summarizes it and links there.

started Oct 273 wks · quiet 1
c125Operations Wizard

A tour-guide and self-documenting tool that attaches cleanly to any part of the UI, so the UI becomes the documentation. It has a hover help mode (after Ableton Live's Info View), a numbered-marker overlay for explaining a screen, step-by-step tours that move across pages and highlight what matters, and an AI tour guide over MCP from the start. Its first tour is the operations journey from the 2026-10-26 product session: install to enforcing on a pilot team.

started Oct 273 wks · quiet 1
c124Cycle Stories

Make the cycle detail page tell the cycle's story at a glance: why it happened, what changed (before → after, in plain words), and who made it better. External market specialists are credited first. Every outcome traces back through its decision to the meeting or conversation it came from. Collaborators get their own unlisted pages, where attributions and accolades build up.

started Oct 263 wks · quiet 1
c123Compliance Frameworks

Give the frameworks a good bath and a redress. We finalize the framework page designs and tune their details from the latest designs and what Mark Peterson made clear on 2026-10-26: Qpoint gives evidence, not compliance, under emerging regulatory pressure to govern AI. Most of the work is by hand. We export the current page to Illustrator, Mark reworks it there, and we build the result on a test page. The brief's Frankenstein list (X1–X11) is the checklist for the cleanup.

started Oct 263 wks · quiet 1
c114Governance Phase II

Build the Phase II governance dashboard for qdash around the object model the ../intents repo describes, so that Findings, Policies, Scope, Groups, Exceptions, Enforcement and Frameworks appear as one coherent system rather than fourteen features

started Oct 96 wks · quiet 1
c111Cycles by Week

A weekly view of the cycle atlas (started · still open · closed per week) beside the existing numerical view, plus a week details page designed as a _meta mock

started Oct 56 wks · quiet 1
c101Qmap Surface

Fold qmap into DataSurfaceSection. Draw a thing's Surface (what it reaches) as a scene of pixel pawns, as a second view beside the lists (Map ⇄ List). This starts with a design brief to a designer.

started Sep 287 wks · quiet 1
c122Early-Stage Documentation

Tame our own design history before telling it. Catalog the Qpoint Design drive (sketches, Illustrator, Photoshop, InDesign, Sketch, Figma) so every file can be found, previewed and traced to its original. Tie each file to a cycle where one exists, otherwise to a startup phase and design generation. Write down an ingestion protocol that ends in a story. Then give the cycle detail page a story-first design pass.

started Oct 234 wks · quiet 2
c121Governance v1 Scope

Build the decisions from the week of Oct 19 into the phase-4 lab (/pages/phase4/mock/*). The governing scope is Mark Peterson's v1 guidelines: an exception changes mode only, publication is the whole shared draft, and resolving a finding records a decision.

started Oct 234 wks · quiet 2
c115Briefs

A /briefs section on the design site, off the main menu, with one page per brief handed to a collaborator outside the org

started Oct 135 wks · quiet 2
c105Cost Center

Re-evaluate the qdash /cost page against what the backend now serves, and re-draw it on the Organization / Inventory listing pattern

started Oct 17 wks · quiet 2
c100Landing Pages

Design the three qdash "Design in progress" landings: Home /, /inventory and /team. Each is a 30 ft (300 ft for Home) view of its domain, made more of images than of text.

started Sep 287 wks · quiet 2
c129Deploy Build Time

Keep npm run deploy short as the lab grows. The prerender crawler renders every page it can reach, and the build's time goes wherever the crawl goes.

started Nov 3parked
c7avoma-notesMarket Analyst

Explore and integrate Avoma notes data into extraction pipeline and dashboard visualizations.

started Feb 25parked
c4refinementMarket Analyst

Refine how extracted data is displayed in the dashboard and improve extraction quality where gaps exist.

started Feb 24parked
c3oauthMarket Analyst

Add Google OAuth to restrict dashboard access to @qpoint.io team members.

started Feb 20parked
c69Operating System

Methods & tooling retro — evaluate how we work against the design methodology, restore order, modernize the skill/agent tooling, and make the philosophy load-bearing

started Aug 15parked
c62build-partner

Build-partner portal — research, ideation, and a plan for a page that makes partners insiders

started Aug 8parked
c55agent-market-definition

Align the qcontrol agent-monitoring dashboard to specific personas and find market alignment — hypothesis-first, validated against calls later.

started Jul 24parked

Closed 6

c144Theatre Mode

Tours the person's own agent can give over our MCP server. *New here*, at a level the person picks, from ELI5 to "I have networking degrees". *AI, on your own machine*, an AI primer with the person's computer as the subject. And the *doomsday scenarios*: stories of AI going wrong, played out in the dashboard on synthetic data, in **theatre mode**. Every theatre tour begins with the person and the agent switching synthetic data on together and ends with switching it off. Each scenario's beats double as acceptance tests for the dashboard.

closed Nov 13 · started Nov 124 in the log
c137App Messaging, Overseer and Citizen

The ports and bones of every message between the overseer (the control plane and the people who run it) and the citizen (the employee at the endpoint): one schema, the channels (inbox, tray, OS notification, web app), the inventory of message types the roadmap implies, and the citizen's control over what reaches them. Simple, and never a bombardment.

closed Nov 13 · started Nov 913 in the log
c10Guide WalkQnative (provisional)

the guide walk's report (cycles/notes/2026-11-13-guide-agent-walk.md): what an evaluator's agent driving the guide MCP server needs, in the report's order.

closed Nov 13 · started Nov 13
c2Expressive RangeQnative (provisional)

c131 Phase 2. The whole qdash Inventory section in this app: seven listings, nine detail pages and the landing, in the Qpoint skin, on the data the web pages show, cut to one machine. We build our components in Rust (crates/layer, with the web layer's names) on top of the kit, and record per component how close it came and what it cost. Stretch: the Tour guide, with Info View and the qpoint-guide MCP driving the app. Extra stretch: the table with an expand row at full fidelity.

closed Nov 11 · started Nov 1021 in the log

Pages & components

What this week's captures picture — 36 pages, 1 component · 192 first captured this week. Each links to its evolution: every moment it was shot, across cycles.

Log

Key Changes entries dated inside the week, from each cycle's record — newest first within a cycle.

c147 Findings, a Common Tongue

Nov 13
  • stage 1 (2026-11-13): opened from Mark's words in c137's inbox-rename thread and his four answers (close c137 into a new cycle; prevented is softest; every finding bubbles up, prevented softer; Findings replaces c4's inbox, keeps its plumbing). c137 closed into it.
Nov 13
  • kick-off (2026-11-13): Mark: "Kick off with a plan". plan.md: the pieces that exist (the lab's finding model, S1, S2, the detector, c133's training events, c4's plumbing), rulings R1–R7, five phases with three review stops, seven clarifying questions with defaults, six patterns (the finding as the protocol, event sourcing, just culture, near-miss reporting, honest security, one card per policy and resource).
Nov 13
  • questions walked (2026-11-13): Mark answered all seven (plan §5): the rail Safety & Security → Findings · Settings; Meridian first; findings derived by the lab's detector; an Enforced finding born Resolved: prevented (c121 D3 superseded; the prototype's S2 follows the shared shape); trainings as the event and the record only; no plane work, since the plane's findings already exist in the design prototype (Phase 4 rescoped to the native side of the shape); three review stops.
Nov 13
  • Phase 0, the shape (2026-11-13): finding-shape.md: the finding (immutable; id from a fingerprint of policy, resource, person and device; the outcome stamped once) and its append-only events with a new from (endpoint · person · plane) beside the lab's origin; thirteen event kinds by writer, six of them new (prevented, recurred, asked-it, asked-access, acknowledged, training-assigned, follow-up); the status rule (only the endpoint's prevented and the plane move status; the person's events are proof, c133 D9 generalised); the window (open-while-open for Observed, the day for prevented, repeats as recurred); up and down; two readers of one record; c137's fifteen types mapped (nine fold into the finding or Status); c133 re-homed (§9, and a note in c133's record); five calls for review stop 1. The sketch The common tongue (app/pages/cycles/design/sketches/c147-common-tongue.vue, registered in program-sketches.ts, captured as c147-sketch-common-tongue.png by c130-sketches-design.json), ## The shape above, and the story module app/data/stories/c147.ts wired in cycle-stories-mock.ts (twelve decisions). c137's story gained its closed date. Nothing committed; Phase 1 next.
Nov 13
  • Phase 1, findings in the worlds (2026-11-13): scripts/derive-world-findings.mts reads each world copy, turns what the sensor recorded into the lab's sensor events (every session's model request at its harness's host; every MCP server from the inventory, first seen with its later calls recurring; the three sessions the cut kept in detail: tool calls, egress, sensitive files), folds them through the design prototype's policies (the Oct 19 model under RULED, Q6) with c144's detector and applicability(), and writes a sidecar per world, app/data/worlds/findings/<name>.json, answering /api/policies and /api/findings in finding-shape.md's shape: fingerprinted ids, detect from the endpoint, prevented in the same moment for an Enforced finding, one recurred with the count. Its manifest says what the findings are against, what stayed quiet, and every gap. useNativeWorld() loads the sidecar after the world and falls back to it for a route the world doesn't serve, with a derivedNote for the footer; checked on :3000 (the sidecar loads, no console errors, the Inventory skin still fills). scripts/sync-worlds.sh re-derives after a recut. Results, Meridian first (Q2): meridian-day90 13 findings, all Observed (Nina is not a person in the prototype, so the org's modes apply: four unsanctioned MCP servers, Cursor's api2.cursor.sh as an unapproved provider, eight tools off the allow list); pilot 54, 42 of them Enforced and born Resolved: prevented (Priya is the prototype's own person in Engineering, where unapproved providers are blocked: Cursor and Codex CLI's chatgpt.com, one prevented finding per day under the day window); minimal 7 Observed; fresh none. What the derivation taught, for review stop 1: (1) every world's bridge says the machine is not connected, so a derived finding means "what this machine's activity raises once connected", and a prevented one is what the plane would have stopped; the manifest says so; (2) the day window gives Priya 42 prevented findings in 90 days, a real data point for finding-shape.md §10 call 3; (3) two naming bridges are written down, not guessed (the seed's MCP ids to the prototype's catalogue; its sensitive-file categories to the restricted-path detectors, where shell_history and git_config have no detector); (4) gaps for qnative: 4 sessions in Meridian and 13 in pilot report denied calls or sensitive opens the cut kept no detail for (a recut with detail derives them), and the seed carries no MCP versions and no consequential flag, so P-PROVENANCE and P-TOOL-APPROVAL can't be derived; (5) the prototype's provider list says openai.com, and Codex CLI signed in with ChatGPT talks to chatgpt.com, so it reads as unapproved. Nothing committed; Phase 2 (the copy) next.
Nov 13
  • Phase 2, the copy (2026-11-13): S2 and S1 copied into the native skin from the composed mocks (mock/findings-design, mock/finding-detail) on the derived findings: /pages/native/findings (the listing bar, the grouped ledger with the policy in context, the member table and its card, app/components/native/FindingsTable.vue) and /pages/native/finding-detail (title row, What happened | Why it violates, History, Details, Related Findings, Session, the honest absence), both through app/composables/useNativeFindings.ts, which folds a finding's events as the lab's findingRow() does, with the plane's SLA rubric from the sidecar (Phase 1's script now also carries each policy's words, frameworks and recommended severity). The rail gains Safety & Security → Findings · Settings (Q1; NativeWindow draws it where a mock links it, and the rail scrolls as the kit's does; a shield glyph in NativeIcon). In the operator's words and S2's defaults on purpose; the fleet → personal rules removed User, Team and Endpoint for the harness; decided, not copied: no Resolve and no mode link (the person never moves status), one harness and one framework with a count at 844 px. Registered (phase native, collapse c147-findings); checked on :3000 (no console errors after moving data-qp onto a cell); eight captures by scripts/shot-programs/c147-native-findings.json (the copy at 2× in the window, the lab's S2 and S1 beside). Review stop 1: review-1.md, thirteen calls with defaults; what the copy showed: the operator's defaults show a person nothing (Nina's findings all Observed, Priya's Enforced ones all prevented), the SLA's "past SLA" lands on the person, prevented reads as "0 open · 42 resolved", and S2's columns don't fit the native window.
Nov 13
  • review stop 1 ruled (2026-11-13): Mark: "Take the defaults". Twelve of the thirteen calls as their defaults (review-1.md §Answered): the shape's from, the person never moving status, the day window, prevented as kind and resolution; derived means "once connected"; chatgpt.com goes to Peterson; the recut is asked in Phase 5's brief; for Phase 3, Open with Observed shown, prevented as one quiet group with a count, no SLA clock or deadlines for the person, five columns; the rail scrolls. Call 5 (resolve on training completion) stays open until Peterson. Phase 3 next.
Nov 13
  • Phase 3, the person's view (2026-11-13): three native-skin pages on the same derived findings, beside the copy: /pages/native/safety (the first-run card, Quietly by default; Observed open by default in five columns with the policy under each finding and no SLA clock; Prevented as one quiet card, a line per thing with its days; Resolved), /pages/native/safety-finding (What happened · Why your company's policy covers this · What you can do with Ask for access and Ask IT, each a from: person event that never moves the status; What happened since in sentences; What's recorded) and /pages/native/safety-settings (the one control with what each position would have announced on this machine in 30 days, the kinds, the tray). The person's helpers in useNativeFindings.ts (personEvent, personStatus, nextStep, usePersonEvents stamped on the world's clock, useNoise, notificationsFor); the rail's Findings and Settings link the person's pages. Q4 on the prototype's S2 as a slot variant, ?v.prevented=born (Enforced resolved as prevented, every outcome by default, its own subtitle); the default is unchanged. Every new person-facing string voice-checked: zero violations. Checked on :3000 (Ask IT round trip, no console errors); seven captures by scripts/shot-programs/c147-native-person.json; registered. Review stop 2: review-2.md, nine calls with defaults; what it showed: the default now has something to say; one thing can be two findings (Sentry MCP); the prototype's tool allow list makes Grep and Glob findings; the policies' "why" is a practitioner's; HQ's half is empty on every machine.
Nov 13
  • review stop 2 walked (2026-11-13): Mark ruled the nine calls (review-2.md §Answered): Observed · Prevented · Resolved; Q4 the prototype's default in Phase 4; prevented counts every stop; two findings stay two rows with an "Also under" hint; a why_plain on each policy. Three changed from the defaults: the company sets the noise default per team (the person can still change it); a third verb, "This was a mistake" (the plane resolves with False positive, or doesn't); the prototype's tool allow list widened now (Grep, Glob, WebFetch as built-in read-only tools, in governance-policy-config.ts; worlds re-derived: Meridian 10, pilot 51 with 42 prevented, minimal 6; every Simulation scenario plays the same tool findings; drill-personal-account's failing replay predates this, from the day's c144/c133 commits). Real rows for Priya from HQ in Phase 4. Phase 4 next.
Nov 13
  • Phase 4, up and down (2026-11-13, night): Q4 in the prototype's model: foldFinding() writes a prevented event after detect for every Enforced finding (prevented added to the event kinds, the resolutions and the label maps; the lab's qdash copy maps it to a block); S2 (mock/findings-design) opens on every outcome, the variant gone; the native copy follows; three prototype findings change (F-D, F-E, F-F). Down on real rows: app/data/plane-c147.ts (the plane's moves, matched to derived findings by policy and resource; the per-team noise defaults) merged by the derivation: T-MCP-1 suggested on Priya's Linear MCP finding, Dana's follow-up on her Postgres MCP finding; /api/plane-settings. A plain why for all nineteen policies (WHY_PLAIN, whyPlain, whyPlainOf(); why_plain in /api/policies). The person's view: From HQ first; HQ's words as written with Acknowledge; the training opened in the browser; "Also under"; "This was a mistake" (reported-mistake); the company's noise default on the first-run card and in Settings. finding-shape.md §3, §4, §6a updated; peterson.md, nine questions. Checks: c123 metrics 49/49, tours walk 455/0; Simulation's check 184/6 and the tour drive check 186/2 (the c144 session's numbers; my run crashed on a page timeout after 102/6), all eight from Q4, answered to the c144 session that the ruling comes first. Eighteen captures (eight of the copy, ten of the person's view). Review stop 3: review-3.md, six calls with defaults, the first being Simulation under Q4.
Nov 13
  • review stop 3 walked (2026-11-13, night): Mark ruled the six (review-3.md §Answered): the simulation shows prevented rows beside the open ones and its test lines expect them (c149 builds it; the c144 session told); the plane's moves stay hand-authored; the per-team noise defaults stay, Peterson asked who sets them; "This was a mistake" stays quiet. Changed from the defaults: Phase 5 briefed now (qnative-brief.md: types, the nozzle's three routes, the detector ported to Rust and tested against the lab's sidecars, the person's event store, the pages by /native-port, c4 retired, stories, the recut); and the three open questions decided now: a finished training closes its finding by the policy, "Resolved: training completed", HQ can reopen (revises c133 D9 for policy-assigned trainings; noted in c133's record); chatgpt.com is a different provider, so Priya's 23 prevented findings stand; on a standalone machine the app raises findings from the sensor's events (the Tyler question withdrawn). finding-shape.md §3, §4, §6 and peterson.md (3 and 7 now his rulings to confirm) updated.
Nov 13
  • committed (2026-11-13): Phases 0–4, the three review stops and c137's close in 81f3ee59ee (69 files; unpushed, not deployed); the commit unblocks c149's build of the simulation's prevented rows.

c146 Config File

Nov 13
  • stage 1 (2026-11-13): the prompt was saved verbatim and the plan written from c138's outline, Guide 05, qconfig on main, the app's MCP server and c145's plan. Nine calls were set out with defaults:
    • point or fetch once
    • the words ("policy" collides)
    • a V1 page rather than a Dev page
    • a direct, guarded write rather than a draft
    • the app's own server
    • qconfig linked by git
    • where an agent's change lands
    • the editor spike
    • refusal when the plane manages the file
Nov 13
  • the walk (2026-11-13): Mark ruled the calls:
    • R1: fetch once, with Check for changes.
    • R2: the names and the first pass come from c121's Policy Config › Config File (/pages/phase4/mock/policy-config/config-file). "Policy file" was a slip, and the file is config.yaml.
    • R3: a V1 page under This machine.
    • R4: the agent drafts and the person applies.
    • R5: the app's own MCP server.
    • R6: validation is asked of qcontrol.
    • R7: the draft is the whole file.
    • R8: the editors that exist (gpui-component's Editor and diff), nothing custom.
    • Starters: Recommended plus per-role variants, in one Qpoint-hosted library, with more possible online.
    • C9 goes to Mark Peterson. Its overlay idea (stricter local layers, agents on personal accounts kept out of company directories) opened c148 Config Overlays, stage 1.
Nov 13
  • kick-off (2026-11-13): Mark: "Kick off, build mock." Phase 2 went first. Phase 1's starters were written with it, because the mock needs them.
Nov 13
  • Phase 2, the mock (2026-11-13, uncommitted): /pages/native/config (app/pages/pages/native/config.vue), registered as Native — Config (phase native, collapse c146-config).
    • This machine's file is the world's own, from the bridge's /api/config. fresh has no file, so it draws the stock-document state.
    • Fixtures in app/data/config-c146.ts:
      • the three starters (Recommended, Developer laptop, Data or analyst laptop), at a fixture library address, qpoint.io/configs;
      • Claude Code's draft;
      • HQ's file (Meridian, v13);
      • the fetched files: one good, one invalid, one newer.

      Every file is written to qconfig's schema on main.
    • The check stands in for qcontrol's (R6). It applies the strict schema: unknown keys, required fields, and targets that name undefined behaviors. Each problem gets its line, its key path and the nearest valid key ("did you mean plugins?"). The it_contact key in the pilot world, proposed by c137 but not in qconfig yet, shows as a warning, not an error. All fixtures pass, and the invalid one fails on the right line.
    • Edit here:
      • the editor sits in the layer's UxEditorFrame, with the starters in its tray and Written and Effective tabs;
      • the gutter marks error lines;
      • Apply and Discard edits;
      • versions with Restore;
      • an agent's draft as a folded diff, with Apply and Discard (R4, R7);
      • Applied as v3, with Revert.
    • Managed by your company:
      • not connected (an address and a token);
      • signing in;
      • connected and read-only, saying who manages it, with the other modes locked;
      • an agent refused (C9's first pass);
      • refused;
      • not answering.
    • From a published file:
      • an address, or a file from the library;
      • fetching;
      • shown, with its hash;
      • invalid, with nothing written;
      • written, with the record of origin at the top;
      • Check for changes, with the difference (R1).
    • Other changes: the rail gains Config under This machine, but only where a mock links it, so earlier captures keep their rail (NativeWindow). There are four new glyphs in NativeIcon.
    • Captures: sixteen, c146-config-* (program scripts/shot-programs/c146-config.json, thread c146-config, subject page/native-config), each window as tall as its page.
    • The checker imports yaml. It's in node_modules as a transitive dependency, not in package.json. To add when this is committed.
Nov 13
  • Review stop 1 (2026-11-13), six questions:
    1. The mode labels: Edit here · Managed by your company · From a published file. Do these read as Policy Config's vocabulary? HQ's file is labelled "Policy Config v13".
    2. A published file replaces config.yaml whole, keeping the old file as a version, in line with R7. Guide 05 had it land as a conf.d/ include, but includes can't carry sinks or UI. Agree?
    3. The starters live in the editor's tray. Or should they be a first step of their own when there's no file?
    4. Versions on the endpoint carry Policy Config's History over. Keep them, or is Revert to the last version enough?
    5. Ask your agent sits on the page, with three example instructions. Keep it here, or only on Help?
    6. Tyler's question, made visible by the HQ state: does the company's Policy Config reach this machine as this config.yaml?
Nov 13
  • Review stop 1 walked (2026-11-13): Mark took every recommendation.
    • Q1: the labels stay as drawn: Edit here · Managed by your company · From a published file.
    • Q2: a published file replaces config.yaml whole, with its origin at the top; the old file is kept as a version. This supersedes Guide 05's conf.d/ landing.
    • Q3: the starters stay in the editor's tray. When there's no file, the page also opens on a Pick a starter step: three cards, each saying who it's for and what it does, or an empty file. Built, and c146-config-no-file recaptured.
    • Q4: the endpoint keeps the versions list, with Restore on each. It also records what agents changed.
    • Q5: Ask your agent stays on Config, and Help › Getting started gets the connect line. That lands with Phase 3 and 4's native build.
    • Q6: the "Policy Config v13" label on HQ's file is marked an assumption on the mock page. Tyler is asked: does the plane deliver the company's Policy Config to the sensor as config.yaml, or alongside it?
Nov 13
  • Phases 3–4, the app (2026-11-13, qnative c11, branch c11/config, 73316aa): built in its own worktree (.claude/worktrees/c11-config), because another session was working in qnative's guide.
    • The page: Route::Config under This machine, and pages/config.rs with every state the mock draws. The editor is gpui-component's code editor (YAML, line numbers, each problem marked on its line) in QGUIkit's EditorFrame (R8, nothing custom).
    • The check (R6's stand-in): qconfig's own parser (serde-saphyr 1.3), with structs mirroring qconfig's schema on qcontrol main. Each problem gives its line, its key path and the nearest valid key.
    • Six guide tools: config-state, -read, -reference, -starters, -check and -propose. There's no write tool (R4). config-propose refuses an invalid document with its problems, and refuses on a managed machine (C9's first pass).
    • Tests: an agent proposing through guide::call is tested end to end: the invalid document refused with "did you mean plugins", the valid one shown for the person, and nothing applied. The whole workspace passes.
    • Captures: five native captures mirrored here as thread c146-config-native (program scripts/shot-programs/c146-config-native.json), B beside A.
    • Open: writes stay in the app until Kamal answers who may write config.yaml. The editor shows YAML without colours (the tree-sitter feature, to look at). Fetching any address waits for the docs site's library.
Nov 13
  • Harness ids corrected (2026-11-13): the starters and HQ's file named claude-code, cursor and codex. qcontrol's rules use claude-cli, cursor-cli and codex-cli (qconfig's tests, the monitor's inventory tests), so they are fixed in the lab fixtures and the app. The 16 lab captures were retaken.
Nov 13
  • Merged (2026-11-13): Mark: "Merge it now." c11/config merged into qnative main as 313bd7c, after c10's guide walk (8382135) and c9 and c12's records (049e481) landed. The only conflict was the cycles index. app and stories tests pass on the merged tree (25 and 86), and main type-checks. The worktree and branch are removed. Not pushed.
Nov 13
  • Phase 1, the intents catalog (2026-11-13): intents.md has twelve plain instructions, each with the fragment that answers it, written against meridian-day90's file. The instructions cover a sink, a file log, a secret kept out of the file, OpenShell for Cursor, filtered events, the tray, stop watching a harness, a starter, "what is it doing?", and a refusal explained. Each fragment, merged into the whole file, passes both the app's config-check and qconfig's own loader on qcontrol main (8677b44ed, run from a scratch example). The harness ids are qcontrol's.
Nov 13
  • Phase 5, the eval (2026-11-13): eval.md, with every run's tool calls and drafts in eval/.
    • The setup:
      • qnative main 313bd7c, built from a scratch worktree;
      • synthetic data, world meridian-day90, guide port 7895, a fresh app per instruction;
      • headless Claude Code on Opus 5.5 with only the guide's MCP server.
    • On the plan's words, 9 of 12 pass. Every proposal the agent made checked clean the first time (8 of 8), and every draft also passes qconfig.
    • The three misses:
      • #6 ("turn the tray off") and #8 ("stop watching Aider") were routed to find-in-app and never reached the config tools.
      • #5 wrote Bearer $__local{KEY}. Both checkers pass it, but qsecrets resolves only a string that is exactly the reference.
    • The fixes, tested on a scratch build: three one-line wording fixes (F2 secret references, F3 routing at the top of the guide's instructions, F4 behaviors: []) make all three pass. They are not applied to qnative; the patch is eval/fixes-F2-F4.patch.
    • F1, the bigger finding: the stand-in check passes 12 of 15 documents qconfig refuses, and refuses 2 it accepts. Linking qconfig is recommended.
Nov 13
  • Phase 0, owed and done (2026-11-13):
    • The sketch is One file, three sources, one check (app/pages/cycles/design/sketches/c146-config.vue). It is registered in program-sketches.ts, captured as c146-sketch-config by c130-sketches-design.json, and placed under § The shape.
    • The story is app/data/stories/c146.ts, wired in cycle-stories-mock.ts. It has twelve decisions (R1–R8, Q2–Q5) and five outcomes, with the sketch as hero.
Nov 13
  • Review stop 2 (2026-11-13), three calls:
    1. Land F2–F4 in qnative?
    2. F1: link qconfig as the stand-in check, or fill the mirror's gaps?
    3. Mark's walk of the twelve instructions, with a managed-machine instruction left for it while C9 is open.
Nov 13
  • The walk, begun (2026-11-13, in the c146 session): Mark: "let's walk them here."
    • The setup: the merged build (313bd7c) and a scratch build with the wording fixes, swapped in one window on guide port 7895. Mark's own app on 7891 predates the merge and has no Config page. Each instruction gets a fresh Claude Code with only the guide.
    • #5: failed on the merged build (Bearer $__local{…}), passed on the fixed one. The agent also explains where the prefix goes.
    • #6: failed on the merged build (Messages › Settings), passed on the fixed one.
    • F6 ruled:
      • W1: ui.tray is the one menu-bar icon, whoever draws it; an ask to engineering.
      • W2: the agent drafts ui.tray: false and names Messages' switch. This works only from config-reference's ui.tray text, not from an instruction line.
      • W3: "tray" means the menu-bar icon only, and the guide's messages.tray is retitled "Show messages in the tray".
    • F7 found: point at Apply via config.draft.
    • #8:
      • On the merged build, the agent reached config this time. Its first proposal was refused: F8, a rule's -- comment written as a YAML line. It also matched by binary, because a section's reference has no harness ids (F9).
      • On the fixed build it passed with harness.id == "aider" and behaviors: [], and pointed at Apply (F7 works).
      • With F8 and F9 added, it took one reference call.
    • The fixes: in eval/fixes-F2-F9.patch (eight wording lines and one region title), not applied to qnative. All three misses pass on that build.
Nov 13
  • The fixes landed (2026-11-13): Mark: "Yes, land it." 9daa5f8 on qnative main (not pushed) carries F2, F3, F4, F6's W2, F7, F8 and F9 in tools.rs and mcp.rs. cargo test --workspace passes.
    • It was committed through a temporary index, because qnative c13 holds staged work in the same tree.
    • Handed to c13:
      • W3, the retitle of the tray region, which moves in c13 to safety-settings.tray;
      • W2's sentence, which names Messages › Settings and should name the new place.
Nov 13
  • Phase 6, the record (2026-11-13):
    • Guide 05 (../qnative/cycles/c3.developer-mode/guide/05-config.md) rewritten from a proposal into the contract: the three modes and their labels (Q1), a published file replacing config.yaml whole and fetched once (R1, Q2), the six tools and what they return, the agent drafting and the person applying (R4, R7), the check and its error shape with F1's drift, and the asks still open, W1 included. qnative 8cbd367, committed alone through a temporary index (c13's staged work left as it was), not pushed.
    • c145's configure step (Set up this machine, step 3) points at the Config page: /pages/native/config and Route::Config.
    • The Outcome below.

c144 Theatre Mode

Nov 13
  • New to Qpoint, Mark's review (2026-11-13; qnative e4fc308, pushed): Mark reviewed the native New to Qpoint tour live and sent the changes one by one, all built in qnative. They extend this cycle's tour layer: the highlight looks, callouts and panel.
    • Copy. Status's callout is now "The dot turns green when the sensor is working." Its description had a focused edit, Sensor's callout was relaxed, and the chip reads "Is it running?".
    • Rail mark. The step's row in the rail can be marked five ways (RailMark: off, hole, ring, clear, note). It's off until Mark picks one.
    • Help. The Ask the guide and Info View highlights take in their whole sections. Ask the guide has a "Connect your agent" callout, and Info View's chip has "Try it".
    • Activity. The step has no highlight. Each chart and Recent Work has a numbered, titled callout, and the panel lists them with each card's figure.
    • Callouts. They have a light-blue outline, avoid each other, and follow their target while the page scrolls. That last fix isn't verified live.
    • Panel.
      • The hovered stop's name shows under the bars.
      • A grape "Click me" pill sits on an outline round the step's chips.
      • The panel can be undocked into a draggable card, from its left-edge grip, its header, or the guide's set-view docked.
    • Status page. The dot is 26 px, and the machine shows as the endpoint chip.

    Captures are in rail-mark/. Mark's idea of a tour that connects and configures the app opened as c145 (stage 1: initial-prompt.md and plan.md with four rulings to make). That work came from the "Live activity viewer parity" session.
Nov 13
  • Committed, deployed and prepared for archive (2026-11-13):
    • Committed: the lab work, at Mark's "Yes, commit design", as design 8414bc08cc: 106 files, only c144's lines from the shared files, other sessions' work left alone.
    • Trainings: c133 wrote the four trainings wave 1 wanted (463237c3a1, review-9-wave1.md). They are wired in b3251694bb. In the same commit, a stopped act's evidence reads as attempted. theatre-check 190/0.
    • Pushed and deployed at Mark's "Yes, push and deploy".
    • Records: Mark asked to "update any histories in prep to be archived", so the Outcome below, the HISTORY.md entry and the story are written.
    • Calls walked at the close (Mark: "walk any questions here then let's proceed"):
      • Priya's harness: "Cursor CLI in both". The lab follows the pilot world (c132 D6). SUBJECTS.priya, her S-6 session and S1's cast and test lines say Cursor CLI.
      • The temporary look controls: "Keep behind the flag". ?lookControls=1 stays a lab tool.
      • The native Models and Tools callouts under the tour panel at 1120 px go to qnative c12 Punch List, item 2.
      • The carried-forward phases: "Open stage 1 now". They become c149, Simulation Mode, Both Seats, stage 1.
    • Closed: c144 is drained from CYCLES.md and its HISTORY.md entry written.
Nov 12
  • opened (2026-11-12): from Mark's prompt, the same day. The survey found most of the machinery already built (initial-prompt.md § What already exists). Written the same day: plan.md (the catalog, the theatre rule, the scenario model, the register slider, the metaphor and its breaks, the marks, the MCP additions, the scenarios as tests, seven phases), scenarios.md (wave 1: six scenarios beat by beat, Mark's five plus a runaway loop; wave 2: thirteen more by who does it; seven gaps), and the sketch c144-theatre, captured. Nothing built yet. At review stop 0, with nine calls.
Nov 12
  • Phase 1, the lab (2026-11-12), at review stop 1: built on the rulings, uncommitted. The pieces, each extending the c125 tour layer rather than standing beside it (Mark: "We already have a theatre harness–the tour guide"):
    • The scenario model (app/data/scenarios/): types.ts, detect.ts (one sensor event in, the policies it raises out, read from the world's own configuration: sanctioned list, pinned versions, detectors on, TLS floor, spend ceiling), play.ts (the world at beat N = live + the set + beats 1..N, folded by applicability(); Replay at Enforce as a user exception on theatre's copy). Wave 1, all six (C8), one file each; the five c123 drills ported as one-beat scenarios.
    • Theatre state (useTheatre): on/off, scenario, beat, replay; per tab (sessionStorage); ?theatre=<id>&beat=<n>&replay=<P> a way in for links and the walk. The governance mock's world is the play while theatre is on; staging, saving to the draft, publishing, rollback and import refuse.
    • The stage (components/theatre/): the band (ink, marquee bulbs; theatre's own material) and a frame round the window; the Theatre switch at the foot of the rail (picking a story starts its tour, C1); the panel's theatre note (waiting for the switch, the beat's findings and quiet policies, gaps, the replay picker and the trainings at the replay step); the three-stop register in the panel (C4).
    • Theatre tours (data/tours/theatre.ts): one per scenario, generated (curtain up, a step per beat, replay, curtain down), in TOURS and the catalog. Beats move on the person's Next (C2); S6's beats 3 and 4 move on by themselves; ?theatreTest=1 lets a harness run play beats.
    • The guide (qpoint-guide 0.4.0): list-tours' kind, data and scenario; tour-state's theatre and register; read-step's beat, played result and trainings; replay. No tool turns theatre on or off or plays a beat; set-register was built on the defaults and removed by C4.
    • Show mode (C10, brought forward at Mark's ask): useShow, ShowRunner, ShowControls, the list at /pages/phase4/show; a show runs in theatre, dwells ~8 s a step, loops, pauses on input, resumes after 3 idle minutes (or not), End show leaves you where it was.
    • Demo /pages/phase4/theatre (empty, minimal, typical, overflow, error; a scenario beat by beat at three registers; the replay matrix; every scenario's authored replays against the play).
    • Trainings (c133, use what exists): T-INJECT-1 on S1 (written for it by the "Cycle tours" session, 99865de0b0), T-MCP-1 on S2, T-SECRETS-1 on S3, each opened on the story's own finding. The four wave 1 wanted were written by c133 on 2026-11-13 (review-9-wave1.md) and are wired: T-PROVIDERS-1 on S5, T-PROVENANCE-1 on S2 and S3, T-APPROVAL-1 on S1, S3 and S4, T-SPEND-1 on S6. A stopped act's evidence now says what was attempted (Raise.ifStopped: "held for approval", "blocked at connect", "denied", "blocked on the way to"), so a replay's finding and its training agree. Native bundles each with its scenario.
    • Records: scenarios.md § As built (eight corrections the play made to the first draft: casts, five policies Off org-wide, three policies that can't enforce, sanitization that doesn't save S1, the PHI-only boundary); gap 1 rewritten (C9) and gap 8 added (a spend ceiling that can act). Priya's laptop renamed mac-eng-07 → priya-x1 across the lab and qnative's two training fixtures (the "Cycle tours" session's call, made on Mark's behalf: "your call").
    • Checked: scripts/theatre-check.mjs 176/0 (T1 every scenario's test lines and replays on Findings, 129; T2–T4 the guide, C2's exceptions, safety, 35; T5 Show mode, 12); tour-drive-check.mjs 187/1 (the one: example-complete, hidden since 2026-11-05); tours-walk.mjs 455/0 (theatre tours skipped there, walked by theatre-check).
    • Captured: scripts/shot-programs/c144-phase1.json, nine shots (c144-theatre-*, c144-show-*).
    • Native S1 (Mark: "Yes, both now"), built in qnative on its existing tour guide by a background agent of this session; uncommitted (qnative HEAD still 880451a). Pieces:
      • the tour crates/app/tours/theatre-phishing-financial-records.json, after New to Qpoint and This machine in the catalog;
      • nozzle/src/theatre.rs: each beat's events added to the pilot world in the stream scripts' shape, and going back rebuilds;
      • the curtain on the existing synthetic switch (the tray's world, Dev › Source);
      • the band and frame;
      • the guide's theatre state, C2's refusals, replay and QPOINT_THEATRE_TEST;
      • T-INJECT-1 bundled for the replay step;
      • 13 theatre_* story tests. cargo test --workspace 202/0. Launch: cargo dev -- --data synthetic --world meridian-day90 --tour theatre-phishing-financial-records. Not done natively: findings drawn per beat (no policy engine; the panel names the lab's), Status, Inventory and cost folding the story, theatre's messages (C6), S2–S6. Captures: scripts/shot-programs/c144-native-theatre.json.
    • Review fixes the same night (Mark, trying it):
      • the panel flapped side to side at the replay step: it rang its own replay picker. Fixed by ringing Findings, and the tour now never rings inside its own panel (queryTarget);
      • the register is a select ("a select that can be changed rather than omnipresent buttons"), in a tour config that opens and closes from the panel's header ("hide this behind a tour config");
      • the panel's title is one line ending in an ellipsis, the full name on hover, and its three icons (config, minimize, end) sit closer together ("a scrolling title, or one that ends in elipses … we can move the icons closer together");
      • the README's Tours and theatre section says how to run all of it, the native app included (Mark: "update the README with clear instructions").
      • "Simulation mode", not theatre ("let's call it simulation mode instead of theatre, keep the icon"). The product's words changed: the switch, the panel, the tours (Simulation · …, steps Start / Finish), the guide's instructions and errors, the concept, the README. Code ids, URLs (?theatre=) and the API's theatre fields keep the name.
      • The band became the simulation panel ("keep it stylistically closer to the tour … the info panel that opens / closes at the bottom of the app"). It's in the tour's material (#0099ff on white). One line is always there (Simulation · synthetic data · nothing here is happening on your machine, the story, the beat, Leave simulation), and Info opens the rest (what a simulation is, the logline, the set, the replay picker when no tour holds it). The frame is a thin line in the tour's blue.
      • Each beat points at what it brought ("I didn't quite understand what was being pointed at", on S3). A beat rings the Findings rows its own test lines name, with a callout in Mark's words: "See: at 09:30 Qpoint noticed a policy was broken: Restricted file access. This is where it shows in the dashboard. It can also send a message to Slack #sec-alerts" (the lab's connected channels that take the severity). A beat that raises nothing points at the story's clock, and the tour panel says why: off stage, a quiet policy, or a setting that doesn't cover it.
      • "Click here" callouts ("callouts like 'Click Here' "). TourCallout.click draws a bold label with a large arrow nudging toward its target; show(ctx) hides it once it's done. Used at Start ("Click here to start the simulation") and Finish.
      • Native, the same round (uncommitted): the rename, and the band moved into the footer (one line, always there) and the Info View (the story, the beat, "Stopped at", the source, Leave simulation) in the tour's blue; a new story app-theatre-info; cargo test --workspace 202/0; recaptured, 14 shots. "Click here" isn't native yet: the native callout has no such style, and the switch is in the tray, outside the window. The Info View's sentence about publishing and the draft came from the lab and didn't fit the native app; at Mark's yes it now reads "When it ends, the app goes back to the data it showed before" (tests 202/0, recaptured).
      • Checks after: theatre-check 182/0 (each beat now also checks it points at what it brought), tour-drive-check 187/1 (example-complete, as before), tours-walk 455/0.
      • One click in the tour ("let's make the switching on of the story a single click in the tour"). The Start step's panel has Start the simulation, and Finish has End the simulation: a tour action of kind simulation, the person's click (C1 holds: the guide can't press it). Each shows only until its goal is met, and the rail's switch still works. The Click here arrows at Start and Finish gave way to the buttons. theatre-check 184/0. Native: sent to the native agent.
      • The highlight in dark mode, and a blur ("the overlay should lighten the page allowing the highlighted section be stay dark … is there a blur we could apply?"). In dark mode the tour's overlay now lightens (white at 32%), and an optional backdrop blur softens the page outside the highlighted regions (TourDim's blur). Knobs for the experiment: ?dimTint=&dimStrength=&dimBlur=&lookMode=, and a comparison page /pages/phase4/tour-highlight (six looks side by side in dark mode, plus a tunable one). Mark picks; the native overlay follows.
      • Temporary look controls, web only ("would you mind creating temp controls so I can dial in the opacity, color and blur amount?" … "just in the web view for starters"): TourLookControls, on any lab page with ?lookControls=1. It has a colour picker with presets, opacity, blur, a light/dark switch, Reset and Copy values. It drives the host's look live through shared state (qp-tour-look-knobs) and is linked from /pages/phase4/tour-highlight as Dial it in live.
      • The dark-mode look, picked (Mark, with the live controls): "#7281ca at 44% · blur 1px" is the dark default (TourHost DARK_TINT, DARK_STRENGTH, DARK_BLUR; the controls' Reset follows). Light mode stays #73858f at 60%, no blur. Sent to native: the same tint and opacity, and the blur if GPUI can draw one.
      • Dark mode, finished by eye:
        • "let's add a dark ring around the hole": TourDim draws a ring just outside each cut-out, #080a14 at 3 px in dark mode, none in light mode;
        • "the text can be a shade lighter of cyan": the v4 tour's words in dark mode are #5cc2ff (--tour-text-dark), and so are the simulation panel's; fills and outlines keep #0099ff;
        • "Let's make titles white": dark-mode titles are white (--tour-title-dark).
        • "let's make the circle white with cyan text", then "the number in the disc black, and black weight … a cyan outline 4ps thick": in dark mode the callout's number disc is white, its number black at weight 900, with a 4 px #0099ff ring (.tour-disc). The look controls gained Ring (colour, width), Text and Titles. All of it was sent to native.
      • The callout disc, settled (after white with a black number and a ring): "let's return to cyan bg, white text, bigger font, still black weight". The #0099ff disc with a white number at weight 900, bigger (36 px with a 20 px number; small 26/15).
      • Numbers only where they match ("WE should only show a number when it corrosponds, and we should show that same number to the point we are making"; then "the correlation is much better!"). A beat has one numbered callout per row it brings, in the order of its test lines, and each row gets its own highlight. The tour panel lists the same findings with the same numbers. A callout that matches nothing has no number. Every finding a beat raises now has its test line (sanitization added to S1, S2 and S5), so each gets its number. theatre-check 190/0.
      • "Simulation on", quiet, in the panel's chrome ("let's add the simulation on thing much more subtle and part of the panel chrome"): a small mask and "Simulation on/off" at the right of the panel's step-count row; the heading inside the step's note is gone.
      • Native, round 3 (uncommitted, cargo test --workspace 208/0):
        • the one-click Start/End in the panel (a simulation action);
        • the callout pointer: the engine was right, and two tours' data aimed the callout at the wrong card (Providers aimed at Tokens; Tools ringed one card and pointed at another). Fixed, with a story test of every callout's pointer in two worlds and two sizes. Models and Tools callouts at 1120 px still hide under the tour panel; that stays open;
        • the dark look (no blur: GPUI can't draw a backdrop blur without a renderer change). The disc revert, the numbering rule and the quiet mark were sent the same night.
      • The panel's policies look like Findings' rows ("it also might make sense to show the policy inline display component when we are talking about that … IE, these should look the same"): in the tour panel each finding is now its severity ribbon, the policy's name and its id, as the Findings row draws them, with its number and its outcome.
      • Each finding in its own box ("draw a box around this item and change the 1 finding at 9:30 text so that the two correlate"). Each box carries its number, "New finding at 09:30", the policy and the outcome, and the loose count line is gone. The note itself is no longer a box.
      • Dark-mode polish (Mark):
        • "make the outline color a bit lighter": the finding boxes' outline is rgb(150 214 255) at 55%;
        • "make the simulation on lighter blue with a white dot instead of that icon": the panel's mark is a white dot and lighter blue words;
        • "the unhighlighted steppers are too dark": the stop bar's other segments are rgb(150 214 255) at 35%. All in tour-material.css; the two that apply natively were sent.
      • Native, round 4 (uncommitted, 209/0): the cyan disc, numbers dropped where nothing in the native panel matches them (ten callouts across the three tours, new-to-qpoint.json included, the other session's committed tour), and the quiet "Simulation on" mark.
      • Native, round 5 ("let's propagate these changes to the native app"; uncommitted, 212/0):
        • the dot and the lighter stepper;
        • each lab finding in its own box, labelled honestly ("In the lab: new finding at 09:05"), with a new QGUIkit PolicyRibbon;
        • the register as a dropdown in a settings drawer;
        • the one-line title and the 28 px icons. Recaptured: c144-native-theatre.json, 17 shots, including the drawer and the highlight in both modes.
      • Native Help mode ("turning help mode off doesn't change anything if the panel is still open, make sure that actually changes the mode"): off only changed what the open panel says over empty space, and whether it reopens. Sent to the native agent: the switch takes effect at once, both ways, with tests.
      • Point only at what matters (Mark, on the native start: "what are we highlighting here? What are we saying? what really matters, let's be clearer"):
        • the lab's Start and Finish steps ring nothing (the panel's button is the action);
        • the replay step rings only the row of the policy that stops the story, with a callout saying where and why.
        • The native tour's whole-list and whole-page rings were sent to the agent: each beat rings the session or tool call it added, with a callout saying what happened then.
      • Off-screen moments as scenes ("should we be showing an screen like in remediation training instead of trying to show someting in the dashboard? WE could have a page that's blank and shows scenes", then "Draw all the scenes"):
        • a beat that happens off the machine names a c133 training scene (ScenarioBeat.scene), and its tour step goes to a blank scene page, /pages/phase4/mock/scene;
        • the page shows the moment ("Off screen · 02:40 · beat 1 of 5"), the scene drawn large and the beat's line at the person's register, with the simulation panel still along the bottom;
        • five new scenes, drawn the trainings' way (pawns, sketch boxes, one flow arrow) and catalogued in data/trainings/scenes.ts: skill-update (S3 b1), share-request (S4 b1), public-link (S4 b4), ticket-card (S5 b1) and stranger-asks (S5 b3); S1 b1 uses T-INJECT-1's hidden-instruction;
        • read-step tells the guide a beat is off screen, and the check confirms the scene page shows the right scene;
        • native S1's email beat was sent to the agent.
      • Native, rounds 6–8 (uncommitted, 218/0):
        • Help mode: the switch now takes effect at once, both ways. A page change closes the panel when it's off.
        • Each beat points at the one row it added: the TH-S1 row, then the Grep, Read and gmail.send calls, with "New at…" callouts. Start, b1 and Finish ring nothing.
        • A native scene page (/simulation/scene): S1 b1 shows T-INJECT-1's hidden-instruction image. S3–S5's scenes still need exporting.
        • "Off on what page": the walk tests found no real desync. The cause was two copies running: the guide went to the old build, which grabbed port 7891 first. One bug fixed: Back did nothing once the simulation was off.
        • A single-instance guard: a second launch brings the running copy forward and exits (QPOINT_ALLOW_SECOND=1 overrides).
        • Still open: the scene page's image overflows its space, sent back the same night.
      • Native S1's session page, checked with Mark ("are these pages correct?" … "let's proceed"):
        • the beat's model request was missing from the page, so it gets its own row, ringed;
        • the session showed $0, so the stories' model requests now carry a cost (costUsd: S1 0.05, S2 0.08, S3 0.06, S4 0.19, S5 0.002), the lab half done here;
        • "Cursor CLI" against the lab's Cursor goes to the pilot world's own harness for Priya (the world wins, reported back);
        • raw {"summary":…} JSON in the transcript is replaced by plain text;
        • three caveat paragraphs become one quiet line, with the detail in Info. All native-side items were sent to the agent.
      • Native, rounds 9–10 (uncommitted, 221/0):
        • the scene page fits beside the tour at any size (tested at four sizes, in light and dark, with the placeholder);
        • beat 4's model request is its own row (Claude Sonnet · api.anthropic.com · 14.2k tokens · $0.05 · carries: bank account, SSN), ringed with the Read;
        • the session shows $0.05;
        • plain-text arguments;
        • one caveat line, the rest in Info;
        • overlapping highlights merge into one ring. Harness: the pilot world has Priya only on Cursor CLI (cursor-agent, 20 sessions), so the native app says Cursor CLI. Whether the lab follows (c132 D6: the world wins) is Mark's call. Recaptured.
      • Native committed (2026-11-13, at Mark's ask relayed by "Live activity viewer parity", which builds on the tour next): qnative 32c9b03 (trainings: T-INJECT-1, priya-x1) and d94716f (simulation mode, S1 in the tour guide), on main, pushed since. The design half followed at Mark's "Yes, commit design".
      • Native callout pointers ("the pointer is often in the wrong place", This machine tour on Providers): sent to the native agent with the screenshot.

c139 Updates

Nov 13
  • review stop 1 walked (2026-11-13): Mark ruled the eleven calls (review-1.md §Answered). Nine as their defaults (Automatically; a quiet trace; notes inline; no skip; one page, two rows; the guarded idle restart; tag and short SHA; Ask me first's clock and the 60-day line; the era from the feed). Two changed: the release notes are drafted automatically from the commit messages, with room for manual additions (engineering and design now, product later); App Settings is a rail item with a submenu grouping General · Updates · Notifications · Data · Developer (read with design c147: Safety & Security keeps its own Settings, App Settings › Notifications points to it; to confirm). Phase 4 (the native build) and the lab's update to calls 5 and 9 go to cloud sessions; the app couldn't start them from the walking conversation, so their briefs wait in cloud-native-prompt.md (qpoint-io/qnative) and cloud-lab-prompt.md (qpoint-io/design), to start under New session → Cloud.
Nov 11
  • kick-off (2026-11-11): created from Mark's prompt (initial-prompt.md, verbatim). c138 was the highest cycle in cycles/ and on the remote, so this is c139. plan.md written from c130's platform research §5, c137's plan (D9 delivery modes) and inventory (row 24, app-update dropped), c62's records and the /partner-digest skill: the two binaries, the feed, nine states, the preference, the trace, two eras, seven rules, twelve proposed defaults, three phases after this stop, six dependencies for Tyler.
Nov 11
  • Phase 0, prior art (2026-11-11): prior-art.md, written by a research agent in the same session. It covers seven desktop apps' update settings (Zed, VS Code, Firefox, 1Password, Slack, the Claude desktop app and Raycast) and five ways of giving some people a build first (VS Code Insiders, Chrome's channels, TestFlight, staged percentages, B2B early access), each in the same rows, with sixteen questions and a default for each.
    • The reading backed D1, D2, D5–D8 and D10.
    • It found the model stricter than every precedent on five counts: no restart while the window is open, the sensor's sentence, a visible trace, no skip, and one channel source.
    • It found the model thinner on seven. Four became D13–D16: the idle-relaunch guard, Ask me first's clock, the age line for an install that stopped updating, and "what to try" with a history that shows failures. The rest went into the plan's later era.
    • Linear, Arc and Figma were too thin to table. Some vendor pages were blocked and are cited from search excerpts, marked as such.
Nov 11
  • Phase 1, the model (2026-11-11): plan.md §The shape, drawn as An update and its states with the c130 kit and registered in program-sketches.ts. The sketch shows the plumbing (the feed, the updater, the state machine, the surfaces), the path, the three states that leave it, the preference matrix, the trace and the two eras. It is captured as c139-sketch-updates.png for the Why and the story's hero, and ## The shape sits above.
Nov 11
  • Phase 2, the mocks (2026-11-11): Settings › Updates and the tray and the trace, in the native skin (c132 medium A).
    • Settings › Updates is the app's first Settings page, at the foot of the rail. It has a state card (one sentence, what happens next, the next step) with the versions of the app and qcontrol under it and Copy version info. Below are the preference as three tiles, the channel (Build partners now; Stable or Beta later) and the history with a state. The notes sit in the right column: internal now, drafted from the cycle records with each line's source and "what to try"; public later. The footer carries the trace (0.2.0 ready, updated).
    • The data. Every state in both eras is set by a marked knob (?state= ?pref= ?era= ?sensor=1 ?skip=1), since no world carries update state (c132 D6). qcontrol's version, the harness count and the source line are read from the worlds. One view function (c139-updates-view.ts) gives every surface its words, so the page, the footer and the tray cannot disagree.
    • Walkable. The buttons step through the states, each followed by a toast as c137 D12 rules.
    • The tray page shows the menu on a desktop, the window's footer in the same state, and every state side by side.
    • Registered and captured. Both pages are in page-registry.ts (phase native, collapse c139-updates). scripts/shot-programs/c139-updates.json (scale: 2, clip: ".native-window") ran here: sixteen captures plus the sketch, filed in public/cycles/design/.
    • The layer. Untouched. A dense UxToggleCard is flagged for c135.
Nov 11
  • Phase 3, the story (2026-11-11): app/data/stories/c139.ts, wired in cycle-stories-mock.ts. It records Mark's four asks as his decisions and has five outcomes, with the sketch as the hero and seventeen captures.
Nov 11
  • Review stop 1 (2026-11-11): review-1.md holds eleven calls for Mark, each with a recommended default and the capture that shows it: the preference's default, what invisible means, inline or linked internal notes, skip, who owns the notes, one update or two, when an automatic install may restart, the version string, where Settings lives, the clock and the age line, and the era as data. Tyler's six dependencies (T1–T6) are listed separately, along with what is out of scope (updating the self-hosted plane, c134) and what was and wasn't verified.
    • Environment. The layer package returned 401 from GitHub Packages in this cloud session, so the site ran against a read-only clone of q-nuxt-layer 0.9.37, with package.json and the lockfile restored. Nothing went into ../qnative; that is Phase 4, after the rulings.

c138 Developer Mode

Nov 13
  • The native firehose in main's grammar (2026-11-13, qnative f19e679, pushed): Mark said the qdash firehose is "cleaner, better color coding, filtering". So the native Events view now follows main's /live, compared on one corpus with main running from ../qcontrol-main on :3031. It has family-coloured chips, 44 px zebra rows, mono key=value summaries, a column header, and main's filter card with chip rails in place of the left rail. The c138 improvements are kept. The rest of Phase 3 is listed in live-parity-plan.md (§ 2026-11-13), with captures in live-firehose/. Tests: 221/0.
Nov 13
  • Phase 6 (Config) moved to c146 (2026-11-13): Mark asked for the Config page again, adding an editor in Manual mode and an agent that writes the file over MCP. c146 inherits ruling 4 and the Guide's page 05. Mark ruled the same day that Config is a V1 page under This machine, not a Dev page (c146 R3), which overrules ruling 6 for Config.
Nov 13
  • DataDotStrip into the layer (2026-11-13): the footprint page's local chart moved into q-nuxt-layer as DataDotStrip (v0.9.39), per the unified pantry. The page's domain words became shapes (dot, ring, diamond, square, keyed by the legend; each mark's own tip says what it means on that chart); the row grid is scoped CSS, so its prop-driven columns reach every consumer. Documented at /components/data/data-dot-strip with c138 Phase 0's readings as the typical case, plus empty, minimal, a whole and overflow; captured as c138-data-dot-strip (program scripts/shot-programs/c138-data-dot-strip.json). The page's six captures are pixel-identical before and after the move.
Nov 13
  • Layer v0.9.39 released and the branch merged (2026-11-13): the cloud session had committed v0.9.39 to the layer's main (1cdea10) but never tagged it, so nothing was published, and its design branch (claude/sleepy-maxwell-miy81p) needed that version.
    • Tagged and published: run 43486999837. The branch lockfile's integrity matches the registry's.
    • Merged into design main as ccc3a2c9dc, both commits on Mark's word: DataDotStrip, and the top nav's phone-width Menu.
    • Both pages render.
    • Other sessions' uncommitted entries in the atlas manifest were kept by a three-way merge.
Nov 13
  • Live Activity at 4 redraws a second (2026-11-13, review stop 3, call 12): the readings owed since review stop 3.
    • Taken on: the full release build of qnative d3de579, qnative main that day, with the firehose restyled (f19e679). The script was scripts/footprint/live-activity.sh, wrapped in caffeinate -d because the screensaver locks the Mac after 10 idle minutes. One reading was touched and retaken.
    • Readings: 7.85% and 11.1% of a core at 100 and 1,000 a second, from 27.9% and 33.9%; 8.90% at 10 a second; 0.003% once the page is left. Memory is 105–120 MB with the page open, 73.5 MB at rest. There are 12 threads at rest and 14 with the page open.
    • What a redraw costs: at least 18–22 ms of main thread, against about 10 ms on Phase 3's page. The page drawn has changed since.
    • The record: the qnative branch c3/4hz-readings (3ffa9f4) holds review-3, Guide 07, the README and c3's record, and the CYCLES line now counts fourteen calls; it goes in as a PR on Mark's word. The footprint page draws the readings as a third group under the stream and as two rows at rest, and the readings owed lose that line.
Nov 12
  • the footprint page (2026-11-12): every strobe reading of the native app, from the c1 spike through Phase 0's four states, Phase 3 under a stream, c4 and c5, drawn on one page for the team and for the Rust expert's review of the gate (ruling 1): Native App Footprint. Sources: qnative's README § Footprint and the write-ups it points to. In order:
    • The gate: the lean build saves 1,072,560 bytes (4.4%); at rest, the quiet readings of every state with no Dev page shown are 60.3–63.0 MB, inside the launch-to-launch spread; showing Components costs about 3.5–4 MB. Both readings per state are drawn. Review stop 0's verdict beside it, and developer mode on disk since: 4.54 MB at review stop 3.
    • Over time: the binary by build and memory at rest by session, c1 to c5, against the 80 MB window target (c131 D22).
    • c2's page walk: 62 → 116 MB, then 125, 127, 125, 129, a cache filling once; c5's after-walk readings beside it.
    • At rest: CPU on the scale of one core and wakes from zero. c4's and c5's readings are drawn apart, as read on a Mac in use, and Status at rest is marked open: an idle reading is owed.
    • Under a stream (Phase 3): 33.9% of a core at 1,000 a second as first built, nearly all of it drawing; the stream core alone 7.05%; 0.003% on leaving the page. The readings at 4 redraws a second were added on 2026-11-13, below.
    • Method and caveats: the working targets, the readings owed, the records' marks, the discarded readings, and every value in a table with its recording.
    • Built from the layer (DataMachine, DataSegmentBar, DataRankedBars, UxPercentBar) plus one local piece, FootprintDotStrip, that keeps every reading visible on a shared axis (moved into the layer as DataDotStrip on 2026-11-13, below). The readings are in app/data/footprint-c138.ts; captures c138-footprint* (thread footprint, program scripts/shot-programs/c138-footprint.json).
Nov 12
  • the Monitor's shapes reconciled (2026-11-12, c143): the Guide had asked for richer copies of three of c131 D17's shapes, plus health and the loaded targets beside shapes D17 already has. Now one ask per route: the Monitor's fields ride on /api/sensor (the pid, a row per process with 1 Hz samples, health and the last error, the log's target and sequence) and /api/config (targets, behaviors, includes), all optional, in the bridge's types.ts and qnative's bridge.rs; its own routes drop from four to two (/api/monitor/workers, /api/monitor/processes). V1's Sensor page and the bridge files are unchanged. Recorded in qnative c3's Key Changes and Guide pages 3 and 4.
Nov 12
  • Live Activity against main (2026-11-12, planned): Mark asked for a more faithful copy of the live qcontrol app's viewer (his screenshot: the Audit log tab). The native page's parity vectors came from the feat/new-pages checkout, which branched before main added the Audit log (#757) and Sentinel (#772, #787, #835), so the native page has no Audit log and drops Sentinel's fields. The plan re-anchors the vectors on main, ports the audit projection with a buffer of its own, builds the tab, and brings the shared regions back to main's layout while keeping the seven improvements. Seven calls are open before Phase 3. live-parity-plan.md, with the prompt. Nothing is built.
Nov 12
  • The Fable /live gets main's Audit log (2026-11-12, qcontrol d274b9306, pushed 2026-11-13 to feat/new-pages, so PR #713 carries it): the same gap closed in qdash's Fable app on feat/new-pages, so PR #713 does not drop it on merge. Main's #757 is carried as a unit: the audit projection, the second buffer with its own budget and storage key, the data plugin preview, the third tab, the audit columns, categories-only filters, the tab-switch reset, follow-on-select, and the narrow-width detail overlay. It is fitted into the Fable split files, so the rows arrive display-ready (R8). Before and after captures and the Sentinel fixture are in fable-audit/. Results: 658/658 specs and npm run check clean.
Nov 11
  • stage 1 (2026-11-11): created from Mark's three messages. The plan was written from two code surveys (qdash's Live Activity page and its backend; Kamal's monitor TUI on qcontrol main) and qnative's measured budget, first as a thread of c131.
Nov 11
  • the walk (2026-11-11): nine calls ruled by Mark, recorded in plan.md § Rulings: switch plus lean build, for a Rust expert's review; build both Live and a curated Events page; the plane is not a data choice, attach takes this machine or an address; Endpoint config is a starter fetched once; the TUI homage is console only; Sensor and Config are two Dev pages; a private repository for Kamal; allowed versus on; its own design cycle.
Nov 11
  • kick-off (2026-11-11): this record, the sketch and the story; the plan aligned with c131 D15–D17, ruled the same day in another session (worlds and the drill, the settings switch, endpoint shapes as typed qdash routes); ../qnative c3 opened with the Guide v0, seven pages as proposals. No code yet. c2's Tour stretch committed the same day (qnative 9d37433), so Phase 0 is clear to start.
Nov 11
  • research filed (2026-11-11): the two code surveys behind the plan kept as research/live-viewer.md and research/monitor-tui.md, with an index: the full inventories, contracts and file references the Live, Events and Monitor phases start from. Each is a reading at one commit (qcontrol main 9e6cd55a0; the UI on feat/new-pages 28182424c).
Nov 11
  • records brought in line (2026-11-11): c131's D6 and R2 and c130's D6 and D7 carry the amendments from rulings 2 and 3; c138 is listed among c130's children (its plan, its record, CYCLES.md) and in CLAUDE.md; c134's kamal-prep.md has a dated note that the Guide answers the second half of its question 6 and is the thing to send ahead of the call. Left as it was: the c130 program map sketch, which still shows eight cycles.
Nov 11
  • Phase 0, measure and seam (2026-11-11), at review stop 0: built in ../qnative c3, commit 2f66b4b (local; no remote). Write-up: ../qnative/cycles/c3.developer-mode/review-0.md.
    • Developer mode moved out of the app into crates/devmode, an extension the app does not know about. It is carried only with --features dev, through one cfg in main.rs, and the default build is lean.
    • Allowed versus on: the toggle is in the tray menu and remembered in a settings file.
    • Read on an idle Mac: lean 23.2 MB against full 24.3 MB. At rest, 60–63 MB in every state with no Dev page shown, at 0.002–0.006% of a core. The Components page shown reads 65 MB.
    • The burden test passes on all four lines (CI not yet run), so B holds as ruled.
    • Ten open calls wait for Mark, the toggle's seat among them, plus eight questions for the Rust expert.
Nov 11
  • 2026-11-11, night: Mark: move through the blockers; Phases 1, 2 and 3 run in sequence without waiting at the review stops, the calls collected at the end of Phase 3; the data shapes modelled from qcontrol's Live page and its backend as the contract, guesses marked, the asks of the sensor recorded rather than waited on. The page is named Live Activity, and its document (the Guide's page 03) covers the connection methods, the data modelling, the pipeline, the states and the asks end to end. Review stop 0's ten calls taken by their recommended defaults until overturned. Sent to the qnative c3 session.
Nov 11
  • Review stop 0 closed (2026-11-11): calls 1–4 as Mark walked them, 5–10 by their recommended answers per the night ruling, recorded in review-0.md § Rulings. A cargo dev alias; the idle-Mac rule is in the README recipe. Five captures published as thread p0-seam (lean, turned off, Dev Tools, Components, off-redirect). Phases 1–3 run in ../qnative-c3 on branch c3/phases, beside c4 and c5 in the main checkout.
Nov 11
  • 2026-11-11, night, the repository: ruling 7's open item closed: on Mark's word the program session created the private repository qpoint-io/qnative (the name provisional, renamed when c0 rules; GitHub redirects) and pushed main. Kamal's access is an invitation away; the c1 spike's three-OS CI workflow runs on push from here. Pushes are fast-forward only, by the session that committed, never forced.
Nov 11
  • Phase 1, the stream core (2026-11-11): built in qnative c3 (2c01ebf, on main). It has six parts:
    • subscribe on the nozzle: SSE straight to /api/events/stream, the web's reconnect schedule, 403 and 503 as honest Refused states, and a dropped page closing its socket within 250 ms.
    • The scenario model: world, condition and stream.
    • The envelope and the four Monitor shapes as TypeScript beside the Guide, generated into Rust. Each field is marked read from qcontrol code or proposed.
    • Four seeded stream scripts written to qevents' payloads as read from code.
    • A new stream crate whose ingest agrees with qdash's own TypeScript on all 615 cross-language vectors.
    • Guide page 3 rewritten as the Live Activity document: connection methods, the ladder, the data (read or guessed), the pipeline, the states, and six asks of the sensor.

    The Dev page that switches the source will be named Source, since c5's V1 Sensor page now sits under This machine. That goes to the calls at review-3.
Nov 11
  • Phase 2, Source (2026-11-11): built in qnative c3 (6a8999e, on main).
    • Dev › Source offers synthetic data (a world, six conditions drawn through the real pipes, four streams at their rate or 10, 100 or 1,000 a second) or a real sensor on this machine or at an address. A choice applies at once and is saved; a flag or the environment wins at the next start.
    • The ladder has six rungs, tested against fake sensors.
    • The doctor, app --check-sensor, run for real: it found this Mac's stale lock, and it got the seed qdash serve refused with qdash's own 503.
    • The macOS data dir is fixed.
    • The Rust expert's question 2 is answered with a host crate: the data handle, reopen and the saved values, shared by the app and developer mode.
    • Six captures published as thread p2-source.
Nov 11
  • Phase 3, Live Activity (2026-11-11): built in qnative c3 (9d265fb, on main at 5337c28, rebased onto c4's and c5's work).
    • Dev › Live Activity is qdash's /live on the sensor's current envelope, with the seven improvements: a real pause, honest states, a bounded buffer, a tally that works on today's stream, filters with search over the whole record, keys, and masking before anything is shown or copied.
    • The ports held to qdash by test: five of qdash's lib/live modules are ported to Rust (previews, presence, the tally, entity-meta and the projections). Each agrees with qdash's own TypeScript on cross-language vectors that regenerate byte-identical.
    • The readings under a stream, with the Mac idle and unlocked:
      • As first built, the page cost 28–34% of a core at 100 and 1,000 events a second, nearly all of it main-thread drawing at about 10 ms per redraw.
      • Leaving the page returns the app to rest: 0.003%, and its threads back to 6.
      • The stream core alone costs 0.6–7% of a core.
      • The page now redraws at most 4 times a second, the monitor TUI's cadence; its readings were taken on 2026-11-13, below. The recipe is now a script, scripts/footprint/.
    • CI: Linux and Windows had failed on the stories crate. c5's cloud session fixed the cause in the crate's manifest (3725719; run 17 green on all three systems). It came into c3 by merge. c5 pushed main on Mark's word (4ccf511), and the program session pushed c6's merge (8242467). Phase 3's first CI run failed on Windows in the projections vectors, where the corpus was read as CRLF. That is fixed in qnative 948a9b5, which was pushed and is confirmed green on Windows (run 43142674204).
    • Seven captures published as thread p3-live.
Nov 11
  • Review stop 3 (2026-11-11): ../qnative/cycles/c3.developer-mode/review-3.md collects fourteen calls for Mark (the fourteenth, the lean check after c6's merge, ruled (b) as ruling 10, built by c6 as qpoint-io/qnative#2, reviewed by c3, merged by Mark as 2c435e4, CI green on all three systems). They include the push (c4's push of main carried Phases 1 and 2 to qpoint-io/qnative; this session's commits are local), names, retention, masking, the doctor in the lean build, the 4.54 MB on disk, the redraw rate and its owed readings, and what comes next (Phase 4 needs a brief and a mock).

c137 App Messaging, Overseer and Citizen

Nov 13
  • inbox rename thread (2026-11-13): after the Qpoint Product session f8d58bc9 (2026-11-12: Rob, "another thing to check", the "no changes for end users" promise; Mark, "I don't think it should really be an inbox"; the adopted "how noisy do you want me to be"), Mark asked to rename the section and reword it so a correction never feels like prison (inbox-rename-prompt.md). inbox-rename-plan.md proposes Safety: one noise control (Quietly by default · When it matters · Teach me), two sources in three groups mapped to the finding's outcome (Stopped in time · Noticed · From HQ), the words to retire (censure, enforcement notice, overseer and citizen), voice-checked help text, the audit log's softer stance for prevented moments, and seven calls for Mark, three of them for Mark Peterson. Nothing built. The same day Mark ruled call 1: the section is Safety & Security.
Nov 13
  • reframe and close (2026-11-13, later): Mark: "there is already the notion of findings, should we start by replicating that as a way to note and communicate violations to policy?", a question about the cycle's purpose. Design's phase-4 Findings (c114 → c121 → c133, lab only) already models the prompt's two sources: the outcome Enforced or Observed is before and after, and the Qplane's remediation is events on the finding (plan §10). Mark: findings bubble up to a company plane when connected, trainings bubble down, "so they speak a common tongue". His four answers: close c137 into a new cycle; prevented is softest (revisits c121 D3); all findings bubble up, prevented ones softer; Findings replaces qnative c4's inbox and keeps its plumbing. c147 opened at Stage 1 with his words; c137 closed into it.
Nov 11
  • 2026-11-11: the first native tour ruled in c131 (D15; synthetic data §Rulings): switch to priya's world, simulate a bad event, watch the local enforcement notice and tune the controls; it is this cycle's Phase 3 slice seen from the person's chair. Plan: a paragraph under Phase 3 and clarifying question 5 (which arc event the drill injects).
Nov 11
  • 2026-11-11, later: the drill ruled: all three arc events (an egress notice, a sensitive-file notice, the incident's), as one tour or three (question 5 answered); the IT-contact half stays with question 1.
Nov 11
  • 2026-11-11, evening: the ten questions of ports.md §5 walked with Mark and answered there (§Answered); the plan gains D9–D13: three delivery modes per kind (quiet · normal · priority, each an OS interruption level, priority only for required), alert permission asked at Connect, open required and new lifted above seen, the voice lint's strictness a plane setting, a toast after an action, and the six V1 answers (no floor, required without the entitlement, no acknowledge from the notification, one sender label, Admin › Messages, one-way Contact IT in local mode). The lab mock follows in Phase 3. Review stop cleared; Phase 3 waits for c131 Phase 1 in qnative.
Nov 11
  • Phase 3 kicked off (2026-11-11, evening): Mark ruled the V1 slice starts now as qnative cycle c4 in a fresh session (the schema in types, the SQLite inbox, the OS plumbing with the three modes, the tray count, the identity confirmation flowing, a story per state), since c2 had built what c131 Phase 1 planned. The violation tour (c131 D15) follows it.
Nov 11
  • Phase 3 (2026-11-11): started as qnative c4 (../qnative/cycles/c4.messaging/, review stop 1 in its review-1.md). Built in five steps on the pipes c2 made: the bones as types::messages written from bones.md with the ten examples as a fixture and a drift test that reads this file; the SQLite inbox beside the app's settings (D1) with §5's transitions, expiry, the required count and a delivery record per message; the inbox page with the lift (D10), the card with "why am I seeing this", Acknowledge and the toast through the Root's host (D12), the honesty line; the tray's count and one line; the OS notification behind one trait with the macOS port (UNUserNotificationCenter, the interruption level per post from the mode, D9; the time-sensitive entitlement read from the signature, so priority is honest only on a signed build), Windows and Linux saying "not available here"; the Messages settings page (four positions per kind, the tray switch, quiet hours in front of Focus, mutes, the required override and its count, what the build can post, what the app records); messages as a resource of the nozzle (D2: /api/messages, answered by the synthetic world and the fixture plane from the ten) with the inbox syncing from it; the identity confirmation composed and delivered on a plane connect (the V1 flow) and the local enforcement notice delivered by a drill in synthetic worlds. Thirteen captures in the qnative atlas (thread c4-messaging). Findings for the bones: required_reason (§6 needs it, §1 lacks it), Reply (E6 names it, §4 has no kind), the ten speak of Acme and MBP-2291 while the worlds are Meridian's; and the five delivery words of D9 against the inventory's four, for Mark.
Nov 10
  • sketch and story (2026-11-10): the channel drawn as Overseer, ports, citizen in the design system (the three columns, the four ports, what flows first, the bones, the citizen's controls; captured as c137-sketch-channel.png for the Why and the story's hero), the story module app/data/stories/c137.ts (nine decisions, five outcomes, four shots; pickup: Mark's review of the ten questions, then Phase 3 with c131), and ## The shape above. Nothing in ../qnative.
Nov 9
  • stage 1 (2026-11-09): created from Mark's ruling on c130 D9 during the decisions walk: "ports and bones" in V1, the design as its own cycle, exquisite control for the user. initial-prompt.md quotes his words; plan.md proposes the parties, ports, bones, the type inventory, the citizen's controls, seven rules and eight defaults. CYCLE.md written before kick-off at Mark's request (c130 clarifying question 6).
Nov 9
  • kick-off (2026-11-09): Mark confirmed D1–D8 and started the cycle: Phases 0–2 in their own session (inventory.md, bones.md with ten example messages, ports.md and the lab mocks), review stop after. The types entry for ../qnative waits for c131 Phase 1; the spike owns that repo meanwhile. Committed the same day.
Nov 9
  • Phase 0 (2026-11-09): inventory.md: 24 rows considered, 16 kept (15 distinct types; enforcement-notice from the plane and from qcontrol locally), 8 dropped by the five questions (config-change, the mechanic-access notice to the citizen, the observe-mode nudge, endpoint-connected, reminder, digest, welcome, app-update; three of them survive as rules or port behaviours). Each row carries its source (1b21a3ce, Mark's prompt, c133, c136, c131 Connect, the plan), the default delivery (off · inbox · tray · notify) and whether required may apply (enforcement and censure by default, hq-notice only when the plane allows it; always counted). V1 set: identity-confirmation flows; enforcement notices and contact-it if Tyler rules them in at G2. Four questions raised, with defaults (local mode's IT contact from qcontrol's config; approval planes; the sensor-state threshold; whether the overseer sees seen).
Nov 9
  • Phase 1 (2026-11-09): bones.md: the schema as a specification in the wire shape (fields and types; severities info · attention · required; states new · seen · acknowledged · done · expired with their transitions, terminal states and expires_at defaults; the required rule as the one override, counted per recipient per month with a soft ceiling of three and a reason line above it; the sender label as a plane-set string, default "HQ"; threads, mute keys, the send side for c134; what the plane records under R6). Ten example messages, one per important type, each body in the brand's three sentences, plus two for the operator's inbox; all twelve checked with the brand MCP's check-brand-voice tool, zero violations. No Rust and nothing in ../qnative: the types entry lands with c131 Phase 1.
Nov 9
  • Phase 2 (2026-11-09): ports.md: the four ports (inbox, tray, OS notification, web app; email and Slack out of V1) with the inbox's honesty line, the tray's count and one line, the OS notification per platform and what c131's spike must confirm (required as the OS's break-through level only where the entitlement exists); the citizen's controls (per kind off · inbox · tray · notify with the inventory's defaults, quiet hours in front of the OS's Focus, mutes for a day, the single required override with its monthly count and the plane's soft ceiling, "why am I seeing this" on every card, nothing hidden); the operator's send side for c134 (the inbox with states per recipient and Recall, Send with the three-sentence fields, the required count, the preview and the voice lint; three plane settings; the audit events). Mocked in the phase-4 lab: /pages/phase4/messaging-bones (the one message component over the ten examples and the two operator-side ones across the five states, with the OS notification and the tray line each becomes), /pages/phase4/messaging-inbox (the person's inbox and settings as a web rendering standing in for the native app until c132, the tray and the newest notification beside it, connected and local worlds), /pages/phase4/mock/messages (the operator's side in the lab's qdash shell, not on the rail). One visit state (useMessagingMock): a message sent from the operator's page lands in the person's inbox. Layer components first (UxPageTitle, UxTabGroup, UxFilterGroup, UxPill, UxToggle, UxButton, UxPopover, UxSelect, DataTable); the card, the notification and the tray line are design-local (app/components/messaging/). Registered in page-registry.ts (collapse c137-messaging) and on the phase-4 index. Verified on :3000 with curl and in the browser (no console errors; acknowledge, settings, send and the lint exercised); captured to public/cycles/design/c137-*.png. Ten questions for Mark in ports.md §5. Review stop.

c133 Remediation Training

Nov 13
  • The four trainings c144's wave 1 wanted (2026-11-13): written in the c142 session at Mark's word ("Yes, write them"). See review-9-wave1.md.
    • The trainings:
      • Approved model providers (T-PROVIDERS-1) for S5, on F-F and TH-S5-b2-1.
      • Skills that update themselves (T-PROVENANCE-1) for S3 and S2.
      • Ask before an agent sends or publishes (T-APPROVAL-1) for S4, S1 and S3.
      • Unattended agents and their spend (T-SPEND-1) for S6.
    • The world: no addition. P-PROVENANCE and P-SPEND are Off in the base world, and P-TOOL-APPROVAL has no finding there, so three of the four are met in the simulation.
    • The slots: four policies join POLICY_SLOTS, and the configuration-only slots become POLICY_CONFIG_SLOTS, read by the library.
    • The scenes: eleven new ones, and the catalogue holds 35.
    • Checked:
      • Voice: zero violations.
      • 13 filled readings with nothing unfilled.
      • Each training taken end to end, and all four read in full from the library.
    • Fixed on the way:
      • ownerOf skips theatre's Theatre actor, so a training in the simulation names IT.
      • The preview page's two template-only imports are bound in its script.
    • The record: fifteen captures (scripts/shot-programs/c133-wave1.json) and four calls in the review note.
Nov 13
  • Review 8 and review 9 ruled (2026-11-13): Mark walked the nine calls one at a time in the c142 session. They are recorded as D57–D63 (plan.md), and both notes carry a Ruled section.
    • D57: F-H stays.
    • D58: slots keyed by policy are the pattern.
    • D59: the injection training's approval stays general.
    • D60: a seed finding where the policy is on and has none.
    • D61: the approval training's title.
    • D62: advice stays general for now.
    • D63: each training is bundled in the native app with the scenario that opens it.

    Review 8's calls 4 and 5 were closed as already done: T-INJECT-1 is bundled with the native S1, and a link that carries the simulation opens its finding.
    • D60 built the same day: F-I, Hana's Claude Code merging pull request #517 through GitHub MCP with approval set to never, Observed, and its session S-8, in governance-fixture.ts and marked c133.
      • The findings list holds 25.
      • theatre-check 190/0, tours-walk 455/0, c123 metrics 49.
      • The approval training was taken end to end on F-I.
      • Two captures (scripts/shot-programs/c133-approval-seed.json).
Nov 13
  • re-homed by c147 (2026-11-13): c137 App Messaging closed into design c147 (Findings, a Common Tongue), so the assignment no longer travels as a c137 training-assignment message: it is a training-assigned event on the finding (from: plane), and completion stays the training-completed event. event-shape.md §1 steps 1 and 3 and §2's message_id read against c147 finding-shape.md §9; message_id becomes assignment_event_id. Nothing else changes here; for the native V1 the training ships as the event and the record only (c147 Q5).
Nov 13
  • D9 revised by c147 (2026-11-13): Mark ruled at c147 review stop 3 (6a) that a finished training closes its finding when a policy assigned it: the person's training-completed record still moves nothing, and the policy then resolves the finding ("Resolved: training completed", a resolve from the plane with origin system); HQ can reopen it. Trainings an operator or HQ assigned keep D9 as it stands. The lab's model (foldFinding) doesn't close on completion yet; it's in c147 qnative-brief.md and waits on this cycle's lab for the prototype.
Nov 12
  • Instructions hidden in content (2026-11-12, night, for c144 S1): T-INJECT-1, written in the c142 session at Mark's word ("Write S1's") for c144's first doomsday scenario. See review-8-inject.md.
    • The world: one seed finding, F-H (Jordan's Claude Code read a hidden comment in a GitHub issue through GitHub MCP; P-PROMPT-INSPECT, Observed), and its session S-7, marked c133. c144's theatre check, the tours walk and the metrics check still pass.
    • The training: four steps, four questions and a Library section; slots keyed by policy (POLICY_SLOTS) because the finding names an MCP server as P-MCP's do; three new scenes. Voice: zero violations. Taken end to end and from the library.
    • The record: twelve captures under the thread "Instructions hidden in content (T-INJECT-1)…" (scripts/shot-programs/c133-inject.json), and five calls in the review note.
Nov 12
  • Into the native app, and a demo's polish (2026-11-12, evening, from the c143 session on Mark's word):
    • The trainings page (/pages/phase4/trainings): each training's title opens its prototype, and each training's section gains "Open the prototype" (the mock on its policy's first finding; a topic's library reading) and "On its own, from the library" (8e23a69852).
    • The quiz wording: Mark found some questions hard to follow. All sixteen, and the MCP library's Observe question, were reworded: the situation first, then one question; Observe and Enforce named as modes; parallel answer options. Ids, steps, slots and right answers unchanged; the voice check passes on all four (6b240395ff).
    • The native app (qnative c9 Trainings, answering D5): the four published trainings are bundled from /api/trainings and filled with the lab's values, three training assignments join E7 in the inbox, and Start training opens the training built to the lab mock: the five stops, the lesson with its scene, the check on one sheet, the result with the record, the retake, Recorded. The scenes are this lab's own, captured per step in light and dark by scripts/export-training-scenes.mjs (519f9d3dd0, 614371359b). Owed there: the motion and native drawings of the scenes.
Nov 12
  • Phase 7 review (2026-11-12): Mark took review-7.md's five defaults ("I've read and agree with your defaults, go with those"), recorded as D52–D56:
    • topic ids are named for what they cover (T-MODES-1);
    • a topic may cover several concepts where one doesn't stand alone;
    • "a record, not a verdict" stays;
    • the claim that some policies only record stays, to check with Tyler;
    • the operator's send of a topic is c134's.

    No code changed. handoff.md § 7 gained the Tyler check.
Nov 12
  • Phase 6 review and Phase 7 (2026-11-12): Mark walked review-6.md's five calls in the c142 session and ruled them as D45–D51.
    • D45–D48: as proposed: the # Library section, v1 kept, the Compliance section only, the world's clock.
    • D49–D51: a training answers a policy or a topic; the seed topics are all 18 of the guide's concepts; the library, an operator and later the guide offer them.
    • Phase 7 built:
      • the model and parser for a topic (policyId optional beside topic, exactly one);
      • Observe and Enforce (T-MODES-1, en/observe-and-enforce.md, 2 minutes), voice-checked with zero violations, with four new scenes (policy-modes, mode-observe, mode-enforce, mode-ask);
      • the library, the record card, the preview page and its gallery, which now has 16 scenes;
      • the Compliance count, and the docs (authoring.md, publish.md, handoff.md § 7, the /training skill).
    • The record: five captures under the thread "Phase 7 · …" (scripts/shot-programs/c133-p7.json), and five calls in review-7.md.
Nov 12
  • Phase 6 (2026-11-12): built in the c142 session the same day Mark ruled D38–D44, at his word ("Do this task here"). See review-6.md.
    • D38: an optional # Library section in each file, entries in the grammar of the step or question they replace, by id (parse.ts, types.ts library, library.ts, voice.ts). Library words were written for the three pilots and voice-checked, zero violations. All three now read 4 of 4 steps and 4 of 4 questions on their own (Phase 5: 3/3, 3/3 and 2/3), and every content hash moved, still v1.
    • D39: the self-taken record on the person's finding: a line on the training strip, with the assignment left open. The lab knob ?took= seeds one.
    • D42: "Trainings taken on their own" in the Compliance report beside Enforcement Posture: counts only, read as a strength, not in Corrections.
    • The docs: authoring.md, publish.md, handoff.md and the /training skill updated.
    • The record: five captures under the thread "Phase 6 · …" (scripts/shot-programs/c133-p6.json), and five calls in review-6.md, including the topic-trainings proposal (clarifying question 6).
Nov 12
  • Phase 5 review (2026-11-12): Mark walked review-5.md's seven calls in the c142 session and ruled them as D38–D44 (plan.md; review-5.md § Ruled). Two calls went against the proposal:
    • call 1: each file gets its own words for the library (D38), changing the parser, the format, the skill and the hash;
    • call 5: self-taken completions count in Posture as a strength (D42). The other five went as proposed. On call 3 Mark added that a high self-taken count shows a strong posture, and that we can offer trainings on areas that confuse people, categorized as self. That's clarifying question 6, trainings on a topic rather than a finding. Phase 6 builds D38, D39 and D42 once kicked off.
Nov 12
  • the brief, found merged (2026-11-12): asked on c142's second c133 tour how much is ready to merge, the tour checked market-analyst. Phase 0's brief merged on 2026-11-11 at 19:49Z as briefs/enforcement-without-local-context.md (qpoint-io/market-analysis#15). handoff.md, the story's pickup and its "brief" change still said in flight; all three are corrected. The cycle now waits on Mark's seven Phase 5 calls, Tyler's D22–D27, c134's frame and copy step, c121's policy fields and Peterson.
Nov 12
  • scene gallery, from c142's first cycle tour (2026-11-12): Mark asked where the illustrations come from, and no page showed them together. The Scenes section of /pages/phase4/trainings is now a gallery instead of a table. All twelve scenes are drawn there, each on the first finding of a training that uses it, with that step's caption as the person reads it and a link to the step in the mock (?findingId=…&at=lesson&step=n). The gallery showed sanctioned-list overflowing its figure by 156 px: its three columns switched on at the viewport's md breakpoint, not the figure's width. The same overflow hit the lesson itself at viewports from 768 px to about 1,100 px, and at 1440 by about 55 px. It now wraps by the figure's width: the list, then "reviewed" with the server. Checked at 1440 and 375: twelve drawn, none overflowing, no console errors. Recorded in c142. The same day Mark named Rob Genova's blog drawings as the inspiration for the scenes (see Lineage). They're credited in authoring.md § Scenes, under the gallery's heading, and in the story.
Nov 12
  • Phase 5 (2026-11-12): the hand-off and the library, by an execution session, in three commits. First, Phase 4's two small things: Corrections in Reports read "0 in this window" for a record written at the cutoff, because the lab's two clocks differ (the reports' data ends on 29 October, the lab writes the record at the world's clock, 1 November); a window that runs to the reports' last day of data now runs to the cutoff (app/data/trainings/reports.ts), and the section's source line names training.completed.* (D27). Second, D34: T-MCP-1's choices reordered so the right one sits third, first, second, third, no word changed, so v1 stays and the content hash moves to ed4d2679c3cd… (D31); voice check zero violations; two captures under the thread "Phase 5 · T-MCP-1's choices reordered" (scripts/shot-programs/c133-p5-reorder.json, new file names, Phase 1's kept). Third, the hand-off: handoff.md, for c134 (the training page from the lab mock, the JSON copied in at release per D29, the record as audit rows per event-shape.md §8, the history row and the Corrections block per D16, D19, D20, Corrections in Reports per D17, D18, who may read what per D10, the library) and for c131 and qnative c4 (the training-assignment card with start-training, the web app opened signed in through the plane connection, training.completed.* ending the message, a table of whose is what; c4 already has the types, and its Start training answers "not on this build yet"). The library, D2's "a library for the person later": /pages/phase4/mock/training-library in the lab's qdash shell lists the three trainings from the collection with their minutes, policy, what each covers and the person's record (Assigned with Start to the training on their finding, Recorded with Take it again, No record with Take it on your own). A training taken on its own is filled from the reader and the policy, never from a finding (app/data/trainings/library.ts; slots.ts refactored to share the policy-level helpers, the 21 pages it touches rendering identically before and after); the steps and questions that tell a finding are left out and said so (3 of 4 steps for MCP and accounts, 2 of 4 for secrets); the record is the same record with no finding and no assigner, one audit row training.completed.self (types.ts, RecordCard.vue, Progress.vue and AuditLog.vue learned it). Taken end to end in the browser pane (a wrong answer, the retake keeping two, the pass, Finish, the list reading Recorded on your own); no console errors; every new sentence through check-brand-voice, zero violations. Registered under c133-training, on the phase-4 index. Five captures under the thread "Phase 5 · the training library" (scripts/shot-programs/c133-p5-library.json). The review stop: review-5.md, seven calls (library words; the self-taken record and D24; the event's name; what the record names; self-taken completions in Reports; the contact line on its own; the examples the library reads).
Nov 12
  • Phases 3–4 review (2026-11-12): Mark walked the ten calls of review-3.md, review-4-accounts.md and review-4-secrets.md with the design session and took all ten as proposed (D28–D37): the right answers stay in the published data; the publish step's JSON goes into the plane at release; English with a line when a language has no file; the version moves on meaning; the operator's reason shown as written; the self-report kept and asked of Peterson; T-MCP-1's answers reordered in the file; F-G kept in the base world; the secrets lesson names the check that is off; rotation stays outside the record. An execution session takes the two small things Phase 4 found, D34's reorder, then Phase 5.
Nov 11
  • kick-off (2026-11-11): Mark ruled Phase 1 starts now. The gate's first half holds (c137's bones, 2026-11-09, and its D9–D13 ruled this day); the second, the brief, is in flight: Phase 0 runs as a cloud session in market-analyst against problem:enforcement-without-local-context and lands as a PR there. Phase 1 does not read the brief's text, so it did not wait.
Nov 11
  • Phase 1 (2026-11-11): the content model as data in app/data/trainings/types.ts: a training is a lesson (three to five steps, each with an illustration named as a scene), a check (three to five questions with one right choice, the step each verifies and why the right answer is right), a contact (R5) and the record completion writes (R4: training and version, finding, policy, person and endpoint, the final result, the time, who assigned it, the assignment it closes; not how long, not how many tries, not which answers); the pass rule all right with retake (D3) and the six stages. The first pilot (D6), unapproved-mcp-servers.ts, T-MCP-1, written for a real finding in the lab world: F-A, Vanta MCP from Claude Code on mac-a1 under Unsanctioned MCP server in use, Observed; four lesson steps (what happened on this machine, what an MCP server can do, why there is a sanctioned list, what to do instead), four questions on the idea; every sentence voice-checked with the brand MCP, zero violations. index.ts composes the training with the finding: the slots filled from the world (the date and time, the agent, the device, the team, the server, the session, qcontrol's evidence, the outcome, the policy's sanctioned list from its configuration, the exception that lets GRC use the server quoted as the operator wrote it, the policy's owner from the last change), the assignment built as c137's training-assignment in three sentences (D8), the grade, the record and its audit rows; D2's training field on the policy held as POLICY_TRAININGS until c121's model takes it. The mock, in the lab's qdash shell: /pages/phase4/mock/training, reached from S1's new training strip (the policy's assignment, Assigned or Recorded, the one path) or from the assignment card, through the lesson (the scenes drawn from the pawns and the sketch kit, one flow animated, still under reduced motion, D7), the check, the result with the record shown before Finish writes it, the retake that keeps what was right and names the step to reread, and the record: one row in the finding's history (training-completed, a new event kind that leaves the status alone, D9) and an audit log mock with message.sent, training.completed, message.done. ?at= opens any stage; a policy without a training says so and names the pilots. useTrainingMock keeps the visit's progress; the strip shows only what the plane would know (R4). Registered under the collapse c133-training and a Trainings section on the phase-4 index. Nine captures under the thread "Phase 1 · the content model and one training" (scripts/shot-programs/c133-training.json, subjects per state). The review stop: review-1.md, with the calls on the record's HR and legal sensitivity (question 2), languages (question 3), what the training needs from the finding's data, and five smaller ones.
Nov 11
  • Phase 1 review (2026-11-11, evening): Mark walked review-1.md at the c130 G1 session and ruled the seven calls that were his: D10 the record's audience (the name on the finding and in the audit log, counts only in Reports; the personnel-data question goes to Peterson first), D11 languages (English for the pilots, lang per file with Phase 3, operator text never translated), D12 the exception's reason shown as written, D13 nothing learned between assignment and record (confirmed as the product), D14 the Finish step kept, D15 the retake keeps what was right, D16 the history row now and a Corrections block once Tyler agrees the event shape. Call 8, the person's frame, is c134's. shape.md accepted at the same session: c133 formally open. Recorded in plan.md (D10–D16, questions 2 and 3 closed) and the story module.
Nov 11
  • Phase 2 (2026-11-11, night): the record's homes, under D10 and D16. event-shape.md: training.completed in qevents' pattern (a tagged enum, type and payload), the fields the record keeps and the ones R4 forbids, the audit row beside c137's message.sent and message.done, the four projections (the history row today, the Corrections block once agreed, Reports' count, the operator's inbox), who may read it, and six questions for Tyler (where it lives, whose contract, assignments from message.sent or a training.assigned, idempotency, version or hash, operator and HQ assignment). Reports: c128's Findings report gains a Corrections section between Blocked and observed and Data protection, counts only as of the cutoff (assigned, completed, waiting, per training; app/data/trainings/reports.ts, TrainingReportCorrections), staged with its source named. The finding: a Corrections block (TrainingCorrections: the record as the audit log keeps it, the status unchanged, the three audit rows) behind the slot variant ?v.corrections=block; the default keeps the history row as the record's home (D16). Three captures under the thread "Phase 2 · the record" (scripts/shot-programs/c133-record.json). The review stop: review-2.md, with Tyler's six questions and four calls for Mark.
Nov 11
  • Phase 2 review (2026-11-11, night): Mark took the four calls as proposed: D17 Corrections as a state as of the cutoff, D18 assigned on detection in the count, D19 the block under History before Details, D20 the block as default once Tyler agrees the shape. D21: published trainings served by the design API (/api/trainings, /api/trainings/<id>), the content collection the source. Phases 3 and 4 handed to an execution session the same night; this session signs off at the review stop.
Nov 11
  • Tyler's questions, assumed (2026-11-11, night): Mark walked event-shape.md §6 and set assumptions to validate with Tyler, recorded as D22–D27 and in §8: the audit log as the store; the existing event pattern as the base with the plane's richer record object consuming the small event; assignment and completion both audit rows, a completion associated with the person's earlier findings under the policy to show and drive remediation; every completion a row, one grouped object (his sketch: type, completed, the training's id and name, proof of understanding); version and a content hash; separate completion events per assigner. The hash and the record's fields went to the execution session for the publish step.
Nov 11
  • Tyler walk page (2026-11-11): the record's event flow drawn as a second sketch, "The record: one event, three reads" at /cycles/design/sketches/c133-record (app/pages/cycles/design/sketches/c133-record.vue): the flow from the policy's detection to the person and the training page, the one small event in qevents' pattern (training.completed.policy, .operator, .hq, D27) consumed by the plane's record object (D23) and written as audit rows with the audit log as the store (D22, D25), the three reads (the finding's history row today and the Corrections block once agreed, Reports' counts, the operator's inbox), the association with the person's earlier findings under the policy (D24), the notes on what R4 keeps out and on version and hash (D26), and the orange note for what stays Tyler's. Registered in program-sketches.ts and the sketches shot program, to be captured as c133-sketch-record.png. The walk itself: tyler-walk.md, ten minutes, one paragraph per assumption D22–D27 with the one question each needs answered, then the four items that are Tyler's alone. The story module gains the outcome record-sketch.
Nov 11
  • Phase 3 (2026-11-11, night): the authoring pipeline (D4, D21), built by the execution session. The collection: one markdown file per training and language, content/trainings/<lang>/<slug>.md (D11), frontmatter for the training's fields and the body for its words (# Assignment with the message's first two sentences, # Lesson as ## steps with an id:/scene:/alt: block, # Check as ## questions with id:/step:/explain: and the choices as a task list); content.config.ts gains the trainings collection. One parser, app/data/trainings/parse.ts, for both readers: the lab reads the files at build time (index.ts, which now derives TRAININGS and POLICY_TRAININGS from them) and the API reads the collection's raw text; a file with problems is withheld from both. The first pilot moved into content/trainings/en/unapproved-mcp-servers.md with no word changed (the parsed object equals Phase 1's field for field; thirteen rendered mock pages compared identical); its assignment sentences moved out of code into the file. Slots moved to slots.ts, keyed by the finding's kind. Scenes stay components, one file each in components/training/scenes/, catalogued in data/trainings/scenes.ts (the decision and the asset convention in authoring.md §Scenes). The preview page /pages/phase4/trainings (registered under c133-training, on the phase-4 index's Trainings section): per training the policy, minutes, steps, questions, lang, version, hash, the brand voice rules run live on the file and on every finding of its policy (voice.ts, mirrored from the MCP), the slots, the scenes, links to open it on each finding. The publish step: server/api/trainings/index.get.ts and [id].get.ts (server/data/trainings.ts), shape in publish.md. Mark's D25–D27, ruled while it was built: the record names the training's title, version and content hash (one SHA-256 for the API and the lab, hash.ts), and the lab's audit log writes training.completed.policy. The record page's Reports line now links the Corrections section. The /training skill (.claude/skills/training/SKILL.md) carries the loop for a new training. Two captures under the thread "Phase 3 · the authoring pipeline" (scripts/shot-programs/c133-pipeline.json). The review note: review-3.md, with four calls (the right answers in the published data, how the apps reach the API behind Access, a language with no file, when the version moves) and an incident owned: the preview page's first draft broke every route on the shared dev server for about 25 minutes.
Nov 11
  • Phase 4, pilot 2 (2026-11-11, night): Personal accounts for work, T-ACCT-1, through the /training skill, for F-C (User A's Claude Code session on mac-a1 under usera@gmail.com, under Personal account is in use, Observed; Dana's exception Off for User A until 31 October ended and the finding reopened on 1 November). No world addition. app/data/trainings/en/personal-accounts-for-work.md: four steps (what happened, with the policy that can only record and the exception quoted as written, D12; where the work goes; how to tell which account a session uses; what to do instead), four questions with the right choices in different places. slots.ts gains the kind account (account, outcome read from the policy's enforceability, blocked, the person's own exception live or ended). Four scenes (account-session, account-boundary, account-check, account-switch), two redrawn in two rows after the first captures wrapped. Every sentence and scene label through check-brand-voice: zero violations. Taken end to end in the browser pane from F-C's strip (a wrong answer, the retake keeping three, the pass, Finish, the history row; the finding stays open, D9); no console errors on fresh loads. A correction to Phase 3 in the same commit: the training files moved from content/trainings/ to app/data/trainings/<lang>/, because Nuxt Content hides content/ from Vite's watcher and the lab never saw an edit; the collection reads the new folder through its cwd source. Eleven captures under the thread "Phase 4 · pilot 2, Personal accounts for work" (scripts/shot-programs/c133-p4-accounts.json). The review note: review-4-accounts.md, three calls (the operator's third-person reason shown to the person, the self-report in step 4, the right answer's position in T-MCP-1).
Nov 11
  • Phase 4, pilot 3 (2026-11-11, night): Secrets in prompts, T-SECRETS-1, through the /training skill. The lab world had no finding under Credentials must not be sent to a model, so governance-fixture.ts gained one, marked c133: F-G, an AWS access key (the policy's first detector) in a prompt from Priya's Cursor on mac-eng-07, from a pasted .env file, critical, Observed (the policy observes organisation-wide), with its session S-6; the governance pages (24 registry routes), the seven report kinds, the findings list (now 23) and the policy checked with no console errors. app/data/trainings/en/secrets-in-prompts.md: four steps (what happened; why a key in a prompt is a key disclosed; what to do about this key, revoke it today and tell IT; what to do instead, a reference not the secret, with the policy's detectors and the one that is off read from its configuration) and four questions. slots.ts gains the kind dataClass (the class with its article, the detectors, the check that is off, outcome-dependent advice). Four scenes (secret-prompt, secret-copies, secret-rotate, secret-reference); the catalogue holds twelve. Every sentence and scene label through check-brand-voice: zero violations. Taken end to end from F-G's strip, checked in dark mode. /api/trainings serves all three; the preview page lists them with nothing withheld; Corrections in Reports counts five findings across the three trainings. Thirteen captures under the thread "Phase 4 · pilot 3, Secrets in prompts" (scripts/shot-programs/c133-p4-secrets.json). The review note: review-4-secrets.md, three calls of its own (keep F-G in the base world, name the check that is off, rotation outside the record), two small things in Phase 2's lines left for later, and all ten open calls of Phases 3 and 4 collected. One knock-on outside c133: integrations-fixture.ts hardcodes 22 findings.
Nov 10
  • sketch and story (2026-11-10): the sketch "A training is four things" at /cycles/design/sketches/c133-training (app/pages/cycles/design/sketches/c133-training.vue: who assigns, the four parts as a strip, the assignment as a c137 message, the audit log as the record, D9, the three pilots), to be captured as c133-sketch-training.png for the hero; the story module app/data/stories/c133.ts (D1–D9 as decisions, the problem, the pickup); the image under Why and §The shape added here.
Nov 9
  • stage 1 (2026-11-09): prompt and plan written from c130's split. CYCLE.md written before kick-off at Mark's request (c130 clarifying question 6). The same day: the candidate problem promoted in market-analyst (problem:enforcement-without-local-context), the gate moved from "the shape's messaging section" to c137's bones, and Mark's note on hard-hat training and Metamythic recorded as a note only.
Nov 9
  • 2026-11-09, later: Mark confirmed the defaults and ruled D9: a training can in theory block access, by default it does not. Committed the same day.

c13 Safety & Security: Findings qnative

Nov 13
  • kick-off (2026-11-13, night): this record and initial-prompt.md from the c147 brief and the session's instructions. The spec measured from medium A first, into specs/ (safety, safety-finding, safety-settings; node scripts/spec-measure.mjs --base http://localhost:3000 --content '[data-native-canvas] > div' on pilot), so the port starts from data (c140 D11). Baseline before any change: cargo test --workspace 255 passed (app 25, fixtures 13, messages 11, nozzle 53, qguikit 13, stories 87, stream 41, types 12).
Nov 13
  • step 0, design (2026-11-13, design 224995f348): derive-world-findings.mts adds each policy's configuration as config to /api/policies (plane.configs[p.id], as governance-policy-config.ts holds it; null for the policies with nothing to configure); re-derived, the findings unchanged (Meridian 10, pilot 51 with 42 prevented, minimal 6, fresh none): the diff is the 57 policy items' new field and nothing else.
Nov 13
  • step 1, the types (2026-11-13): types::findings, written from finding-shape.md in the sidecars' wire shape: Finding (immutable; served with its events), FindingEvent with from (endpoint · person · plane) beside the lab's origin, the thirteen EventKinds with their writer and the status each moves to (EventKind::writer, moves_to: the person's move none), the six Resolutions, the payloads (Recurred, Note, TrainingAssigned, FollowUp, Prevented), the fold (status, resolution, prevented, recurred), Policy with why_plain and its PolicyConfig (list · detectors · level · threshold, camelCase as governance-policy-config.ts writes it), Mode, Noise, PlaneSettings. The routes POLICIES, FINDINGS, PLANE_SETTINGS in types::routes. The sidecars bundled as crates/fixtures/world/findings/<world>.json (fixtures::findings), brought by scripts/sync-findings.sh (design's sync-worlds.sh in reverse). Two drift tests: every_sidecar_reads_as_the_shape (every sidecar deserialises; every event written by the side its kind names and moving the status it says; every Enforced finding born prevented; the counts as review stop 2 left them) and the_types_match_finding_shape_md (§3's table row for row: kind, writer, the status it moves, the resolutions it carries; §4's list; the c114 row skipped as the table says), which reads ../design as c4's reads bones.md. A finding for the specification: §3's Moves-status cell for training-completed reads "no (c133 D9)", so the test reads the word before a parenthesis.
Nov 13
  • step 2, the nozzle (2026-11-13): Repo::policies(), findings() and plane_settings() over the three routes (nozzle::FINDINGS_ROUTES). Synthetic answers from the world's sidecar, in the seat c4's /api/messages fallback held (the fallback is gone; nozzle::messages_of with it), shifted with the world's clock like every other answer. Plane reads the plane's routes in the same shape; the fixture plane answers them from the sidecar (fixture_plane::serve), so --data plane against it shows the lab's record. Local answers from the app's own detector (step 3): the local configuration's policies (findings::local_policies(), none until c11's Config File carries some), so /api/findings is empty without reading the sensor, and /api/plane-settings is not served (no plane: Quietly). A list a source does not serve reads as none; any other failure stays a failure (R5). c4's messages_flow_through_the_pipes is rewritten as findings_flow_through_the_pipes (synthetic, the fixture plane over HTTP equal to it, fresh with none, the shifted clock moving every timestamp and no id, the IT contact still read from qcontrol's configuration); a_local_machine_has_no_policies_yet beside it. Repo::messages() stays until step 6 retires its last reader.
Nov 13
  • step 3, the detector in Rust (2026-11-13): nozzle::findings, a port of the lab's scenarios/detect.ts (every rule: MCP loads, skills, injected context, restricted files, model requests with their data classes and credentials, tool calls, egress under the TLS floor, spend and telemetry; each reading the policy's own configuration as governance-policy-config.ts holds it), the part of applicability() that gives one person's mode (person_mode: the policy's mode narrowed by the mode exceptions whose context covers the person, the narrowest winning, a tie to the stricter; A4, D9) with config_allows, and the fold of derive-world-findings.mts (Activity::of_world turns qdash's sessions, MCP servers and sessions in detail into the lab's sensor events; the fingerprint F- + SHA-1 of policy · resource · person · device · window, the day for prevented and while open for Observed; prevented in the same moment with the policy's act; one recurred with the count and the last time). The test reproduces every world's sidecar exactly: all 67 findings (Meridian 10, pilot 51, minimal 6) with the same ids, outcomes, subjects, evidence lines, endpoint events (ids, times, payloads, counts) and order; the plane's two events on pilot are the plane's and are left out of the comparison. Nothing had to be recorded as a difference. Three smaller tests: no policies, no findings (a standalone machine today); the person's mode by A4 and D9; the configuration letting through what it names (a global list entry, not one scoped to some harnesses), and the hash agreeing with the lab's createHash('sha1'). What stays out of the port, on purpose: advanced exceptions (an allow for one resource; no world's sidecar has one in force, every quiet list is empty) and the lab's naming bridges beyond the two the worlds need (mcp_name, the restricted-path categories). The SHA-1 is sha1_smol, already in the lock through uuid.
Nov 13
  • step 4, the person's events (2026-11-13): messages::person::PersonEvents, c4's SQLite store repurposed: a person_events table beside the inbox's, in a file of its own beside settings.json (safety.sqlite; a synthetic world's in memory, one scope per source as c4's). It keeps asked-it, asked-access, acknowledged, reported-mistake and training-completed, and refuses anything else: an event not the person's, or a kind that moves a status (they are notes; §3). Each is minted here (E- + a ULID, person::note), repeats the finding's status, carries the note (and for Ask IT the contact from qcontrol's configuration); a replay of the same id writes nothing; queued() gives what waits for the plane in the order written, mark_sent takes them off when a plane does (the plane's write API is c134's, so nothing sends yet). A second table, announced, remembers what has been announced, so a notification is posted once per thing. And messages::announce: the noise positions on c4's levels (step 6's rules as one pure function, decide), with would_announce for Settings' preview, which reads no notifications, 5 and 19 on Priya's machine for the 30 days to day 90, as medium A does on :3000 today (review stop 2's caption, before the allow-list widening, read 8 and 22). Five tests.
Nov 13
  • steps 5–6, the pages and c4's UI retired (2026-11-13, night): by /native-port, from the three specs in specs/. The rail: Safety & Security → Findings · Settings (Route::SAFETY) in the seat Messages held, drawn by the same RailSection as the rest (main already carries c7's restyle; whatever c7's open PR still changes must cover this section, and its rail test now counts it); the count beside Findings is the tray's. Findings (pages/findings.rs, /safety): the first-run card (the company's default for the team named when it isn't Quietly; Keep it, or Settings), From HQ first (a follow-up asking for an acknowledgement, a suggested training), Observed in five columns at the spec's measured widths with no SLA, Prevented as one card counting every stop with a line per thing and its days, Resolved; empty, a standalone machine with no policies, Loading and Failed each said. A finding (pages/finding.rs, /safety/finding?findingId=): the header line (severity, Open · Prevented · Resolved, the policy, the harness and when), Also under, What happened · Why your company's policy covers this (why_plain), HQ's words as written with Acknowledge, a suggested training, What you can do (Ask for access, Ask IT, the quiet "This was a mistake", each opening a three-row note; sent, a line says what happens next), What happened since in sentences with the person's lines marked, What's recorded; not found, Loading, Failed. Settings (pages/safety_settings.rs, /safety/settings): the three positions with the company's default and what each would have announced in the 30 days to the world's day 90 (Repo::now), the kinds under the chosen one, the tray. Every sentence is medium A's (safety::words ports personEvent, personStatus, nextStep, fromHq, alsoUnder, NOISE); the few states medium A has no words for got new ones, voice-checked with the brand MCP (productUI, no violations; review-1 call 2). The region ids are medium A's own (safety.*, safety-finding.*, safety-settings.*), in the app map as three pages in place of inbox and messages. QGUIkit gained ux::SeverityTag (the layer's SecuritySeverityTag; scorecard row) and ux::card. The channel app::safety takes app::messaging's seat: this source's findings, the person's notes (messages::person, safety.sqlite), the noise setting under safety in settings.json, c4's OS port; it announces what arrives at the person's position (messages::announce), takes a first read as known (no backlog), and tells the tray only what needs the person, an unacknowledged follow-up; a clicked notification opens its finding; QPOINT_SPIKE_DRILL announces the world's newest finding. c9's trainings kept (the coordinator's correction): a suggested training opens c9's lesson in the app when it is bundled (Start the training →; T-MCP-1 is), else says it isn't on this build; the training has its own route (Route::Training, /training, drawn by TrainingPage, the seat the inbox gave it), its back button returns to its finding (← Linear MCP), the simulation's tour still opens one (origin theatre), and finishing adds training-completed to the finding, a note (review-1 call 1: this departs from c147 Q5, open for Mark). Retired: app::messaging, pages/inbox.rs, pages/messages_settings.rs, the routes /messages and /messages/settings, the tray's Inbox item (now Findings), the identity confirmation on a plane launch and QPOINT_SPIKE_CONNECT (c147 §8: Status answers it), Repo::messages(), /api/messages in the nozzle and the fixture plane, and types::routes::MESSAGES. Kept as c4's record: types::messages with its fixture and its drift test against bones.md, the messages crate's inbox store and delivery rules (nothing in the app reads them; review-1 call 8). The footer says findings: derived on a world with a machine. New to Qpoint (the employee's first tour, c10/c12) had two stops on the inbox and its settings: its fourth stop is now Findings ("What did qcontrol notice or stop?", ringing Observed, medium A's subtitle as its lede) and its fifth Safety & Security's Settings (ringing the three positions; spots on the positions, the kinds and the tray), its stories renamed app-tour-new-findings and app-tour-new-settings-tray; the new lines voice-checked. The theatre's note to the guide says a training opens on its own page. CLAUDE.md's Messages section and the README's are rewritten for Findings; c4's record notes the retirement.
Nov 13
  • step 7, stories and tests (2026-11-13, night): c4's ten stories removed (app-inbox-empty, app-inbox, -card, -acknowledged, -expired, -withheld, -drill, -connected, app-messages-settings, -tuned) and app-rail-messages renamed app-rail-safety; 22 Safety & Security stories, each honouring QPOINT_WORLD so a capture runs it on every world (app-safety, -lower, -chosen, -loading, -failed, -local, -plane; app-safety-finding, -prevented, -hq, -since, -acknowledged, -asked, -training, -not-found, -loading, -failed; app-safety-settings, -teach, -loading, -failed; app-safety-training); a story's finding is picked from the world, never named by it (c132 D6). 18 region-text tests in the stories crate's c13 block, among them: pilot's Findings in order (From HQ's two lines, 9 open, a row speaking its five columns, 45 stops, Engineering's default), Meridian's ten, fresh's "Nothing here yet.", a standalone machine's no-policies sentence, the plane's same record, Failed on all three pages, Loading drawn before the read lands, Dana's note as written with Acknowledge and the history in sentences, acknowledging as a note (the finding open, the tray empty, one event queued for the plane), the person's notes in the history, the training opened here and back to its finding, a prevented finding's "Nothing to fix", the settings' none · 5 · 19 and Quietly without a plane, the drill at two positions; every_region_is_found on all three pages (less the regions a state doesn't draw, each tested where it shows). No c4 test needed rewriting beyond the nozzle's (step 2), the rail's section count, the app map's page list and New to Qpoint's two stops. cargo test --workspace: 290 passed, 0 failed (app 28, fixtures 15, messages 16, nozzle 58, qguikit 13, stories 105, stream 41, types 14; the baseline was 255).

c9 Trainings qnative

Nov 13
  • T-INJECT-1 for design c144's S1 (2026-11-13, 32c9b03): the fifth training, Instructions hidden in content (P-PROMPT-INSPECT, design 99865de0b0), is bundled and filled for S1's own finding, Phishing for financial records. Its four scenes are in light and dark. The simulation's replay step and its native scene page (d94716f) read it. Priya's laptop is priya-x1 in T-SECRETS-1 and slots.json, the qdash seed's name (c132 D6).
Nov 12
  • The first slice (2026-11-12, before the demo):
    • The content (crates/fixtures/trainings/): the four published trainings, filled for this app by scripts/sync-trainings.py from design's /api/trainings/<id> with the slot values in slots.json (read from the design lab's governance world: a policy's training on its first finding, the topic on its own as User A). Nothing unfilled. Design stays the source: edit the markdown there, run the script.
    • The types (crates/types/src/training.rs): design's Training, the fields the view draws.
    • The inbox (crates/fixtures/messages/training-assignments.json): three more training assignments beside E7, one per training (unapproved MCP servers, personal accounts for work, Observe and Enforce), shaped like E7, in pilot and connected. examples() stays bones.md's ten; the store's and fixtures' world counts updated (pilot 13, connected 12, threads 12).
    • The view (crates/app/src/pages/training.rs): Start training opens the training in the inbox's place: the lesson a step at a time (the illustration as its alt text until the scenes are drawn natively), then the check a question at a time with the right answer and the explanation, then the result. Done marks the message done and says completion is recorded (nothing is sent on this build; the record is c133's, the plane's side c134's).
    • Rebuilt to the design pages (2026-11-12, minutes later, Mark: "it looks much more like the tour guide, we do want to replicate the training & quizes as constituted in the design pages"): the view now follows the lab mock (app/pages/pages/phase4/mock/training.vue): the progress (Assignment · Lesson · Check · Result · Record, the assignment done), the lede naming the policy and the machine, the lesson with its scene beside the text, Back and Next, the step pills; the check as one page of numbered questions with radio choices and "Check my answers"; All right with what each answer rests on and the record before it is written, then "Finish and record"; Not yet with "Reread step N" per missed question and "Retake the check" (right answers stay); Recorded. The scenes are framed placeholders carrying their alt text: drawing the sixteen SVG scenes natively is the next port.
    • The scenes (2026-11-12, Mark: "I think we need to implement the scenes, no?"): each lesson step now shows its scene as the lab draws it. Design's scripts/export-training-scenes.mjs drives the lab's training mock (each training on its fixture's finding, the topic from the library) one step at a time, with motion reduced, and screenshots each scene's figure at 2x in light and dark, border and caption off: 32 PNGs (about 1 MB) in crates/fixtures/trainings/scenes/, indexed by the generated crates/fixtures/src/training_scenes.rs. The view draws the image on the same sunken surface with the alt text as the caption, as Scene.vue does, and follows the app's appearance. The lesson's two columns no longer squeeze the text (min_w(0) on both). Still owed: the motion (the flow arrows hold still), and drawing the scenes natively from qguikit's pawns so the text in them can be selected and the files go.
    • The quiz wording (design, same day): an editorial pass on all sixteen questions, so the app carries the clearer wording (design 6b240395ff).
    • Checked: types, fixtures and messages tests pass; the app builds with --features dev; run on pilot, its guide server reads the inbox with the new assignments. The click-through itself was not driven by an agent (computer use cannot reach a bare debug binary): no story yet.

c6 Panel Toggles qnative

Nov 13
  • Help mode became Hints (2026-11-13, the "Live activity viewer parity" session). Mark: "help mode toggle doesn't do anything when on or off, whether the info panel is open or not seems to be the real decider whether or not to show hints. Let's change help mode to "Hints" and if it's off, let's leave it off. hints only show up if the info panel is open, but if hints are off and the panel is open, they don't highlight items on the page (ie off)." What changed:
    • Info in the footer opens and closes the panel, which now stays as the person leaves it from page to page. It no longer opens with each window.
    • Hints (saved as info.hints, on unless turned off, so off stays off) decide whether pointing at the page rings a region and names it. With the panel open and Hints off, nothing is ringed or named, and the panel says "Hints are off. Turn them on to see what anything on the page is." The tour launcher stays.
    • The app-info-help-mode story is now app-info-hints-off. The five headless tests were rewritten for this behaviour.
Nov 11
  • kick-off (2026-11-11): this record and the prompt, written in the c133 design session from Mark's words; the idea recorded in design's c138 plan the same hour. The sprint runs in a fresh agent on c3-info-toggles, cut from c3/phases.
Nov 11
  • sprint (2026-11-11): built on claude/c6-panel-toggles-1cd061 (the kick-off named c3-info-toggles; the branch the agent was given is this one).
    • The seat. The open info panel (c2's Info View, the strip over the footer) keeps what it is and gains one group at its right: Help mode and Developer mode, each the kit's Switch (the layer's toggle, R8) with one line under it that says what is true now. The group is drawn only while the panel is open; opening the panel (Info in the footer, or Getting started) switches neither on. crates/app/src/guide/info.rs.
    • Help mode, its meaning decided from what exists. On: the panel opens with each window (at start and on a reopen from the tray) and stays open as the person moves between pages; with nothing under the pointer it says which page this is and what it shows (the app map's entry for the page), and the tour is at hand (Tour this page, where the tour has a step on this page; All tours, to Getting started, otherwise; nothing while a tour runs). Off: the panel opens when asked and says what is under the pointer, as before. Closing the panel with Help mode on closes it for now; the next window opens it again. Saved as help.mode through host::Store in settings.json, so it holds across starts. A fix the page-following needed: a region noted on the page before a click that navigated is no longer described on the new page.
    • Developer mode, the tray's switch in a second seat. The panel's switch turns extensions::set_on("dev"), the same extensions.dev.on the tray's item reads and writes. A new extensions::on_change tells every seat; main.rs registers it for the tray, so the tray's checkmark follows a change made in the panel (the tray's own click goes the same way; the hook is tested, the checkmark not looked at on screen: this session has no Screen Recording). The row uses the extension's own words, now devmode::TOGGLE ("Developer mode"), so one switch has one name in both seats; Mark's "Dev Mode" is that switch. The tray item stays.
    • Where it is not given, the row stays and says why (R5). Carried but not allowed (a release build with --features dev started without --dev): main.rs's one cfg(feature = "dev") block now either gives the extension or names it through devmode::withheld() (a new layer::extension::Withheld, kept by extensions::withhold); the switch is drawn disabled with "Not allowed in this process; start the app with --dev to allow it." Not in the build (the lean build): "This build has no developer mode; it was built without --features dev."
    • How to try it. cargo dev -- --data synthetic, then Info at the right of the footer: the panel opens above the footer, the two toggles at its right. Turn Help mode on, quit from the tray, start again: the panel opens with the window, says what the page shows, and offers Tour this page on a page with a tour step (Models, for one). Turn Developer mode off: the Dev group leaves the sidebar and the tray's Developer mode item unticks. QPOINT_SETTINGS=<file> keeps the trial off the real settings.
    • Stories (R6), light and dark: app-info-toggles (open, both off), app-info-help-mode (Help mode saved on before the window opened; the window opened the panel), app-info-dev-mode (on where allowed), app-info-dev-not-allowed, app-info-dev-not-in-build; the existing app-info-band and app-info-row now show the toggles beside a described region. cargo run -p stories -- --only app-info-help-mode. Captured into design's qnative atlas with the native capture mode (thread c6-panel-toggles, program design scripts/shot-programs/c6-panel-toggles-native.json, twelve PNGs: c6-app-info-* and c6-app-dev-tools-*), left uncommitted for design's sessions.
    • Tests. Five headless tests in crates/stories click the panel's real switches: opening the panel switches nothing on; the switches save Help mode and the tray's value, the tray is told, the Dev group leaves; Help mode opens the panel with the window, and without it the panel waits; the not-allowed row does not turn and nothing is saved; the lean row says so; a sixth holds the rail's cyan to developer mode's group. cargo test --workspace passes (114 tests); this change adds no warnings (three in nozzle's tests at stream.rs:804 predate it, c3's).
    • Developer mode's rail group in the tour's cyan (Mark, later the same evening; his words in initial-prompt.md). While developer mode is on, the Dev group's entries (their words and icons) draw in the tour's own accent, app::tour::view::ACCENT (#0099FF, the same in light and dark; the v5 panel, its callouts and its ring draw with it through material(cx).accent, and the rail reads it the same way), so the developer's view reads as the same kind of overlay as the tour. Colour only: the kit's SidebarMenuItem::label_style and the icon's own colour, which hold through hover and the active row; nothing in the rail's structure moved. shell::rail_tint names the rule; extensions::shown gives the shell each group's id, and extensions::DEV names developer mode's. Off, the group is not drawn, and where developer mode is not allowed it never is, so nothing is cyan. The token is the tour view's constant, not layer::tokens (generated from the web layer, which has no tour accent; its nearest, ACCENT_BLUE #2FAEFD, is another colour). Not done: the group's header ("Dev") keeps the kit's colour, since the kit's SidebarGroup takes no colour of its own and a group drawn by hand would restyle the rail, which is c7's. Stories: app-info-dev-mode and app-dev-tools (the active entry) show it, light and dark; app-landing-dev-off and app-info-dev-not-allowed show nothing cyan. A test holds the rule.
    • Handed to c7, not built here. Mark's other two sentences of the evening, the space between the rail's sections and the web app's left nav (no icons, section headers), became qnative c7, run in the cloud on main and merging after this cycle; as relayed, this sprint keeps only what is developer mode's.
    • The one reading to check with Mark: "set when it is open" taken as shown and settable only in the open panel, not switched on by opening it. Two smaller choices made without asking: the panel names the switch "Developer mode" (the tray's words), and in the lean build the row stays and says so, as this record's shape asked.
Nov 11
  • rebase (2026-11-11): at c3's word, rebased onto main at 5337c28 (c3's Phase 3, Live Activity, and its review stop 3; c5's Activity; c7's record), so the merge is a fast-forward of two commits; the cherry-picked record was dropped as already on main, and nothing conflicted. Phase 3's new Dev page, Live Activity, takes the tour's cyan with the rest of the group. With Activity in the rail the Dev group sits lower, so in app-info-dev-mode only its first entry shows above the open panel; app-dev-tools shows the whole group. cargo test --workspace passes on the rebased tree (157 tests; still only nozzle's three older warnings); the twelve captures in design's atlas were retaken from it.
Nov 11
  • ruling (2026-11-11): Mark ruled (b) on the lean build's Developer mode row (c3's call 14, cycles/c3.developer-mode/review-3.md), relayed from the c133 session; design's c138 plan records it as ruling 10 (design aade2b9668).
    • What failed. Since the merge, scripts/check-lean.sh had failed on main. Its first marker was developer mode's name, "Developer mode", and the lean row's label in crates/app/src/guide/info.rs puts that name in the app crate, so in every build. devmode stayed out of the lean dependency graph throughout. The smaller choice the sprint listed as made without asking, that the lean row stays and says so, is now ruled.
    • The ruling. The row that says this build has no developer mode stays. The check looks for words only crates/devmode carries, not its name.
    • The change, c3's patch with two fixes; scripts/check-lean.sh only, no code changed.
      • "Developer mode" is no longer a marker. A comment says why: it is the switch's title and the lean row's too.
      • Five devmode-only markers take its place: devmode::withheld()'s sentence ("Not allowed in this process; start the app with --dev to allow it."), "/dev/source", "/dev/live", and one sentence each from Live and Source.
      • One allowance: the lean binary may name "Developer mode" once, and only beside the lean row's sentence (NOT_IN_BUILD).
      • The two fixes:
        • The script's header cites the ruling as design records it, not as a quoted amendment.
        • The allowance counts each occurrence of the name, not each line of the binary that has it.
    • The check, run on both release builds from this tree (macOS): passed.
      • devmode in the dependency graph: lean 0, full 1.
      • Each of the twelve markers: lean 0, full 1.
      • The allowance: "Developer mode" 1, the row's sentence 1.
      • Sizes: lean 25,943,600 bytes, full 30,500,512.
    • The control: with the full build in the lean seat, every marker reads IN THE LEAN BUILD and the allowance fails ("Developer mode" 3). Linux and Windows are left to CI on the PR. The three short paths are the markers most at risk of a missing control there.
Nov 11
  • fix (2026-11-11), the sprint's tests against c5's:
    • What failed. CI's first run on the PR (43141982779) failed on macOS, and so had every run on main since 8242467, on all three systems. The failing tests were c5's status_off_says_qcontrol_is_not_running and status_starting_says_qcontrol_is_starting, one or both. CI's Test step comes before the lean check, so the check had not run there.
    • The cause was this sprint's six tests. They build a story's shell, and app_shell_full clears the process-wide forced state. They did not take the serial() guard that the page-state tests take. On a runner with few threads, one of them could clear a Status test's force between its setting and its reading.
    • The fix. The six tests now take the guard, and the guard's comment says why. Tests only, no app code.
    • Checked here:
      • With --test-threads=2 the failure reproduced in two runs of four. After the fix, eight runs of eight passed with one to three threads.
      • cargo test --workspace passes (173 tests; still only nozzle's three older warnings).

c4 Messaging qnative

Nov 13
  • retired by c13 (2026-11-13, night): design c147 replaced the inbox with the finding (Mark's R6: the plumbing stays). qnative c13 removed the Inbox and Messages settings pages, app::messaging and their ten stories; the OS notification trait, the tray, quiet hours and Focus stay and announce findings at the person's noise position; the SQLite store is repurposed for the person's notes on a finding (messages::person). The message types, the fixture and the drift test against bones.md stay as this cycle's record. → c13
Nov 11
  • kick-off (2026-11-11): this record and the brief, from Mark's ruling that c137's Phase 3 starts now as qnative c4. No code yet; step 1 (the types) next. c3 is in the tree at its review stop 0.
Nov 11
  • step 1, the types (2026-11-11, 3cf6b94): types::messages, written from bones.md in the wire shape: Message and its parts (fifteen types, three severities, five states with their reasons, actions and their seven kinds, Sender and Recipient tagged by kind, links, the three-sentence body), Message::check() for the hard checks of §9, and the person's controls (Delivery as a ladder off · inbox · quiet · normal · priority with priority reserved to required, QuietHours with the one preset, Mute, DeliverySettings, RequiredCount). The ten examples of §10 are crates/fixtures/messages/bones-examples.json, verbatim, each naming the worlds whose inbox carries it (pilot ten, connected nine, fresh and the quiet default none); the strict test deserialises them and the drift test reads ../design's bones.md and compares every subject and sentence. Two findings for the specification: required_reason (§6 shows it on the card, §1 does not carry it) and Reply (E6 names it, §4 has no kind; it rides contact-it). c5 (Status) was in the tree with uncommitted hunks in types/lib.rs and fixtures/lib.rs; only this cycle's lines were staged.
Nov 11
  • step 2, the store (2026-11-11): the new crates/messages: Store over SQLite (a file beside the settings, or in memory for a synthetic world; a scope per source in one file), the transitions as §5 allows them and no others, expiry with the per-severity default set at delivery, the required count per calendar month, and a delivery record per message (the level it was posted at, or what held it back: off, inbox, quiet hours, a mute, and whether required overrode one) so the inbox's honesty line is read from the record, not kept beside it. deliver::decide is the one decision at delivery; clock keeps UTC on the wire and this machine's zone for quiet hours. for_world seeds a synthetic inbox from the fixture under the default settings. macOS links the system SQLite; Linux and Windows bundle one. Ten tests, among them the lift (the open required censure first though it is the oldest of the day) and a file store read back across opens.
Nov 11
  • step 3, the ports (2026-11-11, 0a5e518):
    • The OS notification behind one trait (messages::notify::Notifier): availability (is posting possible here, did the person allow it, can priority break through Focus), the ceiling, permission asked once, a post at a level, dismiss, the click. The macOS port is UNUserNotificationCenter through the same objc2 bindings GPUI's platform uses, with the interruption level set per post (passive · active · time-sensitive), which GPUI's own show_system_notification cannot do; the framework aborts a process with no bundle identifier, so cargo run reads "not available here" honestly and the tray and the inbox carry everything. The time-sensitive entitlement is read from the process's own code signature (SecTaskCopyValueForEntitlement), so priority is a word only until a signed build carries it. Windows and Linux are Unavailable with the reason in one sentence; Recording stands in for stories and tests.
    • The channel in the app (app::messaging): one global holding the store for the source on show (following the data generation, so a world switch makes a new in-memory inbox; local and plane share inbox.sqlite beside settings.json, one scope each; QPOINT_INBOX moves it), the person's settings saved under messages in settings.json, and the port. deliver decides, stores, posts and tells the tray; act runs the transition, shows the toast through the Root's notification host (D12) and tells the tray. The tray's Inbox item carries the count and the newest waiting subject, the icon its title; a click on an OS notification brings the window and opens the card.
    • The inbox page: the lift (open required, then new, then the other open ones; ended under a fold with its count), one row per thread with the reply count, the severity pill in grey or orange (never red), the card with the three sentences, the verbatim label on a censure, "Why am I seeing this", the kind and dates, Acknowledge first when owed, Dismiss on info, a mute (this policy's notices, or this thread, until tomorrow 09:00), the replies; the honesty line at the top names what held a message back and links to the settings. The record is read on the main thread (local state, tens of rows a year).
    • Messages, the settings page: four positions per kind (Off · Inbox · Quiet · Normal; Priority reserved to required and said so), the tray's one switch, quiet hours with the preset, steppers and the weekends switch, mutes with Lift, the required override in two sentences with the month's count and subjects, what this build can post, what this app records (R6).
    • The delivery ladder, as built: Off keeps a kind in the inbox and nowhere else; Inbox counts it in the tray; Quiet and Normal add one notification at passive or active; Priority is the level a required message is delivered at (time-sensitive with the entitlement, else active). A call for Mark in review-1: whether these five words carry the inventory's four (off · inbox · tray · notify) the way he meant.
    • Eleven stories (app-inbox-*, app-messages-settings*); QPOINT_NOW pins the clock so a capture reads the same tomorrow; QPOINT_SPIKE_DRILL and QPOINT_SPIKE_CONNECT drive the two flows without a pointer. The app map gains both pages (21 now; its test counts them). Shared files were edited beside c5's uncommitted hunks and committed after its groundwork landed.
Nov 11
  • step 4, the flowing types (2026-11-11): messages are a resource of the nozzle (c137 D2): types::routes::MESSAGES (/api/messages), Repo::messages(), the synthetic world answering the fixture's examples for its name, the fixture plane answering the same over HTTP (a plane serves what a plane stores), a source that serves none answering none. The inbox syncs from it at open and on a world switch: a new message arrives as any does (decided, posted where the settings say), one the plane already saw is adopted as it is; so the synthetic seed now flows through the pipes (R1) and a real plane's record will land the same way. The identity confirmation: messaging::connected() composes it from the plane's label, URL, this machine's name and the account when known, asks alert permission once (D9) and delivers it; a launch in plane mode sends it the first time that scope has none, a Connect page will call the same on the person's own connect. The enforcement notice: messaging::drill() delivers the fixture's local notice (E2) now, with the time of day, in synthetic worlds only; the tour's simulate step (c131 D15) will call it. Checked against two fixture planes: over the quiet world the composed confirmation arrives once and a second launch finds it in the file; over pilot the ten sync and the new ones are delivered. A nozzle test reads the route through both transports.
Nov 11
  • step 5, stories, captures, the budget, the review stop (2026-11-11): ten stories (app-inbox-empty, app-inbox, -card, -acknowledged, -expired, -withheld, -drill, -connected, app-messages-settings, -tuned), each setting the channel up before the page draws (a story's button press waits a frame for the Root, the toast's host); thirteen captures published to design's atlas (thread c4-messaging, captures/messaging.json). The guide's map carries both pages (the card and the honesty line marked as shown only in some states); scripts/guide-check.py passes 147 of 147 against the running app. scripts/bundle-dev-app.sh wraps the release binary in an ad hoc signed bundle so the real macOS notification can be tried. The budget with strobe, interleaved with the tree before the slice: the tray at rest 23 MB on both builds with four messages waiting; the window on the Inbox 61.8 MB at 0.02 % of a core (the baseline's overview 62.2 MB at 0.002 %); the binary +0.99 MB (with c5's pages and c3's stream core in it); one finding handed to c5: the Status landing draws at rest (2.4 % of a core, 212 wakes a second). Then review-1.md: how to try it, the figures, six findings for the specification, seven calls for Mark, what is not built. c3 fast-forwarded main onto this cycle's commits meanwhile (2c01ebf); this record and the README's two sections went on top.
Nov 11
  • Mark's rulings on review stop 1 (2026-11-11, evening), built: the six open calls walked in this session, each the recommended answer (review-1.md § Ruled). (1) The delivery words are Inbox · Tray · Quiet · Normal: the ladder renamed in the types, the hold reasons, the settings page, the honesty line and the guide's map; the old word off still reads as Inbox. (2) The IT contact comes from qcontrol's configuration: the bridge's EffectiveConfig carries it_contact, the pilot world's names mailto:it-help@meridian.dev, a local Contact IT opens it and never the message's own target, and the field is an ask for qcontrol's engineer with the /api/config route. (3) Windows and Linux ports with packaging (c131 Phase 4). (4) The time-sensitive capability is asked for now on the App ID, so the first signed build answers it. (5) Sync cadence is c134's; meanwhile the pull for local and plane moved to the background executor. (6) The tray's line stays in the Inbox item until the tray's long form. Four captures retaken and republished under the same names. Pushed with c3's Phase 3 when c5 pushed 045eed1..4ccf511 on Mark's word, a fast-forward.

c3 Developer Mode qnative

Nov 13
  • The firehose in qdash's grammar (2026-11-13, f19e679, pushed; design c138): Mark found qdash's /live "cleaner, better color coding, filtering". It was compared against main's /live @ 8677b44ed on this cycle's corpus, run from a read-only checkout on :3031. The Events view now draws as qdash's does:
    • each type as its family's chip (family_chip, from main's familyTone);
    • 44 px zebra rows, with time, line and summary in mono and the summary as key=value parts;
    • a column header;
    • qdash's filter card in place of the rail: the search, severity, active filters with Reset, and Harnesses and Events chip rails with counts.

    The seven improvements stay. Still open from design c138's Phase 3: the status pill, presence cards, the buffer cluster, the scroll-away pause, direction, the JSON tree, the tally pivots, drag and drop, and the Audit log. They're listed in design/cycles/c138.developer-mode/live-parity-plan.md.
Nov 12
  • The Monitor's shapes reconciled with the bridge (2026-11-12, design c143, on Mark's word): Guide 4 had asked for richer copies of three shapes c131 D17 already names (SensorState without a pid, Resources as totals, LogLine without a target), plus health beside SensorState's degraded and targets beside EffectiveConfig. Now one ask per route:
    • /api/sensor carries the Monitor's fields: the monitor's pid, a row per process in its tree with 1 Hz samples behind ?samples_since=, health with the last error (SensorState's state and degraded are its rollup), and the log's target and seq behind ?log_after=. /api/config's EffectiveConfig carries the loaded targets, behaviors and include globs.
    • The Monitor keeps two routes of its own, /api/monitor/workers and /api/monitor/processes (guide/types/monitor.ts; crates/types/src/monitor.rs regenerated). No dashboard URL: the app already holds the address it reached.
    • The fields are design's bridge (app/data/worlds/bridge/types.ts), mirrored in crates/types/src/bridge.rs, all optional, so V1's Sensor page and the bridge files are unchanged. Two tests pin it: absent reads as not served, and each served field lands. Guide pages 3 and 4 say so; question 3 asks whether the sensor samples always or only with a reader.
Nov 11
  • kick-off (2026-11-11): this record and the Guide v0: seven pages written as proposals from two surveys of qcontrol (the live viewer and its backend; the monitor TUI) and this repository at c2's review stop 3. No code. Phase 0 builds on c2's Tour stretch commit (9d37433).
Nov 11
  • Phase 0, measure and seam (2026-11-11), at review stop 0 (review-0.md):
    • Developer mode is an extension the app does not know about. The protocol is layer::extension, the registry is app::extensions, and one Route::Ext(path) replaces the two Dev routes. A new crate, crates/devmode, holds Tools and Components and is carried only with --features dev, through one cfg in main.rs. The default build is lean.
    • Allowed (debug, --dev, QPOINT_DEV=1, full build only) versus on: a checked item in the tray menu, remembered in the app's first settings file (app::settings).
    • The eager construction is fixed: Dev pages are built when opened and dropped when left.
    • scripts/check-lean.sh checks the dependency graph and eight strings, with the full build as its control; CI runs it on three OSes once a remote exists.
    • The burden test passes on all four lines (line 3 on this Mac; CI not yet run), so B holds.
    • Read (strobe, an idle Mac, two rounds):
      • Binary: lean 23.2 MB, full 24.3 MB (+1.07 MB).
      • At rest: 60–63 MB quiet in every state with no Dev page shown (lean, full not allowed, full on, full turned off), at 0.002–0.006% of a core.
      • The Components page shown: 65.0 and 65.3 MB.
      • So the lean build buys about a megabyte on disk and nothing measurable at rest; looking at a Dev page costs a few MB.
Nov 11
  • Phase 1, the stream core (2026-11-11, on Mark's night ruling: Phases 1–3 in sequence, the calls collected at the end of Phase 3; built in ../qnative-c3 on c3/phases):
    • The connection (crates/nozzle): sse is a WHATWG event-stream parser, incremental, tested in every chunking. stream holds Subscription, an async channel a page awaits with no timer. Under it, connect speaks HTTP/1.1 directly to qdash's /api/events/stream, with the web viewer's reconnect schedule, and turns 403 and 503 into honest Refused states with the sensor's own reason; play drives the synthetic scripts. Dropping a subscription closes its socket within a 250 ms tick. Repo::subscribe() sits on top. The plane says it has no stream.
    • The scenario model (nozzle::scenario): world, condition and stream. Six conditions; one per process.
    • The data model (crates/types): the envelope and the four Monitor shapes are TypeScript beside the Guide (guide/types/), generated by scripts/ts-to-rust.py --from. Each field is marked read from code (with its qcontrol file and line) or proposed. events holds the vocabulary: 14 families, entity ids, severity, and RFC 3339 nanoseconds both ways.
    • The stream scripts (fixtures::streams): quiet, coding-session, mcp-heavy and file-storm, written to qevents' payloads as read from code. The full reference is filed in research/qevents-payloads.md.
    • The stream core (crates/stream, new): ingest ports qdash's ingestEvent, ingestParseError, sortedEvents and parseRunLog. It is held to the web by cross-language vectors: qdash's own TypeScript, bundled read-only, run over a 615-line corpus with edge lines (scripts/live-vectors.sh). All 615 agree, and so does the sort order.
    • Guide page 3 is now Live Activity: connection methods, the ladder, the data (read or guessed), the pipeline, the states and six asks. Page 6 records the built scripts.
    • 87 workspace tests pass, with no warnings.
Nov 11
  • Phase 2, Source (2026-11-11):
    • Dev › Source (crates/devmode/src/source.rs) is the plan's Sensor page, named Source because c5's V1 Sensor sits under This machine. It offers synthetic data (a world, a condition, a stream and its rate) or a real sensor on this machine or at an address. A choice applies at once through the one re-open path and is saved; the next start applies it unless a flag or the environment says otherwise. A story covers each rung, plus synthetic and an address.
    • host (new crate) answers the Rust expert's question 2. It holds RepoHandle, Generation, repo, generation and reopen, moved out of app::router (which re-exports them), and a Store of saved values the app installs over settings.json. The extension protocol gains an optional start hook.
    • The condition wrapper (nozzle::scenario::Conditioned): six conditions, each drawn through the real pipes.
    • The ladder (nozzle::ladder): Not found (including a stale lock), Found, Answering, Streaming, Lost and Refused, tested against fake sensors on loopback.
    • The doctor, app --check-sensor [--sensor-url …]. Run for real on this Mac, it found a stale lock (pid 54415). Against the seed qdash serve on :7882 it reached Refused with qdash's own 503 sentence.
    • Local::at attaches to an address, and the footer says sensor at …. The macOS data dir is fixed (com.qpoint.qcontrol).
    • Guide pages 2, 3 and 6 now say what is built.
Nov 11
  • Phase 3, Live Activity (2026-11-11):
    • Dev › Live Activity (crates/devmode/src/live.rs) is qdash's /live on the sensor's current envelope: a state line, a harnesses row, Events and Tally, a rail of severity, harnesses and families, a virtual table that follows the live edge, a detail pane, retention (5k, 20k or 100k), and file mode (open a JSONL run log; return to live). The page owns its subscription inside a task, so leaving the page ends the feed.
    • The seven improvements:
      1. a real pause, with a count of what is new;
      2. honest states (connecting, live with the rate and the last event's age, reconnecting with the reason, refused, no sensor, ended, filtered to nothing);
      3. stream::buffer: a ring of raw frames, a light head, incremental facets and view, rows on demand;
      4. a tally by process, session or type, beside qdash's own;
      5. filters for severity, harness and family, process and session, with search over the whole record;
      6. keys (↑↓ j k, space, t, Esc), milliseconds, clock or ages, and Export JSONL;
      7. stream::mask on the summary, the preview, the JSON and the copy.
    • Parity by cross-language vectors, all regenerated byte-identical by scripts/live-vectors.sh:
      • ingest and previews: 614 records;
      • presence: 99 checkpoints;
      • the tally: 63 views and 126 CSVs, byte for byte;
      • entity-meta and the projections: filters, counts, trees, chips, rows.
      • Four modules were ported by subagents against the vectors. The web quirks are kept, each marked.
    • Stories: eight, app-dev-live*.
    • Readings under a stream (README Footprint, Guide 07, review-3.md):
      • As first built, the page cost 28–34% of a core at 100 and 1,000 events a second, nearly all of it main-thread drawing at about 10 ms per redraw.
      • Leaving it returns the app to rest (0.003%, 6 threads).
      • The page now gathers arrivals for 250 ms and caches the rows on screen, so it redraws at most 4 times a second, the monitor TUI's cadence. The readings at that rate are owed.
      • The recipe is scripts/footprint/.
    • CI: Linux and Windows had failed on the stories crate. c5's cloud session fixed the cause, the crate's manifest (3725719), along with two Windows failures in c3's ladder and events fixture. Run 17 is green on all three systems, and it came into c3 by merge (78238ff), replacing c3's per-system exclusion. Phase 3's first run, on c5's push of 4ccf511, failed on Windows in the projections tests: the corpus read as CRLF counted one line more. Fixed in 948a9b5 (.gitattributes keeps the vectors LF; the trim no longer assumes LF), not yet pushed.
    • The calls: fourteen, in review-3.md (the fourteenth, the lean check after c6's merge, ruled (b) and closed by qpoint-io/qnative#2, 2c435e4).

c143 Loose Ends

Nov 12
  • sweep (2026-11-12):
    • design main: the c138 "call 14 closed" record rebased over #19 and pushed (a91731f0a7). Conflict in cycles/c138.developer-mode/CYCLE.md: the record's newer Review stop 3 line kept, and #19's footprint-page bullets kept below it. A local reorder of public/cycles/design/manifest.json with no content change was dropped to let the pull through.
    • design#18, c133 record sketch: rebased and merged (4453a8c085). Conflicts in app/data/stories/c133.ts and cycles/c133.remediation-training/CYCLE.md. Main's later story kept (Phases 3–5, record counts, pickup), with record-sketch added to the outcomes and recordSketch to the captures. The Documents line gained the Tyler walk link. Key Changes holds the Tyler walk bullet and main's Phase 3–4 bullets.
    • design#20, c139 Updates: a cloud session's branch with no PR. A PR was opened, rebased and merged (5e12709e36). Conflicts:
      • page-registry.ts: both collapse entries kept.
      • cycles/CYCLES.md: c139's entry placed above main's current c138 entry.
      • The design manifest: main's 786 entries plus c139's 17.
    • design main, c4 and c6 captures: 25 qnative captures (c4 inbox and messages settings, c6 info-panel toggles), their manifest entries and c6's shot program were left uncommitted by their threads; committed as 416de93c6a.
    • qnative main: c3's review-stop-3 record (7800b25, on local c3/phases only) cherry-picked as e609f42.
    • qnative#1, c7 Web Rail: rebased and merged as e3ffc94, squashed like #2. The ruleset wants a review, so it was merged through the owner bypass, as #2 was. Conflict in crates/app/src/shell.rs: c7's RailSection rail kept. c6's Dev-group cyan moved into it as a tint on the section, with extensions::shown passing each group's id. Workspace build and tests clean, lean check passed, CI green on Linux, macOS and Windows.
    • qnative local main: a live session in qnative had fast-forwarded local main to the unsquashed c7 branch. Its tree is identical to e3ffc94, so the main ref was moved there by compare-and-swap. No file or index entry changed under that session.
    • Pushed:
      • q-nuxt-layer main e7e1454: PolicyTag "Off". Not released.
      • The 0.9.36 lockfile bump on qdash feat/new-pages, bob-wire c16-agent-control-plane, qflow ai-ecosystem-visualizations and www disable-dark-mode.
    • Pulled:
      • intents (#6).
      • rulekit, qtap and firebase, by fast-forward.
      • The local main branches of qcontrol, qpoint, qflow and www.
Nov 12
  • cleanup (2026-11-12):
    • Remote branches deleted:
      • design: claude/funny-thompson-jy9h9x (#18), claude/brave-knuth-7qzxem (#20), claude/sleepy-maxwell-miy81p (#19), c81/phase1-pages (#13).
      • qnative: claude/bold-tesla-gpb6u1 (#1), claude/c6-lean-marker (#2).
    • Local branches deleted:
      • design: claude/jovial-dubinsky-36e37e (its c129 record is on main in a later form), c81/phase1-pages.
      • qcontrol: backup/feat-new-pages-pre-rebase, backup/feat-new-pages-pre-rebase-1005, and seven branches whose remotes were gone, each with a merged PR (#391, #465, #521, #616, #642, #648, #667).
      • qmap: the three April claude/* branches, all in main.
    • Worktrees removed: qcontrol-c112 (clean; its branch stays, local only) and three clean qmap worktrees.
    • Restore points for the deleted branches are in PICKUP.md.
    • Kept because something is running or something would be lost: listed in PICKUP.md.
Nov 12
  • quick wins, walked with Mark (2026-11-12, later):
    • The c133 record sketch captured (1d353daad0).
    • c112/demo-container and c113/baked-demo pushed to origin.
    • qcontrol#692 closed: feat/new-pages already carries the index.
    • app.qpoint.io #247, #238 and #166 closed as superseded.
    • The two old native app copies quit and the c6 session archived. Then the three qnative worktrees (~116 GB) and their branches were removed.
    • market-analyst's 19 internal calls kept local, hidden through .git/info/exclude.
    • design's nested c3 move reverted.
    • www's checkout moved to main, and disable-dark-mode deleted locally and on origin.
    • update-consumers.sh no longer bumps app.qpoint.io or www (layer db128d4, f581e09).
Nov 12
  • the Monitor's shapes reconciled (2026-11-12, later, on Mark's word): asked after a report on what of Kamal's monitor TUI reached the native app. c138's Guide page 4 had asked for richer copies of SensorState, Resources and LogLine than the bridge types, and for health and loaded targets beside facts D17's shapes already carry. Now one ask per route:
    • design app/data/worlds/bridge/types.ts (and its README): the Monitor's fields, all optional, on /api/sensor and /api/config;
    • qnative: crates/types/src/bridge.rs mirrors them, with two tests; guide/types/monitor.ts keeps only workers and processes, and monitor.rs is regenerated; Guide pages 3 and 4 rewritten; c3's record;
    • design records: c138's plan and CYCLE.md, c131's synthetic-data.md, c134's kamal-prep.md.
Nov 12
  • the bridge's config file made qcontrol's (2026-11-12, later, on Mark's word): the four bridge fixtures said ~/.config/qcontrol/config.toml with TOML keys (mode, plugins, egress) that qcontrol has never read. qcontrol main (8677b44ed) reads config.yaml from the same directory, and qconfig rejects any top-level key but include, sinks, ui, behaviors and targets.
    • minimal, meridian-day90 and pilot now carry a config.yaml in qconfig's schema: the stock document's audit behavior on an "All harnesses" target, and in pilot an OpenShell behavior for the egress allowlist plus the proposed it_contact, marked as proposed. effective.plugins names real plugins (io-events, llm-events, mcp, sentinel, openshell) in place of telemetry; fresh's log line names the stock document.
    • Checked by loading the texts with qconfig built from qcontrol main in a scratch worktree (since removed): minimal's and meridian-day90's load as written, pilot's once it_contact is taken out (qconfig: "unknown field it_contact"), so that key is part of the ask.
    • The lab's Sensor page says "No config.yaml" and shows what the stock document holds when there is no file; types.ts, bridge.rs and the bridge README say what each field means against qcontrol. Captures of the Sensor page taken before today still show the TOML.
Nov 12
  • everything outstanding pushed (2026-11-12, evening, on Mark's word: "push this and anything else outstanding. Be sure to update histories and push supporting app pages"):
    • Histories first: c138's story (it still said nothing was built), design's CYCLES.md lines for c138 and c143, qnative's CYCLES.md (c3 said "no code yet"; c8 pushed), c8's record, devmode's header (four pages, not two); the c130 PNG committed (b0979ad28d, qnative 9628a2a).
    • Pushed: design main (b0979ad28d), qnative main (9628a2a, with c8's five commits and the scorecard), qmap main (29b3de2, its 15); www fast-forwarded. qmap#4 closed as superseded.
    • Deployed twice: 23fed8856e (design 169e0b867a) after the pushes, and later af19753d92 (design e74e06fbe3, nothing uncommitted) once the evening's training work was in.
    • Left alone: older side branches whose unpushed commits are already in their main (design c123/owasp-agentic-tour, the layer's c1-figma-library-integration, market-analyst's board-analysis branch, bob-wire cycles.2-5 and deploy-readiness); qcontrol feat/qdash-nuxt-redesign, which tracks qcontrol main (never pushed there); the uncommitted work of other sessions.

c142 Cycle Tours

Nov 12
  • kick-off (2026-11-12): opened from Mark's prompt. The site was deployed so the tours run on live pages.
Nov 12
  • deploy (2026-11-12): npm run deploy took the live site from 4d222f49 (built 02:31Z) to 416de93c6a plus 19 uncommitted files, built 16:02Z, layer 0.9.37. The live _deploy.json on design-f39.pages.dev confirms it. c142's cycle page and c133's pages answer 200. The c133 scene gallery landed after the build started, so it ships with the next deploy. The build logged two errors that don't stop it. (1) EISDIR on /api/trainings: the list and the per-training files share a path, so the static site serves /api/trainings/T-MCP-1 but the list returns 404. c133's publish.md names the list as what the apps read, so that's c133's to settle before release (the plane copies the JSON in at release, D29). (2) A fatal 404 prerendering /cycles/evolution/native/app-status.
Nov 12
  • second deploy (2026-11-12): built 16:10Z, live on design-f39.pages.dev. The scene gallery is live. Rob Genova's credit and the thread below came after the build.
Nov 12
  • documents-and-work (2026-11-12): from the c133 tour, Mark asked for a more prominent documents section that can be linked to directly, and a terse summary of work (micro-problem → resolution, with the attempts) (prompt, plan). Built on every cycle: a Documents tab at /cycles/<project>/<id>/docs, and a Documents section on the story (#documents). It covers every document with its first heading as the title, grouped, plus the pages the captures came from. Built where a story writes one: a "Summary of work" (#work) under In short, with c133's twelve lines as the first. Checked on :3000 at 1440 and 375 (c133 story and tab, c142 with no story); no failed requests after a reload. Four open questions in the plan.

c140 Surface Evaluation

Nov 12
  • Kick-off, evidence, scores (2026-11-12): the cycle opened from Mark's prompt, quoted verbatim in initial-prompt.md, with his note that another thread was merging. The work, in order:
    • The rubric first. plan.md was written before the evidence came back.
    • Four readers, read-only. They covered the layer's component APIs, the token path, parity and drift across repos, and the app's pages with the manual work around them. The sharper claims were spot-checked by hand at qnative e609f42: the copied .qp() in harness.rs:280, the 433 literal type sizes, the stale scorecard rows, the inbox's unwrap_or_default, the missing specs and PATTERNS.md.
    • The scores. Twenty rows: none at 5, three at 4 (data boundaries, replicate first, the budget), eleven at 3, six at 2 (tokens, two surfaces, accessibility, states, docs architecture, naming).
    • The glossary. brand/glossary.md opened with Surface.
    • The specs rescued. The ten port specs (spec-*.md, about 400 KB, cited 30 times in code and docs) were found only in a session scratchpad under /private/tmp and copied into rescued-specs/ (uncommitted; their home is qnative c2).
    • Merges during the work. Design main moved from 4453a8c085 to 416de93c6a during the work (the c139 merge and the c4/c6 captures).
Nov 12
  • The pages (2026-11-12): three cycle reports were built from the layer and read from app/data/c140-evaluation.ts:
    • /cycles/design/c140/scorecard: the twenty rows, the verdict, the five questions;
    • /cycles/design/c140/parity: the cost of two surfaces, the drift log, the divergence register's seed, the docs proposal;
    • /cycles/design/c140/tools: ten candidates, ranked.
Nov 12
  • Review stop 1 walked and ruled (2026-11-12, Mark): the eleven calls were walked in the session in four sets, with fourteen rulings (review-1.md § Ruled). Four differ from the default:
    • D1: the second surface is QGUIkit, now. D2 follows: the crate layer becomes qguikit.
    • D6: the slot equivalents are named now and the APIs refactored later. DataTable's silent truncation stays a recorded gap until then.
    • D7: keyboard and focus come after V1 ships, a gap written down for operators.
    • D11: /native-port and spec-measure are built first.

    The rest took the defaults:
    • D3: the dual-surface docs get a new cycle.
    • D4: c135 covers both surfaces.
    • D5: the token sweep, with motion tokens and a lint.
    • D8: the web's names.
    • D9: the full crate restructure.
    • D10: the manifest field split.
    • D12: the web bugs filed back.
    • D13: all four small items, after the merge.
    • D14: one qnative cycle for the code.

    Carried the same day:
    • The glossary names QGUIkit, and GPUI and GPUI Kit are told apart.
    • The pages say QGUIkit and show each ruling beside its correction, with an outcome box on the scorecard.
    • handon-qnative.md: the qnative cycle's brief, five steps in Mark's order with two review stops.
    • qdash-todos.md: the three web bugs with the native fix for each, ready to file. qdash's todos live in Mark's Logseq, which this session doesn't write.
    • c141 Surface Docs opened at Stage 1 (../c141.surface-docs/initial-prompt.md).
    • c135's CYCLE.md records D4.
Nov 12
  • qnative c8, steps 1–2 (2026-11-12, run in this session on Mark's word):
    • c7 was merged first, on his ruling.
    • The four commits on qnative main, unpushed:
      • D2: the crate is qguikit (a5ca520).
      • D13: the token bridge moved to qnative, with --check and a CI job (8b1af18); design's scripts/tokens-to-kit.mjs is now a wrapper.
      • D13: the six flaws (be4545f).
      • D13: the specs committed in qnative c2, and the bridge's source named (bc60635).
    • Here: the bridge fixture synced, and qdash todo #4 (the empty box in dark mode).
    • qnative c8 is at review stop 1 (../../../qnative/cycles/c8.qguikit-cleanup/review-1.md) with three calls.
Nov 12
  • The two tools, D11 (2026-11-12, run in this session on Mark's word; built by a helper agent, checked by hand):
    • scripts/spec-measure.mjs: Playwright on qdash at 1120 × 720 writes a JSON and a markdown spec, with:
      • the column widths;
      • type per text role;
      • colours mapped to the layer's roles in light and dark;
      • radii and the copy;
      • --states for loading, failed and filtered-to-nothing;
      • --native to check a Rust page's widths.

      It takes 4 s a route. On Tools it matches the hand spec within 1 px on all 7 columns and the native page on 0 of 7: the native widths were set by hand, and the native grid scrolls by 88 px where the web's scrolls by 30.
    • .claude/skills/native-port/: the eight-step port loop.
    • /gpui-story fixed:
      • the page tests run in -p stories;
      • the four worlds, meridian-day90 the default;
      • the region-text test written out;
      • the dead PATTERNS.md pointer redirected.
    • The record: native-port-tools.md and the worked run in specs/.
    • The states pass found a fifth web bug (qdash-todos #5): the Tools band shows zeros while loading and when qdash is down.

c135 Component Cleanup

Nov 12
  • 2026-11-12, from c140 (Mark's ruling D4): c135 covers both surfaces. Each group is cleaned once, on Vue and on QGUIkit, the Rust twin in qnative's layer crate (being renamed qguikit, c140 D2). That widens Scope's "Out: new components for the native app (the kit's)", which was written before c131 D18 made the layer a drawn Rust twin with 36 counterparts. The QGUIkit crate's restructure (D9), its renames to the web's names (D8) and the token sweep (D5) land first, in one qnative cycle after the merge (c140 D14, ../c140.surface-evaluation/handon-qnative.md). The groups here then clean against those names. The parity register that keeps the two in step is c141. Evidence: /cycles/design/c140/scorecard.
Nov 10
  • sketch and story (2026-11-10): the scorecard sketch (app/pages/cycles/design/sketches/c135-scorecard.vue, captured as c135-sketch-scorecard.png), the story module (app/data/stories/c135.ts, D1–D8 as decisions, the sketch as hero) and this record's sketch line and "The shape" section.
Nov 9
  • stage 1 (2026-11-09): prompt and plan written from c130's split: the scorecard, six resolution strategies, eight defaults, five phases. CYCLE.md written before kick-off at Mark's request (c130 clarifying question 6).
Nov 9
  • 2026-11-09, later: Mark: the consumer to keep green is app.qpoint.io's successor (c134), which starts from a blank slate, so the waiting-list extractions happen in this cycle, ahead of their groups (D8 revised). Committed the same day.

c8 QGUIkit Cleanup qnative

Nov 12
  • Kick-off (2026-11-12): the cycle opened from design c140 D14. Before it started, main was fast-forwarded to c7 Web Rail (900578f, PR qpoint-io/qnative#1) on Mark's ruling "Merge c7, then clean up". Nothing was pushed.
Nov 12
  • Step 1, the name (2026-11-12, a5ca520, D2):
    • crates/layer → crates/qguikit, with 270 paths in 40 files.
    • lib.rs says what QGUIkit is.
    • The workspace builds clean.
Nov 12
  • Step 2, the small items (2026-11-12, D13):
    • The token bridge moved here from design, with --check and CI's tokens job (8b1af18). Design's private repo was out of reach for CI, and the layer is public. Design keeps a wrapper.
    • Six flaws fixed (be4545f).
    • The ten port specs committed in cycles/c2.expressive-range/specs/, and the bridge's source said (bc60635).
    • In design (uncommitted): the bridge fixture's it_contact synced back, the wrapper, and c140's qdash todo #4.
    • 175 tests pass.
    • The merge thread was still active: it squash-merged c7 as e3ffc94 and reset main to it between this cycle's fast-forward and its first commit. The trees are identical.
Nov 12
  • Pushed (2026-11-12, design c143): on Mark's word ("push this and anything else outstanding"), steps 1–2 (a5ca520 … 40be83f) went to origin/main with the commits stacked on them. Review stop 1's three calls stay open.

c7 Web Rail qnative

Nov 12
  • rebased onto main and merged (2026-11-12): c6's second pass had changed the same lines of shell.rs (the Dev group in the tour's cyan, rail_tint, on the kit's SidebarMenu). The rail keeps c7's RailSection. c6's colour moved into it: RailSection takes a tint, extensions::shown passes each group's id, and a tinted section's pages are cyan through hover and the lit page, as c6 had them. With no fill, the lit Dev page reads the same colour as its siblings. That is a call for the review stop. Workspace build and tests clean, the lean check passed, merged by Mark's word without the captures (the merge session, design). The captures are still owed.
Nov 12
  • built (2026-11-12): the rail is the web app's, in crates/app/src/shell.rs only. The reference is the layer's own nav, read from its public repository (q-nuxt-layer components/nav/Vertical.vue and VerticalItem.vue at 0d1ea8c), as qdash uses it (design's replica of qdash's AppSidebar, app/components/replicas/qdash/AppSidebar.vue, and the c114 mock's governance/mock/Sidebar.vue). qcontrol was not reachable from the cloud session, so qdash's own AppSidebar.vue was not read; the replica and the mock name it as their source.
    • Matched. A section's title: 12 px semibold, uppercase, content-subtle at 80 %, a 1 px stroke-strong hairline 4 px under the text, 8 px to the first page. A page: plain text, no icon, 15 px semibold in content; the lit page and the hovered one in primary. Every page is semibold, as the web's are, not only the lit one. A row is 32 px tall at a 30 px pitch (py-1, -mb-[2px]), the pointer's target starts 8 px left of the text (pl-2 -ml-2), and the text sits 20 px in from the 212 px column's edge, as qdash's px-5. After every section, 32 px (mb-px32), so the gap between sections is the same each time. Sizes, weights and colours come from layer::tokens, the bridge's, so light and dark follow the roles. The web draws no fill and no bar for the lit page, so the rail draws neither: the record's "soft bar or fill as the web app draws it" is not in the web's nav. Every section already had a title in the shell (This machine, Inventory, Messages, Help, and each extension's, Dev), so router.rs is untouched. The inbox's count stays beside Inbox (c4).
    • What the kit could not match, and why. The kit's SidebarGroup draws its own label (12 px in the sidebar foreground at 70 %, no case, no tracking, no hairline), and SidebarMenuItem paints the accent fill on the active row and a fill on hover after any style the caller sets, at a fixed 28 px row. So the sections are drawn here (RailSection, a kit SidebarItem) and the kit's Sidebar still holds them: the column, its border, its scroll. GPUI's text style has no letter spacing, so the titles use Inter's capital spacing (cpsp), the font's own tracking for capitals: 32 of 2048 units a capital, 0.016 em, about half the web's tracking-[0.03em] (measured on Linux: "THIS MACHINE" 2.1 px wider, where the web's tracking adds 4.3 px). The token bridge carries no spacing scale, so the 32 px gap is written in the rail under its token's name (px32) until layer::tokens has one.
    • Not taken from the web, on purpose. qdash draws Inventory as a disclosure under MONITOR with italic sub-rows; the native rail keeps c131's sections, so Inventory stays a section and the sub-row treatment is unused. At the web's 30 px rows the rail is taller than before: in the pages' 1120 × 720 window the Dev section sits below the fold and the rail scrolls, as the old rail did with Dev on.
    • The tour layer. Each row is now a rail region keyed by its path through qp_id, its own box, where the old rail recorded a probe's guess from inside the kit item's suffix. layer::tour::row_probe and layer::extension::Page::icon are no longer read by the rail; both are left in place for the merge.
    • Stories. app-rail-machine (Sensor lit), app-rail-inventory (a model's page, Models lit), app-rail-messages (pilot: Inbox lit, with its count), app-rail-help (Getting started lit), app-rail-dev (Dev › Tools lit; Dev has four pages since c3's Live), light and dark, at 1120 × 960 so every section is drawn whole. Two headless tests beside c5's, under their one-at-a-time lock: the_rail_draws_every_section_whole (every page of every section a row, in the app's order, drawn whole in that window; the sections come from the router's lists and the extensions that are on, so a page added later is checked as it lands; one gap between sections, 67 px four times, the 32 px gap and the next title; one pitch between rows, 30 px) and a_rail_row_opens_its_page.
    • Checks, in the cloud session (Linux), on main at 407370b. cargo test --workspace passes, the stories' 30 tests among it, five runs of the stories alike. It prints no warnings: the three that main had, in nozzle's stream test (made never read, from c3 Phase 2), are fixed on this branch in their own commit naming c3, asked for in this session; the test now asserts the count it kept. The rail was looked at in both appearances through GPUI's headless context on Mesa's software Vulkan (before the rebase onto 407370b, so without Live); those renders are not captures of record.
    • Waits for the merge. The captures, by design's native capture mode run from the design repository. c5's and c6's edits to shell.rs (and c5's to router.rs): c6's cyan for the Dev section goes on RailSection's title.
    • Try it: cargo run -p app -- --data synthetic; cargo dev -- --data synthetic shows the Dev section too.
Nov 11
  • kick-off (2026-11-11): this record and the prompt, written in the c133 design session from Mark's words; split off c6's sprint the same hour so the rail has one owner. Runs in a cloud session on Opus 5.5 from main.

c136 Mechanic Access

Nov 11
  • Phase 0 (2026-11-11): prior-art.md reads seven precedents (AWS support roles and sessions, Google Access Transparency and Access Approval, Azure Customer Lockbox, GitHub App installs, Tailscale, break-glass and JIT elevation, Okta and Salesforce support grants with Kolide for the words) against the four purposes, three levels, seven-day window, named people and the single event family. We copy the structured reason plus the partner's sentence, the request that pre-fills the grant, the session under the grant, permissions as sentences and the expiry said at the moment of grant; we refuse standing roles, unnamed or impersonated actors, unrevocable approvals, break-glass around the grant and a year-long window. Thirteen questions with defaults (the plan's four plus nine the reading raised) wait for Tyler and two partners.
Nov 10
  • sketch and story (2026-11-10): the grant sketch (app/pages/cycles/design/sketches/c136-grant.vue, captured as c136-sketch-grant.png), the story module (app/data/stories/c136.ts, D1–D7 as decisions, the sketch as hero) and this record's sketch line and "The shape" section.
Nov 9
  • stage 1 (2026-11-09): created from Mark's ruling on c130 D6 during the decisions walk. initial-prompt.md quotes his words; plan.md proposes four purposes, three levels, seven rules and seven defaults. CYCLE.md written before kick-off at Mark's request (c130 clarifying question 6).
Nov 9
  • 2026-11-09, later: Mark confirmed D1–D7. Committed the same day.

c134 Control Plane Web App

Nov 11
  • 2026-11-11: c131 D17 ruled: the six endpoint-only shapes (sensor state, resources, effective config, log tail, config file, plane connection) become qdash routes typed in TypeScript and generated into Rust like the other 38. They are the first new entries of Phase 2's API document and join the asks to the plane engineer beside the one-schema proposal (kamal-prep.md §4). Plan: a paragraph under Phase 2.
Nov 11
  • 2026-11-11, evening: Mark met the plane engineer today: he takes the three asks in principle (one schema source for the generated TypeScript and Rust types, a Meridian export by host and day, the six endpoint-only shapes as qdash routes); the specifics come later, so Phases 1–5 stay on hold for them and Tyler's repo decision.
Nov 10
  • kamal-prep (2026-11-10): a thread for Mark's call with Kamal, who owns the plane's backend and data model: kamal-prep-prompt.md → kamal-prep-plan.md → kamal-prep.md, the brief in five parts. What the native app needs from the plane: a table per page (Status, Inventory, Events, Config, Connect) plus the inbox, the grant line and the Connect exchange, every row marked today / gap / new; 18 of the 38 routes read as they are, eleven gap rows apply, and an endpoint scope on the listings is missing from the gap list (candidate row 31). A ten-minute demo script (the pages on :3030, the spike's window, tray and fixture plane, the strobe footprint, the c137 inbox mock, the gap list) with what each step proves and what is honest to say. Ten questions in order with defaults; the three he will push back on named. Two proposals: the Meridian world as an artifact the Go app imports and exports, and one schema source (OpenAPI from the Go handlers) so TypeScript and Rust types are generated, R13 extended. The current thinking on prototyping native pages (Vue mocks in a native skin plus a stories crate; Figma as an input; c132's bake-off still to run), and five places the records disagree, led by local reading the qdash API the roadmap removes. Renders at /cycles/design/c134/doc/kamal-prep.md. Other sessions in the tree: the c130 program session, c131's spike, c137.
Nov 10
  • sketch and story (2026-11-10): the sketch "One image, two deployments" at /cycles/design/sketches/c134-deployment (app/pages/cycles/design/sketches/c134-deployment.vue: the image rug with the UI, the Go app and the two databases, the endpoint and the people coming in, the SaaS and self-hosted rugs; leaf for what exists, grape for ours, orange for Kamal's), to be captured as c134-sketch-deployment.png for the hero; the story module app/data/stories/c134.ts (D1–D8 as decisions, the inventory and the Kamal brief as outcomes, the pickup); the image under Why and §The shape added here.
Nov 9
  • stage 1 (2026-11-09): prompt and plan written from c130's split. CYCLE.md written before kick-off at Mark's request (c130 clarifying question 6). The same day's rulings added the endpoint connect credential (c131 D13), mechanic-access grants (c136) and the operator's message inbox (c137) to the identity-and-access deliverable and the API contract (D8).
Nov 9
  • kick-off (2026-11-09): Mark started the cycle with Phase 0 (inventory.md) in its own session. He also ruled that app.qpoint.io's successor, this web app, is the layer consumer c135 keeps green, and that the layer takes the waiting-list extractions now so this app starts from a stocked pantry; whether the successor keeps the app.qpoint.io hostname is a c0 item. Committed the same day.
Nov 9
  • Phase 0 (2026-11-09): inventory.md written from the trees (no servers started): app.qpoint.io (76 routed pages, 5 layouts, Firebase auth with SAML/OIDC through $api, three injected clients, the Firestore collections and Pulse routes, four alert rule kinds, the wizard kit and seven flows), the qdash UI (44 pages → 46 domain modules → routes; the shell; served / derived / staged with the 66-entry projected ledger) and the qdash backend (38 routes with their window and writes). The finding: app.qpoint.io is a frame around pages being retired, qdash is pages with no frame; D1's seam holds. Gap list: 30 (from/to and one window everywhere, history and snapshots, /api/me and sessions, orgs and members, frameworks and policies served, the alert engine and sender, the connect credential, grants and messages, contract fixes from the ledger). The asks are consolidated with where each is recorded (c128 gaps 1–5, c105 seat prices, the ledger's contract fields, c131/c136/c137 D-rulings). For c135: the 17 staged components/lib pieces plus 16 frame parts the layer lacks (session card, OAuth button, org switcher, user menu, invite and SSO forms, secret box, the wizard kit, checklist, toast stack and banner, a date-range picker, export). Eleven questions for Tyler and Kamal. Renders at /cycles/design/c134/doc/inventory.md.

c132 Native Design Prototyping

Nov 11
  • 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.
Nov 11
  • 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.
Nov 11
  • 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.
Nov 11
  • 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.
Nov 11
  • 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.
Nov 11
  • 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.
Nov 11
  • 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).
Nov 11
  • 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).
Nov 10
  • 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.
Nov 9
  • 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.
Nov 9
  • 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.

c131 Native App V1

Nov 11
  • 2026-11-11: Mark ruled on the synthetic-data outline (synthetic data §Rulings → D15, D16): the default world is a quiet laptop (nina-mbp proposed) and priya's is the pilot world a tour switches to (switch world · simulate a bad event · watch the local notices and tune the controls: the first native tour, with c137); the world is chosen in the app's settings over one re-open path Connect reuses; the lab adopts the worlds in c132 Phase 0. Open: where the six endpoint-only shapes get their types (recommended: qdash routes typed and generated like the rest). Hand-on to qnative c2 at its review stop: recut and rename the worlds, the settings switch. Nothing in ../qnative from this session.
Nov 11
  • 2026-11-11, later: the remaining calls walked here: the six endpoint-only shapes become qdash routes typed and generated like the rest (D17; the ask to qcontrol engineering through c134); nina-mbp confirmed as the default laptop; the tour's simulate step injects the paste scare, the secret-file read or the incident, as one tour or three (c137 question 5). The message to the qnative c2 session was held undelivered by its permission mode, so the rulings went as a hand-on file, ../qnative/cycles/c2.expressive-range/handon-2026-11-11.md, uncommitted there for c2 to fold in. Committed and pushed the same day.
Nov 11
  • 2026-11-11, evening: qnative c2's two review stops walked here (D18–D20): the brand ruling amended to our layer on GPUI with the kit for the shell; no seed restart; the table stretch's four remaining items now; the five page defaults accepted; atlases released on close to the tray; the tour launcher in a Getting started / Help section, the panel floating and locked right, the guide endpoint on with a token, arrows and Esc. Sent to the c2 session by message. Kick-offs ruled the same evening: c132, c135 (Phases 0–1), c136 (Phase 0), c133 (Phase 0) and c130's shape.md, each with a fresh agent; c134 waits for the plane engineer's answers.
Nov 11
  • Phase 2: the Tour stretch (2026-11-11, Mark: "Start the Tour"). Written up in qnative's review-tour.md (/cycles/qnative/c2/doc/review-tour); 22 captures, thread p2-tour.
    • The engine: c125's tour layer (v5 · Panel), native, to a spec measured on the lab.
      • .qp_id(..) records a region's box in prepaint and adds no layout node; the pages carry ids and nothing else.
      • The overlay paints Ring, Dim, Ring + Dim and Fade from the same frame's boxes, with no lag.
      • Callouts are placed by the web's obstacle score; the glide is the web's.
    • The native tour, "What's on this machine":
      • tours as serde data, mirroring c123's type;
      • 7 stops and 9 steps over the Inventory, with live facts and one detail page reached through a fact;
      • spots, Float or Split, minimize, follow the page.
    • The MCP guide drives the window:
      • the 16 qpoint-guide tools served from inside the app, on loopback;
      • a native app map (16 pages, 108 regions, 13 concepts) whose rows come from the data;
      • open-page shows the way in the sidebar first; no tool presses anything.
      • scripts/guide-check.py passes 117 of 117 against the running app.
      • A one-prompt run by a real harness is owed: the CLI's login had expired.
    • Info View, native first: the footer's Info explains the region under the pointer from the same map.
    • Open, for Mark:
      • a launcher on the pages;
      • the 488 px page beside the dock (grow the window by 420, or fix the bands' overflow);
      • the endpoint on by default;
      • keyboard.
    • Waiting at this stop (D15–D17's hand-on): the worlds recut and renamed (nina-mbp the default laptop, priya's the pilot world) and the settings switch.
Nov 11
  • developer mode split out (2026-11-11): Mark's next objective for the app (the live viewer replicated and improved, the monitor TUI replicated, the data switch admin'd in the app, three config-file modes, a gate that can switch developer tooling off or ship without it, instruction pages for hooking a live sensor) was planned here as a thread and ruled its own cycle, c138 Developer Mode, with qnative c3 as its twin. It amends D6 (Events curated, Live raw; plan.md) and R2 at the page level (two positions on the Sensor page), and takes D15–D17 as given. V1's Status and Connect pages stay here.
Nov 11
  • Phase 2: Mark's rulings D18–D20, built (2026-11-11, qnative 71dd21a). Built on branch c2/rulings in a worktree beside c3 Developer Mode, rebased onto its seam (2f66b4b) and fast-forwarded into qnative main. Record: qnative c2 CYCLE.md, and "Ruled" sections on review-3.md and review-tour.md. 13 captures, thread p2-rulings.
    • The table at full fidelity:
      • a sticky header, pinned under the band on detail pages;
      • keyboard (↑ ↓ ⏎ Esc) and AccessKit roles, with two GPUI tests;
      • columns sized to their content;
      • the well eased to its measured height, and again when nested rows open;
      • the quiet nested look, and the new-row flash.
    • The atlases, measured first: GPUI frees the GPU atlases with the window. The app now also releases its caches and the allocator's free pages when the last window closes. The tray after a walk and a close is 48 MB, against 22 for a tray-only start; the rest is driver-held GPU memory and some heap.
    • The tour:
      • the panel floats at the window's right edge, never docked, and says when a step's highlight is under it;
      • ← → and Esc while the panel has focus;
      • the guide's endpoint takes a per-launch token (401 without it; 117 of 117 checks with it);
      • Getting started (Help) in the sidebar holds the launcher and the connect line with the token.
    • D15–D16:
      • the default world is nina-mbp's quiet laptop (meridian-day90 recut, 119 responses); priya's cut is bundled as pilot;
      • worlds are parsed per name on first use;
      • the world is chosen in the tray's Synthetic world submenu, remembered in settings.json, and swapped in place over one reopen path (a data generation the page, the footer and the facts follow) that Connect can reuse.
      • The lab's useNativeWorld (c132) now reads nina's rows under meridian-day90, in an unchanged file shape.
    • Waiting:
      • the real-harness run, once the CLI login is refreshed;
      • D17's routes, with qcontrol engineering;
      • the violation tour, with c137.
Nov 11
  • Phase 2 complete: qnative c2 closed (2026-11-11, qnative 5f39b6d; Mark ruled it closes once the harness run is done).
    • The harness run: Claude Code (Sonnet 5.5, headless) connected to the app's guide with the launch's token. From one prompt it started the tour, opened Models by way of the sidebar, pointed at the model list and answered from the live rows. Ten turns, 18 s, no errors, nothing pressed (qnative harness-run.md).
    • c2's Outcome: the kit stretches as far as our own layer drawn on GPUI (D18). The section, the budget (24.2 MB binary, ~62 MB at rest, 48 MB in the tray after a close), the Tour stretch and D15–D20 are built. 122 captures.
    • The close: qnative's HISTORY.md started; c2's Visual record curated in qnative docs/images/cycle-history/.
    • Hand-ons:
      • D17's six routes go to engineering, through c134;
      • the violation tour goes to qnative c4, the messaging slice (c137 Phase 3);
      • the Status page comes from c132 Phase 4 as its worked example;
      • qnative c3 (Developer Mode, c138) is in the tree.
    • Next for c131: the V1 build, from c130's shape.md and c0's name.
Nov 11
  • 2026-11-11, night: c132's Status brief walked with Mark (D21): Status is the landing (the overview's micros move onto it; Inventory keeps its index); a Sensor page carries the five sensor facts in full, honest until D17's routes; an Activity page shows sessions over time as the plane app does; the log viewer stays Developer Mode's; the lab's state knob stays chrome. Sent to qnative c5 (which builds Status, Sensor, Activity in that order) and to c132 for the lab mock.
Nov 11
  • 2026-11-11, G1: shape.md accepted; D22 records the two states' sentences, the connected-state read rule and the working budget targets. Sent to qnative c5 (Status says the sentences) and c4.
Nov 10
  • synthetic data (2026-11-10): synthetic-data.md outlines the fixture world for the five pages: Meridian cut to one machine, the endpoint-only shapes the fleet world lacks, eight named worlds shared with the web demo, where it lives and how it is exported, and what it asks of the plane's data model.
Nov 10
  • sketch and story (2026-11-10): the app map drawn in the design system (app/pages/cycles/design/sketches/c131-app-map.vue, beside the DataNozzle sketch c131-data-nozzle.vue), to be captured as /cycles/design/c131-sketch-app-map.png and referenced under Why; the story module app/data/stories/c131.ts (D1–D14 and R7 as decisions, three outcomes, the credits from 1b21a3ce); the section The shape added above.
Nov 10
  • Phase 2 planned (2026-11-10): Mark called the spike a success and asked for a second phase that tests the kit's expressive range: the whole Inventory section (seven listings, nine details, the landing) in the Qpoint skin, on the data the web pages show, cut to one machine; stretch, the Tour guide and the Data Machine; extra stretch, the table with an expand row. phase2-prompt.md holds his words; phase2-plan.md holds the plan.
    • Two surveys behind it: the qdash Inventory section field by field, tagged one-machine, changes-meaning or fleet-only; and the Tour, Data Machine and expand-row components, read for what they need from the DOM.
    • Found:
      • The Data Machine and the expand row are on the main path. The Data Machine is the band and tiles on every Inventory page, and the landing is 20 micros. The expand row carries Tool and Skill invocations.
      • The Tour exists only in the lab, and Info View was never built.
      • The kit's DataTable has one fixed row height, so the expand row is built on GPUI's variable-height list.
      • GPUI's VisualTestAppContext captures a real window off-screen, so native stories become PNGs without Screen Recording.
      • No Inventory handler takes ?host= (c134 candidate gap row 31 confirmed).
      • The web's orphan Harness install detail is the page that is already about one machine; on the endpoint it merges into the harness page.
    • Six fleet → personal rules. The plan runs in ../qnative as c2. It bends D6's order and G1, and builds past D5 and R8 as an experiment.
    • Mark answered the four questions the same day:
      • our layer in Rust (crates/layer, the web names; D5 and R8 hold for V1 until the scorecard);
      • translate, with the harness pages merged;
      • the Tour stretch includes Info View and the qpoint-guide MCP driving the native app;
      • three review stops plus one per stretch.
    • Not kicked off; uncommitted.
Nov 10
  • Phase 2 kicked off, to review stop 1 (2026-11-10): runs in ../qnative as c2 (cycles/c2.expressive-range/CYCLE.md holds the detail).
    • The world. Meridian cut to priya-x1 (and chen-mba, and an empty world) through qdash's real ingest and handlers, by scripts/cut-world.py: 128 responses, 533 KB.
    • The types. Generated from qdash's TypeScript, 72 interfaces. A strict drift test over all 266 responses found five places where the handlers serve what the TypeScript does not say.
    • The data layer. The nozzle is generic, with typed repositories that ask qdash's own questions.
    • The token bridge. Design scripts/tokens-to-kit.mjs (c132's deliverable, built here) generates the Qpoint light and dark kit theme and tokens.rs from the layer's tokens.
    • The layer crate. A new crates/layer owns the skin.
    • Captures. Off-screen PNGs with no Screen Recording, through Window::render_to_image. Six are in the qnative atlas with surface: native: the gallery and tokens, light and dark, the stock kit for comparison, and a type diagnostic. This answers c132's open question of how medium B is captured.
    • Found and fixed. The bundled variable Inter drew every weight as regular, because GPUI picks faces by family and weight. On Mark's word, Inter 4.1's five static faces (regular, italic, medium, semibold, bold) were downloaded from the rsms/inter release and replace it, for 0.3 MB more. Each weight resolves to its own face (checked by units per em: Inter 4's 2048, not the system's Inter 3).
Nov 10
  • A Dev section and native component docs (2026-11-10, Mark's asks mid-phase).
    • layer::demos is the native counterpart of the design site's component pages: one page per component, its scenarios as live, stateful instances, and an event log proving the handlers fire. Ten pages so far, for the skin and the kit's components; ours join in step 3.
    • The app has a Dev group (debug builds, or --dev):
      • Tools: component demos on or off, appearance, the inspector, the data source.
      • Components: the docs.
    • The story windows got the title bar their drag needed. Headless tests prove the drag and the controls.
    • Detail in qnative c2.
Nov 10
  • Phase 2, to review stop 2: the first listing and detail beside the web (2026-11-10).
    • The layer in Rust: the Data Machine family, the small pieces, the page furniture, the ledger, and the Surface, each with a doc page of live scenarios and a scorecard row. Most rows are at fidelity 3 against the design site and qdash; DataRankedBars is at 2.
    • A router with history, the shared period and section anchors.
    • The pages: the Inventory overview, Harnesses, and the merged harness page (Sessions, Configured here, Surface), on priya-x1's data.
    • Compared with qdash on :3030 at the same width. The shell took qdash's nav width and its sunken canvas; the ledgers' columns now fit; the header's metadata now lines up. The jump pills now dock, after a fix for GPUI recording child bounds before the scroll offset.
    • Captures: sixteen more in the qnative atlas (threads p2-data, p2-harnesses).
    • Detail in qnative c2. Committed (qnative 6a919f4).
Nov 10
  • Phase 2: Providers, the provider page and the account page (2026-11-10).
    • Built to a spec measured on qdash at the same size.
    • Shared ledger and detail plumbing now carries every listing and detail.
    • Translated to one machine: users, instances and orgs leave. Tokens takes the account page's Users tile, and dual use is said of this machine.
    • Four of qdash's oddities are settled rather than copied.
    • Seven captures (p2-providers). Detail in qnative c2. Committed (qnative cd04f31).
Nov 10
  • Phase 2: Models and the model page (2026-11-10).
    • Built to a spec measured on qdash; the detail is all-time, as the web asks, and now says so.
    • The served default_on comes forward as "Default here".
    • Instances read as harness types; the provider is one ◈ chip.
    • Open: one arbitrary provider per model, from the server.
    • Five captures (p2-models). Detail in qnative c2. Committed (qnative 21ff05d).
Nov 10
  • Phase 2: MCP Servers and the server page (2026-11-10).
    • Built to a spec measured on qdash, all-time on the detail as the web asks.
    • The configured-versus-called gap is keyed on harnesses.
    • The served per-harness config comes forward as a Configuration section.
    • The Source filter can pick both.
    • Six captures (p2-mcp). Detail in qnative c2. Committed (qnative 5e9a7ee).
Nov 10
  • Phase 2: Tools, the tool page and the expand row (2026-11-10).
    • The extra stretch is reached: the table expand row at fidelity 3. It is a whole-row toggle with the tinted well and card, growing with qdash's easing, open rows held on stable keys.
    • The tool page puts Denied first, with its context, and opens each recent invocation on its arguments and output.
    • Eight captures (p2-tools). Detail in qnative c2. Committed (qnative fda7c25).
Nov 10
  • Phase 2: Skills, the skill page and the skill file (2026-11-10).
    • The plan's step 3f is in the layer: the editor frame, the file tree, a code block with the web's token table, and the Markdown preview.
    • The skill page reads each definition the way the harness does, flags drift in amber, and keeps bundle contents uncaptured.
    • Nine captures (p2-skills). Detail in qnative c2. Committed (qnative b25979d).
Nov 10
  • Phase 2: Repos & Workspaces and the workspace page (2026-11-10).
    • The last listing: all seven Inventory listings and their detail pages are now native.
    • Freshness runs on one clock, the newest session in the data; clones sharing a folder name are told apart by their parent directory.
    • Git stays uncaptured and the page says so. Capturing it locally is cheap, and is open for Mark.
    • Six captures (p2-workspaces). Detail in qnative c2. Committed (qnative 044bc32).
Nov 10
  • Phase 2: review stop 3, the section, the scorecard, the budget (2026-11-10). Written up in qnative's review-3.md (/cycles/qnative/c2/doc/review-3).
    • The scorecard:
      • 30 of 36 components drawn on GPUI, 28 at fidelity 3.
      • 2 kit as is, none composed from the kit.
      • The kit carried the shell, and our vocabulary was drawn. That is the evidence for the c130 D5 / R8 ruling, which waits on Mark.
    • The budget: both release builds measured in one session with c1's recipe.
      • Binary: 17.9 → 23.2 MB.
      • Window idle: 51 → 62 MB private. Tray: 15 → 21 MB.
      • CPU, wakes and startup unchanged.
      • 116 MB once every page has been shown: GPUI's atlases filling once, not a leak.
    • Open, for Mark:
      • the brand ruling;
      • the one-world side-by-side, which restarts the shared :7882 seed;
      • the rest of the extra stretch's list;
      • five per-page calls;
      • the atlases on close to tray.
    • Next: the Tour stretch.
Nov 9
  • stage 1 (2026-11-09): prompt and plan written from c130's split. CYCLE.md written before kick-off at Mark's request (c130 clarifying question 6). Rulings carried from the c130 walk the same day: three data sources (D3, D5), the repo at ../qnative (D1), the spike may start now, ports and bones in V1 (D8), a Status line for grants (D12), the plane connection (D13), the budget measured with strobe (R7).
Nov 9
  • 2026-11-09, later: Mark ruled the type: Inter, bundled, noted for the degrees of expression it gives (D14). Committed the same day.

c130 Native App (program)

Nov 11
  • 2026-11-11: a ninth cycle joins the program: c138 Developer Mode, from Mark's next objective for the native app. It amends D6 and D7 above at the page level (rulings 3 and 2 of its walk) and runs as qnative c3. The program map sketch still shows eight.
Nov 11
  • 2026-11-11, evening: the open questions across the program walked with Mark in session. D5 amended: our layer drawn on GPUI with our tokens, the kit for the shell (c131 D18). shape.md (Phase 2) ruled to be written now with provisional names by a fresh agent, for acceptance at G1. Kick-offs ruled, each with a fresh agent: c132 (Phase 0 with the named worlds, then the bake-off), c135 (Phases 0–1), c136 (Phase 0), c133 (Phase 0, the brief); c134 waits for the plane engineer's answers. c137's ten questions and c2's two review stops ruled the same evening (their records).
Nov 11
  • Phase 2 (2026-11-11): shape.md written by a fresh agent from the records as they stood that evening, with provisional names marked for c0: the app map with each page's qdash source and its one-machine cut, the two states and the sentence the app says in each, the DataNozzle with its three sources and the 2026-11-11 amendments, access and credentials with the pointer to c136's grants, the message channel's ports, bones and delivery modes, the budget with the spike's and c2's measured baseline and proposed targets per release, the brand as amended (our layer on GPUI, the kit for the shell), and the qmap trade-off table. D1–D10 with their rulings and every open question (c0, G1, Q1–Q12, the primer's items, Kamal's) are carried in so the document travels alone. Three proposals in it had no prior record and wait on Mark at G1: the local-state sentence, the connected-state rule for the nozzle (the plane for what it owns, local for what only this machine sees), and the budget targets.
Nov 11
  • 2026-11-11, night: c132 closed its loop: the medium picked (B, the stories crate, of record; A, the native skin on the design site, to sketch and review), the loop built (the native capture mode, clip and scale on capture.mts, /gpui-story, process.md) and Status run through it in A (the brief, eight captures, review-phase4 with S1–S6 taken by default); the process lives in CLAUDE.md §Native screens; later that night Status went through to B as well (qnative 273ada7: the page, the route, four stories, the D17 routes answered from a per-world bridge the footer names), so Status is the first page in both media. qnative c2 closed the same night after Claude Code walked the native guide from one prompt (its harness-run.md): c131 Phase 2 is complete. Hand-ons: the Status page to qnative c5 (the loop's push), the violation tour to qnative c4 with c137, D17's routes through c134.
Nov 11
  • 2026-11-11, Rune: Kamal and a colleague asked whether Rune (anomalyco/rune, a GPU-rendered Rust UI framework from Anomaly, 20 days old) should replace GPUI. Answered in Rune or GPUI?, a support page with the question, the reasoning step by step, the c2 scorecard as evidence, the workarounds GPUI cost us, and the pros and cons; the written note is research/rune.md. The answer: stay on GPUI Kit for V1 (28 of 30 drawn components at fidelity 3, so the look isn't restricted); watch Rune for its agent tooling and motion; borrow its --snap/--tree/--script and kit-diff ideas now; look again in 6 to 8 weeks with a one-day spike. Not a ruling.
Nov 11
  • 2026-11-11, G1 (night): Mark accepted shape.md at gate G1, with its three new proposals confirmed: the local-state sentence ("This machine runs on its own. The configuration lives here and you can change it. Here is what was found."), the connected-state rule for the nozzle (the plane for what it owns, this machine for what only it sees; Status and Events read both, Config, Connect and the inbox read the plane) and the V1 budget targets as working targets until Tyler sets them at G2. c131's full build and c133 are open. Recorded in c131 as D22.
Nov 11
  • 2026-11-11 → 11-12, the push: around G1 and into 2026-11-12 the children ran in parallel sessions, each recorded in its own cycle:
    • c138 (qnative c3): review stop 0 closed; Phases 1–3 built (the stream core, Source, Live Activity); review stop 3 with fourteen calls; ruling 10 on c6's info panel. The private repository qpoint-io/qnative was created and main pushed (ruling 7).
    • c131 Phase 2 (qnative c5): Status, Sensor and Activity under This machine (D21), captured per world; CI run 17 green on all three systems (2026-11-12).
    • c137 Phase 3 (qnative c4): the messaging slice to review stop 1, Mark's six rulings built.
    • c132 Phase 4: Status through both media; the bake-off wipes the lab's Status, Sensor and Activity over c5's build.
    • c133 Phases 1–5: the content model, the authoring pipeline, three pilots, the library and the hand-off to c134 and c131; D10–D37 ruled.
    • qnative c6 and c7: Panel Toggles merged into main; Web Rail opened.
    • What it all costs the machine is drawn on one page, Native App Footprint (c138's report, 2026-11-12): every strobe reading from the spike to c5.
    • Owed, on Mark's Mac: Mark's screenshot of the push's sessions not yet archived is in his local cycles/c130.native-app/, not pushed (the cloud session that wrote this entry could not reach it). Move it to public/cycles/design/c130-the-push-sessions.png and put it here, in place of this line: ![The push: the sessions not yet archived](/cycles/design/c130-the-push-sessions.png) with a one-line caption.
Nov 10
  • sketches and stories (2026-11-10): Mark asked that the public record carry visualisations of the structures we are building and the patterns we follow, in the medium of the design system. Built: a sketch kit (app/components/sketch/), a sketchbook at /cycles/design/sketches with eleven sketches (the topology as a qmap scene, the program map, the app map, the DataNozzle, the design loop, a training, the deployment, the scorecard, a grant, the channel, the naming map), each captured into its cycle's visual record; a hand-assembled story per cycle (app/data/stories/, the Story tab on every cycle page, drafts not yet reviewed by Mark); a ## The shape section in every CYCLE.md (the problem, the core idea, the pieces, the pattern, what stays open); qnative registered in the cycle atlas so c0 and c1 render. The session's work was verified clean first: the primer's eight files, c134's inventory, c137's three phases and lab pages, the spike's six commits with the workspace building and its tests passing. Committed.
Nov 9
  • kick-off (2026-11-09):
    • Cycle created from Mark's initial prompt, which asked for several cycles so each agent keeps a clean context.
    • Read: the 2026-11-05 session digest and transcript, the qdash UI's data-interface bible (its Transport pattern is the DataNozzle idea already), crates/qtray (macOS only today: tray-icon + tao + AppKit, a passive viewer over monitor inventory with click-to-tap), the qdash Rust API (38 /api/* routes), app.qpoint.io (Nuxt 4 SPA, Pinia, Firebase auth and Firestore, Pulse API, SAML routes), and the two framework sites.
    • Facts recorded in plan.md §Facts: GPUI Kit 0.9.1 by Longbridge on Zed's GPUI, Apache-2.0, three layers (gpui-component, gpui-base, gpui-shell), semantic theme tokens, headless UI tests, AccessKit, wasm builds, a /skills page and /llms-full.txt; Native Shell (TSX over a Rust core, native views per platform, GPUI as a target, embeddable in GPUI Kit apps, signed runtime modules). Neither landing page mentions tray icons, notifications or auto-update; that is the first research question.
    • plan.md written: the program map, four gates, c130's own Phases 0–4, decisions D1–D10 with defaults, questions Q1–Q10 for Tyler's working session, risks, and patterns to consider.
    • Children created at Stage 1 (initial prompt quoting Mark's words for that slice, plus a plan): c131 Native App V1, c132 Native Design Prototyping, c133 Remediation Training, c134 Control Plane Web App, c135 Component Cleanup. None kicked off; each plan names its gate.
    • CYCLES.md lists all six.
    • Uncommitted. Mark's rulings on D1–D10 and the clarifying questions are next, then Phase 1 (the primer).
Nov 9
  • rulings (2026-11-09): D1–D10 and the seven clarifying questions walked with Mark in session; the record is plan.md's Ruling column and Answers.
    • Hold: D1 structure, D2 GPUI Kit gpui-component, D3 outcome B, D4 a new sibling repo, D5 tokens-only brand, D7 five pages plus the tray, D10 medium decided in c132.
    • Changed: D6 three data sources (synthetic, local, plane; a base URL and a standardised credential for the plane); D9 the message channel's ports and bones ship in V1 (sender, receiver, native channels, overseer and citizen). D8 qmap stays a link in V1, conservative on purpose ("we can't spike usage"), with the trade-offs to be laid out in the primer and the shape.
    • New cycles: c136 Mechanic Access (time-boxed, categorised grants a partner gives Qpoint on their plane) and c137 App Messaging (one schema, the channels, the citizen's control), both at stage 1 with CYCLE.md; c0 "Call my name" in the native app's own repo, the naming cycle geared for a Mark–Tyler–agent session (Qplane is already the control plane's public name on www.qpoint.io).
    • The repo: ../qnative created as a Cargo workspace (provisional directory name); c131 Phase 0 may run beside the primer.
    • CYCLE.md written for every child (clarifying question 6); the candidate problem promoted in market-analyst as problem:enforcement-without-local-context (question 7); c133 carries a note only on hard-hat training and Metamythic (question 5).
    • Mark added strobe (anomalyco/strobe) as the footprint-measuring tool; recorded in plan.md Facts and c131 R7.
    • The founding docs re-read before drafting (methodology, philosophy, the self-critique, component philosophy, the brand foundation): a name is a problem formulation; a message is a module with purpose and protocol; "invisible when working, visible when needed" is the brief for c137 and for our own access in c136.
    • Next: Phase 1 (the primer) here, the c131 spike in ../qnative, c0's session with Tyler.
Nov 9
  • rulings, second round (2026-11-09): Mark confirmed the defaults in c136 and c137, and in c133 with one addition (a training can in theory block access, by default it does not, D9). Ruled Inter as the native app's type, bundled, noted for the degrees of expression the brand type gives (c131 D14). On who mocks native screens: both he and agents, at different times, so the c132 medium must serve both and every page state must end as a captured artifact. The layer takes the waiting-list extractions now, because app.qpoint.io's successor starts from a blank slate (c135 D8). c0: he does an initial pass on the names, the decision is made out in the open in the session, the date is Tyler's; the walk is prepared, not scheduled.
    • Kicked off c134 (Phase 0, the inventory) and c137 (Phases 0–2) in their own sessions; the primer runs in its own session (five of eight files written at this point); the c131 spike started in ../qnative.
    • Committed: design (the eight cycle directories, CLAUDE.md, CYCLES.md; the primer's research/ files are left to that session), market-analyst (the promoted problem, the rebuilt index and digests), qnative (initial commit, no remote).
Nov 9
  • primer (2026-11-09): Phase 1 written in its own session: eight files in research/ (README, gpui, gpui-kit, native-shell, platform, agent-tooling, claims, comparison), web reading only, every fact with its URL and the date read, the unverified marked as such; each renders at /cycles/design/c130/doc/research/<file>. research/README.md carries the one-page summary, the surprises and the open questions for Tyler's session (G2).
    • Found: GPUI Kit 0.9.1 (released that morning; weekly releases; renamed from gpui-component on 2026-09-03) pins Longbridge's gpui-pre snapshots because Zed's crates.io gpui froze at 0.2.2 in 2025-10; the docs count five layers, not three; 134 theme roles set from JSON; headless UI tests run on three OSes without a display; AccessKit is wired but no screen-reader run is on record; wasm is "Showcase only" on nightly. GPUI has no tray API and Zed closed two PRs for one, including the kit author's; tray, notifications, auto-update, login item, single instance and deep links are crates and our own code, catalogued per OS in platform.md with qupdate and qtray read against them. Native Shell 0.4.0 holds D2; its desktop features exist only on unreleased main. The comparison and the qmap D8 table rest on the measured figures that exist (Longbridge's own bench: a kit app at 72.7 MB peak on Windows; Tauri and Electron CI figures; one Chrome tab at 76 to 380 MB). Agents get two official skills (npx skills add longbridge/gpui-kit), Context7 indexes the kit, gpui-mcp pins an older gpui-pre, and strobe registers its skill and MCP with opencode, so Claude Code gets them by hand. Claims: Discord's move to GPUI was announced on 2026-11-04 (real, unshipped); Spotify did not; "Electron killer" is a blog headline with uncited numbers; GPUI is pre-1.0; Zed "braked" GPUI for outsiders in 2026-02 and the framework still moves weekly for Zed.
    • Surprised: the kit's release the same morning; gpui-pre, not gpui; no tray in GPUI at all; the kit's requirements page says macOS 15 while Zed's floor is 12; the kit's /skills page renders empty while skills.sh lists 19 and the repo ships 2; strobe shipped three npm versions in one day and has no GitHub release; Inter's variable file names its family "Inter Variable".
    • c131 D14 (Inter and Geist Mono, bundled) written into platform.md §9 with the kit's path: add_fonts at startup, font.family and mono_font.family in the theme. The "From the spike" section is the c131 session's to append.
    • Open for Tyler: research/README.md, fourteen items in three groups: product (the macOS floor, the tray on Windows and Linux and on tray-less GNOME, notifications in or out, the signing accounts and the updater, the accessibility stance, the deep-link scheme, D8 confirmed against its cost table), the spike's measurements, c132's medium.
    • The agent-tooling and claims research agent stalled after twelve calls; that part was researched directly. Committed: research/ and this entry.

c5 Status qnative

Nov 11
  • headless tests (2026-11-11, evening): a test per page state of This machine, and CI runs the suite (R6: the demo is the test). Sixteen #[gpui::test]s in crates/stories/src/main.rs (mod tests), each opening the shell the way its story does (app_status, app_shell_full, app_session_on) on a world read frozen, the forced state and the lean switch cleared first, the page's read landed and a frame drawn, then reading what the page says two ways: through the page's own API on a repo built the same way (SensorRead::sentence, State::word, SensorRead::why, found_words, sensor::facts, Repo::sessions, Repo::session) and through the tour layer's regions (layer::tour::find, the region's text). Per page: Status 6 (on-local on meridian-day90, degraded on pilot naming the sensor's two words, off and starting forced, connected over the in-process fixture plane with the footer naming it, fresh saying nothing found yet); Sensor 2 (the Version row served from the bridge; over the plane "not served yet (/api/sensor)"); Activity 2 (16 sessions in the 30-day window with the band, the usage row and 16 ledger rows; fresh saying no sessions captured yet); the session page 2 (the newest run with its grain, the reading column and the rail; a run not on record); the regions 4 (every region the app map names for status, sensor, activity, session is drawn, keyless or keyed). cargo test -p stories: 28 (12 before); cargo test --workspace --locked: 128 in the eight crates that hold tests, green on Linux in this session's container and on all three CI runners. The page-state tests run one at a time behind a mutex: the forced state and the lean switch are process-wide, as developer mode's.
    • The regions say their words to the guide (no test-only text; Info View and the guide read the same): status.state and sensor.state carry the word and why ("qcontrol on · degraded: … (part of what runs here is out of its sight: …)"), status.found its lede, sensor.facts its rows in one line (sensor::facts, facts_words), activity.list its empty words (DataTable::empty_words, the layer), session.reading the not-found sentence.
    • Repo::session answers None for a run the synthetic world carries no detail for (qdash's null), so the page's not-found state is reachable on every source. The trade-off is Mark's to rule: the worlds are cut to the 30-day window (review stop 2), so an all-time row older than that opens as "Session not found: no run with this id is on record here" rather than as a failed read naming the synthetic gap.
    • Found on the way: CI had never built on Linux or Windows. Every run on main (4–12) failed both at the debug build while macOS passed: crates/stories/Cargo.toml listed every workspace crate under its macOS-only target section (since c2), and tray.rs called with_icon_templated, the macOS backend's alone, on every OS. Both fixed (the tray draws the icon as given elsewhere). Linking the kit on Linux needs libxkbcommon-dev and libxkbcommon-x11-dev, which the workflow's package list already installs.
    • CI, run by run on the branch (workflow dispatch; macOS green in every one):
      • run 13: Linux and Windows built for the first time. Linux passed the tests and failed the lean check: its full release binary did not hold "Component demos" whole, so the check's control failed. Windows failed nozzle's a_stale_lock_is_not_found: the ladder could not check a pid there, so a stale lock read as Found.
      • run 14: the ladder checks a pid on Windows with tasklist (as kill -0 on Unix); that test passed. Windows then failed types' rfc3339_round_trips_to_the_millisecond: a SystemTime there holds hundreds of nanoseconds, so the fixture's …456789 came back …456700. The fixture is now whole hundreds; the function is unchanged.
      • run 15: the lean check names the Component demos tool by its description; Linux passed every step.
      • run 16: every OS passed every step, the Windows lean check included, and then the Linux job failed saving its cache with "No space left on device".
      • run 17: the workflow frees the Ubuntu runner's unused toolchains (.NET, Android, Haskell, CodeQL) first. Green on all three OSes, every step: the build, the workspace's tests, both release builds and the lean check, the binary size and the cache. Wall time per OS: macOS 4 min, Linux 26 min, Windows 36 min (the release builds dominate both). The push to main that carries this record runs the same workflow.
    • The workflow: .github/workflows/build.yml runs cargo test --workspace --locked as one step per OS (the --exclude app and -p app --lib pair is gone). No crate is scoped out on any OS. scripts/check-lean.sh stays.
    • Not attempted: captures and strobe (the Mac's).
Nov 11
  • Activity and the session page (2026-11-11, afternoon), at review stop 2 (review-2.md): after Mark walked review-1's calls (every one stood; call 9 built: a lock file whose URL nobody answers reads as off, 48d97df), the third page of D21 in Mark's chosen shape: band, history and ledger, with the session page now.
    • The worlds recut with every session's detail and Surface (2e9286d): cut-world.py crawls /api/sessions?run= and /api/surface?run=; 112 details; the contract test reads SessionDetail; the generator keeps an interface's index signature as a flattened extra map (no deny_unknown_fields there) and reads SessionEvent.output as a string or a token count (OVERRIDES). Worlds 1.1 → 2.5 MB. Design's copies are owed a sync-worlds.sh.
    • DataHistoryGraph in the layer (2e9286d, fit in 53e443c): the web's history graph drawn from flex boxes.
    • Activity (53e443c): pages/activity.rs, qdash's Activity on one machine (Users ⇄ Teams → harnesses; no user or host column; a row opens the session); the per-day rollup anchored on the rows; the status, harness and flagged filters client-side.
    • The session page (53e443c): pages/session.rs, qdash's detail page less the Device line and the Working section (the header carries the metadata); the transcript, raw events, Surface chips, rail, ledgers and the run's Surface, every string from an event or the row.
    • Routes Activity (/activity) and Session(run) (/activity/detail?runId=); the rail's group is Status, Sensor, Activity; the app map 23 pages; stories app-activity, app-activity-ledger, app-session, app-session-flagged; Repo::session, SurfaceScope::Run.
    • Captures (thread p2-activity): design scripts/shot-programs/c131-activity-native.json, ten captures into both atlases (design de64db8979).
    • Not ported: the day tip on hover; the Working section. The idle strobe re-read is still owed (Mark: when convenient, with him away from the Mac).
Nov 11
  • Call 9 ruled (2026-11-11, evening): Total Sessions stacks each day by the harness that ran, as c132's lab mock does, not compliant · non-compliant as qdash does; the flag stays in Recent Work's pill and filter. The Activity thread recaptured (design 705f44ee3f).
Nov 11
  • Review stop 2 walked (2026-11-11, afternoon): all eight calls ruled (review-2.md §Ruled). Built from them: app-activity-lean for the band bake-off; the synthetic world's clock shifted to today at load (nozzle::clock, the footer says clock +Nd; frozen in the stories and by QPOINT_CLOCK=frozen); the session details capped at the 30-day window and the worlds recut (1.7 MB); the lab's world copies re-synced by c5 (design 39953031a8); app-activity-today captured with the shift on (design d963d5a8a4; the lean capture retaken in 1ce2141fa0 once its switch outlived the shell's first render).
Nov 11
  • Status as the landing, Sensor, the states, the stories (2026-11-11, 12:46–13:20), at review stop 1 (review-1.md): built on design c132's own push of its Phase 4 (4d38192 the D10 bridge behind the synthetic nozzle, 21f6869 pages/status.rs and the app's asset source, 273ada7 the route, the rail item, four stories), reshaped by D21.
    • The state from the source and the data (S2): nozzle::process holds a forced state (off, starting) for the whole process; Repo::describe names it in the footer (process: forced off (dev)); Repo::base_url gives the plane line its address. The page derives: forced → that; the local source answering NotRunning → off; the sensor's served word (the bridge in synthetic worlds) → on · degraded · off · starting; nothing served → the coverage counters decide degraded; the source being a plane → connected. c132's StoryState flag in the page is gone. Developer mode's Tools page gained the Process state switch (as served · starting · off), dev chrome; devmode now depends on nozzle.
    • Status is the landing (D21 S1): pages/status.rs draws the header with the brief's sentence, the state line (dot, qcontrol, pill; why degraded on the line below), the plane line (reads this machine or HQ at its address, last sync or its honest gap, where the configuration lives; a link to Sensor), "What it has found" (c132's second band as it was), then the Inventory index's twenty micros through landing::index_section (the overview keeps its page). Route Status is qdash's Home /, the Inventory overview /inventory; Nav opens on Status; the extension fallback lands there. The rail's first group is "This machine" (Status, Sensor); the old header went, since the group carries its words. Icons: Status LayoutDashboard, Sensor Radar, Overview LayoutGrid (the asset source embeds the two the kit's default set lacks).
    • Sensor (D21 S3, S5): pages/sensor.rs, the three fact columns (the process; reads; configuration) each row served or "not served yet (route)", wrapped so the route reads whole, the note, and the log tail; SensorRead and state_line are shared with Status.
    • The app map and the tour: Status and Sensor pages first in guide/app-map.json (regions status.header/state/found/card/index/micro, sensor.header/state/facts/log); the Overview's route /inventory; the tour's first step lands on Status and points at its Inventory cards (status.micro).
    • The stories: app-status, app-status-degraded (pinned to pilot), app-status-off, app-status-starting (forced through nozzle::process after the shell is built), app-status-connected (the plane source: fixture-plane is now a library, fixture_plane::serve, and the stories serve the world once per process on loopback), app-sensor, app-sensor-connected. The app map test counts 19 pages.
    • Captures (step 5): design scripts/shot-programs/c131-status-native.json (thread p2-status, mirrored into design's atlas under c131): 12 captures, design 2c93e17eb8.
    • Commits here: 9b0bc16 (the groundwork: nozzle::process, base_url, the fixture plane as a library) and the landing step, which rode into 2e95f3a ("CLAUDE.md: the remote…", Mark's, pushed) because that commit was made from the shared index while c5's files were staged; 9b0bc16 also carries one hunk of c4's (Repo::world, uncommitted on its side), so HEAD builds once c4 commits its trait method. The c4 session was told twice (the shared files touched, then the stray hunk); no c3 session was running to tell.
    • Found on the way: two sessions in one tree share one index: a commit by either carries whatever the other has staged. c5 now stages a shared file as its own hunks on HEAD (stage_c5.py in the session's scratchpad), never the working file, and commits in the same minute it stages.
    • The budget (step 6): release builds of the shared tree read with strobe, Status at rest and after the walk of every Inventory page (review-1.md §Figures): 66.4 MB private at rest on 30021df and 106 MB after the walk; 108 MB and 91 MB on 2c01ebf; first render 328–408 ms; the binary 24.9 MB. The two at-rest readings were taken on a Mac in use and read 1.2 % and 3.2 % of a core at 100–330 wakes/s, while every page read 0.00–0.01 s of CPU over 20 s untouched and nothing on Status asks for frames; a reading on an idle Mac is owed before the figure stands. Against shape.md §6 (D22): at rest under the 80 MB window target, after every page over it (the GPU atlases, as in c2), first render under 400 ms in three of four starts.
Nov 11
  • D21 taken (2026-11-11, 12:45): the c130 session relayed Mark's rulings on S1–S6 (the table above): Status is the landing with the Inventory micros on it, the sensor facts and the log go to a Sensor page, an Activity page follows. The order is Status, Sensor, Activity.
Nov 11
  • kick-off (2026-11-11, 12:40): this record and the brief, verbatim. On reading the tree, design's c132 session was found mid-edit on Status's own paths (uncommitted, 12:33–12:37): the D10 bridge (crates/types/src/bridge.rs, crates/fixtures/bridge/*.json, fixtures::bridge, Repo::sensor/config/plane, the synthetic nozzle answering the three routes from the bridge and saying sensor: bridge in the footer), Route::Status with its path /status, the rail item under the header, pub mod status in pages/mod.rs and four story entries naming app::pages::status::StoryState, with status.rs itself not yet written. The brief here predates D10 (it asks for a "not served yet" block; D10 gives the worlds a bridge for the sensor's facts). Nothing of the page touched by c5 until the two sessions agree who builds what; the question is with the c130 session.

c2 Expressive Range qnative

Nov 11
  • Stretch: the Tour guide (2026-11-11, Mark: "Start the Tour"). Written up in review-tour.md; 22 captures, thread p2-tour.
    • A spec first (spec-tour.md, measured on the lab at design :3000, 1120 × 720, light and dark). It covers the v5 panel, the four focus modes, the callout and its placement, the glide, open-page's way, the colours, the Inventory part of the app map with the concepts, and 18 oddities to decide.
    • The engine (crates/layer/src/tour.rs):
      • .qp_id(..) with .key(..) and .text(..), a wrapper that adds no layout node and records the child's box in prepaint;
      • the overlay as the last deferred draw, which commits the frame and paints from it;
      • the ring as quads; Dim as an even-odd path with rounded holes; Fade as the same path in the page's background;
      • the callout (TourMarker, lg and sm, measured by the text system) and place() with the obstacle score;
      • the glide, on the scroller each region was drawn inside;
      • a row probe for the kit's sidebar items.
    • Pages name their regions:
      • bands key their cards, and tables key their rows (DataMachineGroup::qp, DataTable::qp, DataIndexSection::qp);
      • detail frames name the header, the pills and each section after its pill;
      • 17 detail tables are named.
    • The runtime (crates/app/src/tour/):
      • tours as serde data, mirroring c123's type;
      • facts worked out from the repositories, which texts, keys and routes name;
      • the v5 panel, docked or floating, minimized to the circle, with the driver pill;
      • follow the page.
    • The native tour, "What's on this machine": 7 stops and 9 steps over the Inventory, including one detail page reached through a fact and three spots.
    • The guide (crates/app/src/guide/):
      • the MCP endpoint in process: tiny_http on loopback, JSON-RPC, sessions, Origin checked, the 16 tools and the web's instructions translated;
      • the app map in JSON (16 pages, 108 regions, 13 concepts) with the web's search ported, its rows coming from the data;
      • Info View in the footer, native first.
    • Checked:
      • scripts/guide-check.py, 117 of 117: every page's regions, every step's targets;
      • a curl walk (mcp.sh): start mid-tour on a fact route, next, end, open-page with the way (1.8 s; the web measured 1.75), point, read-page;
      • 17 unit tests (route paths, facts, the map's search, the glide goal, placement).
    • Not checked: a real harness walking it from one prompt. claude -p failed on the CLI's expired login.
    • Budget: the release binary is 23.2 → 24.2 MB. Interleaved with the review-stop-3 build, the window at idle is unchanged: 63.0 against 62.9 MB, 0.007 % against 0.006 % of a core. A tour open costs nothing at idle.
    • Decided rather than copied:
      • callouts keep off the sidebar;
      • the guide's pointer gets a safe area;
      • Dim darkens in dark;
      • stops are looked up by number;
      • the first route the window shows isn't a move.
    • Open, for Mark:
      • a launcher on the pages;
      • the 488 px page beside the dock (grow the window by 420, or fix the bands' overflow);
      • the one-prompt harness run;
      • the endpoint on by default;
      • keyboard.
    • Waiting at this stop (design c131 D15–D17's hand-on): the worlds recut and renamed (nina-mbp the default laptop, priya's the pilot world) and the settings switch.
Nov 11
  • Hand-on from design: Mark's synthetic-data rulings (2026-11-11; design c131 D15–D17, c132 D6; design commits 37db577c7c, 4a3b885c0c, 5e28e844a5). It arrived as a file (handon-2026-11-11.md) because the cross-session message was held. It is folded in here and the file removed. The record is design's cycles/c131.native-app-v1/synthetic-data.md §Rulings. To act on them, in order:
    1. The default world is a quiet laptop (D15).
      • Recut meridian-day90 to nina-mbp: Frontend; claude-cli, cursor-cli and claude-desktop since day 36; no personal account, no shadow install, nothing in the arc.
      • Keep priya-x1's day-90 cut as its own bundled world, pilot: the violation tour switches to it.
      • scripts/cut-world.py --host nina-mbp --name meridian-day90 and --host priya-x1 --name pilot; BUNDLED grows to four.
      • The spike walk's ids, and the stories and captures that name priya's rows, move to pilot or to nina's rows.
    2. The world is chosen in the app's settings (D16).
      • Shown only while the source is synthetic; --world and QPOINT_WORLD stay for captures.
      • Built as one re-open path that Connect reuses (c131 D13). The RepoHandle global is replaced with a new Repo over the other world, and a generation counter is bumped.
      • Pages observe the global and load again; the footer, the tray and the tour's facts re-read.
      • A read from the old generation is dropped in load's setter.
      • Per-world UI state is reset for synthetic worlds and kept per source for local and plane.
      • The bundled worlds are parsed together into one OnceLock map.
      • No GPUI re-initialisation.
    3. The violation tour, the first native tour, comes with design c137.
      • Switch to pilot; simulate a bad event; watch the notices fire locally and tune what gets through.
      • The simulate step is the drill action (the tour's data keeps its place): the person presses it, and it injects an arc event into this machine's stream. The events are the paste scare (day 38), the secret-file read (day 88) or the incident (day 61); one tour or three.
      • The notices are c137's (rule R4's words: notice, attention, required) and its controls. The tour waits on c137 Phase 3; c0 names it.
    4. The six endpoint-only shapes become qdash routes (D17): typed in qdash's TypeScript and generated like the other 38, never hand-written in types. Until then, Status waits for them or uses a bridge marked as such.
    5. The lab reads the same worlds (c132 D6): keep the world file's shape ({ manifest, responses }, keys route?sorted-query) stable, or tell design when it moves.
Nov 11
  • Mark's rulings on both review stops, built (2026-11-11; design c131 plan.md D18–D20, relayed by design's c130 program session). Both stops are cleared. The work ran on branch c2/rulings in a worktree (../qnative-c2), because c3 Developer Mode had the shell in flight in ../qnative. It was rebased onto c3's 2f66b4b and builds on its extension seam, its settings file and its lean build. 13 captures, thread p2-rulings.
    • D18, the brand: amended to "our layer drawn on GPUI with our tokens; the kit keeps the shell". The scorecard is ratified as built.
    • D19, review stop 3.
      • No seed restart: the measured specs stand.
      • The five per-page calls are accepted as proposed. They're for the local source; nothing to build on synthetic data.
      • The extra stretch's four items, done:
        • A sticky header. StickyGrid paints the body first and the header after it, shifted down to the pin line. The pin line is the top of the scroller the table is drawn in (from the tour registry's stack, since a section may clip its rows), plus the band: 94 with the pills docked, 48 with the title alone, 0 on listings. Nested and quiet tables don't pin.
        • Keyboard and AccessKit. A click puts the cursor on a row and focuses the table. ↑ ↓ Home End move, keeping the row in view; ⏎ and Space open or follow; Esc closes the open row or lets go. Roles: table, row (index, selected, expanded), column header, cell, the X as a button. Two GPUI tests cover it.
        • Content-sized columns. A fixed column grows to its widest cell or label, measured at natural width a frame late, as HTML's auto layout does. The declared width is the floor, the cap twice it or 320.
        • The well and the rows. The well eases to its measured height over 300 ms and eases again whenever that changes, as when nested rows open. The quiet look (Findings): no purple rules, surface, stroke frames. The new-row flash: #FFFEF1 (primary at 5 % in dark) for a second, only for rows born after the first render.
      • The atlases. Measured first, as ruled. GPUI already frees a window's GPU memory with it: IOSurface 26 → 0 MB, IOAccelerator 20 → 2.4 MB. app::memory now lets go of the rest when the last window closes: the recoloured logos, the tour registry, the facts, and the allocator's free pages (malloc_zone_pressure_relief). The tray after a walk and a close went 57 → 48 MB, after a plain close 48 → 43; a tray-only start is 22. What's left is 13 MB of GPU memory the driver still owns but doesn't map, 2.4 MB IOAccelerator and 4–8 MB of heap.
    • D20, the Tour stretch.
      • The panel floats, locked to the window's right edge, never docked. It's 420 wide, full height, over the page, with the dock's side shadows. The page keeps its width, so widening the window reveals what the panel covers. When a step's highlight is mostly under it, the panel says to widen the window.
      • Keys while the panel has focus (given on start and on a click): ← and → move the tour, Esc closes it, and the mouse still works.
      • The endpoint is on by default, with a per-launch token. Every request presents Authorization: Bearer; anything else gets 401 with where to find the token. QPOINT_GUIDE_TOKEN fixes it for scripts. 117 of 117 checks pass with it.
      • Getting started (Help) is a sidebar group with the tours' launcher, the line that connects Claude Code with this launch's token (and Copy), and Info View. The map has the page and three more concepts: Tour, Guide, Info View.
      • The real-harness run is this session's, once Mark refreshes the CLI login.
    • The D15–D17 hand-on, done in this work:
      • D15: meridian-day90 is recut to nina-mbp (119 responses, 324 KB, from 2,280 runs and 37 scan events). priya-x1's cut is bundled as pilot (134 responses, 607 KB). Worlds are parsed per name on first use. Stories, the spike walk and the tests follow.
      • D16: the world is chosen in the tray's "Synthetic world" submenu (shown only while the source is synthetic), remembered in c3's settings.json beside the extensions, and honoured at start unless --world or QPOINT_WORLD says otherwise. Switching goes through router::show_world → router::reopen: the repositories are swapped and a generation moves on. The shell rebuilds the page, so its read runs again and a read in flight lands on a page that's gone; the footer and the tour's facts follow. GPUI is not re-initialised, and Connect can take the same path. QPOINT_SPIKE_WORLD=<s>:<name> drives it without a pointer.
      • Waiting: D17 (the six shapes as qdash routes) with qcontrol engineering; the violation tour with c137.
Nov 11
  • The real-harness run (2026-11-11, evening; Mark refreshed the CLI login). Written up in harness-run.md.
    • Claude Code 2.1.322 (Sonnet 5.5, headless) connected to the app's guide with this launch's token, through --mcp-config so nothing persisted in the user's config.
    • One prompt: "Give me the quick tour of what's on this machine, then show me which model costs the most and where I'd see that."
    • It ran tour-state, list-tours, find-in-app, start-tour, read-step, open-page (Models, by way of the sidebar) and point twice, read the region's text, and answered from the live rows. Ten turns, 18 s, $0.13, no tool errors; nothing pressed.
    • The window afterwards: on Models, Claude Code's callout on the model list, the last move recorded as the agent's.
Nov 10
  • kick-off (2026-11-10): cycle created from design's c131 phase2-plan.md after Mark's four answers:
    • our layer in Rust;
    • translate fleet to personal, with the harness pages merged;
    • the Tour stretch with Info View and the MCP guide;
    • three review stops plus one per stretch.

    gpui-kit pinned to =0.9.1 for the cycle.
Nov 10
  • step 1, the world cut to one machine (2026-11-10):
    • scripts/cut-world.py loads qcontrol's seed generator as a module and expands the Meridian streams in memory, without touching qcontrol's tree.
    • It keeps one host's records, ingests them through the qdash binary's real path into a scratch database, serves it, and crawls every request the Inventory pages make. That is the listings for 24h, 7d, 30d and all time, and every detail by its id.
    • The result is one world file per cut in crates/fixtures/world/:
      • meridian-day90: priya-x1. 8,952 of 49,996 run records and 105 of 734 scan records; 128 responses, 533 KB. Four harnesses (Claude Code, Codex and Cursor monitored, Ollama a shadow install), 5 MCP servers, 5 models, 3 providers, 4 skills, 23 tools, 85 sessions, 3 accounts.
      • minimal: chen-mba. 94 responses, 130 KB.
      • fresh: empty, 44 responses, 2 KB.
    • The spike's hand-written world is retired.
Nov 10
  • The type fixed (2026-11-10, on Mark's word to download):
    • Inter 4.1 fetched from the rsms/inter GitHub release (Inter-4.1.zip, sha256 9883fdd4…6b11e) into a scratch folder.
    • Five static faces from its extras/ttf/ (Regular, Italic, Medium, SemiBold, Bold; 2.09 MB) now replace the variable pair (1.79 MB) in crates/layer/assets/fonts/. They are the same 4.001 build, with the same licence.
    • The family is "Inter" in fonts.rs and in the generated theme.
    • Checked with QPOINT_FONT_CHECK=1 stories: 400, 500, 600 and 700 each resolve to their own bundled face (2048 units per em, Inter 4), not the system's Inter 3.015 (2816).
    • Captures republished.
Nov 10
  • Committed at review stop 1 (12cc30a, 2026-11-10).
Nov 10
  • A drag area (2026-11-10, Mark: "those apps don't appear to have a draggable area").
    • TitleBar::window_options hands the title bar's drag to the app (app_owns_titlebar_drag), so a window opened with it has no drag area unless it draws the kit's TitleBar.
    • stories --show drew none; it now draws one with the story's name. The app's window already had one.
    • Two headless tests prove it: a press and move on the title bar reach start_window_move (the test platform's unimplemented!()), and the same gesture in the body moves nothing.
Nov 10
  • The Dev section and the component docs (2026-11-10, Mark: a dev or admin section to switch dev tools on and off, its first tool a component demo page; then "the equivalent of our component documentation pages … all the components in context working with multiple instances for testing all scenarios at a glance"):
    • layer::demos. The native component docs: one page per component, with a header, an event log of the last interactions, and scenario cards (variants, sizes, states, empty, minimal, typical, overflow), every instance live and stateful.
      • Ten pages. Skin: Tokens and type, Overview. Kit: Button, Switch and Checkbox, Tabs, Tag and Badge, Progress, Alert, Table, Honest states.
      • Our components join as step 3 builds them. Example data, as the web _demos use.
    • The app's Dev group. On in debug builds; --dev or QPOINT_DEV=1 in release.
      • Tools: component demos on or off; appearance (follow the system, light, dark); GPUI's element inspector (⌥⌘I, debug builds); the data source.
      • Components: the docs listed by group, each page built once and keeping its state.
      • The window now follows the system's appearance while it runs.
    • app split into a library and a thin binary, so stories render real app pages: app-harnesses, app-dev-tools, app-dev-components.
    • The stories crate reads the same registry, so every doc page is a capture.
    • Tests. Three headless tests click a switch, a button and a tab on their doc pages and read the page's event log back (GPUI debug_selector bounds). 18 workspace tests pass.
    • Captures. Six in the atlas (thread p2-dev).
    • Not yet: the dev settings are not saved between runs.
Nov 10
  • Committed (d3a87cb, 2026-11-10).
Nov 10
  • The layer in Rust: the plan's step 3, as far as the Harnesses pages need (2026-11-10).
    • The Data Machine family (layer::data): DataMachine, DataMachineGroup with its rows lined up across the band, DataMachineMicro, DataIndexSection with its auto-fill grid measured from its own width; the devices DataRankedBars (every layout), DataSegmentBar, DataDonutChart (canvas arcs), the spark; the web's number formatting ported with its quirks and tested.
      • Subgrid became one flex row per grid row with its tracks stretched; fit-content(45%) became two flex columns with fixed row heights; auto-fill reads a width probe one frame late.
    • Small pieces (layer::ux): UxPill, ProjectedBadge and ProjectedRing, StateEmpty and FilterNoMatches, AgentAvatar (the web's logo registry and name resolution; single-colour logos repainted per appearance), the entity chip.
    • Page furniture (layer::nav): PageHeader, ActorHeader with its metadata grid, NavJumpPills, the sticky band's backing.
    • The ledger (layer::table): DataTable as Qpoint draws it (not the kit's), DataListingBar with its quick filter and column picker.
    • The scorecard (layer::scorecard): one row per web component the section uses (how it was built, fidelity 0–3 against the design site's demo, what GPUI lacked and what stood in), shown on each doc page and as its own page.
    • Eight more doc pages with live scenarios; two more headless tests (a ledger sort, a quick filter).
    • Checked against qdash on :3030 side by side; most rows are at fidelity 3, DataRankedBars at 2 (stacked labels end in an ellipsis where the web breaks words).
    • Captures: seven (thread p2-data).
Nov 10
  • Shell, router and the first pages: the plan's steps 4 and 5 to review stop 2 (2026-11-10, Mark: "continue as we planned").
    • The router (app::router): a Route enum with history (the title bar's back and forward), the shared period (24h, 7d, 30d, All; 30 days by default, c128), and anchors: go_to(route, "surface") lands on a section once it has laid out, as the web's #sec-… does. The spike's one-shot inventory read and its three plain tables are gone.
    • The pages (app::pages): each reads through the repositories on the background executor and draws loading, failed and empty honestly. Built: the overview (twenty micros from the seven listings), Harnesses, and the merged harness page. The six other listings say they are next rather than showing blank.
    • The merged harness page (Harness detail and Harness install detail, ruled in the Q2 answer):
      • The identity header: Status (qdash's Coverage, said as monitored or shadow) and the metadata with the install's long tail behind Show All Metadata.
      • Tiles: Providers, Tokens by model, Spend.
      • Jump pills over three sections. Sessions: 40 on this machine, sortable, ten then Show all. Configured here: the install's MCP servers and skills. Surface.
    • DataSurfaceSection and DataSurfacePanel (layer::data::surface, the plan's step 3e), to a spec measured on qdash's Harness page:
      • Framed panels with label columns as wide as their widest label and flat 15 % primary bars under Intl-compact counts.
      • Row hover and click; Show all, Only show top N, Show more (50 of N), View all N →; the configured chip, the tool kind pill, the folder and GitHub marks.
      • On one machine the Users, Teams and Versions panels leave (one person, one install, one version).
      • A doc page with its scenarios; four scorecard rows at fidelity 3.
    • Beside qdash at 1120 × 720 (the same content width, 844 px), and fixed:
      • Shell: the nav column is 212 px on the subtle sunken tone, and the page canvas is surface-sunken, so cards, panels and table rows sit on it as they do in qdash.
      • Ledgers: the column widths now fit.
      • The harness header: its metadata labels and values line up as two columns, and it keeps only Status, with "last active 132d ago" (qdash's ago(), ported and tested).
      • The overview: "Harnesses here" lists the most-used first, and the MCP servers bar uses the default palette.
      • The jump pills now dock and the scroll-spy follows. GPUI records a scroll container's child bounds before it applies the offset, and the page had subtracted the offset a second time.
    • Tests: 26 workspace tests pass (new: Intl compact, ago).
    • Captures: nine (thread p2-harnesses): the overview, Harnesses light and dark, the harness page at its top, Sessions, Configured here and Surface (light and dark), and the Surface doc page.
    • Not yet: the sticky table header does not pin, and the dev settings are not saved.
Nov 10
  • Committed at review stop 2 (6a919f4, 2026-11-10).
Nov 10
  • Providers, the provider page and the account page: the plan's step 5.3 (2026-11-10, Mark: "Commit, then Providers").
    • A spec first (spec-providers.md, measured on qdash at 1120 × 720): every tile, header cell, metadata pair and ledger column of the three pages, with its formula and verbatim copy, the fleet-only parts flagged, and nine oddities to decide rather than copy.
    • Shared plumbing, so the next listings don't repeat themselves:
      • pages::ledger::Ledger holds a table's sort, quick filter and column picker, and wires the layer's DataTable and DataListingBar back to the page.
      • pages::detail::Detail holds a detail page's scroll, docked band, scroll-spy, jumps and route anchors.
      • Harnesses and the harness page moved onto both with no visible change.
    • The listing:
      • The band: Providers with its concentration line, Tokens excluding cache, Spend with its top three.
      • The ledger: provider, models, harness types, accounts, API requests, tokens · share, spend, last used. The users column leaves.
    • The provider page:
      • The header: Spend and the metadata. Harness instances, users and orgs leave.
      • Tiles: API requests, Tokens, Spend, and Accounts (org-scoped, unscoped, by auth).
      • Ledgers: Models, Harnesses and Accounts. An account is typed company (grey pill) or personal (amber badge), and its row opens it.
    • The account page:
      • The header: what the account is, and its provider.
      • Tiles: Harnesses, Sessions, Tokens and Spend. Tokens takes the place of the fleet's Users (rule 6).
      • Attention: dual use (said of this machine), a personal plan, runs with no identity.
      • The harness-type chips, and Sessions.
      • The Users ledger, the instance ledger and the Shared row leave.
    • Oddities settled rather than copied:
      • Models sorts by tokens; qdash's initial sort matches no label.
      • The accounts ledger's auth column sorts on the method.
      • The account's Sessions tile names providers by label, and its Auth pair names the method.
    • New in the layer:
      • account_type, personal_badge, harness_chip and recency_dot (qdash's active, idle or stopped).
      • DataTable columns take a least width. Past it the grid scrolls sideways, as qdash's Providers ledger does at this width (its declared widths sum to 1020 px in an 844 px box).
    • Found and fixed: the story captures could show a page still loading.
      • An off-screen window gets no display-link frames, and render_to_image reuses the last drawn scene. A read that landed after the second frame was never drawn.
      • The stories now draw a frame at every settle step.
    • Captures: seven (thread p2-providers). 26 tests pass.
    • Committed (cd04f31).
Nov 10
  • Models and the model page: the plan's step 5.4 (2026-11-10, Mark: "Commit, then Models").
    • A spec first (spec-models.md, measured on qdash at 1120 × 720). It found that the model detail never sends a period: the web asks /api/models?model=<id>, all-time, which the world already holds.
    • The listing:
      • The band: Models (top three by tokens and Other), Tokens excluding cache, Spend with its top three.
      • The ledger fits 844 px without scrolling, as qdash's does.
      • The instances column becomes "harness types", the users column leaves, and the provider is one ◈ chip that opens its page.
    • The model page:
      • The header with Spend, and the metadata.
      • Default here: the installs on this machine whose config defaults to the model. It is served, unused on the web, and comes forward under rule 5.
      • Tiles: API requests, Tokens, Spend, saying "all time" as the web's do not.
      • Harnesses: the instances rolled up by type, as qdash's modelHarnessRows. There are no jump pills, as on the web; the title still pins.
    • Oddities settled:
      • The listing subtitle no longer claims all-time for a windowed feed.
      • The provider is shown one way, a ◈ chip that opens its page, where qdash shows it three ways.
      • "Harnesses" means types throughout.
      • Every ledger cell is 13 px.
    • Open: the server keeps one arbitrary provider per model. Sonnet reads Cursor on priya-x1, though Claude Code also calls it through Anthropic. Showing every provider needs the provider pages' models_detail, or a field the plane does not serve.
    • The provider page's model rows and the harness Surface's model rows now open the model page.
    • Captures: five (thread p2-models). 26 tests pass.
    • Committed with the Models commit.
Nov 10
  • MCP Servers and the server page: the plan's step 5.5 (2026-11-10, Mark: "Commit, then MCP Servers").
    • A spec first (spec-mcp.md). The detail asks only ?server=<name> (all-time), and the world holds it.
    • The listing:
      • Every server is typed by which side knows it: observed, configured or both.
      • The band: Count (observed / configured-only), Tool Calls and Tools Used, with their ranked bars below the value, where they have room.
      • The ledger: harness types (not instances) and the number of configs, with tools in the column picker.
      • The Source filter offers the values present in the data; the web's static list can never pick both.
    • The server page:
      • The Source cell, with what the source means.
      • The harnesses here whose config registers it.
      • All-time tiles: Tool Calls, Denied (red above zero, qdash's zero tolerance), Tools Used, In configs.
      • The gap line, keyed on harnesses rather than hosts: configured in, called from, configured but never called, called without config.
      • Tools, then Harnesses rolled up by type. The whole-run tokens and spend the web set beside per-server calls are dropped.
    • Configuration, new: the served per-harness config (transport, command or URL, the env and header key names; values are never collected), which the web computes and has not shown since c102 (rule 5).
    • OAuth: kept in the metadata as served. The spec found it is the latest event across the fleet whose host matches the server name; to verify before it reads as a per-server fact.
    • Shared: pages::rollups::by_harness_type (qdash modelHarnessRows), now used by the model page and the server page.
    • Captures: six (thread p2-mcp). 26 tests pass.
    • Committed with the MCP commit.
Nov 10
  • Tools, the tool page and the expand row: the plan's step 5.6, with the extra stretch (2026-11-10, Mark: "continue with whatever is next").
    • A spec first (spec-tools.md), with the expand row measured open on qdash: the layer API, the geometry, the timings, and what a sort or a poll does to open rows.
    • The expand row (layer::table):
      • Row::details(…) and DataTable::expand(open, on_toggle): a whole-row toggle, many rows open at once.
      • The 4 px primary rules, the open row framed in primary at 40 % with 32 px gutters, the tinted well, the surface card (radius 12, padding 24, shadow) with its X.
      • It grows over 300 ms with qdash's ease-in-out-quint (an animated max height, released at the end); closing is instant, as the web's is.
      • The page holds the open keys on stable ids, so a sort or a refresh keeps rows open. The web keys on the list index, so a new call closes every open row.
      • Not copied: the 200 ms empty strip before the growth, the bold cells, the X over the text, the dead light-mode cream.
      • Not yet: keyboard focus on the row.
      • Its own doc page, a scorecard row at fidelity 3, and two headless tests (open, close).
    • The listing:
      • The band: Tool type by kind, Invocations with its top three below the value, Success Rate with its outcome donut.
      • The ledger: kind pills, a ⇄ server chip that opens the server, outcome tags, harness types.
      • The quick filter: Type and MCP server, with values from the data.
      • A skill row goes to Skills.
    • The tool page:
      • Denied as the headline, red above zero, with its context line "of N invocations" (the web computes it and leaves it out).
      • All-time tiles: Invocations, Success Rate with its donut, Harness types.
      • Harnesses by type.
      • Recent invocations: decision tags, outcomes and durations, and the expand row on the arguments and output as captured.
    • Oddities settled:
      • A Success Rate with nothing judged reads "—" (the web's spins forever).
      • Denied keeps the warning amber in tags and donuts and the error red only as a headline alarm, as on the MCP page.
      • The header dot uses the shared recency.
    • Captures: eight (thread p2-tools). 28 tests pass.
    • Committed (fda7c25).
Nov 10
  • Skills, the skill page and the skill file: the plan's step 5.7, with step 3f (2026-11-10, Mark: "continue with whatever is next").
    • A spec first (spec-skills.md). The detail sends the period, unlike the other details, and the world holds it. Only SKILL.md has text: bundle files are an inventory, never their contents.
    • The skill file in the layer (layer::editor):
      • EditorFrame: the 240 px tray with its label, tree and caption beside the pane, which has one tab and the toolbar.
      • FileTree: folders from paths, files before folders, Lucide glyphs by extension (the kit carries the whole catalog), ⚙ executable, ○ bundled only, folders that close.
      • tab_group: the Preview / Source switch.
      • CodeBlock: a line-number gutter that stays put while the code scrolls sideways, and a marked line. Highlighting is a line tokenizer for the four grammars the web registers (Markdown with YAML front matter and fenced code, YAML, bash, JSON), mapped to the web's highlight.js token table.
      • markdown: the Preview, with headings two levels down, lists, quotes, rules, fenced code, inline code in mono, bold and links.
      • A doc page, five scorecard rows, and two tests (multibyte text, block parsing).
    • The listing:
      • In configs, against this machine's harness installs.
      • Invocations: the honest zero.
      • Skills by harness with Drift beside it, a segmented switch in the card's title where the web has a select. The fleet's Team and People views leave.
    • The skill page:
      • The header: In configs, and Definitions in amber when the copies disagree.
      • Two tiles.
      • Definitions: the segment bar and the delta in words. A pick scrolls to the editor.
      • The editor: Preview decodes the front matter into pills (invocation, invoke as, tools, scope); Source rebuilds the file from its entries and body under the real sha256.
      • The inventory card for bundle files, whose "show in source →" marks the line.
      • Installs: one row per harness install, with its definition.
      • The candidate Sessions, and the honest runtime box.
    • Oddities settled:
      • The Installs ledger sorts by sessions.
      • The scope pill names the picked definition's harnesses.
      • The fold appears whenever it cuts.
      • The prose marks show: tinted, since GPUI text runs carry no outline. The web's outlines don't render either: its CSS feeds RGB triplets as colours.
      • The gutter stays faint in dark.
    • Found and fixed: the inline scanners sliced inside a multibyte "—". Every scanner now steps on character boundaries, with a test.
    • Open, for Mark:
      • A local app could show the real SKILL.md bytes and even the bundle's contents. The product rule today is "contents not captured: scripts can hold secrets", so it is kept.
      • The runtime pair (Harnesses, Recent invocations) is not built: no harness emits skill calls, and the world has none.
    • Captures: nine (thread p2-skills). 30 tests pass.
    • Committed (b25979d).
Nov 10
  • Repos & Workspaces and the workspace page: the plan's step 5.8, the last listing (2026-11-10, Mark: "continue with whatever is next").
    • A spec first (spec-workspaces.md). The detail is all-time, as the web asks (/api/workspaces?workspace=), and says so.
    • The listing:
      • The working directories of this machine's sessions: kind, workspace (name over path), harness types, tokens, spend, last active.
      • The band: Workspaces with its freshness bar, and the tokens and spend top three.
      • The column picker alone in the listing bar. One machine has no teams to filter by, so DataListingBar now draws its filter group only when there are keys.
    • The workspace page:
      • The header: the path, the harness types that work there, and the Git pair, which shows what is served and says "not captured yet" only when nothing is.
      • Tiles: Harness types, Tokens and Spend, all-time.
      • Sessions: harness logo, command, model, exit code in colour, started, duration.
      • Surface: Models, MCP servers, Tools, the skills on the harnesses that work here (joined through this machine's installs), and Harnesses by type.
    • Fleet → personal: the teams column and filter, shared, the Users and Hosts pairs, the Users ledger and the Users and Teams panels leave. Instances read as harness types.
    • Oddities settled:
      • One clock: freshness is measured against the newest session in the data. The web mixes the browser's clock with the data's window and reads "0 active".
      • A folder name shared by two clones is told apart by its parent directory, in the bars and the table.
      • The freshness bar uses the default slots, not the ordinal purples.
      • The Sessions ledger carries the harness logo and the exit code like its siblings. The header dot uses the shared recency.
    • Open, for Mark:
      • Git is not captured. On one machine git -C <cwd> is cheap, and the four places that project git (the provenance count, the kind column, the header pair, the subtitle) would change together. git_text already reads a served value.
      • The last-active cell keeps the app's wall-clock "ago", as every page does, so the frozen synthetic world reads 132 d while the bar counts it active.
    • Captures: six (thread p2-workspaces). 30 tests pass.
    • The section is complete: all seven Inventory listings and their detail pages are native.
    • Committed (044bc32).
Nov 10
  • Review stop 3: the section, the scorecard, the budget: the plan's step 6 (2026-11-10). Written up in review-3.md.
    • The scorecard: 36 rows.
      • 30 drawn with GPUI primitives: 28 at fidelity 3, 2 at fidelity 2 (DataRankedBars' stacked labels, Skill Markdown's outlines).
      • 2 kit as is: Lucide and the segmented tabs.
      • None composed from the kit.
      • 3 not built yet: no page needed them.
      • 1 translated away.
      • The kit carried the shell. Our vocabulary was drawn: about 5,400 lines of components and 2,250 of doc pages.
    • The budget: c1 and c2 release builds, one session, c1's recipe.
      • Binary: 17.9 → 23.2 MB, of which ~1.1 MB is assets.
      • Window idle: 51 → 62 MB private. Tray: 15 → 21 MB.
      • CPU, wakes and startup are unchanged (262 → 254 ms).
      • After every page has been shown once: 116 MB, 46 MB of the growth on the GPU. It levels off over four walks, so it is not a leak.
    • New spike hooks: QPOINT_SPIKE_WALK_AFTER and QPOINT_SPIKE_WALKS.
    • Open, for Mark:
      • the brand ruling (c130 D5, c131 R8);
      • the one-world side-by-side, which restarts the shared :7882 seed;
      • what remains of the extra stretch's full list;
      • five per-page calls;
      • the atlases on close to tray.

c1 Spike qnative

Nov 10
  • step 5, CI for three OSes (2026-11-10): .github/workflows/build.yml builds the workspace in debug and release on ubuntu-24.04, windows-latest and macos-latest with dtolnay/rust-toolchain@stable (Rust 1.95 or later is the real floor), the Ubuntu packages from the kit's Installation page plus libdbus-1-dev for the ksni tray backend, cargo test --workspace --exclude app for the headless crates, and the release binary's size. The repository has no remote, so the workflow has not run; the file records the expectations: macOS builds (it is where the spike ran); Linux should compile (a build needs no display; a run needs Vulkan 1.3 and a session); Windows is the least certain, since the kit's Windows backend and tray-icon's Win32 message loop have not been exercised together anywhere public. Results go here when a remote exists.
Nov 9
  • kick-off (2026-11-09): cycle created; workspace manifests for app, nozzle, types, fixtures, fixture-plane; GPUI Kit 0.9.1 docs (llms-full.txt, 100 831 lines, and the /skills page, which lists no skills for 0.9.1) and strobe's README and skill fetched before any Rust. Found on reading: the kit's Theme::update plus cx.text_system().add_fonts is the bundled-font path; the Sidebar and DataTable components exist in the styled layer; NativeMenu is AppKit on macOS and a drawn fallback on Linux; the kit documents no tray.
Nov 9
  • step 1, the hello app (2026-11-09): cargo run -p app opens one window (1120×721, centred) with the kit's TitleBar, a Sidebar (Harnesses · MCP servers · Skills) and a DataTable per listing, bound to a 12-row world bundled in fixtures; the footer names the source. types mirrors qdash's Harness, McpServer and Skill from ui/app/types/api/*, field for field. Inter 4.1 (OFL, crates/app/assets/fonts/) is registered with cx.text_system().add_fonts before the window; all_font_names() lists "Inter Variable" (the name inside the file, not the file name) and Theme::update takes it: bundled fonts are two calls, the kit's docs are right. Found: gpui-pre 0.3.12 uses std::hint::cold_path, stable since Rust 1.95, so the kit's stated floor (1.92) is wrong and Homebrew's Rust 1.94.1 could not build it; upgraded to 1.99.1. A full debug build is about three minutes for 424 crates on an M2 Max. API surprises against the docs: Sidebar::new takes an ElementId; TableDelegate::render_empty takes &mut self; copy, dump and the default accessibility label read cell_text, not what render_td draws; gpui_kit::open_window returns (AnyWindowHandle, Entity<V>). Verification: Screen Recording is not granted to the session that ran this, so the window was proven with a CoreGraphics window list (one layer-0 window, 1120×721) and a QPOINT_SPIKE_DUMP=1 dump of the three tables, not a screenshot.
Nov 9
  • step 2, the tray (2026-11-09): tray-icon 0.26.1 (the crate qtray uses, two minors on) is created inside Application::run's callback, where AppKit's loop is already running, as the crate requires. Menu clicks travel AppKit → MenuEvent::set_event_handler → an unbounded futures channel → a GPUI foreground task that calls back with &mut App; the AppKit side never touches GPUI. The two loops coexist on macOS: with the window open, CoreGraphics lists two windows for the process, the main one (layer 0, 1120×721) and the status item (layer 25, 38×24 at the top right). QuitMode::Explicit keeps the process alive when the last window closes; the app then steps to ActivationPolicy::Accessory; the tray's Open path reopens the window, switches back to Regular and activates; cx.quit() ends the process and the status item goes with it. gpui-pre 0.3.12 has every lifecycle call platform.md listed as unverified: QuitMode, set_activation_policy, on_reopen, activate, hide, set_menus, set_dock_menu, on_open_urls, set_app_identity. Verified with env hooks (QPOINT_SPIKE_CLOSE_AFTER, _REOPEN_AFTER, _QUIT_AFTER) and the window list at 1.5 s, 5 s, 9 s and 13 s; the one hop not exercised without a pointer is the AppKit click itself (clicking "Open Qpoint" prints tray: Open requested from the menu). D7's fallback (qtray stays and opens the app) is not needed on macOS. The icon is the brand symbol, black, 36 px, drawn as a template so macOS tints it. Surprises: png 0.18's output_buffer_size returns Option; with_icon_as_template is deprecated for with_icon_templated; Application::on_reopen borrows the builder rather than chaining. Linux is wired with the ksni backend (no GTK loop) and Windows with the default; CI is the first place either builds.
Nov 9
  • step 3, the nozzle (2026-11-09): nozzle carries the DataNozzle trait (one method per served listing, inventory() assembles them), the Switch (--data synthetic|local|plane, QPOINT_DATA; --plane-url, QPOINT_PLANE_URL; QPOINT_PLANE_TOKEN; arguments win over the environment; the default follows the build, D3) and three transports: Synthetic over the bundled world, Local over qdash's loopback API (it reads the URL from <data dir>/dash/qdash.sock.lock, the way qtray does; no qcontrol crate linked), Plane over a base URL with Authorization: Bearer. Local and Plane share one ureq client and the route table in types::routes. fixture-plane is a tiny_http server over the same world at the same routes with an optional credential, so the third source is real before the control plane exists (D5). The app reads the switch once in main, keeps the nozzle in a GPUI global, loads on the background executor and hands the shell the inventory or the reason there is none; the footer names what describe() says. Exercised: synthetic and plane show the same 12 rows (data: plane (http://127.0.0.1:54979)); the right token passes and the wrong one is drawn as "failed: … answered 401"; local without qcontrol says "qcontrol's dashboard is not running on this machine" (there is no qcontrol data dir on this Mac); --data plane without a URL and --data real exit 2 with one sentence each; QPOINT_DATA=synthetic alone works. Nothing per page knows the source (R2); seven unit tests cover the switch and the honest states.
Nov 9
  • step 4, the footprint (2026-11-09 and 2026-11-10): strobe 0.26.0 installed with npm (no bun on the Mac; npx strobe up placed the binary at ~/.local/bin/strobe, the engine, a LaunchAgent daemon on 127.0.0.1:47575 that also serves MCP with a token in ~/.local/share/strobe/mcp-token, and the skill under ~/.config/opencode/skills/, since it looked for opencode and not Claude Code; registering the MCP in Claude Code from a session is refused by auto mode, so Mark adds it). Measured the final app, debug and release, windowed and tray-only, 60 s each with strobe attached by PID after a 5 s settle; footprint(1) and ps as the cross-check; startup from the app's own clock. The numbers are in README.md under Footprint: windowed idle 52–80 MB private (RSS 66–68 MB; the spread is GPU-backed surface memory that follows the display), tray-only 16 MB in both builds, idle CPU at or under 0.005% of one core with 0.3–1.2 wakes/s, first render at 264 ms (release) and 270 ms (debug), binaries 17.9 MB (release, stripped, thin LTO, 1.8 MB of Inter) and 122 MB (debug). What strobe refused and why: a launch-controlled record exe: of a windowed app that is not frontmost (needs an idle minute and the Accessibility permission), frames (Screen Recording), any bare executable whose ~/Library/Preferences/<name>.plist exists (AppKit wrote app.plist on the first run; measured copies under distinct names). The first attempt on 11-09 fell into the Mac's clamshell sleep after the two release recordings and was re-run awake on 11-10; only awake, unlocked readings are reported. Uncommitted until here: the QPOINT_SPIKE_NO_WINDOW hook that starts in the tray only, used for the tray-only rows.

c12 Micro Problems market-analyst

Nov 9
  • Sessions Oct 30, Nov 3, Nov 5 + session digests (2026-11-09): Mark asked for the latest Qpoint Product meeting parsed, then the two before it, then histories updated and the information made easy for design to reach.
    • Fetched: Nov 5 (1b21a3ce) by --uuid. Oct 30 (1253c25d) and Nov 3 (2fba742f) had been fetched on an earlier pass and left unextracted. Nov 2, 4, 6 and 9 were cancelled. The slot is now 22:00Z and no longer Mon/Wed/Fri, so list by subject.
    • Triage: all three declared ciso-advisory × roadmap-planning. Oct 30 and Nov 3 list design/phase4/mock/{compliance, compliance/detail, reports} as shown. Nothing is declared for Nov 5: Tyler shared GPUI kit and a tray sketch, which are not lab pages. Mark Peterson's shares on Nov 3 were competitor screens (Vanta, Wiz, Aikido), not artifacts.
    • Extraction: all PASSED; the index now has 16 calls.
      • Oct 30 (frameworks data model + reports): 18 observations, 7 decisions, 4 candidates.
      • Nov 3 (compliance scoring + reports): 14 observations, 10 decisions, 2 candidates. Three competitor mentions are missing a category.
      • Nov 5 (pricing tiers; control plane split from Qcontrol; native desktop app via GPUI as the likely first release): 18 observations, 9 decisions, 2 candidates. One productArea: performance is outside the vocabulary.
      • Cache read 14,176 tokens on the second call of the batch.
    • Standing: no moves (6 recurring / 9 observed). The new evidence lands mostly on prove-posture-over-time, plus safe-to-enforce, fleet-scale-compliance-state and a relayed web-ai-usage-blindspot.
    • Where it goes in design: Oct 30 and Nov 3 feed c123 (compliance frameworks) and c128 (reports). Nov 3 overrides Oct 30 where they differ: two-dimension scoring, track / not track, the coverage column dropped. Nov 5 feeds c130 (native app), created empty the same morning. Nothing has been written into design cycles yet.
    • Session digests, the new hop to design: pipeline/sessions.ts (npm run sessions, chained after npm run index) renders sessions/INDEX.md plus one page per call with a session record (13 so far).
      • Each page has the summary, decisions grouped decided / open / tabled with speaker and verbatim, ideas, to-dos, problem tags, candidates, source paths, and a "later sessions may override this one" line.
      • "Picked up by" comes from scanning briefs/ and design / bob-wire cycle markdown for the 8-char call id, the way design already cites sessions.
      • The digests are generated and never hand-edited. They are a read path, not the decisions ledger (product-input plan §D), which is still unbuilt.
      • Design's CLAUDE.md (Sister Projects) and brand/pipeline.md (stage 2c) point at sessions/INDEX.md.

c0 Call My Name qnative

Nov 9
  • kick-off (2026-11-09): created in design's c130 walk as this repo's first cycle. brief.md written: the five things to name, what exists (the q-family, Qplane's public page, the team's deploy/connect sentence, the c130 prompt's prompt, the corpus word counts across 205 first-hand and relayed items, six vendors' naming of the operator/endpoint/employee pieces), seven criteria from the brand, candidates per thing placed by the model each attaches to, the agent's proposal (the app is "Qpoint" to the employee with qlocal as the crate word; Qplane stays; plane as the third source; operator/HQ and you as the role words), a 60-minute session agenda, the checks, and patterns. Committed the same day (the repo's initial commit); no remote.
Nov 9
  • 2026-11-09, later: the team does a first pass on the names, and the decision is made out in the open in the session; the date is the team's to set, the walk is prepared, not scheduled. Added thing 6 to the brief: whether app.qpoint.io's successor keeps the hostname (proposal: the product is Qplane, the address stays).

Captures

473 screengrabs taken this week, 79 of a subject with an evolution history.

The library after a training taken on its own: the row reads Recorded, on your own

Back on Trainings after the take: Secrets in prompts reads Recorded, passed 3 of 3 on 1 November, on your own; Unapproved MCP servers stays recorded for F-A; Personal accounts for work still waits on F-C.
Back on Trainings after the take: Secrets in prompts reads Recorded, passed 3 of 3 on 1 November, on your own; Unapproved MCP servers stays recorded for F-A; Personal accounts for work still waits on F-C.
Phase 5 · the training library: the three trainings with the person's record, and one taken on its own, written with no finding and no assignerNov 12evolution →
F-I, the lab world's one finding under Consequential tool calls require approval (added 2026-11-13, marked c133): github.merge_pull_request ran without approval, #517 into main; Observed; the strip offers Ask before an agent sends or publishes, assigned to Hana on mac-eng-05.
F-I, the lab world's one finding under Consequential tool calls require approval (added 2026-11-13, marked c133): github.merge_pull_request ran without approval, #517 into main; Observed; the strip offers Ask before an agent sends or publishes, assigned to Hana on mac-eng-05.
F-I, the seed finding for Ask before an agent sends or publishes (Mark's ruling at the review-9 walk)Nov 13evolution →
Step 1 of 4 on F-I: Hana's Claude Code made a call through GitHub MCP during release branch cleanup; nothing was held, as Engineering observes.
Step 1 of 4 on F-I: Hana's Claude Code made a call through GitHub MCP during release branch cleanup; nothing was held, as Engineering observes.
F-I, the seed finding for Ask before an agent sends or publishes (Mark's ruling at the review-9 walk)Nov 13evolution →
The collection with nine trainings published, nothing withheld: the four c144's wave 1 wanted join; each passes the voice check, three with no finding in the base world, and the scene catalogue holds 35 drawings.
The collection with nine trainings published, nothing withheld: the four c144's wave 1 wanted join; each passes the voice check, three with no finding in the base world, and the scene catalogue holds 35 drawings.
The four trainings c144's wave 1 wanted: Approved model providers, Skills that update themselves, Ask before an agent sends or publishes, Unattended agents and their spendNov 13evolution →
Step 1 of 4, in the simulation S4 The public link: Jordan's Claude Code made github.create_gist, public: true, through GitHub MCP; it ran without anyone approving it.
Step 1 of 4, in the simulation S4 The public link: Jordan's Claude Code made github.create_gist, public: true, through GitHub MCP; it ran without anyone approving it.
The four trainings c144's wave 1 wanted: Approved model providers, Skills that update themselves, Ask before an agent sends or publishes, Unattended agents and their spendNov 13evolution →
Step 2, Which calls should wait for you: reading, searching and drafting stay on the machine; sending, posting, publishing, deleting and a command that reaches out act on the world.
Step 2, Which calls should wait for you: reading, searching and drafting stay on the machine; sending, posting, publishing, deleting and a command that reaches out act on the world.
The four trainings c144's wave 1 wanted: Approved model providers, Skills that update themselves, Ask before an agent sends or publishes, Unattended agents and their spendNov 13evolution →
Step 4, What to do instead: keep the agent asking, say how in the request, read where a call goes and who can open it before approving it.
Step 4, What to do instead: keep the agent asking, say how in the request, read where a call goes and who can open it before approving it.
The four trainings c144's wave 1 wanted: Approved model providers, Skills that update themselves, Ask before an agent sends or publishes, Unattended agents and their spendNov 13evolution →
Step 1 of 4, in the simulation S3 The secrets stealer: Kofi's Claude Code loaded repo-tidy 1.5; the team reviewed and pinned 1.4; recorded, as the check cannot stop a load.
Step 1 of 4, in the simulation S3 The secrets stealer: Kofi's Claude Code loaded repo-tidy 1.5; the team reviewed and pinned 1.4; recorded, as the check cannot stop a load.
The four trainings c144's wave 1 wanted: Approved model providers, Skills that update themselves, Ask before an agent sends or publishes, Unattended agents and their spendNov 13evolution →

Activity on one machine: the band (sessions per day, tokens and cost by harness), the usage row, Recent Work

fresh: no sessions captured yet; the band at zero, the usage row empty, the ledger's honest line.
fresh: no sessions captured yet; the band at zero, the usage row empty, the ledger's honest line.
Phase 2 · Activity and the session page in the real app, per world, mirrored from the qnative atlas (D21)Nov 12
nina's Activity without the band: tokens per day for the top providers, models and harnesses, then Recent Work; the counts live on Status's found-here set.
nina's Activity without the band: tokens per day for the top providers, models and harnesses, then Recent Work; the counts live on Status's found-here set.
Phase 2 · Activity and the session page in the real app, per world, mirrored from the qnative atlas (D21)Nov 12
nina's Recent Work: harness, model, tools, session, started, duration, workspace, tokens, spend; a flagged row carries its worst flag.
nina's Recent Work: harness, model, tools, session, started, duration, workspace, tokens, spend; a flagged row carries its worst flag.
Phase 2 · Activity and the session page in the real app, per world, mirrored from the qnative atlas (D21)Nov 12
priya's Recent Work: 31 rows in the window, the flagged ones marked; a row opens the session.
priya's Recent Work: 31 rows in the window, the flagged ones marked; a row opens the session.
Phase 2 · Activity and the session page in the real app, per world, mirrored from the qnative atlas (D21)Nov 12
meridian-day90 (nina-mbp): 16 sessions in 30 days, per day with the non-compliant ones marked; tokens and cost by harness; tokens per day for the top providers, models and harnesses.
meridian-day90 (nina-mbp): 16 sessions in 30 days, per day with the non-compliant ones marked; tokens and cost by harness; tokens per day for the top providers, models and harnesses.
Phase 2 · Activity and the session page in the real app, per world, mirrored from the qnative atlas (D21)Nov 12
minimal (chen-mba): four sessions in 30 days, one of them running; tokens and cost by the one monitored harness.
minimal (chen-mba): four sessions in 30 days, one of them running; tokens and cost by the one monitored harness.
Phase 2 · Activity and the session page in the real app, per world, mirrored from the qnative atlas (D21)Nov 12
pilot (priya-x1): 31 sessions in 30 days, the flagged days in the warning tone; three harnesses, three providers.
pilot (priya-x1): 31 sessions in 30 days, the flagged days in the warning tone; three harnesses, three providers.
Phase 2 · Activity and the session page in the real app, per world, mirrored from the qnative atlas (D21)Nov 12
nina's Activity with day 90 read as the capture day: the ledger's "started" reads in hours and days, the footer names the shift; every other capture freezes the clock so it agrees with the lab mock (D6).
nina's Activity with day 90 read as the capture day: the ledger's "started" reads in hours and days, the footer names the shift; every other capture freezes the clock so it agrees with the lab mock (D6).
Phase 2 · Activity and the session page in the real app, per world, mirrored from the qnative atlas (D21)Nov 12

DataDotStrip moved into the layer (v0.9.39) from the footprint page: readings as marks on one shared axis, shapes keyed by the legend

/components/data/data-dot-strip — DataDotStrip (layer 0.9.39): c138 Phase 0's readings, two per state, with the band and the target; scenarios empty, minimal, a whole (one core), overflow
/components/data/data-dot-strip — DataDotStrip (layer 0.9.39): c138 Phase 0's readings, two per state, with the band and the target; scenarios empty, minimal, a whole (one core), overflow
The footprint page — every strobe reading, drawnNov 13
The same page in dark mode: memory at rest across the four states, both readings each.
The same page in dark mode: memory at rest across the four states, both readings each.
The footprint page — every strobe reading, drawnNov 12
Memory at rest across the four states, both readings each, on a zero-based axis; the band is the quiet readings' spread (60.3–63.0 MB), and only Components sits outside it.
Memory at rest across the four states, both readings each, on a zero-based axis; the band is the quiet readings' spread (60.3–63.0 MB), and only Components sits outside it.
The footprint page — every strobe reading, drawnNov 12
CPU at rest on the scale of one core: every reading on an idle Mac sits at the zero end; c4's and c5's, read on a Mac in use, are drawn apart, with Status at rest the open question.
CPU at rest on the scale of one core: every reading on an idle Mac sits at the zero end; c4's and c5's, read on a Mac in use, are drawn apart, with Status at rest the open question.
The footprint page — every strobe reading, drawnNov 12
Live Activity under a stream (Phase 3), on the scale of one core: 33.9% at 1,000 a second as first built, nearly all drawing; the stream core alone 7.05%; 0.003% on leaving the page.
Live Activity under a stream (Phase 3), on the scale of one core: 33.9% at 1,000 a second as first built, nearly all drawing; the stream core alone 7.05%; 0.003% on leaving the page.
The footprint page — every strobe reading, drawnNov 12
The footprint page: Phase 0's gate first. The lean build saves 1,072,560 bytes (4.4%); at rest nothing measurable; showing Components costs about 3.5–4 MB.
The footprint page: Phase 0's gate first. The lean build saves 1,072,560 bytes (4.4%); at rest nothing measurable; showing Components costs about 3.5–4 MB.
The footprint page — every strobe reading, drawnNov 12
What the sensor serves today and what it does not, the nozzle that carries it, the pages that show it, and the three gates between a customer and its cost.
What the sensor serves today and what it does not, the nozzle that carries it, the pages that show it, and the three gates between a customer and its cost.
Sketches — the structures, drawn in the design systemNov 11

The Inventory overview in every bundled world (four since the recut)

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.
Every story per world (design c132 Phase 3, the native capture mode)Nov 11
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.
Every story per world (design c132 Phase 3, the native capture mode)Nov 11
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.
Every story per world (design c132 Phase 3, the native capture mode)Nov 11
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.
Every story per world (design c132 Phase 3, the native capture mode)Nov 11
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.
Every story per world (design c132 Phase 3, the native capture mode)Nov 11
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.
Every story per world (design c132 Phase 3, the native capture mode)Nov 11
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.
Every story per world (design c132 Phase 3, the native capture mode)Nov 11
pilot (priya-x1): four harnesses, three monitored, Ollama a shadow.
pilot (priya-x1): four harnesses, three monitored, Ollama a shadow.
Every story per world (design c132 Phase 3, the native capture mode)Nov 11

The Config page's shape: three sources of one file, one check shared by the page and the agent, and the agent's draft the person applies

config.yaml comes from one of three places; every change to it, the person's or an agent's, passes one check; an agent drafts the whole file and the person applies it.
config.yaml comes from one of three places; every change to it, the person's or an agent's, passes one check; an agent drafts the whole file and the person applies it.
Sketches — the structures, drawn in the design systemNov 13
Claude Code's draft (R4, R7): what was asked, the summary, the check, the folded diff, Apply or Discard. The agent can't apply it.
Claude Code's draft (R4, R7): what was asked, the summary, the check, the folded diff, Apply or Discard. The agent can't apply it.
Phases 3–4 · the Config page in the real app, mirrored from qnative c11 (B beside A)Nov 13
Over the plane: HQ's file, read-only; an agent's proposal refused (C9's first pass) with the change it would need.
Over the plane: HQ's file, read-only; an agent's proposal refused (C9's first pass) with the change it would need.
Phases 3–4 · the Config page in the real app, mirrored from qnative c11 (B beside A)Nov 13
Edit here on meridian-day90: the world's config.yaml (v2, live) in gpui-component's editor, the starters in the tray, checked by qcontrol (the stand-in, R6).
Edit here on meridian-day90: the world's config.yaml (v2, live) in gpui-component's editor, the starters in the tray, checked by qcontrol (the stand-in, R6).
Phases 3–4 · the Config page in the real app, mirrored from qnative c11 (B beside A)Nov 13
No file on fresh: the stock document is in force, and the page opens on Pick a starter (Q3).
No file on fresh: the stock document is in force, and the page opens on Pick a starter (Q3).
Phases 3–4 · the Config page in the real app, mirrored from qnative c11 (B beside A)Nov 13
From a published file: an address, or Qpoint's library with what each file is for. Fetched once (R1).
From a published file: an address, or Qpoint's library with what each file is for. Fetched once (R1).
Phases 3–4 · the Config page in the real app, mirrored from qnative c11 (B beside A)Nov 13
An agent's draft (R4, R7): Claude Code proposed the whole file, checked by qcontrol; the difference folds to the change, and the person applies or discards it. The agent can't apply it.
An agent's draft (R4, R7): Claude Code proposed the whole file, checked by qcontrol; the difference folds to the change, and the person applies or discards it. The agent can't apply it.
Phase 2 · the Config page in the native skin, three modes, every stateNov 13
Applied as v3: the trace says who proposed it and when qcontrol uses it, with Revert to v2; the versions list keeps every applied file.
Applied as v3: the trace says who proposed it and when qcontrol uses it, with Revert to v2; the versions list keeps every applied file.
Phase 2 · the Config page in the native skin, three modes, every stateNov 13

The message channel's ports and bones

Two parties, four ports between them, one schema for every message, and the citizen's hand on the delivery.
Two parties, four ports between them, one schema for every message, and the citizen's hand on the delivery.
Sketches — the structures, drawn in the design systemNov 10
/pages/phase4/messaging-inbox
/pages/phase4/messaging-inbox
Nov 9
/pages/phase4/mock/messages
/pages/phase4/mock/messages
Nov 9
/pages/phase4/messaging-bones
/pages/phase4/messaging-bones
Nov 9

Findings, the person's view: Observed open by default, prevented as one quiet group

Nina's machine in the person's view: the first-run card (Quietly, the default), Observed open by default in five columns with the policy under each finding and no SLA clock.
Nina's machine in the person's view: the first-run card (Quietly, the default), Observed open by default in five columns with the policy under each finding and no SLA clock.
Phase 3 · the person's view of the same findings, beside the copyNov 13
The prototype's S2 with Q4 in the model (Phase 4): the blocked findings F-D, F-E and F-F read Resolved: prevented from the moment they were detected; the list opens on every outcome.
The prototype's S2 with Q4 in the model (Phase 4): the blocked findings F-D, F-E and F-F read Resolved: prevented from the moment they were detected; the list opens on every outcome.
Phase 3 · the person's view of the same findings, beside the copyNov 13
After Ask IT: the note joins the history as "you asked IT" and the finding stays open; asking never changes the finding.
After Ask IT: the note joins the history as "you asked IT" and the finding stays open; asking never changes the finding.
Phase 3 · the person's view of the same findings, beside the copyNov 13
Linear MCP on Nina's machine for the person: what happened, why the company's policy covers it, what she can do (Ask for access, Ask IT), what happened since in sentences, what is recorded.
Linear MCP on Nina's machine for the person: what happened, why the company's policy covers it, what she can do (Ask for access, Ask IT), what happened since in sentences, what is recorded.
Phase 3 · the person's view of the same findings, beside the copyNov 13
After Acknowledge and "This was a mistake": both join the history as the person's own lines; the finding stays open until the plane resolves it.
After Acknowledge and "This was a mistake": both join the history as the person's own lines; the finding stays open until the plane resolves it.
Phase 3 · the person's view of the same findings, beside the copyNov 13
Dana's follow-up on Priya's Postgres MCP finding, shown as HQ wrote it, with Acknowledge; "Also under" names the same server's other finding; What you can do now offers "This was a mistake".
Dana's follow-up on Priya's Postgres MCP finding, shown as HQ wrote it, with Acknowledge; "Also under" names the same server's other finding; What you can do now offers "This was a mistake".
Phase 3 · the person's view of the same findings, beside the copyNov 13
A prevented finding for the person: nothing left the machine, nothing to fix, recorded as prevented and never counted against her; Ask for access if her work needs chatgpt.com.
A prevented finding for the person: nothing left the machine, nothing to fix, recorded as prevented and never counted against her; Ask for access if her work needs chatgpt.com.
Phase 3 · the person's view of the same findings, beside the copyNov 13
A training the policy suggested on Priya's Linear MCP finding: three minutes, hers to take when it suits her, opened in the browser (Q5: the event and the record in the native V1).
A training the policy suggested on Priya's Linear MCP finding: three minutes, hers to take when it suits her, opened in the browser (Q5: the event and the record in the native V1).
Phase 3 · the person's view of the same findings, beside the copyNov 13

The system topology the 2026-11-05 roadmap implies, as one scene

What runs where after the roadmap: the sensor and the native app on the endpoint, the control plane with its web app and two databases, and the people on each side.
What runs where after the roadmap: the sensor and the native app on the endpoint, the control plane with its web app and two databases, and the people on each side.
Sketches — the structures, drawn in the design systemNov 10
Eight cycles and a naming cycle, the four gates between them, and what each waits on.
Eight cycles and a naming cycle, the four gates between them, and what each waits on.
Sketches — the structures, drawn in the design systemNov 10

The Sensor page after c131 D21 (S3, S5): the five facts in full, the config file, the plane, 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.
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.
Phase 4 · Sensor and Activity in the native skin, per world (after c131 D21)Nov 11
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.
Phase 4 · Sensor and Activity in the native skin, per world (after c131 D21)Nov 11
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.
Phase 4 · Sensor and Activity in the native skin, per world (after c131 D21)Nov 11
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.
Phase 4 · Sensor and Activity in the native skin, per world (after c131 D21)Nov 11
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.
Phase 4 · Sensor and Activity in the native skin, per world (after c131 D21)Nov 11
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.
Phase 4 · Sensor and Activity in the native skin, per world (after c131 D21)Nov 11
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.
Phase 4 · Sensor and Activity in the native skin, per world (after c131 D21)Nov 11
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.
Phase 4 · Sensor and Activity in the native skin, per world (after c131 D21)Nov 11
c4Messaging13 shots

The inbox, the empty state

The inbox on the quiet default laptop (nina-mbp): empty, with the welcome the inventory dropped as a type. The sidebar's Messages group: Inbox and Settings.
The inbox on the quiet default laptop (nina-mbp): empty, with the welcome the inventory dropped as a type. The sidebar's Messages group: Inbox and Settings.
c4 · Messaging: the inbox per state, the settings, the flows (design c137 Phase 3)Nov 11
The honesty line: a new HQ notice at its default (Inbox: kept, no signal) and a drill's enforcement notice during quiet hours both went to the inbox quietly; the line names the setting that did it and links to it. Control never erases the record.
The honesty line: a new HQ notice at its default (Inbox: kept, no signal) and a drill's enforcement notice during quiet hours both went to the inbox quietly; the line names the setting that did it and links to it. Control never erases the record.
c4 · Messaging: the inbox per state, the settings, the flows (design c137 Phase 3)Nov 12
Messages, the settings page, in the words Mark ruled on 2026-11-11: one four-position control per kind, Inbox · Tray · Quiet · Normal, each word saying where the message goes; Priority reserved to required. The inventory's defaults: enforcement notices at Tray (no floor), censures at Normal, HQ notices at Inbox.
Messages, the settings page, in the words Mark ruled on 2026-11-11: one four-position control per kind, Inbox · Tray · Quiet · Normal, each word saying where the message goes; Priority reserved to required. The inventory's defaults: enforcement notices at Tray (no floor), censures at Normal, HQ notices at Inbox.
c4 · Messaging: the inbox per state, the settings, the flows (design c137 Phase 3)Nov 12
The settings in dark.
The settings in dark.
c4 · Messaging: the inbox per state, the settings, the flows (design c137 Phase 3)Nov 12
Lower on the page, tuned: quiet hours on with the preset and its steppers, HQ notices raised to Tray, a policy's notices muted from a card (with Lift), the required override with this month's count and subject, and what this build can post: no priority without the time-sensitive entitlement on a signed build.
Lower on the page, tuned: quiet hours on with the preset and its steppers, HQ notices raised to Tray, a policy's notices muted from a card (with Lift), the required override with this month's count and subject, and what this build can post: no priority without the time-sensitive entitlement on a signed build.
c4 · Messaging: the inbox per state, the settings, the flows (design c137 Phase 3)Nov 12
The pilot world's inbox, seeded through the nozzle's messages route from bones' ten: the lift (D10) puts the open required censure first though it is the oldest of the day, then the new ones, then the seen; the severity pill is grey or orange, never red; one row per thread with its reply count; the count beside Inbox in the sidebar.
The pilot world's inbox, seeded through the nozzle's messages route from bones' ten: the lift (D10) puts the open required censure first though it is the oldest of the day, then the new ones, then the seen; the severity pill is grey or orange, never red; one row per thread with its reply count; the count beside Inbox in the sidebar.
c4 · Messaging: the inbox per state, the settings, the flows (design c137 Phase 3)Nov 11
The same inbox in dark.
The same inbox in dark.
c4 · Messaging: the inbox per state, the settings, the flows (design c137 Phase 3)Nov 11
The censure's card: the three sentences as HQ wrote them with the verbatim label (D6), "Why am I seeing this" fixed at send time, the kind and dates, Acknowledge first because it is owed (added by the app, never by the sender), then Contact IT.
The censure's card: the three sentences as HQ wrote them with the verbatim label (D6), "Why am I seeing this" fixed at send time, the kind and dates, Acknowledge first because it is owed (added by the app, never by the sender), then Contact IT.
c4 · Messaging: the inbox per state, the settings, the flows (design c137 Phase 3)Nov 11
c5Status24 shots

Activity on one machine: the band (sessions per day, tokens and cost by harness), the usage row, Recent Work

fresh: no sessions captured yet; the band at zero, the usage row empty, the ledger's honest line.
fresh: no sessions captured yet; the band at zero, the usage row empty, the ledger's honest line.
Activity and a session: qdash's Activity on one machine, per world (c131 D21 S4; qnative c5)Nov 12
minimal (chen-mba): four sessions in 30 days, one of them running; tokens and cost by the one monitored harness.
minimal (chen-mba): four sessions in 30 days, one of them running; tokens and cost by the one monitored harness.
Activity and a session: qdash's Activity on one machine, per world (c131 D21 S4; qnative c5)Nov 12
meridian-day90 (nina-mbp): 16 sessions in 30 days, per day with the non-compliant ones marked; tokens and cost by harness; tokens per day for the top providers, models and harnesses.
meridian-day90 (nina-mbp): 16 sessions in 30 days, per day with the non-compliant ones marked; tokens and cost by harness; tokens per day for the top providers, models and harnesses.
Activity and a session: qdash's Activity on one machine, per world (c131 D21 S4; qnative c5)Nov 12
pilot (priya-x1): 31 sessions in 30 days, the flagged days in the warning tone; three harnesses, three providers.
pilot (priya-x1): 31 sessions in 30 days, the flagged days in the warning tone; three harnesses, three providers.
Activity and a session: qdash's Activity on one machine, per world (c131 D21 S4; qnative c5)Nov 12
nina's Activity without the band: tokens per day for the top providers, models and harnesses, then Recent Work; the counts live on Status's found-here set.
nina's Activity without the band: tokens per day for the top providers, models and harnesses, then Recent Work; the counts live on Status's found-here set.
Activity and a session: qdash's Activity on one machine, per world (c131 D21 S4; qnative c5)Nov 12
nina's Activity with day 90 read as the capture day: the ledger's "started" reads in hours and days, the footer names the shift; every other capture freezes the clock so it agrees with the lab mock (D6).
nina's Activity with day 90 read as the capture day: the ledger's "started" reads in hours and days, the footer names the shift; every other capture freezes the clock so it agrees with the lab mock (D6).
Activity and a session: qdash's Activity on one machine, per world (c131 D21 S4; qnative c5)Nov 12
nina's Recent Work: harness, model, tools, session, started, duration, workspace, tokens, spend; a flagged row carries its worst flag.
nina's Recent Work: harness, model, tools, session, started, duration, workspace, tokens, spend; a flagged row carries its worst flag.
Activity and a session: qdash's Activity on one machine, per world (c131 D21 S4; qnative c5)Nov 12
priya's Recent Work: 31 rows in the window, the flagged ones marked; a row opens the session.
priya's Recent Work: 31 rows in the window, the flagged ones marked; a row opens the session.
Activity and a session: qdash's Activity on one machine, per world (c131 D21 S4; qnative c5)Nov 12

The live viewer, native

Live Activity on a synthetic coding session: the state line (rate, the last event's age, kept and MiB), the harnesses row (qdash's presence, ported), the rail (severity, harnesses, families with counts), the firehose newest first.
Live Activity on a synthetic coding session: the state line (rate, the last event's age, kept and MiB), the harnesses row (qdash's presence, ported), the rail (severity, harnesses, families with counts), the firehose newest first.
Phase 3 · Live Activity: qdash's /live on the current envelope, improvedNov 12
A tool call opened: chips that filter to its process, session or type; the preview; the record as JSON with its arguments masked everywhere (summary, preview, JSON, copy) until revealed.
A tool call opened: chips that filter to its process, session or type; the preview; the record as JSON with its arguments masked everywhere (summary, preview, JSON, copy) until revealed.
Phase 3 · Live Activity: qdash's /live on the current envelope, improvedNov 12
Search reaches the payload (the web searches twelve projected fields): every record that names payments/client.rs.
Search reaches the payload (the web searches twelve projected fields): every record that names payments/client.rs.
Phase 3 · Live Activity: qdash's /live on the current envelope, improvedNov 12
Filtered to nothing is its own state: how many are kept, and how to see them.
Filtered to nothing is its own state: how many are kept, and how to see them.
Phase 3 · Live Activity: qdash's /live on the current envelope, improvedNov 12
The tally by process (also by session, by type, and qdash's own by run, which on today's stream is one Unattributed row).
The tally by process (also by session, by type, and qdash's own by run, which on today's stream is one Unattributed row).
Phase 3 · Live Activity: qdash's /live on the current envelope, improvedNov 12
No sensor (the condition 'not running' on Dev › Source): says where it looked and what to do.
No sensor (the condition 'not running' on Dev › Source): says where it looked and what to do.
Phase 3 · Live Activity: qdash's /live on the current envelope, improvedNov 12
Refused: qdash's own 503 sentence for a static qdash serve, drawn through the real pipes by the 'unavailable' condition.
Refused: qdash's own 503 sentence for a static qdash serve, drawn through the real pipes by the 'unavailable' condition.
Phase 3 · Live Activity: qdash's /live on the current envelope, improvedNov 12
Dev › Source, synthetic: a world, a condition (healthy, not running, slow, no live stream, a shape that does not match, lag then cut), a stream and its rate. A choice re-opens the data for every page at once and is saved.
Dev › Source, synthetic: a world, a condition (healthy, not running, slow, no live stream, a shape that does not match, lag then cut), a stream and its rate. A choice re-opens the data for every page at once and is saved.
Phase 2 · Dev › Source: where the data comes from, and the ladderNov 11
c139Updates17 shots

Settings › Updates in the native skin: one sentence per state, the versions, the preference, the notes

Up to date: 0.1.0 is the newest on the build-partner channel, checked five minutes ago; Check now. The notes panel points at the cycle records, since 0.1.0 has none of its own.
Up to date: 0.1.0 is the newest on the build-partner channel, checked five minutes ago; Check now. The notes panel points at the cycle records, since 0.1.0 has none of its own.
Phase 2 · Settings › Updates and the tray in the native skin, every state and both erasNov 11
Three failed tries: Updates aren't installing, with an amber dot on the icon (R3's one exception).
Three failed tries: Updates aren't installing, with an amber dot on the icon (R3's one exception).
Phase 2 · Settings › Updates and the tray in the native skin, every state and both erasNov 11
After a quiet install: no update line; the menu's version line and the window's footer say updated.
After a quiet install: no update line; the menu's version line and the window's footer say updated.
Phase 2 · Settings › Updates and the tray in the native skin, every state and both erasNov 11
The tray, Ask me first: a dot on the icon and Restart to update to 0.2.0; the window's footer reads 0.2.0 ready.
The tray, Ask me first: a dot on the icon and Restart to update to 0.2.0; the window's footer reads 0.2.0 ready.
Phase 2 · Settings › Updates and the tray in the native skin, every state and both erasNov 11
The tray, Automatically: Restart to update is there for whoever opens the menu, with no dot; it installs when you quit.
The tray, Automatically: Restart to update is there for whoever opens the menu, with no dot; it installs when you quit.
Phase 2 · Settings › Updates and the tray in the native skin, every state and both erasNov 11
Later, a structured rollout: the same page with public notes and a link to the changelog, the version without its SHA, and the channel as Stable or Beta.
Later, a structured rollout: the same page with public notes and a link to the changelog, the version without its SHA, and the channel as Stable or Beta.
Phase 2 · Settings › Updates and the tray in the native skin, every state and both erasNov 11
The same state with a Skip this version link, for review-1's call on skip (the plan's default is no skip).
The same state with a Skip this version link, for review-1's call on skip (the plan's default is no skip).
Phase 2 · Settings › Updates and the tray in the native skin, every state and both erasNov 11
Available, Manually: you have 0.1.0 · 71dd21a, 0.2.0 was published Nov 10 (8.6 MB); the release carries qcontrol 0.9.5, which needs an administrator; Update · Not now. Internal notes inline, each line with its source.
Available, Manually: you have 0.1.0 · 71dd21a, 0.2.0 was published Nov 10 (8.6 MB); the release carries qcontrol 0.9.5, which needs an administrator; Update · Not now. Internal notes inline, each line with its source.
Phase 2 · Settings › Updates and the tray in the native skin, every state and both erasNov 11

The control plane's deployment shape

The UI over the Go app over Postgres and ClickHouse, run by us as SaaS or by the customer from one Docker image; endpoints connect, people sign in.
The UI over the Go app over Postgres and ClickHouse, run by us as SaaS or by the customer from one Docker image; endpoints connect, people sign in.
Sketches — the structures, drawn in the design systemNov 10

The open info panel carries two toggles; opening it switched neither on

The panel opened from the footer's Info, both toggles off: Help mode off (the panel opens when asked), developer mode allowed and off (the Dev group is gone from the sidebar).
The panel opened from the footer's Info, both toggles off: Help mode off (the panel opens when asked), developer mode allowed and off (the Dev group is gone from the sidebar).
Panel Toggles: Help mode and Developer mode in the open info panel (qnative c6; design c138, the toggles' seat)Nov 12
The same, dark.
The same, dark.
Panel Toggles: Help mode and Developer mode in the open info panel (qnative c6; design c138, the toggles' seat)Nov 12
Help mode on, saved before the window opened: the panel opened with the window, says what Models shows (the app map's entry), and offers Tour this page (the tour's step on Models).
Help mode on, saved before the window opened: the panel opened with the window, says what Models shows (the app map's entry), and offers Tour this page (the tour's step on Models).
Panel Toggles: Help mode and Developer mode in the open info panel (qnative c6; design c138, the toggles' seat)Nov 12
The same, dark.
The same, dark.
Panel Toggles: Help mode and Developer mode in the open info panel (qnative c6; design c138, the toggles' seat)Nov 12
Developer mode on where it is allowed: the Dev group back in the sidebar (its first entry shows above the open panel), its entries in the tour's cyan (#0099FF, the panel's and the callouts' own); the same saved value the tray's Developer mode item reads and writes.
Developer mode on where it is allowed: the Dev group back in the sidebar (its first entry shows above the open panel), its entries in the tour's cyan (#0099FF, the panel's and the callouts' own); the same saved value the tray's Developer mode item reads and writes.
Panel Toggles: Help mode and Developer mode in the open info panel (qnative c6; design c138, the toggles' seat)Nov 12
The same, dark.
The same, dark.
Panel Toggles: Help mode and Developer mode in the open info panel (qnative c6; design c138, the toggles' seat)Nov 12
A release build with developer mode started without --dev: the switch is drawn disabled and the row says what allows it.
A release build with developer mode started without --dev: the switch is drawn disabled and the row says what allows it.
Panel Toggles: Help mode and Developer mode in the open info panel (qnative c6; design c138, the toggles' seat)Nov 12
The same, dark.
The same, dark.
Panel Toggles: Help mode and Developer mode in the open info panel (qnative c6; design c138, the toggles' seat)Nov 12

Theatre mode's demo: the cases, a scenario beat by beat at three registers, Replay at Enforce as a matrix, every scenario's authored replays against the play

The demo page: five cases (theatre off, a drill as one beat, S1 at the world's settings, wave 1 replayed, what theatre refuses), S1 beat by beat with what the sensor sees, the findings the world derives and the test lines, and Replay at Enforce as a matrix; every table is computed by the play the pages read.
The demo page: five cases (theatre off, a drill as one beat, S1 at the world's settings, wave 1 replayed, what theatre refuses), S1 beat by beat with what the sensor sees, the findings the world derives and the test lines, and Replay at Enforce as a matrix; every table is computed by the play the pages read.
Theatre mode, Phase 1: the scenario model, theatre in the lab, wave 1, the guide's contract, Show modeNov 13
S1 at 09:02: the email arrives, with a hidden line written for the assistant
S1 at 09:02: the email arrives, with a hidden line written for the assistant
Theatre mode, Phase 1: the scenario model, theatre in the lab, wave 1, the guide's contract, Show modeNov 13
S4 at 15:11: the file is on a public gist; anyone with the link, and search engines, can read it
S4 at 15:11: the file is on a public gist; anyone with the link, and search engines, can read it
Theatre mode, Phase 1: the scenario model, theatre in the lab, wave 1, the guide's contract, Show modeNov 13
S4 at 15:10: Jordan asks the assistant to share the churn export with Sam, and leaves how to it
S4 at 15:10: Jordan asks the assistant to share the churn export with Sam, and leaves how to it
Theatre mode, Phase 1: the scenario model, theatre in the lab, wave 1, the guide's contract, Show modeNov 13
S3 at 02:40: repo-tidy 1.4, reviewed and pinned, is published again as 1.5 with a "diagnostics" step
S3 at 02:40: repo-tidy 1.4, reviewed and pinned, is published again as 1.5 with a "diagnostics" step
Theatre mode, Phase 1: the scenario model, theatre in the lab, wave 1, the guide's contract, Show modeNov 13
S5 at 11:06: the unapproved refund helper asks back for the expiry and the code
S5 at 11:06: the unapproved refund helper asks back for the expiry and the code
Theatre mode, Phase 1: the scenario model, theatre in the lab, wave 1, the guide's contract, Show modeNov 13
S5 at 11:04: a refund ticket with a full card number is pasted into the assistant
S5 at 11:04: a refund ticket with a full card number is pasted into the assistant
Theatre mode, Phase 1: the scenario model, theatre in the lab, wave 1, the guide's contract, Show modeNov 13
The list of shows (C10): wave 1's six stories, then the product tours as feature highlights. Play opens the tour's first page with ?show=; it plays in theatre, about 8 s a step, loops, pauses on any input and resumes after 3 idle minutes (or not, for the before-a-talk case).
The list of shows (C10): wave 1's six stories, then the product tours as feature highlights. Play opens the tour's first page with ?show=; it plays in theatre, about 8 s a step, loops, pauses on any input and resumes after 3 idle minutes (or not, for the before-a-talk case).
Theatre mode, Phase 1: the scenario model, theatre in the lab, wave 1, the guide's contract, Show modeNov 13

The five checks as a matrix

Every layer component against Mark's five checks, with its cousins and its resolution.
Every layer component against Mark's five checks, with its cousins and its resolution.
Sketches — the structures, drawn in the design systemNov 10

Mechanic access as one record

Purpose, level, scope, window, who, record; none, requested, active, revoked, closed.
Purpose, level, scope, window, who, record; none, requested, active, revoked, closed.
Sketches — the structures, drawn in the design systemNov 10

The naming cycle's field of candidates

Five things to name against the mental models a customer already holds.
Five things to name against the mental models a customer already holds.
Sketches — the structures, drawn in the design systemNov 10

The Config page in the app (design c146 Phases 3–4; qnative c11): gpui-component's editor, qconfig's parser checking every change, an agent's draft the person applies

Edit here on meridian-day90: the world's config.yaml (v2, live) in gpui-component's editor, the starters in the tray, checked by qcontrol (the stand-in, R6).
Edit here on meridian-day90: the world's config.yaml (v2, live) in gpui-component's editor, the starters in the tray, checked by qcontrol (the stand-in, R6).
The Config page in the app, per state (design c146 Phases 3–4)Nov 13
No file on fresh: the stock document is in force, and the page opens on Pick a starter (Q3).
No file on fresh: the stock document is in force, and the page opens on Pick a starter (Q3).
The Config page in the app, per state (design c146 Phases 3–4)Nov 13
Claude Code's draft (R4, R7): what was asked, the summary, the check, the folded diff, Apply or Discard. The agent can't apply it.
Claude Code's draft (R4, R7): what was asked, the summary, the check, the folded diff, Apply or Discard. The agent can't apply it.
The Config page in the app, per state (design c146 Phases 3–4)Nov 13
Over the plane: HQ's file, read-only; an agent's proposal refused (C9's first pass) with the change it would need.
Over the plane: HQ's file, read-only; an agent's proposal refused (C9's first pass) with the change it would need.
The Config page in the app, per state (design c146 Phases 3–4)Nov 13
From a published file: an address, or Qpoint's library with what each file is for. Fetched once (R1).
From a published file: an address, or Qpoint's library with what each file is for. Fetched once (R1).
The Config page in the app, per state (design c146 Phases 3–4)Nov 13

Releases & deploys

Layer releases 2

v0.9.39Nov 13v0.9.39: DataDotStrip, readings as marks on one shared axis (from design c138's footprint page)
v0.9.38Nov 12v0.9.38: PolicyTag's inactive policy reads Off (the product's word for the mode); update-consumers drops app.qpoint.io and www.qpoint.io

Design-site deploys 16

Nov 13, 11:56 AM2634f7e3a1layer 0.9.39
Nov 13, 11:32 AMb3251694bblayer 0.9.38
Nov 12, 3:04 PMe74e06fbe3layer 0.9.38
Nov 12, 2:31 PM169e0b867alayer 0.9.38
Nov 12, 10:08 AMa6694996e8layer 0.9.38
Nov 12, 9:10 AM416de93c6alayer 0.9.37
Nov 12, 9:02 AM416de93c6alayer 0.9.37
Nov 11, 7:31 PM4d222f499alayer 0.9.37
Nov 11, 12:51 PM550fba18adlayer 0.9.37
Nov 11, 7:58 AMb8df55e35flayer 0.9.37
Nov 10, 10:11 AM737a8afd8elayer 0.9.37
Nov 10, 10:02 AM495a92c492layer 0.9.37
Nov 10, 9:56 AM6508ab8b98layer 0.9.37
Nov 10, 9:12 AM0aed747571layer 0.9.37
Nov 10, 9:03 AMc78d1a97dclayer 0.9.37
Nov 10, 8:53 AMf9b3d9173dlayer 0.9.37

Qpoint Brand Style Guide