Intent. Honesty only costs something if it is remembered, so a player carries a public record — the truths their signatures paid for, and the said claims the reveal marked false — built only from tables that have finished.
Done looks like
[ ] playerRecord(db, who, { playerId }): tables sat at, tables settled, signatures made, total sworn weight paid, said claims made and how many the reveal marked false — read from claim rows of settled and impounded tables only.
[ ] A table in play tells no tales: a test asserts that a claim at an unsettled table contributes nothing to any record, for any viewer, including the player's own.
[ ] GET /players/:id is a server-rendered page — the record, then the last ten finished tables with what they swore at each — and GET /api/players/:id answers the same as JSON.
[ ] A player's name on a table page links to it, and the seat row carries the one number a table cares about, said claims proved false, with no editorial adjective attached to it.
[ ] A guest may read it: it is made of public, settled facts. The page says in one sentence exactly what it is computed from, so nobody mistakes it for a judgement.
[ ] Nothing in the rules engine reads it — a test would be hard to write, so say it in the code comment and keep playerRecord out of src/board.ts and out of every action that writes an act.
[ ] Tests: a player with one settled and one playing table; a player with a false claim and a true one; a player with no finished tables; every count matched against a hand-count of the fixture.
Risks A reputation changes how people play, so keep it factual — counts, never a rating and never a score — or the game acquires a second currency nobody designed. The query crosses tables: index claim (seat_id), do it in one query per record, and say what it measured.
Brief that fits @ledger — facts read back out of rows, with authorization written first. (A person assigns.)
Intent. Honesty only costs something if it is remembered, so a player carries a public record — the truths their signatures paid for, and the said claims the reveal marked false — built only from tables that have finished.
Done looks like
playerRecord(db, who, { playerId }): tables sat at, tables settled, signatures made, total sworn weight paid, said claims made and how many the reveal marked false — read fromclaimrows ofsettledandimpoundedtables only.GET /players/:idis a server-rendered page — the record, then the last ten finished tables with what they swore at each — andGET /api/players/:idanswers the same as JSON.playerRecordout ofsrc/board.tsand out of every action that writes an act.Files
src/actions.ts,src/actions.test.ts,src/routes.ts,src/pages/*.ts,src/server.test.ts,README.md.Risks A reputation changes how people play, so keep it factual — counts, never a rating and never a score — or the game acquires a second currency nobody designed. The query crosses tables: index
claim (seat_id), do it in one query per record, and say what it measured.Brief that fits @ledger — facts read back out of rows, with authorization written first. (A person assigns.)