Two blind reviews of everything since the last pass (afa0e17), every
finding checked against the code, no behavior changed: all thirty
scene goldens match without a re-bless and the engine suite is
untouched.
Reel and renderer: the camera's look-down rule is stated once, beside
LOOK_DOWN, instead of twice in the effect; the empty aim branch that
stood where a cutaway used to be is gone (the guard it implied is now
explicit); the pit events and the punch are handled by their own
types, not through "in" casts; smoothstep is one export used by every
tween instead of eleven inline copies; the two floor rings share one
painter; project() takes a Billboard instead of a third hand-typed
copy of its fields; the strides-left figure and the web rim no longer
shadow the reel's steps and the pane's fx; the die card's verdict is
built from events, not by matching an emoji; the workshop asks for the
hover cue by name instead of passing an empty click handler.
Server and engine: one requestBase() for the origin, one slug pattern
in store.ts gating both the clip page and its files, one 404 for both;
LOOPBACK sits above its only caller; doCounteract names what a counter
is played against once; fearCells sits beside its own docblock rather
than between sightedCellsFor and its.
Deploy: chromiumExe, the private server, ffmpeg, and the reel rewind
live in deploy/lib/harness.mjs, shared by the gate, the recorder, and
the card cutter instead of pasted three times; the recorder drops its
duplicate frame counters and names its poster settle; the card uses the
gallery's exact gold; the one-time Sentry URL bootstrap leaves
deploy.sh; the backup comment states the rule rather than the incident.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Jm2auWk6RP71CjaAb4FMoG
4.2 KiB
4.2 KiB
name, description
| name | description |
|---|---|
| wizwar-pulse | The weekly Wiz-War operations pulse — droplet health, error and traffic signals, backup status, and who has been playing. Use when Eric asks how the server is doing, wants an ops check, or says "run the pulse". |
The Wiz-War ops pulse
One invocation, one screen: how the table is doing. Gather everything, then report in five short sections. Lead with anything ALARMING (service down, memory near the cap, failed backup, new Sentry issues); if all is quiet, say so in one line before the details.
Gather
- Box health (one ssh to root@104.236.96.198):
systemctl is-active wizwar caddy— both must be activesystemctl status wizwarMemory line — the cap is 700M; worry past ~500M steady-statefree -m,df -h /,uptime— swap in heavy use, disk past ~70%, or load near 1.0 (single vCPU) are the resize triggersjournalctl -u wizwar --since "-7 days" | grep -ci "unhandled protocol error"— anything nonzero deserves a look (Sentry has the stack traces)
- Sentry (MCP connector, org
locallygrownnet, projectwizwar):search_issuesforis:unresolved— new issues are the headlineget_monitor_detailsfor cron monitor slugnew-monitor(named wizwar-backup) — last check-in must be ok and recent; the uptime monitor alerts on its own but note any incidents- New-project caveat: results can lag ingest by minutes; the connector reads fine but 403s on create operations
- Backups:
tail -3 /var/log/wizwar/backup.log(or its rotation) for the last run, plus the cron monitor above for missed runs - Trends (
/var/lib/wizwar/rollup.jsonl, one JSON line per UTC day written at 00:10 by /usr/local/bin/wizwar-rollup.sh; counts only, no addresses): the last 7 rows give requests, human vs bot addresses, socket connects, path mix (/, /clips, /watch, /ws), external referrers (reddit.com, boardgamegeek.com after the 2026-09-03 announcement), new rooms, human seats and names, reports/replies, and vitals (memMB, memPeakMB, diskPct, load1, protocolErrors, serviceStarts, ledgerMB). Report day-over-day direction, not raw rows. Its Sentry cron monitor is slugwizwar-rollup(a missed check-in there means the rollup itself is broken). Re-roll a day by hand:wizwar-rollup.sh YYYY-MM-DD. - The table itself:
- Room count and growth:
ls /var/lib/wizwar/rooms/*.jsonl | wc -l - New human names this week: room ledgers' join lines minus bots
(Automaton*) and known names, on rooms created in the last 7 days
(meta line
createdAt) - Unanswered feedback count from /var/lib/wizwar/feedback.jsonl —
if any, offer to run the reports desk (
/wizwar-reports) - Access-log pulse:
wc -l /var/lib/caddy/access.logand a count of distinctclient_ips in the last day, for the growth line
- Room count and growth:
Report
Six sections, tight: Verdict (one line), Box, Errors & monitors, Backups, Trends (the week's direction from the rollup), The table (games, new faces, feedback). Numbers with their thresholds, not raw dumps. End with any recommended action, or "nothing needs you."
Standing knowledge
- The service restarts cleanly (ledgers replay); restarts in the journal during deploys are normal, not incidents.
- Room memory is evicted after idle (finished 30 min, others 24 h); boot-restores load everything then shed, so post-deploy memory spikes settle within the hour.
- Unattended-upgrades reboots the box at 09:30 UTC when a kernel patch requires it; a reboot there is maintenance, not an outage.
- Caddy access logs live at /var/lib/caddy/access.log (self-rotating, 10MiB × 30); the systemd sandbox denies /var/log/caddy.
- Per-address limits (2026-09-03): 12 new rooms and 6 reports per address per hour, in packages/server/src/ratelimit.ts. A player who hits one sees "try again in an hour"; a pulse showing many refused creates from one address is a script, not a friend.
- Restore drill (2026-09-01): a Spaces snapshot booted 56/56 rooms
clean. The path:
rclone copy spaces:kestrel-wizwar-backups/wizwar/ snapshots/<date> ...on the droplet, then run a local server with WIZWAR_DATA_DIR pointed at its rooms dir. Re-drill quarterly-ish.