ai-code-battle/scripts/README.md
jedarden 1a9c8374f2 fix(scripts): add test replay generation and R2 upload tools
Root cause: The R2 bucket 'acb-data' is empty - no replay files were ever
uploaded. The matches/index.json lists test matches, but the corresponding
replay files return 404 when accessed via the Pages Function at /r2/.

Fix: Add tooling to generate test replays matching index.json entries and
upload them to R2. The viewer already has proper error handling (response.ok
check + user-visible error messages in replay.ts:1397-1402).

Changes:
- scripts/generate-test-replays.sh: Generate all 8 test replays from index.json
  with correct match IDs, gzip them, place in test-replays/
- scripts/upload-test-replays.sh: Upload generated replays to R2 via wrangler
- scripts/README.md: Document the R2 setup and replay upload workflow
- .gitignore: Add test-replays/ (generated files, not committed)

Usage:
  1. bash scripts/generate-test-replays.sh
  2. npm install -g wrangler && wrangler login
  3. bash scripts/upload-test-replays.sh

Verified: Generated replays have correct match_id, format_version="1.0",
and valid JSON structure. The viewer error path handles 404 correctly.

Closes: bf-360t
2026-05-24 21:54:36 -04:00

2 KiB

Scripts

This directory contains utility scripts for the AI Code Battle project.

Test Replay Management

Problem

The web viewer at /watch/replay loads replays from the R2 bucket (acb-data) via the Pages Function at web/functions/r2/[[path]].ts. The matches/index.json file lists test matches, but the corresponding replay files were never uploaded to R2, causing 404 errors.

Solution

Two scripts are provided to generate and upload test replays:

1. generate-test-replays.sh

Generates all test replays that match the entries in web/public/data/matches/index.json:

bash scripts/generate-test-replays.sh

This creates test-replays/*.json.gz files with proper match IDs.

2. upload-test-replays.sh

Uploads the generated replays to the R2 bucket:

# Install wrangler first (one-time)
npm install -g wrangler
wrangler login

# Upload the replays
bash scripts/upload-test-replays.sh

Verification

After uploading, verify the replays are accessible:

curl -I https://r2.aicodebattle.com/replays/m_test_upset_v1.json.gz

Or test directly in the viewer: https://ai-code-battle.pages.dev/#/watch/replay?url=/r2/replays/m_test_upset_v1.json.gz

R2 Bucket Configuration

  • Bucket Name: acb-data
  • Binding: ACB_BUCKET (configured in web/wrangler.toml)
  • Custom Domain: r2.aicodebattle.com
  • Public URL: https://r2.aicodebattle.com/

Expected R2 Layout

acb-data/
├── replays/           # Match replay JSON files (gzipped)
│   ├── m_test_upset_v1.json.gz
│   ├── m_test_6p_v1.json.gz
│   └── ...
├── matches/           # Per-match metadata
├── thumbnails/        # Match thumbnails
├── cards/            # Bot profile cards
└── evolution/        # Evolution live feed

Error Handling

The replay viewer (web/src/pages/replay.ts) already has proper error handling:

  • Checks response.ok before parsing JSON
  • Displays user-visible error messages via showLoadError()

No additional error handling code is needed.