Wiz-War lives on the shared hall host: its scripts, skills and docs name it
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Jm2auWk6RP71CjaAb4FMoG
This commit is contained in:
co-authored by
Claude Opus 5.5
parent
56ea593e07
commit
397c68a1c8
@@ -36,7 +36,7 @@ one (thief → target's steallables, deja-vu → discard contents, etc.).
|
||||
Fetch and replay production ledgers (details in auto-memory
|
||||
`wizwar-fetch-game-files`):
|
||||
|
||||
scp root@104.236.96.198:/var/lib/wizwar/rooms/<CODE>.jsonl <scratchpad>/
|
||||
scp root@159.203.115.252:/var/lib/wizwar/rooms/<CODE>.jsonl <scratchpad>/
|
||||
|
||||
Replay with `createGame({playerIds, seed, sets, colors, deckRev})` +
|
||||
`applyCommand` per command line (see `deploy/replay-verify.mjs`). Stop at
|
||||
@@ -50,7 +50,7 @@ each, and report phase / round / humans vs bots / last command's `at`.
|
||||
|
||||
## 3. Determinism gate (before deploying engine changes)
|
||||
|
||||
deploy/verify-ledgers.sh 104.236.96.198
|
||||
deploy/verify-ledgers.sh 159.203.115.252
|
||||
|
||||
Strict-replays every production ledger against the local engine; one
|
||||
refused command fails. A room whose ledger no longer replays becomes
|
||||
|
||||
@@ -12,7 +12,7 @@ quiet, say so in one line before the details.
|
||||
|
||||
## Gather
|
||||
|
||||
1. **Box health** (one ssh to root@104.236.96.198):
|
||||
1. **Box health** (one ssh to root@159.203.115.252):
|
||||
- `systemctl is-active wizwar caddy` — both must be active
|
||||
- `systemctl status wizwar` Memory line — the cap is 700M; worry
|
||||
past ~500M steady-state
|
||||
|
||||
@@ -6,7 +6,7 @@ description: Work the Wiz-War player-feedback desk — fetch new bug reports, sh
|
||||
# The Wiz-War reports desk
|
||||
|
||||
Players file surprise reports from the in-game 🐞 button. Each lands in
|
||||
`/var/lib/wizwar/feedback.jsonl` on the droplet (104.236.96.198) pinned
|
||||
`/var/lib/wizwar/feedback.jsonl` on the droplet (159.203.115.252) pinned
|
||||
with `roomId`, `seq`, `round`, and `deckRev` — enough to replay the game
|
||||
to the exact moment. Replies live in the same file and appear under the
|
||||
report in the player's lobby ledger. This desk fetches, displays, and
|
||||
@@ -32,7 +32,7 @@ One JSONL line per entry:
|
||||
screenshot; the file is `/var/lib/wizwar/feedback-images/<id>.<ext>`.
|
||||
`scp` it to the scratchpad and Read it: it is usually the whole story.
|
||||
|
||||
Fetch: `ssh root@104.236.96.198 'cat /var/lib/wizwar/feedback.jsonl'`
|
||||
Fetch: `ssh root@159.203.115.252 'cat /var/lib/wizwar/feedback.jsonl'`
|
||||
|
||||
## a) Fetch and b) display
|
||||
|
||||
@@ -49,7 +49,7 @@ players' voices — never compress their words, or your replies, into a table.
|
||||
For each unanswered report, in order:
|
||||
|
||||
1. **Replay to the pin.** Fetch the ledger
|
||||
(`scp root@104.236.96.198:/var/lib/wizwar/rooms/<roomId>.jsonl <scratchpad>/`)
|
||||
(`scp root@159.203.115.252:/var/lib/wizwar/rooms/<roomId>.jsonl <scratchpad>/`)
|
||||
and replay it to the report's `seq` with the engine
|
||||
(`createGame` + `applyCommand` per command line, printing the events
|
||||
around the pinned moment). CRITICAL replay details:
|
||||
@@ -80,10 +80,10 @@ For each unanswered report, in order:
|
||||
- Chronicle-only changes (event names, humanize lines) ship ungated.
|
||||
- Before deploying: full engine suite passes AND
|
||||
`bash deploy/verify-ledgers.sh` replays every production ledger
|
||||
clean. Deploy with `bash deploy/deploy.sh 104.236.96.198` from the
|
||||
clean. Deploy with `bash deploy/deploy.sh 159.203.115.252` from the
|
||||
repo root. The deploy restarts the server; live games survive.
|
||||
5. **Reply.** From the repo root:
|
||||
`bash deploy/feedback-reply.sh 104.236.96.198 <reportId> <status> "text"`
|
||||
`bash deploy/feedback-reply.sh 159.203.115.252 <reportId> <status> "text"`
|
||||
- `<reportId>` is the report's `id`, or its `at` timestamp for
|
||||
legacy reports. Pass it as ONE clean argument — a stray newline in
|
||||
the id silently orphans the reply (it happened; the bad line had
|
||||
|
||||
@@ -10,7 +10,7 @@ Eric like a host glancing over the tavern.
|
||||
|
||||
## Gather
|
||||
|
||||
ssh root@104.236.96.198 /usr/local/bin/wizwar-visitors.sh [YYYY-MM-DD]
|
||||
ssh root@159.203.115.252 /usr/local/bin/wizwar-visitors.sh [YYYY-MM-DD]
|
||||
|
||||
Default is today, UTC. The script rolls today's partial rollup row
|
||||
first, so the traffic line is current to the minute. Its output:
|
||||
|
||||
+6
-4
@@ -7,16 +7,18 @@ survive deploys and reboots.
|
||||
|
||||
## Current production
|
||||
|
||||
- Droplet: `wizwar` (nyc3, s-1vcpu-1gb, tag `wizwar`), IP 104.236.96.198
|
||||
- Host: `hall` (nyc3, tag `kestrels-hall`), IP 159.203.115.252, shared with
|
||||
the other games of Kestrel's Hall since 2026-09-29; Wiz-War keeps its own
|
||||
service user, port 8787, site file and access log there.
|
||||
- URLs: https://wizwar.kestrelsnest.social
|
||||
and https://wizwar.104.236.96.198.sslip.io (always works, zero DNS).
|
||||
and https://wizwar.159.203.115.252.sslip.io (always works, zero DNS).
|
||||
Caddy serves both; NOTE: kestrelsnest.social's authoritative DNS is at
|
||||
HOVER (ns1/ns2.hover.com), not DigitalOcean — records must be added there.
|
||||
A matching record also sits in the DO zone in case nameservers ever move.
|
||||
|
||||
## Everyday deploys
|
||||
|
||||
deploy/deploy.sh 104.236.96.198
|
||||
deploy/deploy.sh 159.203.115.252
|
||||
|
||||
Builds the client locally, rsyncs the repo (minus node_modules, data/, .git,
|
||||
research), installs dependencies on the droplet, and restarts the service.
|
||||
@@ -25,7 +27,7 @@ automatically.
|
||||
|
||||
Before any deploy that touches the engine, run the determinism gate:
|
||||
|
||||
deploy/verify-ledgers.sh 104.236.96.198
|
||||
deploy/verify-ledgers.sh 159.203.115.252
|
||||
|
||||
It fetches every production ledger and strictly replays it against the local
|
||||
engine; a single refused command fails the check. A room whose ledger no
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
# to a local folder, and write a digest beside them for reading.
|
||||
# deploy/pull-feedback.sh [host] [folder] (default ~/Desktop/wizwar-reports)
|
||||
set -euo pipefail
|
||||
HOST="${1:-104.236.96.198}"
|
||||
HOST="${1:-159.203.115.252}"
|
||||
OUT="${2:-$HOME/Desktop/wizwar-reports}"
|
||||
mkdir -p "$OUT/images"
|
||||
scp -q "root@$HOST:/var/lib/wizwar/feedback.jsonl" "$OUT/feedback.jsonl"
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
# replay it against the LOCAL engine. Any refused command is a hard failure.
|
||||
# Run from the repo root before deploying any engine change.
|
||||
set -euo pipefail
|
||||
HOST="${1:-104.236.96.198}"
|
||||
HOST="${1:-159.203.115.252}"
|
||||
TMP=$(mktemp -d)
|
||||
trap 'rm -rf "$TMP"' EXIT
|
||||
scp -q "root@$HOST:/var/lib/wizwar/rooms/*.jsonl" "$TMP/"
|
||||
|
||||
@@ -74,7 +74,7 @@ for f in sorted(glob.glob("/var/lib/caddy/wizwar-access*.log*")):
|
||||
ref = " ".join(h.get("Referer", [""]))
|
||||
m = re.match(r"https?://([^/]+)", ref)
|
||||
host = m.group(1) if m else ""
|
||||
ours = host.endswith("kestrelsnest.social") or "104.236.96.198" in host
|
||||
ours = host.endswith("kestrelsnest.social") or "159.203.115.252" in host
|
||||
# Scanners forge referrers on paths like /.env, and the app answers
|
||||
# unknown paths with the page itself, so the status cannot tell a
|
||||
# probe from a reader. Only the pages count.
|
||||
|
||||
Reference in New Issue
Block a user