OUROBOROS

the loop that watches itself being built

the brief: build the loop

so we pointed the loop at itself

an app whose only content is its own build — 15 iterations, every failure the checker caught, every lesson it learned, checkable down to the commit.

every arc below is one iteration of the loop that built this page — click one for its story, or press play to replay the whole build

Showing 15 of 15 iterations

green = banked · red rim = failures caught, then fixed

maker claude (spec + judge) · codex (implement)

checker testsprite cli — cloud tests against this live page

verdicts 15 banked · 7 caught & fixed · none hidden

lessons learned 8

ITERATION 15 / 15

ITERATION LOG

  1. #15passthe invitation & the trophy — a prominent 'start the briefing' CTA, the shareable Loop Card (download PNG), and Failure Fossils (the exact broken state, preserved) — broke: the checker caught two a11y regressions: the CTA's aria-label masked its visible invitation (L7 again), and the Loop Card's text was SVG-only, invisible to the a11y tree — fixed: CTA accessible name now matches its visible text; the Loop Card gained an sr-only text layer (L8) — decision recorded: content-SVG needs a text equivalent
  2. #14passthe presentation layer — Judge Mode (press J: a self-narrating briefing climaxing in the loop auditing its own checker), the ring's glow, and the hero that states the idea
  3. #13passkeyboard shortcuts overlay + full keyboard nav (the a11y capstone) — broke: the 'press ? for shortcuts' hint's aria-label overrode its visible text, hiding the '?' from the a11y-tree-reading cloud tester — fixed: removed the masking aria-label so the visible text is the accessible name (L7); rerun agent verdict PASS
  4. #12passfailures-only filter — isolate the caught-failure iterations across ring, log, and stats
  5. #11passdeep-linkable iterations — ?i=N opens a story card + copy-permalink button
  6. #10passtrust audit — hostile agent review turned into committed proof — broke: greens under-evidenced (only failures had committed bundles), ring hid its failures, stale card on scrub, sub-AA contrast, CI freshness unproven — fixed: run histories committed for all 8 tests, failure-rim viz + audit trail table, stale-selection clear, contrast raised, SHA-gated CI — full suite green against the exact commit
  7. #9passgrowth regression — intro scaled with data and hid the ring's controls — broke: at 8 iterations the draw-in left arcs invisible 3+ seconds; agent indexed mid-intro and found no clickable ring, then missed SVG-child controls intermittently — fixed: intro capped at a 0.9s total budget (L6) + controls hardened into real HTML button hit-targets (L1 update); agent verified 4/4
  8. #8passpolish — OG meta, favicon, footer, hook line, mobile pass (5 real bugs fixed)
  9. #7passchecker evidence inside story cards — failure-bundle excerpts — broke: tester clicked the replay diamond ('Seek to iteration 2') instead of the ring arc — look-alike controls — fixed: accessible names diverged + plan names the widget type (L5); rerun 17/17
  10. #6passharness cycle diagram — WRITE→VERIFY→BANK with the fail→LESSON loop — broke: 11px 'pass' connector label unreadable in the tester's screenshots — fixed: labels raised to 13.5px weight-500 (L4); rerun verified the label
  11. #5passlearning curve — stacked run bars + cumulative lessons step-line — broke: checker returned status 'blocked' while its own conclusion said PASS with all steps green — fixed: verdict recorded from the evidence; platform discrepancy reported upstream
  12. #4passflight-recorder replay — scrub and replay the loop's own history
  13. #3passmotion tokens + GSAP ring draw-on intro — broke: over-strict test assertion: orbit dot must visibly move — flaky under reduced-motion cloud browsers — fixed: plan refined to settled end-state assertions (L2); app unchanged
  14. #2passinteractive ring — click a segment for that iteration's story card — broke: ring arcs invisible to the testing agent — svg role=img flattened the a11y tree, segments not focusable — fixed: real accessible controls: tabIndex=0, Enter/Space handler, role=img removed
  15. #1passbaseline instrument panel (ring + stats + iteration log)

LEARNING CURVE

02468RUN COUNT123456789101112131415ITERATION
Learning curve data by iteration
IterationPassing runsFailing runsCumulative lessons
Iteration 1100
Iteration 2111
Iteration 3112
Iteration 4102
Iteration 5103
Iteration 6114
Iteration 7115
Iteration 8105
Iteration 9126
Iteration 10806
Iteration 11106
Iteration 12106
Iteration 13117
Iteration 14107
Iteration 15118
  1. L1Clickable SVG parts need role=button + tabIndex=0 + key handler, and the ancestor svg must not carry role=img (it flattens the subtree to presentational).iteration 2
  2. L2Never cloud-assert continuous ambient motion; assert the settled end-state. Decoration animation is progressive enhancement, verified locally.iteration 3
  3. L3Audit the checker's verdict against its observations: a status flag that contradicts its own evidence gets one fresh run, then record what the evidence shows and report the discrepancy.iteration 5
  4. L4Meaning-carrying labels in data graphics render at >=13px SVG (720 viewBox): if it's only legible because you know what it says, it isn't legible.iteration 6
  5. L5Plan steps must name the widget type and exclude same-entity look-alikes; accessible names for actions (Seek to...) and reveals (Open story card...) should diverge.iteration 7
  6. L6Cap the total duration of data-driven entrances (budget / item count, never per-item x count); interactive controls must be visible within ~1s no matter how much the data grows.iteration 9
  7. L7A control whose visible text is the information must not carry an aria-label that omits it — the label wins in the a11y tree and hides the text from agents and screen readers. Omit it or mirror the info. (Third a11y lesson: L1 hid controls, L5 confused names, L7 hid content.)iteration 13
  8. L8Content-bearing SVG needs a real text equivalent (an sr-only HTML block or role=img + full aria-label); decorative SVG gets aria-hidden. If an agent or screen reader can't read the graphic's words, neither can a judge on assistive tech. (Fourth a11y lesson.)iteration 15

THE HARNESS

WRITEmaker · claude + codexVERIFYchecker · testsprite cloudBANKdurable suiteLESSONLESSONS.mdpassfail

AUDIT TRAIL

the complete ledger — all iterations, independent of the replay position above

#featbyresultlessonshastest
1baseline instrument panel (ring + stats + iteration log)claudepass-
feat 56c5b00fix -bank 61faf97
bd2aa814
2interactive ring — click a segment for that iteration's story cardclaudepassL1
feat 3ef33c0fix 0d22d23bank 9ccbacc
209afd81
3motion tokens + GSAP ring draw-on introcodexpassL2
feat 57e2a53fix -bank 9bd3d06
86ccc90d
4flight-recorder replay — scrub and replay the loop's own historycodexpass-
feat 1b5f053fix -bank 5d02e43
8ba3267b
5learning curve — stacked run bars + cumulative lessons step-linecodexpassL3
feat 754433bfix -bank cf0689b
285783c3
6harness cycle diagram — WRITE→VERIFY→BANK with the fail→LESSON loopcodexpass-by-evidence at the time; later run flagged passedL4
feat c3b4fb1fix 3773608bank 3d11ec8
e148ba09
7checker evidence inside story cards — failure-bundle excerptscodexpassL5
feat b265f6efix 1b9d750bank 3d11ec8
215f4e47
8polish — OG meta, favicon, footer, hook line, mobile pass (5 real bugs fixed)codexpass-
feat 017ac75fix -bank 1076935
fa60727a
9growth regression — intro scaled with data and hid the ring's controlsclaudeshares test 215f4e47 with iteration 7 — this iteration hardened that same ring/story-card feature; latest run passedL6
feat e80e947fix 7105515bank 1076935
215f4e47
10trust audit — hostile agent review turned into committed proofclaudebank 08c0b17's CI failed on a build error; dfb21f5 fixed it and passed the full SHA-gated suite against the live commit-
feat d23c1a7fix dfb21f5bank 08c0b17
suite
11deep-linkable iterations — ?i=N opens a story card + copy-permalink buttoncodexpass-
feat baf38abfix -bank 319e7e0
877e0b8b
12failures-only filter — isolate the caught-failure iterations across ring, log, and statscodexpass-
feat baf38abfix -bank 319e7e0
31d2747b
13keyboard shortcuts overlay + full keyboard nav (the a11y capstone)codexfailed first (aria-label masked the hint text — L7), fixed in 319e7e0; rerun agent verdict PASS, status blocked per issue #208, failedStepIndex nullL7
feat baf38abfix 319e7e0bank 319e7e0
0447a447
14the presentation layer — Judge Mode (press J: a self-narrating briefing climaxing in the loop auditing its own checker), the ring's glow, and the hero that states the ideacodexpresentation layer: Judge Mode 186eddc + ring glow 843d0bf + pitch hero 808542f; test passed 21/21-
feat 186eddcfix -bank ea6999c
f6c69559
15the invitation & the trophy — a prominent 'start the briefing' CTA, the shareable Loop Card (download PNG), and Failure Fossils (the exact broken state, preserved)codexamplifiers (CTA + Loop Card + Fossils); test caught two a11y regressions (L7 masking in 3817417, L8 SVG-only content fixed in 5f390b1); rerun passed 4/4, run history committed in 1c7c772L8
feat fd60a40fix 5f390b1bank 1c7c772
1af81937

every row: a claim you can check — commit, test, artifact.

LOOP CARD

Ouroboros — the loop that built itself · 15 iterations · 8 lessons · 13 cloud tests · no failure hidden · caught its own checker · upstream: PR #207, PR #213, issue #208 · yazan-o.github.io/ouroboros

Ouroboros loop cardShareable proof card for Ouroboros with iterations, lessons, cloud tests, caught failures, upstream filings, and URL.15ITERATIONS7 RED RIMS = FAILURES CAUGHTLOOP CARDgithub.com/Yazan-O/ouroborosOUROBOROSthe loop that built itself15 iterations / 8 lessons / 13 cloud tests / no failure hidden / caught its own checker15ITERATIONS7CAUGHT + FIXED8LESSONS L1-L813CLOUD TESTS8FAILED RUNS LOGGEDCAUGHTITS OWN CHECKERUPSTREAM FILED: PR #207 + PR #213 / ISSUE #208yazan-o.github.io/ouroboros