Cadora · design spec
Everything needed to render or extend the swappable-engine surfaces — the exact tokens, the backend chips, the cadora doctor row's anatomy, the phase-routing diagram, the registry, and every backend-check state. The rendered components are live HTML; edit them here or lift the specs into Figma.
Semantic first · green passes, red blocks, amber asks for a second look
--scr-green · #16c784ok · verified · pass--scr-red · #fb7185missing · unparsable · block--scr-amber · #ffd08aexperimental · untested range--scr-blue · #6ba5f0paths · info--scr-bg · #0f172aCard ground--scr-canvas · #111c2fInset · state cards--scr-panel2 · #162237Raised surface--scr-line · #334158Borders--scr-text · #f5f7fbPrimary · versions--scr-muted · #9aa8bcLabels · captionsOne token per engine — and no engine gets its own hue
Each chip reuses a color already in the palette: claude the info blue (#12314e / #7db8ff), codex the amber accent, kiro the pass green. Experimental and test-only engines (glm, antigravity, fixture) take the neutral chip — maturity is carried by the tier tag, not by a bespoke color.
Monospace is the instrument voice — these surfaces are read at the shell
| Role | Family | Size / weight | Notes |
|---|---|---|---|
| Doctor row | mono | 12px / 400 | status:<10> · label:<26> · version · detail |
| Status word | mono | green / red / amber | ok green · missing/unparsable red · untested amber |
| Backend chip | mono | 10px / 600 | Pill, radius 999px, one per engine |
| Node line | mono | 12px | ✓ <node> $cost gate:<name> ok integrity:ok, bits joined by three spaces |
| Compare line | mono | 12px | · <node>: A[✓ <model> $cost] B[✓ <model> $cost] |
| Metric | Value | Metric | Value |
|---|---|---|---|
| Status field width | 10 chars | Label field width | 26 chars |
| Card radius | 10px | Chip radius | 999px |
| Money format | $%.4f | Cost delta sign | + / (none) |
| Default executor | claude | Default funding | subscription |
The one line an operator reads to trust an engine
--construction-executor splits a run by phase
inception + operations · --executor
construction · --construction-executor
A node's phase (inception | construction | operations) decides its engine. Set --construction-executor codex --construction-model gpt-5.5 and only construction nodes move; everything else stays on --executor. The runner stamps each result with the engine that ran it (result.executor) so cost attributes correctly.
Every verdict a backend check can produce
ok · present, in range
missing · binary not found
unparsable · --version failed
untested · outside tested range
untested still runs. Outside the tested version range is a warning, not a block — the adapter usually still works, so the engine stays usable and the row is amber. missing and unparsable are the hard signals (red). The command exits 0 as long as at least one live backend is usable.
One conductor · one topology · the engine is a flag
| Flag / command | Effect | Default |
|---|---|---|
| run --executor <name> | Drives every node on <name>; attributes cost per node to it | claude |
| --construction-executor <name> | Routes construction-phase nodes to a second engine; inception/operations stay on --executor | (off) |
| --construction-model <m> | Model for the construction engine (e.g. gpt-5.5) | (backend default) |
| --model <m> | Backend model override for --executor | (backend default) |
| --funding subscription|api | Claude funding source — the subscription token, not a metered API call | subscription |
| doctor [--json] | Validates each backend CLI against its tested contract range, offline | exit 0 if ≥1 usable |
| compare A B | Diffs outcome + cost per node across engines or across time | (own capability) |
Name the engine; attribute the cost; keep the status words
| Do | Not |
|---|---|
| Name the engine — executor=codex | “the AI” / “the model” |
| Show the tier — (experimental) | Hide how mature an adapter is |
| Keep the status words — ok · missing · untested | “error” / “warning” / a colored dot alone |
| Attribute cost to the engine — B[✓ gpt-5.5 $0.32] | One blended number across backends |