← Cycles
Design · c99

Nuxt Backend Interface

activecreated 2026-09-27· last activity 2026-10-02· mode: archaeology → formula — surface the patterns app.qpoint.io and c92 already use, then codify them as rules and apply them deliberately

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

ReportFull Nuxt / Vue Conversion — two experiments, one decisionexecutive summary, decisions, the audit →

Why

The qdash UI (qcontrol/crates/qdash/ui) grew page by page through c1–c15 and design c59–c98. Every page fetches /api/* its own way through useApi, rollups live in lib/, unserved data is shimmed with projected constants, localStorage stand-ins and static catalogs, and the boundary between page, context component and library component is implicit. app.qpoint.io — the pre-AI-pivot app — has an established composable grammar (Tyler's useList / useEntity / metric primitives with thin domain wrappers) that nobody wrote down. Before the cloud backend arrives, the front end needs one documented data interface, and the app needs to be restructured onto it.

Objective

  1. Phase 1 — a per-page report: which data is served today and which is an artificial shim.
  2. Phase 2 — the front-end data-interface bible: structures, patterns, prototypical file layout, data flow, where business logic lives.
  3. Phase 3 — a labelled conversion plan (per harness + model) that applies the bible to the qdash UI, and a read on how clear the bible's instructions are.
  4. Phase 4 — execute the plan. Evaluated by Tyler Flint on adherence to the documents and on how clean, simple and consistent the result is.

Two agents run the same prompt in parallel; each keeps its artifacts under its own harness/model directory.

Scope

  • design/cycles/c99.nuxt-backend-interface/<harness-model>/ — each agent's audit, bible, plan, questions
  • qcontrol/crates/qdash/ui/app/ — pages, components, composables, lib (the conversion target)
  • app.qpoint.io/app/composables/ — the reference patterns (read-only)
  • brand/component_philosophy.md, brand/design_methodology.md — the founding documents the bible extends

Key Changes

Each agent appends its own dated entries below; never rewrite another agent's.

claude-code-opus-5.5

  • 2026-09-27 · kick-off. Mark's rulings when asked:
    • Each track builds a sibling app in its own worktree and branch, both apps runnable and unconnected. This track wrote the shared convention, PARALLEL-APPS.md; the Fable track adopted it and added two rules.
    • Nuxt side only; /api/* is a frozen contract.
    • Foundation + Team exemplar first, then waves.
    • Library components are staged locally and flagged for q-nuxt-layer, not extracted.
    • This track: app crates/qdash/apps/claude-code-opus-5.5/, branch c99/claude-code-opus-5.5, app :3031, seed :7881.
    • Record: claude-code-opus-5.5/README.md.
  • 2026-09-27 · Phase 2 study. Six readers covered app.qpoint.io's composables and composition, the layer library tier, qdash as it stands, the founding docs, and a Tyler-lens rubric built from his commits. A cross-check re-verified 38 claims (31 held outright; the rest were corrected in place) and settled 16 contradictions against source → claude-code-opus-5.5/phase2/studies/.
  • 2026-09-27 · Phase 1 complete. 44 per-page reports (43 routes plus the shell, 1,964 classified elements), each checked by an adversarial verifier, with an index and four backend reference files → claude-code-opus-5.5/phase1/README.md. The headline: the browser invents little (17 SAMPLE and 106 PROJECTED literals, 61 LOCAL). The biggest shim is the backend join key. Attribution runs through agent_instances.run_id, which only the retired run envelope sets, so on a real fleet harness, user and team attribution goes empty. The Meridian seed hides this. The findings and posture reports were re-run as text after the harness blocked one subagent's writes.
  • 2026-09-27 · Phase 2 bible. The Qpoint data interface, now at v1.3. It was attacked four times before any page code: a four-lens review (82 findings), a recheck, a six-planner read-back (102 gaps) and a three-lens plan critique (76 findings). Every round and its disposition is recorded in review.md and phase3/critique.md. The data tier held through every round; the UI-tier seams (links, tables, states, proportion) were settled in v1.2 and v1.3.
  • 2026-09-27 · Phase 3 plan. phase3/plan.md, with:
    • a registry of every composable, rule, type, shim and component;
    • five family bills of materials (5,670 lines);
    • the critiques;
    • Stage 0 contracts;
    • an ownership map and a sign-off sheet.

    Execution runs in stages: S0 contracts → S1 shared-file freeze → S2 Team exemplar → checkpoint A → S3 lanes → S4 integration. Section 7 answers "how clear were the instructions".
  • 2026-09-27 · Phase 4 chassis. Built by hand on c99/claude-code-opus-5.5 (facd47e4 → 2efaef93): the transport, the primitive (11 specs), the query layer (one queue; 7 specs), the shell, the tier test, the typecheck and the parity harness. The parity harness caught a real divergence on its first run: a route map ported from the main checkout, which carries another session's uncommitted reorder.
  • 2026-09-27 · Stages 0–2a. Stage 0 settled one contract per shared component (bible v1.3, contracts.md); an adversarial check found no blockers.
    • Stage 1 (the shared-file freeze, 3718b156 → 7e2c3c10): the shared port vocabulary, wire types for every route (checked against 43 seed payloads), 21 shared-chrome library components with a /lab fixture gallery, the route map and shell, and parity v2. It went through a Tyler-lens review with 22 fixes.
    • Stage 2a (c88fc6fd → d60f2703): the Team data tier, the governance rules and shims, and the live plumbing, in three parallel lanes, each reviewed and fixed. The gate stands at 828 specs across 92 files, with the tier test and typecheck green.
    • The design-side record is committed at 90dd145.
  • 2026-09-27 · Stage 2b and checkpoint A.
    • The Team exemplar: establish pattern for a listing (599b7f28, /team/users) and for a detail page (bf61ca89, /team/users/detail). /team/sessions repeats the listing pattern verbatim.
    • The Inventory (I1), governance (G1) and fleet-views (F1) data tiers landed beside them. Each lane was built, reviewed through the Tyler lens and fixed before INT committed it.
    • At checkpoint A, INT took the lanes' requests. Three unruled strip differences now replicate the reference: value order, the pressed state, and Back after the Flagged tile. Other changes:
      • the entity exposes its stored record;
      • a POST's 404 throws in the backend's words;
      • TONE_BADGE, the data port fields and seriesData were added;
      • LAYER-CANDIDATES gained 9 incubating components and 11 layer fixes;
      • SIGNOFF was amended: V1, V3, Δ1, Δ3, Δ5, Δ6 and Δ16 changed, and B12 and B13 were added.
    • Gate: 1327 specs, tier test 16/16, typecheck clean. Parity on Team: 27 pass, 0 fail (a new back step checks the Flagged tile against the reference).
    • Commits run through 77dd8ab0. Record: claude-code-opus-5.5/README.md § Execution status.
  • 2026-09-27 · Stage 3 wave 1. HA registered the live plugin. Five lanes then ran in parallel, each building two steps, followed by a Tyler-lens review and a fix:
    • T2: teams and endpoints;
    • I-a: HarnessIdentityTable first (HI), then harnesses and models;
    • I-b: the four inventory listings;
    • G: campaigns, the first page on useQdashEntity, plus the staged rules moved into lib; then findings and alerts;
    • F: /live (its file-mode replay of 49,996 events shows 0 differences), performance and identity.

    INT committed 11 path-scoped commits (12b129de → 130d3c02), then gated them:
    • the strip shows an unserved active value only when a fixed vocabulary names it, which undoes checkpoint A's overreach;
    • one EntityChip mark lever replaces the two the lanes asked for;
    • LIVENESS_DOT, a /lab overlay frame, and 36 new LAYER-CANDIDATES components with 19 layer fixes;
    • one of those fixes is the layer's un-prebundled highlight.js, which broke skill detail on both apps.

    Gate: 1450 specs, tier test 16/16, typecheck clean, and all five family manifests pass. App at 5644c1f3, design at 28373a92.
  • 2026-09-28 · Stage 3 wave 2 and the S4 gate. Wave 2 built the rest (60129fd7 → 6daac227), so all 43 routes are on the new app:
    • session detail;
    • providers, accounts and harness installs;
    • the four inventory details;
    • integrations, compliance, framework and controls;
    • data protection, cost and posture;
    • the Working nav.

    Parity after the wave's reviews and fixes: team 67, inventory-a 65, inventory-b 94, governance 68 and fleet-live 56, with 0 failing and 1 pending, a case that S4a then closed.
    • S4a (c3817b51 → e689c54e) landed the chrome levers the lanes asked for:
      • on EntityMark, EntityChip, EntityAbsent, LedgerSection, ToneText and StatTile;
      • lib now returns every port row;
      • lib/monitored is the one home of the V1 rule, and one house plural carries counts (SIGNOFF V12);
      • LAYER-CANDIDATES gained 47 components, 14 fixes and an Amendments table.
    • Gate: 1614 specs, tier test 16/16, typecheck clean.
    • S4b (verification): a full parity sweep with budgets, a Working-nav walk, and write parity on the scratch seed.
  • 2026-09-28 · S4b, S4c and S4d.
    • S4b verified the whole app (63470928; design a57bb884):
      • parity: 273 cases and 78 SPA checks;
      • budgets: 45/45, with the new app making 696 requests in 65 s against the reference's 2,866;
      • a clean walk over the Working nav, the sidebar, the route map and 908 /lab scenarios;
      • a new write-parity harness (phase4/s4/write-parity.mjs): 46/46 verbs match on a scratch seed, and the shared seed was never written.

      Its fixes: a refused stream's backoff, the Working nav's reads, a legacy integration route, and one egress request body. New SIGNOFF rows L4, K6 and ND6.
    • S4c, a whole-app Tyler-lens review in four lenses (98fe7e92 → 598df17e), produced twelve rulings (R1–R12) and five disjoint fix groups:
      • one-line provenance headers in 334 files, with no cycle citations left in code;
      • one clock option, one team join, and composed views that own their readiness;
      • one column picker, and named verb-error ports;
      • one error binding on every table.

      Evaluation (phase4/s4/evaluation.md): adherence B+, clarity B+, consistency B+, simplicity A−.
    • S4d (design 4ea675e1) brought the law up to the code: bible v1.4, the contracts amendments, and registry v1.4 written out and checked against the code. It also wrote phase4/RECORD.md.
  • 2026-09-28 · report-opus thread (planned, not executed). Mark asked what this track would add to the report page so that its work is evaluated too. The eight additions are planned, so the thread can be picked up later: report-opus-plan.md and report-opus-prompt.md.

Outcome

Filled at completion.

Claude Code · Opus 5.5 track (2026-09-28)

  • Phases 1–3. 44 per-page provenance reports; the bible, The Qpoint data interface (now v1.4); a staged conversion plan with a registry, contracts, five bills of materials, an ownership map and a SIGNOFF sheet.
  • Phase 4. All 43 routes rebuilt as a sibling app on c99/claude-code-opus-5.5 (qcontrol-c99/claude-code-opus-5.5/crates/qdash/apps/claude-code-opus-5.5, :3031):
    • Pages are addresses: 1,009 lines against the reference's 9,475.
    • Blocks are appliances, and composables are thin over specced lib.
    • 120 library components incubate with fixtures and LAYER-CANDIDATES rows.
    • 1,660 specs pass; the tier test and typecheck are green.
    • Parity against the reference holds (276 cases, 78 SPA checks), budgets pass 45/45, and write parity passes 46/46.
  • The record. claude-code-opus-5.5/phase4/RECORD.md covers:
    • what was built, and how it was verified;
    • the prompt's "how clear are the instructions" question, answered again with Phase 4's evidence;
    • what remains, decisions M1–M8 for Mark, and ideas.
  • State. origin/c99/claude-code-opus-5.5 sits at 63470928 (pushed for Tyler from the _compare worktree). S4c's five commits (98fe7e92 → 598df17e) are local, and so are this track's six design record commits (90dd1457 → 4ea675e1; design main is 7 ahead of origin, counting the Fable track's 7bd8e702). Pushing them, and re-merging c99/compare, is Mark's call. Nothing is in feat/new-pages or main, and the layer is untouched.

Claude Code · Fable 5.1 track (2026-09-27)

  • Phase 1 — audit: four parallel page-by-page audits (43 pages + shell, 2 319 lines) assembled into claude-code-fable-5.1/01-data-audit.md: the whole-app matrix, nine cross-cutting findings (two very different kinds of "real", time as the structural lie, the 200-row session cap, seven fetches per people page, client joins, the few invented numbers, scattered staged capability), the shim taxonomy with what retires each, and twelve contract gaps ranked by pages unblocked.
  • Phase 2 — bible: 02-data-interface-bible.md — R1–R30 with a why and a test each: the three tiers (library part · fed appliance · page-as-wall-socket), the four homes below the line (contract types, service client, domain-blind primitives, thin domain composables) plus lib/ rollups, the read/write/filter paths, the import table, the field-name rule, the honesty rules (lib/projected.ts ledger; staged state on a local() transport with the served protocol), the prototypical tree, code prototypes, checklists, the deviations from app.qpoint.io, and v0.2 addenda from the first application.
  • Phase 3 — plan: 03-conversion-plan.md — convert = re-source · re-shape · re-label; seven tranches (chassis → Team → Inventory listings → all-time details → Fleet & Security → staged surfaces → Live); the eight-step per-page sequence; risks; the read-back on how clear the bible was.
  • Phase 4 — execution: adopted the cycle-root PARALLEL-APPS.md convention (standalone app per track; ui/, src/, layer read-only). Built qcontrol/crates/qdash/apps/claude-code-fable-5.1/ on branch c99/claude-code-fable-5.1 (worktree qcontrol-c99-fable, app :3032, seed :7882): tranche 0 (chassis: contract types, transport + primitives + spec, service plugin, ported rollups/shell/chrome, projected ledger, bible-check) and tranche 1 (the whole Team section — four listings and four details — as bills of materials over 10 domain modules and 27 fed appliances, every projected line on the ledger). 229 specs pass, bible-check clean, every page verified in the browser against the seed. Log: 04-execution-log.md. Tranches 2–7 remain as planned.
  • Fable track, tranches 2–7 (2026-09-27): all 43 routes converted as bills of materials by five parallel executors on a shared brief (claude-code-fable-5.1/phase4/EXECUTOR-BRIEF.md) — Inventory (two groups), Fleet & Security, the staged surfaces on a localBlob transport with the same localStorage keys, and Live; 66 spec files / 539 specs, bible-check clean, every page verified against the seed; bible v0.3 addenda from the executors' judgement calls; per-tranche reports under phase4/; latest commit 2d38ab6d on c99/claude-code-fable-5.1. Follow-ons listed in 04-execution-log.md §Close.
  • Fable track — follow-ons noted (2026-09-28, per Mark: "for a later moment"): the typing pass over ported lib/ internals (retire type Any); useResult gaining a missing computed so the not-found convention lives in the primitive; the Findings chips onto shell registration (Q10); on-screen captions for whole-run spend columns (a visible change — design call); ideas I1–I10 in questions-and-ideas.md, above all I2 (one change token instead of N polls); a layer-extraction cycle from the twelve LAYER-CANDIDATES.md rows; the cutover cycle that replaces ui/ with the chosen app. Sharable summary: the cycle's report page /cycles/design/c99/report (linked from the top of the cycle page via the new **Report:** header field); text twin EXECUTIVE-OVERVIEW.md at the cycle root.
  • Fable track — hand-off (2026-09-28): branches c99/claude-code-fable-5.1, c99/claude-code-opus-5.5 and c99/compare (both apps) pushed for Tyler; EXECUTIVE-OVERVIEW.md (TLDR, the three-outcome experiment frame, decisions D1–D9 with how to decide, the 45-minute evaluation route); the report page with the per-page bars and the pieces × pages grid, generated from the Phase 1 audit by claude-code-fable-5.1/scripts/audit-to-data.py. Scope ruling from Mark: the grid is about data flowing from qcontrol or a shared store (teams) — 44 synthetic pieces stand in for such data; 75 UI-state pieces (filters, toggles, labels, copy) are not data and are grey, hidden by default. Follow-on: a per-element field (team.teamName) pass against types/api/*.
  • Fable track — report shipped (2026-09-28): the report is live as Full Nuxt / Vue Conversion at /cycles/design/c99/report (design main commits 7bd8e702 → cc8a2fb5, deployed), with the bible and the executive overview readable at /cycles/design/c99/doc/…. Two site patterns opened for every cycle: the CYCLE.md **Report:** header (link card at the top of the cycle page) and the cycle-document route. Awaiting Tyler's evaluation (D1–D6).

Cutover (D9)

  • 2026-10-02 · planned, then moved to its own cycle. Mark asked for the old dash-uis to be archived and the Fable app promoted. The plan was written here as a D9 thread, then moved to c107 · qdash Cutover when Mark asked for its own cycle. The Fable app replaces the contents of crates/qdash/ui/; the old ui and the Opus app are kept as archive/* tags; feat/new-pages (PR #713) fast-forwards to the result. Mark: proceed, and confirm with Tyler afterwards.

Agents

  • claude-code-opus-5.5/ — Claude Code · Opus 5.5
  • claude-code-fable-5.1/ — Claude Code · Fable 5.1

Artifacts

Qpoint Brand Style Guide