NOTES — 04 · PYRRHUS & CO.

When the winning move was to not play

An auction game about the winner's curse had a dominant strategy: bid the opening price on everything, think about nothing, and finish first more often than a player who actually plays. Closing that hole meant giving the counterfeits a disguise — and then discovering that the disguise had broken the price signal for everyone.

ENGLISH ONLY · ~13 MIN · 6,000 GAMES × 2 SEEDS PER FIGURE

01The house always wins, and that has to be true

Twenty rounds of sealed first-price bidding against three rivals. Nobody knows what a lot is really worth — you get a public estimate, and for £10M you can buy a precise appraisal that narrows it. Three times a game the house opens a window and offers to buy a lot back at a price of its own choosing. At the close, the house reveals what it took.

That last line is the signature of the whole design, and the house's cut is built from four separate sources that are never merged:

house cut = Σ final balances × 0.15 seat fee + Σ appraisal fees paid £10M per appraisal + Σ (true value − buyback price) can be negative + Σ unsold lots nobody bid

The negative line is deliberate and it is never netted away. A house that admits losing money on one row while taking the table overall is the Pyrrhic joke the game is named for. The seat fee is also not accumulated during play — it is computed at the close from the final balances, precisely so that an automated check can multiply the settlement table's balance column by 0.15 and confirm the figure independently.

02The bug: the best strategy was to not play

Balance is measured by pitting scripted strategies against the bots over thousands of games. A four-player auction has a random baseline of 25%, so a strategy that finishes first more often than that is exploiting something.

One strategy was bid the opening price on everything. No appraisals, no reading, no judgement — put in the minimum on every lot and see what nobody else wanted. On the second-hardest tier it won 34.1% of games.

AND I MISREAD MY OWN NUMBER

The previous round of notes recorded 34.1% as evidence that the exploit was weaker than normal play and therefore closed. It was not. The baseline is 25%, so 34.1% is 9 points above chance. I had compared it against the wrong thing, wrote down that the hole was fixed, and moved on.

The correction is the reason the next version happened at all. A number is not a result until you know what it should be compared with.

A game whose entire subject is the discipline of not overpaying was rewarding the player who declined to participate in it. Worse, it made the £10M appraisal — the central mechanic — something no rational player would ever buy.

03Why: the counterfeit wore its own price tag

35% of lots are counterfeit, and a counterfeit is worth about £15M no matter what it depicts. The problem was in how its public estimate was generated: from the same true value. So a fake arrived at auction wearing a £15M window, and a genuine piece wore a window in the hundreds of millions.

Telling them apart therefore cost nothing. Read the estimate, ignore anything small, done. And once fakes are free to identify, the information economy has no reason to exist: the appraisal is a fee with no product, the rivals waste money on it, and the player who spends nothing and bids the floor accumulates whatever falls through.

The exploit was not a tuning error in the bots. It was a leak in the fiction — the object was announcing what it was.

04Dressing the counterfeits

55% of the fakes now draw their public estimate from a shadow value: what the piece would have been worth had it been genuine. The true value stays at £15M. The public window says £400M.

fakes among all lots 35% disguised among fakes 55%19% of every lot on the block is a £15M object in a genuine window fooling the appraisal too 12% of the disguised → 2.3% of all lots

Roughly one lot in five now cannot be judged from the estimate at all. The precise appraisal catches almost all of them — a public window of £216M–£866M with a precise band of £6M–£11M underneath it is an answer, and the screen prints a one-line verdict rather than making you infer it.

And 2.3% of lots defeat the appraisal as well: the precise band forms around the shadow value and the verdict reads genuine. I want to be careful about how that is described, because it is not a bug and it is not noise injected to make the tool unreliable. The appraisal is not wrong; the object deceived the appraisal. The instrument reports honestly on a forgery good enough to beat it. Widening the band instead would have been a lie told by the game about its own tool.

05The fix broke the price signal, which is the point of the game

Dressing the fakes had a consequence I did not anticipate. The public estimate had been an unbiased estimator of the true value. It is not any more: a fifth of the lots now carry an estimate drawn from a value they do not have, so the average lot is worth less than its window says. A bidder who trusts the window and bids accordingly gets hit — and the mechanism is exactly the one the game is about.

This is the winner's curse in its textbook form, so I re-derived it independently while writing this page rather than asserting it. Four bidders, a common value, each seeing a noisy private signal of it. If everyone bids their signal, what is the winner actually holding?

Signal noise σ2 bidders4 bidders7 bidders
0.150.9260.8620.820
0.300.8700.7500.678
0.500.8190.6340.533
0.700.7930.5460.425
Expected true value as a fraction of the winning bidder's own signal, 400,000 simulated auctions per cell. Winning is itself evidence that you were the most optimistic person in the room, and the more rivals there are, the worse that news is.

At four bidders and moderate noise a bidder must shade to about three quarters of what they think a lot is worth simply to break even. The bots that have not bought an appraisal now multiply their perceived value by 0.68.

That constant was arrived at by tuning, so I checked afterwards where it sits. Sweeping the noise level for four bidders, break-even shading passes through 0.688 at σ = 0.40 and 0.677 at σ = 0.42. 0.68 is the break-even discount for a four-player auction with about 41% signal noise — a plausible figure for the spread the disguises introduce. A number reached by trial and error landing on the value theory would have chosen is a decent sign that the model underneath is right.

Remove the shading and the opening-price strategy immediately wins for free again. The bots need the discipline the game asks of the player, for the same reason.

Two smaller repairs in the same pass

  • The appraisal fee had no sense of scale. £10M is nearly free against an £800M lot and expensive against a £20M one, and the bots ignored that. Weighting their appraisal probability by clamp((value/250)0.5, 0.5, 1.8) dropped the opening-price exploit from 21% to 18% on its own — without it, nobody checks the big disguised fakes and everyone burns their budget on them.
  • The cash reserve was confiscation, not a floor. The previous version locked 13% of every bot's budget permanently, including in the final round. Splitting it into a permanent 2% plus a pace-proportional part that releases as the auction runs down leaves £20M locked at round 20 instead of a fifth of the budget, and it hangs off the bot's personality so the tiers stay distinct.

06The house does not get fooled

The house's buyback offer is a fraction of a geometric mean of the appraisals — and I made it read from the true value, never the disguise. Without that, there is a clean arbitrage:

buy an appraisal → learn the lot is a disguised fake snipe it at the opening price (nobody else wants it) sell it back to a house that prices off the genuine-looking window → free money, every single time

You can still hand a disguised fake to the house; you simply get £15M for it, not £150M. The alternative — letting the house be fooled too — is more fun for about ten minutes and then the game becomes a house-hunting game, and the closing, where the house reveals what it took from everyone, stops landing.

A DECISION, NOT A DERIVATION

This one was not measured into existence and it was not asked about. It is a judgement that the game's signature outranks a mechanic that would have been amusing, and it is recorded as such rather than dressed up as a finding.

07The instrument was broken, not the game

Mid-way through the rebalance the test bench reported a new catastrophe: an oracle strategy — one that knows every true value and bids the minimum — was winning 67% of games. That is a game-ending number, and I nearly rebuilt the economy around it.

It was false. The real figure is 18.8%, below normal play's 24.0%. The bench was lying, and it was lying because it held its own copies of three engine rules:

What the bench had copiedWhat it did
The bot cash floorUsed its own formula, defaulting to zero, so bench bots never received the new pace-proportional reserve. They burned their budgets early and handed the late lots to the oracle — 3.7 lots per game in the bench, 0.59 through the engine
The appraisal probability, twiceOmitted the size weighting, so an entire sweep column was byte-identical across every setting including the one that switched the feature off
The reserve parameterSimply never passed through to the engine
The same failure had happened once before with lot generation. The recurring bug class in this codebase is duplication: a bench holding a copy of an engine rule diverges silently on the day the engine changes, and reports the difference as a discovery about the game.

All three now delegate to the engine. The diagnostic that settled it does not just report the oracle's win rate — it takes a census of why the bots failed to bid:

oracle wins 0.59 lots/game average paid £153M average true value £1,077M → 7.0× bots' average cash at the moment of loss £85M why no bot bid out of cash 83.0% · below bargain threshold 9.1% · lost the roll 7.8%

Eighty-three percent is not a strategic finding, it is a liquidity artefact, and it was visible only because the harness was asked to explain itself rather than to produce a number. A build-parity check now cuts the constants and generation code straight out of the shipped page and replays them against the engine on a shared seed — 14 constants and 20 lots across 10 fields, all identical. Balance tuned in an engine that the shipped page does not reproduce is worth nothing.

08Where it landed, and what stayed open on purpose

TierNormal playOpening price onlyGap
Easy36.3%66.4%+30.1
Normal32.7%56.8%+24.1
Hard24.0%18.4%−5.7
Brutal19.7%8.9%−10.8
6,000 games × 2 seeds. Random baseline 25%. On Hard the exploit went from 34.1% to 18.4% — below chance, and below normal play. Both oracle strategies also finish under normal play now: 18.8% and 14.2%.

Easy and Normal are left wide open, and that is the design. Closing them means making the reckless and eager personalities play well, at which point the beginner room is not a beginner room. A trick that works while you are learning and quietly stops working as you climb is the correct shape for a difficulty ladder; a trick that works everywhere is a bug.

Brutal sits at 19.7% against a target of 18.3% and will not go lower. Six combinations of the two remaining knobs all made the total error worse — from 5.3 to 10.8 — while Brutal stayed pinned between 19.7% and 20.4%. That is not a tuning failure, it is the variance floor: in a four-way auction some share of first places simply arrives by luck, and no amount of making the bots stronger takes that share away. I recorded it as a floor and stopped, which is a better outcome than a seventh sweep.

To stop the closed hole from quietly reopening, the whole strategy table is pinned in a baseline file with three assertions that must hold: tier win rates decreasing monotonically, and the opening-price exploit staying below normal play on both top tiers.

09Two things only a screenshot could catch

The bidding screen was leaking who had bought an appraisal. While you were still deciding your bid, the seat panel showed each rival's balance and appraisal count — and a balance £10M lower with the counter at 1 says plainly that this rival paid to look closer at this lot, before you have committed. The rules reveal that only after the hammer falls, and an earlier measurement had already established why: pre-revealing it inverts the value of appraising entirely, with the appraiser's win rate falling from 26.6% to 18.0% and the non-appraiser's rising from 23.3% to 35.0%.

Every automated assertion passed while this was happening. It was found by looking at a screenshot. The fix snapshots balances and counters immediately before the bots' pre-bid appraisal loop and renders the bidding screen from that snapshot, with your own row always live because your own information is yours. Then I reverse-tested it — reverting the call site in the built file — and confirmed the new checker flagged exactly the 13 places it should. That assertion now runs on every playthrough.

And a smaller one about honesty in the interface. The appraisal verdict is a filled chip, green for genuine and black for fake. It was first drawn with a strikethrough, which had to be abandoned: a struck-out price reads as cancelled, not as counterfeit. The class also had to be renamed after colliding with the round-result banner, which rendered the verdict as a bordered box — making a piece of information look like a button you could press.

Try it. Twenty lots, three rivals, and a house that is happy to buy anything back at a price of its own choosing.

Enter Pyrrhus & Co. →