Brandon asked for two things: finish the /mtg-creator-decks update, and fix the deck price that stopped appearing in KC Card Finder. The second turned out to be one symptom of a site-wide accident from this morning.
KC Card Finder was not degraded. It was dead. The live page carried zero <script> tags. Every control on it called a function that no longer existed: priceDeck, checkStores, setFilter, toggleWatch, sortNearMe, clearDeck, forceFresh. The block that reads ?deck= out of the link from the creator page went with them, which is the missing price.
strip_kid_mode.py ran at 11:13 to retire kid mode across the site. Its script rule deleted an entire <script> block whenever a kid identifier appeared anywhere inside it, including inside a quoted string or a comment:
def _script(m):
body = m.group(1)
return "" if ("toggleKid" in body or "kidifyText" in body) else m.group(0)
On pages where the kid toggle shared one block with the page's own code, the whole application went with the toggle. For three hours nothing appeared broken, because on most pages the deletion was correct.
The first count taken was 604 pages with no script left. Measured properly, 345 blocks held only toggleKid and 139 were the self-contained kid component, so 484 deletions were right and those pages never had other code to lose. The real damage is 104 pages. The larger number was reported first and is corrected here.
| Page | Functions lost |
|---|---|
| marvel-commander-rankings | 76 |
| chiron-combinations-v4 | 53 |
| commander-marvel | 40 |
| commander-tracker | 38 |
| joni | 36 |
| kc-card-finder | 36 |
| chats | 32 |
| marvel-2hg-tracker · marvel-life-tracker-v3 | 26 each |
| kc-mtg-events | 25 |
$ python3 verify_live.py # curls every repaired route and re-parses it checked 104 repaired pages LIVE http 200 : 104/104 has script : 104/104 kid mode gone : 104/104 no dead handlers : 104/104 total functions live: 922 zero problems across all 104
All 104 re-checked against the live site after the deploy: 104 of 104 at http 200, 104 of 104 carrying script again, 104 of 104 with kid mode gone, 104 of 104 with no button calling a missing function.
The fix recomputes each page from its pristine backup rather than patching the damaged file, so the result is kid mode gone and everything else intact in a single write. The new stripper reads each block through a string, comment and regex mask, and deletes only the kid spans.
$ python3 repair.py # dry run, gates enforced in both modes DRY RUN scanned=2146 would_change=278 gate_failures=0 pages that get real JavaScript back: 104 76 fns marvel-commander-rankings/index.html 53 fns chiron-combinations-v4/index.html 40 fns commander-marvel/index.html 38 fns commander-tracker/index.html 36 fns joni/index.html 36 fns kc-card-finder/index.html $ python3 ~/.claude/skills/_shared/strip_kid_mode.py --all # after the repair WOULD STRIP 0 files
| Gate | What it refuses |
|---|---|
| Deleted spans are kid code | any removal that does not itself contain a kid identifier |
| No dead handlers | the exact KC Card Finder symptom, a button calling a function nothing defines. Measured against the original, so a page broken beforehand is reported and not blamed on the repair |
| Kid mode is gone | a surviving toggle or kid button. A leftover #kidfab{} CSS rule is inert and does not count |
node --check | any edited block that stops parsing |
Result: 278 pages rewritten, 104 with their JavaScript restored, 0 gate failures. Re-running the corrected stripper across the whole site afterwards reports WOULD STRIP 0 files, so the end state is stable and kid mode is genuinely gone.
${JSON.stringify(n).replace(/"/g,'"')} holds a regex containing a double quote. Counting braces alone read that quote as a string opener and swallowed the rest of the file, which made all 36 KC Card Finder functions invisible to the tool meant to protect them.onclick="window.open(url)" matched a call to a page function named open, and pages that display onclick="toggleKid()" as documentation text were counted as having a live button.A real link taken off the creator page, loaded live, with no hand-editing:
https://drwu-htmls.vercel.app/kc-card-finder?deck=20%20Mountain%0A4%20Burst%20Lightning%0A4%20Shock%20(and%207%20more%20lines) textarea auto-filled 11 lines priceDeck defined true page functions present 5 of 5 kid toggle gone true rows priced 11 grand total $9.08 progress "Done. Checked 11 cards across 13 live KC stores."
Cheapest local copies came back named per store: Gamers Getaway KC, Larry's Game Store, MindGames and Magic, Pulp Fiction Comics & Games, Game Cafe.
Every deck card now carries a Gameplan block counted off that deck's own list against Scryfall mana value, type line and oracle text. Nothing is written about a deck that was not measured on that deck.
What one looks like:
Gameplan. 34 creatures and 4 other spells over 22 lands. Average mana value 2.7, with 25 at one or two, topping out at 8 on 1 card. Answers: 1 removal, 8 ramp.
15 cards run past the first 60, a legal 15, led by 4 Negate, 4 Spider-Sense, 3 Leatherhead, Swamp Stalker, 3 Keen-Eyed Curator. Inferred sideboard position, the harvested list carries no board marker.
Hand-checked against the raw list: 22 lands, 34 creatures, 4 other spells, average 2.7, 25 at one or two, top 8. Exact match.
The harvested lists are flat. The board split was discarded when the lists were fetched, so no mainboard/sideboard boundary exists in the data. Where a list runs past 60, those cards are reported as past the first 60 and labelled inferred. The evidence for the inference is stated on the page rather than hidden:
That pattern is what mainboard-then-sideboard order looks like across the corpus. For any one deck it stays an inference, so the page says so.
12 of 16 creators clear 7. The four that do not were listed as simply "short", with no reason given. Each is capped by something measurable, and the page now says which:
| Creator | On page | Videos reached | What caps it |
|---|---|---|---|
| MTG Joe | 6 | 7 | RSS serves only the latest 15 uploads queued |
| Arstall | 6 | 7 | RSS serves only the latest 15 uploads queued |
| Strictly Better MtG | 2 | 27 | 24 post no decklist link at all |
| CROKEYZ | 2 | 8 | 5 fail the Standard-legality gate |
Strictly Better MtG and CROKEYZ cannot be raised by harvesting harder. One does not publish lists; the other's other decks are not Standard.
| Item | Why it is not done here |
|---|---|
| Deeper-than-RSS harvest for MTG Joe and Arstall | needs the uploads playlist through the YouTube Data API or a channel-page pull |
| True sideboards on 104 decks | needs a signed-in browser re-pull that keeps the Moxfield board split. Browser runs need Brandon's go-ahead |
Both are in the shift queue rather than dropped.
| Path | Role |
|---|---|
~/.claude/skills/_shared/kid_strip_engine.py | new, the surgical stripper and its gate helpers |
~/.claude/skills/_shared/strip_kid_mode.py | rewritten to use it, and to refuse a write that would leave dead handlers |
~/Projects/_outputs/creator-winrate-db/fetch_card_facts.py | new, mana value and oracle text for 1,404 names in 19 requests |
~/Projects/_outputs/creator-winrate-db/gameplan.py | new, the measured deck-tech line |
~/Projects/_outputs/creator-winrate-db/build_page.py | renders the gameplan, and states the row 1 caps |
~/Projects/drwu-htmls/_kidrepair_backup_2026-08-02/ | the live state before this repair, kept |