The credibility pass on Hnefatafl, ported to the template: the ops scripts count traffic through one parser, the reports digest is one program, the plaintext-token fallback and its migration are gone, and the stylesheet holds each shared rule once

From the hnefatafl repo's pass of the same day, everything that touched a
kit-shared file. The visitors digest and the nightly rollup share
deploy/traffic.py, installed to /usr/local/lib/<slug>; the rollup writes
the finished-games count it computed behind "and False". pull-reports.sh
and the reports skill both use deploy/report-digest.ts. The seat line
requires its token hash and the start line its rules revision; the
migration for ledgers written before hashing goes with them. The route
table in server/src/index.ts lists every route; Report, ReportLine and
Tally are declared once in view.ts for both sides; exports nobody
imported are exports no more.

In the client: .small, the × that dismisses, and the frame of the
reading pages are in app.css once; the preferences panel shares the
report slip's modal shape; the room store gains seatEmpty and
seatUnheld, and the lobby and the join page read those instead of
three spellings of their own. The room's moved and awaiting fields
stay: the demo board reads them, and simultaneous rounds are the
contract.

The deploy README no longer describes a browser-only game; the visitors
skill no longer names a /play route; the reports skill's replay call
carries the room's options. The Slack channel id is passed in the
environment rather than filled in as a placeholder.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GwFKMuQnPAEHJ5yA1q4orh
This commit is contained in:
Eric Wagoner
2026-09-23 20:12:37 -04:00
co-authored by Claude Fable 5.1
parent 6c42e55f59
commit 33ac0ec808
41 changed files with 421 additions and 583 deletions
@@ -34,12 +34,13 @@ Every report and every player's answer rings a Sentry issue (project
__SLUG__, fingerprinted per report or per line); the desk's own
replies ring nothing.
Fetch: `ssh root@__IP__ 'cat /var/lib/__SLUG__/feedback.jsonl'`
## a) Fetch and b) display
Parse the file, fold replies onto reports, and show Eric the last 7 days
by `at`. Lead with the count of unanswered reports; those are the work.
From the repository root, `bash deploy/pull-reports.sh` mirrors the file
and the pictures to `~/Desktop/__SLUG__-reports/` and writes `reports.md`
there, newest first, with every reply folded under its report. Read it and
show Eric the last 7 days by date. Lead with the count of unanswered
reports; those are the work.
Then one block per report, VERBATIM and UNTRUNCATED: player, room, date,
turn and seq, the full "what happened", the full "what they expected",
and every reply with its status (or "unanswered"). Eric reads this desk
@@ -49,13 +50,14 @@ to hear his players' voices; never compress their words into a table.
1. **Replay to the pin.** `scp root@__IP__:/var/lib/__SLUG__/rooms/<roomId>.jsonl <scratchpad>/`
and replay it with the engine as `deploy/replay-ledgers.ts` does:
`game.create(names, start.seed, start.rules ?? 1)` then
`game.create(names, start.seed, start.rules, room.options)` then
`game.resolve(state, line.inputs)` per turn line, printing the state
around the pinned round. The
`chat` lines show what the players said to each other at the time.
2. **Check the rules before the code.** The original rules text lives in
`docs/`; read it before deciding the engine is wrong. Many reports are
the rules working as written.
around the pinned round. The `chat` lines show what the players said
to each other at the time.
2. **Check the rules before the code.** The rules are data in
`src/lib/game/rules.ts` and prose at /rules, which names the texts it
follows; read them before deciding the engine is wrong. Many reports
are the rules working as written.
3. **Verdict.** `by-design` (the engine matches the text; no change),
`resolved` (a defect, fixed before replying), or `open` (needs Eric's
ruling; ask him and hold the reply).
@@ -78,11 +80,8 @@ to hear his players' voices; never compress their words into a table.
6. **Report to Eric** when the desk is clear: one line per report:
player, room, verdict, and what shipped if anything.
## Eric's local copy
`bash deploy/pull-reports.sh` mirrors the reports, the replies and the
pictures to `~/Desktop/__SLUG__-reports/` and writes `reports.md`
there, newest first. Run it at the end of every desk session.
Run `bash deploy/pull-reports.sh` again at the end of every desk session,
so Eric's local copy carries the replies.
## Standing rules