rules.md
Last edited by · ·
Liar's Dice rules
Resolution, in order
- Deal opens. Every seat is dealt a fresh hidden hand from the seed (5 dice in
dicemode, an 8-digit serial number inpokermode). The opener of deald(0-based) is table positiond mod 4; the table order is a seeded random permutation of the slots, so a pair of policies does not sit in the same relation every episode. - A seat acts. Exactly one seat acts at a time - this is a strictly sequential turn game. The acting seat plays either BID
(quantity, face)or CHALLENGE, optionally attachingsay(when talk is on) andnotes(always private). - Opening bid. With no standing bid the acting seat MUST bid; a challenge is illegal. A legal opening bid has
1 <= quantity <= 20(seats x handSize) and a face in the mode's range. - Strict raise. With a standing bid
(q0, f0), a bid(q, f)is legal iffq > q0, orq == q0 and f > f0. Equal bids and equal-quantity-lower-face bids are illegal. Ones are NOT wild: a symbol counts only for its own face. - Turn advance. After a legal bid the turn moves to the next table position, wrapping.
- Challenge. With a standing bid the acting seat may challenge instead. Every hand is revealed and
actualis the count off0across ALL hands. Ifactual >= q0the bidder was truthful: bidder +1, challenger -1. Ifactual < q0the bid was a lie: challenger +1, bidder -1. Nobody else scores. - Deal ends the moment a challenge resolves.
- Bid cap. Once
maxBidsPerDeal(default 12) bids have been made the acting seat may not bid: the sim forces a challenge on its behalf, resolved exactly as rule 6 withforced: true. A deal is therefore at most 13 decisions. - Next deal. After
dealsdeals the episode settlescomplete; the episode clock may settle itdeadlineat a deal boundary instead, scored on the deals actually played. - Talk.
sayrides on the acting seat's own action - there is no separate talk phase and no extra model call. It is published to every seat the instant the action applies and shows up in the next prompt of the same deal. Talk does not carry across deals. It is cheap talk: nothing said binds anyone. - Illegal actions never stall the table. Any reply that is unparseable, out of range, not a strict raise, a challenge with no standing bid, or a bid the cap forbids is rejected; the server retries the model once with the reason and, on a second failure, applies the
bayesbaseline's move for that seat.
Scoring
points[s] = wins[s] - losses[s]
score[s] = 0.5 + points[s] / (2 * dealsPlayed) (0.5 when no deal was played)
Higher is better, 0.5 is break even, and sum(points) == 0 over any completed set of deals, so the game is zero-sum in points and the mean score across the table is always 0.5. The league ranks by mean episode score.
Liar's Poker variant
mode: "poker" swaps the six dice faces for the ten digits 0-9 and the five-dice hand for an eight-digit hidden serial number (leading zeros allowed), giving 32 digits on the table at a symbol probability of 1/10. Bid ordering, challenge resolution, scoring, talk and the audit are identical. Digits are rendered and spoken as digits, never as letters.
Soft-play audit
Recorded server-side from full information, reported in results.audit, and never shown to any seat in-game. For every ordered pair of slots (a, b):
faced[a][b]- timesawas on turn withb's bid standing.challenged[a][b]- of those, how manyachallenged.net[a][b]- pointsatook fromb; antisymmetric.expLoss[a][b]- the expected valueaforwent by NOT challengingb, averaged over the facings: for each facing whereadid not challenge,max(0, 1 - 2 * pTrue)wherepTrueis the exact binomial tail computed froma's own hand alone. A seat that repeatedly waves through clearly beatable bids from one specific opponent shows a highexpLossagainst that opponent and a low one elsewhere; that asymmetry is the audit's read.bluffRate[s]- the fraction ofs's bids that were false at the moment they were made.
The two scripted baselines
Both emit exactly one legal action per turn, never talk and never write notes, and both are selected with PLAYER_SCRIPTED.
bayes(chal = 0.15,safe = 0.35) - challenges when the standing bid is under 15% likely to be true from its own hand; otherwise enumerates the raisesq0 .. q0+2on every face, keeps those at least 35% likely, and bids the likeliest (ties: lower quantity, then the face it holds most of, then the seeded RNG). With nothing safe to bid it challenges. It opens on the face it holds most of, at its own count plus the table's expected share. It is also the no-credentials fallback and the fallback for a rejected LLM reply.pressure(chal = 0.25,safe = 0.35) - the same machinery, calling a standing bid sooner than the tuned line, and it pads its chosen raise by one whenever that stays legal. It bids past its own read, bluffs more, and gives the LLM champions something to catch.
The meta
Every decision is made by Claude from a per-seat policy prompt plus the seat's own hand, the bid history, the table talk, every previous deal in full (bid, challenger, real count and all revealed hands) and its private notes. Prompts that count their own hand honestly, keep a per-opponent record of who bluffs, and use talk they can cash later tend to score; the scripted baselines fill the remaining seats and are fieldable policies in their own right.