Pricing trades by who you are trading with
The decision that changed
Before, the search took an open offer whenever the accepted continuation beat waiting by the trade margin, and proposed one- or two-for-one swaps toward its next build with a fixed willingness model. It never asked for more, never refused for a reason, and treated the leader like anyone else.
Now every other seat carries a threat in [0, 1] built from public
information: how far ahead they are or how close to the finish (race), how
much of this seat's best reachable ground they can reach as fast (space),
and whether the longest road or largest army is a live contest between the two
(awards). The threat raises the margin a swap must clear by up to thirty
leaf points and charges a share of what the partner gains from it, so a swap
that completes a city for the leader is refused while the same swap with a
trailing seat goes through. Proposals skip seats above a threat of 0.75, carry
a message with the reason (the build the swap completes, spare cards, or a
block of the top threat's next site), and go to every safe seat at once when
more than one was worth asking.
An open offer addressed to the search draws three kinds of answer. Accepting is valued as before less the partner's threat cost. A counter asks for more of what was offered, an extra card the seat is short of, a different resource, or gives one card less, priced by the offerer's public eagerness: a build the swap completes under their minimum known hand, a large hand, an explicit request. When neither beats waiting, the seat declines explicitly and says why, from the most specific ground: the offerer leads the race, the swap completes their build, they compete for the same ground, the terms are thin, or the cards are needed for the seat's own next build.
Diagnosis
| Slot | Wins | Win rate | Mean points | Decision |
|---|---|---|---|---|
| threat-aware (default) | 137 | 53.5% | 8.43 | 111 ms |
plain (bargain: false) | 81 | 31.6% | 7.27 | 71 ms |
| ETA | 22 | 8.6% | 6.72 | 0.1 ms |
| fast | 16 | 6.2% | 6.48 | 0.1 ms |
The bargaining seat spends 40 ms more per decision on counters and the threat model. The builders' share fell from about a quarter of games in earlier cohorts to 15%, so the two searches took the games from the builders as well as from each other.
What this does not show
The plain seat is a soft partner: it accepts a counter or a two-for-one ask whenever the cards reduce its deficit, and never counters back. A person will refuse most of those asks, so the gain against people is smaller and may come mostly from the refusals and the threat pricing rather than the asks. The three mechanisms were changed together; one-change arms are the next step, along with a fresh-seed confirmation and a partner that never accepts an ask.
Those arms were run the same day. Two identical seats in this design's slots 0 and 1 differ by +0.176 wins per game, so most of the contrast above is seating rather than bargaining; the corrected estimate and the one-change arms are in the arms report.
Agent notes
The cohort is filed under records/runs/4228f4f7-4427-42a4-8c0f-3976e1d26c76.md
from experiment 0250ba3c-1631-427e-bddc-9930a1504334. The mechanism is
documented in the server's docs/expectimax.md under Bargaining; the switch
bargain: false reproduces the plain control.