← guide contents
Baixada · Study · Field guideAppendices · Abstractions, numbers, and terms
Appendix B

The solutions, by the numbers

Part I explains what the solve is; this appendix is its ledger. Every statistic the project has measured about the shipped solutions — how big the game is, how much of it is solved, how tightly each spot is certified, how alike neighboring solutions are, how crisp optimal play is, and what it took to compute — collected on one page. Each figure is a dated entry in the project's benchmark log.

§ 1

The game, counted

One subgame per (score, dealer assignment, turn-up class): 1,296 in all, each spanning 140,118 distinct deals once the lossless equivalences collapse the raw card combinatorics. Within a subgame the tree grows with how much of the raise ladder is still alive.

Except during the hand of eleven, the engine still permits the ordinary raise ladder. The solver removes a higher re-raise only once lower score + current stake ≥ 12: at that point the current hand already decides the match for either winner, so escalating adds no prize and no rational fold leverage. This is value-exact pruning, not a claim that those buttons are illegal. The diagonal endpoints are compact anchors: 0 × 0 → 2 × 2 also covers unequal scores such as 2 × 10 and the mirrored 10 × 2. The table shows what the solver keeps with turn-up 4, for one dealer orientation, across every abstract deal.

subgame tierscore interactionsolver keepstree nodesinformation sets
Hand of eleven0 × 11 → 11 × 11—49.6M5.61M
Truco only9 × 9 → 10 × 101 → 3352.3M39.5M
Through six6 × 6 → 8 × 81 → 3 → 61.11B129.1M
Through nine3 × 3 → 5 × 51 → 3 → 6 → 92.87B341.7M
Full ladder0 × 0 → 2 × 21 → 3 → 6 → 9 → 126.70B812.9M

Exact turn-up-4 counts; other turn-up classes have not all been counted at every tier.

Those are the raw trees. The production tree also removes provably irrelevant branches — score-aware raise pruning plus proof-scoped prunes — cutting the deepest tier from 6.70B to 3.80B nodes (756.8M information sets) with no change in exactness. The shipped charts live in the two smallest tiers: an eleven root is a 49.6M-node tree, and a truco-band spot like 10×10 is a ~200M-node tree over 39.5M information sets.

§ 2

What is actually solved

Exact tabular coverage · July 2026216 / 1,296
1,080 subgames remain outside the exact tabular solution

Exact strategies exist for 216 of 1,296 subgames: all 23 role-ordered score states where the leader or the dealer is on 11, across all nine turn-up classes (207), plus 10 × 10 across all nine classes (9). The other 1,080 have not been solved as a full tabular grid.

The release behind that coverage stores 225 artifacts — one per (score, turn-up, dealer seat): every 11 × N score in both dealer orientations, plus 10 × 10 in one. The two counts differ by exactly the symmetric 11 × 11, whose two orientations are the same game with the seats renamed — nine artifacts covering nine subgames counted once. The Study Lab itself bundles a 15-chart subset of the release, all with turn-up 4.

§ 3

What ships, and how it's certified

The current Study release carries 225 solved spots — the per-(score, turn-up, dealer) artifacts of the coverage above. Each spot ships with an exact self-certification: a genuine best response is computed against the exported strategy from both seats, and the average of the two gains is the spot's exploitability ε, on the scale where ε 0.01 ≈ 0.5 percentage points of match-win chance. By how the spot was produced:

How the spot was solvedSpotsRaw ε (median / max)Purified ε (median / max)Per-node BR gap, pp (median / max)
Transferred from a neighbor, then warm-refined1920.00124 / 0.006270.00046 / 0.003950.014 / 0.098
Refined and exported directly50.00306 / 0.004240.00037 / 0.001480.029 / 0.166
Solved natively (transfer rejected)280.00001 / 0.016850.00001 / 0.016832.551 / 12.591

Transfers had to clear hard gates — raw ε ≤ 0.01, purified ε ≤ 0.004, weighted mean per-node best-response gap ≤ 0.25 pp — or the worker discarded the candidate and solved the spot natively. Native solves converge much tighter globally (median ε 0.00001), but 28 of them carry broader per-node profiles — which is exactly what the lab's per-cell ≈ badges exist to surface.

§ 4

Why an off-path mix gets noisy

Before the BR table, the lab's warning came from two diagnostics. They are kept here because they explain how a corner went bad — they describe training coverage, not quality.

Lself(h)=50∑aσ(a∣h)(max⁡a′q(a′∣h)−q(a∣h))L_{\mathrm{self}}(h) = 50\sum_a \sigma(a\mid h)\bigl(\max_{a'}q(a'\mid h)-q(a\mid h)\bigr)
σ(a∣h)\sigma(a\mid h)
how often the solve takes action a holding h
q(a∣h)q(a\mid h)
the solve’s equilibrium value after action a at holding h
5050
converts the solver’s −1…1 value scale into match-win percentage points

Self-loss asks whether the mix is close to its own best action under the solve's q values — an alarm, not an adversarial guarantee.

ρown(h)=∏d ∈ ℓownσ(ad∣h)\rho_{\mathrm{own}}(h) = \prod_{d\,\in\,\ell_{\mathrm{own}}}\sigma(a_d\mid h)
ℓown\ell_{\mathrm{own}}
the acting player’s earlier decisions on the line
ρown\rho_{\mathrm{own}}
how often that player’s own exported strategy walks this holding to the node

Near-zero own reach means the averaging almost never collected experience here; the legacy alarm uses ε = 0.001.

The cause is concrete: once a non-owner action's probability reaches zero, CFR stops descending into that branch — correct for a truly dominated action, but it freezes whatever early random values sit below. Low own reach records that history; the BR gap says whether the result is actually exploitable.

§ 5

How alike neighboring solutions are

Solve two neighboring subgames independently to convergence and compare them row by row. Two averages tell different stories: over all table rows, and weighted by how often play actually reaches each row. TV is total-variation distance — the share of probability mass that would have to move to turn one row's mix into the other's (0 = identical).

Neighbors comparedMean TV, all rowsMean TV, by playBest action agrees, rows…by play
Score: 11×10 vs 11×9, same turn-up0.0170.12996.0%85.9%
Turn-up: 11×10, tc0 vs tc10.0170.02396.2%97.2%
Turn-up: 10×10, tc0 vs tc10.0130.02498.0%97.2%

The asymmetry is the finding. Changing the turn-up class barely moves play anywhere: on-path distance stays near 0.02 and the root decision shifts by 0.005. Changing the score concentrates its whole effect exactly where play goes — the root accept/fold row moves by 0.196, depths 1–3 by 0.12–0.18, and only about half of play mass sits on effectively identical rows. A small, shallow, score-sensitive core carries roughly half of the played game.

§ 6

How crisp optimal play is

Call a row pure when its biggest action takes more than 99% of the mix. Mixing dominates the tables — but not the played game:

SolutionPure, share of rowsPure, share of playMean top-action weight (rows / play)
11×10 tc0 (5.6M rows)20.4%56.1%0.609 / 0.873
10×10 tc0 (39.5M rows)26.8%52.4%0.655 / 0.836

Half-plus of actual play sits at (near-)pure decisions — the same rows that agree at 99.99%+ across neighboring solutions. The complement is just as real: roughly 45% of play mass is genuinely mixed, the part of optimal truco that resists crisp human rules. Tighten “pure” to 99.9% and on-path purity drops to 50.7% (11×10) and 39.3% (10×10) — crispness softens with the cutoff.

§ 7

What it took to compute

The solver is synchronous CFR+, adopted after measuring a ~10× cut in iteration count at the same certified ε. The 225-spot release was built by four preemptible cloud workers in 3–4.5 hours each — transferring a neighbor's solution wherever the certificate allowed (85% of spots) and re-solving natively where it didn't — for on the order of $5 of compute. A truco-band warm solve now peaks at ~16 GiB and ~18 minutes; a chain of memory work brought the same job down from a 75-GiB machine class.

Certifying is cheap next to solving: one exact whole-game best response of the deepest tier — the full raise ladder from 0×0, 14.6 billion node visits — fits in 8.1 GiB and under three hours. The frontier is the deep solve itself: merely building the 0×0 tree in memory needs over 150 GiB, which is why the lattice below the shipped bands is approached bottom-up, subgame by subgame.