qdash Cutover
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
- 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).
- 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-pagesfast-forwards to it and PR #713 updates. - Archive. The old ui and the Opus app stay reachable through tags, branches and a visual record, with exact "how to look" instructions.
- 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, theui/cycles/c16.fable-cutover/twin, branchesfeat/new-pagesandc99/*, and thearchive/*tags. - design: this directory; c99's record (D9 answered);
CLAUDE.mdSister Projects;.claude/launch.json; the/todospage registry and shot base;cycles/CYCLES.mdandcycles/HISTORY.md; memory. - Out of scope: backend
src/changes; the PR #713 conflicts withmainin qevents (they predate this cycle); the layer-extraction cycle forLAYER-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.tsedit; - 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 overgit+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.jspre-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.
- 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,
- rebase (2026-10-02): Mark asked to rebase from
main(C10). A trial ran in a throwaway worktree:feat/new-pagesontoorigin/main8fffe91d: one commit (587c235e) conflicts in qeventsCHANGELOG.mdandexamples.rs, both mechanical.cargo checkpasses andmake schemasregenerates 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 newc107/cutoverbranch in its own worktree. Thec99/*branches stay as they are.feat/new-pageslands 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
c4d0e007and Opus598df17e. Discarded the strayworking-nav.tsedit; it's already in Fable. - P1. Pushed the annotated tags
archive/qdash-ui-gen2→d52ff77b,archive/qdash-opus-5.5→598df17eandarchive/c99-compare→4bd30359. - P2. Rebased in worktree
qcontrol-c107onc107/cutover, identical to the trial. 186 commits now sit onorigin/main8fffe91d. - P3 and P4.
a83234e9(move only) and18cdaef5(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). Then98f17218(qcontrol twin c16). - Verified on the embedded release binary:
- 556 specs and
bible-checkpass; - 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/dlpslowest at 3.1 s.
- 556 specs and
- Correction to ui-preservation.md: the
:7882seed 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-finalandcutover, 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
mainstays unchanged and new work lands on the new-pages branch.feat/new-pagesforce-pushed to98f17218(leasec8152d9a).origin/mainwas8fffe91dbefore and after; localmainuntouched. The branch is 0 behind and 186 ahead ofmain, 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.../qcontrolreset to the new tip (its tree was clean). The gen-2 dev server on:3030was stopped.npm ciand 556 specs pass there. Launch configqdash-app(:3030,NUXT_LOCAL_LAYER=1, seed:7882viaqdash-seed) serves Organization → Users with no console errors.- Repointed: design
CLAUDE.md,.claude/launch.json(qdash-app/qdash-seed;qdash-app-opusremoved), the/todospage registry andtodos-pages.json(base:3030), and memory (qdash-active-app, c107, the index). - Teardown: removed the
qcontrol-c99-fable,qcontrol-c99/_compareandqcontrol-c107worktrees and the localc107/cutoverbranch; stopped:3032. Kept theqcontrol-c99/claude-code-opus-5.5worktree, because a parked session's cwd and an untracked.nuxtrcare in it; remove it withgit worktree removeonce that session is done.qcontrol-c99/_seed/stays, becauseqdash-seeduses it.
- P0. The Fable tree was quiet: no edits for 3 hours, only its dev server. Pushed Fable
- opus wrap-up (2026-10-02). Mark asked whether the "parked Claude session" in the Opus worktree needed anything.
- It didn't. Session
2e2a1c24was deleted on 2026-09-28. What was left was an orphanedtail -f | ugrepwatcher on its parity log, whichlsofhad labelledclaude. - Stopped the watcher and removed the worktree. The branch and the
archive/qdash-opus-5.5tag hold the code; the untracked.nuxtrcis already superseded by H3. - The run recipe was tested from the tag:
npm ci, 1,660/1,660 specs, and/team/usersrenders on:3031against 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-opusplan is marked superseded. - The c99 report page has an outcome card linking to STORY.md and REVIEW-OPUS.md.
- It didn't. Session
- 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 ondesign-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
../qcontrolrelease binary and restartedqdash-seed, so:7882now 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


























Gen 2 as archived
2026-10-02· 27 captures


























Artifacts
- initial-prompt.md
- thread: cutover — prompt + plan
- REVIEW-OPUS.md
- STORY.md
- initial-prompt.md
- opus-harvest.md
- pr-713-body.md
- ui-preservation.md