Protocol versus policy
How big a transit allowance is fair, how long to wait for a player who vanished, what leaving costs: reasonable apps disagree. So Pawnshake does not decide. The challenger writes concrete numbers for this game into CHALLENGE, the opponent signs them by accepting, and every verifier (the opponent's phone, the server, a checker years later) judges the game by those numbers, never by its own defaults. A device that sees a key it does not know declines the challenge.
The keys
| Parameter | Key | Meaning |
|---|---|---|
j_min_ms | 1 | smallest transit allowance |
j_rtt_mult | 2 | allowance as a multiple of the round trip |
sample_window | 3 | transit samples per direction for the link estimate |
pause_budget_ms | 4 | outage time forgiven per game, shared by both players |
ping_interval_ms | 5 | live-check ping interval |
rate_tolerance_ppm | 6 | allowed clock rate difference |
checkpoint_interval_ms | 7 | presence checkpoints while online (hybrid) |
away_after_ms | 8 | how long the game waits on an absent player |
leave_with_arbiter | 9 | outcome for leaving when there is an arbiter: 0 cancel, 1 loss, 2 draw |
leave_offline | 10 | the same without an arbiter |
free_first_moves | 11 | the first move of each side costs no clock |
takebacks | 12 | takeback offers allowed |
report_wait_days | 13 | how long a pending game waits for the second report |
link_settle | 14 | samples per direction that set the transit floors after a LINK |
link_settle is written only into games with peer clocks, so the profile of an online (full) game keeps its bytes.
A loss for leaving becomes a draw when the remaining player cannot mate, as for a flag.
whitepawn/1
The values WhitePawn writes into every game. Speeds follow the usual estimate initial + 40 × increment: bullet under 3 minutes, blitz under 8, rapid under 25, classical above.
| Key | Bullet | Blitz | Rapid | Classical |
|---|---|---|---|---|
j_min_ms | 30 | |||
j_rtt_mult | 2 | |||
sample_window | 16 | |||
pause_budget_ms | 2 000 | 5 000 | 10 000 | 20 000 |
ping_interval_ms | 250 | |||
rate_tolerance_ppm | 1 000 (0.1 %) | |||
checkpoint_interval_ms | 10 000 | |||
away_after_ms | 15 000 | 30 000 | 60 000 | 120 000 |
leave_with_arbiter | 1: the leaver loses | |||
leave_offline | 0: canceled | |||
free_first_moves | 1 | |||
takebacks | 1 in casual games, 0 in rated games | |||
report_wait_days | 7 | |||
link_settle | 4 (nearby and offline games only) | |||
What that means for players
Games with a full arbiter: the player who goes away loses, or draws if the other cannot mate.
A game whose phones have a Bluetooth link at the challenge. Staying silent on your own turn past the deadline loses on time. Leaving before your turn started loses only when the server can prove it (you were online, had the move and did not answer); otherwise, and when you cut every link before the deadline, the game is canceled. Losing the internet never ends or costs the game, and one played completely offline is saved the next time a phone is online.
Games without an arbiter: if one player hops off, the game is canceled. It is still uploaded and saved in both collections, unrated, with all its moves.
Outages up to the pause budget are paused time; longer ones cancel an offline game unless both players resume.