ci-web's `test` (vitest run) globbed e2e/dashboard.smoke.spec.ts, which imports
@playwright/test (the Playwright runner, not vitest) and fails to load — "1 test
file failed" while the 44 unit tests passed. Restrict vitest's include to
src/**; Playwright keeps its own testDir (./e2e).
The backend still flags the P3 nodes (build/verify/dispatch) gated:true, but in
the live R720 deployment they are wired and active — so that flag is a stale
'P3 opt-in' hint, not a real 'inactive' signal. Stop deriving the dimmed/'inert'
treatment from stage.gated / meta.gated in both the Board columns and the DAG
nodes; activity is conveyed by live task counts + status colors. Human gates are
unaffected (still keyed off topology kind 'gate').
Typecheck + 36 tests + build all green.
GPT-4.1 cross-family review verdict: SHIP-WITH-FIXES, no BLOCKs (read-only,
XSS-safe, no-backend, gate-vs-inert all confirmed). Applied:
- a11y: aria-label on the Board/Pipeline Tabs; drawer collapsible section labels
are now semantic <h3> headings.
- Bundle: function-based rollup manualChunks splits react/flow/markdown/radix/
vendor so the 614 kB single chunk is gone (largest now ~142 kB react); app
code drops to ~30 kB. Clears the 500 kB Vite warning. CSS splits too.
(Skipped GPT's .prose-sm finding — incorrect; index.css uses a hand-written .md
block, not Tailwind Typography. Roving-tabindex left out by design for this
read-only view.)
Typecheck + 36 tests + build all green.
Fresh-context deep review verdict was SHIP-WITH-FIXES (all hard constraints held:
read-only, inert gate panel, XSS posture, no backend, gate-vs-inert semantics).
Resolved:
- Board columns: replace magic calc(100vh-220px) ScrollArea cap with a proper
flex chain (h-full/min-h-0) so card lists size to real column height at any
window size / wrapped toolbar.
- Valid ARIA: stage row is role=list, each column a role=listitem wrapping a
role=listbox of task-card options (no malformed listbox nesting).
- TopBar health dot uses status-active/status-failed tokens (no hardcoded Tailwind
palette colors).
- Stale TaskList reference in badge.tsx comment.
Typecheck + 36 tests + build all green.
isGate() now keys off topology node kind 'gate' (clarify) or the 'gate' stage,
not stage.gated — which actually means INERT (disabled P3 nodes build/verify/
dispatch). Inert columns get a dimmed + 'inert' treatment instead of a false
'human gate' lock. Verified against the live R720 dashboard (10 stages) via a
dev-proxy smoke test; typecheck + 36 tests + build all green.
Adds the styling foundation for the UI redesign (vibe-kanban / Magentic-UI /
Langflow references): Tailwind CSS + shadcn/ui primitives, HSL design tokens
(index.css) ported from theme.css, @/ alias, and the App.tsx Board|Pipeline tabs
shell. Extends StateResponse with the backend's existing stages[] for the Board.
theme.css kept transiently until components migrate to Tailwind. No backend
changes. Component fan-out (Board, MapNode, TaskDrawer, TopBar) follows.
Two dashboard-SPA refinements (frontend only):
1. Retry loops (plan<->review, build<->verify) no longer draw a backward arc over
the forward edge (the 'circular arrows'). Loop-backs are excluded from the
default render and from the dagre layout; instead the source node shows a small
↺ chip ('can send work back to ...'), and the actual return arc is drawn only
when a selected task ACTUALLY looped it (computed from its timeline), highlighted
on that task's path.
2. Q&A / Review Verdicts / Plan render human-readably instead of JSON blobs:
react-markdown (no rehype-raw -> raw HTML escaped, XSS-safe) renders findings/
answers/summary; verdicts as cards (badge + round + outcome), Q&A as per-turn
cards (string + dict shapes), plan as summary + phase/step lists.
16 frontend tests pass (incl. loopback default-off/on-when-looped, markdown bold,
and a no-raw-HTML XSS guard); typecheck + build clean.
New web/ SPA (React 18 + Vite 5 + TypeScript + React Flow + dagre, all pinned, no
CDN). Dark, three-pane layout: summary top bar, filterable task list, center
auto-laid pipeline map, and a right drawer showing a selected task's history
through each node (timeline with timestamps/duration/cost + Q&A/verdicts/plan).
Map nodes color by live state, loop-backs render dashed, clicking a node filters
the list, selecting a task highlights its path. Polls /api/state every 4s;
topology fetched once. dist/ is gitignored (built on the Mac, rsynced).