Audit round 7, upload cluster: evidence over inference at every exit

Five blind reviewers swept the real-data-era surface; this lands the
upload findings, all verified against the code and the documented site
behavior before fixing.

The two HIGHs shared a root: logging outcomes the browser never proved.
add_game waited for an "Add To" button that an owned game's page does
not have — so a second-copy add could never succeed, and worse, an add
that LANDED but missed the log became an unretryable failure loop
(every retry: 30s timeout, logged failed, nothing ever settles).
add_game now polls for either button state: "In Collections" without
second_copy returns the previously-dead already_present status (the
landed-but-unlogged case heals itself on retry); with second_copy it
refuses loudly (that flow is unverified — add by hand). A save whose
dialog is slow to hide reloads the page and asks for ownership evidence
instead of guessing "failed". update_entry no longer trusts the editor
merely closing: the cell must settle on text matching the CHOSEN
version, else the AJAX save failed server-side and "updated" would
mark a job done forever that never touched the site.

Per-copy bookkeeping: stale_jobs endorsed per game, so rejecting one
of two queued editions let the rejected copy upload on the survivor's
endorsement — it now counts endorsements per (bgg_id, version) and
retires the game with "re-run diff" when a copy loses its backing.
annotate_queue stamped every row sharing a job key with the same log
status, so one success marked both vetoed duplicates done; completions
are now claimed one row per done log line.

Smaller findings: the version-drift note queued a doomed re-add after
warning about it (now skips — the entry exists on BGG; re-adding only
duplicates); the one-update-per-game deferral rested on a claim the
collid-exact editor disproves (removed — same-game updates run
together); the 3-identical-failures abort compared exception class
only, so three unrelated problems aborted a healthy run (now compares
whole messages).

Also from the test seat: run_upload's stale filtering finally executes
against a real matches.csv in tests; rejected credentials pin that no
anonymous storage state is saved; update_entry's three guarded exits
each have a test; _scrub's newline flattening is pinned.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016jXZFSTZQKzAC8fqpWSz9g
This commit is contained in:
Eric Wagoner
2026-08-06 00:21:52 -04:00
co-authored by Claude Fable 5
parent 22fa17b5ee
commit 32b6aae841
8 changed files with 803 additions and 174 deletions
+2 -2
View File
@@ -63,8 +63,8 @@ Walk the Plank!,35505,Walk the Plank!,2013,boardgame,auto,781669,English MDG-431
AGRICOLA,31260,Agricola,2007,boardgame,auto,297589,Z-Man Games English fifth edition,version_auto,"[{""bgg_id"": 31260, ""name"": ""Agricola"", ""year"": 2007, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]","[{""version_id"": 297589, ""name"": ""Z-Man Games English fifth edition"", ""year"": 2013, ""publishers"": [""Filosofia Éditions"", ""Lookout Games"", ""Z-Man Games""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 165308, ""name"": ""999 Games Dutch second edition 2011"", ""year"": 2011, ""publishers"": [""999 Games"", ""Lookout Games""], ""languages"": [""Dutch""], ""score"": 2}, {""version_id"": 266028, ""name"": ""Hobby World Russian first edition"", ""year"": 2013, ""publishers"": [""Hobby World"", ""Lookout Games""], ""languages"": [""Russian""], ""score"": 2}, {""version_id"": 22673, ""name"": ""Lookout Games German first edition"", ""year"": 2007, ""publishers"": [""Lookout Games""], ""languages"": [""German""], ""score"": 2}, {""version_id"": 64715, ""name"": ""Lookout Games German second edition 2008 with animeeples"", ""year"": 2008, ""publishers"": [""Lookout Games""], ""languages"": [""German""], ""score"": 2}, {""version_id"": 219203, ""name"": ""Lookout Games German seventh edition 2012 with DSP and SdJ"", ""year"": 2012, ""publishers"": [""Lookout Games""], ""languages"": [""German""], ""score"": 2}, {""version_id"": 64718, ""name"": ""Lookout Games German third edition 2009 with DSP and SdJ"", ""year"": 2009, ""publishers"": [""Lookout Games""], ""languages"": [""German""], ""score"": 2}, {""version_id"": 113858, ""name"": ""Lookout Games Russian first edition 2011"", ""year"": 2011, ""publishers"": [""Lookout Games"", ""Smart Ltd""], ""languages"": [""Russian""], ""score"": 2}]",IMG_4518.jpeg,,
METEOR,166109,Meteor,2014,boardgame,auto,,,version_unknown,"[{""bgg_id"": 25172, ""name"": ""Meteor"", ""year"": 1975, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": 56, ""rank"": null}, {""bgg_id"": 166109, ""name"": ""Meteor"", ""year"": 2014, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": 1396, ""rank"": 10371}, {""bgg_id"": 246740, ""name"": ""Meteors"", ""year"": 2018, ""type"": ""boardgame"", ""exact"": false, ""fuzzy"": 92.3, ""owned"": 71, ""rank"": 25541}]",[],IMG_4518.jpeg,,
DOCTOR WHO THE card GAME,125675,Doctor Who: The Card Game,2012,boardgame,auto,,,version_unknown,"[{""bgg_id"": 125675, ""name"": ""Doctor Who: The Card Game"", ""year"": 2012, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]",[],IMG_4518.jpeg,,
DUNGEONS & DRAGONS,,,,,ambiguous,,,,"[{""bgg_id"": 140509, ""name"": ""Dungeons & Dragons"", ""year"": 1985, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": 65, ""rank"": null}]",[],IMG_4519.jpeg,,
DUNGEONS & DRAGONS FANTASY GAME RULES,,,,,ambiguous,,,,"[{""bgg_id"": 140509, ""name"": ""Dungeons & Dragons"", ""year"": 1985, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 67.8, ""owned"": 65, ""rank"": null}]",[],IMG_4519.jpeg,,
DUNGEONS & DRAGONS,,,,,local,,,,"[{""bgg_id"": 355720, ""name"": ""Las Arenas del Destino"", ""year"": 1998, ""type"": ""rpgitem"", ""exact"": false, ""fuzzy"": 0.0, ""owned"": 1, ""rank"": null}, {""bgg_id"": 53384, ""name"": ""Der Berg der Spiegel"", ""year"": 1982, ""type"": ""rpgitem"", ""exact"": false, ""fuzzy"": 0.0, ""owned"": 70, ""rank"": null}, {""bgg_id"": 153208, ""name"": ""\""Advanced Dungeons & Dragons (3rd Edition)\"": Dungeon Masters Guide (2013)"", ""year"": 2013, ""type"": ""rpgitem"", ""exact"": false, ""fuzzy"": 0.0, ""owned"": 10, ""rank"": null}, {""bgg_id"": 66974, ""name"": ""\""Advanced Dungeons & Dragons (3rd Edition)\"": Players Handbook (2009)"", ""year"": 2009, ""type"": ""rpgitem"", ""exact"": false, ""fuzzy"": 0.0, ""owned"": 32, ""rank"": null}, {""bgg_id"": 83387, ""name"": ""\""Advanced Dungeons & Dragons (3rd Edition)\"": Unearthed Arcana (2008)"", ""year"": 2008, ""type"": ""rpgitem"", ""exact"": false, ""fuzzy"": 0.0, ""owned"": 17, ""rank"": null}, {""bgg_id"": 223765, ""name"": ""0-Level Characters: A Guide"", ""year"": 2012, ""type"": ""rpgitem"", ""exact"": false, ""fuzzy"": 0.0, ""owned"": 1, ""rank"": null}, {""bgg_id"": 238233, ""name"": ""1,000 Rooms of Chaos"", ""year"": 2017, ""type"": ""rpgitem"", ""exact"": false, ""fuzzy"": 0.0, ""owned"": 11, ""rank"": null}, {""bgg_id"": 239647, ""name"": ""1,000 Rooms of Chaos II"", ""year"": 2017, ""type"": ""rpgitem"", ""exact"": false, ""fuzzy"": 0.0, ""owned"": 11, ""rank"": null}, {""bgg_id"": 360163, ""name"": ""10 Shark-themed Magical Items"", ""year"": 2022, ""type"": ""rpgitem"", ""exact"": false, ""fuzzy"": 0.0, ""owned"": 0, ""rank"": null}, {""bgg_id"": 360164, ""name"": ""10 Shark-themed Unusual Items"", ""year"": 2022, ""type"": ""rpgitem"", ""exact"": false, ""fuzzy"": 0.0, ""owned"": 0, ""rank"": null}, {""bgg_id"": 332919, ""name"": ""100 Weird Widgets"", ""year"": 2020, ""type"": ""rpgitem"", ""exact"": false, ""fuzzy"": 0.0, ""owned"": 0, ""rank"": null}, {""bgg_id"": 278649, ""name"": ""10th Anniversary Dungeons & Dragons Collector's Set"", ""year"": 1984, ""type"": ""rpgitem"", ""exact"": false, ""fuzzy"": 0.0, ""owned"": 2, ""rank"": null}]",[],IMG_4519.jpeg,,
DUNGEONS & DRAGONS FANTASY GAME RULES,,,,,local,,,,"[{""bgg_id"": 234007, ""name"": ""Alternate Fantasy Role Playing Game Rules"", ""year"": 2009, ""type"": ""rpgitem"", ""exact"": false, ""fuzzy"": 0.0, ""owned"": 0, ""rank"": null}, {""bgg_id"": 271647, ""name"": ""Cantrips: Supplemental Magic Rules for OSR Roleplaying Games"", ""year"": 2019, ""type"": ""rpgitem"", ""exact"": false, ""fuzzy"": 0.0, ""owned"": 0, ""rank"": null}]",[],IMG_4519.jpeg,,
"Before I Kill You, Mister Bond...",164,"Before I Kill You, Mister Bond",1996,boardgame,auto,28465,"Cheapass black and white ""Better Edition"" edition",version_auto,"[{""bgg_id"": 164, ""name"": ""Before I Kill You, Mister Bond"", ""year"": 1996, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]","[{""version_id"": 28465, ""name"": ""Cheapass black and white \""Better Edition\"" edition"", ""year"": 2001, ""publishers"": [""Cheapass Games""], ""languages"": [""English""], ""score"": 5}, {""version_id"": 291316, ""name"": ""English edition 2016"", ""year"": 2016, ""publishers"": [""Cheapass Games""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 520361, ""name"": ""English second edition"", ""year"": 1997, ""publishers"": [""Cheapass Games""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 28459, ""name"": ""First \""Renamed\"" edition, First color edition"", ""year"": 2004, ""publishers"": [""Cheapass Games""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 180392, ""name"": ""First black and white envelope edition"", ""year"": 1996, ""publishers"": [""Cheapass Games""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 28462, ""name"": ""Third black and white edition"", ""year"": 1998, ""publishers"": [""Cheapass Games""], ""languages"": [""English""], ""score"": 3}]",IMG_4519.jpeg;IMG_4554.jpeg,,
MYSTERIUM,181304,Mysterium,2015,boardgame,auto,536289,English edition 2018-2,version_approved,"[{""bgg_id"": 181304, ""name"": ""Mysterium"", ""year"": 2015, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": 85034, ""rank"": 454}, {""bgg_id"": 113997, ""name"": ""Mysterium"", ""year"": 2013, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": 5494, ""rank"": 1143}]","[{""version_id"": 781306, ""name"": ""English 2025 Refresh Edition"", ""year"": 2025, ""publishers"": [""Libellud""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 280251, ""name"": ""English edition 2015-1"", ""year"": 2015, ""publishers"": [""Esdevium"", ""Libellud""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 493543, ""name"": ""English edition 2015-2"", ""year"": 2015, ""publishers"": [""Esdevium"", ""Libellud""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 475162, ""name"": ""English edition 2016-1"", ""year"": 2016, ""publishers"": [""Esdevium"", ""Libellud""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 351093, ""name"": ""English edition 2017-1"", ""year"": 2017, ""publishers"": [""Esdevium"", ""Libellud""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 467608, ""name"": ""English edition 2017-2"", ""year"": 2017, ""publishers"": [""Esdevium"", ""Libellud""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 404443, ""name"": ""English edition 2017-3"", ""year"": 2017, ""publishers"": [""Esdevium"", ""Libellud""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 536289, ""name"": ""English edition 2018-2"", ""year"": 2018, ""publishers"": [""Libellud""], ""languages"": [""English""], ""score"": 3}]",IMG_4520.jpeg,,
Völuspá,128554,Völuspá,2012,boardgame,auto,,,version_unknown,"[{""bgg_id"": 128554, ""name"": ""Völuspá"", ""year"": 2012, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]",[],IMG_4520.jpeg,,
1 title_raw bgg_id bgg_name year type match_status version_id version_name version_status candidates_json version_candidates_json source_photos merged_into dedupe_veto
63 AGRICOLA 31260 Agricola 2007 boardgame auto 297589 Z-Man Games English fifth edition version_auto [{"bgg_id": 31260, "name": "Agricola", "year": 2007, "type": "boardgame", "exact": true, "fuzzy": 100.0, "owned": null, "rank": null}] [{"version_id": 297589, "name": "Z-Man Games English fifth edition", "year": 2013, "publishers": ["Filosofia Éditions", "Lookout Games", "Z-Man Games"], "languages": ["English"], "score": 3}, {"version_id": 165308, "name": "999 Games Dutch second edition 2011", "year": 2011, "publishers": ["999 Games", "Lookout Games"], "languages": ["Dutch"], "score": 2}, {"version_id": 266028, "name": "Hobby World Russian first edition", "year": 2013, "publishers": ["Hobby World", "Lookout Games"], "languages": ["Russian"], "score": 2}, {"version_id": 22673, "name": "Lookout Games German first edition", "year": 2007, "publishers": ["Lookout Games"], "languages": ["German"], "score": 2}, {"version_id": 64715, "name": "Lookout Games German second edition 2008 with animeeples", "year": 2008, "publishers": ["Lookout Games"], "languages": ["German"], "score": 2}, {"version_id": 219203, "name": "Lookout Games German seventh edition 2012 with DSP and SdJ", "year": 2012, "publishers": ["Lookout Games"], "languages": ["German"], "score": 2}, {"version_id": 64718, "name": "Lookout Games German third edition 2009 with DSP and SdJ", "year": 2009, "publishers": ["Lookout Games"], "languages": ["German"], "score": 2}, {"version_id": 113858, "name": "Lookout Games Russian first edition 2011", "year": 2011, "publishers": ["Lookout Games", "Smart Ltd"], "languages": ["Russian"], "score": 2}] IMG_4518.jpeg
64 METEOR 166109 Meteor 2014 boardgame auto version_unknown [{"bgg_id": 25172, "name": "Meteor", "year": 1975, "type": "boardgame", "exact": true, "fuzzy": 100.0, "owned": 56, "rank": null}, {"bgg_id": 166109, "name": "Meteor", "year": 2014, "type": "boardgame", "exact": true, "fuzzy": 100.0, "owned": 1396, "rank": 10371}, {"bgg_id": 246740, "name": "Meteors", "year": 2018, "type": "boardgame", "exact": false, "fuzzy": 92.3, "owned": 71, "rank": 25541}] [] IMG_4518.jpeg
65 DOCTOR WHO THE card GAME 125675 Doctor Who: The Card Game 2012 boardgame auto version_unknown [{"bgg_id": 125675, "name": "Doctor Who: The Card Game", "year": 2012, "type": "boardgame", "exact": true, "fuzzy": 100.0, "owned": null, "rank": null}] [] IMG_4518.jpeg
66 DUNGEONS & DRAGONS ambiguous local [{"bgg_id": 140509, "name": "Dungeons & Dragons", "year": 1985, "type": "boardgame", "exact": true, "fuzzy": 100.0, "owned": 65, "rank": null}] [{"bgg_id": 355720, "name": "Las Arenas del Destino", "year": 1998, "type": "rpgitem", "exact": false, "fuzzy": 0.0, "owned": 1, "rank": null}, {"bgg_id": 53384, "name": "Der Berg der Spiegel", "year": 1982, "type": "rpgitem", "exact": false, "fuzzy": 0.0, "owned": 70, "rank": null}, {"bgg_id": 153208, "name": "\"Advanced Dungeons & Dragons (3rd Edition)\": Dungeon Masters Guide (2013)", "year": 2013, "type": "rpgitem", "exact": false, "fuzzy": 0.0, "owned": 10, "rank": null}, {"bgg_id": 66974, "name": "\"Advanced Dungeons & Dragons (3rd Edition)\": Players Handbook (2009)", "year": 2009, "type": "rpgitem", "exact": false, "fuzzy": 0.0, "owned": 32, "rank": null}, {"bgg_id": 83387, "name": "\"Advanced Dungeons & Dragons (3rd Edition)\": Unearthed Arcana (2008)", "year": 2008, "type": "rpgitem", "exact": false, "fuzzy": 0.0, "owned": 17, "rank": null}, {"bgg_id": 223765, "name": "0-Level Characters: A Guide", "year": 2012, "type": "rpgitem", "exact": false, "fuzzy": 0.0, "owned": 1, "rank": null}, {"bgg_id": 238233, "name": "1,000 Rooms of Chaos", "year": 2017, "type": "rpgitem", "exact": false, "fuzzy": 0.0, "owned": 11, "rank": null}, {"bgg_id": 239647, "name": "1,000 Rooms of Chaos II", "year": 2017, "type": "rpgitem", "exact": false, "fuzzy": 0.0, "owned": 11, "rank": null}, {"bgg_id": 360163, "name": "10 Shark-themed Magical Items", "year": 2022, "type": "rpgitem", "exact": false, "fuzzy": 0.0, "owned": 0, "rank": null}, {"bgg_id": 360164, "name": "10 Shark-themed Unusual Items", "year": 2022, "type": "rpgitem", "exact": false, "fuzzy": 0.0, "owned": 0, "rank": null}, {"bgg_id": 332919, "name": "100 Weird Widgets", "year": 2020, "type": "rpgitem", "exact": false, "fuzzy": 0.0, "owned": 0, "rank": null}, {"bgg_id": 278649, "name": "10th Anniversary Dungeons & Dragons Collector's Set", "year": 1984, "type": "rpgitem", "exact": false, "fuzzy": 0.0, "owned": 2, "rank": null}] [] IMG_4519.jpeg
67 DUNGEONS & DRAGONS FANTASY GAME RULES ambiguous local [{"bgg_id": 140509, "name": "Dungeons & Dragons", "year": 1985, "type": "boardgame", "exact": true, "fuzzy": 67.8, "owned": 65, "rank": null}] [{"bgg_id": 234007, "name": "Alternate Fantasy Role Playing Game Rules", "year": 2009, "type": "rpgitem", "exact": false, "fuzzy": 0.0, "owned": 0, "rank": null}, {"bgg_id": 271647, "name": "Cantrips: Supplemental Magic Rules for OSR Roleplaying Games", "year": 2019, "type": "rpgitem", "exact": false, "fuzzy": 0.0, "owned": 0, "rank": null}] [] IMG_4519.jpeg
68 Before I Kill You, Mister Bond... 164 Before I Kill You, Mister Bond 1996 boardgame auto 28465 Cheapass black and white "Better Edition" edition version_auto [{"bgg_id": 164, "name": "Before I Kill You, Mister Bond", "year": 1996, "type": "boardgame", "exact": true, "fuzzy": 100.0, "owned": null, "rank": null}] [{"version_id": 28465, "name": "Cheapass black and white \"Better Edition\" edition", "year": 2001, "publishers": ["Cheapass Games"], "languages": ["English"], "score": 5}, {"version_id": 291316, "name": "English edition 2016", "year": 2016, "publishers": ["Cheapass Games"], "languages": ["English"], "score": 3}, {"version_id": 520361, "name": "English second edition", "year": 1997, "publishers": ["Cheapass Games"], "languages": ["English"], "score": 3}, {"version_id": 28459, "name": "First \"Renamed\" edition, First color edition", "year": 2004, "publishers": ["Cheapass Games"], "languages": ["English"], "score": 3}, {"version_id": 180392, "name": "First black and white envelope edition", "year": 1996, "publishers": ["Cheapass Games"], "languages": ["English"], "score": 3}, {"version_id": 28462, "name": "Third black and white edition", "year": 1998, "publishers": ["Cheapass Games"], "languages": ["English"], "score": 3}] IMG_4519.jpeg;IMG_4554.jpeg
69 MYSTERIUM 181304 Mysterium 2015 boardgame auto 536289 English edition 2018-2 version_approved [{"bgg_id": 181304, "name": "Mysterium", "year": 2015, "type": "boardgame", "exact": true, "fuzzy": 100.0, "owned": 85034, "rank": 454}, {"bgg_id": 113997, "name": "Mysterium", "year": 2013, "type": "boardgame", "exact": true, "fuzzy": 100.0, "owned": 5494, "rank": 1143}] [{"version_id": 781306, "name": "English 2025 Refresh Edition", "year": 2025, "publishers": ["Libellud"], "languages": ["English"], "score": 3}, {"version_id": 280251, "name": "English edition 2015-1", "year": 2015, "publishers": ["Esdevium", "Libellud"], "languages": ["English"], "score": 3}, {"version_id": 493543, "name": "English edition 2015-2", "year": 2015, "publishers": ["Esdevium", "Libellud"], "languages": ["English"], "score": 3}, {"version_id": 475162, "name": "English edition 2016-1", "year": 2016, "publishers": ["Esdevium", "Libellud"], "languages": ["English"], "score": 3}, {"version_id": 351093, "name": "English edition 2017-1", "year": 2017, "publishers": ["Esdevium", "Libellud"], "languages": ["English"], "score": 3}, {"version_id": 467608, "name": "English edition 2017-2", "year": 2017, "publishers": ["Esdevium", "Libellud"], "languages": ["English"], "score": 3}, {"version_id": 404443, "name": "English edition 2017-3", "year": 2017, "publishers": ["Esdevium", "Libellud"], "languages": ["English"], "score": 3}, {"version_id": 536289, "name": "English edition 2018-2", "year": 2018, "publishers": ["Libellud"], "languages": ["English"], "score": 3}] IMG_4520.jpeg
70 Völuspá 128554 Völuspá 2012 boardgame auto version_unknown [{"bgg_id": 128554, "name": "Völuspá", "year": 2012, "type": "boardgame", "exact": true, "fuzzy": 100.0, "owned": null, "rank": null}] [] IMG_4520.jpeg