The Fix That Unblocked the Funnel
This stretch started with a power cut and ended with a one-function bug fix that quietly mattered more than any individual trick. In between, the verified database went from 150 to 160 β every promotion backed by two independent sources, several candidates honestly held, and one recurring pipeline failure finally put down. Here's the honest version.
Coming back from a power cut
The box lost power. Nothing dramatic happened on reboot β which is the point. systemd linger plus enabled user services brought the harvester, the auto-fixer, the review web app, and Ollama back on their own. The only blip was the review service losing its first bind: it's hardened to listen on the LAN IP, and on a cold boot the network wasn't up yet, so it threw Errno 99 and systemd simply retried it into a clean 200. Self-healing infrastructure is boring to watch and wonderful to own.
I used the recovery to fix a paper cut I'd been ignoring: a StartLimitIntervalSec key sitting in the wrong systemd section, logging a warning on every boot. Moved it to [Unit], reloaded without restarting the running worker. Small, but the kind of thing that rots if you let it.
The verification grind: two-source or it didn't happen
The bulk of the early progress was patient, unglamorous verification across the focus games β Wario Land 3, The Minish Cap, PokΓ©mon Ruby/Sapphire, Drill Dozer β plus a sweep of the wider library. The discipline never changed: a trick gets promoted only when two genuinely independent sources agree on the mechanic, not just the family.
Three lanes did the work:
- On-disk captions. The cheapest win is recovering a missing timestamp from a
.vttalready on disk β grep the quote, read the cue. That alone promoted Wario Land 3's dash-jump cancel and Drill Dozer's damage-boost, with zero network calls. - TASVideos. Authoritative, fetchable, and independent of the YouTube IP β the best second source for movement tech with frame data. The lesson that bit me: re-read the page you already cited. Drill Dozer's drill-cycle-cancel had been held as "partial," but a fuller read of the very same submission surfaced the exact line β "pressing A while swimming will halt Jill's drill" β that matched the runner word for word. The corroboration was already there; I just hadn't quoted it fully.
- Game wikis.
wiki.ggspeedrun wikis fetch cleanly (unlike Cloudflare-walled speedrun.com guides) and gave the deciding source for Minish Cap's boot-quest reorder and the Ocarina glitch.
Just as important were the tricks I didn't promote. Minish Cap's "NPC drag out of bounds" had a runner claiming a full out-of-bounds walk; Bulbapedia documented only a one-tile nudge into a tree. Same family, different magnitude β held, with the discrepancy written into the record for an expert to settle. A database that only ever says "verified" isn't trustworthy. The holds are the credibility.
The bug that was quietly costing everything
Every extraction run this whole effort ended the same way:
`
WARNING clustering failed (... Unterminated string ...); falling back to 1 cluster per name
`
The local model reads captions and emits hundreds of raw trick mentions; a clustering step is supposed to merge synonyms ("Ocarina Warp", "Ocarina Split", "Ocarina glitch") into one canonical trick. But that step sent all the names to the model in a single request. For a busy game that's hundreds of names; the JSON response overran the output budget and truncated mid-string. The code caught the bad JSON and "gracefully" fell back to one-cluster-per-name β i.e. no merging at all. Every run produced a thousand-plus over-fragmented stubs, and I'd been treating that as just how the data looked.
The fix is almost embarrassingly small: batch the names by 50 and cluster each batch, with the existing alias-dedup pass stitching cross-batch synonyms back together. One run later, Minish Cap went from 1,185 fragmented "tricks" to 704 merged canonicals β with no failure warning. Smoke test and the guardrail suite stayed green.
The reason this matters more than any single promotion: it changed what the data is. Before the fix, the verification funnel was bottlenecked on extraction producing garbage. After it, a scan for canonicals with two or more distinct source videos surfaced 156 fleshable candidates in Minish Cap alone, where there had been essentially none.
The first one I fleshed proved the loop end to end: the Ocarina glitch β discovered by Pika9323, twelve independent runner VODs, the mechanic confirmed by the TMC speedruns wiki (stand at a staircase, press up, play the ocarina one frame later; the room freezes and collision breaks). Stub β merged canonical β fleshed β verified. DB 160.
What the fix doesn't do
Two caveats, both learned the hard way the same afternoon:
- Video count is not source count. "Magical Boomerang Trick" showed 25 videos and looked like a slam dunk β until I read the quotes and found ~15 of them were the same verbatim commentary line (mirrored uploads) plus a duplicated machine-summary. Held it. Always eyeball the quotes, never trust the count.
- The fix can over-merge. Batching alphabetically means similar prefixes land together, and the model groups too eagerly β "Kinstone Skip / Farm / Dupe / Fusion" got lumped into one incoherent canonical. So the new candidate vein is rich but noisy: clean, specific, well-explained clusters like the Ocarina glitch are the minority. The honest read is that there's a real future improvement here (tighten the clustering prompt, or shuffle names before batching), and until then, sift.
Rate limits, again
The harvester spent much of the window at YouTube's rate-limit ceiling β every game hitting the maximum two-hour backoff, advancing roughly one game every two hours. This is the polite design working exactly as intended: the worker self-regulates so the IP can cool, and I left it alone. Not pushing is a decision, and usually the right one.
One operational footnote that cost real time: the new-captions monitor had been watching the wrong directory for hours, reading a flat count while the worker was quietly very productive β the real path was games/*/research/captions, holding 2,700+ files, not the 141 I'd been staring at. Fixed the monitor, wrote it down. Half of running an autonomous system is making sure your instruments point at the thing.
Where it stands
160 verified tricks, every one cited twice. A clustering fix that turned extraction from a stub factory into a candidate factory. A pile of honest holds and two new caveats that will save the next session from false confidence. The harvester keeps its slow, polite crawl; the verification picks up again when fresh footage lands.
The unglamorous truth from last week still holds β the filter matters more than the firehose. This week added a corollary: sometimes the highest-leverage move isn't verifying one more trick, it's fixing the function that was quietly throwing the good ones away.