6.6 KiB
BotFights Demo-Day Run Sheet (2026-07-31)
Host: archi-dev-box (this machine), BotFights 1.2.1 installed via the signed catalog,
proxying to the shared public arena. x250-dev was unreachable this session (SSH
connect timeout on Tailscale IP 100.72.136.6) — the dev-pair rule is satisfied on
archi-dev-box only; repeat Task 1's steps there if it comes back online before the demo.
URLs
| What | URL |
|---|---|
| Canonical public arena (the shared match/fighter state) | https://botfights.archipelago-foundation.org |
| Node UI on archi-dev-box (what you demo from — same fighters, thin client) | http://localhost:9100/ (or http://192.168.63.240:9100/ from another device on the LAN) |
| Unified AI bot-setup prompt (hand this URL alone to a cloud agent) | https://botfights.archipelago-foundation.org/api/docs/prompt |
| Local health check | http://localhost:9100/api/health |
| Arena health check | https://botfights.archipelago-foundation.org/api/health |
What's already verified (automated, this session)
podman inspect botfights→ image146.59.87.168:3000/lfg2025/botfights:1.2.1, container healthy.ARENA_UPSTREAM_URL=https://botfights.archipelago-foundation.orgpresent in the container env.JWT_SECRETdelivered as a podman secret (--secret archy-env-botfights-jwt_secret,type=env,target=JWT_SECRET), masked inpodman inspect, backed by/var/lib/archipelago/secrets/botfights-jwt-secret(mode600, 64 hex chars) — no plaintextJWT_SECRET=in the container env.curl http://localhost:9100/api/botsreturns 104 fighters (default filter), matchingcurl https://botfights.archipelago-foundation.org/api/botsexactly (104).?type=classicon both returns 15 — full parity, thin-client proxy mode confirmed live.curl http://localhost:9100/api/docs/promptreturns the unified prompt with the arena's own hostname substituted (5 occurrences ofbotfights.archipelago-foundation.org)./var/lib/archipelago/botfights/botfights.dbuntouched: 367144960 bytes, mtime 1782916151, byte-identical before/after the update (115 bots / 102,440 fights preserved on disk, no longer read now that the app is in proxy mode).- Survived a real
podman restart botfights: came back healthy, same env, same live fighter count (104) afterward. - Arena itself (
https://botfights.archipelago-foundation.org/api/health) still answersokafter all of the above — nothing broke on the arena side.
Click path for demo day
1. Real nostr signer login (D-01)
- Open http://localhost:9100/ in a browser with a NIP-07 extension installed (nos2x or Alby).
- Click Sign In. Approve the signature request in the extension popup.
- Expect: you are signed in, your bot/profile appears. The extension prompts you to sign an event — at no point are you asked for a private key.
- Reload the page.
- Expect: still signed in, no second signature prompt (session persisted via JWT).
- Optional, higher-value if time allows: repeat from an Android phone with Amber (NIP-55)
against the same URL (use the LAN URL
http://192.168.63.240:9100/from the phone, notlocalhost).
Something's wrong if: a spinner never resolves, login silently fails, or you're asked to paste/select a private key anywhere.
2. Shared arena / cross-node fighter visibility (D-03)
- Open https://botfights.archipelago-foundation.org in a second tab, side-by-side with http://localhost:9100/.
- Confirm the fighter list / leaderboard is the same in both tabs. Pick a fighter you can see only because it's an arena-side registration and confirm it also shows up on the node's local UI.
- Start or join a fight from either tab and confirm rounds appear live, incrementally — not all at once when the fight ends (SSE streaming, already verified working through the canonical HTTPS path in 09-05).
Something's wrong if: the two tabs show different fighter counts/lists, or a live fight's rounds only appear in a single batch at the end.
3. Cloud "openclaw" bot from the prompt alone (D-02)
- Hand your cloud agent only this URL, nothing else:
https://botfights.archipelago-foundation.org/api/docs/promptInstruction: "set yourself up as a BotFights bot using this." - Expect the agent, from that document alone, to:
POST /api/botsand receive anid+secret(no nostr identity needed for a bot).- Authenticate and poll for challenges (
GET /api/fights/poll, verified working since 09-05's route-order fix) — or stand up a webhook, if it chooses that mode. - Join the queue and fight.
- Have that fight show up in the BotFights UI on archi-dev-box (http://localhost:9100/).
- If the agent gets stuck, quote the exact question it could not answer from the prompt — that's the single most useful finding this step can produce, more useful than "it didn't work."
Fallback: arena unreachable on the day
If https://botfights.archipelago-foundation.org is down or unreachable from archi-dev-box,
switch this node back to a fully standalone, node-local arena by removing the
ARENA_UPSTREAM_URL env var and recreating the container:
# On archi-dev-box, as a user with podman/sudo access to the container:
sudo sed -i '/ARENA_UPSTREAM_URL=/d' /opt/archipelago/apps/botfights/manifest.yml 2>/dev/null || true
# Preferred: use the UI's per-app "Edit config" / re-install path so the orchestrator
# regenerates the container from the catalog-overlaid manifest with the var removed,
# rather than hand-editing the container. If using the RPC directly:
# package.update with id=botfights after removing ARENA_UPSTREAM_URL from the
# effective environment (catalog-covered apps ignore raw disk manifest edits — see
# 09-07-PLAN.md read_first notes on catalog overlay supremacy).
The node's own local database (/var/lib/archipelago/botfights/botfights.db, 115 bots /
102,440 fights) is intact on disk and untouched — switching back to standalone mode makes
it visible/writable again immediately, no data loss, no migration needed. /api/health
stays local and answers ok regardless of arena state; only /api/bots and fight data
degrade if the arena goes down while still in proxy mode.
Known limitation this session
x250-dev(Tailscale 100.72.136.6) was unreachable — SSH connection timed out. The dev-pair verification rule (deploy/verify on both archi-dev-box and x250-dev before any catalog-adjacent change) is satisfied on archi-dev-box only for this plan. If x250-dev comes back online before the demo, repeat this plan's Task 1 steps there (catalog refresh viapackage.check-updates, thenpackage.updatewithid: botfights) and record the outcome.