Reports are threads, and every turn of one rings the desk's bell

A player answers the desk under its reply from their lobby, proven by
the seat the report was filed from; the lobby shows the exchange in
order and says whose word is pending. A new report, a player's answer,
and a desk reply each raise a Sentry issue on the keeper's phone — the
first two from the server, the last from the reply script itself,
straight to Sentry from the droplet. The Desktop digest lists the
answers, and the desk's rule reads a report as reopened when the last
word is the player's.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Jm2auWk6RP71CjaAb4FMoG
This commit is contained in:
Eric Wagoner
2026-09-21 12:08:55 -04:00
co-authored by Claude Fable 5.1
parent ffbca5bfb9
commit 11e9f950c6
7 changed files with 114 additions and 16 deletions
+6 -2
View File
@@ -20,8 +20,12 @@ One JSONL line per entry:
— `id` is 8 hex chars; legacy reports (before 2026-09-01) have none
and are addressed by their `at` timestamp instead.
- Reply: `{reportId, at, status, text}` — folds onto the matching report.
A report is ANSWERED when any reply line names it; never re-answer one
unless Eric asks for a revision.
- Answer: `{reportId, from: "player", player, text, at}` — the player's
word back, sent from their lobby under the desk's reply.
A report is ANSWERED when the LAST line under it is the desk's; a
player's answer reopens it. Never re-answer a settled one unless Eric
asks for a revision. Every report, answer, and desk reply rings a
Sentry issue on Eric's phone (fingerprinted per report or per line).
- Picture: `{reportId, image: "<id>.png", at}` — the player attached a
screenshot; the file is `/var/lib/wizwar/feedback-images/<id>.<ext>`.