Design specification for Cadora's multi-backend executors: the color and type tokens, the backend chips, the doctor row's anatomy, the phase-routing diagram, the backend registry, the compare diff line, the four backend-check states (ok, missing, unparsable, untested), and the voice.

Cadora · design spec

Multi-backend executors, by their surfaces

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.

Palette

Semantic first · green passes, red blocks, amber asks for a second look


Green--scr-green · #16c784ok · verified · pass
Red--scr-red · #fb7185missing · unparsable · block
Amber--scr-amber · #ffd08aexperimental · untested range
Blue--scr-blue · #6ba5f0paths · info
Ink--scr-bg · #0f172aCard ground
Canvas--scr-canvas · #111c2fInset · state cards
Panel--scr-panel2 · #162237Raised surface
Line--scr-line · #334158Borders
Text--scr-text · #f5f7fbPrimary · versions
Muted--scr-muted · #9aa8bcLabels · captions

Backend chips

One token per engine — and no engine gets its own hue


claude codex kiro glm antigravity fixture

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.

Type & metrics

Monospace is the instrument voice — these surfaces are read at the shell


RoleFamilySize / weightNotes
Doctor rowmono12px / 400status:<10> · label:<26> · version · detail
Status wordmonogreen / red / amberok green · missing/unparsable red · untested amber
Backend chipmono10px / 600Pill, radius 999px, one per engine
Node linemono12px✓ <node> $cost gate:<name> ok integrity:ok, bits joined by three spaces
Compare linemono12px· <node>: A[✓ <model> $cost] B[✓ <model> $cost]
MetricValueMetricValue
Status field width10 charsLabel field width26 chars
Card radius10pxChip radius999px
Money format$%.4fCost delta sign+ / (none)
Default executorclaudeDefault fundingsubscription

Anatomy — the doctor row

The one line an operator reads to trust an engine


1234
cadora doctor — backend CLI contract checks ok claude (verified) 2.1.128 missing antigravity (experimental) ('agy' not on PATH)
1Statusok | missing | unparsable | untested. Green passes; red is the hard signal; amber is out-of-range-but-probably-fine. Left-justified to 10 columns.
2Backend (tier) — the engine name plus its support tier, verified or experimental. Non-backend checks (python, bun) carry no tier.
3Version — the detected CLI version, checked against the range the adapter contract was last verified against. Blank when the binary is missing.
4Detail — the reason, when not ok: 'agy' not on PATH, below tested minimum 2.10.0, or a truncated --version failure.

Phase routing

--construction-executor splits a run by phase


inception + operations · --executor

requirements claude
architecture claude
interface-design claude

construction · --construction-executor

implement-engine codex
implement-api codex
integration-tests codex

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.

States

Every verdict a backend check can produce


ok · present, in range

ok codex (verified) 0.142.3

missing · binary not found

missing antigravity (experimental) ('agy' not on PATH)

unparsable · --version failed

unparsable codex (verified) (--version exited 1: 'Traceback (most recent call last):')

untested · outside tested range

untested kiro (verified) 2.9.0 (below tested minimum 2.10.0)

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.

What each flag produces

One conductor · one topology · the engine is a flag


Flag / commandEffectDefault
run --executor <name>Drives every node on <name>; attributes cost per node to itclaude
--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|apiClaude funding source — the subscription token, not a metered API callsubscription
doctor [--json]Validates each backend CLI against its tested contract range, offlineexit 0 if ≥1 usable
compare A BDiffs outcome + cost per node across engines or across time(own capability)

Voice

Name the engine; attribute the cost; keep the status words


DoNot
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
Tokens and behavior are taken verbatim from cadora/executors/ and cadora/doctor.py. Edit the rendered components in place, or hand the palette and metrics tables to a Figma library.