diff --git a/.claude/skills/wizwar-audits/SKILL.md b/.claude/skills/wizwar-audits/SKILL.md index 680b868..a538c33 100644 --- a/.claude/skills/wizwar-audits/SKILL.md +++ b/.claude/skills/wizwar-audits/SKILL.md @@ -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/.jsonl / + scp root@159.203.115.252:/var/lib/wizwar/rooms/.jsonl / 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 diff --git a/.claude/skills/wizwar-pulse/SKILL.md b/.claude/skills/wizwar-pulse/SKILL.md index 860e22e..f3e12dd 100644 --- a/.claude/skills/wizwar-pulse/SKILL.md +++ b/.claude/skills/wizwar-pulse/SKILL.md @@ -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 diff --git a/.claude/skills/wizwar-reports/SKILL.md b/.claude/skills/wizwar-reports/SKILL.md index 0def6c6..a7577cf 100644 --- a/.claude/skills/wizwar-reports/SKILL.md +++ b/.claude/skills/wizwar-reports/SKILL.md @@ -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/.`. `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/.jsonl /`) + (`scp root@159.203.115.252:/var/lib/wizwar/rooms/.jsonl /`) 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 "text"` + `bash deploy/feedback-reply.sh 159.203.115.252 "text"` - `` 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 diff --git a/.claude/skills/wizwar-visitors/SKILL.md b/.claude/skills/wizwar-visitors/SKILL.md index 4c9cfea..eb0063b 100644 --- a/.claude/skills/wizwar-visitors/SKILL.md +++ b/.claude/skills/wizwar-visitors/SKILL.md @@ -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: diff --git a/deploy/README.md b/deploy/README.md index 55f44d7..bcbead8 100644 --- a/deploy/README.md +++ b/deploy/README.md @@ -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 diff --git a/deploy/pull-feedback.sh b/deploy/pull-feedback.sh index 76be443..0cf2eca 100755 --- a/deploy/pull-feedback.sh +++ b/deploy/pull-feedback.sh @@ -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" diff --git a/deploy/verify-ledgers.sh b/deploy/verify-ledgers.sh index 00fde73..bcc9d54 100755 --- a/deploy/verify-ledgers.sh +++ b/deploy/verify-ledgers.sh @@ -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/" diff --git a/deploy/wizwar-rollup.sh b/deploy/wizwar-rollup.sh index 6692fe8..b06bcfc 100755 --- a/deploy/wizwar-rollup.sh +++ b/deploy/wizwar-rollup.sh @@ -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.