🧒 Kid Mode — Health & Fix

Why the button looked dead on recent pages, what actually broke, and the gate that now stops it · built 2026-06-21 02:20

Scorecard

30/30
last-30 deploys with a working kid toggle (live)
0
truly-dead buttons site-wide (1,402 pages)
2
gates hardened so it can't recur

What broke (plain words)

A handful of recently-generated pages shipped a Kid mode button wired to onclick="toggleKid()" — but the toggleKid function itself was never put on the page. So clicking the button threw toggleKid is not defined and nothing happened.

The button looked perfect in the HTML. It just had nothing behind it.

Root cause

The page generators emit the button + its CSS, and relied on a separate injector to add the script. But the idempotency check — has_button() in kid_mode_inject.py and ensure_button() in ship.py — treated "a button tag is present" as "kid mode is satisfied." It never checked that the toggleKid function existed. A button with no function sailed through every gate, including the closeout that is supposed to prove it works.

The fix

Both gates now require the function, not just the button. A page is "working" only when it has a button and a real toggleKid (or a bespoke kid-class toggle). The precise rule: a page is DEAD only if it references toggleKid() but never defines it.

kid_mode_inject.py — repairs a dead button by injecting only the script (no duplicate button), leaves bespoke pages untouched.
ship.pyensure_button() repairs before deploy; the live check now confirms kid_works=true, not just a button tag.

Result: 0 dead buttons remain, and the closeout gate can no longer ship one.

Live evidence — your last 30 deploys

ModifiedRouteLive kid toggleHTTP
06-21 02:10plansOK200
06-21 02:05straykids-bpm-matchOK·bespoke200
06-21 02:05mac-space-mapOK200
06-21 02:03chatsOK200
06-21 02:01chat-pattern-auditOK200
06-21 01:57magic-the-badgeringOK200
06-21 01:40keep-alive-fixOK200
06-21 01:29twin-flame-ceo-auditOK200
06-21 01:19magic-the-badgering-scorecardOK200
06-21 01:15chat-ceo-auditOK200
06-21 01:14tarot-boundaries-betrayalOK200
06-21 01:14tarot-combo-indexOK200
06-21 01:14tarot-did-they-cheatOK200
06-21 01:14tv-scriptsOK200
06-21 01:14work-productsOK200
06-21 01:14zorbaOK200
06-21 01:14missing-images-2026-06-20OK200
06-21 01:14community-deck-status-2026-06-20OK200
06-21 01:14chiron-sourceaudio-control-tacticsOK200
06-21 01:10chat-fix-20OK200
06-21 00:50python-slam-2026OK200
06-20 23:36kid-mode-backfill-2026-06-20OK200
06-20 23:01fix-planOK200
06-20 22:59buried-treasuresOK200
06-20 22:58transcribe-reclaimOK200
06-20 22:58thirteenth-step-chartsOK200
06-20 22:58the-mutiny-stem-vs-midiOK200
06-20 22:58the-mutiny-midi-fixOK200
06-20 22:58the-alligator-stem-vs-midiOK200
06-20 22:58tarot-v3-gate-resultsOK200

Measured live at build time. OK = real toggleKid present · OK·bespoke = page has its own working kid toggle (e.g. straykids) · DEAD = button with no function.

Try it right here

This box is full of jargon: the midi stems get a demucs pass, then deploy to vercel from the dashboard.

Tap the floating 🧒 Kid mode button (bottom-right). Watch the font warm up, the page tint, and every jargon word above turn into plain English. That is kid mode working — the exact thing that was dead on the broken pages.

Still see it broken?

Vercel serves with stale-while-revalidate=86400, so the CDN can hand you a cached copy from up to a day ago while it refreshes in the background. If you saw a dead button before the fix deployed, your browser/edge may still be holding that old copy. This deploy purges the edge; a hard refresh (Cmd + Shift + R) clears the rest.

🛍️ Get the printable