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,473 @@
<items><item type="boardgame" id="177"><name type="primary" value="game"/><versions><item type="boardgameversion" id="177001"><name type="primary" value="Avalon Hill English edition"/><yearpublished value="1991"/><link type="boardgamepublisher" id="1" value="The Avalon Hill Game Co"/><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="boardgameexpansion" id="177">
<thumbnail>https://cf.geekdo-images.com/9ROB7NpxefRUmpR9UroQ8w__small/img/XDH667tVl2KjQ6szNjT7ceEmh5E=/fit-in/200x150/filters:strip_icc()/pic87459.jpg</thumbnail>
<image>https://cf.geekdo-images.com/9ROB7NpxefRUmpR9UroQ8w__original/img/--qlhvNNj8zF9cWLlihdTg0jzmE=/0x0/filters:format(jpeg)/pic87459.jpg</image>
<name type="primary" sortindex="1" value="Advanced Civilization" />
<description>The use of the word "Advanced" to describe this expansion followed existing Avalon Hill tradition. "Enhanced" is likely more appropriate. Playing with this expansion is no more difficult than playing the base Civilization game. This expansion reworks a few of the original rules, includes a reworked version of Civilization: Expansion Trade Cards Set and adds more civilization advancements to the technology tree.
Included are more civilization advancements (both quantity and type), which give the players new options for advancement, as well as a slightly restructured commodity trading round, which has new resources and disasters to be traded. The most significant aspect of the game is a restructuring of the advancement/victory conditions, which remove the limits on advancement cards. Some claim this makes the strategies more homogeneous while others claim the reverse is true.
</description>
<yearpublished value="1991" />
<minplayers value="2" />
<maxplayers value="8" />
<poll name="suggested_numplayers" title="User Suggested Number of Players" totalvotes="122">
<results numplayers="1">
<result value="Best" numvotes="0" />
<result value="Recommended" numvotes="0" />
<result value="Not Recommended" numvotes="86" />
</results>
<results numplayers="2">
<result value="Best" numvotes="0" />
<result value="Recommended" numvotes="6" />
<result value="Not Recommended" numvotes="85" />
</results>
<results numplayers="3">
<result value="Best" numvotes="0" />
<result value="Recommended" numvotes="16" />
<result value="Not Recommended" numvotes="73" />
</results>
<results numplayers="4">
<result value="Best" numvotes="6" />
<result value="Recommended" numvotes="52" />
<result value="Not Recommended" numvotes="36" />
</results>
<results numplayers="5">
<result value="Best" numvotes="20" />
<result value="Recommended" numvotes="64" />
<result value="Not Recommended" numvotes="15" />
</results>
<results numplayers="6">
<result value="Best" numvotes="56" />
<result value="Recommended" numvotes="48" />
<result value="Not Recommended" numvotes="1" />
</results>
<results numplayers="7">
<result value="Best" numvotes="83" />
<result value="Recommended" numvotes="30" />
<result value="Not Recommended" numvotes="1" />
</results>
<results numplayers="8">
<result value="Best" numvotes="62" />
<result value="Recommended" numvotes="35" />
<result value="Not Recommended" numvotes="8" />
</results>
<results numplayers="8+">
<result value="Best" numvotes="3" />
<result value="Recommended" numvotes="8" />
<result value="Not Recommended" numvotes="43" />
</results>
</poll>
<poll-summary name="suggested_numplayers" title="User Suggested Number of Players">
<result name="bestwith" value="Best with 68 players" />
<result name="recommmendedwith" value="Recommended with 48 players" />
</poll-summary> <playingtime value="480" />
<minplaytime value="360" />
<maxplaytime value="480" />
<minage value="12" />
<poll name="suggested_playerage" title="User Suggested Player Age" totalvotes="38">
<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="2" />
<result value="10" numvotes="2" />
<result value="12" numvotes="16" />
<result value="14" numvotes="11" />
<result value="16" numvotes="6" />
<result value="18" numvotes="1" />
<result value="21 and up" numvotes="0" />
</results>
</poll> <poll name="language_dependence" title="Language Dependence" totalvotes="36">
<results>
<result level="1" value="No necessary in-game text" numvotes="2" />
<result level="2" value="Some necessary text - easily memorized or small crib sheet" numvotes="21" />
<result level="3" value="Moderate in-game text - needs crib sheet or paste ups" numvotes="13" />
<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="1050" value="Ancient" />
<link type="boardgamecategory" id="1015" value="Civilization" />
<link type="boardgamecategory" id="1021" value="Economic" />
<link type="boardgamecategory" id="1042" value="Expansion for Base-game" />
<link type="boardgamecategory" id="1026" value="Negotiation" />
<link type="boardgamemechanic" id="2046" value="Area Movement" />
<link type="boardgamemechanic" id="2013" value="Commodity Speculation" />
<link type="boardgamemechanic" id="2004" value="Set Collection" />
<link type="boardgamemechanic" id="2008" value="Trading" />
<link type="boardgamefamily" id="72535" value="Ancient: Egypt" />
<link type="boardgamefamily" id="64960" value="Components: Map (Continental / National scale)" />
<link type="boardgamefamily" id="81575" value="Digital Implementations: VASSAL" />
<link type="boardgamefamily" id="22642" value="Game: Civilization" />
<link type="boardgamefamily" id="61990" value="Players: Expansions Changing Player Count" />
<link type="boardgameexpansion" id="16109" value="Civilization Eastern Expansion Map" />
<link type="boardgameexpansion" id="79843" value="Civilization: The Expansion Project" />
<link type="boardgameexpansion" id="2058" value="Civilization: West Extension Map" />
<link type="boardgameexpansion" id="71" value="Civilization" inbound="true"/>
<link type="boardgameintegration" id="143347" value="Civilization Central America" />
<link type="boardgameintegration" id="131240" value="Civilization: The New World" />
<link type="boardgameimplementation" id="184424" value="Mega Civilization" />
<link type="boardgamedesigner" id="10035" value="Lauren Banerd" />
<link type="boardgamedesigner" id="10036" value="Jim Eliason" />
<link type="boardgamedesigner" id="10037" value="Jeff Groteboer" />
<link type="boardgamedesigner" id="361" value="Bruce Harper" />
<link type="boardgamedesigner" id="10038" value="Eric Hunter" />
<link type="boardgamedesigner" id="10039" value="Steven Padgett" />
<link type="boardgamedesigner" id="10040" value="Gary Rapanos" />
<link type="boardgamedesigner" id="10041" value="Michael Roos" />
<link type="boardgamedesigner" id="10042" value="Jennifer Schlickbernd" />
<link type="boardgamedesigner" id="10043" value="Jeff Suchard" />
<link type="boardgameartist" id="71" value="Rodger B. MacGowan" />
<link type="boardgamepublisher" id="5" value="The Avalon Hill Game Co" />
<versions><item type="boardgameversion" id="24972">
<thumbnail>https://cf.geekdo-images.com/9ROB7NpxefRUmpR9UroQ8w__small/img/XDH667tVl2KjQ6szNjT7ceEmh5E=/fit-in/200x150/filters:strip_icc()/pic87459.jpg</thumbnail>
<image>https://cf.geekdo-images.com/9ROB7NpxefRUmpR9UroQ8w__original/img/--qlhvNNj8zF9cWLlihdTg0jzmE=/0x0/filters:format(jpeg)/pic87459.jpg</image>
<canonicalname value="Advanced Civilization"></canonicalname>
<link type="boardgameversion" id="177" value="Advanced Civilization" inbound="true"/>
<name type="primary" sortindex="1" value="English edition" />
<link type="boardgamepublisher" id="5" value="The Avalon Hill Game Co" />
<link type="boardgameartist" id="71" value="Rodger B. MacGowan" />
<yearpublished value="1991" />
<productcode value="8372" />
<width value="8.4" />
<length value="11.5" />
<depth value="2.1" />
<weight value="1.9" />
<link type="language" id="2184" value="English" />
</item>
</versions>
</item>
</items>