Commit Graph
181 Commits
Author SHA1 Message Date
DorianandClaude Opus 4.6 5ee6b6c88c fix: fight restart bug, mobile TTS, character sizing, bitcoin symbols
- Fix fight replay showing empty scene: validate rounds before playing,
  retry loading fight data up to 5 times when rounds are missing
- Add COOP/COEP headers to production server for SharedArrayBuffer
  (required by Kokoro TTS WASM threading on mobile)
- Add blob: to scriptSrc/workerSrc CSP for Web Worker support
- Fix mobile character cutoff: raise ground line to 0.82, add
  MOBILE_SCALE_CAP (0.55) so fighters never shrink too small
- Add ₿ bitcoin chest badge to all fighter sprites (scales with tier)
- Add sats coin stack on bot profile page proportional to satsWon
- Seed dev tournament with 8 mock bots on startup (dev mode only)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 08:21:16 +00:00
DorianandClaude Opus 4.6 a10c1c9cb6 feat: add 112 PC culture-themed prompts across all 16 challenge types
Satirical and irreverent — cancel culture, DEI absurdity, trigger
warnings, virtue signaling, safe spaces. Mocking the absurdity,
never punching down.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 08:20:10 +00:00
DorianandClaude Opus 4.6 bec75e0e82 feat: add 112 conspiracy-themed prompts across all 16 challenge types
Satirical and fun conspiracy culture humor — MK-Ultra, Area 51,
flat earth, tinfoil hats, Bigfoot, UFOs, surveillance. Never endorsing.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 08:17:47 +00:00
DorianandClaude Opus 4.6 7d699b2ed3 feat: add 160 Bitcoin-themed prompts across all 16 challenge types
10 prompts per type covering Bitcoin history, mining, Lightning,
privacy, culture, memes, riddles, and technical knowledge.
Total prompts: 1,485 (253 Bitcoin-themed).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 08:15:31 +00:00
DorianandClaude Opus 4.6 cb5e5a1cc9 test: add theme selection and prompt tagging verification tests
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 08:11:08 +00:00
DorianandClaude Opus 4.6 0c6a775e30 feat: tag all 1,325 prompts with theme (bitcoin/conspiracy/pc_culture/bot_coding)
93 bitcoin, 2 conspiracy, 1 pc_culture, 1,229 bot_coding.
Most existing prompts are tech/general knowledge (bot_coding).
Theme-aware pickChallenge now has data to filter on.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 08:10:12 +00:00
DorianandClaude Opus 4.6 070e41f97b test: verify all factual answers work with checkAnswer, fix 2 data bugs
- Hash rate question: added ×10^20 notation to answers array
- Phishing question: added correct MC choice text to answers array
- New tests: self-match, case-insensitive, MC correctness validation

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 08:07:17 +00:00
DorianandClaude Opus 4.6 a4b4963c32 feat: add difficulty field to prompts and wire into fight pacing
Round 1-2 picks easy prompts, 3-4 medium, 5+ hard (when tagged).
Graceful fallback to any prompt when no difficulty-tagged prompts exist.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 08:05:21 +00:00
DorianandClaude Opus 4.6 8d0eb4b5f9 feat: add narrations for all 16 challenge types, eliminate generic fallback
Add dedicated narrations for: magic_duel, sports_showdown, vehicle_mayhem,
nature_clash, animal_kingdom, hack_battle (6 per type, 36 new narrations).
All 16 challenge types now have themed narrations — no generic fallback needed.
Add narration variety test verifying >1 unique narration per type.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 08:00:06 +00:00
DorianandClaude Opus 4.6 493983ccc0 fix: prevent fight view scrolling on mobile with tab bar
All pages used h-[calc(100dvh-4rem)] which only subtracted the top
navbar but ignored the mobile tab bar's pb-14 bottom padding, causing
content to overflow and scroll. Changed all pages to h-full so they
fill the flex parent (main element) which already handles both the
navbar and tab bar spacing correctly.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 07:57:37 +00:00
DorianandClaude Opus 4.6 3b863d1f5f feat: add theme system, improve creative scoring spam detection
Theme system (Section 5.1):
- Add PromptTheme type ('bitcoin' | 'conspiracy' | 'pc_culture' | 'bot_coding')
- Add optional theme field to PromptEntry interface
- pickChallenge now accepts optional theme bias, picks target theme with
  30/20/20/30 distribution, prefers themed prompts when available
- challenges-extra.ts now imports PromptEntry type from challenge-data.ts

Creative scoring improvements (Section 7.2):
- Detect repeated phrases via trigram analysis (>25% duplicate = spam)
- Detect question echo (answer copies prompt back)
- Detect all-caps spam (>80% uppercase letters)
- Detect punctuation-only spam (<30% letter content)
- Minimum word count threshold (< 3 words = low score)
- 5 new tests: repeated phrases, question echo, all-caps, short answer, legit short

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 07:56:51 +00:00
DorianandClaude Opus 4.6 2ceef08f55 feat: add CI workflow, lifecycle integration tests, and mark completed plan items
- Add GitHub Actions CI: test, typecheck, lint on push/PR to main
- Add fight lifecycle integration tests: full pipeline, ELO advantage,
  combo scaling, type exhaustion, answer verification (7 tests)
- Kaplay already lazy-loaded via route-level code splitting
- Total: 135 tests across 7 test files

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 07:53:40 +00:00
DorianandClaude Opus 4.6 4074ef94eb feat: add leaderboard cache, performance benchmarks, and verify SSE cleanup
- Add 30s TTL leaderboard cache with invalidation on fight completion
- Add scoreRound performance benchmark: 1000 rounds in <100ms
- Add checkAnswer performance benchmark: 1000 checks in <50ms
- Add adversarial regex backtracking test for checkAnswer
- Verify SSE cleanup: connections, IP counters, spectator counts, event listeners
  all properly decremented in finally block on disconnect

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 07:50:46 +00:00
DorianandClaude Opus 4.6 7d9b8b1dbf chore: add ESLint with no-floating-promises and no-console rules
Sets up ESLint 10 flat config with @typescript-eslint/no-floating-promises (error)
and no-console (warn, allow warn/error). Fixes all floating promise errors in
server routes, orchestrator reader cleanup, and frontend composables with void operator.
Game engine files get warning-level for intentional fire-and-forget async.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 07:47:43 +00:00
DorianandClaude Opus 4.6 5007d009fe test: add unit tests for challenge distribution, ranked challenges, answer edge cases, and mock bot coverage
Covers plan section 4.1: pickChallenge 70/30 distribution, pickRankedChallenge never returns choices,
True/False auto-generation, special characters and long answers, all 16 challenge types produce valid
mock responses, and timeout/error answer verification. 113 → 125 tests.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 07:42:55 +00:00
DorianandClaude Opus 4.6 46d560af24 fix: replace TTS FIFO cache with LRU eviction, add database indexes
TTS audioCache now tracks lastAccess timestamp per entry and evicts
the least-recently-used entry when full (was FIFO, deleting commonly
used phrases). Adds 6 new database indexes for bets, bot type/active
filtering, payment status lookups, and tournament entries.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 07:38:04 +00:00
DorianandClaude Opus 4.6 fbc61ef154 fix: add amount validation for zap and bet endpoints
Validate amountSats is a positive integer (1–1,000,000) on both
/zap and /bets/place endpoints to prevent negative, zero, or
absurdly large amounts.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 07:34:51 +00:00
DorianandClaude Opus 4.6 22b428d222 chore: harden .gitignore for secrets and credentials
Add wildcard .env* exclusion, PEM/key/cert patterns.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 07:33:56 +00:00
DorianandClaude Opus 4.6 5bfb63aa7f fix: add input validation, Zod schemas, rate limiting, and IP trust
- Add Zod schema for webhook response parsing (orchestrator.ts)
- Add Zod schemas for POST /respond and /react request bodies
- Add safe integer validation for batch count param
- Prefer cf-connecting-ip over spoofable x-forwarded-for
- Add ID format validation on URL params
- Add rate limiting on /auth/login (30/min) and /update (10/min)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 07:30:49 +00:00
DorianandClaude Opus 4.6 276cbd6e31 refactor: replace all hardcoded numbers in scoring.ts with named constants
All magic numbers in scoring.ts now reference constants from
lib/constants.ts: damage multipliers, score thresholds, quality
parameters, narration margins, and rounding factors.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 07:26:50 +00:00
DorianandClaude Opus 4.6 1d6826c6e2 test: update arena count assertion from 25 to 40
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 07:21:19 +00:00
DorianandClaude Opus 4.6 7b82803868 fix: allow Google Fonts in CSP so 3D announcement font loads in production
fontSrc blocked fonts.gstatic.com and styleSrc blocked fonts.googleapis.com,
causing Honk font to fail in production. The chromatic aberration pseudo-elements
then appeared as doubled plain text instead of a styled 3D effect.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 07:18:57 +00:00
DorianandClaude Opus 4.6 b28d0b220e refactor: extract arena renderer and showboat system from FightScene.ts
- drawArenaDecor (1,234 lines) → fight/arena-renderer.ts
- showboat/taunt system (870 lines) → fight/showboats.ts
- FightScene.ts: 3,468 → 1,266 lines (scene setup + orchestration only)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 06:38:46 +00:00
DorianandClaude Opus 4.6 b6033a90e5 refactor: extract pickChoreography to fight/choreography/picker.ts
Moves 103 lines of choreography selection logic out of FightScene.ts
into a dedicated module. FightScene re-exports for backward compat.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 06:31:22 +00:00
DorianandClaude Opus 4.6 38d7236be3 refactor: eliminate more any types in FightScene, FightViewer, FightPage
Replace any[] with GameObj[], fighter: any with Fighter in speech
bubbles, talking anims, showboat system, bow/fistbump/helpup, and
dizzy stars. Fix customization as any casts with ?? undefined.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 06:29:09 +00:00
DorianandClaude Opus 4.6 a86d39b982 refactor: replace 97 any types in fight system with Fighter/GameObj
- fighter: any → Fighter in entrances, morphs, finishers, rounds, types
- any[] → GameObj[] for spawned game objects across all choreography files
- as any cast in particles.ts replaced with closure variables
- Record<string, unknown> for morph sprite opts
- this: any → this: GameObj in basic choreography callback

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 06:26:33 +00:00
DorianandClaude Opus 4.6 81048ff22f fix: make vhsTracking accept ChoreoContext directly, remove as any cast
Effect functions now accept FightContext | ChoreoContext union type,
eliminating the unsafe cast in rounds.ts.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 06:21:06 +00:00
DorianandClaude Opus 4.6 86bf534f50 fix: type safeColor return in ChoreoContext using Kaplay Color type
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 06:19:55 +00:00
DorianandClaude Opus 4.6 945a776a5a refactor: extract shared FightData interface to fight/types.ts
Move FightData, FightRound, FightBot, FightArenaInfo types from local
definitions in FightViewer.vue to shared fight/types.ts. Replace `any`
typing in HumanFightPage, FightPage, useFightPolling, and useFightCache
with proper typed interfaces. Fix null-safety guards exposed by typing.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 06:19:26 +00:00
DorianandClaude Opus 4.6 2f7c10e4b8 fix: defer analytics prepared statements to avoid crash before migrations
The sqlite.prepare() calls ran at module import time, before
runMigrations() created the analytics table, causing a crash loop.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 01:05:47 +00:00
DorianandClaude Opus 4.6 bd44d5562f chore: final smoke test passed — ready for launch
All end-to-end flows verified: registration, fight queue, SSE
spectating, leaderboard, bot profiles, wallet connect (NWC/LN/Cashu),
admin dashboard, background fight loop, seed/migrations, tournaments.
10 API routers mounted, all endpoints wired and typechecked.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 00:47:11 +00:00
DorianandClaude Opus 4.6 f759bb2161 test: infrastructure launch checklist passed
Verified: SQLite WAL mode, rate limiting (60/min/IP), SSRF blocking
(private IPs, localhost, reserved TLDs), 256KB body limit, security
headers (CSP, X-Frame-Options, HSTS), graceful shutdown (10s drain),
daily backups (7 rotation), monitoring alerts (200/300MB thresholds)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 00:45:55 +00:00
DorianandClaude Opus 4.6 fae41e72ea test: frontend launch checklist passed
Verified: 18 pages load, mobile responsive (44px touch targets,
bottom nav), initial bundle ~150KB gzip, Kokoro TTS lazy-loaded
in Worker, SSE reconnects with exponential backoff, perf mode
auto-detects + persists, reduced motion respected

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 00:44:52 +00:00
DorianandClaude Opus 4.6 f964274c02 test: payments launch checklist passed
- Added 'consumed' to payment status enum (was missing from schema)
- Fixed orphan recovery to also find 'consumed' payments on restart
- Verified: NWC + Lightning Address wallet connect, invoice creation,
  21-sat entry fee, 42-sat winner payout, Cashu tokens, bet settlement,
  refund on cancelled/timeout, stuck payment recovery

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 00:43:16 +00:00
DorianandClaude Opus 4.6 50b85f5171 test: fight engine launch checklist passed
Verified: 17 challenge types with complete scoring, Elo (K=32/12),
7 tiers with dual thresholds, mock bot fights, background loop,
THE CREATOR features (entrance, omni-morph, cameo, 13+4 moves)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 00:40:17 +00:00
DorianandClaude Opus 4.6 4260dfddfd test: Docker build and PWA installation verified
- Verified multi-stage Dockerfile builds successfully (pnpm build passes)
- Improved .dockerignore for smaller build context
- Graceful shutdown wired: SIGTERM/SIGINT drain active fights (10s timeout)
- Migrations + mock bot seeding run on startup automatically
- PWA: manifest, service worker, icons, offline caching all configured
- Workbox caches app shell + fonts + TTS model, excludes API routes

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 00:38:31 +00:00
DorianandClaude Opus 4.6 69601cce3a feat: automated backup and production monitoring
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 00:33:35 +00:00
DorianandClaude Opus 4.6 d7d04eb2d7 test: load testing script
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 00:30:43 +00:00
DorianandClaude Opus 4.6 6e092ee7be feat: offline resilience and connection status
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 00:27:05 +00:00
DorianandClaude Opus 4.6 627a1a0d9e perf: CDN-ready caching headers and compression
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 00:24:48 +00:00
DorianandClaude Opus 4.6 aca025a360 feat: mobile UX polish with haptics and reduced motion
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 00:23:39 +00:00
DorianandClaude Opus 4.6 8be71e9929 fix: admin and docs bugs
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 00:20:00 +00:00
DorianandClaude Opus 4.6 c654ff9f73 feat: interactive bot developer documentation
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 00:18:06 +00:00
DorianandClaude Opus 4.6 e10c1dc8aa feat: privacy-respecting analytics
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 00:15:20 +00:00
DorianandClaude Opus 4.6 2170e9275c feat: admin dashboard for THE CREATOR
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 00:12:36 +00:00
DorianandClaude Opus 4.6 e3a4299dae perf: server memory leak audit
Add periodic cleanup of fightReactions Map (clears when >100 entries).
Add RSS/heap logging every 10 fights in fight-loop for memory monitoring.
Set --max-old-space-size=256 in Docker CMD as safety net.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 00:05:03 +00:00
DorianandClaude Opus 4.6 c8e4fa7a95 perf: SQLite WAL mode and indexes
Add PRAGMA synchronous=NORMAL, temp_store=MEMORY, mmap_size=256MB for
better write throughput and query performance. Create 11 indexes on
commonly queried columns (fights.status, fights.created_at, bots.elo,
rounds.fight_id, payments, tournament_matches). Run PRAGMA optimize
on startup for query planner statistics.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 00:02:47 +00:00
DorianandClaude Opus 4.6 5af5ee1cba perf: adaptive performance mode for mobile
Auto-detect low-end devices (< 4 cores or touch) and reduce visual
complexity: 60% fewer particles, 6 vs 16 speed lines, 15 vs 40 stars,
halved datacenter buildings/racks, skip LED blinking animations,
fewer GPU graveyard chips, reduced afterimages and exhaust particles.

Toggle in fight viewer (LO/HI button), persisted in localStorage.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 00:00:48 +00:00
DorianandClaude Opus 4.6 78f83a7520 perf: fight replay memory leak fixes
Replace 32 bare setTimeout calls with tracked timeouts across all fight
modules (effects, entrances, finishers, choreographies). All timers are
now registered in cleanupTimers Set and cleared on scene destroy.

Enhanced destroy() to also clean up active speech bubbles and explicitly
destroy all remaining game objects before k.quit().

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 23:55:58 +00:00
DorianandClaude Opus 4.6 57703a28ad refactor: remove dead code
Remove 38 unused audio/announce imports from FightScene.ts left over
from the module extraction. All functions are still used by the
extracted modules which import them directly.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 23:46:30 +00:00