← Cycles
Design · c107

qdash Cutover

activelanded 2026-10-02 — `feat/new-pages` / PR #713 rebased on `main`; ready to close after reviewcreated 2026-10-02· last activity 2026-10-02· mode: formula: the same shape as qcontrol c1's Phase 5–6 cutover. Before that, archaeology: harvest what the archived apps got right before they leave the tree.

Promote the Fable app to `qcontrol/crates/qdash/ui/` (the path the binary embeds), land it on `feat/new-pages` / PR #713, archive the old ui and the Opus app as reachable tags, and tell the story of why

New in this cycle: Gen 2 as it was archived: the qdash ui that shipped in the binary until the c107 cutover.

Why

c99 ran a two-track bake-off (Claude Code · Opus 5.5 vs Claude Code · Fable 5.1). Each track rebuilt the qdash UI onto a documented data interface, as a standalone app beside the existing ui/. Since 2026-10-01 the Fable app has been the active app: c102, c103 and c104 all landed there. The Rust binary still embeds the deprecated ui/, though, and feat/new-pages (PR #713) still carries it. So the product ships an app nobody is working on, and the app everybody is working on ships nowhere. c99's executive overview left this as decision D9: "a cycle of its own, after D1–D6." This is that cycle. Mark's ruling (2026-10-02): proceed now and confirm with Tyler afterwards, because nothing is deleted, only archived.

Objective

  1. Harvest. Find what in the Opus app is worth porting into Fable, and what in the old ui must be preserved (opus-harvest.md, ui-preservation.md).
  2. Cut over. The Fable app becomes crates/qdash/ui/, with the embedded dist regenerated from the published layer and verified on the binary. feat/new-pages fast-forwards to it and PR #713 updates.
  3. Archive. The old ui and the Opus app stay reachable through tags, branches and a visual record, with exact "how to look" instructions.
  4. Story. A clear account of why we did what we did, in the cycle record, the history pages, qcontrol's docs and the PR.

Plan: cutover-plan.md. Prompt: initial-prompt.md (thread prompt cutover-prompt.md).

Scope

  • qcontrol: crates/qdash/ui/ (replaced), crates/qdash/apps/ (removed), crates/qdash/README.md, the ui/cycles/c16.fable-cutover/ twin, branches feat/new-pages and c99/*, and the archive/* tags.
  • design: this directory; c99's record (D9 answered); CLAUDE.md Sister Projects; .claude/launch.json; the /todos page registry and shot base; cycles/CYCLES.md and cycles/HISTORY.md; memory.
  • Out of scope: backend src/ changes; the PR #713 conflicts with main in qevents (they predate this cycle); the layer-extraction cycle for LAYER-CANDIDATES.md.

Key Changes

  • plan (2026-10-02): wrote the cutover plan as a c99 D9 thread, then moved it here when Mark asked for its own cycle. Mark's rulings:
    • proceed, and confirm with Tyler afterwards;
    • land on feat/new-pages / PR #713;
    • discard the stray working-nav.ts edit;
    • copy the bible into qcontrol;
    • write a qcontrol twin record (c16);
    • analyse the Opus and old-ui work first. The archive approach was put to me ("what do you recommend?"); my recommendation is recorded as C2 in the plan.
  • harvest (2026-10-02): two read-only analyses.
    • ui-preservation.md: no product feature or test is lost (372 → 553 specs). What has to carry over is build config: the dist is git-ignored in Fable, the layer path depth, generate:dist, the isolated build dir, the port and API defaults. c99 never exercised the writes or live data, so the embedded build has to check both. Two plan corrections: there is no footer build stamp, and the layer installs over git+ssh, not a packages token.
    • opus-harvest.md: 8 Opus fixes that Fable still lacks. Six small ones are ported in the cutover (P4b): the poll hold leak, polling in hidden tabs, highlight.js pre-bundling, the integration form, the ✕ on a /live chip, and the duplicate-control guard. Opus bible §8 is adopted as a rule (loading and error states are not "empty"); its code pass is a follow-on.
  • rebase (2026-10-02): Mark asked to rebase from main (C10). A trial ran in a throwaway worktree:
    • feat/new-pages onto origin/main 8fffe91d: one commit (587c235e) conflicts in qevents CHANGELOG.md and examples.rs, both mechanical. cargo check passes and make schemas regenerates byte-identical files.
    • Fable's 38 commits on top: only the README conflict.
    • The result is 178 linear commits, with the Fable app byte-identical.

    The plan now works on a new c107/cutover branch in its own worktree. The c99/* branches stay as they are. feat/new-pages lands with --force-with-lease, and the archive tags have to come first.
  • execution (2026-10-02), P0–P5 and P-S. Mark: "let's proceed".
    • P0. The Fable tree was quiet: no edits for 3 hours, only its dev server. Pushed Fable c4d0e007 and Opus 598df17e. Discarded the stray working-nav.ts edit; it's already in Fable.
    • P1. Pushed the annotated tags archive/qdash-ui-gen2→d52ff77b, archive/qdash-opus-5.5→598df17e and archive/c99-compare→4bd30359.
    • P2. Rebased in worktree qcontrol-c107 on c107/cutover, identical to the trial. 186 commits now sit on origin/main 8fffe91d.
    • P3 and P4. a83234e9 (move only) and 18cdaef5 (rewire, bible + R31, README Lineage, Makefile).
    • P4b. 36e46b1d (H1/H2), f914e49a (H4), fefadeac (H5), 56d3f138 (H6). H3 and H7 went in with the rewire.
    • P5. 12bb5d21 (dist against the published layer v0.9.25; the sibling layer was the same tag, clean). Then 98f17218 (qcontrol twin c16).
    • Verified on the embedded release binary:
      • 556 specs and bible-check pass;
      • all 31 top-level routes and 21 detail URLs render; 13 old URLs redirect; 0 console errors;
      • 10 write paths persist on a scratch seed (H4 confirmed: a stored config reopens filled);
      • a live-db copy (2.9 GB, 4M events) renders every page, with /api/dlp slowest at 3.1 s.
    • Correction to ui-preservation.md: the :7882 seed binary embeds an older gen-2 dist, not the tag's. The gen-2 captures were taken from a binary built at the tag (:7893), with chunks identical to the tag's dist.
    • Visual record: two subject-keyed threads, gen2-final and cutover, 27 shots each (scripts/shot-programs/c107-{gen2,cutover}.json). No blank shots.
    • Story: STORY.md. Draft PR text: pr-713-body.md.
    • Landed (P6–P8, 2026-10-02). Mark asked for one change, that the PR text address a generic reviewer, and asked for a sanity check that main stays unchanged and new work lands on the new-pages branch.
      • feat/new-pages force-pushed to 98f17218 (lease c8152d9a). origin/main was 8fffe91d before and after; local main untouched. The branch is 0 behind and 186 ahead of main, and PR #713 reports mergeable. It is retitled "qdash: new pages, and the c99 data-interface app becomes crates/qdash/ui", with the body from pr-713-body.md.
      • ../qcontrol reset to the new tip (its tree was clean). The gen-2 dev server on :3030 was stopped. npm ci and 556 specs pass there. Launch config qdash-app (:3030, NUXT_LOCAL_LAYER=1, seed :7882 via qdash-seed) serves Organization → Users with no console errors.
      • Repointed: design CLAUDE.md, .claude/launch.json (qdash-app/qdash-seed; qdash-app-opus removed), the /todos page registry and todos-pages.json (base :3030), and memory (qdash-active-app, c107, the index).
      • Teardown: removed the qcontrol-c99-fable, qcontrol-c99/_compare and qcontrol-c107 worktrees and the local c107/cutover branch; stopped :3032. Kept the qcontrol-c99/claude-code-opus-5.5 worktree, because a parked session's cwd and an untracked .nuxtrc are in it; remove it with git worktree remove once that session is done. qcontrol-c99/_seed/ stays, because qdash-seed uses it.
  • opus wrap-up (2026-10-02). Mark asked whether the "parked Claude session" in the Opus worktree needed anything.
    • It didn't. Session 2e2a1c24 was deleted on 2026-09-28. What was left was an orphaned tail -f | ugrep watcher on its parity log, which lsof had labelled claude.
    • Stopped the watcher and removed the worktree. The branch and the archive/qdash-opus-5.5 tag hold the code; the untracked .nuxtrc is already superseded by H3.
    • The run recipe was tested from the tag: npm ci, 1,660/1,660 specs, and /team/users renders on :3031 against the seed.
    • New: REVIEW-OPUS.md. It covers what the track built, the commits ported into the shipped app, what wasn't taken and why, where its evidence lives, and the tested recipe.
    • The track's unstarted report-opus plan is marked superseded.
    • The c99 report page has an outcome card linking to STORY.md and REVIEW-OPUS.md.
  • next steps (2026-10-02). Mark: "make it so, don't do any work on finding a reviewer, the work is parked there until ready."
    • Path-change notes added to c105 and c106 (top of each plan, end of each CYCLE.md). c106's are committed. c105's are left in its untracked folder for that session to commit.
    • Design pushed (9196894e0→5790d25cf) and deployed, live on design-f39.pages.dev: STORY, REVIEW-OPUS and the c99 outcome card.
      • The c106 mock relies on layer work that isn't released yet. Until that session releases the layer and redeploys, the deployed mock renders its band without the title.
    • Rebuilt the ../qcontrol release binary and restarted qdash-seed, so :7882 now serves the promoted app.
    • Opened c108 · Honest States for the R31 pass.
    • PR #713 is parked; no reviewer outreach.

Outcome

The Fable app is crates/qdash/ui/ on feat/new-pages (PR #713), rebased onto an unchanged main and embedded in the binary. Gen 2 and the Opus app are archived as tags, with a visual record of both apps and a story of why (STORY.md). Six Opus fixes and the honest-states rule came across, and nothing from gen 2 was lost. What carries forward is the follow-ons in STORY.md §What's still open, and a reviewer's read of #713.

Visual record

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

Promoted app (cutover)

2026-10-02· 27 captureslatest
Promoted app /overview on the Meridian seed (was /fleet in gen 2)
Promoted app /overview on the Meridian seed (was /fleet in gen 2) history · 6 moments →
Promoted app /findings on the Meridian seed
Promoted app /findings on the Meridian seed history · 9 moments →
Promoted app /posture on the Meridian seed
Promoted app /posture on the Meridian seed history · 6 moments →
Promoted app /cost on the Meridian seed
Promoted app /cost on the Meridian seed history · 6 moments →
Promoted app /campaigns on the Meridian seed
Promoted app /campaigns on the Meridian seed history · 6 moments →
Promoted app /policies on the Meridian seed (was /controls in gen 2)
Promoted app /policies on the Meridian seed (was /controls in gen 2) history · 6 moments →
Promoted app /alerts on the Meridian seed
Promoted app /alerts on the Meridian seed history · 5 moments →
Promoted app /compliance on the Meridian seed
Promoted app /compliance on the Meridian seed history · 9 moments →
Promoted app /integrations on the Meridian seed
Promoted app /integrations on the Meridian seed history · 3 moments →
Promoted app /dlp on the Meridian seed
Promoted app /dlp on the Meridian seed history · 4 moments →
Promoted app /identity on the Meridian seed
Promoted app /identity on the Meridian seed history · 3 moments →
Promoted app /performance on the Meridian seed
Promoted app /performance on the Meridian seed history · 3 moments →
Promoted app /live on the Meridian seed
Promoted app /live on the Meridian seed history · 2 moments →
Promoted app /inventory/providers on the Meridian seed
Promoted app /inventory/providers on the Meridian seed history · 5 moments →
Promoted app /inventory/harnesses on the Meridian seed
Promoted app /inventory/harnesses on the Meridian seed history · 6 moments →
Promoted app /inventory/models on the Meridian seed
Promoted app /inventory/models on the Meridian seed history · 7 moments →
Promoted app /inventory/mcp-servers on the Meridian seed
Promoted app /inventory/mcp-servers on the Meridian seed history · 5 moments →
Promoted app /inventory/skills on the Meridian seed
Promoted app /inventory/skills on the Meridian seed history · 5 moments →
Promoted app /inventory/tools on the Meridian seed
Promoted app /inventory/tools on the Meridian seed history · 7 moments →
Promoted app /inventory/workspaces on the Meridian seed
Promoted app /inventory/workspaces on the Meridian seed history · 5 moments →
Promoted app /organization/users on the Meridian seed (was /team/users in gen 2)
Promoted app /organization/users on the Meridian seed (was /team/users in gen 2) history · 7 moments →
Promoted app /organization/teams on the Meridian seed (was /team/teams in gen 2)
Promoted app /organization/teams on the Meridian seed (was /team/teams in gen 2) history · 14 moments →
Promoted app /organization/endpoints on the Meridian seed (was /team/endpoints in gen 2)
Promoted app /organization/endpoints on the Meridian seed (was /team/endpoints in gen 2) history · 7 moments →
Promoted app /activity on the Meridian seed (was /team/sessions in gen 2)
Promoted app /activity on the Meridian seed (was /team/sessions in gen 2) history · 9 moments →
Promoted app /organization/users/detail?user=amara%40meridian.dev on the Meridian seed (was /team/users/detail?user=amara%40meridian.dev in gen 2)
Promoted app /organization/users/detail?user=amara%40meridian.dev on the Meridian seed (was /team/users/detail?user=amara%40meridian.dev in gen 2) history · 7 moments →
Promoted app /inventory/providers/detail?provider=anthropic on the Meridian seed
Promoted app /inventory/providers/detail?provider=anthropic on the Meridian seed history · 4 moments →
Promoted app /inventory/skills/detail?skill=deploy on the Meridian seed
Promoted app /inventory/skills/detail?skill=deploy on the Meridian seed history · 5 moments →

Gen 2 as archived

2026-10-02· 27 captures
Gen 2 (archived) /fleet on the Meridian seed
Gen 2 (archived) /fleet on the Meridian seed history · 6 moments →
Gen 2 (archived) /findings on the Meridian seed
Gen 2 (archived) /findings on the Meridian seed history · 9 moments →
Gen 2 (archived) /posture on the Meridian seed
Gen 2 (archived) /posture on the Meridian seed history · 6 moments →
Gen 2 (archived) /cost on the Meridian seed
Gen 2 (archived) /cost on the Meridian seed history · 6 moments →
Gen 2 (archived) /campaigns on the Meridian seed
Gen 2 (archived) /campaigns on the Meridian seed history · 6 moments →
Gen 2 (archived) /controls on the Meridian seed
Gen 2 (archived) /controls on the Meridian seed history · 6 moments →
Gen 2 (archived) /alerts on the Meridian seed
Gen 2 (archived) /alerts on the Meridian seed history · 5 moments →
Gen 2 (archived) /compliance on the Meridian seed
Gen 2 (archived) /compliance on the Meridian seed history · 9 moments →
Gen 2 (archived) /integrations on the Meridian seed
Gen 2 (archived) /integrations on the Meridian seed history · 3 moments →
Gen 2 (archived) /dlp on the Meridian seed
Gen 2 (archived) /dlp on the Meridian seed history · 4 moments →
Gen 2 (archived) /identity on the Meridian seed
Gen 2 (archived) /identity on the Meridian seed history · 3 moments →
Gen 2 (archived) /performance on the Meridian seed
Gen 2 (archived) /performance on the Meridian seed history · 3 moments →
Gen 2 (archived) /live on the Meridian seed
Gen 2 (archived) /live on the Meridian seed history · 2 moments →
Gen 2 (archived) /inventory/providers on the Meridian seed
Gen 2 (archived) /inventory/providers on the Meridian seed history · 5 moments →
Gen 2 (archived) /inventory/harnesses on the Meridian seed
Gen 2 (archived) /inventory/harnesses on the Meridian seed history · 6 moments →
Gen 2 (archived) /inventory/models on the Meridian seed
Gen 2 (archived) /inventory/models on the Meridian seed history · 7 moments →
Gen 2 (archived) /inventory/mcp-servers on the Meridian seed
Gen 2 (archived) /inventory/mcp-servers on the Meridian seed history · 5 moments →
Gen 2 (archived) /inventory/skills on the Meridian seed
Gen 2 (archived) /inventory/skills on the Meridian seed history · 5 moments →
Gen 2 (archived) /inventory/tools on the Meridian seed
Gen 2 (archived) /inventory/tools on the Meridian seed history · 7 moments →
Gen 2 (archived) /inventory/workspaces on the Meridian seed
Gen 2 (archived) /inventory/workspaces on the Meridian seed history · 5 moments →
Gen 2 (archived) /team/users on the Meridian seed
Gen 2 (archived) /team/users on the Meridian seed history · 7 moments →
Gen 2 (archived) /team/teams on the Meridian seed
Gen 2 (archived) /team/teams on the Meridian seed history · 14 moments →
Gen 2 (archived) /team/endpoints on the Meridian seed
Gen 2 (archived) /team/endpoints on the Meridian seed history · 7 moments →
Gen 2 (archived) /team/sessions on the Meridian seed
Gen 2 (archived) /team/sessions on the Meridian seed history · 9 moments →
Gen 2 (archived) /team/users/detail?user=amara%40meridian.dev on the Meridian seed
Gen 2 (archived) /team/users/detail?user=amara%40meridian.dev on the Meridian seed history · 7 moments →
Gen 2 (archived) /inventory/providers/detail?provider=anthropic on the Meridian seed
Gen 2 (archived) /inventory/providers/detail?provider=anthropic on the Meridian seed history · 4 moments →
Gen 2 (archived) /inventory/skills/detail?skill=deploy on the Meridian seed
Gen 2 (archived) /inventory/skills/detail?skill=deploy on the Meridian seed history · 5 moments →

Artifacts

/alerts (local dev)/campaigns (local dev)/compliance (local dev)/cost (local dev)/dlp (local dev)/team/endpoints (local dev)/findings (local dev)/inventory/harnesses (local dev)/identity (local dev)/integrations (local dev)/live (local dev)/inventory/mcp-servers (local dev)/inventory/models (local dev)/fleet (local dev)/performance (local dev)/controls (local dev)/posture (local dev)/inventory/providers/detail?provider=anthropic (local dev)/inventory/providers (local dev)/team/sessions (local dev)/inventory/skills/detail?skill=deploy (local dev)/inventory/skills (local dev)/team/teams (local dev)/inventory/tools (local dev)/team/users/detail?user=amara%40meridian.dev (local dev)/team/users (local dev)/inventory/workspaces (local dev)/organization/endpoints (local dev)/overview (local dev)/policies (local dev)/activity (local dev)/organization/teams (local dev)/organization/users/detail?user=amara%40meridian.dev (local dev)/organization/users (local dev)

Qpoint Brand Style Guide