Index
Replace the Inventory and Organization landings with nav disclosures, and make the index page a stack of sections, each summarised by micro versions of the DataMachines on its listings.
New in this cycle: DataIndexSection: one nav section on an index page — title (not a link), lede, a dot-separated row of listing links, a hairline and a default auto-fill grid, so columns line up from section to section
Why
/inventory and /organization are "Design in progress" placeholders. About ten cycles tried to design them, c100's bake-offs most recently, and none reached a pick. Mark's reframe (initial-prompt.md):
- the two nav items only open their submenus;
- the overview job moves to one index page, whose sections show at-a-glance micro versions of the listings' own DataMachines.
That keeps every number computed in one place (c100's abstraction ladder) and gives the home page real content.
Objective
- Inventory and Organization in the qdash sidebar open their submenus and navigate nowhere.
- Their index pages are gone. Old URLs and crumbs land somewhere sensible.
- The index page renders one section per nav section, each with a title, a link and a summary of micro DataMachines.
- R31 holds on that page: loading, failed and empty can be told apart.
- The two new components (section shell and micro machine) are in the layer and demoed on the design site across empty, minimal, typical, overflow, loading and failed.
Scope
- qcontrol:
crates/qdash/ui/app/:AppSidebar,lib/moved-routes, the link and crumb sweep (41 refs),/page, a page composable,lib/index-micros.tsand its spec. - layer: a micro DataMachine and a section shell (names in Q6), plus micro renderings of the band devices.
- design: this directory; component demos and registry entries.
- Out of scope: new metrics; a backend summary endpoint; fixing the bands' own R31 states (c108); Cost Center (c105).
Key Changes
- kick-off (2026-10-02): read the founding docs (component philosophy, design methodology), the layer's DataMachine, DataSurfaceSection and NavVerticalSubmenu, c100 and c108. Inventoried every DataMachine on the 10 listings: 27 machines, a vocabulary of three or four devices, 6 with no headline value, 2 with switchers, most reading 0 while loading. Findings:
NavVerticalSubmenualready supports a toggle-only parent (noto, plusmatch), so the nav change needs no layer work.- About 16 feeds at listing cadence on one page is the main risk.
Wrote plan.md: nav, components, page, six phases, risks and Q1–Q9 for Mark. - decisions (2026-10-02): Mark answered Q1–Q9 and a Q10 (plan §9).
- Defaults: index at
/, a listing-links row under each section title,/inventoryand/organization→/#section, a newDataMachineMicrocomponent, all machines, component demos before qdash, c100 closes on a note, history graphs become spark + period total. - Changed from the defaults: Activity joins as a third section (35 micros), and the nav is open-only (a click never closes a submenu).
- Defaults: index at
- Phase 1a (2026-10-02): done on qdash in the files c108 isn't touching. Uncommitted.
- Sidebar: Inventory and Organization are disclosure buttons (controlled
NavVerticalSubmenuwith noto). Q5 changed mid-phase from open-only to toggle: a second click closes. - Landings:
pages/inventory/index.vueandpages/organization/index.vueare deleted.movedTarget()inlib/moved-routessends/inventory,/organizationand/teamto/#sectionin one hop. - Section data:
INDEX_SECTIONSinlib/working-nav, shared with the sidebar. /page: an interim index (Home: three anchored sections, each with its links row). The summaries arrive in Phase 4.- Stale links fixed: "All harnesses" and the surface fallback →
/inventory/harnesses;LISTING_KEYSre-keyed; MCP adoption →/inventory/mcp-servers; the DLP tile → harnesses; connectors →/#inventory;/overviewlinks and the Users crumb →/#section. - Checks: specs pass (27, including new
movedTargetandINDEX_SECTIONScases) andnpm run checkis clean. In the browser: the redirect, toggle, persistence and arriving-in-a-section all work on the seed backend. - Phase 1b (deferred until c108 commits): crumbs on the 21 listing and detail pages c108 has dirty, plus
ToolAgents.vue/AccountHarnesses.vue"All harnesses →". Until then they work through the redirect.
- Sidebar: Inventory and Organization are disclosure buttons (controlled
- Phase 2 (2026-10-02): layer and demos built. Uncommitted; no version bump.
- Layer, new:
DataMachineMicro(data/machine/Micro.vue) andDataIndexSection(data/index-section/). - Layer, backwards-compatible props:
DataRankedBarsmicro/bare;DataDonutCharthideLegend. - Layer docs: CLAUDE.md catalog rows, plus migration notes for v0.9.28.
- Micro:
- Title 12 / med / muted (truncates), hairline, value 20 bold, the device filling the rest; about 188 × 53.
val: nullrenders "—", not DataMetricValue's spinner. The whole card is a real NuxtLink.- A
#markslot holds the projected glyph. - It is the same 4-row subgrid as DataMachine, so
DataMachineGroupneeds no change.
- Section: title (not a link), lede, dot-separated listing links, hairline, and a default auto-fill grid (180 px minimum per column), so columns line up across sections.
:grid="false"hands the layout back. - Devices:
- segment bar
legend="none"8 px; - ranked bars
micro: top-1 label · share over a 3 px meter (recommended), withmicro bare(3 hairlines) as the alternative; - donut → its segment bar (recommended), with a 20 px ring as the alternative;
- spark 16 px; projected = a 10 px dashed ring; attention = count +
SecuritySeverityTag.
- segment bar
- Design site: demos at
/components/data-machine/data-machine-microand/components/data-machine/data-index-section, with six scenarios plus every device form, and a composed three-section page. Fixtures inapp/data/index-micro-fixtures.ts(35 micros, in the shape Phase 4 will use). Demo helpers:components/index/MicroDevice.vueandProjectedMark.vue. - Verified light and dark at 1280, 800 and 375 px.
- Found along the way: DataMetricValue's null state is a spinner, not "—". That affects c108's plan, so it was flagged there.
- Layer, new:
- Phase 1a pushed (2026-10-02, from another session): Mark wanted the new nav in the branch going to a colleague, so the Phase 1a qdash work is committed as qcontrol
7b732d7d("Inventory and Organization are disclosures; / is the index") and pushed to originfeat/new-pages.- What's in it: the 19 files under
crates/qdash/ui/appas they stood at 13:10, including the two staged landing deletions. - Checked before committing: 572 specs,
bible-checkclean. In the browser on:3030,/inventory→/#inventory, Inventory toggles closed → open → closed on/, and it opens on its own inside/inventory/*. - Published layer: 0.9.27 (
be148b37) already hasNavVerticalSubmenumatch/v-model:open, so the commit runs on the published layer. - Still to do: Phase 1b and Phase 2 (the layer
DataMachineMicro/DataIndexSectionand the design-site demos) are untouched and still uncommitted.
- What's in it: the 19 files under
- Phase 2 review (2026-10-02): Mark's rulings (plan §9):
- names, scale and banner-only failure as built;
- ranked bars → 3 unlabelled bars;
- repeated titles → try both on the demo.
The demo fixtures turned out to cover only 20 of the 35 machines, so they now hold all 35, each with alistingand itslistingTitle, plusbyListing().- The
DataIndexSectiondemo gained alayoutswitch: flat with prefixed titles, or clustered with listing titles. - 3 bars are the default in both demos and in
IndexMicroDevice. - The layer and registry wording now names 3 bars as the pick.
- Checked in the browser: both layouts across Inventory, Organization and Activity.
Next: Mark picks a layout → release 0.9.28 → Phase 4. - Layout pick + promotion (2026-10-02): Mark picked the flat grid with prefixed titles ("I already love this one, let's promote to qcontrol"). Phase 1a had already been committed as qcontrol
7b732d7d.- Phase 3: layer
df57642and9a2df40(v0.9.28), published by CI. Lockfiles refreshed in design, bob-wire, app.qpoint.io, www.qpoint.io, qflow and qdash (committed in each, not pushed). - Toggle defaults: Mark asked mid-phase that the Working and Experimental toggles start off. They now keep their choice in sessionStorage, and the old localStorage value is removed (
98853509). - Phase 4 (
52df31b6):lib/index-micros.ts+ spec (11 tests): 20 / 7 / 8 micros; null until ready with an empty device; Tool success with nothing judged reads null.composables/fleet/indexSummary.tswires the listings' own composables;useSkillListingexposes a five-feedstate.- New
components/index/MicroDevice.vueandcomponents/lib/ProjectedRing.vue./renders threeDataIndexSections. - Checked on the seed backend: 35 micros render, and the 7 listings checked match their machines value for value.
- Full suite 586 passing;
npm run checkclean.
- Built and pushed: dist regenerated (
ba39df37, layer 0.9.28) and pushed tofeat/new-pages(PR #713),bf351751..ba39df37. - Still open:
- Phase 1b crumbs on 21 pages + 2 "All harnesses" links (unblocked now that c108 has committed);
- R-1 poll load: ~24 feeds at listing cadence, no shared requests;
- Phase 5 docs;
- design-site c109 files uncommitted.
- Phase 3: layer
- Phase 5, documentation (2026-10-02):
- Captures: 8 shots, from
c109-index-qdash.json(:3030; subjectspage/index,component/nav-vertical-submenu,page/teams) andc109-index-design.json(the demos). - Archive entry
2026-10-02-c109-index.
- Captures: 8 shots, from
- Phase 1b + nav (2026-10-02): done and pushed to
feat/new-pages(ba39df37..d05ebdd7).- Breadcrumbs (
7133a7e8): the Inventory and Organization crumbs on 21 listing and detail pages link/#inventory//#organizationdirectly. The two "All harnesses →" links and the empty harness-install detail →/inventory/harnesses. In the browser, a crumb lands on its section, scrolled under the header. - Overview leaves the nav (
d37698ff, Mark): the index behind the logo is the overview now, and/overviewstays routable by URL. - Dist regenerated after each (
4d6e4605,d05ebdd7). - Gotcha: the shared
:3030dev server's watcher missed batch edits. Touching each file one at a time (with a short pause) got them picked up.
- Breadcrumbs (
- Micro-cards thread (2026-10-02, after close): prompt · plan.
- On qdash via the local layer (uncommitted): roll-down labels (
DataRankedBars microLabels="beside", ending at 10 px Inter bold); micro titles 12 → 16 px bold; section grid gaps 20 / 32 → 48 / 48. - Then in the design prototype space:
/pages/phase3/index-micro-variations, with presets A–E (today · micro cards · micro cards with small data · section card · section card with tiles) and every knob live.- Each micro can be a white, rounded, soft-shadowed card, or the whole section can be. The data shrinks to 13 px titles, 16 px values, 6 px bars and 12 px sparks.
- Section titles are a knob too, defaulting to 28 px (Mark: "a bit bigger").
- Design-local parts:
IndexMicroProtoandIndexProtoSection. - Captures: threads
rollup-labels(3) andmicro-cards(6). - Dev servers: watchers on this machine missed edits repeatedly, so I worked against my own restartable servers (design
:3000, a qdash clone on:3034). - Pick (Mark): preset B, micro cards ("excellent, let's go with the default at the top").
- Layer 0.9.29 (
87835a1,7e8a6b2):DataIndexSectioncards(default on) makes its micros white cards (12 px corners, 14 px padding, soft shadow, a hairline border in dark mode) with 16 / 16 px gaps,minColumn190 and a 28 px title.DataMachineMicrocard(inherits) and a 14 px bold title.DataRankedBarsmicroLabels="beside". - Lockfiles committed in all six consumers.
- qdash:
0fbee449(roll-down labels); dist5d7dd5da, built from a clean worktree of HEAD so the c110 session's in-progress Activity files stay out. Verified on the:3034clone. Pushed tofeat/new-pages(d05ebdd7..5d7dd5da). - Record: capture
c109-qdash-index-cards(threadmicro-cards) is now the archive entry's hero; HISTORY's c109 entry has an after-close note; theDataMachineMicrodemo has acardcontrol.
- Layer 0.9.29 (
- On qdash via the local layer (uncommitted): roll-down labels (
Outcome
Closed 2026-10-02.
- Inventory and Organization are nav disclosures: a click toggles the list, and their landings are gone.
/is the index: threeDataIndexSections holding all 35 listing machines asDataMachineMicros, in a flat grid with prefixed titles. Ranked lists show as 3 bare bars and history graphs as spark + period total.- Every micro reads its listing's own band, so it equals its machine. All 7 listings checked matched value for value on the seed backend.
- The layer's two components and their micro props shipped in q-nuxt-layer 0.9.28.
- qdash work landed on
feat/new-pages(PR #713), from7b732d7dthroughd05ebdd7: index, nav toggle, toggle defaults, breadcrumbs, Overview off the rail.
Follow-up: R-1, the poll load. The index runs about 24 feeds at listing cadence (3 s), and installations, agents and teams are fetched more than once. It needs shared requests, or a slower cadence for the index, before real traffic.
Learnings:
- Inventory the existing machines before designing a micro. 35 machines came down to four device forms.
- Keep the micro's props a strict subset of the full component's, so mapping one to the other means deleting props, never renaming them.
- Fixtures that cover only part of the set hide the very problem being judged: the repeated titles appeared only with all 35.
- A capture
hideCssofnavalso hides component<nav>s. - A shared dev server's watcher misses batch edits. Touch the files one at a time.
Visual record
32 captures — heroes, page slices, and full-page renders. Click to view.
Micro cards (design prototype space)
2026-10-02· 14 captureslatest













Small labels on the roll downs
2026-10-02· 6 captures





Earlier captures
2026-10-02· 12 captures











In the archive
Artifacts
- initial-prompt.md
- thread: micro-cards — prompt + plan
- initial-prompt.md
- plan.md