diff --git a/data/matches.csv b/data/matches.csv
new file mode 100644
index 0000000..d3a6353
--- /dev/null
+++ b/data/matches.csv
@@ -0,0 +1,28 @@
+title_raw,bgg_id,bgg_name,year,type,match_status,version_id,version_name,version_status,candidates_json,version_candidates_json,source_photos
+ROYALS,165986,Royals,2014,boardgame,auto,,,version_unknown,"[{""bgg_id"": 165986, ""name"": ""Royals"", ""year"": 2014, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]",[],IMG_4499.jpeg
+CAT CRIMES,235096,Cat Crimes,2017,boardgame,auto,360982,English edition,version_auto,"[{""bgg_id"": 235096, ""name"": ""Cat Crimes"", ""year"": 2017, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]","[{""version_id"": 360982, ""name"": ""English edition"", ""year"": 2017, ""publishers"": [""ThinkFun""], ""languages"": [""English""], ""score"": 3}]",IMG_4499.jpeg
+COSMIC ENCOUNTER,40529,Cosmic Encounter,2008,boardgame,auto,,,version_unknown,"[{""bgg_id"": 39, ""name"": ""Cosmic Encounter"", ""year"": 1977, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": 7000, ""rank"": 800}, {""bgg_id"": 40529, ""name"": ""Cosmic Encounter"", ""year"": 2008, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": 75000, ""rank"": 150}]",[],IMG_4499.jpeg
+SHERIFF OF NOTTINGHAM,157969,Sheriff of Nottingham,2014,boardgame,auto,,,version_unknown,"[{""bgg_id"": 157969, ""name"": ""Sheriff of Nottingham"", ""year"": 2014, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]",[],IMG_4499.jpeg
+5 MINUTE DUNGEON,207830,5-Minute Dungeon,2017,boardgame,auto,,,version_unknown,"[{""bgg_id"": 207830, ""name"": ""5-Minute Dungeon"", ""year"": 2017, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]",[],IMG_4499.jpeg
+Britannia,240,Britannia,1986,boardgame,auto,25668,Avalon Hill English edition,version_auto,"[{""bgg_id"": 240, ""name"": ""Britannia"", ""year"": 1986, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]","[{""version_id"": 25668, ""name"": ""Avalon Hill English edition"", ""year"": 1986, ""publishers"": [""The Avalon Hill Game Co""], ""languages"": [""English""], ""score"": 3}]",IMG_4500.jpeg
+CIVILIZATION Game of the Heroic Age - The Dawn of History 8000 BC to 250 BC,,,,,unmatched,,,,[],[],IMG_4500.jpeg
+"ADVANCED CIVILIZATION Game Expansion of the Heroic Age - Featuring New Civilization, Commodity, and Calamity Cards",,,,,unmatched,,,,[],[],IMG_4500.jpeg
+DOCTOR WHO The Game of Time & Space,3090,Doctor Who: The Game of Time & Space,1980,boardgame,auto,309001,Games Workshop English edition,version_auto,"[{""bgg_id"": 3090, ""name"": ""Doctor Who: The Game of Time & Space"", ""year"": 1980, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]","[{""version_id"": 309001, ""name"": ""Games Workshop English edition"", ""year"": 1980, ""publishers"": [""Games Workshop Ltd.""], ""languages"": [""English""], ""score"": 3}]",IMG_4500.jpeg
+SORCERER The Game of Magical Conflict,,,,,unmatched,,,,[],[],IMG_4500.jpeg
+STARFORCE ALPHA CENTAURI Interstellar Conflict in the 25th Century,,,,,unmatched,,,,[],[],IMG_4500.jpeg
+SKIP-BO,1078,Skip-Bo,1967,boardgame,auto,,,version_unknown,"[{""bgg_id"": 1078, ""name"": ""Skip-Bo"", ""year"": 1967, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]",[],IMG_4501.jpeg
+a Gentle Rain,268163,A Gentle Rain,2019,boardgame,auto,268164,Bloom Edition,version_auto,"[{""bgg_id"": 268163, ""name"": ""A Gentle Rain"", ""year"": 2019, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]","[{""version_id"": 268164, ""name"": ""Bloom Edition"", ""year"": 2021, ""publishers"": [""Mondo Games""], ""languages"": [""English""], ""score"": 3}]",IMG_4501.jpeg
+PATCH WORK,163412,Patchwork,2014,boardgame,auto,,,version_unknown,"[{""bgg_id"": 163412, ""name"": ""Patchwork"", ""year"": 2014, ""type"": ""boardgame"", ""exact"": false, ""fuzzy"": 94.7, ""owned"": null, ""rank"": null}]",[],IMG_4501.jpeg
+SANTORINI,194655,Santorini,2016,boardgame,auto,,,version_unknown,"[{""bgg_id"": 194655, ""name"": ""Santorini"", ""year"": 2016, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]",[],IMG_4501.jpeg;IMG_4502.jpeg
+Utter Nonsense!,181254,Utter Nonsense,2015,boardgame,auto,,,version_unknown,"[{""bgg_id"": 181254, ""name"": ""Utter Nonsense"", ""year"": 2015, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]",[],IMG_4501.jpeg
+Cards Against Humanity,50381,Cards Against Humanity,2009,boardgame,auto,,,version_unknown,"[{""bgg_id"": 50381, ""name"": ""Cards Against Humanity"", ""year"": 2009, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]",[],IMG_4501.jpeg
+Joking Hazard,193621,Joking Hazard,2016,boardgame,auto,19362101,First edition,version_auto,"[{""bgg_id"": 193621, ""name"": ""Joking Hazard"", ""year"": 2016, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]","[{""version_id"": 19362101, ""name"": ""First edition"", ""year"": 2016, ""publishers"": [""Cyanide & Happiness""], ""languages"": [""English""], ""score"": 3}]",IMG_4501.jpeg;IMG_4502.jpeg
+EXPLODING KITTENS,172225,Exploding Kittens,2015,boardgame,auto,,,version_unknown,"[{""bgg_id"": 172225, ""name"": ""Exploding Kittens"", ""year"": 2015, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]",[],IMG_4501.jpeg
+Herbaceous,195314,Herbaceous,2017,boardgame,auto,,,version_unknown,"[{""bgg_id"": 195314, ""name"": ""Herbaceous"", ""year"": 2017, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]",[],IMG_4502.jpeg
+Wiz-War,,,,,ambiguous,,,,"[{""bgg_id"": 1218, ""name"": ""Wiz-War"", ""year"": 1983, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": 4000, ""rank"": 2500}, {""bgg_id"": 104710, ""name"": ""Wiz-War"", ""year"": 2012, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": 8000, ""rank"": 1200}]",[],IMG_4502.jpeg
+SCRAWL,218866,Scrawl,2017,boardgame,auto,,,version_unknown,"[{""bgg_id"": 218866, ""name"": ""Scrawl"", ""year"": 2017, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]",[],IMG_4502.jpeg
+FLAT TOP,2529,Flat Top,1977,boardgame,auto,,,version_unknown,"[{""bgg_id"": 2529, ""name"": ""Flat Top"", ""year"": 1977, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]",[],IMG_4502.jpeg
+Diplomacy,483,Diplomacy,1959,boardgame,auto,,,version_ambiguous,"[{""bgg_id"": 483, ""name"": ""Diplomacy"", ""year"": 1959, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]","[{""version_id"": 48301, ""name"": ""Avalon Hill 1976 edition"", ""year"": 1976, ""publishers"": [""The Avalon Hill Game Co""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 48302, ""name"": ""Avalon Hill 1999 edition"", ""year"": 1999, ""publishers"": [""The Avalon Hill Game Co""], ""languages"": [""English""], ""score"": 3}]",IMG_4502.jpeg
+Age of Renaissance,26,Age of Renaissance,1996,boardgame,auto,2601,Avalon Hill English edition,version_auto,"[{""bgg_id"": 26, ""name"": ""Age of Renaissance"", ""year"": 1996, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]","[{""version_id"": 2601, ""name"": ""Avalon Hill English edition"", ""year"": 1996, ""publishers"": [""The Avalon Hill Game Co""], ""languages"": [""English""], ""score"": 3}]",IMG_4502.jpeg
+History of the World,224,History of the World,1991,boardgame,auto,22401,Avalon Hill English edition,version_auto,"[{""bgg_id"": 224, ""name"": ""History of the World"", ""year"": 1991, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]","[{""version_id"": 22401, ""name"": ""Avalon Hill English edition"", ""year"": 1993, ""publishers"": [""The Avalon Hill Game Co""], ""languages"": [""English""], ""score"": 3}]",IMG_4502.jpeg
+Dungeon!,1339,Dungeon!,1975,boardgame,auto,,,version_ambiguous,"[{""bgg_id"": 1339, ""name"": ""Dungeon!"", ""year"": 1975, ""type"": ""boardgame"", ""exact"": true, ""fuzzy"": 100.0, ""owned"": null, ""rank"": null}]","[{""version_id"": 133901, ""name"": ""TSR first edition"", ""year"": 1975, ""publishers"": [""TSR""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 133902, ""name"": ""TSR second edition"", ""year"": 1980, ""publishers"": [""TSR""], ""languages"": [""English""], ""score"": 3}, {""version_id"": 133903, ""name"": ""TSR New Dungeon edition"", ""year"": 1989, ""publishers"": [""TSR""], ""languages"": [""English""], ""score"": 3}]",IMG_4502.jpeg
diff --git a/scripts/write_photo_fixtures.py b/scripts/write_photo_fixtures.py
new file mode 100644
index 0000000..37b34a3
--- /dev/null
+++ b/scripts/write_photo_fixtures.py
@@ -0,0 +1,351 @@
+"""Stub BGG XML fixtures for the 27 titles extracted from the real shelf
+photos, aligned with the objectids in the real collection snapshots.
+
+Like write_stub_fixtures.py these are hand-written approximations (BGG's
+API is locked until the registration is approved). They cover: the plain
+search per title, empty results for the long Avalon Hill/SPI box titles
+(what real search does with them), the truncated-head retry searches,
+tie-break stats (Cosmic Encounter, Wiz-War, Sorcerer), and version lists
+for every title with publisher/edition/year cues. Once BGG_API_TOKEN
+exists: delete the cache dirs and re-run resolve/record_fixtures to
+replace all of this with real recordings.
+
+Usage: uv run python scripts/write_photo_fixtures.py
+"""
+
+from __future__ import annotations
+
+from pathlib import Path
+
+from bggpipe.bgg_client import cache_key
+
+TARGETS = (Path("tests/fixtures/bgg_cache"), Path("data/bgg_cache"))
+SEARCH_TYPES = "boardgame,boardgameexpansion"
+
+BG, EXP = "boardgame", "boardgameexpansion"
+
+# (bgg_id, name, year, type, name_type)
+SEARCHES: dict[str, list[tuple]] = {
+ "ROYALS": [(165986, "Royals", 2014, BG, "primary")],
+ "CAT CRIMES": [(235096, "Cat Crimes", 2017, BG, "primary")],
+ "COSMIC ENCOUNTER": [
+ (39, "Cosmic Encounter", 1977, BG, "primary"),
+ (40529, "Cosmic Encounter", 2008, BG, "primary"),
+ ],
+ "SHERIFF OF NOTTINGHAM": [
+ (157969, "Sheriff of Nottingham", 2014, BG, "primary"),
+ (289411, "Sheriff of Nottingham (2nd Edition)", 2020, BG, "primary"),
+ ],
+ "5 MINUTE DUNGEON": [(207830, "5-Minute Dungeon", 2017, BG, "primary")],
+ "Britannia": [(240, "Britannia", 1986, BG, "primary")],
+ # BGG search finds nothing for the full transcribed box titles
+ "CIVILIZATION Game of the Heroic Age - The Dawn of History 8000 BC to 250 BC": [],
+ "CIVILIZATION Game of the Heroic Age": [],
+ "CIVILIZATION": [
+ (71, "Civilization", 1980, BG, "primary"),
+ (170416, "Sid Meier's Civilization: The Board Game", 2002, BG, "primary"),
+ (233247, "Civilization: A New Dawn", 2017, BG, "primary"),
+ ],
+ "ADVANCED CIVILIZATION Game Expansion of the Heroic Age - "
+ "Featuring New Civilization, Commodity, and Calamity Cards": [],
+ "ADVANCED CIVILIZATION Game Expansion of the Heroic Age": [],
+ "ADVANCED CIVILIZATION": [(177, "Advanced Civilization", 1991, EXP, "primary")],
+ "DOCTOR WHO The Game of Time & Space": [
+ (3090, "Doctor Who: The Game of Time & Space", 1980, BG, "primary"),
+ (125675, "Doctor Who: The Card Game", 2012, BG, "primary"),
+ ],
+ "SORCERER The Game of Magical Conflict": [],
+ "SORCERER": [
+ (3585, "Sorcerer", 1975, BG, "primary"),
+ (244115, "Sorcerer", 2019, BG, "primary"),
+ ],
+ "STARFORCE ALPHA CENTAURI Interstellar Conflict in the 25th Century": [],
+ "STARFORCE ALPHA": [
+ (
+ 2524,
+ "StarForce 'Alpha Centauri': Interstellar Conflict in the 25th Century",
+ 1974,
+ BG,
+ "primary",
+ ),
+ ],
+ "SKIP-BO": [(1078, "Skip-Bo", 1967, BG, "primary")],
+ "a Gentle Rain": [(268163, "A Gentle Rain", 2019, BG, "primary")],
+ "PATCH WORK": [(163412, "Patchwork", 2014, BG, "primary")],
+ "SANTORINI": [
+ (194655, "Santorini", 2016, BG, "primary"),
+ (255563, "Santorini: New York", 2020, BG, "primary"),
+ ],
+ "Utter Nonsense!": [(181254, "Utter Nonsense", 2015, BG, "primary")],
+ "Cards Against Humanity": [(50381, "Cards Against Humanity", 2009, BG, "primary")],
+ "Joking Hazard": [(193621, "Joking Hazard", 2016, BG, "primary")],
+ "EXPLODING KITTENS": [
+ (172225, "Exploding Kittens", 2015, BG, "primary"),
+ (172242, "Exploding Kittens: NSFW Edition", 2015, BG, "primary"),
+ ],
+ "Herbaceous": [(195314, "Herbaceous", 2017, BG, "primary")],
+ "Wiz-War": [
+ (1218, "Wiz-War", 1983, BG, "primary"),
+ (104710, "Wiz-War", 2012, BG, "alternate"), # primary: Wiz-War (Eighth Edition)
+ ],
+ "SCRAWL": [(218866, "Scrawl", 2017, BG, "primary")],
+ "FLAT TOP": [(2529, "Flat Top", 1977, BG, "primary")],
+ "Diplomacy": [(483, "Diplomacy", 1959, BG, "primary")],
+ "Age of Renaissance": [(26, "Age of Renaissance", 1996, BG, "primary")],
+ "History of the World": [(224, "History of the World", 1991, BG, "primary")],
+ "Dungeon!": [(1339, "Dungeon!", 1975, BG, "primary")],
+}
+
+# ids-param -> [(bgg_id, name, year, type, owned, rank, [publishers])]
+THING_STATS: dict[str, list[tuple]] = {
+ "39,40529": [
+ (39, "Cosmic Encounter", 1977, BG, 7000, 800, ["Eon"]),
+ (40529, "Cosmic Encounter", 2008, BG, 75000, 150, ["Fantasy Flight Games"]),
+ ],
+ "1218,104710": [
+ (1218, "Wiz-War", 1983, BG, 4000, 2500, ["Chessex"]),
+ (
+ 104710,
+ "Wiz-War (Eighth Edition)",
+ 2012,
+ BG,
+ 8000,
+ 1200,
+ ["Fantasy Flight Games"],
+ ),
+ ],
+ "3585,244115": [
+ (
+ 3585,
+ "Sorcerer",
+ 1975,
+ BG,
+ 900,
+ 5000,
+ ["Simulations Publications, Inc. (SPI)"],
+ ),
+ (244115, "Sorcerer", 2019, BG, 6000, 1500, ["White Wizard Games"]),
+ ],
+}
+
+# bgg_id -> [(version_id, name, year, [publishers], [languages])]
+VERSIONS: dict[int, list[tuple]] = {
+ 235096: [(360982, "English edition", 2017, ["ThinkFun"], ["English"])],
+ 240: [
+ (
+ 25668,
+ "Avalon Hill English edition",
+ 1986,
+ ["The Avalon Hill Game Co"],
+ ["English"],
+ ),
+ (90000, "Fantasy Flight edition", 2006, ["Fantasy Flight Games"], ["English"]),
+ (
+ 90001,
+ "Welt der Spiele German edition",
+ 1986,
+ ["Welt der Spiele"],
+ ["German"],
+ ),
+ ],
+ 71: [
+ (
+ 71001,
+ "Avalon Hill English edition",
+ 1981,
+ ["The Avalon Hill Game Co"],
+ ["English"],
+ ),
+ (
+ 71002,
+ "Hartland Trefoil first edition",
+ 1980,
+ ["Hartland Trefoil Ltd."],
+ ["English"],
+ ),
+ (71003, "Gibsons Games edition", 1988, ["Gibsons Games"], ["English"]),
+ ],
+ 177: [
+ (
+ 177001,
+ "Avalon Hill English edition",
+ 1991,
+ ["The Avalon Hill Game Co"],
+ ["English"],
+ )
+ ],
+ 3090: [
+ (
+ 309001,
+ "Games Workshop English edition",
+ 1980,
+ ["Games Workshop Ltd."],
+ ["English"],
+ ),
+ ],
+ 3585: [
+ (
+ 358501,
+ "SPI Designer's Edition",
+ 1975,
+ ["Simulations Publications, Inc. (SPI)"],
+ ["English"],
+ ),
+ (
+ 358502,
+ "SPI folio edition",
+ 1975,
+ ["Simulations Publications, Inc. (SPI)"],
+ ["English"],
+ ),
+ ],
+ 2524: [
+ (
+ 252401,
+ "SPI Designer's Edition",
+ 1974,
+ ["Simulations Publications, Inc. (SPI)"],
+ ["English"],
+ ),
+ (
+ 252402,
+ "SPI folio edition",
+ 1974,
+ ["Simulations Publications, Inc. (SPI)"],
+ ["English"],
+ ),
+ ],
+ 268163: [
+ (268164, "Bloom Edition", 2021, ["Mondo Games"], ["English"]),
+ (268165, "First edition", 2019, ["Mondo Games"], ["English"]),
+ ],
+ 193621: [(19362101, "First edition", 2016, ["Cyanide & Happiness"], ["English"])],
+ 2529: [
+ (252901, "Avalon Hill edition", 1981, ["The Avalon Hill Game Co"], ["English"]),
+ (252902, "Battleline first edition", 1977, ["Battleline"], ["English"]),
+ ],
+ 483: [
+ (
+ 48301,
+ "Avalon Hill 1976 edition",
+ 1976,
+ ["The Avalon Hill Game Co"],
+ ["English"],
+ ),
+ (
+ 48302,
+ "Avalon Hill 1999 edition",
+ 1999,
+ ["The Avalon Hill Game Co"],
+ ["English"],
+ ),
+ (48303, "Gibsons Games edition", 1963, ["Gibsons Games"], ["English"]),
+ ],
+ 26: [
+ (
+ 2601,
+ "Avalon Hill English edition",
+ 1996,
+ ["The Avalon Hill Game Co"],
+ ["English"],
+ )
+ ],
+ 224: [
+ (
+ 22401,
+ "Avalon Hill English edition",
+ 1993,
+ ["The Avalon Hill Game Co"],
+ ["English"],
+ ),
+ (
+ 22402,
+ "Ragnar Brothers first edition",
+ 1991,
+ ["Ragnar Brothers"],
+ ["English"],
+ ),
+ ],
+ 1339: [
+ (133901, "TSR first edition", 1975, ["TSR"], ["English"]),
+ (133902, "TSR second edition", 1980, ["TSR"], ["English"]),
+ (133903, "TSR New Dungeon edition", 1989, ["TSR"], ["English"]),
+ ],
+}
+
+
+def search_xml(results: list[tuple]) -> str:
+ items = "".join(
+ f'- '
+ f''
+ f'
'
+ for bgg_id, name, year, type_, name_type in results
+ )
+ return f'{items}'
+
+
+def stats_xml(things: list[tuple]) -> str:
+ items = ""
+ for bgg_id, name, year, type_, owned, rank, publishers in things:
+ links = "".join(
+ f''
+ for p in publishers
+ )
+ items += (
+ f'- '
+ f''
+ f'{links}'
+ f""
+ f''
+ f''
+ f"
"
+ )
+ return f"{items}"
+
+
+def versions_xml(bgg_id: int, versions: list[tuple]) -> str:
+ version_items = ""
+ for vid, name, year, publishers, languages in versions:
+ links = "".join(
+ f''
+ for p in publishers
+ ) + "".join(
+ f'' for lang in languages
+ )
+ version_items += (
+ f'- '
+ f''
+ f'{links}
'
+ )
+ return (
+ f'- '
+ f''
+ f"{version_items}
"
+ )
+
+
+def _esc(text: str) -> str:
+ return text.replace("&", "&").replace("<", "<").replace('"', """)
+
+
+def main() -> None:
+ files: dict[str, str] = {}
+ for query, results in SEARCHES.items():
+ key = cache_key("search", {"query": query, "type": SEARCH_TYPES})
+ files[key] = search_xml(results)
+ for ids, things in THING_STATS.items():
+ files[cache_key("thing", {"id": ids, "stats": "1"})] = stats_xml(things)
+ for bgg_id, versions in VERSIONS.items():
+ key = cache_key("thing", {"id": str(bgg_id), "versions": "1"})
+ files[key] = versions_xml(bgg_id, versions)
+
+ for target in TARGETS:
+ target.mkdir(parents=True, exist_ok=True)
+ for name, xml in files.items():
+ (target / name).write_text(xml)
+ print(f"Wrote {len(files)} fixture file(s) to {' and '.join(map(str, TARGETS))}")
+
+
+if __name__ == "__main__":
+ main()
diff --git a/src/bggpipe/resolve.py b/src/bggpipe/resolve.py
index 7e1f0ba..eedfeea 100644
--- a/src/bggpipe/resolve.py
+++ b/src/bggpipe/resolve.py
@@ -59,12 +59,11 @@ class TitleEntry:
@property
def has_version_cues(self) -> bool:
- return bool(
- self.publisher_hint
- or self.edition_hint
- or self.year_hint
- or self.language_hint
- )
+ """Cues strong enough to justify a versions fetch. Language alone
+ can never reach the plausibility threshold (it scores 1 of the
+ required 2), so fetching on it would waste a rate-limited request —
+ it still participates in scoring when other cues exist."""
+ return bool(self.publisher_hint or self.edition_hint or self.year_hint)
@dataclass
diff --git a/tests/fixtures/bgg_cache/search_query=5-MINUTE-DUNGEON-type=boardgame-2Cboardgameexpansion_8996b7d5fe.xml b/tests/fixtures/bgg_cache/search_query=5-MINUTE-DUNGEON-type=boardgame-2Cboardgameexpansion_8996b7d5fe.xml
new file mode 100644
index 0000000..f3f02bc
--- /dev/null
+++ b/tests/fixtures/bgg_cache/search_query=5-MINUTE-DUNGEON-type=boardgame-2Cboardgameexpansion_8996b7d5fe.xml
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/tests/fixtures/bgg_cache/search_query=ADVANCED-CIVILIZATION-Game-Expansion-of-the-Heroic-Age---Featuring-New-Civ_8486af3c6d.xml b/tests/fixtures/bgg_cache/search_query=ADVANCED-CIVILIZATION-Game-Expansion-of-the-Heroic-Age---Featuring-New-Civ_8486af3c6d.xml
new file mode 100644
index 0000000..ba791c3
--- /dev/null
+++ b/tests/fixtures/bgg_cache/search_query=ADVANCED-CIVILIZATION-Game-Expansion-of-the-Heroic-Age---Featuring-New-Civ_8486af3c6d.xml
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/tests/fixtures/bgg_cache/search_query=ADVANCED-CIVILIZATION-Game-Expansion-of-the-Heroic-Age-type=boardgame-2Cbo_1f14c01996.xml b/tests/fixtures/bgg_cache/search_query=ADVANCED-CIVILIZATION-Game-Expansion-of-the-Heroic-Age-type=boardgame-2Cbo_1f14c01996.xml
new file mode 100644
index 0000000..ba791c3
--- /dev/null
+++ b/tests/fixtures/bgg_cache/search_query=ADVANCED-CIVILIZATION-Game-Expansion-of-the-Heroic-Age-type=boardgame-2Cbo_1f14c01996.xml
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/tests/fixtures/bgg_cache/search_query=ADVANCED-CIVILIZATION-type=boardgame-2Cboardgameexpansion_aca1fe8ceb.xml b/tests/fixtures/bgg_cache/search_query=ADVANCED-CIVILIZATION-type=boardgame-2Cboardgameexpansion_aca1fe8ceb.xml
new file mode 100644
index 0000000..7ed9bac
--- /dev/null
+++ b/tests/fixtures/bgg_cache/search_query=ADVANCED-CIVILIZATION-type=boardgame-2Cboardgameexpansion_aca1fe8ceb.xml
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/tests/fixtures/bgg_cache/search_query=Age-of-Renaissance-type=boardgame-2Cboardgameexpansion_877bb1bc86.xml b/tests/fixtures/bgg_cache/search_query=Age-of-Renaissance-type=boardgame-2Cboardgameexpansion_877bb1bc86.xml
new file mode 100644
index 0000000..0baddd4
--- /dev/null
+++ b/tests/fixtures/bgg_cache/search_query=Age-of-Renaissance-type=boardgame-2Cboardgameexpansion_877bb1bc86.xml
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/tests/fixtures/bgg_cache/search_query=Britannia-type=boardgame-2Cboardgameexpansion_b1f230622c.xml b/tests/fixtures/bgg_cache/search_query=Britannia-type=boardgame-2Cboardgameexpansion_b1f230622c.xml
new file mode 100644
index 0000000..53de9b0
--- /dev/null
+++ b/tests/fixtures/bgg_cache/search_query=Britannia-type=boardgame-2Cboardgameexpansion_b1f230622c.xml
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/tests/fixtures/bgg_cache/search_query=CAT-CRIMES-type=boardgame-2Cboardgameexpansion_782f1326dc.xml b/tests/fixtures/bgg_cache/search_query=CAT-CRIMES-type=boardgame-2Cboardgameexpansion_782f1326dc.xml
new file mode 100644
index 0000000..66d2d30
--- /dev/null
+++ b/tests/fixtures/bgg_cache/search_query=CAT-CRIMES-type=boardgame-2Cboardgameexpansion_782f1326dc.xml
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/tests/fixtures/bgg_cache/search_query=CIVILIZATION-Game-of-the-Heroic-Age---The-Dawn-of-History-8000-BC-to-250-B_6dfe500fb4.xml b/tests/fixtures/bgg_cache/search_query=CIVILIZATION-Game-of-the-Heroic-Age---The-Dawn-of-History-8000-BC-to-250-B_6dfe500fb4.xml
new file mode 100644
index 0000000..ba791c3
--- /dev/null
+++ b/tests/fixtures/bgg_cache/search_query=CIVILIZATION-Game-of-the-Heroic-Age---The-Dawn-of-History-8000-BC-to-250-B_6dfe500fb4.xml
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/tests/fixtures/bgg_cache/search_query=CIVILIZATION-Game-of-the-Heroic-Age-type=boardgame-2Cboardgameexpansion_481c867f49.xml b/tests/fixtures/bgg_cache/search_query=CIVILIZATION-Game-of-the-Heroic-Age-type=boardgame-2Cboardgameexpansion_481c867f49.xml
new file mode 100644
index 0000000..ba791c3
--- /dev/null
+++ b/tests/fixtures/bgg_cache/search_query=CIVILIZATION-Game-of-the-Heroic-Age-type=boardgame-2Cboardgameexpansion_481c867f49.xml
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/tests/fixtures/bgg_cache/search_query=CIVILIZATION-type=boardgame-2Cboardgameexpansion_dbefe5359a.xml b/tests/fixtures/bgg_cache/search_query=CIVILIZATION-type=boardgame-2Cboardgameexpansion_dbefe5359a.xml
new file mode 100644
index 0000000..0736cc9
--- /dev/null
+++ b/tests/fixtures/bgg_cache/search_query=CIVILIZATION-type=boardgame-2Cboardgameexpansion_dbefe5359a.xml
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/tests/fixtures/bgg_cache/search_query=COSMIC-ENCOUNTER-type=boardgame-2Cboardgameexpansion_848554ec74.xml b/tests/fixtures/bgg_cache/search_query=COSMIC-ENCOUNTER-type=boardgame-2Cboardgameexpansion_848554ec74.xml
new file mode 100644
index 0000000..c7d8760
--- /dev/null
+++ b/tests/fixtures/bgg_cache/search_query=COSMIC-ENCOUNTER-type=boardgame-2Cboardgameexpansion_848554ec74.xml
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/tests/fixtures/bgg_cache/search_query=Cards-Against-Humanity-type=boardgame-2Cboardgameexpansion_154ea686d4.xml b/tests/fixtures/bgg_cache/search_query=Cards-Against-Humanity-type=boardgame-2Cboardgameexpansion_154ea686d4.xml
new file mode 100644
index 0000000..a83a9b8
--- /dev/null
+++ b/tests/fixtures/bgg_cache/search_query=Cards-Against-Humanity-type=boardgame-2Cboardgameexpansion_154ea686d4.xml
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/tests/fixtures/bgg_cache/search_query=DOCTOR-WHO-The-Game-of-Time-26-Space-type=boardgame-2Cboardgameexpansion_c8073100d5.xml b/tests/fixtures/bgg_cache/search_query=DOCTOR-WHO-The-Game-of-Time-26-Space-type=boardgame-2Cboardgameexpansion_c8073100d5.xml
new file mode 100644
index 0000000..7fc1341
--- /dev/null
+++ b/tests/fixtures/bgg_cache/search_query=DOCTOR-WHO-The-Game-of-Time-26-Space-type=boardgame-2Cboardgameexpansion_c8073100d5.xml
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/tests/fixtures/bgg_cache/search_query=Diplomacy-type=boardgame-2Cboardgameexpansion_e688e8fb3c.xml b/tests/fixtures/bgg_cache/search_query=Diplomacy-type=boardgame-2Cboardgameexpansion_e688e8fb3c.xml
new file mode 100644
index 0000000..d0f22a6
--- /dev/null
+++ b/tests/fixtures/bgg_cache/search_query=Diplomacy-type=boardgame-2Cboardgameexpansion_e688e8fb3c.xml
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/tests/fixtures/bgg_cache/search_query=Dungeon-21-type=boardgame-2Cboardgameexpansion_9c49c5766f.xml b/tests/fixtures/bgg_cache/search_query=Dungeon-21-type=boardgame-2Cboardgameexpansion_9c49c5766f.xml
new file mode 100644
index 0000000..3814e39
--- /dev/null
+++ b/tests/fixtures/bgg_cache/search_query=Dungeon-21-type=boardgame-2Cboardgameexpansion_9c49c5766f.xml
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/tests/fixtures/bgg_cache/search_query=EXPLODING-KITTENS-type=boardgame-2Cboardgameexpansion_d7b66e2720.xml b/tests/fixtures/bgg_cache/search_query=EXPLODING-KITTENS-type=boardgame-2Cboardgameexpansion_d7b66e2720.xml
new file mode 100644
index 0000000..9585ee9
--- /dev/null
+++ b/tests/fixtures/bgg_cache/search_query=EXPLODING-KITTENS-type=boardgame-2Cboardgameexpansion_d7b66e2720.xml
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/tests/fixtures/bgg_cache/search_query=FLAT-TOP-type=boardgame-2Cboardgameexpansion_f29706aacf.xml b/tests/fixtures/bgg_cache/search_query=FLAT-TOP-type=boardgame-2Cboardgameexpansion_f29706aacf.xml
new file mode 100644
index 0000000..c930d74
--- /dev/null
+++ b/tests/fixtures/bgg_cache/search_query=FLAT-TOP-type=boardgame-2Cboardgameexpansion_f29706aacf.xml
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/tests/fixtures/bgg_cache/search_query=Herbaceous-type=boardgame-2Cboardgameexpansion_668671d8a7.xml b/tests/fixtures/bgg_cache/search_query=Herbaceous-type=boardgame-2Cboardgameexpansion_668671d8a7.xml
new file mode 100644
index 0000000..8a20847
--- /dev/null
+++ b/tests/fixtures/bgg_cache/search_query=Herbaceous-type=boardgame-2Cboardgameexpansion_668671d8a7.xml
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/tests/fixtures/bgg_cache/search_query=History-of-the-World-type=boardgame-2Cboardgameexpansion_fcff3e9f9a.xml b/tests/fixtures/bgg_cache/search_query=History-of-the-World-type=boardgame-2Cboardgameexpansion_fcff3e9f9a.xml
new file mode 100644
index 0000000..4d1cb0c
--- /dev/null
+++ b/tests/fixtures/bgg_cache/search_query=History-of-the-World-type=boardgame-2Cboardgameexpansion_fcff3e9f9a.xml
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/tests/fixtures/bgg_cache/search_query=Joking-Hazard-type=boardgame-2Cboardgameexpansion_7ce024e973.xml b/tests/fixtures/bgg_cache/search_query=Joking-Hazard-type=boardgame-2Cboardgameexpansion_7ce024e973.xml
new file mode 100644
index 0000000..cf2ba6f
--- /dev/null
+++ b/tests/fixtures/bgg_cache/search_query=Joking-Hazard-type=boardgame-2Cboardgameexpansion_7ce024e973.xml
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/tests/fixtures/bgg_cache/search_query=PATCH-WORK-type=boardgame-2Cboardgameexpansion_398fbd77a5.xml b/tests/fixtures/bgg_cache/search_query=PATCH-WORK-type=boardgame-2Cboardgameexpansion_398fbd77a5.xml
new file mode 100644
index 0000000..f177ea4
--- /dev/null
+++ b/tests/fixtures/bgg_cache/search_query=PATCH-WORK-type=boardgame-2Cboardgameexpansion_398fbd77a5.xml
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/tests/fixtures/bgg_cache/search_query=ROYALS-type=boardgame-2Cboardgameexpansion_1113df3dae.xml b/tests/fixtures/bgg_cache/search_query=ROYALS-type=boardgame-2Cboardgameexpansion_1113df3dae.xml
new file mode 100644
index 0000000..f1c4a55
--- /dev/null
+++ b/tests/fixtures/bgg_cache/search_query=ROYALS-type=boardgame-2Cboardgameexpansion_1113df3dae.xml
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/tests/fixtures/bgg_cache/search_query=SANTORINI-type=boardgame-2Cboardgameexpansion_7c9b71b031.xml b/tests/fixtures/bgg_cache/search_query=SANTORINI-type=boardgame-2Cboardgameexpansion_7c9b71b031.xml
new file mode 100644
index 0000000..faeec09
--- /dev/null
+++ b/tests/fixtures/bgg_cache/search_query=SANTORINI-type=boardgame-2Cboardgameexpansion_7c9b71b031.xml
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/tests/fixtures/bgg_cache/search_query=SCRAWL-type=boardgame-2Cboardgameexpansion_9de3a82a7b.xml b/tests/fixtures/bgg_cache/search_query=SCRAWL-type=boardgame-2Cboardgameexpansion_9de3a82a7b.xml
new file mode 100644
index 0000000..a336e78
--- /dev/null
+++ b/tests/fixtures/bgg_cache/search_query=SCRAWL-type=boardgame-2Cboardgameexpansion_9de3a82a7b.xml
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/tests/fixtures/bgg_cache/search_query=SHERIFF-OF-NOTTINGHAM-type=boardgame-2Cboardgameexpansion_e8b9feea5d.xml b/tests/fixtures/bgg_cache/search_query=SHERIFF-OF-NOTTINGHAM-type=boardgame-2Cboardgameexpansion_e8b9feea5d.xml
new file mode 100644
index 0000000..28db624
--- /dev/null
+++ b/tests/fixtures/bgg_cache/search_query=SHERIFF-OF-NOTTINGHAM-type=boardgame-2Cboardgameexpansion_e8b9feea5d.xml
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/tests/fixtures/bgg_cache/search_query=SKIP-BO-type=boardgame-2Cboardgameexpansion_2403c9a3c0.xml b/tests/fixtures/bgg_cache/search_query=SKIP-BO-type=boardgame-2Cboardgameexpansion_2403c9a3c0.xml
new file mode 100644
index 0000000..7b8de8c
--- /dev/null
+++ b/tests/fixtures/bgg_cache/search_query=SKIP-BO-type=boardgame-2Cboardgameexpansion_2403c9a3c0.xml
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/tests/fixtures/bgg_cache/search_query=SORCERER-The-Game-of-Magical-Conflict-type=boardgame-2Cboardgameexpansion_0be5b731c6.xml b/tests/fixtures/bgg_cache/search_query=SORCERER-The-Game-of-Magical-Conflict-type=boardgame-2Cboardgameexpansion_0be5b731c6.xml
new file mode 100644
index 0000000..ba791c3
--- /dev/null
+++ b/tests/fixtures/bgg_cache/search_query=SORCERER-The-Game-of-Magical-Conflict-type=boardgame-2Cboardgameexpansion_0be5b731c6.xml
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/tests/fixtures/bgg_cache/search_query=SORCERER-type=boardgame-2Cboardgameexpansion_1548147928.xml b/tests/fixtures/bgg_cache/search_query=SORCERER-type=boardgame-2Cboardgameexpansion_1548147928.xml
new file mode 100644
index 0000000..9dbaf0f
--- /dev/null
+++ b/tests/fixtures/bgg_cache/search_query=SORCERER-type=boardgame-2Cboardgameexpansion_1548147928.xml
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/tests/fixtures/bgg_cache/search_query=STARFORCE-ALPHA-CENTAURI-Interstellar-Conflict-in-the-25th-Century-type=bo_d1ea14fbd7.xml b/tests/fixtures/bgg_cache/search_query=STARFORCE-ALPHA-CENTAURI-Interstellar-Conflict-in-the-25th-Century-type=bo_d1ea14fbd7.xml
new file mode 100644
index 0000000..ba791c3
--- /dev/null
+++ b/tests/fixtures/bgg_cache/search_query=STARFORCE-ALPHA-CENTAURI-Interstellar-Conflict-in-the-25th-Century-type=bo_d1ea14fbd7.xml
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/tests/fixtures/bgg_cache/search_query=STARFORCE-ALPHA-type=boardgame-2Cboardgameexpansion_e4d139c3af.xml b/tests/fixtures/bgg_cache/search_query=STARFORCE-ALPHA-type=boardgame-2Cboardgameexpansion_e4d139c3af.xml
new file mode 100644
index 0000000..bb68a9d
--- /dev/null
+++ b/tests/fixtures/bgg_cache/search_query=STARFORCE-ALPHA-type=boardgame-2Cboardgameexpansion_e4d139c3af.xml
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/tests/fixtures/bgg_cache/search_query=Utter-Nonsense-21-type=boardgame-2Cboardgameexpansion_d3e090d859.xml b/tests/fixtures/bgg_cache/search_query=Utter-Nonsense-21-type=boardgame-2Cboardgameexpansion_d3e090d859.xml
new file mode 100644
index 0000000..e968537
--- /dev/null
+++ b/tests/fixtures/bgg_cache/search_query=Utter-Nonsense-21-type=boardgame-2Cboardgameexpansion_d3e090d859.xml
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/tests/fixtures/bgg_cache/search_query=Wiz-War-type=boardgame-2Cboardgameexpansion_5e60175c58.xml b/tests/fixtures/bgg_cache/search_query=Wiz-War-type=boardgame-2Cboardgameexpansion_5e60175c58.xml
new file mode 100644
index 0000000..a1c3e2e
--- /dev/null
+++ b/tests/fixtures/bgg_cache/search_query=Wiz-War-type=boardgame-2Cboardgameexpansion_5e60175c58.xml
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/tests/fixtures/bgg_cache/search_query=a-Gentle-Rain-type=boardgame-2Cboardgameexpansion_2c8b74ea84.xml b/tests/fixtures/bgg_cache/search_query=a-Gentle-Rain-type=boardgame-2Cboardgameexpansion_2c8b74ea84.xml
new file mode 100644
index 0000000..58285bb
--- /dev/null
+++ b/tests/fixtures/bgg_cache/search_query=a-Gentle-Rain-type=boardgame-2Cboardgameexpansion_2c8b74ea84.xml
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/tests/fixtures/bgg_cache/thing_id=1218-2C104710-stats=1_9ac6609f5e.xml b/tests/fixtures/bgg_cache/thing_id=1218-2C104710-stats=1_9ac6609f5e.xml
new file mode 100644
index 0000000..9fa319f
--- /dev/null
+++ b/tests/fixtures/bgg_cache/thing_id=1218-2C104710-stats=1_9ac6609f5e.xml
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/tests/fixtures/bgg_cache/thing_id=1339-versions=1_76fffe61e6.xml b/tests/fixtures/bgg_cache/thing_id=1339-versions=1_76fffe61e6.xml
new file mode 100644
index 0000000..3e6a42a
--- /dev/null
+++ b/tests/fixtures/bgg_cache/thing_id=1339-versions=1_76fffe61e6.xml
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/tests/fixtures/bgg_cache/thing_id=177-versions=1_a50b6534c2.xml b/tests/fixtures/bgg_cache/thing_id=177-versions=1_a50b6534c2.xml
new file mode 100644
index 0000000..ebb23c6
--- /dev/null
+++ b/tests/fixtures/bgg_cache/thing_id=177-versions=1_a50b6534c2.xml
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/tests/fixtures/bgg_cache/thing_id=193621-versions=1_b0b8e177ce.xml b/tests/fixtures/bgg_cache/thing_id=193621-versions=1_b0b8e177ce.xml
new file mode 100644
index 0000000..7b06bda
--- /dev/null
+++ b/tests/fixtures/bgg_cache/thing_id=193621-versions=1_b0b8e177ce.xml
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/tests/fixtures/bgg_cache/thing_id=224-versions=1_0965f5986e.xml b/tests/fixtures/bgg_cache/thing_id=224-versions=1_0965f5986e.xml
new file mode 100644
index 0000000..369b103
--- /dev/null
+++ b/tests/fixtures/bgg_cache/thing_id=224-versions=1_0965f5986e.xml
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/tests/fixtures/bgg_cache/thing_id=235096-versions=1_6971fd8efc.xml b/tests/fixtures/bgg_cache/thing_id=235096-versions=1_6971fd8efc.xml
new file mode 100644
index 0000000..9d8f086
--- /dev/null
+++ b/tests/fixtures/bgg_cache/thing_id=235096-versions=1_6971fd8efc.xml
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/tests/fixtures/bgg_cache/thing_id=240-versions=1_720245041a.xml b/tests/fixtures/bgg_cache/thing_id=240-versions=1_720245041a.xml
new file mode 100644
index 0000000..10952de
--- /dev/null
+++ b/tests/fixtures/bgg_cache/thing_id=240-versions=1_720245041a.xml
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/tests/fixtures/bgg_cache/thing_id=2524-versions=1_a36c20def8.xml b/tests/fixtures/bgg_cache/thing_id=2524-versions=1_a36c20def8.xml
new file mode 100644
index 0000000..9d18a1a
--- /dev/null
+++ b/tests/fixtures/bgg_cache/thing_id=2524-versions=1_a36c20def8.xml
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/tests/fixtures/bgg_cache/thing_id=2529-versions=1_ae4f4b0f0f.xml b/tests/fixtures/bgg_cache/thing_id=2529-versions=1_ae4f4b0f0f.xml
new file mode 100644
index 0000000..8d0a1ef
--- /dev/null
+++ b/tests/fixtures/bgg_cache/thing_id=2529-versions=1_ae4f4b0f0f.xml
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/tests/fixtures/bgg_cache/thing_id=26-versions=1_3d488157bf.xml b/tests/fixtures/bgg_cache/thing_id=26-versions=1_3d488157bf.xml
new file mode 100644
index 0000000..e30e60b
--- /dev/null
+++ b/tests/fixtures/bgg_cache/thing_id=26-versions=1_3d488157bf.xml
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/tests/fixtures/bgg_cache/thing_id=268163-versions=1_73358308e2.xml b/tests/fixtures/bgg_cache/thing_id=268163-versions=1_73358308e2.xml
new file mode 100644
index 0000000..64be42c
--- /dev/null
+++ b/tests/fixtures/bgg_cache/thing_id=268163-versions=1_73358308e2.xml
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/tests/fixtures/bgg_cache/thing_id=3090-versions=1_c1e6ddabda.xml b/tests/fixtures/bgg_cache/thing_id=3090-versions=1_c1e6ddabda.xml
new file mode 100644
index 0000000..ee33c40
--- /dev/null
+++ b/tests/fixtures/bgg_cache/thing_id=3090-versions=1_c1e6ddabda.xml
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/tests/fixtures/bgg_cache/thing_id=3585-2C244115-stats=1_f1c50911dc.xml b/tests/fixtures/bgg_cache/thing_id=3585-2C244115-stats=1_f1c50911dc.xml
new file mode 100644
index 0000000..66a1c13
--- /dev/null
+++ b/tests/fixtures/bgg_cache/thing_id=3585-2C244115-stats=1_f1c50911dc.xml
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/tests/fixtures/bgg_cache/thing_id=3585-versions=1_48ead3ba60.xml b/tests/fixtures/bgg_cache/thing_id=3585-versions=1_48ead3ba60.xml
new file mode 100644
index 0000000..7610e3d
--- /dev/null
+++ b/tests/fixtures/bgg_cache/thing_id=3585-versions=1_48ead3ba60.xml
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/tests/fixtures/bgg_cache/thing_id=39-2C40529-stats=1_7fb40b9d38.xml b/tests/fixtures/bgg_cache/thing_id=39-2C40529-stats=1_7fb40b9d38.xml
new file mode 100644
index 0000000..4b9cb69
--- /dev/null
+++ b/tests/fixtures/bgg_cache/thing_id=39-2C40529-stats=1_7fb40b9d38.xml
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/tests/fixtures/bgg_cache/thing_id=483-versions=1_795d325a85.xml b/tests/fixtures/bgg_cache/thing_id=483-versions=1_795d325a85.xml
new file mode 100644
index 0000000..4e19eaf
--- /dev/null
+++ b/tests/fixtures/bgg_cache/thing_id=483-versions=1_795d325a85.xml
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/tests/fixtures/bgg_cache/thing_id=71-versions=1_19169a34ed.xml b/tests/fixtures/bgg_cache/thing_id=71-versions=1_19169a34ed.xml
new file mode 100644
index 0000000..3565a0d
--- /dev/null
+++ b/tests/fixtures/bgg_cache/thing_id=71-versions=1_19169a34ed.xml
@@ -0,0 +1 @@
+
\ No newline at end of file