Skip to content
0
  • Categories
  • Recent
  • Tags
  • Popular
  • World
  • Users
  • Groups
  • Categories
  • Recent
  • Tags
  • Popular
  • World
  • Users
  • Groups
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse

The Flying Dutchmen

  1. Home
  2. Games
  3. Q&C Test results (you can ignore this thread. It's for me to see the markdowns)

Q&C Test results (you can ignore this thread. It's for me to see the markdowns)

Scheduled Pinned Locked Moved Games
4 Posts 1 Posters 7 Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • S Offline
    S Offline
    snoopy
    wrote on last edited by
    #1

    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_MANAGEMENT action is sent via emitAction() which inserts into the game_actions Supabase table. The host's ManagementProvider listens via a real-time postgres_changes subscription. Unlike FINISH_WAGERING (which has a polling fallback in ArenaProvider), END_MANAGEMENT relies 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_MANAGEMENT actions, similar to the existing FINISH_WAGERING poll in ArenaProvider.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 wageringStartTimeRef reset to null when leaving WAGERING Verified — no stale timestamps
    #4 useLayoutEffect for ref syncing in ManagementProvider Verified — 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

    1. IMMEDIATE: Add a polling fallback for END_MANAGEMENT in ArenaProvider (mirror the existing FINISH_WAGERING poll pattern). This is the only blocking multiplayer bug found.

    2. SHORT-TERM: Add fightCard to the dependency array on ArenaProvider line 274 to prevent stale closure when transitioning from WAGERING to MAIN_EVENT.

    3. 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.

    1 Reply Last reply
    0
    • S Offline
      S Offline
      snoopy
      wrote on last edited by
      #2

      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,346 Game-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-79 Systemic — 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-89 Could 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-170 Could 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-211 Could cause inconsistent draft state

      MEDIUM Severity

      # Description File:Line Impact
      6 Phase transition race — activeFight = fightCard[0] set without re-validating fightCard.length > 0 between the check and the setter. application/ArenaProvider.tsx:261-280 Could crash Main Event phase
      7 Missing null check on belts during LP ledger processing — Object.keys(belts) called but belts could be undefined. application/ArenaProvider.tsx:159-165 Could crash retirement processing
      8 OffSeasonProvider executeTrade() without re-validation — Stable sizes not re-checked between validation and execution. application/OffSeasonProvider.tsx:94-114 Could 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-173 Performance degradation
      10 GameStateSynchronizer missing guard — setScoutingDoneIds uses OR operator with [] fallback, but explicit undefined in packet could lose data. components/GameStateSynchronizer.tsx:164 Could reset scouting done state

      LOW Severity

      # Description File:Line Impact
      11 Wager clawback calculation can push player cash negative hooks/useGameState.ts:1040-1045 Rare edge case
      12 computeRankings doesn't handle empty stables (all fighters retired) application/SummaryProvider.tsx:106-147 Cosmetic/crash risk
      13 setupGame() doesn't clear stale state from previous games application/PhaseProvider.tsx:76-104 Multi-game sessions only
      14 OffSeasonProvider prevPhaseRef pattern is fragile application/OffSeasonProvider.tsx:80-87 Code smell
      15 Missing fighter existence check in SIGN_FREE_AGENT handler application/ManagementProvider.tsx:261-275 Edge case
      16 Scouting rotation assumes all players have packs initialized application/ScoutingProvider.tsx:147-159 Edge 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)

      1. Add Math.max(0, p.cash - upkeep) guard in SummaryProvider upkeep deduction
      2. Update RosterService.deductCash() to prevent negative cash globally
      3. 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

      1 Reply Last reply
      0
      • S Offline
        S Offline
        snoopy
        wrote on last edited by
        #3

        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-126 e2e-screenshots/lobby/guest-06-fail-verify-game-started.png
        2 low lobby HOST badge selector text=HOST matches both "TestHost" name and the "HOST" badge span (strict mode violation). Test selector issue only, not an app bug. components/PhaseSetupMultiplayer.tsx:145 e2e-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-232
        2 Stale closure in GameStateSynchronizer — handleIncoming() closes over wageringState at subscription time; guest wagering state may not sync with host components/GameStateSynchronizer.tsx:423-431
        3 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-215
        4 Phase transition race condition — ScoutingProvider, ArenaProvider, and OffSeasonProvider can all fire setPhase() in same render cycle when done IDs aren't cleared yet application/ScoutingProvider.tsx:88-101, application/ArenaProvider.tsx:106-232
        5 Missing null check on player — player can be undefined before guard at line 107 while earlier lines assume it exists components/PhaseManagement.tsx:32-34

        MEDIUM Severity

        # Description File:Line
        6 Duplicate state processing — useGameState and providers both process same game_actions, causing double handling hooks/useGameState.ts:122-170
        7 No validation of fighter/player IDs in SEND_PURSE_OFFER payload before processing application/ManagementProvider.tsx:209-232
        8 Silent Supabase failures — Missing error handling/retry in sync operations; players unaware of sync breakdowns components/GameStateSynchronizer.tsx:208-224

        LOW Severity

        # Description File:Line
        9 gazetteArchive not cleared between games — memory leak in same-session multi-game scenarios application/SummaryProvider.tsx:259
        10 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

        1 Reply Last reply
        0
        • S Offline
          S Offline
          snoopy
          wrote on last edited by
          #4

          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 medium lobby 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 low lobby 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 setWagers call, not data loss.
          3 Double-draft risk in ScoutingProvider Both setPlayers (idempotency guard) and setScoutingPacks (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.id and player.stable accessed at lines 39/41 before the null guard at line 107. Crashes if players array is empty during initialization. components/PhaseManagement.tsx:39,41 Fixed — 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:259
          10 fightEndProcessedRef not consistently reset across all phase transitions application/ArenaProvider.tsx:63, 273, 673

          LOW Severity

          # Description File:Line
          9 gazetteArchive not cleared between games — memory leak in same-session multi-game scenarios application/SummaryProvider.tsx:259
          10 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

          1 Reply Last reply
          0

          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
          Reply
          • Reply as topic
          Log in to reply
          • Oldest to Newest
          • Newest to Oldest
          • Most Votes


          • Login

          • Login or register to search.
          Powered by NodeBB Contributors
          • First post
            Last post