A build retrospective

Four games.
One browser.

What happened when photographs, rulebooks and physical components were translated into tested, responsive browser games.

This is not private chain-of-thought. It is a reconstruction from build logs, source code, tests, screenshots and release history: the discoveries that changed the implementation, and the fixes that survived.

THE BLOODY INN
DUEL FOR MIDDLE-EARTH
GRUNTZ
THE GUILD OFMERCHANT EXPLORERS
Across all four builds

The accumulated experiment

Each project inherited ideas from the previous one. Tests, responsive layouts, AI tiers, private art handling, installability and safe publishing became a reusable production line.

36released versions
410final passing tests
~387kvisible transcript-token proxy
4single-file browser games
TGOME
23
LOTR Duel
9
Gruntz
2
Bloody Inn
2
Original illustration: the map transcription problem became a reusable coordinate-and-overlay workflow.
The Guild of Merchant Explorers

The laboratory

23 revisions249 tests11d 19h wall-clock~91k token proxy

TGOME grew from one map into a four-map, installable game. Its long revision history established many features reused by the later builds.

The map had a hex that did not exist

Angled photos introduced transcription errors, including a phantom Cnidaria hex at 18,12. Coordinate overlays plus physical-board checks corrected Avenia, Kazan and Cnidaria. Resolution: map data became editable and independently testable.

Twenty-eight cards wanted one engine, not 28 exceptions

Investigate cards looked bespoke, but their effects decomposed into phased actions. Resolution: a generic action pipeline replaced card-by-card control flow.

Two identical AI scores looked like state corruption

Back-to-back 99-point games were suspicious. Seeded runs produced scores from 80 to 145, showing coincidence rather than shared state. Resolution: deterministic seeds became a debugging instrument.

Undo met hidden information

Ordinary undo becomes cheating after a treasure is revealed. Resolution: ruins show a lock and an explicit warning before the irreversible draw.

744encoded map hexes
1–4supported seats
<1stypical Hard turn
Original illustration: a 7×5 ground grid crossed by 13 air paths.
Gruntz

The sprint

2 revisions64 tests1h 07m implementation~12k token proxy

The smallest rulebook did not mean the simplest board. Air paths crossing ground cells made geometry as important as combat logic.

The player aid and rulebook disagreed

A player aid suggested Truck movement 5; the rulebook said maximum 3. Resolution: the authoritative rulebook value won and was pinned by a test.

The board needed an editor before it needed polish

Diagonal and corner flight paths were hard to infer confidently from photos. Resolution: text-based map data plus ?edit and ?debug overlays made uncertainty visible.

A phone sidebar crushed the battlefield

Portrait fold widths still triggered a desktop split layout. Resolution: the phone layout threshold expanded through 1100px portrait width.

Animation vanished during re-render

State updates replaced DOM nodes carrying active effects. Resolution: animation events and render timing gained dedicated test coverage in v0.2.

7×5ground grid
13flight paths
775msslowest measured AI turn
Original illustration: a card pyramid over a seven-region network.
The Lord of the Rings: Duel for Middle-earth

The forensic build

9 revisions44 tests~5h active windows~236k token proxy

LOTR demanded the most reconstruction: image-only documents, perspective-heavy card photography, chain symbols and a hidden-information expansion.

The right first move was to stop

The project folder initially had no source material. Rather than invent components from memory, work paused for the scans and photos. Resolution: uncertainty was made explicit before implementation.

Perspective broke automatic card cropping

Cards at different depths did not share one reliable rectangle. Resolution: manual bounding boxes, edge snapping and perspective correction produced all 69 crops.

Duplicate-looking retakes were identified by rules

Artwork alone could not distinguish C3-02, C3-11 and C3-12. Resolution: printed chain symbols and skill costs became the fingerprints.

A patch version exposed a version-test bug

The comparator treated 0.8.1 as equal to 0.8. Resolution: semantic comparison was extended to the patch component.

69chapter cards
14Allies
243msaverage Hard decision
Original illustration: eight rooms wrapped around the serpentine wealth track.
The Bloody Inn

The mature pipeline

2 revisions53 tests1h 50m wall-clock~48k token proxy

The newest build reused lessons from all three predecessors, then added a complete modular expansion in the same session.

The backs were easier than expected—and one was missing

Front and back photos used matching, non-mirrored grid positions, enabling deterministic pairing. The Fire Eater back was absent but shares the same trailer back as the Juggler. Resolution: reuse the physically identical back.

The browser was slow; the engine was not

Headless self-play appeared to hang while the pure engine completed games in about two seconds. Infinite CSS animation kept virtual time busy. Resolution: shorten browser test budgets and isolate engine performance.

A state mismatch was only bookkeeping

Click-driven UI tests disagreed with direct engine play on one UI-only done flag. Resolution: canonical state comparison excludes presentation bookkeeping.

Full art without publishing the source art

Local builds embed the personal photos; public builds use drawn cards. Resolution: 126 assets are packed into AES-256-GCM-encrypted art.bin, unlocked only by the private fragment key.

126encrypted art assets
53/53rule tests
860+UI-test clicks
Method

What “tokens” and “cost” mean here

The transcripts do not store Cursor billing usage. The token figures are a reproducible text proxy: all visible user and assistant text characters divided by four. They exclude tool results, system context, repeated context and hidden processing, so they are not actual consumption.

All four builds used Claude Opus 5.5. Equivalent cost applies Anthropic’s current Claude Opus 5.5 standard output rate of US$20 per million tokens to that visible-text proxy. The standard input rate is US$4 per million tokens, but the true input/output split is not retained in the transcripts. This is therefore an illustrative output-cost comparison—not a Cursor invoice or a full API-run estimate.

GameToken proxyOutput-cost proxy
TGOME91,022US$1.82
Gruntz12,296US$0.25
LOTR Duel235,587US$4.71
The Bloody Inn47,942US$0.96
Total386,847US$7.74
The recurring lesson

Make uncertainty visible.

The strongest fixes were not clever algorithms. They were overlays, seeded runs, canonical comparisons, strict publishers and tests that made a physical ambiguity impossible to ignore.