17 KiB
phase, plan, subsystem, tags, requires, provides, affects, tech-stack, key-files, key-decisions, requirements-completed, coverage, duration, completed, status
| phase | plan | subsystem | tags | requires | provides | affects | tech-stack | key-files | key-decisions | requirements-completed | coverage | duration | completed | status | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 09-botfights-platform-upgrade | 06 | infra |
|
|
|
|
|
|
|
|
|
~4h across two sessions (dominated by a ~50min cold `cargo build --release` of the signer binary, run in the background while other verification proceeded; the ceremony + publish session itself was a few minutes) | 2026-07-31 | complete |
Phase 9 Plan 6: BotFights 1.2.1 Manifest + Signed Catalog Publish Summary
Bumped apps/botfights/manifest.yml to 1.2.1 with a per-install generated JWT_SECRET and default-on shared-arena federation, then got the regenerated catalog signed by the release-root key (human ceremony) and published live to the raw URL every node fetches — BOT-04 complete.
Performance
- Duration: ~4h across two sessions (session 1: manifest/catalog edits, regeneration, signer build, verification, stopped at the human-only signing checkpoint; session 2, after the user ran the ceremony: independent re-verification, commit, push, off-host publish confirmation)
- Tasks: 3/3 completed
- Files modified: 4 (
apps/botfights/manifest.yml,app-catalog/catalog.json,scripts/image-versions.sh,releases/app-catalog.json)
Accomplishments
apps/botfights/manifest.ymlbumped to 1.2.1 (superseding the plan's originally-planned 1.2.0 per the session's POST_PLANNING FACTS — 09-05 shipped one additional prompt-hardening commit after 1.2.0 was built, and the live arena is already on 1.2.1). Image tag updated,container.generated_secretsaddsbotfights-jwt-secret(kind: hex32, matchingapps/barkd/manifest.yml's pattern — notbase64like netbird, sincejwt.tsuses the value directly as an HMAC key with no decode step),secret_envmaps it toJWT_SECRET.environmentgainsPORT=9100andARENA_UPSTREAM_URL=https://botfights.archipelago-foundation.orgwith an in-file comment documenting the per-node opt-out (delete the line to run standalone). Every other block (security/ports/volumes/health_check/interfaces/metadata) is untouched.app-catalog/catalog.json'sbotfightsentry andscripts/image-versions.sh'sBOTFIGHTS_IMAGEbumped to 1.2.1 in lockstep —scripts/check-app-catalog-drift.pyreportsmetadata_drift: 0.- Regenerated
releases/app-catalog.jsonviascripts/generate-app-catalog.sh(66 apps, 56 embedded manifests). Verified programmatically and structurally:botfights.version == "1.2.1", image tag:1.2.1,generated_secrets/secret_env/ARENA_UPSTREAM_URLall present, and zero other apps changed vs the previously-published catalog. - Built the release-signer prerequisite (
scripts/sign-catalog.shrefuses to compile its own signer) into/tmp/archy-sign-bin/release/archipelagoahead of the ceremony, so the human's signing step ran immediately with no compile wait. - Ran the plan's required verification:
cargo test -p archipelago catalog_overlay_accepts_all_real_image_manifests(pass) andcargo test -p archipelago-container manifest(38 passed, includingparse_every_real_manifest). - Gathered the fleet-impact briefing for the human gate: read the local BotFights SQLite DB on archi-dev-box directly — 115 bots, 102,440 fights, matching the plan's stated pre-measurement exactly. x250-dev was unreachable this session; the
.228resilience node has no localbotfights.db(app not installed there). - User ran the signing ceremony (
scripts/sign-catalog.sh) and confirmed success. Independently re-verified (not just trusting the script's own report):signaturepresent,signed_by==did:key:z6MkkidEnEpo6qHMCNSZoNKWtvQvxq3whnaME9wGgEFhq7ur,botfightsentry still 1.2.1 with the embedded manifest's secrets/env/arena URL intact, and a structural diff confirming signing altered nothing else in the payload. - Committed the signed catalog (
a99522d0) and pushed togitea-ai main. Discovered mid-publish thatgitea-ai(source.archipelago-foundation.org) andgitea-vps2/origin(146.59.87.168:3000, the host nodes actually fetch the raw catalog from) are the same physical Gitea backend — DNS resolves the domain to the same IP, and the raw URL reflected the push immediately. Confirmed via off-hostcurl: published bytes are byte-identical to the local signed file (sha256:f66bd717f45cff0bf5dfe1eb609dbc7abcf3aa28cffbf4a652556711426bf48fon both sides).
Task Commits
- Task 1: Manifest 1.2.1 — generated JWT secret, default-on arena, catalogs in lockstep —
f281c7aa(feat) —apps/botfights/manifest.yml,app-catalog/catalog.json,scripts/image-versions.sh. Pushed togitea-ai main. - Task 2: Sign the regenerated catalog (human ceremony) — done by the user at their own terminal via
scripts/sign-catalog.sh; no commit (script only mutates the working tree). - Task 3: Verify signature, commit, publish —
a99522d0(chore) —releases/app-catalog.json(signed). Pushed togitea-ai main; confirmed same content live at the vps2 raw URL nodes fetch.
Plan metadata: this SUMMARY, committed separately in two docs commits (921f450e mid-plan, this rewrite folded into the same file) — .planning/STATE.md/ROADMAP.md/REQUIREMENTS.md were intentionally NOT touched per this run's explicit instruction; a follow-up should run the normal state-update step to mark BOT-04 complete in those files.
Files Created/Modified
apps/botfights/manifest.yml— version/image → 1.2.1,generated_secrets/secret_envforJWT_SECRET,ARENA_UPSTREAM_URLadded toenvironment.app-catalog/catalog.json— legacybotfightsentry version/dockerImage → 1.2.1.scripts/image-versions.sh—BOTFIGHTS_IMAGEtag → 1.2.1.releases/app-catalog.json— regenerated, signed by the release-root key, committed, published.
Decisions Made
See key-decisions in frontmatter. Most notable: the catalog was deliberately kept off git while unsigned across the checkpoint boundary (per CLAUDE.md/memory's rule against ever committing an unsigned release-manifest state), and committed only after independent re-verification of the signature once the human ceremony succeeded. Also notable: gitea-ai and gitea-vps2/origin turned out to be the same backend — the plan's Task 3 wording (written assuming two separate remotes needing separate pushes) is slightly stale; a direct git push gitea-vps2 main was still attempted per the plan's literal instructions but failed on a stale token specific to that remote alias, which is reported below as a non-blocking issue rather than worked around.
Deviations from Plan
1. [User-directed] Version 1.2.1 instead of the plan's 1.2.0. The plan text was written against 1.2.0; the session's POST_PLANNING FACTS explicitly superseded this with 1.2.1 (an additional prompt-hardening commit d2fc998 landed on top of 09-05's 1.2.0 build, and the live arena is already running 1.2.1). Applied everywhere the plan said 1.2.0 — manifest, both catalog files, image-versions.sh, and the regenerated releases/app-catalog.json.
2. [User-directed] Execution split across the human checkpoint into two sessions. The plan's own Task 2 is a checkpoint:human-action gate; this run's explicit instruction additionally forbade attempting to sign or ask for the mnemonic in the first session. That session did all automatable prep and returned exact ceremony instructions; this second session picked up after the user confirmed the ceremony succeeded, independently re-verified, committed, and published.
3. [Rule 3 - blocking issue, reported not worked around] git push gitea-vps2 main failed with a stale HTTP Basic Auth token. The plan's Task 3 read_first assumes a direct push to the vps2 remote is required to publish. In practice gitea-ai (already pushed in Task 1/3) and gitea-vps2/origin are the same backend (confirmed via DNS + byte-identical published content), so the publish was already complete before this push was attempted. The gitea-vps2 remote alias's own credentials are independently stale — this is the same "known recurring issue with the vps2/local-origin remotes" flagged in project memory. Not fixed (out of scope — requires an admin token rotation), reported here instead of improvised around.
No Rule 1-2 auto-fixes were needed — the manifest/catalog edits matched the plan and the analog patterns (netbird-server, barkd) exactly, and both required cargo tests passed on the first run.
Issues Encountered
- The signer binary build (
cargo build --release -p archipelago, a freshCARGO_TARGET_DIRwith no incremental cache) took ~50 minutes on this heavily-loaded shared dev box (load average 24+ during the build). Backgrounded and monitored to completion; no errors,BUILD_EXIT=0. - x250-dev (100.72.136.6) was unreachable during the impact-briefing gathering — could not check whether it holds local BotFights data. Not blocking: the plan's own pre-measured reference count (115 bots/102,440 fights on archi-dev-box) was independently reproduced exactly, and the other checked node (
.228) has no local install. git push gitea-vps2 mainfailed withfatal: Authentication failed— see Deviation #3. Non-blocking; thegitea-aipush already published the signed catalog to the same backend.
User Setup Required
None remaining for this plan. Recommended follow-up (not done here per this run's explicit instruction to leave STATE/ROADMAP/REQUIREMENTS untouched): run the standard GSD state-update step to mark BOT-04 complete in .planning/REQUIREMENTS.md, advance .planning/STATE.md, and update .planning/ROADMAP.md's plan-progress row for 09-06. Separately: the gitea-vps2 git remote's stored HTTP Basic Auth token is stale and should be rotated (or the redundant remote alias removed, since gitea-ai already reaches the same backend).
Next Phase Readiness
- BOT-04 is complete. Every node that refreshes its catalog now sees BotFights 1.2.1: the JWT_SECRET crash-loop fix and the default-on shared-arena federation are both live in the signed, published catalog, verified byte-for-byte from off-host.
- 09-07 (demo verification) can proceed — the manifest/catalog side of the platform upgrade is done, on top of 09-05's already-verified live arena (health/prompt/registration/poll/SSE/cross-instance all proven working at 1.2.1).
- Four clearly-named test bots remain in the arena from 09-05 (
wavetest2/3/4,routefix) — unaffected by this plan, no cleanup action taken here.
Phase: 09-botfights-platform-upgrade Completed: 2026-07-31
Self-Check: PASSED
apps/botfights/manifest.yml,app-catalog/catalog.json,scripts/image-versions.sh,releases/app-catalog.jsonconfirmed present on disk with 1.2.1 signed content.- Commits
f281c7aaanda99522d0confirmed present ingit log --onelineand confirmed pushed togitea-ai main. releases/app-catalog.jsonconfirmed signed (signaturepresent,signed_bymatches the expected release-root DID) and confirmed byte-identical to the content served live athttp://146.59.87.168:3000/lfg2025/archy/raw/branch/main/releases/app-catalog.json(sha256 match).git show HEADgrepped for mnemonic/private-key patterns: 0 matches./tmp/archy-sign-bin/release/archipelagoconfirmed executable and was the binary actually used for the ceremony.