Files
bggpipe/data/upload_log.csv
T
Eric WagonerandClaude Fable 5 32b6aae841 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
2026-08-06 00:21:52 -04:00

14 KiB

1actionbgg_idcollidnameversion_idsecond_copystatustimestamperror
2add334011A Gentle Rain701315failed2026-08-06T02:15:34+00:00TimeoutError: Locator.wait_for: Timeout 15000ms exceeded. Call log: - waiting for get_by_role("dialog").get_by_role("heading", name=re.compile(r"A\ Gentle\ Rain", re.IGNORECASE)) to be visible
3add589Wiz-War27352failed2026-08-06T02:20:33+00:00Error: Locator.check: Error: strict mode violation: get_by_role("dialog").get_by_label("Own") resolved to 2 elements: 1) <input type="checkbox" ng-model="item.status.own" class="ng-pristine ng-untouched ng-valid ng-empty"/> aka get_by_role("checkbox", name="Own", exact=True) 2) <input type="checkbox" ng-model="item.status.prevowned" class="ng-pristine ng-untouched ng-valid ng-empty"/> aka get_by_role("checkbox", name="Prev. Owned") Call log: - waiting for get_by_role("dialog").get_by_label("Own")
4add334011A Gentle Rain701315added2026-08-06T02:21:32+00:00
5add125921Catan: Junior476263added2026-08-06T02:24:22+00:00
6add31260Agricola297589added2026-08-06T02:24:28+00:00
7add181304Mysterium536289added_no_version2026-08-06T02:24:34+00:00version 'English edition 2018-2' not in picker; added without version
8add312786Poetry for Neanderthals514050added_no_version2026-08-06T02:24:40+00:00version 'English edition 2020' not in picker; added without version
9add273240The Red Dragon Inn Smorgasbox446069added2026-08-06T02:24:46+00:00
10add419687Munchkin Big Box711400failed2026-08-06T02:38:12+00:00TimeoutError: Locator.click: Timeout 30000ms exceeded. Call log: - waiting for get_by_role("dialog").locator("ul.pagination a[title=\"First Page\"]").first - locator resolved to <a href="" role="menuitem" title="First Page" class="pagination-pager" ng-click="selectPage(1)"> ⇆⇆⇆⇆First ⇆⇆⇆</a> - attempting click action 2 × waiting for element to be visible, enabled and stable - element is not visible - retrying click action - waiting 20ms 2 × waiting for element to be visible, enabled and stable - element is not visible - retrying click action - waiting 100ms 55 × waiting for element to be visible, enabled and stable - element is not visible - retrying click action - waiting 500ms
11add252153Tang Garden404702failed2026-08-06T02:38:48+00:00TimeoutError: Locator.click: Timeout 30000ms exceeded. Call log: - waiting for get_by_role("dialog").locator("ul.pagination a[title=\"First Page\"]").first - locator resolved to <a href="" role="menuitem" title="First Page" class="pagination-pager" ng-click="selectPage(1)"> ⇆⇆⇆⇆First ⇆⇆⇆</a> - attempting click action 2 × waiting for element to be visible, enabled and stable - element is not visible - retrying click action - waiting 20ms 2 × waiting for element to be visible, enabled and stable - element is not visible - retrying click action - waiting 100ms 56 × waiting for element to be visible, enabled and stable - element is not visible - retrying click action - waiting 500ms
12add255984Sleeping Gods701034failed2026-08-06T02:39:23+00:00TimeoutError: Locator.click: Timeout 30000ms exceeded. Call log: - waiting for get_by_role("dialog").locator("ul.pagination a[title=\"First Page\"]").first - locator resolved to <a href="" role="menuitem" title="First Page" class="pagination-pager" ng-click="selectPage(1)"> ⇆⇆⇆⇆First ⇆⇆⇆</a> - attempting click action 2 × waiting for element to be visible, enabled and stable - element is not visible - retrying click action - waiting 20ms 2 × waiting for element to be visible, enabled and stable - element is not visible - retrying click action - waiting 100ms 56 × waiting for element to be visible, enabled and stable - element is not visible - retrying click action - waiting 500ms
13add589Wiz-War27352added2026-08-06T02:45:10+00:00
14add419687Munchkin Big Box711400added2026-08-06T02:45:16+00:00
15add252153Tang Garden404702added2026-08-06T02:45:23+00:00
16add255984Sleeping Gods701034failed2026-08-06T02:45:58+00:00TimeoutError: Locator.click: Timeout 30000ms exceeded. Call log: - waiting for get_by_role("dialog").locator("li:has(.summary-item-thumbnail)").filter(has_text=re.compile(r"Sleeping\ Gods\ \(English\ Gamefound\ edition\)\ \(2023\)", re.IGNORECASE)).first
17add283766Sleeping Gods: Tides of Ruin463140added2026-08-06T02:46:07+00:00
18add255984Sleeping Gods701034failed2026-08-06T02:49:44+00:00RuntimeError: 'Sleeping Gods (English Gamefound edition) (2023)' was listed a moment ago but vanished on the second pass — retryable
19add280794Etherfields458300added2026-08-06T02:49:53+00:00
20add380837Botany650545added2026-08-06T02:50:00+00:00
21add393672Gloomhaven: Buttons & Bugs669782failed2026-08-06T02:50:07+00:00RuntimeError: 'Gloomhaven: Buttons & Bugs (English edition) (2024)' was listed a moment ago but vanished on the second pass — retryable
22add14535SPANC: Space Pirate Amazon Ninja Catgirls29075added2026-08-06T02:50:15+00:00
23add255984Sleeping Gods701034added2026-08-06T02:54:05+00:00
24add393672Gloomhaven: Buttons & Bugs669782added2026-08-06T02:54:12+00:00
25add9666Greed Quest215137added2026-08-06T02:54:19+00:00
26add40508Scrabble Slam!644326added2026-08-06T02:54:27+00:00
27add3181Farkle87931added2026-08-06T02:54:36+00:00
28add193485Dastardly Dirigibles300446added2026-08-06T02:54:54+00:00
29add226065Sheriff of Nottingham: Merry Men353389added2026-08-06T02:55:01+00:00
30add143884Machi Koro453051added2026-08-06T02:55:09+00:00
31add358880Etherfields: Kittenburg Expansion603694added2026-08-06T02:55:15+00:00
32add432858Artistry734890added2026-08-06T02:55:21+00:00
33add417060Botany: Tantalizing Trees706506added2026-08-06T02:55:27+00:00
34add417064Botany: Perilous Perfumes706510added2026-08-06T02:55:33+00:00
35add161928Utter Nonsenseadded2026-08-06T02:55:40+00:00
36add50381Cards Against Humanityadded2026-08-06T02:55:44+00:00
37add1269Skip-Boadded2026-08-06T02:55:50+00:00
38add202982Scrawladded2026-08-06T02:55:56+00:00
39add195314Herbaceousadded2026-08-06T02:56:02+00:00
40add320202Dragon Landadded2026-08-06T02:56:07+00:00
41add2452Jengaadded2026-08-06T02:56:12+00:00
42add42063Code Masteradded2026-08-06T02:56:18+00:00
43add340420Throw Throw Avocadoadded2026-08-06T02:56:23+00:00
44add1260Rookadded2026-08-06T02:56:28+00:00
45add116Guillotineadded2026-08-06T02:56:34+00:00
46add169124Flick 'em Up!added2026-08-06T02:56:40+00:00
47add20866The Rocky Horror Trivia Gameadded2026-08-06T02:56:45+00:00
48add269564Captain Marvel: Secret Skrullsadded2026-08-06T02:57:37+00:00
49add18755Pie Face!added2026-08-06T02:57:41+00:00
50add140509Dungeons & Dragonsfailed2026-08-06T02:58:01+00:00TimeoutError: Locator.wait_for: Timeout 15000ms exceeded. Call log: - waiting for get_by_role("dialog").get_by_role("heading", name=re.compile(r"Dungeons\ \&\ Dragons", re.IGNORECASE)) to be visible
51add201248Evolution: The Beginningadded2026-08-06T02:58:05+00:00
52add362205Sleeping Gods: Primeval Periladded2026-08-06T02:58:11+00:00
53add453845Murder at the Manoradded2026-08-06T02:58:16+00:00
54add329230Bluffaneeradded2026-08-06T02:58:20+00:00
55add358320Sleeping Gods: Distant Skiesadded2026-08-06T02:58:26+00:00
56add389113Rivalsadded2026-08-06T02:58:31+00:00
57add324937Wiz-War (9th Edition)added2026-08-06T02:58:35+00:00
58add295770Frosthavenadded2026-08-06T02:58:40+00:00
59add174430Gloomhavenadded2026-08-06T02:58:46+00:00
60add442312Deadly Doodlesadded2026-08-06T02:58:51+00:00
61add332398Everdell: The Complete Collectionadded2026-08-06T02:58:56+00:00
62add334065Verdantadded2026-08-06T02:59:01+00:00
63add283155Calicoadded2026-08-06T02:59:06+00:00
64add291457Gloomhaven: Jaws of the Lionadded2026-08-06T02:59:12+00:00
65add150925Hold Your Breath!added2026-08-06T02:59:18+00:00
66add2980The Simpsons Trivia Gameadded2026-08-06T02:59:23+00:00
67add1197Blinkadded2026-08-06T02:59:29+00:00
68add140509Dungeons & Dragonsfailed2026-08-06T03:05:04+00:00TimeoutError: Locator.wait_for: Timeout 15000ms exceeded. Call log: - waiting for get_by_role("dialog").get_by_role("heading", name=re.compile(r"Dungeons\ \&\ Dragons", re.IGNORECASE)) to be visible
69add352819The Office Trivia Gameadded2026-08-06T03:05:09+00:00
70add163412Patchworkadded2026-08-06T03:05:14+00:00
71add291847Mantis Fallsadded2026-08-06T03:05:19+00:00
72add2058Civilization: West Extension Mapadded2026-08-06T03:05:24+00:00
73add452833Artistry: Delightful Doorways Mini Expansionadded2026-08-06T03:05:31+00:00
74update24053429559Britannia24621failed2026-08-06T03:06:04+00:00TimeoutError: Locator.click: Timeout 30000ms exceeded. Call log: - waiting for get_by_role("row").filter(has_text=re.compile(r"Britannia", re.IGNORECASE)).first.get_by_role("link", name=re.compile(r"own", re.IGNORECASE)).first
75update7153429530Civilization24006failed2026-08-06T03:06:39+00:00TimeoutError: Locator.click: Timeout 30000ms exceeded. Call log: - waiting for get_by_role("row").filter(has_text=re.compile(r"Civilization", re.IGNORECASE)).first.get_by_role("link", name=re.compile(r"own", re.IGNORECASE)).first
76update17753429542Advanced Civilization24972failed2026-08-06T03:07:12+00:00TimeoutError: Locator.click: Timeout 30000ms exceeded. Call log: - waiting for get_by_role("row").filter(has_text=re.compile(r"Advanced\ Civilization", re.IGNORECASE)).first.get_by_role("link", name=re.compile(r"own", re.IGNORECASE)).first
77update24053429559Britannia24621failed2026-08-06T03:08:42+00:00TimeoutError: Locator.click: Timeout 30000ms exceeded. Call log: - waiting for get_by_role("row").filter(has_text=re.compile(r"Britannia", re.IGNORECASE)).first.get_by_role("link", name=re.compile(r"own", re.IGNORECASE)).first
78update7153429530Civilization24006failed2026-08-06T03:09:17+00:00TimeoutError: Locator.click: Timeout 30000ms exceeded. Call log: - waiting for get_by_role("row").filter(has_text=re.compile(r"Civilization", re.IGNORECASE)).first.get_by_role("link", name=re.compile(r"own", re.IGNORECASE)).first
79update17753429542Advanced Civilization24972failed2026-08-06T03:09:50+00:00TimeoutError: Locator.click: Timeout 30000ms exceeded. Call log: - waiting for get_by_role("row").filter(has_text=re.compile(r"Advanced\ Civilization", re.IGNORECASE)).first.get_by_role("link", name=re.compile(r"own", re.IGNORECASE)).first
80update24053429559Britannia24621updated2026-08-06T03:17:05+00:00
81update7153429530Civilization24006failed2026-08-06T03:17:11+00:00Error: Page.goto: net::ERR_NETWORK_CHANGED at https://boardgamegeek.com/collection/user/***?objectid=71&own=1 Call log: - navigating to "https://boardgamegeek.com/collection/user/***?objectid=71&own=1", waiting until "domcontentloaded"
82update17753429542Advanced Civilization24972updated2026-08-06T03:17:17+00:00
83update7153429530Civilization24006updated2026-08-06T03:17:36+00:00
84update309053429504Doctor Who: The Game of Time & Space25782updated2026-08-06T03:17:55+00:00
85update358553429482Sorcerer: The Game of Magical Conflict211154updated2026-08-06T03:18:02+00:00
86update252453429367StarForce 'Alpha Centauri': Interstellar Conflict in the 25th Century219137updated2026-08-06T03:18:06+00:00
87update22453429816History of the World20727updated2026-08-06T03:18:11+00:00
88update920953429636Ticket to Ride294188updated2026-08-06T03:18:17+00:00
89update1353430595Catan347121updated2026-08-06T03:18:24+00:00
90update121953430485Labyrinth488621updated2026-08-06T03:18:32+00:00
91update13790953429649Bugs in the Kitchen216474updated2026-08-06T03:18:38+00:00
92update2771053430142Catan Dice Game606657updated2026-08-06T03:18:44+00:00
93update16978453429953Castle Panic: The Dark Titan260454updated2026-08-06T03:18:49+00:00
94update14737053429666Robot Turtles231664updated2026-08-06T03:18:55+00:00
95update4344353430559Castle Panic103068updated2026-08-06T03:19:02+00:00
96update2431053429632The Red Dragon Inn374258updated2026-08-06T03:19:06+00:00
97update3985653429748Dixit296529updated2026-08-06T03:19:11+00:00
98update3550553430257Walk the Plank!781669updated2026-08-06T03:19:15+00:00
99update16453430020Before I Kill You, Mister Bond28465updated2026-08-06T03:19:20+00:00
100update181304148198097Mysterium536289updated2026-08-06T03:19:27+00:00
101update6524453429887Forbidden Island31208updated2026-08-06T03:19:33+00:00
102update9538653429908Tempurra290572updated2026-08-06T03:19:41+00:00
103update25853430200Fluxx20840updated2026-08-06T03:19:47+00:00
104update312786148198100Poetry for Neanderthals514050updated2026-08-06T03:19:52+00:00
105update18861453430332Simon's Cat Card Game779792updated2026-08-06T03:19:57+00:00
106update432453429850Risk: The Lord of the Rings26859updated2026-08-06T03:20:01+00:00
107update192753429933Munchkin28144updated2026-08-06T03:20:06+00:00
108update178453430007Dark Cults110926updated2026-08-06T03:20:11+00:00
109update17653429986Give Me the Brain!27673updated2026-08-06T03:20:16+00:00
110update25753430040Kill Doctor Lucky520364updated2026-08-06T03:20:21+00:00
111update15399953612880...and then, we held hands.280845updated2026-08-06T03:20:26+00:00
112update16697653612866Consentacle410382updated2026-08-06T03:20:32+00:00
113update23130253430652The Cat Game361880updated2026-08-06T03:20:36+00:00
114update4069253430517Small World294178updated2026-08-06T03:20:45+00:00
115update17250353429718Mage Wars Academy265107updated2026-08-06T03:20:49+00:00
116update10471053429642Wiz-War (Eighth Edition)117685updated2026-08-06T03:20:53+00:00
117update133953430097Dungeon!34390updated2026-08-06T04:01:15+00:00