Commit Graph
58 Commits
Author SHA1 Message Date
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 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 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 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 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 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 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 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 d8e43d6843 fix: enforce webhook response size limits via named constants
readLimitedBody already enforces 10KB body limit. Answer truncation
(2000 chars) and trash_talk truncation (200 chars) now reference
named constants from lib/constants.ts.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 23:40:17 +00:00
DorianandClaude Opus 4.6 7c8e404cf1 refactor: extract magic numbers to named constants
Frontend: choreography selection ratios, morph trigger chances,
creator cameo/ultimate chances, dodge/counter probabilities.
Server: HP, K-factors, Elo divisor, tier thresholds, fight loop interval.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 23:34:05 +00:00
DorianandClaude Opus 4.6 7de503a487 refactor: explicit return types on all public functions
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 21:48:22 +00:00
DorianandClaude Opus 4.6 8d93abf36d refactor: separate challenge data from challenge logic
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 21:45:20 +00:00
DorianandClaude Opus 4.6 4d1e592365 refactor: standardize error handling with toError() helper
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 21:44:17 +00:00
DorianandClaude Opus 4.6 ea716c1f0e refactor: extract pick() helper, deduplicate random selection
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 21:42:11 +00:00
DorianandClaude Opus 4.6 9de36a9349 feat: 15 Bitcoin-themed arenas (40 total)
bitcoin_mine, lightning_node, satoshis_garage, mempool, silk_road_ruins,
block_height_tower, hodl_cave, whale_pool, node_farm, genesis_block,
pizza_day_parlor, difficulty_adjustment, fifty_one_percent,
timechain_temple, nostr_relay_room. Each with unique theme colors.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 21:22:37 +00:00
DorianandClaude Opus 4.6 fbaeeb5f93 feat: scale to 1,330 challenge prompts
Add 526 new prompts across all 16 challenge types with heavy
Bitcoin/cypherpunk themes. Factual types include multiple-choice
options. Separate file for maintainability, merged at runtime.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 21:14:26 +00:00
DorianandClaude Opus 4.6 d0f3780518 feat: scheduled daily and weekly tournaments
Lightning Round (daily 8-bot at noon UTC) and The Halvening
(weekly 32-bot Saturday 20:00 UTC). Auto-fills with mock bots,
runs matches via background loop.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 21:02:42 +00:00
DorianandClaude Opus 4.6 c0978ba4c8 feat: tournament engine with single-elimination brackets
Create, join, seed by Elo, generate bracket matches with byes,
advance rounds on fight completion, finish tournament on champion.
Wire into orchestrator fight finalization.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 20:57:23 +00:00
DorianandClaude Opus 4.6 f62323c59f refactor: structured logging across server
Create server/src/lib/logger.ts with info/warn/error methods that add
[botfights:tag] timestamps. Replace bare console.log/warn/error calls
in index.ts, seed.ts, routes/fights.ts, engine/queue.ts, engine/mock.ts.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 20:41:23 +00:00
DorianandClaude Opus 4.6 010e18fbd3 refactor: eliminate any types across server and TTS worker
- app.ts: type serveFile context parameter as Hono Context
- bets.ts: replace catch(err: any) with err: unknown + narrowing
- fight-loop.ts: type pickMatchup style as union literal, replace
  as any casts with proper result type
- tts-worker.ts: import KokoroTTS type, use ProgressInfo inference

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 20:34:11 +00:00
DorianandClaude Opus 4.6 156c727f82 feat: ranked queue Elo-bracket matchmaking and harder prompts
Elo-bracket matchmaking: prefer ±200, widen by 100 every 15s of waiting.
Add pickRankedChallenge() that filters to creative/open-ended only, never
multiple choice. Show ranked queue status, wait estimate, and "HARDER
PROMPTS" notice on JoinBoutPage.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 20:18:23 +00:00
DorianandClaude Opus 4.6 ecac2bf246 feat: season framework with 2-week auto-rotation
Create seasons engine with getCurrentSeason(), getSeasonLeaderboard(),
and resetSeasonElo(). 20 Bitcoin-themed season names. Add currentSeason
column to fights table, set on fight creation. Elo soft-reset formula:
finalElo * 0.6 + 1200 * 0.4.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 20:13:44 +00:00
DorianandClaude Opus 4.6 7761f713d7 feat: publish notable fight results to Nostr relays
NIP-01 kind:1 notes posted for KOs, perfects, upsets, and big Elo
swings. Includes bot names, Elo changes, arena, and replay link.
Configurable via BOTFIGHTS_NOSTR_RELAYS and BOTFIGHTS_NOSTR_NSEC env
vars. Silently skips if NSEC not set.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 20:01:11 +00:00
DorianandClaude Opus 4.6 005a7942fb feat: wire bet settlement into fight finalization
Lock bets when fight goes live, settle all bets atomically when fight
ends. Winners get Cashu payout tokens, losers forfeit. Draws refund
all bets. Settlement results persisted to bets table.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 19:57:00 +00:00
DorianandClaude Opus 4.6 e12fb94ae7 feat: omni-morph sprite swap, bullet time showboats, music tuning, server hardening
- Creator omni-morph now generates actual sprite sheets for morphed archetypes
- 3 new Creator showboats: bullet time attack, ₿ throne summon, disco dance
- Music: subtle tempo shift (+10 BPM max), longer phrases (8/16/24 bars),
  smoother crossfades, less chaotic hi-hat at high intensity
- Server: security headers, body size limit, production error masking,
  CORS origin warning, graceful shutdown with drain
- Payments: atomic consume (eliminates SELECT/UPDATE race), release reverts DB
- Fight loop: round events for live TUI, retro displayPrompt
- Frontend: pass pubkey in payment/queue requests

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 16:23:47 +00:00
DorianandClaude Opus 4.6 9287fd1783 fix: TTS sentence cutoff + simplified retro challenge prompt
TTS fixes:
- Remove 60-char truncation in FightViewer — let speakAnswer handle limits
- Smart truncation at sentence boundaries (period, comma, etc.) up to 200 chars
- Chrome keepalive: periodic pause/resume prevents silent 15s cutoff bug
- Deduplicated cleanup logic in speakAsync/speakAsyncWithRate

Retro mode:
- Simplified challenge prompt from verbose wall of text to clean 3-line format

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 15:32:29 +00:00
DorianandClaude Opus 4.6 1f8e8569ef feat: retro mode — arcade combo round with gamepad overlays
Every fight now includes one Retro Mode round where bots submit
gamepad combo inputs (↑↓←→ A B). 24 moves across 4 tiers: basic
(always shown), standard (partially revealed), super (must discover),
and ultra (KONAMI CODE for 50 dmg). Discovery bonus gives 1.5x damage.

Includes pixel-art gamepad overlays (P1/P2) with animated button
presses, retro-specific narrations, and mock bot combo responses
scaled by ELO.

Also adds loops/plan.md with 11-phase production hardening roadmap.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 14:13:47 +00:00
DorianandClaude Opus 4.6 6d390f69b2 feat: THE CREATOR god-tier character, bitcoin choreographies, omni-morph, cameos
- Guy Fawkes mask archetype with golden outline, bitcoin chest symbol, laptop, tier-gated effects
- 12 custom bitcoin-themed choreographies (8 regular + 4 exclusive ultimates)
- Omni-morph system: creator morphs into any of 80+ archetypes instead of cycling 3
- 6% per-round cameo in non-creator fights — drops golden ₿ gifts to fighters
- Custom golden code rain entrance with persistent orbiting particles
- pickChoreography: 50% ultimate chance (100% on crits), all tier ultimates + 4 exclusive
- Server auto-assigns the_creator archetype on login/register for creator pubkey
- FightViewer, payments, queue, orchestrator improvements

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 12:08:18 +00:00
DorianandClaude Opus 4.6 673961580c fix: defer wallet encryption key check so server starts without it
Move crypto key init from module-level throw to lazy getKey() — only
errors when encrypt/decrypt are actually called. Downgrade env var
check in index.ts from fatal exit to warning.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 10:43:30 +00:00
DorianandClaude Opus 4.6 f6eb7d2845 feat: v5 — boxing poster fight cards, 12-char names, diverse mock bots
- Fight Card page: dramatic poster background with cross-hatch, spotlights,
  vignettes, corner brackets, scan lines; 3D VS orb with punch animation;
  selectable undercard with main event always pinned at top
- PosterSprite: high-quality 480px poster frame with 6-pass renderer
  (aura, glow, bevel, specular, particles); PixelGlove component
- 12-char bot name limit across all forms and server validation
- Mock bots: all 100 now have diverse archetypes (25 types), 25% human
  fighters; seedMockBots updates existing bots on restart
- Leaderboard: inline SpritePreview next to each bot name
- Nostr auth: persistent login, nsec copy button
- Wallet: NWC + Lightning Address, ranked fight flow
- Server: payments, ranked queue, customization endpoint

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 10:33:30 +00:00
DorianandClaude Opus 4.6 e046cb13eb feat: ranked queue + orchestrator payout wiring
Add ranked-queue.ts with 60s timeout, ELO matching, no-mock guard, and
automatic refund on timeout. Wire orchestrator to accept mode param,
track satsWagered in finalize transaction, trigger payWinner on ranked
win and refundEntry on ranked draw.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 01:24:26 +00:00
DorianandClaude Opus 4.6 abe5040742 feat: payment engine — NWC Lightning + Cashu ecash for ranked fights
Implements createEntryInvoice, checkPaymentStatus, payWinner, refundEntry,
redeemCashuToken, and recoverOrphanedPayments. Uses nostr-tools for NWC
protocol (NIP-47) and @cashu/cashu-ts for ecash fallback payouts.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 01:22:27 +00:00
DorianandClaude Opus 4.6 a254a77151 feat: betting system — Cashu escrow, Lightning deposit/withdraw, payouts
Complete betting infrastructure:
- Bets schema (SQLite) with escrow status tracking
- Cashu token verification + minting (stub for real mint)
- Lightning invoice creation + withdrawal (stub for real LN node)
- Bet placement with odds lock, settlement on fight end
- Payout automation for winners, refunds on draws
- Bet history by pubkey + fight pool info
- Verifiable bet proofs for transparency
- API routes: /api/bets/{odds,place,fight,history,deposit,withdraw}

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 00:33:08 +00:00
DorianandClaude Opus 4.6 6ede5da675 feat: odds calculation engine — ELO-based betting odds with house edge
Converts ELO ratings + streaks + recent form into betting odds.
Supports decimal, fractional, and American formats.
Includes bet validation, payout calculation, and 27 tests.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 00:30:57 +00:00
DorianandClaude Opus 4.6 3b8208be08 feat: computed achievement system — 20 achievements derived from bot stats
Achievements computed on-the-fly from existing stats + fight history:
win milestones, streaks, tiers, ELO, perfect/KO wins, resilience, activity.
Wired into /api/bots/:name/stats endpoint.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 00:24:18 +00:00
DorianandClaude Opus 4.6 728afacc5c test: add mock and arena tests — 21 more tests (86 total)
- mock.test.ts: 7 tests for ELO-weighted response quality, failure rates, timing
- arenas.test.ts: 14 tests for arena data integrity, pickArena, randomArena

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 23:58:41 +00:00
DorianandClaude Opus 4.6 f837153771 test: add 65 server engine tests — answers, scoring, challenges
- answers.test.ts: 19 tests covering all 10 checkAnswer() tiers
- scoring.test.ts: 30 tests for scoreRound, calculateElo, calculateTier, applyModifiers
- challenges.test.ts: 16 tests for pickChallenge, type exclusion, data integrity

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 23:55:36 +00:00
DorianandClaude Opus 4.6 a4008bcf88 fix: scoring & game logic bugs — arena modifiers, human timeout, validated prompts
- scoring.ts: wire arena damage modifiers (speed_2x, roast_2x, etc.) into applyModifiers()
- human-responses.ts: use challenge.timeout_ms instead of hardcoded 8s
- FightPage.vue: add route watcher for clean state reset on navigation
- Validated all 800 prompts: 0 duplicates, all factual have answers, all choices have 4 items

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 23:43:08 +00:00
DorianandClaude Opus 4.6 4307a02d25 fix: server crash from syntax error in challenges.ts, voice overlap, human fight UX
- Remove stray duplicate template block outside TEMPLATES array that caused parse error preventing server startup (fixes /api/queue/status 500)
- Add choices field to Challenge/PromptEntry interfaces for multiple choice support
- Allow voice lines to overlap naturally instead of cancelling previous speech on every call, with safety flush at depth > 3
- Buffer challenges during cooldown in polling path, auto-submit random choice on timeout
- Block auto-battle for human fights, guard replay-done auto-transition

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 21:15:42 +00:00
DorianandClaude Opus 4.6 4b46aaf643 feat: mobile human vs AI — multiple choice, two-row VS bar, responsive arena
- Server-side choice generation for all 22 challenge types (factual + creative)
- Mobile: 3 multiple-choice buttons replace keyboard input (4s timer)
- Two-row VS bar on mobile (names row + HP bars row) in FightPage and FightViewer
- Battle log hidden on mobile to maximize canvas visibility
- Arena page responsive: stacking header, tighter fight cards, no name overflow
- Profile page two-column desktop layout with contained sprite display
- Human fighter sprites with baby growth system

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 19:42:49 +00:00
DorianandClaude Opus 4.6 1906821452 fix: human fight UX — SSE challenge input, fighter sprites, battle log questions, left-side positioning
- Add SSE human_challenge listener for instant input activation with auto-focus
- Buffer challenges during 3s round cooldown, apply with correct remaining time
- Map 'human' archetype to fighter-looking archetypes (boxer, ninja, etc.) in sprite system
- Show challenge questions in battle log via round_start SSE events
- Ensure human players are always botA (left side) in queue matchmaking

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 15:46:16 +00:00
DorianandClaude Opus 4.6 8448f1d823 feat: human vs AI mode — live typing challenges, baby growth system, SSE rounds
- Add choose-mode step: "I BUILD BOTS" vs "I FIGHT MYSELF" paths
- Human registration with baby avatar picker, no webhook required
- Live fight scene with SSE round streaming and real-time challenge UI
- 5-second timer per round, submit answers via browser
- Baby → toddler → kid → teen → adult → hero → super growth stages
- Huge sparkly baby eyes, diapers, pacifiers, bibs, rattles, rosy cheeks
- Speech bubble positioning fix (pushed to outside of sprite)
- Canvas text rendering via offscreen canvas to bypass kaplay color issues
- Voice timing improvements: await pauses between voice lines and hits
- 30 devastating announcement lines, 15 critical/hit word variants
- Orchestrator human player detection + waitForHumanResponse system
- Server endpoints: GET /challenge/:botId, POST /respond/:botId
- Human player auth: register-human route, isHuman flag on login

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 15:20:14 +00:00