๐ŸŽฎ 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 five minutes
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 audit/audits/sisterbrawl/ in the Quartz wiki
Fun Audit v1 source/home/usr/funday/docs/fun-ops/audits/2026-05-28-sisterbrawl-fun-audit.md
Fun Audit v2Published summary ยท source /home/usr/funday/docs/fun-ops/audits/2026-06-04-sisterbrawl-fun-audit-v2.md

1 item under this folder.