๐ŸŽฎ Sister Brawl โ€” Deep Architecture Audit#

Date: 2026-06-04 (updated from 2026-05-31) Auditor: Hermes (OWL) Scope: Full-stack audit โ€” frontend, backend, config, deploy, docs, fun audit v2 Game ID: sisterbrawl (alias: sister-brawl)


๐Ÿ“‹ Table of Contents#

  1. Executive Summary
  2. Architecture Overview
  3. Frontend Game Code
  4. Nakama Match Handler
  5. K8s & Monitoring Deploy
  6. Known Issues & Fixes
  7. Perfection Cycle โ€” What’s New
  8. Operational Runbooks
  9. Doc Map

1. Executive Summary#

AreaStatusNotes
Game Configโœ… Solidfunday-plugin.json complete, allowSoloAutostart: true
Frontend Componentsโœ… Complete~2,500 LOC across 14 files (incl. TutorialOverlay)
Game Storeโœ… Complete507 LOC, Svelte 5 runes, prediction, interpolation, damage numbers, progression
Nakama Handlerโœ… Complete~1,491 LOC, 60Hz, physics, combat, replay, spectating, progression, character specials
Metricsโœ… Complete4 metrics, Grafana, 3 Prometheus alerts
K8s Manifestsโœ… CompleteConfigMap, NetworkPolicy, PDB, CronJob, Service + sidecar
Dockerfileโœ… CompleteMulti-stage, metrics scripts
Live Renderingโœ… WorkingSolo mode + MP, 2D canvas at 1280ร—493, 60fps
Fun Score๐ŸŸก 3.4/5Up from 2.8 โ€” see Fun Audit v2

2. Architecture Overview#

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ Browser (Client)                                        โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”‚
โ”‚  โ”‚  Game.svelte (~1,285 LOC)                         โ”‚  โ”‚
โ”‚  โ”‚  โ”œโ”€โ”€ Threlte <Canvas> โ†’ 3D arena + entities       โ”‚  โ”‚
โ”‚  โ”‚  โ”œโ”€โ”€ 2D Canvas fallback (solo/headless)           โ”‚  โ”‚
โ”‚  โ”‚  โ”œโ”€โ”€ gameStore.svelte.ts (507 LOC)                โ”‚  โ”‚
โ”‚  โ”‚  โ”‚   โ”œโ”€โ”€ Client-side prediction + reconciliation   โ”‚  โ”‚
โ”‚  โ”‚  โ”‚   โ”œโ”€โ”€ Entity interpolation (lerp)               โ”‚  โ”‚
โ”‚  โ”‚  โ”‚   โ”œโ”€โ”€ Hit-stop (freeze-frame on big hits)       โ”‚  โ”‚
โ”‚  โ”‚  โ”‚   โ”œโ”€โ”€ Floating damage numbers                   โ”‚  โ”‚
โ”‚  โ”‚  โ”‚   โ””โ”€โ”€ Progression data (XP/levels)              โ”‚  โ”‚
โ”‚  โ”‚  โ”œโ”€โ”€ spectatorStore.ts (175 LOC)                   โ”‚  โ”‚
โ”‚  โ”‚  โ”œโ”€โ”€ audio.ts (250 LOC) โ€” layered music + 14+ SFX โ”‚  โ”‚
โ”‚  โ”‚  โ”œโ”€โ”€ particleSystem.ts (80 LOC)                    โ”‚  โ”‚
โ”‚  โ”‚  โ”œโ”€โ”€ screenShake.ts (119 LOC)                      โ”‚  โ”‚
โ”‚  โ”‚  โ””โ”€โ”€ UI: CharacterSelect, HUD, Results, Replay     โ”‚  โ”‚
โ”‚  โ”‚       SpectatorViewport, TutorialOverlay (NEW)     โ”‚  โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ”‚
โ”‚                    โ†• Nakama WebSocket                    โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                         โ”‚
                         โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ Nakama Server (K3s)                                     โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”‚
โ”‚  โ”‚  match_handler.ts (~1,491 LOC)                    โ”‚  โ”‚
โ”‚  โ”‚  โ”œโ”€โ”€ 60Hz tick โ†’ input โ†’ physics โ†’ broadcast      โ”‚  โ”‚
โ”‚  โ”‚  โ”œโ”€โ”€ 6 character definitions + balance            โ”‚  โ”‚
โ”‚  โ”‚  โ”œโ”€โ”€ Character-specific specials (NEW)             โ”‚  โ”‚
โ”‚  โ”‚  โ”‚   โ”œโ”€โ”€ Ember: Fireball + burn DOT               โ”‚  โ”‚
โ”‚  โ”‚  โ”‚   โ”œโ”€โ”€ Frost: Ice Wall obstacle                 โ”‚  โ”‚
โ”‚  โ”‚  โ”‚   โ”œโ”€โ”€ Volt: Dash Strike AoE                    โ”‚  โ”‚
โ”‚  โ”‚  โ”‚   โ”œโ”€โ”€ Shade: Teleport Crit                     โ”‚  โ”‚
โ”‚  โ”‚  โ”‚   โ”œโ”€โ”€ Terra: Ground Pound stun                 โ”‚  โ”‚
โ”‚  โ”‚  โ”‚   โ””โ”€โ”€ Aqua: Water Shield reflect + heal        โ”‚  โ”‚
โ”‚  โ”‚  โ”œโ”€โ”€ Kill threshold match end (10 kills)          โ”‚  โ”‚
โ”‚  โ”‚  โ”œโ”€โ”€ Dramatic finish (last 10s slow-mo)            โ”‚  โ”‚
โ”‚  โ”‚  โ”œโ”€โ”€ XP/Level progression (Nakama storage)         โ”‚  โ”‚
โ”‚  โ”‚  โ”œโ”€โ”€ Replay recording (10 Hz, Nakama storage)      โ”‚  โ”‚
โ”‚  โ”‚  โ”œโ”€โ”€ Free camera spectator mode                    โ”‚  โ”‚
โ”‚  โ”‚  โ””โ”€โ”€ 3 RPCs: replay, metrics, spectate            โ”‚  โ”‚
โ”‚  โ”‚                                                     โ”‚  โ”‚
โ”‚  โ”‚  metrics.ts (187 LOC)                              โ”‚  โ”‚
โ”‚  โ”‚  โ””โ”€โ”€ 4 Prometheus metrics                          โ”‚  โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”‚
โ”‚  โ”‚  Metrics Sidecar (Python, :9101)                  โ”‚  โ”‚
โ”‚  โ”‚  โ””โ”€โ”€ Polls RPC โ†’ serves Prometheus text            โ”‚  โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

3. Frontend Game Code#

File Inventory#

FileLOCPurpose
src/Game.svelte~1,285Main game โ€” Threlte canvas, 2D fallback, platform bus, input loop, hit-stop, damage numbers
src/stores/gameStore.svelte.ts507Reactive store โ€” prediction, interpolation, replay, hit-stop, damage numbers, progression
src/stores/spectatorStore.ts175Spectator mode โ€” free camera, interpolation
src/lib/audio.ts250Procedural Web Audio โ€” layered music (100โ†’140 BPM ramp), 14+ SFX, volume persistence
src/lib/particleSystem.ts80Data-only particle pool (200 max)
src/lib/screenShake.ts119Stackable screen shake, quadratic decay
src/components/CharacterSelect.svelte99Character grid, ability tooltips, ready
src/components/GameHUD.svelte133HP bars, scores, controls hint, mute
src/components/CountdownOverlay.svelte47Animated 3-2-1-FIGHT!
src/components/ResultsOverlay.svelte~170MVP card, scoreboard, K/D/A, rematch, XP progression
src/components/ReplayControls.svelte120Seek, speed, play/pause
src/components/SpectatorViewport.svelte320Free camera 3D viewport
src/components/TutorialOverlay.svelte~90NEW โ€” 3-step first-fight onboarding
src/types/index.ts253Entity, Character, Match types

Character Roster#

IDNameHPSpeedATKSPLAbility
emberEmber1005.0820Fireball + burn DOT (2 DPS, 3s)
frostFrost904.5725Ice Wall (blocks movement/projectiles, 10s)
voltVolt806.0618Dash Strike AoE (chains to nearby enemies)
shadeShade855.5922Teleport behind enemy + guaranteed crit
terraTerra1303.51230Ground Pound AoE stun (1s)
aquaAqua955.0715Water Shield (reflect projectiles + heal 15 HP)

4. Nakama Match Handler#

Opcodes#

OpcodeValueDirectionPurpose
STATE_UPDATE1Sโ†’CFull state broadcast
GAME_OVER2Sโ†’CMatch ended (now includes progression data)
ERROR3Sโ†’CError message
PLAYER_JOINED4Sโ†’CPlayer joined
READY5BothReady toggle
COUNTDOWN6Sโ†’CCountdown tick
MATCH_START7Sโ†’CMatch started
CHARACTER_SELECT8BothCharacter selection
SCORE_UPDATE9Sโ†’CScore/kill
SPECTATOR_JOINED10Sโ†’CSpectator notif
INPUT100Cโ†’SPlayer input

Game Constants#

ConstantValue
TICK_RATE60 Hz
MATCH_TIMEOUT300s (18,000 ticks)
KILL_THRESHOLD10 kills (immediate win)
ARENA_SIZE56ร—56 (ยฑ28)
GRAVITY-20 m/sยฒ
ATTACK_RANGE1.5 units
ATTACK_COOLDOWN15 ticks (250ms)
SPECIAL_COOLDOWN90 ticks (1.5s)
JUMP_VELOCITY10 m/s
KNOCKBACK8 m/s
HITSTUN20 ticks (333ms)
BLOCK_REDUCTION80%

New: Character Specials (Server-Side)#

All 6 characters now have unique special abilities on the server:

  • Ember: Fireball projectile with burn DOT (2 DPS, 3s)
  • Frost: Ice Wall obstacle (blocks movement/projectiles, 10s lifetime)
  • Volt: Dash Strike AoE (damage + chain to all enemies within 4 units)
  • Shade: Teleport behind nearest enemy + guaranteed 2x crit
  • Terra: Ground Pound AoE (damage + 1s stun in 5-unit radius)
  • Aqua: Water Shield (reflects nearby projectiles + self-heal 15 HP)

New: Progression System#

  • XP per match: 10 base + 5 per kill + 10 win bonus
  • Streak bonus: 3+ win streak = 2x XP
  • Levels: 100 XP per level
  • Stored in Nakama storage: collection=“progression”, key="{userId}/xp"
  • Included in GAME_OVER payload for client display

New: Match End Conditions#

  • Kill threshold: First team to 10 kills wins immediately
  • Timeout: 5-minute fallback (team with most kills wins)
  • Dramatic finish: Last 10 seconds when kill leader โ‰ฅ 8 (client indicator)

5. K8s & Monitoring Deploy#

ResourceNamePurpose
ConfigMapsisterbrawl-configGame metadata
NetworkPolicysisterbrawl-network-policyNakama โ†” game traffic
PDBsisterbrawl-pdbminAvailable: 1
CronJobsisterbrawl-health-checkEvery 5 min
ServicesisterbrawlHeadless ClusterIP
Deploymentsisterbrawl-metricsPython sidecar (:9101)

Prometheus Alerts#

AlertSeverityCondition
SisterBrawlHighTickLatencywarningp95 > 20ms for 1m
SisterBrawlVeryHighTickLatencycriticalp99 > 50ms for 30s
SisterBrawlNoActivePlayersinfo0 players for 10m

6. Known Issues & Fixes#

โœ… Resolved#

IssueFix
“Failed to load game component”Fixed โ€” game renders correctly now
allowSoloAutostart: falseChanged to true
No client-side predictionImplemented in gameStore
No entity interpolationImplemented in gameStore
No screen shakeImplemented (stackable, quadratic decay)
No particlesImplemented (pooled, character-specific)
No audio systemImplemented (14+ SFX, layered music)
No bot AIImplemented (moves toward player, attacks)
No replay systemNakama storage-based at 10Hz
No spectator modeImplemented with free camera
No 2D canvas fallbackImplemented for solo/headless
All specials identical on serverEach character now has unique special
Match end only by timeoutKill threshold (10) + dramatic finish
No damage numbersFloating damage numbers on 2D canvas
No tutorial3-step first-fight onboarding
No progressionXP/levels with Nakama storage
Music was soullessLayered kick/bass/lead with tempo ramp

๐ŸŸก Remaining#

IssueSeverityNotes
No death cam๐ŸŸกCan’t see what killed you
No stage hazards๐Ÿ’กFlat arena, no environmental kills
Comms token 500๐ŸŸกPlatform issue, not game
MP untested๐ŸŸกSolo works, MP needs live test

7. Perfection Cycle โ€” What’s New#

Fun Audit v2 Results#

Metricv1 (2026-05-28)v2 (2026-06-04)ฮ”
Fun Stack avg2.8/5 (estimated)3.4/5 (playtested)+0.6
Usability14+3
Clarity?33confirmed
Responsiveness?44confirmed
Competence?33confirmed
Agency?33confirmed
Emotion?33.5+0.5
Meaning?22confirmed
Memory?22confirmed
๐Ÿ”ด killers30-3
Core loop BROKEN20-2

Changes in This Cycle#

  1. Character-specific specials โ€” All 6 characters now have unique server-side abilities
  2. Match-end kill threshold โ€” First to 10 kills wins immediately
  3. Hit-stop โ€” 2-3 frame freeze on KO and special hits
  4. Damage numbers โ€” Floating text on 2D canvas showing damage taken
  5. Audio upgrade โ€” Layered kick/bass/lead music with 100โ†’140 BPM tempo ramp
  6. Tutorial overlay โ€” 3-step first-fight onboarding (move โ†’ attack โ†’ special)
  7. Progression system โ€” XP/levels/streaks with Nakama storage
  8. Dramatic finish โ€” Last 10 seconds indicator when kill leader โ‰ฅ 8

8. Operational Runbooks#

Deploy Nakama Module#

cd /home/usr/funday/nakama-modules && npm run build
sudo kubectl rollout restart deployment nakama -n funday-platform
sudo kubectl logs -n funday-platform deployment/nakama --tail=20

Deploy Frontend#

bash /home/usr/funday/scripts/build-atomic.sh
systemctl is-active funday-frontend
curl -s -o /dev/null -w "%{http_code}" http://localhost:3000/play/sisterbrawl

Deploy K8s#

sudo kubectl apply -f games/sisterbrawl/deploy/k3s-deployment.yaml
sudo kubectl apply -f games/sisterbrawl/deploy/k3s-metrics-deployment.yaml
sudo kubectl get pods -n funday-platform -l app=sisterbrawl

Health Checks#

curl -sf http://127.0.0.1:3000/health                          # Frontend
curl -sf https://funday.gg/v2/healthcheck                       # Nakama
sudo journalctl -u funday-frontend -f                            # Frontend logs
sudo k3s kubectl logs -n funday-platform -l app=nakama --tail=50 # Nakama logs

9. Doc Map#

DocumentPath
This auditdocs/audits/sisterbrawl/ (Hugo)
Fun Audit v1docs/fun-ops/audits/2026-05-28-sisterbrawl-fun-audit.md
Fun Audit v2docs/fun-ops/audits/2026-06-04-sisterbrawl-fun-audit-v2.md