- EvidenceChainRail: the spine's seven stages rendered per subject with the honesty contract — lit/hollow/dim derive ONLY from carried fields (a trace hash lights 'replay' as RECORDED, never as verified); pure deriveStages() with meaningfully-fail tests (remove one field -> exactly its stage hollows). - Hash display standard: DigestBadge default 12-char + copy everywhere; CopyableHash consolidated away (2 call sites swapped, file deleted). - Typography: tabular-nums on MetadataTable values + eval metrics; text-wrap balance on Panel titles + EmptyState statements. - Selection unification: new --color-selected-bg/-border tokens; selected (persistent) vs focused (transient) now visually distinct across Proposals/Replay/Evals lists; focus-ring no longer doubles as selection. - EmptyState gains a deterministic monochrome inline-SVG glyph. - Panel adopted in Evals lane list + Proposals queue. - Doctrine-as-tests: hexScan (no palette literals outside tokens.css/ generated tokens.ts) + schemaDrift gate (scripts/dump-schemas.py AST walk -> schema-snapshot.json -> every dataclass field mirrored in types/api.ts; explicit shrink-only NOT_YET_MIRRORED debt list). The drift gate caught real drift on first run: ChatTurnResult.turn_id existed in Python, missing from TS — now mirrored. Verified: build green; vitest 36 files / 279 tests EXIT=0; playwright 12/12; dump-schemas.py runs clean. |
||
|---|---|---|
| .. | ||
| e2e | ||
| preview | ||
| public/fonts | ||
| scripts | ||
| src | ||
| .gitignore | ||
| api-schema-snapshot.json | ||
| enum-snapshot.json | ||
| index.html | ||
| package.json | ||
| playwright.config.ts | ||
| pnpm-lock.yaml | ||
| postcss.config.js | ||
| README.md | ||
| schema-snapshot.json | ||
| tailwind.config.ts | ||
| tsconfig.json | ||
| tsconfig.node.json | ||
| vite.config.ts | ||
CORE Workbench UI
React/Vite/TypeScript frontend for CORE Workbench — a local operator UI for inspecting engine state, proposals, evals, and audit trails.
Local development
# Terminal 1 — start the API (W-026)
uv run core workbench api
# Terminal 2 — start the frontend
cd workbench-ui
pnpm install
pnpm dev # http://127.0.0.1:5173
Custom API URL
VITE_WORKBENCH_API_URL=http://127.0.0.1:9000 pnpm dev
Design system baseline
pnpm preview # Serves dist/ on http://127.0.0.1:4173
# Navigate to /preview for the Branch 1 design-system baseline
Tests
pnpm test # Vitest unit + component tests
pnpm test:enum-coverage # Badge enum coverage (requires uv)
Schema drift detection
The TypeScript types in src/types/api.ts mirror workbench/schemas.py.
To check for drift after Python schema changes:
# From repo root
uv run python scripts/dump-api-schemas.py
# Then run: pnpm test (api.test.ts catches field-level drift)
Architecture
src/app/— Shell, TopBar, LeftNav, StatusFooter, ApiErrorBoundarysrc/api/— apiFetch client, TanStack Query hookssrc/types/— TypeScript mirrors of Python schemassrc/routes/— Route placeholder componentssrc/design/— Branch 1 design-system substrate (DO NOT MODIFY except EmptyState and CommandPalette)
ADR cross-references
- ADR-0160 — Workbench v1 architecture
- ADR-0162 — Design substrate (Branch 1)
- ADR-0156, ADR-0157, ADR-0158 — Engine-state checkpoint and reboot audit trail