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
+272 -143
View File
@@ -1344,51 +1344,6 @@
]
}
},
"345770": {
"bgg_id": 345770,
"type": "rpgitem",
"name": ".dungeon",
"year": 2021,
"description": "Publisher's blurb:\n\n.dungeon is a book about traveling through a virtual, fantasy world. One person takes on the role of the World, filling in the nooks and crannies with dungeons and adventures that they think up or borrow from books they already own. Everyone else is a Player and creates a Character to explore those nooks, discover their treasure, and interact with NPCs and other flesh-and-blood folks in the virtual world.\n\nThe thing that sets .dungeon apart from other books is the inspiration it takes from social games like Werewolf and Munchkin. The real world can (and will) affect the game you create. Each class has different powers based on physical things you do, or different parts of your life. The witch uses their tattoos to cast spells while the wizard uses their favorite book. The knight makes vows while the leader can offer gifts to the other players to aid them. There are 10 classes total to choose from, including the bard, the troll, and the artist.",
"image": "https://cf.geekdo-images.com/k6Mpl_0HSRcE2aICW12qGg__original/img/abdC7c7hGDsswx5ZLnOYAiQ_hXY=/0x0/filters:format(png)/pic6358032.png",
"thumbnail": "https://cf.geekdo-images.com/k6Mpl_0HSRcE2aICW12qGg__small/img/-NVpXLCuGaKT24RTahEhdeoy_-M=/fit-in/200x150/filters:strip_icc()/pic6358032.png",
"min_players": null,
"max_players": null,
"best_player_counts": [],
"playtime": null,
"min_playtime": null,
"max_playtime": null,
"min_age": null,
"designers": [
"John Battle"
],
"artists": [
"Micah Anderson",
"Kate Sheridan",
"Jared Sinclair"
],
"publishers": [
"Project Nerves"
],
"categories": [
"Fantasy",
"Core Rules (min needed to play)"
],
"mechanics": [
"Attribute/Stat Based (STR, CON, PER, etc)",
"Dice (Various)",
"Dice Step (variable dice vs. static target)"
],
"producers": [
"John Battle"
],
"series": [],
"rating": 0.0,
"weight": 0.0,
"rank": null,
"users_owned": 31,
"version": null
},
"9209:294188": {
"bgg_id": 9209,
"type": "boardgame",
@@ -6343,71 +6298,6 @@
]
}
},
"258849": {
"bgg_id": 258849,
"type": "rpgitem",
"name": "Parsely",
"year": 2018,
"description": "Publisher's blurb:\n\nRelive the glory days of floppy disks, dot-matrix printers and 128K RAM with this collection of party games inspired by the text-adventures of the 1980s.\n\nAs the parser, you&rsquo;ll take on the role of a computer game with a limited vocabulary. One by one, the players will give you commands like GO NORTH, LIGHT LAMP or GET SWORD, which you&rsquo;ll follow to the best of your ability. There&rsquo;s no limit to the number of people that can play and no limit to the fun you&rsquo;ll have. So what are you waiting for? It&rsquo;s time to unplug from your computer and plug into Parsely!\n\nContains 10 classic Parsely games and two brand-new adventurers!\n\nFeatures a forward by Peter Adkison and includes the following Parsely games:\n\n Action Castle\n Action Castle II\n Action Castle III\n Blackboard Jungle\n Dangertown Beatdown\n Flaming Goat!\n Jungle Adventure\n Pumpkin Town\n Six-Gun Showdown\n Space Station\n Spooky Manor\n Z-Ward",
"image": "https://cf.geekdo-images.com/KypGSMwOACTbKnZNk1_nXQ__original/img/Blui7nSyq2Vr-0LpZS0C7AYD3xU=/0x0/filters:format(png)/pic4634784.png",
"thumbnail": "https://cf.geekdo-images.com/KypGSMwOACTbKnZNk1_nXQ__small/img/h1F5b8CM6T2TkjT9U60TuAHfhvk=/fit-in/200x150/filters:strip_icc()/pic4634784.png",
"min_players": null,
"max_players": null,
"best_player_counts": [],
"playtime": null,
"min_playtime": null,
"max_playtime": null,
"min_age": null,
"designers": [
"Jared A. Sorensen"
],
"artists": [
"Alexey Andreyev",
"Samuel Araya",
"Rebekah Bennington",
"Alice K. Hansmann",
"Todd James",
"Manning Krull",
"Jon Morris",
"Keith Senkowski",
"Lukas Wong-Achorn",
"Jordan Worley",
"Ariel ZB"
],
"publishers": [
"Memento Mori Theatricks"
],
"categories": [
"Action / Adventure",
"Comedy / Satire",
"Fantasy",
"History (American West)",
"Horror",
"Horror (Supernatural)",
"Horror (Zombies)",
"Kid-Friendly",
"Modern",
"Science Fiction",
"Weird / Surreal",
"Core Rules (min needed to play)",
"Scenario / Adventure / Module"
],
"mechanics": [
"Description Based (Narrative more so than Dice)",
"'Diceless' (does not use dice or other randomizer)",
"Reading (for Periodicals, Adventure Books, etc)"
],
"producers": [
"Luke Crane",
"Radosław Drozdalski"
],
"series": [],
"rating": 9.1875,
"weight": 2.3333,
"rank": null,
"users_owned": 50,
"version": null
},
"153999:280845": {
"bgg_id": 153999,
"type": "boardgame",
@@ -7408,30 +7298,6 @@
"IMG_4516.jpeg"
]
},
"local:dungeons and dragons:IMG_4519.jpeg": {
"bgg_id": null,
"name": "DUNGEONS & DRAGONS",
"year": null,
"type": "localgame",
"publishers": [
"TSR"
],
"source_photos": [
"IMG_4519.jpeg"
]
},
"local:dungeons and dragons fantasy game rules:IMG_4519.jpeg": {
"bgg_id": null,
"name": "DUNGEONS & DRAGONS FANTASY GAME RULES",
"year": null,
"type": "localgame",
"publishers": [
"TSR"
],
"source_photos": [
"IMG_4519.jpeg"
]
},
"local:elite sportz equipment table top curling:IMG_4526.jpeg": {
"bgg_id": null,
"name": "Elite Sportz Equipment Table Top Curling",
@@ -7466,24 +7332,287 @@
"IMG_4544.jpeg"
]
},
"local:alice is missing silent falls expansion:IMG_4566.jpeg": {
"1339:34390": {
"bgg_id": 1339,
"type": "boardgame",
"name": "Dungeon!",
"year": 1975,
"description": "In many ways \"Dungeon!\" is similar to Dungeons & Dragons, although much simplified and transformed into a board game. Players explore a dungeon that is divided into levels of increasing difficulty, fighting monsters for valuable treasure. As players venture deeper into the dungeon, the monsters become more difficult and the treasure more valuable. Several character classes each have slightly different fighting abilities &ndash; most notably the wizard, who can cast spells. Combat is simulated using dice; players roll the dice to attack a monster, and if unsuccessful, the dice are rolled to determine the effect of the monster's counter-attack.\n\nThe winner is the first player to bring a certain amount of treasure back to the Dungeon's entrance.\n\nReimplemented by:\n\n\n The Classic Dungeon\n The New Dungeon",
"image": "https://cf.geekdo-images.com/fvhkcw4s6Q4-nMwwok1J6A__original/img/WJFmTRWQRzOInBnWAjH39F3RyMg=/0x0/filters:format(png)/pic6569894.png",
"thumbnail": "https://cf.geekdo-images.com/fvhkcw4s6Q4-nMwwok1J6A__small/img/zXW1s2ZXq1dZkvbAzYdr9o1xRNQ=/fit-in/200x150/filters:strip_icc()/pic6569894.png",
"min_players": 1,
"max_players": 8,
"best_player_counts": [
"4",
"5"
],
"playtime": 60,
"min_playtime": 30,
"max_playtime": 60,
"min_age": 8,
"designers": [
"David R. Megarry"
],
"artists": [
"Daniel Gelon",
"Keith Hill",
"Richard Hill",
"James Holloway (I)",
"Larry Kessling",
"Michael Komarck",
"Tracy Lesch",
"Victoria Maderna",
"Erol Otus",
"Harry Quinn",
"Jim Roslof",
"Stephen Sullivan",
"Franz Vohwinkel"
],
"publishers": [
"Tactical Studies Rules (TSR)",
"ASS Altenburger Spielkarten",
"Jedko Games",
"Novedades Montecarlo",
"Parker Brothers",
"Wizards of the Coast"
],
"categories": [
"Adventure",
"Exploration",
"Fantasy",
"Fighting"
],
"mechanics": [
"Area Movement",
"Critical Hits and Failures",
"Dice Rolling",
"Events",
"Grid Movement",
"Role Playing",
"Simulation",
"Variable Player Powers"
],
"producers": [],
"series": [],
"rating": 6.01294,
"weight": 1.5527,
"rank": 5417,
"users_owned": 10830,
"version": {
"version_id": 34390,
"name": "English first edition",
"year": 1975,
"publishers": [
"Tactical Studies Rules (TSR)"
],
"languages": [
"English"
]
}
},
"380459:743266": {
"bgg_id": 380459,
"type": "rpgitem",
"name": "Alice is Missing: Silent Falls",
"year": 2023,
"description": "Publisher's blurb:\n\nThe Silent Falls expansion allows players to rediscover the game with additional cards that facilitate evocative new stories.\n\nWith the Silent Falls expansion, players are provided an opportunity to explore brand new stories with additional Suspect, Location, Character, Searching, and Clue cards, as well as new Relationship cards that help you to deepen your connections to the other characters.\n\nPlayers have the opportunity to explore uncharted locations such as the dark, echoing spaces of the Caloma Caves, confront new Suspects like the distant father John Briarwood, and uncover thrilling new conclusions to Alice&rsquo;s disappearance as they reveal the new 10-minute clue cards.\n\nThe Silent Falls expansion introduces 38 new cards in total, which is more than half the amount of cards in the original Alice is Missing. 4 new playable characters, 2 new Relationship cards with a total of 12 new prompts, 3 new Suspects, 3 new Locations, 4 new Searching cards and 22 new Clue cards (two additional Clue cards for each standard timestamp, as well as three additional 10 minute cards, and a replacement 90 minute card).",
"image": "https://cf.geekdo-images.com/GzhipcGBA1UC8CzH85hF_A__original/img/wNgYFo-rrT0ZCYYXKLCQPEXclDY=/0x0/filters:format(jpeg)/pic8511647.jpg",
"thumbnail": "https://cf.geekdo-images.com/GzhipcGBA1UC8CzH85hF_A__small/img/UN0XWQ2UCXl0GSBANfZnjBozURU=/fit-in/200x150/filters:strip_icc()/pic8511647.jpg",
"min_players": null,
"max_players": null,
"best_player_counts": [],
"playtime": null,
"min_playtime": null,
"max_playtime": null,
"min_age": null,
"designers": [
"Banana Chan",
"Spenser Starke"
],
"artists": [
"Julianne Griepp"
],
"publishers": [
"Alis Games",
"Devir",
"Hunters Entertainment",
"Origames",
"Renegade Game Studios"
],
"categories": [
"Crime (Mystery / Detective / Noir)",
"Sourcebook (rules/options to enhance play)"
],
"mechanics": [
"Cards (Specialized)",
"Description Based (Narrative more so than Dice)"
],
"producers": [
"Tomasz \"Sting\" Chmielik"
],
"series": [],
"rating": 7.42857,
"weight": 0.0,
"rank": null,
"users_owned": 226,
"version": {
"version_id": 743266,
"name": "Alice ha desaparecido: Expansión Silent Falls",
"year": 2024,
"publishers": [],
"languages": [
"Spanish"
]
}
},
"311654": {
"bgg_id": 311654,
"type": "rpgitem",
"name": "Alice is Missing",
"year": 2020,
"description": "From the kickstarter:\n\nAlice is Missing, a silent role-playing game about the disappearance of Alice Briarwood, a high school junior in the small town of Silent Falls.\n...\nThe game is played live and without verbal communication. Players inhabit their character for the entirety of the 90-minute play session, and instead of speaking, send text messages back and forth to the other characters in a group chat, as well as individually, as though they aren&rsquo;t in the same place together.\n\nPublisher's blurb:\n\nThe game is played live and without verbal communication. Players inhabit their character for the entirety of the 90-minute play session, and instead of speaking, send text messages back and forth to the other characters in a group chat, as well as individually, as though they aren&rsquo;t in the same place together.\n\nHaunting beautiful, deeply personal, and highly innovative Alice is Missing puts a strong focus on the emotional engagement between players, immersing them in a tense, dramatic mystery that unfolds organically through the text messages they send to one another. Right at home with games like Life Is Strange, Gone Home, Oxenfree, and Firewatch, it&rsquo;s designed to feel as much like an event-style experience as it does a role-playing game.\n\nA microbadge is available",
"image": "https://cf.geekdo-images.com/211476emISgQLsa2h3BAYw__original/img/nGOu9LrFF5udRimbJrei6HExde8=/0x0/filters:format(png)/pic5625807.png",
"thumbnail": "https://cf.geekdo-images.com/211476emISgQLsa2h3BAYw__small/img/g9QMstNAY2uOVSR1rH5Hx7Gxquk=/fit-in/200x150/filters:strip_icc()/pic5625807.png",
"min_players": null,
"max_players": null,
"best_player_counts": [],
"playtime": null,
"min_playtime": null,
"max_playtime": null,
"min_age": null,
"designers": [
"Spenser Starke"
],
"artists": [
"Caleb Cleveland",
"Christopher De La Rosa",
"Julianne Griepp"
],
"publishers": [
"Alis Games",
"Choo Choo Games",
"Devir",
"Hunters Entertainment",
"Origames",
"Raven Distribution",
"Renegade Game Studios",
"Schwerkraft-Verlag"
],
"categories": [
"Childhood",
"Crime (Mystery / Detective / Noir)",
"Social (Relationships / Romance)",
"Core Rules (min needed to play)"
],
"mechanics": [
"Cards (Specialized)",
"Description Based (Narrative more so than Dice)"
],
"producers": [
"Tomasz \"Sting\" Chmielik"
],
"series": [],
"rating": 7.58289,
"weight": 1.9565,
"rank": null,
"users_owned": 2008,
"version": null
},
"258849:449806": {
"bgg_id": 258849,
"type": "rpgitem",
"name": "Parsely",
"year": 2018,
"description": "Publisher's blurb:\n\nRelive the glory days of floppy disks, dot-matrix printers and 128K RAM with this collection of party games inspired by the text-adventures of the 1980s.\n\nAs the parser, you&rsquo;ll take on the role of a computer game with a limited vocabulary. One by one, the players will give you commands like GO NORTH, LIGHT LAMP or GET SWORD, which you&rsquo;ll follow to the best of your ability. There&rsquo;s no limit to the number of people that can play and no limit to the fun you&rsquo;ll have. So what are you waiting for? It&rsquo;s time to unplug from your computer and plug into Parsely!\n\nContains 10 classic Parsely games and two brand-new adventurers!\n\nFeatures a forward by Peter Adkison and includes the following Parsely games:\n\n Action Castle\n Action Castle II\n Action Castle III\n Blackboard Jungle\n Dangertown Beatdown\n Flaming Goat!\n Jungle Adventure\n Pumpkin Town\n Six-Gun Showdown\n Space Station\n Spooky Manor\n Z-Ward",
"image": "https://cf.geekdo-images.com/KypGSMwOACTbKnZNk1_nXQ__original/img/Blui7nSyq2Vr-0LpZS0C7AYD3xU=/0x0/filters:format(png)/pic4634784.png",
"thumbnail": "https://cf.geekdo-images.com/KypGSMwOACTbKnZNk1_nXQ__small/img/h1F5b8CM6T2TkjT9U60TuAHfhvk=/fit-in/200x150/filters:strip_icc()/pic4634784.png",
"min_players": null,
"max_players": null,
"best_player_counts": [],
"playtime": null,
"min_playtime": null,
"max_playtime": null,
"min_age": null,
"designers": [
"Jared A. Sorensen"
],
"artists": [
"Alexey Andreyev",
"Samuel Araya",
"Rebekah Bennington",
"Alice K. Hansmann",
"Todd James",
"Manning Krull",
"Jon Morris",
"Keith Senkowski",
"Lukas Wong-Achorn",
"Jordan Worley",
"Ariel ZB"
],
"publishers": [
"Memento Mori Theatricks"
],
"categories": [
"Action / Adventure",
"Comedy / Satire",
"Fantasy",
"History (American West)",
"Horror",
"Horror (Supernatural)",
"Horror (Zombies)",
"Kid-Friendly",
"Modern",
"Science Fiction",
"Weird / Surreal",
"Core Rules (min needed to play)",
"Scenario / Adventure / Module"
],
"mechanics": [
"Description Based (Narrative more so than Dice)",
"'Diceless' (does not use dice or other randomizer)",
"Reading (for Periodicals, Adventure Books, etc)"
],
"producers": [
"Luke Crane",
"Radosław Drozdalski"
],
"series": [],
"rating": 9.1875,
"weight": 2.3333,
"rank": null,
"users_owned": 50,
"version": {
"version_id": 449806,
"name": "Hardcover version",
"year": 2018,
"publishers": [],
"languages": [
"English"
]
}
},
"local:dungeons and dragons:IMG_4519.jpeg": {
"bgg_id": null,
"name": "ALICE IS MISSING SILENT FALLS EXPANSION",
"name": "DUNGEONS & DRAGONS",
"year": null,
"type": "localgame",
"publishers": [],
"publishers": [
"TSR"
],
"source_photos": [
"IMG_4566.jpeg"
"IMG_4519.jpeg"
]
},
"local:alice is missing silent role playing game:IMG_4566.jpeg": {
"local:dungeons and dragons fantasy game rules:IMG_4519.jpeg": {
"bgg_id": null,
"name": "ALICE IS MISSING A SILENT ROLE PLAYING GAME",
"year": 2021,
"name": "DUNGEONS & DRAGONS FANTASY GAME RULES",
"year": null,
"type": "localgame",
"publishers": [],
"publishers": [
"TSR"
],
"source_photos": [
"IMG_4566.jpeg"
"IMG_4519.jpeg"
]
}
}