From 4d7c605256a1f1899ac889b83da468d4c6580728 Mon Sep 17 00:00:00 2001 From: Shay Date: Thu, 28 May 2026 07:29:02 -0700 Subject: [PATCH] docs(workbench): add temporary UI continuation plan --- docs/plans/workbench-ui-continuation.md | 246 ++++++++++++++++++++++++ 1 file changed, 246 insertions(+) create mode 100644 docs/plans/workbench-ui-continuation.md diff --git a/docs/plans/workbench-ui-continuation.md b/docs/plans/workbench-ui-continuation.md new file mode 100644 index 00000000..6971f9a6 --- /dev/null +++ b/docs/plans/workbench-ui-continuation.md @@ -0,0 +1,246 @@ +# Workbench UI — Continuation Plan + +> **Status:** temporary working plan — delete when all phases are merged +> **Scope:** `workbench-ui/` only +> **Tracks against:** current `main` @ `89defef` + +--- + +## Context + +The CORE Workbench is a React + Vite + TanStack Query frontend that serves as the +primary operator interface for the CORE engine. The shell is structurally sound. +Four feature routes are implemented. Six routes remain placeholders. The right +inspector is a stub kept collapsed. This plan sequences the remaining work. + +### What exists today + +| Area | Status | Notes | +|---|---|---| +| Shell grid (TopBar / LeftNav / StatusFooter) | ✅ Live | Token-driven, tested | +| Design token substrate (`src/design/`) | ✅ Complete | **Do not expand** except `EmptyState` / `CommandPalette` | +| CommandPalette (⌘K) | ✅ Live | Wired in TopBar | +| ApiErrorBoundary | ✅ Live | Wraps `` | +| Chat route | ✅ Implemented | `src/app/chat/` — turn flow, trace drawer, evidence | +| Proposals route | ✅ Implemented | `src/app/proposals/` — queue, detail, review lifecycle | +| Replay route | ✅ Implemented | `src/app/replay/` — artifact comparison | +| Evals route | ✅ Implemented | `src/app/evals/` — lanes, runs, metrics | +| Trace route | 🔴 Placeholder | `src/routes/TraceRoutePlaceholder.tsx` | +| Runs route | 🔴 Placeholder | `src/routes/RunsRoutePlaceholder.tsx` | +| Packs route | 🔴 Placeholder | `src/routes/PacksRoutePlaceholder.tsx` | +| Vault route | 🔴 Placeholder | `src/routes/VaultRoutePlaceholder.tsx` | +| Audit route | 🔴 Placeholder | `src/routes/AuditRoutePlaceholder.tsx` | +| Settings route | 🔴 Placeholder | `src/routes/SettingsRoutePlaceholder.tsx` | +| RightInspector | 🔴 Stub | Hardcoded collapsed in `Shell.tsx` (W-027) | + +### Existing query hooks (api/queries.ts) + +- `useRuntimeStatus` — `/runtime/status` +- `useChatTurn` — `/chat/turn` +- `useArtifacts` — artifact listing +- `useArtifact` — artifact detail +- `useReplayComparison` — `/replay/compare` +- `useProposals` — proposals listing +- `useProposal` — proposal detail +- `useEvalLanes` — eval lanes listing +- `useEvalLane` — eval lane detail +- `useEvalExecution` — eval run execution + +**No hooks yet exist** for: runs, trace sessions, packs, vault, audit log, or settings. + +--- + +## Constraints + +- Documentation stays in Markdown, never HTML dashboards. +- `src/design/` is a protected Branch 1 substrate. Only `EmptyState` and `CommandPalette` may be edited there. +- New UI pieces go feature-local: `src/app//` or `src/routes/Route.tsx`. +- Zero hardcoded hex values — always reference CSS custom properties from `tokens.css`. +- No new state management libraries. Prefer TanStack Query + React `useState` / `useReducer` + `useContext` where needed. +- All new routes need at minimum a smoke test and a loading/empty/error state. +- Schema/type mirrors in `src/types/api.ts` must stay in sync with the Python backend. +- PR discipline: small, load-bearing, each with tests. Follow existing ADR checklist. + +--- + +## Implementation Sequence + +### Phase 1 — Polish the four implemented routes + +**Branch prefix:** `workbench/WIP-1-*` +**Goal:** Make Chat, Proposals, Replay, and Evals cohesive and cross-linked before adding new surfaces. + +#### 1a — Chat + +- [ ] Audit loading / empty / error states for consistency +- [ ] Improve trace-hash and proposal-candidate navigation from within a turn response +- [ ] Verify ⌘K command entries exist for `New chat session` and `Jump to proposal` +- [ ] Extend `Shell.test.tsx`-style tests for any new interaction paths + +#### 1b — Proposals + +- [ ] Audit queue list loading / empty / error states +- [ ] Strengthen proposal detail: add direct link to its source artifact and replay-comparison entry +- [ ] Expose review-lifecycle color tokens (`review-pending`, `accepted`, `rejected`, `withdrawn`) consistently across list and detail views +- [ ] Ensure suggested-CLI block is selectable / copyable + +#### 1c — Replay + +- [ ] Audit artifact-selector loading / empty / error states +- [ ] Improve divergence-severity and metadata presentation clarity +- [ ] Add a direct link from replay comparison back to the originating proposal where applicable +- [ ] Add route tests for primary comparison path + +#### 1d — Evals + +- [ ] Audit lane list and eval run view states +- [ ] Improve metric readability — consider aligned numeric columns +- [ ] Add route tests for lane selection and run inspection + +--- + +### Phase 2 — Build the Runs route + +**Branch prefix:** `workbench/WIP-2-runs` +**Goal:** Replace `RunsRoutePlaceholder.tsx` with a real first-version route. + +**Why this is next:** The existing `useArtifacts` and `useArtifact` query hooks already provide the needed read paths. Runs is the closest unfinished route to having backend support. + +- [ ] Create `src/app/runs/` directory +- [ ] Build `RunsRoute.tsx`: artifact listing table — sortable by date, filterable by status +- [ ] Build `RunDetail.tsx`: artifact detail panel — metadata, trace hash, proposal links, replay entry-point +- [ ] Wire deep link from RunDetail → Replay comparison +- [ ] Add loading / empty / error states +- [ ] Update `App.tsx` to swap placeholder for the real route +- [ ] Add route tests + +--- + +### Phase 3 — Build the Trace route + +**Branch prefix:** `workbench/WIP-3-trace` +**Goal:** Replace `TraceRoutePlaceholder.tsx` with a first-version standalone trace explorer built by promoting and reusing the chat trace model. + +**Why this is next:** Chat already contains trace-oriented UI logic. Trace should be grown by promotion, not by inventing a separate graph system from scratch. + +- [ ] Audit what `src/app/chat/` already exposes for trace viewing +- [ ] Extract or adapt the trace model into a reusable `src/app/trace/` home +- [ ] Build `TraceRoute.tsx`: trace session list / selector +- [ ] Build `TraceDetail.tsx`: node-by-node state exploration using existing state-color tokens (`decoded`, `inferred`, `evidenced`, `contradicted`, etc.) +- [ ] Read-only first — no mutations in v1 +- [ ] Add `useTraceSession` and `useTraceNode` query hooks to `queries.ts` once backend contract is confirmed +- [ ] Update `App.tsx` to swap placeholder +- [ ] Add route tests + +--- + +### Phase 4 — Activate the RightInspector + +**Branch prefix:** `workbench/WIP-4-inspector` +**Goal:** Replace the inspector stub and the hardcoded `inspectorCollapsed = true` in `Shell.tsx` with a real, read-only detail surface. + +**Why this comes after Runs + Trace:** Entity shapes must be concrete before the inspector can meaningfully propagate them. Doing this first would mean speculating on schema. + +- [ ] Add a minimal selection model: a `useInspectorStore` context/reducer that routes can publish into +- [ ] Lift the inspector toggle into `TopBar` (icon button, rightmost, `aria-expanded`) +- [ ] Replace `const inspectorCollapsed = true` with reactive state wired to the store +- [ ] Implement `RightInspector.tsx` — reads selected entity from the store, renders detail by entity type +- [ ] Support initial entity types: `artifact`, `proposal`, `trace-node`, `replay-diff` +- [ ] Read-only in v1 +- [ ] Add tests for toggle behavior and entity rendering + +--- + +### Phase 5 — Define contracts for remaining placeholder routes + +**Branch prefix:** `workbench/WIP-5-contracts` +**Goal:** Before building Packs, Vault, Audit, and Settings, confirm Python schema shapes and add TypeScript mirrors. + +**These routes are still true placeholders with no corresponding query hooks. Contract work precedes UI depth.** + +#### Packs +- [ ] Confirm pack listing and pack-detail API shapes with backend +- [ ] Add `usePackList` and `usePack` hooks to `queries.ts` +- [ ] Add types to `src/types/api.ts` + +#### Vault +- [ ] Confirm vault entry listing and entry-detail API shapes +- [ ] Add `useVaultEntries` and `useVaultEntry` hooks +- [ ] Add types to `src/types/api.ts` + +#### Audit +- [ ] Confirm clearance-event log API shape (pagination, filters) +- [ ] Add `useAuditLog` hook +- [ ] Add types to `src/types/api.ts` + +#### Settings +- [ ] Enumerate mutable runtime settings and confirm read/write API contract +- [ ] Decide which settings are operator-only (read only in UI) vs. writable from the workbench +- [ ] Add `useSettings` and `useUpdateSettings` hooks + +--- + +### Phase 6 — Implement remaining routes + +**Branch prefix:** `workbench/WIP-6-*` +**Goal:** One route per PR, in this priority order based on anticipated backend readiness. + +1. **Vault** — hierarchical grounded knowledge browser; uses grounding-source color tokens (`grounding-teaching`, `grounding-pack`, `grounding-vault`, `grounding-oov`, etc.) +2. **Packs** — pack management: list, inspect contents, trigger re-ingestion; piggybacks on vault color system +3. **Audit** — temporal clearance-event log; uses clearance tokens (`cleared`, `violated`, `unassessable`, `suppressed`); time-sorted, paginated table +4. **Settings** — runtime config surface: model selection, threshold sliders, API endpoint override; write paths gated behind explicit confirmation + +Each must have: +- [ ] Loading / empty / error states +- [ ] Route tests +- [ ] Updated `App.tsx` wiring (placeholder swap) +- [ ] ⌘K command entries + +--- + +### Phase 7 — ⌘K command registry completion + +**Branch prefix:** `workbench/WIP-7-command-palette` +**Goal:** Fill the CommandPalette command registry with live, route-aware entries. + +- [ ] Route navigation: all 10 nav items accessible via ⌘K +- [ ] Context-sensitive: `Jump to run #N`, `Open vault entry`, `Inspect proposal`, `Compare artifacts` +- [ ] Live search over recent runs and sessions via existing query hooks +- [ ] Keyboard-first: full arrow-key navigation, Escape to close, Enter to activate + +--- + +## Validation checklist (per PR) + +``` +cd workbench-ui +pnpm test +pnpm test:enum-coverage +``` + +Before merging a placeholder-swap PR: +- [ ] Old placeholder file removed from `src/routes/` +- [ ] New route wired in `App.tsx` +- [ ] New route has at minimum: loading state, empty state, error state, one smoke test +- [ ] No hardcoded hex values +- [ ] No new dependencies added without discussion + +--- + +## Done criteria + +This plan is complete when: + +- [ ] All four existing routes are cohesive, cross-linked, and consistently handle all async states +- [ ] `Runs` is a live route backed by artifact/replay query hooks +- [ ] `Trace` is a live route promoted from the chat trace model +- [ ] `RightInspector` is a real, toggleable, read-only inspection surface +- [ ] `Packs`, `Vault`, `Audit`, `Settings` have confirmed backend contracts and TypeScript mirrors +- [ ] All six placeholder files in `src/routes/` are replaced and deleted +- [ ] ⌘K command registry covers all 10 routes and key entity-jump commands +- [ ] `src/design/` remains untouched except for `EmptyState` / `CommandPalette` allowed edits +- [ ] Every route has tests + +--- + +*Delete this file once all items above are checked and the final PR in each phase is merged.*