The real-data era: token live, stubs retired, editions on demand

BGG application approved. The migration the stub markers guarded for
weeks: both synthetic caches deleted; tests/fixtures/bgg_cache
re-recorded from the live API (recording list extended to every
scenario the suite exercises — Civilization truncation, the Sorcerer
SPI tiebreak, StarForce, Flat Top's thematic year, Alice Is Missing's
rpgitem fallback); resolve --force re-matched all 133 titles for real
(109 auto, 6 ambiguous, 18 unmatched, 30 edition ballots);
data/STUB_DATA.marker deleted with its exit condition met — the guard
mechanism stays armed should stubs ever regenerate.

Reality fixed one bug and taught one lesson. The bug: a multi-type
search lists an expansion twice (once per matched type) and the parser
kept the generic boardgame entry — parse_search now dedupes by id
preferring the specific type, which is what keeps expansion tagging
(the base-vs-expansion review guard) alive on real data. The lesson:
hand-built ambiguity is tidier than the real thing — Wingspan has 46
versions with three plausible English Stonemaier printings, so the
suite's synthetic version ids and version_auto expectations became
real ballots (assertions updated to recorded reality; the cue-plumbing
test keeps its crafted two-version scenario via an injected
transport).

New: pick edition. A cue-less matched row is version_unknown by design
(never guess) — but the owner knows which printing the box is.
open_version_ballot() fetches the game's complete version list,
cue-scores it when cues exist, and marks the row version_ambiguous so
the normal Review edition pass presents it; the Titles page grows the
button (Eric's three Wiz-Wars: two cue-less copies can now each claim
their edition).

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-05 18:50:17 -04:00
co-authored by Claude Fable 5
parent 15d3120029
commit 59f4b8c43c
135 changed files with 15851 additions and 266 deletions
@@ -1 +1,707 @@
<items><item type="boardgame" id="3585"><name type="primary" value="game"/><versions><item type="boardgameversion" id="358501"><name type="primary" value="SPI Designer's Edition"/><yearpublished value="1975"/><link type="boardgamepublisher" id="1" value="Simulations Publications, Inc. (SPI)"/><link type="language" id="1" value="English"/></item><item type="boardgameversion" id="358502"><name type="primary" value="SPI folio edition"/><yearpublished value="1975"/><link type="boardgamepublisher" id="1" value="Simulations Publications, Inc. (SPI)"/><link type="language" id="1" value="English"/></item></versions></item></items>
<?xml version="1.0" encoding="utf-8"?><items termsofuse="https://boardgamegeek.com/xmlapi/termsofuse"><item type="boardgame" id="3585">
<thumbnail>https://cf.geekdo-images.com/NpauF7CJudER5H5nj-z-gA__small/img/Vo85InhIcQUg1myZBiHCL22uu8A=/fit-in/200x150/filters:strip_icc()/pic10078.jpg</thumbnail>
<image>https://cf.geekdo-images.com/NpauF7CJudER5H5nj-z-gA__original/img/eGfEPINMJA_0pAKWAYyjJaXmaQo=/0x0/filters:format(jpeg)/pic10078.jpg</image>
<name type="primary" sortindex="1" value="Sorcerer: The Game of Magical Conflict" />
<name type="alternate" sortindex="4" value="De Magier: een Spel van Magische Konflikten" />
<name type="alternate" sortindex="1" value="Sorcier: Le Jeu des Conflits Magiques" />
<description>Sorcerer is a fantasy wargame. Each player has an army consisting of Sorcerers, human infantry, and magical units (trolls, demons, and dragons). Sorcerers specialize in types of magic represented by 7 different colors. Sorcerer adds a twist to the old "combat differential" system (attack strength minus defense strength) by adding a circular system of combat bonuses based upon what colors of magic are attacking each other; Blue/Green/Yellow/Grey/Orange/Red/Purple with each color having a strong advantage over it's neighbor to the right (with Purple circling around to have power over Blue) and a disadvantage against it's neighbor to the left, with lessening combat bonuses the further away the color is from itself. Combat bonuses are also given based on map position as the hexes alternate colors of magic instead of representing physical terrain. Attacking from one's own color is good.
Several different scenarios are included in the rulebook that range from 1 to 6 players.
</description>
<yearpublished value="1975" />
<minplayers value="1" />
<maxplayers value="6" />
<poll name="suggested_numplayers" title="User Suggested Number of Players" totalvotes="2">
<results numplayers="1">
<result value="Best" numvotes="0" />
<result value="Recommended" numvotes="2" />
<result value="Not Recommended" numvotes="0" />
</results>
<results numplayers="2">
<result value="Best" numvotes="2" />
<result value="Recommended" numvotes="0" />
<result value="Not Recommended" numvotes="0" />
</results>
<results numplayers="3">
<result value="Best" numvotes="2" />
<result value="Recommended" numvotes="0" />
<result value="Not Recommended" numvotes="0" />
</results>
<results numplayers="4">
<result value="Best" numvotes="1" />
<result value="Recommended" numvotes="1" />
<result value="Not Recommended" numvotes="0" />
</results>
<results numplayers="5">
<result value="Best" numvotes="1" />
<result value="Recommended" numvotes="1" />
<result value="Not Recommended" numvotes="0" />
</results>
<results numplayers="6">
<result value="Best" numvotes="2" />
<result value="Recommended" numvotes="0" />
<result value="Not Recommended" numvotes="0" />
</results>
<results numplayers="6+">
<result value="Best" numvotes="0" />
<result value="Recommended" numvotes="1" />
<result value="Not Recommended" numvotes="0" />
</results>
</poll>
<poll-summary name="suggested_numplayers" title="User Suggested Number of Players">
<result name="bestwith" value="Best with 23, 6 players" />
<result name="recommmendedwith" value="Recommended with 16+ players" />
</poll-summary> <playingtime value="60" />
<minplaytime value="60" />
<maxplaytime value="60" />
<minage value="10" />
<poll name="suggested_playerage" title="User Suggested Player Age" totalvotes="2">
<results>
<result value="2" numvotes="0" />
<result value="3" numvotes="0" />
<result value="4" numvotes="0" />
<result value="5" numvotes="0" />
<result value="6" numvotes="0" />
<result value="8" numvotes="0" />
<result value="10" numvotes="0" />
<result value="12" numvotes="1" />
<result value="14" numvotes="0" />
<result value="16" numvotes="1" />
<result value="18" numvotes="0" />
<result value="21 and up" numvotes="0" />
</results>
</poll> <poll name="language_dependence" title="Language Dependence" totalvotes="2">
<results>
<result level="1" value="No necessary in-game text" numvotes="0" />
<result level="2" value="Some necessary text - easily memorized or small crib sheet" numvotes="0" />
<result level="3" value="Moderate in-game text - needs crib sheet or paste ups" numvotes="2" />
<result level="4" value="Extensive use of text - massive conversion needed to be playable" numvotes="0" />
<result level="5" value="Unplayable in another language" numvotes="0" />
</results>
</poll>
<link type="boardgamecategory" id="1010" value="Fantasy" />
<link type="boardgamecategory" id="1019" value="Wargame" />
<link type="boardgamemechanic" id="2001" value="Action Points" />
<link type="boardgamemechanic" id="2676" value="Grid Movement" />
<link type="boardgamemechanic" id="2026" value="Hexagon Grid" />
<link type="boardgamemechanic" id="2003" value="Rock-Paper-Scissors" />
<link type="boardgamemechanic" id="2070" value="Simulation" />
<link type="boardgamedesigner" id="1030" value="Redmond Aksel Simonsen" />
<link type="boardgameartist" id="16468" value="Larry Catalano" />
<link type="boardgameartist" id="20667" value="Gwen England" />
<link type="boardgameartist" id="5061" value="Manfred F. Milkuhn" />
<link type="boardgameartist" id="7661" value="Linda Mosca" />
<link type="boardgameartist" id="1030" value="Redmond Aksel Simonsen" />
<link type="boardgamepublisher" id="120" value="SPI (Simulations Publications, Inc.)" />
<versions><item type="boardgameversion" id="158145">
<thumbnail>https://cf.geekdo-images.com/NpauF7CJudER5H5nj-z-gA__small/img/Vo85InhIcQUg1myZBiHCL22uu8A=/fit-in/200x150/filters:strip_icc()/pic10078.jpg</thumbnail>
<image>https://cf.geekdo-images.com/NpauF7CJudER5H5nj-z-gA__original/img/eGfEPINMJA_0pAKWAYyjJaXmaQo=/0x0/filters:format(jpeg)/pic10078.jpg</image>
<canonicalname value="Sorcerer: The Game of Magical Conflict"></canonicalname>
<link type="boardgameversion" id="3585" value="Sorcerer: The Game of Magical Conflict" inbound="true"/>
<name type="primary" sortindex="1" value="SPI boxed edition" />
<link type="boardgamepublisher" id="120" value="SPI (Simulations Publications, Inc.)" />
<link type="boardgameartist" id="16468" value="Larry Catalano" />
<link type="boardgameartist" id="20667" value="Gwen England" />
<link type="boardgameartist" id="5061" value="Manfred F. Milkuhn" />
<link type="boardgameartist" id="7661" value="Linda Mosca" />
<link type="boardgameartist" id="1030" value="Redmond Aksel Simonsen" />
<yearpublished value="1975" />
<productcode value="" />
<width value="8.4" />
<length value="11.5" />
<depth value="2.1" />
<weight value="1" />
<link type="language" id="2184" value="English" />
</item>
<item type="boardgameversion" id="211154">
<thumbnail>https://cf.geekdo-images.com/FDBZTggGOpwHI8w-85bmtg__small/img/-gErHFk_f_I1VCtPATCfFnUXwzg=/fit-in/200x150/filters:strip_icc()/pic162215.jpg</thumbnail>
<image>https://cf.geekdo-images.com/FDBZTggGOpwHI8w-85bmtg__original/img/SmLq9Ek_eQQY22d9RR1KMVzvZrs=/0x0/filters:format(jpeg)/pic162215.jpg</image>
<canonicalname value="Sorcerer: The Game of Magical Conflict"></canonicalname>
<link type="boardgameversion" id="3585" value="Sorcerer: The Game of Magical Conflict" inbound="true"/>
<name type="primary" sortindex="1" value="SPI Designer&#039;s Edition" />
<link type="boardgamepublisher" id="120" value="SPI (Simulations Publications, Inc.)" />
<link type="boardgameartist" id="16468" value="Larry Catalano" />
<link type="boardgameartist" id="20667" value="Gwen England" />
<link type="boardgameartist" id="5061" value="Manfred F. Milkuhn" />
<link type="boardgameartist" id="7661" value="Linda Mosca" />
<link type="boardgameartist" id="1030" value="Redmond Aksel Simonsen" />
<yearpublished value="1975" />
<productcode value="" />
<width value="8.4" />
<length value="11.5" />
<depth value="2.1" />
<weight value="0" />
<link type="language" id="2184" value="English" />
</item>
<item type="boardgameversion" id="249246">
<thumbnail>https://cf.geekdo-images.com/6PzQJaC0yM57G1BqsIyWDA__small/img/dToTgfcoYlMXtY3WQIAdRoV92Cw=/fit-in/200x150/filters:strip_icc()/pic1220937.jpg</thumbnail>
<image>https://cf.geekdo-images.com/6PzQJaC0yM57G1BqsIyWDA__original/img/Aka747_k1gwm3uMO175vJwVe9NE=/0x0/filters:format(jpeg)/pic1220937.jpg</image>
<canonicalname value="Sorcerer: The Game of Magical Conflict"></canonicalname>
<link type="boardgameversion" id="3585" value="Sorcerer: The Game of Magical Conflict" inbound="true"/>
<name type="primary" sortindex="1" value="SPI flat-pack edition" />
<link type="boardgamepublisher" id="120" value="SPI (Simulations Publications, Inc.)" />
<yearpublished value="1975" />
<productcode value="" />
<width value="11.75" />
<length value="14.75" />
<depth value="1" />
<weight value="0" />
<link type="language" id="2184" value="English" />
</item>
<item type="boardgameversion" id="158147">
<thumbnail>https://cf.geekdo-images.com/5jjVx3HxQGYOedpJCO0M2w__small/img/A26lvJ3YzHDj6ORPsoDYs-E1Hb8=/fit-in/200x150/filters:strip_icc()/pic361569.jpg</thumbnail>
<image>https://cf.geekdo-images.com/5jjVx3HxQGYOedpJCO0M2w__original/img/FaQ0icl0S8FgMg6ZQxVpr5xNPgA=/0x0/filters:format(jpeg)/pic361569.jpg</image>
<canonicalname value="Sorcier: Le Jeu des Conflits Magiques"></canonicalname>
<link type="boardgameversion" id="3585" value="Sorcerer: The Game of Magical Conflict" inbound="true"/>
<name type="primary" sortindex="1" value="SPI French/Dutch edition" />
<name type="alternate" sortindex="4" value="De Magier: een Spel van Magische Konflikten" />
<link type="boardgamepublisher" id="120" value="SPI (Simulations Publications, Inc.)" />
<link type="boardgameartist" id="16468" value="Larry Catalano" />
<link type="boardgameartist" id="20667" value="Gwen England" />
<link type="boardgameartist" id="5061" value="Manfred F. Milkuhn" />
<link type="boardgameartist" id="7661" value="Linda Mosca" />
<link type="boardgameartist" id="1030" value="Redmond Aksel Simonsen" />
<yearpublished value="1975" />
<productcode value="" />
<width value="0" />
<length value="0" />
<depth value="0" />
<weight value="0" />
<link type="language" id="2183" value="Dutch" />
<link type="language" id="2187" value="French" />
</item>
<item type="boardgameversion" id="33889">
<thumbnail>https://cf.geekdo-images.com/FDBZTggGOpwHI8w-85bmtg__small/img/-gErHFk_f_I1VCtPATCfFnUXwzg=/fit-in/200x150/filters:strip_icc()/pic162215.jpg</thumbnail>
<image>https://cf.geekdo-images.com/FDBZTggGOpwHI8w-85bmtg__original/img/SmLq9Ek_eQQY22d9RR1KMVzvZrs=/0x0/filters:format(jpeg)/pic162215.jpg</image>
<canonicalname value="Sorcerer: The Game of Magical Conflict"></canonicalname>
<link type="boardgameversion" id="3585" value="Sorcerer: The Game of Magical Conflict" inbound="true"/>
<name type="primary" sortindex="1" value="UK flat box edition" />
<link type="boardgamepublisher" id="120" value="SPI (Simulations Publications, Inc.)" />
<link type="boardgameartist" id="16468" value="Larry Catalano" />
<link type="boardgameartist" id="20667" value="Gwen England" />
<link type="boardgameartist" id="5061" value="Manfred F. Milkuhn" />
<link type="boardgameartist" id="7661" value="Linda Mosca" />
<link type="boardgameartist" id="1030" value="Redmond Aksel Simonsen" />
<yearpublished value="1975" />
<productcode value="" />
<width value="11.8" />
<length value="15" />
<depth value="1" />
<weight value="0.99208" />
<link type="language" id="2184" value="English" />
</item>
</versions>
</item>
</items>