drwu-htmls · 2 August 2026

Creator decks closeout

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.

1. The price that stopped appearing

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.

What removed it

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.

2. What was actually damaged

2,146
files the strip touched
484
blocks that were pure kid mode, correctly deleted
104
pages that lost real working code
0
files lost, every original was backed up

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.

The worst hit

PageFunctions lost
marvel-commander-rankings76
chiron-combinations-v453
commander-marvel40
commander-tracker38
joni36
kc-card-finder36
chats32
marvel-2hg-tracker · marvel-life-tracker-v326 each
kc-mtg-events25

Every page that lost code, re-checked against the deployed site

$ 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.

RouteFns lostLiveFns now
/marvel-commander-rankings7620089
/chiron-combinations-v45320053
/commander-marvel4020040
/commander-tracker3820038
/joni3620036
/kc-card-finder3620036
/chats3220032
/marvel-2hg-tracker2620026
/marvel-life-tracker-v32620026
/kc-mtg-events2520025
/audit-dashboards/dashboard_recents_styled2420024
/chiron-cheatsheet-review2020020
/marvel-life-tracker2020020
/kc-mtg-events-v2/events1920019
/chiron-cheatsheet-v21820018
/chiron-combinations-v31420014
/community-future-seeds1420014
/community-season-5-v41420014
/parks-s5-future-seeds1420014
/salubrioussnail-points1320013
/community-season-5-v31220012
/stems-library1220012
/audit-dashboards/dashboard_active_chats_v31120011
/light-assefa-readers1020010
/chiron-combinations92009
/straykids-bpm-match92009
/3gene-earcheck72007
/garden-in-the-bible-v272007
/greenhouse-dashboard72007
/horticulture-dashboard72007
/mtga-craft-planner72007
/vocations-annotate72007
/alwayssunny-annotate-s1e162006
/alwayssunny-annotate-s1e262006
/alwayssunny-annotate-s1e362006
/alwayssunny-annotate-s1e462006
/alwayssunny-annotate-s1e562006
/alwayssunny-annotate-s1e662006
/alwayssunny-annotate-s1e762006
/aoty-2026-so-far-guitar62006
/buffy-annotate-s1e162006
/buffy-annotate-s1e1062006
/buffy-annotate-s1e1162006
/buffy-annotate-s1e1262006
/buffy-annotate-s1e262006
/buffy-annotate-s1e362006
/buffy-annotate-s1e462006
/buffy-annotate-s1e562006
/buffy-annotate-s1e662006
/buffy-annotate-s1e762006
/buffy-annotate-s1e862006
/buffy-annotate-s1e962006
/chiron-cheatsheet62006
/chiron-video-tracker62006
/community-annotate-s1e362006
/community-annotate-s1e462006
/community-annotate-s1e562006
/community-annotate-s2e862006
/light-assefa-202562006
/audit-dashboards/dashboard_active_chats_v252005
/phish-year-battle-royale52005
/chiron-cheatsheet-rewire-v342004
/memo-2026-06-20-songs/stems42004
/garden32003
/marvel-commander-rankings/scenes32003
/phish-next-tour-oracle32003
/phish-year-leaderboard32003
/3gene-earcheck/adjudicator22002
/3gene-solo22002
/alwayssunny-s1-trope-index22002
/alwayssunny-s2-trope-index22002
/believeyoume-book-v622002
/believeyoume-book-v722002
/buffy-s1-trope-index22002
/firefox-latest3022002
/jam-cull-7-3-2622002
/jam-cull-7-3-26-full22002
/tv-shows-index22008
/adaptation-2000s12001
/aoty-2026-so-far12001
/asleep-trunk-vocal-fix12001
/audit-dashboards12001
/bast-panther-goddess-deck-tech12001
/chiron-transcripts12001
/community-annotate-s4e712001
/crystal-inhuman-princess-deck-tech12001
/director-nick-fury-deck-tech12001
/doctor-doom-king-deck-tech12001
/fable-fit-chats12001
/horror-vanguard-fix-prompt12001
/human-torch-deck-tech12001
/invisible-woman-deck-tech12001
/kc-finder-vs-instock12001
/mac-space-map12001
/okoye-mighty-adored-deck-tech12001
/phish-bott-jam-ixi12001
/phish-jam-library12001
/phish-plasma-jam-ixi12001
/power-pack-deck-tech12001
/shuri-black-panther-deck-tech12001
/stems-to-midi-coverage12001
/storm-queen-wakanda-deck-tech12001
/tchaka-venerable-king-deck-tech12001
/the-thing-deck-tech12001

3. The repair, and the gate that proves it

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.

Four gates, all green before anything was written

$ 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
GateWhat it refuses
Deleted spans are kid codeany removal that does not itself contain a kid identifier
No dead handlersthe 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 gonea surviving toggle or kid button. A leftover #kidfab{} CSS rule is inert and does not count
node --checkany 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.

Three bugs the gates caught in my own first attempt

4. Proof it works, end to end

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.

5. The creator decks ask ledger

closed Row 12 · deck tech, gameplan, sideboard plan

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.

230
of 238 cards carry a measured gameplan
1,404
of 1,409 card names resolved
104
decks break out the cards past the first 60
102
are 60-card lists with no sideboard

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 sideboard half is labelled, not asserted

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.

capped at the source Row 1 · at least 7 decks per creator

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:

CreatorOn pageVideos reachedWhat caps it
MTG Joe67RSS serves only the latest 15 uploads queued
Arstall67RSS serves only the latest 15 uploads queued
Strictly Better MtG22724 post no decklist link at all
CROKEYZ285 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.

6. Left open, and written down

ItemWhy it is not done here
Deeper-than-RSS harvest for MTG Joe and Arstallneeds the uploads playlist through the YouTube Data API or a channel-page pull
True sideboards on 104 decksneeds 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.

7. Files touched

PathRole
~/.claude/skills/_shared/kid_strip_engine.pynew, the surgical stripper and its gate helpers
~/.claude/skills/_shared/strip_kid_mode.pyrewritten to use it, and to refuse a write that would leave dead handlers
~/Projects/_outputs/creator-winrate-db/fetch_card_facts.pynew, mana value and oracle text for 1,404 names in 19 requests
~/Projects/_outputs/creator-winrate-db/gameplan.pynew, the measured deck-tech line
~/Projects/_outputs/creator-winrate-db/build_page.pyrenders the gameplan, and states the row 1 caps
~/Projects/drwu-htmls/_kidrepair_backup_2026-08-02/the live state before this repair, kept