This release closes the gap between what OODA-loop reported and what it actually produced. The trigger was dogfooding: we built a real artifact — a Three.js F1 racing game — and ran the loop on it. It graded itself A every cycle and produced a dismal game. That contradiction drove eight releases of evolution (v1.7.0 → v1.12.0), all tagged and shipped here.
The honest arc: lying A → honest D → earned A → honest F+ vs real games → honest ceiling.
The problem (v1.6.1 and before)
The loop measured process — did a PR merge? did a cycle advance? — and was blind to the artifact. A game with a Z-fighting blob for a track and no recognizable car scored Loop Value 0.995, futile 0%, mission-hit 100%. The metrics were perfect; the artifact proved them a lie. A textbook Goodhart collapse.
What shipped
v1.7.0 — artifact-grounded evaluation + quantum-leap cycles. quality_multiplier = process × artifact. An independent, evidence-grounded critic (Step 5-G) captures the real artifact and scores it against a human-authored, integrity-checked rubric the loop may never write for itself. The honest scorecard re-graded the F1 run A (0.995) → D (0.567). Leap cycles overhaul the weakest dimension when quality plateaus below bar, instead of adding another feature.
v1.8.0 — drive quality to "good", not "passable". A 13-agent adversarially-verified diagnosis found the loop could detect a quality gap but wasn't built to close it. Fixed: a thrashing-guard bug (the HALT safety valve never fired because it counted a nonexistent field), per-dimension capture_method (45% of the rubric — feel & fun — was frozen behind one screenshot), dimension-lock-until-bar, and critic-driven remainder auto-queue.
v1.8.1 — the experiential-axis path, validated end-to-end. A gameplay_metrics harness drives the real physics headlessly to grade the axes a screenshot can't. Honest measurement first dropped the score (it had been over-scoring feel/fun: 0.51/0.38 → measured 0.41/0.29), then two unlocked leaps earned the first honest grade A (0.687) — the original A was a lie; this one was earned.
v1.9.0 — Ambition. An independent re-grade against real racing games scored the "A" game 0.09 (F+), vs the internal rubric's 0.687. The quality ceiling was pinned to "prototype". Fixed with dual bars (bar_leap/bar_coast), benchmark anchors (score vs named real products, not vs your own past), a technique menu (reach for post-processing/IBL/particles, not more BoxGeometry), human-approved mega-leaps, and honest asset ceilings.
v1.10.0 / v1.10.1 — asset hand-off + gate integrity. asset_sources lifts the code-only ceiling once a human supplies real models/textures/audio/HDRIs (the ~0.21 box-car ceiling was broken with a real glTF car). And: node --check passes on ES-module const redeclarations the browser rejects — so the gate now requires a module-load + render verify, and the orchestrator re-checks rather than trusting a sub-agent's "gate passed".
v1.11.0 — Research-Grounded (the anti-maze method). The probe iterated without improving — a local-optimum maze — because generation was anchored to model priors, not external ground truth. Now: pre-generation reference grounding (AlphaCodium-style pre-stage), reference targets, the critic names the one concrete attribute the artifact lacks vs the reference, and a stall escalates to a from-scratch REWRITE carrying a Reflexion negative-example memo before giving up to a HALT.
v1.12.0 — capture fidelity. Measurable improvement is bounded by feedback fidelity: the critic only ever captured one low-speed cockpit frame, so the chase-camera hero car, the sky, sense-of-speed, and physics were invisible and the grade stalled while true quality was higher. capture_states captures each dimension in the state where it actually manifests; an unreachable state is a capture_failure (null), never a low score.
Why it matters
Every one of these gaps was found by using the loop on a real artifact, not by reasoning about it. The result is a loop that measures artifact quality against a human-authored rubric — and has the mechanisms to make step-changes toward the bar — not just whether a cycle moved.
These mechanisms apply to build domains (you set a quality_rubric). Pure ops/observe loops are unchanged — no rubric means artifact_factor = 1.0, exactly as before.
Full per-version detail in CHANGELOG.md. Diagnoses: .claude/ooda-evolution-v1.7.0.md, v1.8.0.md, v1.9.0.md. Tags v1.7.0–v1.12.0 are all published; this consolidated note tells the arc.