Cadora's compare and evaluate tools, step by step: two runs of the same topology land in the archive, a dashboard holds run A (Claude) against run B (Codex) side by side, cadora compare diffs outcome and cost per node across backends, the same diff catches a node that regressed and got pricier over time, cadora eval scores one run against the AI-DLC invariants — the four CRITICAL checks (run_ok, all_nodes_ok, gates_passed, integrity_clean) gate the verdict while cost_attributed and aidlc_artifacts surface as warnings — the --json result carries the same verdict for CI, and both tools are pure functions over the manifests: no LLM, no network, reproducible and free.

Cadora · compare & evaluate

Two runs, held to the same light

A run finishing green tells you one path worked. It doesn't tell you what the same spec costs on a different engine, whether it drifted since yesterday, or whether it holds the invariants you actually care about. Two post-run tools answer that: cadora compare diffs two runs, cadora eval scores one — and both are pure functions over the archived manifests. Reproducible, cheap, no LLM, no network.

Surface · CLI + dashboardRole · operator / reviewerCaptured · archived runs — guardgoal, feature-flags
01

Same spec, two engines — side by side

You ran one topology twice: once through Claude, once through Codex. Both landed in the archive. Before trusting either, put them next to each other. Every node cleared on both runs (4/4) — the run-level ok=False is the build-test gate, identical on both — so what actually differs here is the price.

localhost:8765/compare · guardgoal
guardgoalsame topology · two backends · 4 nodes
both archived
metric
run Aclaude
run Bcodex
executor
claude
codex
run ok
False
False
nodes passed
4/4
4/4
total cost
$14.1011
$4.9692 est.
output tokens
140,117
50,295
per-node cost
A
B
requirements
$1.0560
$0.4552
design
$0.7142
$0.4610
implement
$11.7842
$2.3543
build-test
$0.5467
$1.6986
Δ cost (B−A) −$9.1319same spec, all nodes pass on both — Codex ≈65% cheaper (est.)

Codex and GLM figures are priced from the rate table (est.); Claude figures are backend-reported. The comparison lines them up on one ruler either way.

02

cadora compare — the diff, per node

One command turns the two manifests into a per-node diff: outcome and cost, A against B, plus the run totals and the cost delta. No model runs — it's a pure function over two manifests. The story lands in the last four lines: the same spec, the same outcome on every node, and Codex about $9 cheaper for it.

zsh — cadora compare
$ cadora compare guardgoal-claude guardgoal-codex --archive-dir runs compare A=guardgoal-claude B=guardgoal-codex A: executor=claude topology=guardgoal ok=False pass=4/4 cost=$14.1011 out_tok=140117 B: executor=codex topology=guardgoal ok=False pass=4/4 cost=$4.9692 out_tok=50295 Δcost (B−A): $-9.1319 nodes: · requirements: A[ claude-sonnet-5 $1.0560] B[ gpt-5.5 $0.4552] · design: A[ claude-sonnet-5 $0.7142] B[ gpt-5.5 $0.4610] · implement: A[ claude-sonnet-5 $11.7842] B[ gpt-5.5 $2.3543] · build-test: A[ claude-sonnet-5 $0.5467] B[ gpt-5.5 $1.6986]

Every node reads on both, yet each run's ok=False — that's the build-test gate, not a failed node. Compare shows both the node outcome and the price, so you can see the outcome held identical while the cost did not. Add --json for the same diff structured for a script.

03

The same diff, over time

Point compare at the same backend on two different days and it becomes a regression detector. Here last night's run was clean; tonight's construction node flipped to and cost more doing it. The diff flags the outcome change and the +$0.45 drift in one place — no dashboards to scrub, no eyeballing two logs.

zsh — cadora compare · over time
$ cadora compare nightly-0706 nightly-0707 --archive-dir runs compare A=nightly-0706 B=nightly-0707 A: executor=claude topology=aidlc-hitl ok=True pass=3/3 cost=$2.0139 out_tok=15840 B: executor=claude topology=aidlc-hitl ok=False pass=2/3 cost=$2.4620 out_tok=17020 Δcost (B−A): +$0.4481 nodes: · requirements: A[ claude-sonnet-5 $0.9451] B[ claude-sonnet-5 $0.9612] · design: A[ claude-sonnet-5 $0.2791] B[ claude-sonnet-5 $0.2864] · construction: A[ claude-sonnet-5 $0.7897] B[ claude-sonnet-5 $1.2144] ⚠ ok changed

A node present in only one run reads · <node>: A only (or B only); when the topologies don't match at all, the diff opens with ⚠ different topologies so you never compare apples to oranges by accident.

04

cadora eval — score one run against the invariants

Where compare needs two runs, eval scores one against the AI-DLC / quality invariants — completion, per-node success, gate verdicts, integrity findings, cost attribution, artifact presence — again with no LLM call. Four of the checks are CRITICAL and gate the verdict; two are non-critical and only warn. Below, artifacts are missing and three costs are price-table estimates — both surface amber — but the run is PASS because every critical check holds.

zsh — cadora eval
$ cadora eval flags-verify --archive-dir runs eval flags-verify · executor=claude · topology=multi-backend-feature-flags ✓ run_ok: manifest.ok=True ✓ all_nodes_ok: all nodes ok ✓ gates_passed: no failing gates ✓ integrity_clean: no integrity findings ✓ cost_attributed: all nodes have cost (3 estimated from price table) (warn) ✗ aidlc_artifacts: no aidlc-docs artifacts found (warn) score 5/6 (83%) → PASS

The two amber rows are the non-critical layer: cost_attributed and aidlc_artifacts carry (warn) and never turn the verdict red. Only the four CRITICAL checks — run_ok, all_nodes_ok, gates_passed, integrity_clean — decide PASS or FAIL. If any one of those had failed, the bottom line would read → FAIL and the command would exit non-zero.

05

eval --json — the same verdict, for CI

The same score as structured data: a checks array of name / passed / detail, then passed, total, score, and the verdict. The four green names below are the CRITICAL set — the only ones that gate verdict — while cost_attributed and aidlc_artifacts ride along as passed:false-tolerant warnings. In CI you gate on the process exit code: 0 when verdict is pass, 1 otherwise.

zsh — cadora eval --json
$ cadora eval flags-verify --archive-dir runs --json { "run_id": "flags-verify", "executor": "claude", "topology": "multi-backend-feature-flags", "checks": [ { "name": "run_ok", "passed": true, "detail": "manifest.ok=True" }, { "name": "all_nodes_ok", "passed": true, "detail": "all nodes ok" }, { "name": "gates_passed", "passed": true, "detail": "no failing gates" }, { "name": "integrity_clean", "passed": true, "detail": "no integrity findings" }, { "name": "cost_attributed", "passed": true, "detail": "all nodes have cost (3 estimated from price table)" }, { "name": "aidlc_artifacts", "passed": false, "detail": "no aidlc-docs artifacts found" } ], "passed": 5, "total": 6, "score": 0.833, "verdict": "pass" }

Rendered here with the objects on one line each for reading; the real --json is standard indent=2. There is no critical field — the CRITICAL set (run_ok, all_nodes_ok, gates_passed, integrity_clean) is defined by name in the tool and is what verdict gates on.

06

Why the result is trustworthy: it's just arithmetic

Neither tool asks a model anything. Both read the archived manifests and compute — a diff, a checklist — and nothing else. So a comparison or a score is reproducible (run it a hundred times, get the same bytes), offline (no network), and free (no tokens). That's what makes the number admissible: whoever doubts it can recompute it themselves and land on the same answer.

zsh — deterministic by construction
# run it twice — byte-for-byte identical, offline, no model call $ diff <(cadora eval flags-verify) <(cadora eval flags-verify) && echo reproducible reproducible
the guaranteePure functions over the manifests — no LLM, no network.
Reproduciblesame inputs → same diff / score, every time
Offlinereads archived manifests; nothing leaves the box
Freeno tokens, no model call — run it in CI on every push
read the manifestscompare · evalreproducible verdict

The terminal frames above reproduce real cadora compare / eval output — the cross-backend diff and the eval checklist are captured verbatim; the over-time regression uses the same output shape on illustrative run ids. Lift them into Figma or iterate directly. This is the post-run half of Cadora's audit story: once the run is archived, weighing two of them or scoring one against the invariants costs nothing and comes out the same for everyone.