The problem
Competitive Commander (cEDH) players argue about which cards make a deck faster, but rarely with numbers that have stated limits. A simulator that plays one deck alone, often called goldfishing, can measure how quickly a declared combo state comes together. But a single fast number is easily misread as deck quality. This project measures one thing for one deck, Kinnan, Bonder Prodigy: the turn a declared board state is assembled with nobody interfering. It also reports which cards the model cannot see.
Contribution and AI assistance
The project work spans an isolated C++ simulation core, authored strategy mechanics, a read-only data exporter, a versioned service boundary and reproducibility checks. Dylan owns the repository. The reviewed records do not individually attribute those implementations or design decisions to him, so manual authorship is not claimed.
How AI contributed
The cloud-alignment plan (work items W1–W9, 2026-09-04) is written as instructions for a coding agent, and the HTTP service, Linux image and CI changes followed it. Earlier phases have no file-level attribution, and the tools used are not recorded.
Two consequential decisions
Decision 1
Name the metric for what it measures
The result field is goldfish_turns_to_assembly. Comparison columns describe assembly differences, and patterns are named for board states rather than wins. The documented Kinnan report groups 31 inert cards by reason and discloses a known misclassification. The useful result is accompanied by the modeling gaps needed to interpret it; an apparently precise number is not presented as a general card ranking.
Decision 2
Refuse rather than fall back
A request must name an installed strategy pack and a matching commander. The simulator recomputes the deck hash itself and rejects a mismatch, and an unsupported pack is refused with a distinct error code. Nothing falls back to Kinnan behavior. This keeps stored results trustworthy, but the service supports one strategy until someone authors another pack.
Verification
- Continuous integration runs the isolation checks and the AddressSanitizer test configuration on both macOS and Ubuntu. A 2,000-game run with a fixed seed produced the same digest on both platforms (recorded 2026-09-04).
- On a GitHub Actions Ubuntu runner (workflow run 33906314023), 20,000 games took 0.68 s on two threads. A full sweep removing each of 98 cards in turn, at 30,000 games each, took 297.61 s.
- The deck primer's 20 worked example hands are still unscored, because they were written for a different version of the list than the one modeled. No agreement count is claimed.
Outcome and progression
1.41% / 20.86% / 76.82%
Chance the Kinnan combo state is assembled by turn 3 / 6 / 12
Historical post-R3 model record in SIM_PLAN §16.11: 60,000 games using list A, a September 1 decklist snapshot. These numbers belong to that model revision, not earlier ablation experiments or current deployed behavior. Assembly while playing alone is not win rate or deck strength.
0.68 s / 297.61 s
Interactive run versus full leave-one-out sweep
Recorded GitHub Actions Ubuntu workload on two threads, run 33906314023: 20,000 games for the interactive run; 98 ablations at 30,000 games each for the sweep. Different workloads, not a speedup comparison. This motivated separate interactive and batch deployments; it is not a concurrent-service latency guarantee.
Milestones
- 2026-09-01Repository started; card data exported through the ingest pipeline's read-only mtg_v1 schema.
- 2026-09-02Phases 0–7 landed: Kinnan's card-digging ability executed, the full sweep and statistical intervals in place.
- 2026-09-04Cloud alignment: a stateless HTTP service, a Linux image, and separate deployments for interactive runs and sweeps.
- 2026-09-12Authenticated resource-probe interface added for the generator's land-color experiment.
What I would measure next
Run the concurrency load test already specified in the hosting cost model. Record latency percentiles for 20,000-game requests at 2 and 4 vCPUs before making any claim about interactive capacity.
Explore the evidence
- Open the repository README and read 'What this measures, and what it does not'.
- Find the 'WHAT THE MODEL CANNOT SEE' table of 31 inert cards and the note on Hullbreaker Horror, which was left misclassified on purpose and is printed in every run.
- Read 'Sweeps are a different workload and a different machine' for the measured timings.
- Open the integration handoff and read 'Required presentation warnings'.
Evidence and further reading