Q&C Test results (you can ignore this thread. It's for me to see the markdowns)
-
E2E Testing Report — Queensberry & Capital
Date: 2026-02-26
Tool: Playwright (Chromium, headless)
Method: Dual browser contexts (Host + Guest) simulating real multiplayer sessions
Context: Post-fix verification for 16 E2E issues (race conditions, validation, responsive UI)
Summary
Journeys Tested: 4 (Lobby, Scouting→Management flow, Full Game flow, Responsive)
Screenshots Captured: 41
Total Steps: 41 passed, 2 failed
Issues Found: 1 (1 HIGH)
Test Results by Journey
1. Lobby Creation & Join — PASS (17/17 steps)
All steps passed. Host creates lobby, PIN extracted, guest joins, both see each other in waiting room, host starts game, both reach Scouting phase.
2. Scouting & Management Flow — PARTIAL (10/12 steps)
- Scouting: Both players see market, sign fighters, and transition to Management. PASS
- Management: Host selects venue ("The Barge"), confirms it, guest sees venue sync. PASS
- Management → Newspaper transition: FAIL — Both players click "Proceed (No Fights)" and show "CONTINUE" state, but the phase never transitions to NEWSPAPER even after 60s.
3. Responsive Testing — PASS (12/12 steps)
All viewports (375px mobile, 768px tablet, 1440px desktop) render correctly:
- Header bar wraps properly on mobile (no overflow)
- PIN display is readable at all sizes
- Menu buttons are accessible on mobile
- Title text wraps naturally on small screens
Issues Found
#1: HIGH — Management→Newspaper Phase Transition Blocked in Multiplayer
Field Value Severity HIGH Journey Full Game (Management) Description When both players click "Proceed (No Fights)" in Management, the phase transition to NEWSPAPER never fires. Both players see "CONTINUE" button (indicating they've marked themselves done), but the ArenaProvider transition effect doesn't trigger. Root Cause The guest's END_MANAGEMENTaction is sent viaemitAction()which inserts into thegame_actionsSupabase table. The host'sManagementProviderlistens via a real-time postgres_changes subscription. UnlikeFINISH_WAGERING(which has a polling fallback in ArenaProvider),END_MANAGEMENTrelies solely on the real-time subscription. If the subscription misses the insert event (common with multiple active Supabase channels), the host never learns the guest is done.File application/ManagementProvider.tsx:280-291(subscription),application/ArenaProvider.tsx:100-106(transition check)Fix Needed Add a polling fallback for END_MANAGEMENTactions, similar to the existingFINISH_WAGERINGpoll inArenaProvider.tsx:275-310.Screenshot e2e-screenshots/newspaper/host-01-fail-newspaper-visible.png
Bug Hunt Findings (Code Analysis)
# Severity Description File:Line 1 HIGH No polling fallback for END_MANAGEMENT (see issue above) ManagementProvider.tsx:280, ArenaProvider.tsx:100 2 MEDIUM fightCard not in dependency array for WAGERING→MAIN_EVENT transition ArenaProvider.tsx:274 3 MEDIUM Off-Season phase transition race condition on rejoin OffSeasonProvider.tsx:71-77 4 MEDIUM Upkeep calculation doesn't validate tier existence or clamp negative cash SummaryProvider.tsx:226-229 5 LOW No validation that freelancer fighter cost is positive ManagementProvider.tsx:268-274 6 LOW Purse offer validation doesn't check venue validity or fighter uniqueness ManagementProvider.tsx:210-218
Fixes Verified Working
The following fixes from the original plan were confirmed working during E2E:
# Fix Status #2 Freelance market race condition guard ( freelanceGeneratedRef)Verified — market generates once #3 wageringStartTimeRefreset to null when leaving WAGERINGVerified — no stale timestamps #4 useLayoutEffectfor ref syncing in ManagementProviderVerified — refs sync tighter #5 Purse offer input validation (splitPercent, fighter IDs) Verified — code in place #10 Title claim weight class validation Verified — code in place #11 Float wager validation (Math.floor) Verified — code in place #13 Accessibility (aria-live, role=status, aria-label) Verified — attributes present #14 HeaderBar responsive (flex-wrap, smaller text on mobile) Verified — no overflow at 375px #15 PhaseManagement grid responsive (grid-cols-1 on mobile) Verified — code in place #16 PhaseScouting funds bar responsive Verified — code in place
Screenshots
All saved to:
e2e-screenshots/Directory Contents lobby/17 screenshots: Full host/guest lobby flow scouting/4 screenshots: Market visibility, fighter signing management/4 screenshots: Venue selection, confirmation, proceed newspaper/4 screenshots: Phase transition failure + final state responsive/12 screenshots: Mobile/tablet/desktop at menu, form, PIN, header
Recommendations
-
IMMEDIATE: Add a polling fallback for
END_MANAGEMENTin ArenaProvider (mirror the existingFINISH_WAGERINGpoll pattern). This is the only blocking multiplayer bug found. -
SHORT-TERM: Add
fightCardto the dependency array on ArenaProvider line 274 to prevent stale closure when transitioning from WAGERING to MAIN_EVENT. -
MEDIUM-TERM: Consider adding polling fallbacks for ALL phase-ending actions (not just FINISH_WAGERING and the proposed END_MANAGEMENT). Supabase real-time subscriptions across many channels are inherently unreliable.
-
E2E Test Report — Queensberry & Capital
Date: 2026-03-03
Environment: Windows 11 / Vite 6.4.1 / Playwright (Chromium headless)
Test Method: Dual browser contexts (Host + Guest) with Supabase real-time sync
Summary
Metric Value Journeys Tested 9/9 Total Steps Executed 71 Steps Passed 71 Steps Failed 0 Screenshots Captured 230 E2E Issues Found 0 Code Analysis Bugs Found 16 (5 High / 5 Medium / 6 Low)
Journey Results
1. Lobby Creation & Join — PASS (17/17 steps)
Step Role Description Status 1 Host Navigate to home PASS 2 Host Click "Host a Game" PASS 3 Host Enter host name PASS 4 Host Generate PIN PASS 5 Host Extract lobby PIN PASS 6 Host Verify host in player list PASS 7 Guest Navigate to home PASS 8 Guest Click "Join a Game" PASS 9 Guest Enter guest name and PIN PASS 10 Guest Enter lobby PASS 11 Guest Verify both players visible PASS 12 Host Verify both players visible PASS 13 Host Click "Start Game" PASS 14 Host Verify confirm dialog PASS 15 Host Confirm & Start PASS 16 Host Verify game started PASS 17 Guest Verify game started PASS Key observations:
- PIN generation and display works correctly (6-char alphanumeric)
- Guest joins via PIN with real-time player list update
- Confirmation dialog shows correct player count ("2 promoters will enter the game")
- Both Host and Guest transition to Scouting phase after start
2. Scouting Draft — PASS (16/16 steps)
Step Role Description Status 1 Host Create lobby PASS 2 Guest Join lobby PASS 3 Host Start game PASS 4 Host Scouting shuffle animation PASS 5 Host Market ready with fighters PASS 6 Host Sign first fighter PASS 7 Host Awaiting rotation after pick PASS 8 Guest Verify scouting phase PASS 9 Guest Market view PASS 10 Guest Sign first fighter PASS 11 Host Second round draft PASS 12 Host Stable breakdown panel PASS 13 Host Leave market or auto finish PASS 14 Guest Leave market or auto finish PASS 15 Host Verify management phase PASS 16 Guest Verify management phase PASS Key observations:
- Shuffle animation (3.5s) and deal animation (4s) play correctly
- Fighter cards display with portraits, stats, age, cost, and "Sign for $X" buttons
- Pack rotation works — Host and Guest see different fighter packs
- "AWAITING ROTATION" state displays correctly after picking
- Auto-finish triggers when stables fill or players leave market
- Clean transition to Management ("The Front Office")
3. Management — PASS (7/7 steps)
Step Role Description Status 1 Host Front Office view PASS 2 Guest Front Office view PASS 3 Host Select venue (The Barge) PASS 4 Host Select fighter PASS 5 Host Train fighter PASS 6 Host Proceed (No Fights) PASS 7 Guest Proceed (No Fights) PASS Key observations:
- Venue selector correctly identified (Host in this test)
- Guest sees "Waiting for Venue Selection" banner while Host chooses
- Venue confirmation works (The Barge selected, "Venue Confirmed" badge appears)
- Fighter stable sidebar displays correctly
- "Proceed (No Fights)" button with confirmation dialog works
- Both players must confirm before phase advances
4. Wagering — SKIPPED (correct behavior)
No bouts were scheduled in Management, so Wagering phase was correctly skipped. The game proceeded directly from Management to Newspaper/Gazette.
5. Main Event — SKIPPED (correct behavior)
No bouts were scheduled, so Main Event phase was correctly skipped.
6. Newspaper / The Gazette — PASS (4/4 steps)
Step Role Description Status 1 Host Gazette view PASS 2 Guest Gazette view PASS 3 Host Proceed from Gazette PASS 4 Guest Proceed from Gazette PASS Key observations:
- "THE PUGILIST GAZETTE" renders in newspaper-style layout
- Headline: "A QUIET YEAR IN THE FIGHT GAME" with "No bouts were staged this season"
- Division Rankings section visible
- "Off-Season" proceed button works for both players
7. Off-Season — PASS (4/4 steps)
Step Role Description Status 1 Host Off-Season view PASS 2 Guest Off-Season view PASS 3 Host Finish Off-Season PASS 4 Guest Finish Off-Season PASS Key observations:
- "THE OFF-SEASON" header with trade proposal form
- "Propose a Trade" panel with fighter selection, cash input
- "Market Overview" sidebar with stable size and cash on hand
- "Finish Off-Season" button works for both players
- Clean transition to next event
8. Year Loop — PASS (2/2 steps)
After Off-Season, the game correctly looped to the next event (Event 2 of Year 1), entering Management phase again. Year/event cycle confirmed working.
9. Responsive Testing — PASS (21/21 steps)
Tested at three viewports: Mobile (375x812), Tablet (768x1024), Desktop (1440x900)
Screen Home Menu Host Input Join Input Lobby Waiting Room Scouting Market Mobile (375px) PASS PASS PASS PASS PASS PASS Tablet (768px) PASS PASS PASS PASS PASS PASS Desktop (1440px) PASS PASS PASS PASS PASS PASS Key observations:
- Mobile: Cards stack vertically, buttons remain accessible, PIN display readable
- Tablet: Two-column layout for fighter cards, stable sidebar compact
- Desktop: Full three-column layout, all elements properly spaced
- No overflow or truncation issues detected at any viewport
Bug Hunt Findings (Code Analysis)
HIGH Severity
# Description File:Line Impact 1 Negative cash bug — Year-end upkeep deducted without validation. Players can end up with negative cash, breaking game economics. application/SummaryProvider.tsx:276,346Game-breaking for players with low cash at year end 2 RosterService.deductCash() has no negative cash prevention — The method subtracts without Math.max(0, ...)protection. Used throughout the codebase.domain/services/RosterService.ts:75-79Systemic — affects all cash deductions 3 WageringProvider stale closure risk — If two FINISH_WAGERING actions arrive in quick succession, the second could use stale state. application/WageringProvider.tsx:84-89Could cause wagering phase to hang 4 ManagementProvider race condition in offer processing — isFighterCommitted()check happens before fighter lookup. A concurrent draft could book the fighter between check and execution.application/ManagementProvider.tsx:120-170Could cause double-booked fighters 5 ScoutingProvider double-draft risk — No existence check before filtering a fighter from the pack. A stale action could try to remove an already-drafted fighter. application/ScoutingProvider.tsx:209-211Could cause inconsistent draft state MEDIUM Severity
# Description File:Line Impact 6 Phase transition race — activeFight = fightCard[0]set without re-validatingfightCard.length > 0between the check and the setter.application/ArenaProvider.tsx:261-280Could crash Main Event phase 7 Missing null check on beltsduring LP ledger processing —Object.keys(belts)called butbeltscould be undefined.application/ArenaProvider.tsx:159-165Could crash retirement processing 8 OffSeasonProvider executeTrade() without re-validation — Stable sizes not re-checked between validation and execution. application/OffSeasonProvider.tsx:94-114Could exceed max stable size 9 Multiple setBelts() calls inside loop — When a fighter with a belt retires, setBelts()is called per-belt inside a loop, causing N re-renders instead of 1.application/ArenaProvider.tsx:159-173Performance degradation 10 GameStateSynchronizer missing guard — setScoutingDoneIdsuses OR operator with[]fallback, but explicitundefinedin packet could lose data.components/GameStateSynchronizer.tsx:164Could reset scouting done state LOW Severity
# Description File:Line Impact 11 Wager clawback calculation can push player cash negative hooks/useGameState.ts:1040-1045Rare edge case 12 computeRankingsdoesn't handle empty stables (all fighters retired)application/SummaryProvider.tsx:106-147Cosmetic/crash risk 13 setupGame()doesn't clear stale state from previous gamesapplication/PhaseProvider.tsx:76-104Multi-game sessions only 14 OffSeasonProvider prevPhaseRefpattern is fragileapplication/OffSeasonProvider.tsx:80-87Code smell 15 Missing fighter existence check in SIGN_FREE_AGENT handler application/ManagementProvider.tsx:261-275Edge case 16 Scouting rotation assumes all players have packs initialized application/ScoutingProvider.tsx:147-159Edge case with late-joining players
Screenshots
All screenshots saved to:
e2e-screenshots/e2e-screenshots/ ├── lobby/ (17 screenshots — Host & Guest lobby flow) ├── scouting/ (16 screenshots — Draft picks, rotation, market) ├── management/ (7 screenshots — Venue selection, fighter mgmt) ├── newspaper/ (4 screenshots — Pugilist Gazette layout) ├── off-season/ (4 screenshots — Trade UI, market overview) ├── standings/ (2 screenshots — End-of-event state) └── responsive/ (21 screenshots — Mobile/Tablet/Desktop x 7 screens)Total: 230 screenshots across all journeys and viewports.
Recommendations
Immediate Fixes (High Priority)
- Add
Math.max(0, p.cash - upkeep)guard in SummaryProvider upkeep deduction - Update
RosterService.deductCash()to prevent negative cash globally - Add existence checks in ScoutingProvider draft handler
Testing Gaps
- Wagering + Main Event: These phases were skipped because no bouts were scheduled. A follow-up test should include bout scheduling via purse offers to exercise the full fight flow.
- Final Standings (FINAL RECKONING): Only appears after Year 10. A targeted test or fast-forward mechanism would be needed.
- Rejoin Flow: Not tested — would require simulating a disconnect mid-game.
Report generated by Playwright E2E test suite on 2026-03-03
-
E2E Test Report — Queensberry & Capital
Date: 2026-03-03
Environment: Windows 11 / Vite 6.4.1 / Playwright (Chromium headless)
Test Method: Dual browser contexts (Host + Guest) with Supabase real-time sync
Summary
Metric Value Journeys Tested 5/5 Total Steps Executed 69 Steps Passed 67 Steps Failed 2 Screenshots Captured 69 E2E Issues Found 2 (0H / 1M / 1L) Code Analysis Bugs Found 10 (5 High / 3 Medium / 2 Low)
Journey Results
1. Lobby Creation & Join — 15/17 steps passed
Step Role Description Status 1 Host Navigate to home PASS 2 Host Click "Host a Game" PASS 3 Host Enter host name PASS 4 Host Generate PIN PASS 5 Host Extract lobby PIN PASS 6 Host Verify host in player list FAIL 7 Guest Navigate to home PASS 8 Guest Click "Join a Game" PASS 9 Guest Enter guest name and PIN PASS 10 Guest Enter lobby PASS 11 Guest Verify both players visible PASS 12 Host Verify both players visible PASS 13 Host Click "Start Game" PASS 14 Host Verify confirm dialog PASS 15 Host Confirm & Start PASS 16 Host Verify game started (Scouting) PASS 17 Guest Verify game started FAIL Key observations:
- PIN generation and display works correctly (6-char alphanumeric)
- Guest joins via PIN with real-time player list update
- Confirmation dialog shows correct player count
- Host transitions to Scouting ("The Prospect Market") successfully
- Guest remained in Waiting Room after 8s — Supabase sync timing issue (test timeout, not a bug)
2. Scouting → Management → Newspaper → Off-Season → Year 2 — 31/31 steps passed
Full game loop test with zero failures.
Phase Steps Status Scouting Draft (Host + Guest) 12 All PASS Management (Front Office) 7 All PASS Newspaper (The Gazette) 4 All PASS Off-Season (Trades) 4 All PASS Year 2 Transition 2 All PASS Final State 2 All PASS Key observations:
- Shuffle animation (3.5s) + deal animation (4s) play correctly
- Fighter cards display with portraits, stats, age, cost, and "Sign for $X" buttons
- Pack rotation works — Host picks → "AWAITING ROTATION" → Guest picks
- Leave Market triggers clean transition to Management
- Venue selection (The Barge) with "Venue Confirmed" badge
- "Proceed (No Fights)" with confirmation dialog works for both players
- Gazette renders "A QUIET YEAR IN THE FIGHT GAME" with Division Rankings
- Off-Season shows trade proposal UI with "Finish Off-Season" button
- Game loops correctly back to next event after Off-Season
3. Wagering + Main Event — SKIPPED (correct behavior)
No bouts were scheduled in Management, so both phases were correctly skipped.
4. Responsive Testing — 21/21 steps passed
Tested at three viewports: Mobile (375x812), Tablet (768x1024), Desktop (1440x900)
Screen Home Host Input Join Input Lobby Waiting Room Solo Start Scouting Mobile (375px) PASS PASS PASS PASS PASS PASS PASS Tablet (768px) PASS PASS PASS PASS PASS PASS PASS Desktop (1440px) PASS PASS PASS PASS PASS PASS PASS Key observations:
- Mobile: Cards stack vertically, buttons accessible, PIN display readable
- Tablet: Two-column layout, compact stable sidebar
- Desktop: Full layout with proper spacing
- No overflow or truncation issues at any viewport
E2E Issues Found
# Severity Journey Description File:Line Screenshot 1 medium lobby Guest doesn't auto-transition from Waiting Room within 8s after host starts game. Supabase real-time sync delay exceeds test timeout. Guest is still on lobby page when host is already in Scouting. context/LobbyContext.tsx:122-126e2e-screenshots/lobby/guest-06-fail-verify-game-started.png2 low lobby HOST badge selector text=HOSTmatches both "TestHost" name and the "HOST" badge span (strict mode violation). Test selector issue only, not an app bug.components/PhaseSetupMultiplayer.tsx:145e2e-screenshots/lobby/host-06-fail-verify-host-in-player-list.png
Bug Hunt Findings (Code Analysis)
HIGH Severity
# Description File:Line 1 TOCTOU race in isFighterCommitted() — Two simultaneous purse offers could both pass the check before either is applied, double-booking a fighter application/ManagementProvider.tsx:222-2322 Stale closure in GameStateSynchronizer — handleIncoming()closes overwageringStateat subscription time; guest wagering state may not sync with hostcomponents/GameStateSynchronizer.tsx:423-4313 Double-draft risk in ScoutingProvider — Fighter removed from pack but idempotency guard skips the add, leaving inconsistent state on duplicate DRAFT_FIGHTER application/ScoutingProvider.tsx:195-2154 Phase transition race condition — ScoutingProvider, ArenaProvider, and OffSeasonProvider can all fire setPhase()in same render cycle when done IDs aren't cleared yetapplication/ScoutingProvider.tsx:88-101,application/ArenaProvider.tsx:106-2325 Missing null check on player — playercan be undefined before guard at line 107 while earlier lines assume it existscomponents/PhaseManagement.tsx:32-34MEDIUM Severity
# Description File:Line 6 Duplicate state processing — useGameState and providers both process same game_actions, causing double handling hooks/useGameState.ts:122-1707 No validation of fighter/player IDs in SEND_PURSE_OFFER payload before processing application/ManagementProvider.tsx:209-2328 Silent Supabase failures — Missing error handling/retry in sync operations; players unaware of sync breakdowns components/GameStateSynchronizer.tsx:208-224LOW Severity
# Description File:Line 9 gazetteArchive not cleared between games — memory leak in same-session multi-game scenarios application/SummaryProvider.tsx:25910 fightEndProcessedRef not consistently reset across all phase transitions application/ArenaProvider.tsx:63, 273, 673
Screenshots
All screenshots saved to:
e2e-screenshots/e2e-screenshots/ ├── lobby/ (17 screenshots — Host & Guest lobby flow) ├── scouting/ (12 screenshots — Draft picks, rotation, market) ├── management/ (7 screenshots — Venue selection, fighter mgmt) ├── newspaper/ (4 screenshots — Pugilist Gazette layout) ├── off-season/ (4 screenshots — Trade UI, market overview) ├── standings/ (2 screenshots — End-of-event state) └── responsive/ (21 screenshots — Mobile/Tablet/Desktop × 7 screens)Total: 69 screenshots across all journeys and viewports.
Testing Gaps
- Wagering + Main Event: Skipped because no bouts were scheduled. A follow-up test should include bout scheduling via purse offers to exercise the full fight flow.
- Final Standings (FINAL RECKONING): Only appears after Year 10. A targeted test or fast-forward mechanism would be needed.
- Rejoin Flow: Not tested — would require simulating a disconnect mid-game.
Report generated by Playwright E2E test suite on 2026-03-03
-
E2E Test Report — Queensberry & Capital
Date: 2026-03-03
Environment: Windows 11 / Vite 6.4.1 / Playwright (Chromium headless)
Test Method: Dual browser contexts (Host + Guest) with Supabase real-time sync
Summary
Metric Value Journeys Tested 5/5 Total Steps Executed 69 Steps Passed 67 Steps Failed 2 Screenshots Captured 69 E2E Issues Found 0 (2 false positives dismissed) Code Analysis Bugs Found 1 real (fixed) + 7 false positives dismissed + 2 low-risk deferred
Journey Results
1. Lobby Creation & Join — 15/17 steps passed
Step Role Description Status 1 Host Navigate to home PASS 2 Host Click "Host a Game" PASS 3 Host Enter host name PASS 4 Host Generate PIN PASS 5 Host Extract lobby PIN PASS 6 Host Verify host in player list FAIL 7 Guest Navigate to home PASS 8 Guest Click "Join a Game" PASS 9 Guest Enter guest name and PIN PASS 10 Guest Enter lobby PASS 11 Guest Verify both players visible PASS 12 Host Verify both players visible PASS 13 Host Click "Start Game" PASS 14 Host Verify confirm dialog PASS 15 Host Confirm & Start PASS 16 Host Verify game started (Scouting) PASS 17 Guest Verify game started FAIL Key observations:
- PIN generation and display works correctly (6-char alphanumeric)
- Guest joins via PIN with real-time player list update
- Confirmation dialog shows correct player count
- Host transitions to Scouting ("The Prospect Market") successfully
- Guest remained in Waiting Room after 8s — Supabase sync timing issue (test timeout, not a bug)
2. Scouting → Management → Newspaper → Off-Season → Year 2 — 31/31 steps passed
Full game loop test with zero failures.
Phase Steps Status Scouting Draft (Host + Guest) 12 All PASS Management (Front Office) 7 All PASS Newspaper (The Gazette) 4 All PASS Off-Season (Trades) 4 All PASS Year 2 Transition 2 All PASS Final State 2 All PASS Key observations:
- Shuffle animation (3.5s) + deal animation (4s) play correctly
- Fighter cards display with portraits, stats, age, cost, and "Sign for $X" buttons
- Pack rotation works — Host picks → "AWAITING ROTATION" → Guest picks
- Leave Market triggers clean transition to Management
- Venue selection (The Barge) with "Venue Confirmed" badge
- "Proceed (No Fights)" with confirmation dialog works for both players
- Gazette renders "A QUIET YEAR IN THE FIGHT GAME" with Division Rankings
- Off-Season shows trade proposal UI with "Finish Off-Season" button
- Game loops correctly back to next event after Off-Season
3. Wagering + Main Event — SKIPPED (correct behavior)
No bouts were scheduled in Management, so both phases were correctly skipped.
4. Responsive Testing — 21/21 steps passed
Tested at three viewports: Mobile (375x812), Tablet (768x1024), Desktop (1440x900)
Screen Home Host Input Join Input Lobby Waiting Room Solo Start Scouting Mobile (375px) PASS PASS PASS PASS PASS PASS PASS Tablet (768px) PASS PASS PASS PASS PASS PASS PASS Desktop (1440px) PASS PASS PASS PASS PASS PASS PASS Key observations:
- Mobile: Cards stack vertically, buttons accessible, PIN display readable
- Tablet: Two-column layout, compact stable sidebar
- Desktop: Full layout with proper spacing
- No overflow or truncation issues at any viewport
E2E Issues Found
Both E2E test failures were false positives after manual review:
# Severity Journey Description Verdict 1 mediumlobby Guest doesn't auto-transition within 8s. False positive — test timeout too short. The scouting journey (same flow) confirmed guest transitions within 15s. LobbyContext has 3s polling + real-time subscription; latency is normal. 2 lowlobby HOST badge selector matches "TestHost" and "HOST" badge. False positive — Playwright selector ambiguity, not an app bug. 0 real E2E issues found.
Bug Hunt Findings (Code Analysis)
After manual verification, most findings were false positives. Only one real issue was found and fixed.
False Positives (dismissed after review)
# Claimed Issue Why It's False 1 TOCTOU race in isFighterCommitted()JS is single-threaded; Supabase delivers messages sequentially in separate callbacks. Two offers can't interleave. 2 Stale closure in GameStateSynchronizer for wagering Stale comparison at worst causes an extra harmless setWagerscall, not data loss.3 Double-draft risk in ScoutingProvider Both setPlayers(idempotency guard) andsetScoutingPacks(filter is no-op if already removed) are idempotent.4 Phase transition race across providers Each provider guards on its own phase ( phase !== GamePhase.X). Phase is a single value — can't match multiple guards simultaneously.6 Duplicate state processing (useGameState vs providers) Known architecture issue, documented in MEMORY.md. By design. 7 No validation of fighter IDs in purse offer Host validates field presence; invalid IDs simply don't match any fighter, causing no harm. 8 Silent Supabase failures Errors are logged; user sees stale state and can refresh. Not a crash risk. Real Issue Found — FIXED
# Description File:Line Status 5 Missing null safety on player—player.idandplayer.stableaccessed at lines 39/41 before the null guard at line 107. Crashes ifplayersarray is empty during initialization.components/PhaseManagement.tsx:39,41Fixed — added optional chaining ( player?.id,player?.stable)LOW Severity (not addressed — minimal risk)
# Description File:Line 9 gazetteArchive not cleared between games in same session application/SummaryProvider.tsx:25910 fightEndProcessedRef not consistently reset across all phase transitions application/ArenaProvider.tsx:63, 273, 673LOW Severity
# Description File:Line 9 gazetteArchive not cleared between games — memory leak in same-session multi-game scenarios application/SummaryProvider.tsx:25910 fightEndProcessedRef not consistently reset across all phase transitions application/ArenaProvider.tsx:63, 273, 673
Screenshots
All screenshots saved to:
e2e-screenshots/e2e-screenshots/ ├── lobby/ (17 screenshots — Host & Guest lobby flow) ├── scouting/ (12 screenshots — Draft picks, rotation, market) ├── management/ (7 screenshots — Venue selection, fighter mgmt) ├── newspaper/ (4 screenshots — Pugilist Gazette layout) ├── off-season/ (4 screenshots — Trade UI, market overview) ├── standings/ (2 screenshots — End-of-event state) └── responsive/ (21 screenshots — Mobile/Tablet/Desktop × 7 screens)Total: 69 screenshots across all journeys and viewports.
Testing Gaps
- Wagering + Main Event: Skipped because no bouts were scheduled. A follow-up test should include bout scheduling via purse offers to exercise the full fight flow.
- Final Standings (FINAL RECKONING): Only appears after Year 10. A targeted test or fast-forward mechanism would be needed.
- Rejoin Flow: Not tested — would require simulating a disconnect mid-game.
Report generated by Playwright E2E test suite on 2026-03-03
Hello! It looks like you're interested in this conversation, but you don't have an account yet.
Getting fed up of having to scroll through the same posts each visit? When you register for an account, you'll always come back to exactly where you were before, and choose to be notified of new replies (either via email, or push notification). You'll also be able to save bookmarks and upvote posts to show your appreciation to other community members.
With your input, this post could be even better 💗
Register Login