plan.md
C6: Dashboard Prototype Plan
Context
C5 established the data model for AI agent observability (10 inventory entities, data models, initial wireframes for agent-inventory). C6 takes those foundations and builds the complete dashboard prototype — the full navigation shell, all sections, and a clickable multi-page wireframe.
The initial prompt (cycles/c6.dashboard-prototype/initial-prompt.md) defines two phases:
- Phase 1 — Design brief: all pages, goals, data, actions, and page hierarchy
- Phase 2 — Clickable wireframe prototype covering the entire dashboard (no header, naked wireframe)
Decisions (confirmed with user)
- Alerting: Own top-level nav section (alongside Security, Inventory, Settings)
- Home page: Executive overview — active sessions, top risks, spend at a glance
- Inventory scope: Priority subset — Sessions + detail, Agents, Users, MCP Servers fully built; other 6 items get placeholder list pages
- Settings: Placeholder stub only
Proposed Architecture
Navigation Shell
No WireHeader. Three-column layout, left to right, page stretches full width:
┌──────────────────────────────────────────────────────────┐
│ Filter Placeholder │
└──────────────────────────────────────────────────────────┘
│ Global │ Category Nav │ Content (full width) │
│ Nav │ (section │ │
│ (always │ sub-items, │ │
│ visible)│ visible when │ │
│ │ in a section) │ │
└──────────┴────────────────┴──────────────────────────────┘
- Filter Placeholder Not important, very light / grey
- Global nav (leftmost, always present): Home, Security, Alerting, Inventory, Settings — icon + label or just labels (vue component)
- Category nav (middle panel, context-sensitive): sub-items for the active section (e.g. Inventory → Sessions, Agents, Users, MCP Servers…). Hidden on Home page. (create a component for this)
- Content area: stretches to fill remaining width
All pages use layout: 'wireframe' and render the shell as part of the page template (not a Nuxt layout).
Shell components to create in app/components/wire/ (auto-imported):
WireDashGlobalNav.vue— global nav column (Home, Security, Alerting, Inventory, Settings); highlights active sectionWireDashCategoryNav.vue— category nav column (section-specific sub-items); hidden on Home page; accepts asectionprop to render the right sub-items
Page template pattern:
<template>
<div class="flex h-screen">
<!-- Top filter bar (full width, very light/grey) -->
<div class="...filter bar..."></div>
<!-- Three-column body -->
<div class="flex flex-1">
<WireDashGlobalNav active="inventory" />
<WireDashCategoryNav section="inventory" active="sessions" />
<main class="flex-1 overflow-auto p-6"><!-- content --></main>
</div>
</div>
</template>
Page Hierarchy
Pages use nested directories matching the nav hierarchy. URLs mirror the structure.
app/pages/c6/wireframes/dashboard-v1/
├── home.vue → /dashboard-v1/home
├── security/
│ └── index.vue → /dashboard-v1/security
├── alerting/
│ └── index.vue → /dashboard-v1/alerting
├── inventory/
│ ├── index.vue → /dashboard-v1/inventory (category tiles)
│ ├── sessions/
│ │ ├── index.vue → /dashboard-v1/inventory/sessions — FULL
│ │ └── detail.vue → /dashboard-v1/inventory/sessions/detail — FULL
│ ├── agents/
│ │ └── index.vue → /dashboard-v1/inventory/agents — FULL
│ ├── users/
│ │ └── index.vue → /dashboard-v1/inventory/users — FULL
│ ├── mcp-servers/
│ │ └── index.vue → /dashboard-v1/inventory/mcp-servers — FULL
│ ├── models/
│ │ └── index.vue → /dashboard-v1/inventory/models — PLACEHOLDER
│ ├── api-keys/
│ │ └── index.vue → /dashboard-v1/inventory/api-keys — PLACEHOLDER
│ ├── endpoints/
│ │ └── index.vue → /dashboard-v1/inventory/endpoints — PLACEHOLDER
│ ├── capabilities/
│ │ └── index.vue → /dashboard-v1/inventory/capabilities — PLACEHOLDER
│ ├── files/
│ │ └── index.vue → /dashboard-v1/inventory/files — PLACEHOLDER
│ └── secondary-calls/
│ └── index.vue → /dashboard-v1/inventory/secondary-calls — PLACEHOLDER
└── settings/
└── index.vue → /dashboard-v1/settings — PLACEHOLDER
Phase 1: Design Brief
Deliverables
cycles/c6.dashboard-prototype/CYCLE.md— cycle definition and status trackercycles/c6.dashboard-prototype/briefs/dashboard.md— comprehensive design brief- One entry per page: goal, data conveyed, actions allowed
- Navigation shell description
- Type: wireframe
Page Descriptions (for the brief)
home — Cross-section org overview. Stats strip (active sessions, top risks, total spend today). Two panels: Security Posture summary (2-3 abstract risk items) + Inventory Summary (entity counts). Quick-links into each section.
security — Abstract posture view. Risk cards ("3 sessions using unknown API keys", "1 high-cost outlier session >$50"). Each card is clickable to a filtered inventory view. No raw event data.
alerting — Alert rules list with status (active/firing/muted). Recent alert fires with abstract descriptions. Link to policy configuration. Could surface: "API key sk-ant-...C001 used in session — unknown key policy fired."
inventory — Category home. Grid of 10 entity type tiles (Session, Agent, User, Model, API Key, Endpoint, MCP Server, Capability, File, Secondary Call), organized by category (Core / Identity / Capabilities / Exposure). Each tile shows count + last-seen. Click → entity list page.
sessions — Full sessions list. Same data as c5 but now a left-nav section, not a standalone feature. Filter bar, sortable columns, row click → session-detail.
session-detail — Single session full context. Mirrors c5 detail: identity block, metrics, turn timeline, tool calls, files, secondary calls.
agents — Agent inventory list. Columns: name, version, sessions, users, first/last seen.
users — User inventory list. Columns: email/username, sessions, total cost, primary agent, first/last seen.
mcp-servers — MCP server list. Columns: name, version, transport, tools available, sessions, total tool calls, error rate.
Placeholder pages (models, api-keys, endpoints, capabilities, files, secondary-calls, settings): Left nav + section header + "Coming soon" content block only.
Phase 2: Wireframe Implementation
Step-by-step
- Create
cycles/c6.dashboard-prototype/CYCLE.md - Run
/write-brief→cycles/c6.dashboard-prototype/briefs/dashboard.md - Create
app/pages/c6/index.vue(cycle gallery) - Create shell components:
WireDashGlobalNav.vue,WireDashCategoryNav.vue - Build pages section by section (home → security → alerting → inventory → inventory sub-pages)
- Register all pages in
app/data/wireframe-registry.ts - Run
/flowto verify navigation connects correctly
Wire components to use
WireDashGlobalNav(new) — global nav columnWireDashCategoryNav(new) — category nav columnWireTable— session/agent/user/mcp list pagesWireCard— summary panels, risk cards, category tilesWireBox— placeholder blocks for stub pages
Key constraint
No WireHeader on any page. The sidebar IS the navigation. Pages are "naked" — content area only.
Critical Files
cycles/c5.dashboard-reframing-ai/models.md— field definitions for all entity list columnscycles/c5.dashboard-reframing-ai/briefs/agent-inventory.md— reference for sessions/detail designapp/pages/c5/wireframes/agent-inventory-v1/*.vue— existing wireframes to referenceapp/data/wireframe-registry.ts— registry for new entriesapp/components/wire/— Wire* component libraryapp/pages/c6/— target directory (does not exist yet)
Verification
npm run dev→/c6gallery loads and lists all registered pages- Left nav renders on every page without a top header
- Global nav (Home → Security → Alerting → Inventory → Settings) navigates correctly
- Session row click → session-detail works
- Inventory tile click → entity list page works
- All 16 pages load without console errors