- 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. |
||
|---|---|---|
| .. | ||
| api | ||
| app | ||
| design | ||
| preview | ||
| routes | ||
| test | ||
| types | ||
| index.css | ||
| main.tsx | ||