{
  "revision": "all-screen-audit-v1",
  "date": "19 October 2026",
  "summary": {
    "existingPages": 32,
    "newPages": 1,
    "stateCases": 340,
    "flows": 73,
    "originalViews": 271,
    "capturedStateCases": 340,
    "runtimeVerified": false
  },
  "screens": {
    "main-lobby": {
      "revision": "lobby-audit-v1",
      "date": "19 October 2026",
      "scope": "Lobby states and adjacent matchmaking, loading, audio and invite handoffs. Other page state audits are pending.",
      "states": [
        {
          "id": "LB01",
          "group": "Rewards",
          "title": "Below the next unlock",
          "trigger": "Active campaign; eligible prize costs more than the player balance.",
          "result": "Show tokens still needed and progress. Next prize is the cheapest eligible, in-stock X-Token item.",
          "source": {
            "file": "Assets/_Scripts/UI/Lobby/Root/LobbyCampaignPrizeUI.cs",
            "line": 337
          },
          "original": "assets/lobby-states/idle.png",
          "updated": "assets/lobby-updated.png",
          "checks": [
            "0 balance",
            "One token below target",
            "Large balances",
            "Three upcoming reward cards in redesign"
          ],
          "review": "Not reviewed",
          "revision": "lobby-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "screenId": "main-lobby"
        },
        {
          "id": "LB02",
          "group": "Rewards",
          "title": "Prize unlocked \u2014 Claim visible",
          "trigger": "Balance reaches or exceeds the next eligible prize price.",
          "result": "Replace unlock progress text with the Claim action. Claimability also depends on eligibility and stock.",
          "source": {
            "file": "Assets/_Scripts/UI/Lobby/Root/LobbyCampaignPrizeUI.cs",
            "line": 363
          },
          "original": "assets/lobby-states/claim-ready.png",
          "updated": "assets/lobby-states/updated-claim-ready.png",
          "checks": [
            "Exact threshold",
            "Above threshold",
            "Balance falls again",
            "Claim visible while matchmaking"
          ],
          "review": "Not reviewed",
          "revision": "lobby-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "screenId": "main-lobby"
        },
        {
          "id": "LB03",
          "group": "Rewards",
          "title": "Campaign not active",
          "trigger": "No campaign, future campaign window, completed/cancelled campaign or expired campaign.",
          "result": "Hide the campaign token/time strip and both next-prize and Claim roots.",
          "source": {
            "file": "Assets/_Scripts/UI/Lobby/Root/LobbyCampaignPrizeUI.cs",
            "line": 126
          },
          "original": "assets/lobby-states/no-campaign.png",
          "updated": null,
          "checks": [
            "Missing campaign",
            "Future campaign",
            "Ended or cancelled campaign"
          ],
          "review": "Not reviewed",
          "revision": "lobby-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "screenId": "main-lobby"
        },
        {
          "id": "LB04",
          "group": "Rewards",
          "title": "Prize data loading / round changed",
          "trigger": "New round ID; shop and purchase counts have not returned.",
          "result": "Clear old prizes; count resets to zero; next-prize and Claim roots stay hidden until data is available.",
          "source": {
            "file": "Assets/_Scripts/UI/Lobby/Root/LobbyCampaignPrizeUI.cs",
            "line": 154
          },
          "original": "assets/lobby-states/prizes-loading.png",
          "updated": null,
          "checks": [
            "Round rollover during request",
            "Ignore stale response for previous round"
          ],
          "review": "Not reviewed",
          "revision": "lobby-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "screenId": "main-lobby"
        },
        {
          "id": "LB05",
          "group": "Rewards",
          "title": "Prize request failed",
          "trigger": "Shop request fails or returns an unexpected shop type.",
          "result": "Clear prize data and hide the reward affordance; current code has no dedicated visible error panel. Refresh is retried on the refresh schedule.",
          "source": {
            "file": "Assets/_Scripts/UI/Lobby/Root/LobbyCampaignPrizeUI.cs",
            "line": 253
          },
          "original": "assets/states/LB05.png",
          "updated": null,
          "checks": [
            "Failure vs genuinely empty shop",
            "Recovery on subsequent refresh"
          ],
          "review": "Not reviewed",
          "revision": "lobby-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "screenId": "main-lobby",
          "captureNote": "Native Unity UI with sample data."
        },
        {
          "id": "LB06",
          "group": "Rewards",
          "title": "All prizes sold out / empty shop",
          "trigger": "No in-stock prize remains.",
          "result": "No unlock or Claim action. Finite available inventory totals zero.",
          "source": {
            "file": "Assets/_Scripts/UI/Lobby/Root/LobbyCampaignPrizeUI.cs",
            "line": 337
          },
          "original": "assets/lobby-states/prizes-loading.png",
          "updated": null,
          "checks": [
            "Last prize sold",
            "Empty shop",
            "Stock changes before Claim click"
          ],
          "review": "Not reviewed",
          "revision": "lobby-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "screenId": "main-lobby"
        },
        {
          "id": "LB07",
          "group": "Rewards",
          "title": "No prize eligible for this player",
          "trigger": "Rank, streak, subscription, linked-wallet requirement, per-user limit or unverified purchase history excludes every item.",
          "result": "Hide unlock and Claim even if the overall prize count is positive. These checks must not be confused with a zero-token balance.",
          "source": {
            "file": "Assets/_Scripts/UI/Lobby/Root/LobbyCampaignPrizeUI.cs",
            "line": 390
          },
          "original": "assets/lobby-states/no-eligible-prize.png",
          "updated": null,
          "checks": [
            "Each eligibility gate",
            "Limit reached",
            "Purchase-history request fails",
            "Some other eligible item still exists"
          ],
          "review": "Not reviewed",
          "revision": "lobby-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "screenId": "main-lobby"
        },
        {
          "id": "LB08",
          "group": "Rewards",
          "title": "Unlimited prize stock",
          "trigger": "At least one shop item has no finite quantity.",
          "result": "Prizes remaining displays the infinity symbol.",
          "source": {
            "file": "Assets/_Scripts/UI/Lobby/Root/LobbyCampaignPrizeUI.cs",
            "line": 461
          },
          "original": "assets/lobby-states/prizes-unlimited.png",
          "updated": null,
          "checks": [],
          "review": "Not reviewed",
          "revision": "lobby-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "screenId": "main-lobby"
        },
        {
          "id": "LB09",
          "group": "Rewards",
          "title": "Free eligible prize",
          "trigger": "Eligible prize price equals zero and a player profile exists.",
          "result": "Progress is full and Claim is available at zero balance.",
          "source": {
            "file": "Assets/_Scripts/UI/Lobby/Root/LobbyCampaignPrizeUI.cs",
            "line": 363
          },
          "original": "assets/states/LB09.png",
          "updated": null,
          "checks": [
            "Zero-price item",
            "Missing profile must not enable Claim"
          ],
          "review": "Not reviewed",
          "revision": "lobby-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "screenId": "main-lobby",
          "captureNote": "Native Unity UI with sample data."
        },
        {
          "id": "LB10",
          "group": "Round status",
          "title": "Round live",
          "trigger": "Valid active round with an end time.",
          "result": "Round timer counts down to the end time.",
          "source": {
            "file": "Assets/_Scripts/UI/Lobby/Root/LobbyRoundTimerUI.cs",
            "line": 131
          },
          "original": "assets/lobby-states/idle.png",
          "updated": null,
          "checks": [
            "Last second",
            "Hours above 24",
            "Round expires during a click"
          ],
          "review": "Not reviewed",
          "revision": "lobby-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "screenId": "main-lobby"
        },
        {
          "id": "LB11",
          "group": "Round status",
          "title": "Round upcoming",
          "trigger": "Upcoming/scheduled round or future start time.",
          "result": "Timer shows time until opening. Hunt-card upcoming overlay appears only where no active V2 rotation overrides it.",
          "source": {
            "file": "Assets/_Scripts/UI/Lobby/Root/LobbyRoundTimerUI.cs",
            "line": 132
          },
          "original": "assets/lobby-states/upcoming-round.png",
          "updated": null,
          "checks": [
            "Campaign already active but next round upcoming",
            "Active V2 rotation suppresses unavailable overlay"
          ],
          "review": "Not reviewed",
          "revision": "lobby-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "screenId": "main-lobby"
        },
        {
          "id": "LB12",
          "group": "Round status",
          "title": "No valid round / round ended",
          "trigger": "Missing/invalid round or ended/completed status.",
          "result": "Timer becomes blank; Treasure Rush card can show the no-round overlay. An active V2 rotation changes card availability independently.",
          "source": {
            "file": "Assets/_Scripts/UI/Lobby/Root/LobbyRootHuntCard.cs",
            "line": 376
          },
          "original": "assets/lobby-states/no-round.png",
          "updated": null,
          "checks": [],
          "review": "Not reviewed",
          "revision": "lobby-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "screenId": "main-lobby"
        },
        {
          "id": "LB13",
          "group": "Round status",
          "title": "Live round without an end time",
          "trigger": "Valid live round has no end timestamp.",
          "result": "Keep live-state colour but show no end countdown.",
          "source": {
            "file": "Assets/_Scripts/UI/Lobby/Root/LobbyRoundTimerUI.cs",
            "line": 140
          },
          "original": "assets/states/LB13.png",
          "updated": null,
          "checks": [
            "No invented expiry time"
          ],
          "review": "Not reviewed",
          "revision": "lobby-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "screenId": "main-lobby",
          "captureNote": "Native Unity UI with sample data."
        },
        {
          "id": "LB14",
          "group": "Play and party",
          "title": "Solo selected",
          "trigger": "Matchmaking party type is Solo.",
          "result": "Hide the Duos icon; leader can join when a mode callback exists and members are ready.",
          "source": {
            "file": "Assets/_Scripts/UI/Lobby/Root/LobbyRootHuntCard.cs",
            "line": 190
          },
          "original": "assets/lobby-states/idle.png",
          "updated": null,
          "checks": [],
          "review": "Not reviewed",
          "revision": "lobby-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "screenId": "main-lobby"
        },
        {
          "id": "LB15",
          "group": "Play and party",
          "title": "Duos selected",
          "trigger": "Matchmaking party type is Duos.",
          "result": "Show Duos indicator on the game-mode card.",
          "source": {
            "file": "Assets/_Scripts/UI/Lobby/Root/LobbyRootHuntCard.cs",
            "line": 190
          },
          "original": "assets/lobby-states/duos.png",
          "updated": null,
          "checks": [],
          "review": "Not reviewed",
          "revision": "lobby-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "screenId": "main-lobby"
        },
        {
          "id": "LB16",
          "group": "Play and party",
          "title": "Leader waiting for party members",
          "trigger": "Lobby is joining or a joined member has not appeared in the connected lobby.",
          "result": "Show unavailable play state until everyone is ready.",
          "source": {
            "file": "Assets/_Scripts/UI/Lobby/Root/LobbyRootHuntCard.cs",
            "line": 231
          },
          "original": "assets/lobby-states/party-not-ready.png",
          "updated": null,
          "checks": [
            "Member still joining",
            "Member leaves",
            "All ready restores Join Hunt"
          ],
          "review": "Not reviewed",
          "revision": "lobby-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "screenId": "main-lobby"
        },
        {
          "id": "LB17",
          "group": "Play and party",
          "title": "Party member \u2014 leader controls play",
          "trigger": "Current player is not party leader.",
          "result": "No Join action; mode picker is disabled. Leader synchronizes mode and matchmaking state.",
          "source": {
            "file": "Assets/_Scripts/UI/Lobby/Root/LobbyRootHuntCard.cs",
            "line": 289
          },
          "original": "assets/lobby-states/party-not-ready.png",
          "updated": null,
          "checks": [
            "Leader leaves",
            "Member leaves party",
            "Leader changes mode"
          ],
          "review": "Not reviewed",
          "revision": "lobby-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "screenId": "main-lobby"
        },
        {
          "id": "LB18",
          "group": "Play and party",
          "title": "Selected mode unavailable",
          "trigger": "No start callback exists for selected mode/rotation.",
          "result": "Show unavailable play state; leaders can still choose another mode.",
          "source": {
            "file": "Assets/_Scripts/UI/Lobby/Root/LobbyRootHuntCard.cs",
            "line": 342
          },
          "original": "assets/lobby-states/party-not-ready.png",
          "updated": null,
          "checks": [],
          "review": "Not reviewed",
          "revision": "lobby-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "screenId": "main-lobby"
        },
        {
          "id": "LB19",
          "group": "Matchmaking",
          "title": "Searching \u2014 leader",
          "trigger": "Leader presses Join Hunt and matchmaking starts.",
          "result": "Replace Join Hunt with MATCHMAKING 00:00 and an elapsed timer that counts UP. Disable mode changes; pressing the play/cancel control cancels.",
          "source": {
            "file": "Assets/_Scripts/UI/Lobby/Root/LobbyRootHuntCard.cs",
            "line": 289
          },
          "original": "assets/lobby-states/matchmaking.png",
          "updated": null,
          "checks": [
            "00:00 entry",
            "00:59 to 01:00",
            "Repeated Join tap",
            "Cancel before match response"
          ],
          "review": "Not reviewed",
          "revision": "lobby-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "screenId": "main-lobby"
        },
        {
          "id": "LB20",
          "group": "Matchmaking",
          "title": "Searching \u2014 party member",
          "trigger": "Leader broadcasts that matchmaking has started.",
          "result": "Show member elapsed timer. Member cannot start/cancel through the leader-only play handler.",
          "source": {
            "file": "Assets/_Scripts/UI/Lobby/Root/LobbyRootHuntCard.cs",
            "line": 308
          },
          "original": "assets/lobby-states/matchmaking.png",
          "updated": null,
          "checks": [
            "Late member update",
            "Leader cancels",
            "Member result arrives"
          ],
          "review": "Not reviewed",
          "revision": "lobby-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "screenId": "main-lobby"
        },
        {
          "id": "LB21",
          "group": "Matchmaking",
          "title": "Long-running search",
          "trigger": "Search remains pending.",
          "result": "Elapsed minutes continue growing; text must remain readable inside the button.",
          "source": {
            "file": "Assets/_Scripts/UI/Lobby/Root/LobbyRootHuntCard.cs",
            "line": 357
          },
          "original": "assets/lobby-states/matchmaking-long.png",
          "updated": null,
          "checks": [
            "12:34",
            "99:59",
            "100:00",
            "Large/localized text"
          ],
          "review": "Not reviewed",
          "revision": "lobby-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "screenId": "main-lobby"
        },
        {
          "id": "LB22",
          "group": "Matchmaking",
          "title": "Browsing another page while searching",
          "trigger": "Leave MainMenu for another registered lobby page while matchmaking.",
          "result": "A separate Matchmaking banner with elapsed timer and Cancel appears; it is hidden on MainMenu. Banner is a downloaded asset.",
          "source": {
            "file": "Assets/_Scripts/UI/Lobby/Hunt/MatchmakingBannerUI.cs",
            "line": 32
          },
          "original": "assets/states/LB22.png",
          "updated": null,
          "checks": [
            "Shop and inventory overlays",
            "Return to lobby",
            "Cancel from banner",
            "Banner asset load fails"
          ],
          "review": "Not reviewed",
          "revision": "lobby-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "screenId": "main-lobby",
          "captureNote": "Native Unity UI with sample data."
        },
        {
          "id": "LB23",
          "group": "Matchmaking",
          "title": "Cancelled \u2014 back to lobby",
          "trigger": "Cancel control or a cancelled matchmaking response.",
          "result": "Stop coroutine/matchmaker, clear matchmaking banner and return to lobby. Recompute Join availability.",
          "source": {
            "file": "Assets/_Scripts/GameManager_JoinGame.cs",
            "line": 85
          },
          "original": "assets/lobby-states/idle.png",
          "updated": null,
          "checks": [
            "Late match response after cancellation",
            "Party follower receives cancellation"
          ],
          "review": "Not reviewed",
          "revision": "lobby-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "screenId": "main-lobby"
        },
        {
          "id": "LB24",
          "group": "Matchmaking",
          "title": "Match found \u2014 leaving lobby",
          "trigger": "Matchmaking succeeds for leader or follower.",
          "result": "Synchronize session to party, clean up pending invitations and leave the lobby for the loading flow. Normal path skips the old mothership countdown.",
          "source": {
            "file": "Assets/_Scripts/GameManager_JoinGame.cs",
            "line": 1559
          },
          "original": "assets/states/LB24.png",
          "updated": null,
          "checks": [
            "Solo",
            "Party leader",
            "Party follower",
            "Member synchronization timeout"
          ],
          "review": "Not reviewed",
          "revision": "lobby-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "screenId": "main-lobby",
          "captureNote": "Native Unity UI with sample data."
        },
        {
          "id": "LB25",
          "group": "Matchmaking",
          "title": "Matchmaking failed",
          "trigger": "Non-cancellation matchmaking failure.",
          "result": "Clear search UI and show failure dialog; cancelled/empty reasons return without that error dialog.",
          "source": {
            "file": "Assets/_Scripts/GameManager_JoinGame.cs",
            "line": 1723
          },
          "original": "assets/states/LB25.png",
          "updated": null,
          "checks": [
            "Readable reason",
            "Dismiss and retry",
            "Party failure broadcast"
          ],
          "review": "Not reviewed",
          "revision": "lobby-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "screenId": "main-lobby",
          "captureNote": "Native Unity UI with sample data."
        },
        {
          "id": "LB26",
          "group": "Matchmaking",
          "title": "Server full / closed / missing \u2014 retry",
          "trigger": "Connection fails with a retryable server result.",
          "result": "Retry matchmaking when allowed; otherwise show a failure dialog.",
          "source": {
            "file": "Assets/_Scripts/GameManager_JoinGame.cs",
            "line": 1766
          },
          "original": "assets/lobby-states/matchmaking.png",
          "updated": null,
          "checks": [
            "GameNotFound",
            "GameClosed",
            "GameIsFull",
            "Retry disallowed"
          ],
          "review": "Not reviewed",
          "revision": "lobby-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "screenId": "main-lobby",
          "captureNote": "Retryable server failure re-enters matchmaking. This is the shared visible search state; the network retry still needs runtime testing."
        },
        {
          "id": "LB27",
          "group": "Matchmaking",
          "title": "Connection timeout",
          "trigger": "Connection timeout while joining.",
          "result": "Show Couldn\u2019t Join the Server with a connection/version message and return path.",
          "source": {
            "file": "Assets/_Scripts/GameManager_JoinGame.cs",
            "line": 1821
          },
          "original": "assets/states/LB27.png",
          "updated": null,
          "checks": [],
          "review": "Not reviewed",
          "revision": "lobby-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "screenId": "main-lobby",
          "captureNote": "Native Unity UI with sample data."
        },
        {
          "id": "LB28",
          "group": "Matchmaking",
          "title": "App backgrounded \u2014 search cancelled",
          "trigger": "App returns after matchmaking was cancelled in background.",
          "result": "Show cancellation notice and allow another attempt. Requires real app lifecycle testing.",
          "source": {
            "file": "Assets/_Scripts/AppBackgroundMonitor.cs",
            "line": 308
          },
          "original": "assets/lobby-states/idle.png",
          "updated": null,
          "checks": [],
          "review": "Not reviewed",
          "revision": "lobby-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "screenId": "main-lobby",
          "captureNote": "Returning after background cancellation restores the idle lobby. Shared idle view; app lifecycle requires a device test."
        },
        {
          "id": "LB29",
          "group": "Loading and handoffs",
          "title": "Connecting to the hunt",
          "trigger": "Match found and JoinServer begins.",
          "result": "Full-screen loading UI replaces the lobby. Progress and messages advance; hunt background normally comes from downloaded content.",
          "source": {
            "file": "Assets/_Scripts/GameManager_JoinGame.cs",
            "line": 403
          },
          "original": "assets/lobby-states/loading-fallback.png",
          "updated": null,
          "checks": [
            "Capture uses local fallback artwork",
            "Downloaded hunt background still needs runtime capture"
          ],
          "review": "Not reviewed",
          "revision": "lobby-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "screenId": "main-lobby"
        },
        {
          "id": "LB30",
          "group": "Loading and handoffs",
          "title": "Session, player and terrain loading",
          "trigger": "Server connects; player and environment initialize.",
          "result": "Loading milestones: session 30%, player 40%, player info 50%, terrain 60%, environment 85%. These are stages of the same screen.",
          "source": {
            "file": "Assets/_Scripts/GameManager_JoinGame.cs",
            "line": 564
          },
          "original": "assets/states/LB30.png",
          "updated": null,
          "checks": [
            "Message length",
            "Progress update cadence",
            "Stall/timeout",
            "Returning to lobby on failure"
          ],
          "review": "Not reviewed",
          "revision": "lobby-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "screenId": "main-lobby",
          "captureNote": "Native Unity UI with sample data."
        },
        {
          "id": "LB31",
          "group": "Loading and handoffs",
          "title": "Finalising / intro / ready",
          "trigger": "Initialization reaches finalizing and optional intro readiness.",
          "result": "Show finalizing/loading intro at 99%, then dismiss loading into the hunt. An optional intro is not guaranteed on every path.",
          "source": {
            "file": "Assets/_Scripts/GameManager_JoinGame.cs",
            "line": 899
          },
          "original": "assets/states/LB31.png",
          "updated": null,
          "checks": [
            "Intro available",
            "Optional asset unavailable",
            "Loading cannot stick indefinitely"
          ],
          "review": "Not reviewed",
          "revision": "lobby-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "screenId": "main-lobby",
          "captureNote": "Native Unity UI with sample data."
        },
        {
          "id": "LB32",
          "group": "Loading and handoffs",
          "title": "Download interrupted \u2014 Retry",
          "trigger": "Content download fails and retry is enabled.",
          "result": "Show Retry button on the loading screen. A dedicated event system is ensured for the control.",
          "source": {
            "file": "Assets/_Scripts/DialogueBox/DialogueManager.cs",
            "line": 735
          },
          "original": "assets/lobby-states/loading-retry.png",
          "updated": null,
          "checks": [
            "Retry tap",
            "Retry failure",
            "Successful retry"
          ],
          "review": "Not reviewed",
          "revision": "lobby-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "screenId": "main-lobby"
        },
        {
          "id": "LB33",
          "group": "Loading and handoffs",
          "title": "Content-download warning",
          "trigger": "Content loader requests loading with download warning.",
          "result": "Show download warning and progress/status text.",
          "source": {
            "file": "Assets/_Scripts/DownloadContentDeliveryManager.cs",
            "line": 859
          },
          "original": "assets/lobby-states/download-warning.png",
          "updated": null,
          "checks": [],
          "review": "Not reviewed",
          "revision": "lobby-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "screenId": "main-lobby"
        },
        {
          "id": "LB34",
          "group": "Loading and handoffs",
          "title": "Claim \u2192 native Vault",
          "trigger": "Eligible Claim is clicked and revalidation still passes.",
          "result": "Unity hands off to native Vault. No purchase happens inside this Unity callback; native Vault success/failure states require a separate app audit.",
          "source": {
            "file": "Assets/_Scripts/UI/Lobby/Root/LobbyCampaignPrizeUI.cs",
            "line": 498
          },
          "original": "assets/lobby-states/claim-ready.png",
          "updated": null,
          "checks": [
            "Stale stock/eligibility click rejected",
            "Native initializer absent",
            "iOS and Android destinations",
            "Returning from Vault refreshes balance"
          ],
          "review": "Not reviewed",
          "revision": "lobby-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "screenId": "main-lobby",
          "externalBoundary": true,
          "captureNote": "Unity source screen immediately before the native-app handoff. The native Vault/Winnings/Leave destination is outside this Unity catalogue and requires a separate device capture."
        },
        {
          "id": "LB35",
          "group": "Loading and handoffs",
          "title": "Leave / Winnings \u2192 native app",
          "trigger": "Press a native-return control.",
          "result": "Cancel matchmaking before handoff, show Please Wait loading for one second, then unload Unity to the configured native destination.",
          "source": {
            "file": "Assets/_Scripts/UI/Lobby/LeaveLobbyComponent.cs",
            "line": 43
          },
          "original": "assets/lobby-states/idle.png",
          "updated": null,
          "checks": [
            "Leave destination",
            "Winnings destination",
            "Double tap debounce",
            "Late match result during handoff"
          ],
          "review": "Not reviewed",
          "revision": "lobby-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "screenId": "main-lobby",
          "externalBoundary": true,
          "captureNote": "Unity source screen immediately before the native-app handoff. The native Vault/Winnings/Leave destination is outside this Unity catalogue and requires a separate device capture."
        },
        {
          "id": "LB36",
          "group": "Invites and overlays",
          "title": "Party invite received",
          "trigger": "An incoming standard party invite arrives.",
          "result": "Show inviter with Accept, Reject and 120-second dismiss timer; expiry rejects. Removed invites disappear.",
          "source": {
            "file": "Assets/_Scripts/Friends/UI/LobbyInviteReceivedPopup.cs",
            "line": 70
          },
          "original": "assets/states/LB36.png",
          "updated": null,
          "checks": [
            "Accept",
            "Reject",
            "Expiry",
            "Invitation withdrawn",
            "Multiple queued invites"
          ],
          "review": "Not reviewed",
          "revision": "lobby-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "screenId": "main-lobby",
          "captureNote": "Native Unity UI with sample data."
        },
        {
          "id": "LB37",
          "group": "Invites and overlays",
          "title": "Party invite pending",
          "trigger": "Player sends an invite from Friends.",
          "result": "Show pending invitation for up to 120 seconds; dismiss on joined/removed events.",
          "source": {
            "file": "Assets/_Scripts/Friends/UI/LobbyInvitePendingPopup.cs",
            "line": 31
          },
          "original": "assets/states/LB37.png",
          "updated": null,
          "checks": [
            "Accepted",
            "Rejected/removed",
            "Expired",
            "Match found clears pending invites"
          ],
          "review": "Not reviewed",
          "revision": "lobby-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "screenId": "main-lobby",
          "captureNote": "Native Unity UI with sample data."
        },
        {
          "id": "LB38",
          "group": "Invites and overlays",
          "title": "Friend request received",
          "trigger": "Incoming friend request notification.",
          "result": "Queue and show request popup; accept/reject actions resolve it. Reconcile removed requests.",
          "source": {
            "file": "Assets/_Scripts/Friends/UI/FriendInviteReceivedPopup.cs",
            "line": 92
          },
          "original": "assets/states/LB38.png",
          "updated": null,
          "checks": [],
          "review": "Not reviewed",
          "revision": "lobby-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "screenId": "main-lobby",
          "captureNote": "Native Unity UI with sample data."
        },
        {
          "id": "LB39",
          "group": "Invites and overlays",
          "title": "Friend request accepted",
          "trigger": "A friend acceptance notification arrives.",
          "result": "Show queued acceptance popup and dismiss to the next notification.",
          "source": {
            "file": "Assets/_Scripts/Friends/UI/FriendInviteAcceptedPopup.cs",
            "line": 37
          },
          "original": "assets/states/LB39.png",
          "updated": null,
          "checks": [],
          "review": "Not reviewed",
          "revision": "lobby-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "screenId": "main-lobby",
          "captureNote": "Native Unity UI with sample data."
        },
        {
          "id": "LB40",
          "group": "Audio controls",
          "title": "Listening settings open",
          "trigger": "Tap listening/speaker control.",
          "result": "Open listening settings and close the microphone settings panel. Team and enemy audio each have On/Mute states; team volume is adjustable.",
          "source": {
            "file": "Assets/_Scripts/UI/VoiceChat/PartyChatSettingsButton.cs",
            "line": 35
          },
          "original": "assets/lobby-states/listening-settings.png",
          "updated": null,
          "checks": [
            "Team on/mute",
            "Enemies on/mute",
            "Volume 0/50/100",
            "Close panel",
            "Only one audio popover open"
          ],
          "review": "Not reviewed",
          "revision": "lobby-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "screenId": "main-lobby"
        },
        {
          "id": "LB41",
          "group": "Audio controls",
          "title": "Microphone settings open",
          "trigger": "Tap microphone control.",
          "result": "Open microphone settings and close listening settings. Mic mode options include All, Party and Mute.",
          "source": {
            "file": "Assets/_Scripts/UI/VoiceChat/MicSettingsButton.cs",
            "line": 46
          },
          "original": "assets/lobby-states/mic-settings.png",
          "updated": null,
          "checks": [
            "All",
            "Party",
            "Mute",
            "Close panel",
            "Device microphone permission"
          ],
          "review": "Not reviewed",
          "revision": "lobby-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "screenId": "main-lobby"
        },
        {
          "id": "LB42",
          "group": "Audio controls",
          "title": "Hold to talk",
          "trigger": "Hold the microphone control with hold-to-talk enabled.",
          "result": "Unmute after 0.2 seconds; releasing mutes again and cancels any pending hold.",
          "source": {
            "file": "Assets/_Scripts/UI/VoiceChat/MicSettingsButton.cs",
            "line": 73
          },
          "original": "assets/states/LB42.png",
          "updated": null,
          "checks": [
            "Short tap",
            "Hold",
            "Release",
            "Permission denied"
          ],
          "review": "Not reviewed",
          "revision": "lobby-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "screenId": "main-lobby",
          "captureNote": "Native Unity UI with sample data."
        },
        {
          "id": "LB43",
          "group": "Profile and artwork",
          "title": "Profile / wallet still loading",
          "trigger": "Profile, wallet or rank artwork has not loaded.",
          "result": "Source wallet initially displays -1 placeholders; rank art is cleared until download. This needs an intentional redesigned loading state.",
          "source": {
            "file": "Assets/_Scripts/UI/Lobby/Root/LobbyWallet.cs",
            "line": 22
          },
          "original": "assets/states/LB43.png",
          "updated": null,
          "checks": [
            "Profile unavailable",
            "Wallet failure",
            "Long player name",
            "Large rank/XP",
            "Badge download retry"
          ],
          "review": "Not reviewed",
          "revision": "lobby-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "screenId": "main-lobby",
          "captureNote": "Native Unity UI with sample data."
        },
        {
          "id": "LB44",
          "group": "Profile and artwork",
          "title": "Mode artwork loading / fallback",
          "trigger": "A selected map image fails or a newer image request overtakes the previous request.",
          "result": "Use configured fallbacks; do not show stale art from the previous selected mode.",
          "source": {
            "file": "Assets/_Scripts/UI/Lobby/Root/LobbyRootHuntCard.cs",
            "line": 519
          },
          "original": "assets/states/LB44.png",
          "updated": null,
          "checks": [
            "Map image missing",
            "Pool fallback",
            "Default fallback",
            "Out-of-order replies"
          ],
          "review": "Not reviewed",
          "revision": "lobby-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "screenId": "main-lobby",
          "captureNote": "Native Unity UI with sample data."
        }
      ],
      "flows": [
        {
          "id": "FLOW01",
          "title": "Join Hunt \u2192 search \u2192 cancel",
          "steps": [
            "LB01",
            "LB19",
            "LB21",
            "LB23"
          ],
          "animation": "Elapsed timer plus entry/exit treatment to review in Unity."
        },
        {
          "id": "FLOW02",
          "title": "Join Hunt \u2192 found \u2192 loading \u2192 hunt",
          "steps": [
            "LB19",
            "LB24",
            "LB29",
            "LB30",
            "LB31"
          ],
          "animation": "Loading transitions need a recorded Unity rehearsal and native/device verification."
        },
        {
          "id": "FLOW03",
          "title": "Earn tokens \u2192 Claim \u2192 Vault",
          "steps": [
            "LB01",
            "LB02",
            "LB34"
          ],
          "animation": "Unlock highlight and Claim reveal can be animated in Unity; native handoff is a separate boundary."
        },
        {
          "id": "FLOW04",
          "title": "Party ready \u2192 leader searches \u2192 members follow",
          "steps": [
            "LB16",
            "LB15",
            "LB19",
            "LB20",
            "LB24"
          ],
          "animation": "Leader/follower synchronization must be tested with separate clients."
        },
        {
          "id": "FLOW05",
          "title": "Search while browsing \u2192 return / cancel",
          "steps": [
            "LB19",
            "LB22",
            "LB23"
          ],
          "animation": "Cross-page banner appearance/disappearance and input ownership."
        },
        {
          "id": "FLOW06",
          "title": "Search fails \u2192 retry",
          "steps": [
            "LB19",
            "LB25",
            "LB23",
            "LB19"
          ],
          "animation": "Failure dialog entry/dismissal and retry responsiveness."
        },
        {
          "id": "FLOW07",
          "title": "Upcoming round \u2192 live \u2192 no round",
          "steps": [
            "LB11",
            "LB10",
            "LB12"
          ],
          "animation": "Timer and card transition at exact boundaries."
        },
        {
          "id": "FLOW08",
          "title": "Round changes \u2192 prizes load \u2192 unlock",
          "steps": [
            "LB04",
            "LB01",
            "LB02"
          ],
          "animation": "Reward-card replacement without flashing stale prizes."
        },
        {
          "id": "FLOW09",
          "title": "Download interrupted \u2192 Retry \u2192 resume",
          "steps": [
            "LB29",
            "LB32",
            "LB30",
            "LB31"
          ],
          "animation": "Retry button, progress and restored loading state."
        },
        {
          "id": "FLOW10",
          "title": "Audio popovers switch",
          "steps": [
            "LB40",
            "LB41",
            "LB42"
          ],
          "animation": "Popover open/close and hold-to-talk feedback."
        },
        {
          "id": "FLOW11",
          "title": "Party invite \u2192 party \u2192 search",
          "steps": [
            "LB36",
            "LB16",
            "LB15",
            "LB19"
          ],
          "animation": "Invite timeout/accept/reject and lobby member arrival."
        },
        {
          "id": "FLOW12",
          "title": "Search \u2192 background \u2192 return",
          "steps": [
            "LB19",
            "LB28",
            "LB23"
          ],
          "animation": "Requires app lifecycle replay on a physical phone."
        }
      ],
      "exclusions": [
        "Old mothership countdown / X-Blade boarding: still present in source, but the current normal join path forces SkipMatchmakingDelay=true. FlyingSequence also proceeds directly to JoinServer. Not counted as active normal-lobby states.",
        "Native Vault, Winnings and app landing outcomes are external handoffs, not Unity screens. Their complete states require the iOS/Android app audit.",
        "Server-generated data, downloaded banners/backgrounds, invite races and physical-device permissions/lifecycle need runtime verification. This is a source audit with offline native UI captures, not a claim that every live permutation has been exercised.",
        "State conditions can overlap. We track their meaningful combinations and transition tests; the 44 entries are review cases, not 44 separate pages."
      ],
      "crossChecks": [
        "Claim-ready plus matchmaking",
        "Prize refresh while mode picker is open",
        "Round ends during Join tap",
        "Cancel and late success response",
        "Party member leaves during search",
        "Audio popup plus invite",
        "Long/localized text at phone safe-area extremes"
      ],
      "entry": "Enter the game lobby.",
      "outgoing": [
        "game-modes",
        "inventory",
        "x-droid-selection-and-equip",
        "shop-home-featured-drop",
        "player-statistics",
        "friends-party-list",
        "graphics-settings"
      ]
    },
    "inventory": {
      "revision": "all-screen-audit-v1",
      "states": [
        {
          "id": "INV01",
          "screenId": "inventory",
          "group": "Inventory / guns",
          "title": "Assault rifles category",
          "trigger": "Select Assault rifles tab.",
          "result": "Clear old grid, populate owned items for category; selected tab disabled/highlighted. Gadgets use their separate grid.",
          "source": {
            "file": "Assets/_Scripts/Inventory/Loudout_Inventory/InventoryControllerUI.cs",
            "line": 122
          },
          "original": "assets/states/INV01.png",
          "updated": null,
          "checks": [
            "Correct native UI state",
            "Back/cancel restores originating screen",
            "Long values and supported phone safe areas"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "sources": [
            {
              "file": "Assets/_Scripts/Inventory/Loudout_Inventory/ButtonGroup.cs",
              "line": 33
            }
          ],
          "captureKey": "INV01",
          "captureNote": "Native Unity UI with sample data."
        },
        {
          "id": "INV02",
          "screenId": "inventory",
          "group": "Inventory / guns",
          "title": "Snipers category",
          "trigger": "Select Snipers tab.",
          "result": "Clear old grid, populate owned items for category; selected tab disabled/highlighted. Gadgets use their separate grid.",
          "source": {
            "file": "Assets/_Scripts/Inventory/Loudout_Inventory/InventoryControllerUI.cs",
            "line": 122
          },
          "original": "assets/states/INV02.png",
          "updated": null,
          "checks": [
            "Correct native UI state",
            "Back/cancel restores originating screen",
            "Long values and supported phone safe areas"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "sources": [
            {
              "file": "Assets/_Scripts/Inventory/Loudout_Inventory/ButtonGroup.cs",
              "line": 33
            }
          ],
          "captureKey": "INV02",
          "captureNote": "Native Unity UI with sample data."
        },
        {
          "id": "INV04",
          "screenId": "inventory",
          "group": "Inventory / guns",
          "title": "Special weapons category",
          "trigger": "Select Special weapons tab.",
          "result": "Clear old grid, populate owned items for category; selected tab disabled/highlighted. Gadgets use their separate grid.",
          "source": {
            "file": "Assets/_Scripts/Inventory/Loudout_Inventory/InventoryControllerUI.cs",
            "line": 122
          },
          "original": "assets/states/INV04.png",
          "updated": null,
          "checks": [
            "Correct native UI state",
            "Back/cancel restores originating screen",
            "Long values and supported phone safe areas"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "sources": [
            {
              "file": "Assets/_Scripts/Inventory/Loudout_Inventory/ButtonGroup.cs",
              "line": 33
            }
          ],
          "captureKey": "INV04",
          "captureNote": "Native Unity UI with sample data."
        },
        {
          "id": "INV05",
          "screenId": "inventory",
          "group": "Inventory / guns",
          "title": "SMGs category",
          "trigger": "Select SMGs tab.",
          "result": "Clear old grid, populate owned items for category; selected tab disabled/highlighted. Gadgets use their separate grid.",
          "source": {
            "file": "Assets/_Scripts/Inventory/Loudout_Inventory/InventoryControllerUI.cs",
            "line": 122
          },
          "original": "assets/states/INV05.png",
          "updated": null,
          "checks": [
            "Correct native UI state",
            "Back/cancel restores originating screen",
            "Long values and supported phone safe areas"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "sources": [
            {
              "file": "Assets/_Scripts/Inventory/Loudout_Inventory/ButtonGroup.cs",
              "line": 33
            }
          ],
          "captureKey": "INV05",
          "captureNote": "Native Unity UI with sample data."
        },
        {
          "id": "INV06",
          "screenId": "inventory",
          "group": "Inventory / guns",
          "title": "Gadgets category",
          "trigger": "Select Gadgets tab.",
          "result": "Clear old grid, populate owned items for category; selected tab disabled/highlighted. Gadgets use their separate grid.",
          "source": {
            "file": "Assets/_Scripts/Inventory/Loudout_Inventory/InventoryControllerUI.cs",
            "line": 122
          },
          "original": "assets/states/INV06.png",
          "updated": null,
          "checks": [
            "Correct native UI state",
            "Back/cancel restores originating screen",
            "Long values and supported phone safe areas"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "sources": [
            {
              "file": "Assets/_Scripts/Inventory/Loudout_Inventory/ButtonGroup.cs",
              "line": 33
            }
          ],
          "captureKey": "INV06",
          "captureNote": "Native Unity UI with sample data."
        },
        {
          "id": "INV07",
          "screenId": "inventory",
          "group": "Inventory / guns",
          "title": "Hoverboards category",
          "trigger": "Select Hoverboards tab.",
          "result": "Clear old grid, populate owned items for category; selected tab disabled/highlighted. Gadgets use their separate grid.",
          "source": {
            "file": "Assets/_Scripts/Inventory/Loudout_Inventory/InventoryControllerUI.cs",
            "line": 122
          },
          "original": "assets/states/INV07.png",
          "updated": null,
          "checks": [
            "Correct native UI state",
            "Back/cancel restores originating screen",
            "Long values and supported phone safe areas"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "sources": [
            {
              "file": "Assets/_Scripts/Inventory/Loudout_Inventory/ButtonGroup.cs",
              "line": 33
            }
          ],
          "captureKey": "INV07",
          "captureNote": "Native Unity UI with sample data."
        },
        {
          "id": "INV08",
          "screenId": "inventory",
          "group": "Inventory / guns",
          "title": "Empty owned category",
          "trigger": "Selected category has no owned items.",
          "result": "Grid cleared with no dedicated empty message in this controller; equipment slots remain.",
          "source": {
            "file": "Assets/_Scripts/Inventory/Loudout_Inventory/InventoryControllerUI.cs",
            "line": 180
          },
          "original": "assets/states/INV08.png",
          "updated": null,
          "checks": [
            "Correct native UI state",
            "Back/cancel restores originating screen",
            "Long values and supported phone safe areas"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "INV08",
          "captureNote": "Native Unity UI with sample data."
        },
        {
          "id": "INV09",
          "screenId": "inventory",
          "group": "Inventory / guns",
          "title": "Unequipped item selected / compatible slots highlighted",
          "trigger": "Tap an unequipped owned item before a slot.",
          "result": "Item gets white selection; weapon, gadget or hoverboard slot highlights reflect category.",
          "source": {
            "file": "Assets/_Scripts/Inventory/Loudout_Inventory/InventoryControllerUI.cs",
            "line": 204
          },
          "original": "assets/states/INV09.png",
          "updated": null,
          "checks": [
            "Correct native UI state",
            "Back/cancel restores originating screen",
            "Long values and supported phone safe areas"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "INV09",
          "captureNote": "Native Unity UI with sample data."
        },
        {
          "id": "INV10",
          "screenId": "inventory",
          "group": "Inventory / guns",
          "title": "Equipped item selected",
          "trigger": "Tap an item already equipped.",
          "result": "Equipped tint used; occupied duplicate weapon cannot equip a second time.",
          "source": {
            "file": "Assets/_Scripts/Inventory/Loudout_Inventory/InventoryItemViewModel.cs",
            "line": 38
          },
          "original": "assets/states/INV10.png",
          "updated": null,
          "checks": [
            "Correct native UI state",
            "Back/cancel restores originating screen",
            "Long values and supported phone safe areas"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "INV10",
          "captureNote": "Native Unity UI with sample data."
        },
        {
          "id": "INV11",
          "screenId": "inventory",
          "group": "Inventory / guns",
          "title": "Empty slot selected before choosing item",
          "trigger": "Tap one of two reserve slots or gadget slot.",
          "result": "Slot selection highlight shown; choosing compatible item completes equip.",
          "source": {
            "file": "Assets/_Scripts/Inventory/Loudout_Inventory/InventoryControllerUI.cs",
            "line": 232
          },
          "original": "assets/states/INV11.png",
          "updated": null,
          "checks": [
            "Correct native UI state",
            "Back/cancel restores originating screen",
            "Long values and supported phone safe areas"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "INV11",
          "captureNote": "Native Unity UI with sample data."
        },
        {
          "id": "INV12",
          "screenId": "inventory",
          "group": "Inventory / guns",
          "title": "Weapon / gadget equip completed",
          "trigger": "Choose selected item and compatible slot in either order.",
          "result": "Local loadout updates, item deselects, selected slot clears, card equipped colours refresh.",
          "source": {
            "file": "Assets/_Scripts/Inventory/Loudout_Inventory/LoadoutPanelUI.cs",
            "line": 156
          },
          "original": "assets/states/INV12.png",
          "updated": null,
          "checks": [
            "Correct native UI state",
            "Back/cancel restores originating screen",
            "Long values and supported phone safe areas"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "INV12",
          "captureNote": "Native Unity UI with sample data."
        },
        {
          "id": "INV13",
          "screenId": "inventory",
          "group": "Inventory / guns",
          "title": "Hoverboard equipped / toggled off",
          "trigger": "Choose hoverboard and slot; select currently equipped hoverboard again.",
          "result": "Same selected hoverboard clears equipped slug. Original prefab aliases add and item icon references, so empty-slot art needs runtime review.",
          "source": {
            "file": "Assets/_Scripts/Inventory/Loudout_Inventory/LoadoutPanelUI.cs",
            "line": 187
          },
          "original": "assets/states/INV13.png",
          "updated": null,
          "checks": [
            "Correct native UI state",
            "Back/cancel restores originating screen",
            "Long values and supported phone safe areas"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "INV13",
          "captureNote": "Native Unity UI with sample data. Hoverboard add/item refs alias the same Image in original prefab; icon cannot be independently disabled/enabled. Preserve current original glyph, not a fabricated empty icon."
        },
        {
          "id": "INV14",
          "screenId": "inventory",
          "group": "Inventory / guns",
          "title": "First-visit Armoury welcome",
          "trigger": "Inventory opens without HideIntroPanel PlayerPrefs key.",
          "result": "Downloadable ArmouryWelcomeSplashScreenCanvas appears with welcome voice; button closes it.",
          "source": {
            "file": "Assets/_Scripts/Inventory/Loudout_Inventory/InventoryControllerUI.cs",
            "line": 66
          },
          "original": "assets/states/INV14.png",
          "updated": null,
          "checks": [
            "Correct native UI state",
            "Back/cancel restores originating screen",
            "Long values and supported phone safe areas"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "INV14",
          "captureNote": "Native Unity UI with sample data. Nested original canvas: set camera to capture camera; no first-visit preference mutation."
        },
        {
          "id": "INV15",
          "screenId": "inventory",
          "group": "Inventory / guns",
          "title": "Equipment help page 1",
          "trigger": "Info button / tap preceding help page.",
          "result": "Tap advances to next help page; Close dismisses; page 3 tap dismisses.",
          "source": {
            "file": "Assets/Prefabs/UI/New/MainMenu/LobbyUICanvas.prefab",
            "line": 140376
          },
          "original": "assets/states/INV15.png",
          "updated": null,
          "checks": [
            "Correct native UI state",
            "Back/cancel restores originating screen",
            "Long values and supported phone safe areas"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "INV15",
          "captureNote": "Native Unity UI with sample data."
        },
        {
          "id": "INV16",
          "screenId": "inventory",
          "group": "Inventory / guns",
          "title": "Equipment help page 2",
          "trigger": "Info button / tap preceding help page.",
          "result": "Tap advances to next help page; Close dismisses; page 3 tap dismisses.",
          "source": {
            "file": "Assets/Prefabs/UI/New/MainMenu/LobbyUICanvas.prefab",
            "line": 24979
          },
          "original": "assets/states/INV16.png",
          "updated": null,
          "checks": [
            "Correct native UI state",
            "Back/cancel restores originating screen",
            "Long values and supported phone safe areas"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "INV16",
          "captureNote": "Native Unity UI with sample data."
        },
        {
          "id": "INV17",
          "screenId": "inventory",
          "group": "Inventory / guns",
          "title": "Equipment help page 3",
          "trigger": "Info button / tap preceding help page.",
          "result": "Tap advances to next help page; Close dismisses; page 3 tap dismisses.",
          "source": {
            "file": "Assets/Prefabs/UI/New/MainMenu/LobbyUICanvas.prefab",
            "line": 259146
          },
          "original": "assets/states/INV17.png",
          "updated": null,
          "checks": [
            "Correct native UI state",
            "Back/cancel restores originating screen",
            "Long values and supported phone safe areas"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "INV17",
          "captureNote": "Native Unity UI with sample data."
        }
      ],
      "flows": [
        {
          "id": "ASPF01",
          "title": "Inventory category \u2192 choose item \u2192 choose slot \u2192 equipped",
          "steps": [
            "INV01",
            "INV09",
            "INV11",
            "INV12"
          ],
          "screenIds": [
            "inventory"
          ],
          "source": {
            "file": "Assets/_Scripts/Inventory/Loudout_Inventory/InventoryControllerUI.cs",
            "line": 204
          },
          "animation": "Immediate native tint/slot changes; no tween in these handlers. Record both item-first and slot-first routes, interruption and return.",
          "runtimeVerified": false,
          "motionStatus": "Source traced; real Unity recording pending"
        },
        {
          "id": "ASPF02",
          "title": "Hoverboard selection \u2192 equip \u2192 unequip",
          "steps": [
            "INV07",
            "INV09",
            "INV13"
          ],
          "screenIds": [
            "inventory"
          ],
          "source": {
            "file": "Assets/_Scripts/Inventory/Loudout_Inventory/LoadoutPanelUI.cs",
            "line": 187
          },
          "animation": "Immediate slot/icon changes; ensure repeated same-board choice removes equipment.",
          "runtimeVerified": false,
          "motionStatus": "Source traced; real Unity recording pending"
        },
        {
          "id": "ASPF03",
          "title": "Inventory info walkthrough",
          "steps": [
            "INV01",
            "INV15",
            "INV16",
            "INV17",
            "INV01"
          ],
          "screenIds": [
            "inventory"
          ],
          "source": {
            "file": "Assets/Prefabs/UI/New/MainMenu/LobbyUICanvas.prefab",
            "line": 24979
          },
          "animation": "Three native SetActive overlays, tap-through or Close at each step; no custom tween evidenced.",
          "runtimeVerified": false,
          "motionStatus": "Source traced; real Unity recording pending"
        },
        {
          "id": "ASPF04",
          "title": "Inventory \u2192 weapon details \u2192 equipped \u2192 inventory",
          "steps": [
            "INV01",
            "ITEM01",
            "ITEM02",
            "INV12"
          ],
          "screenIds": [
            "inventory",
            "owned-weapon-item-details"
          ],
          "source": {
            "file": "Assets/_Scripts/UI/Lobby/LoadoutWeaponDetails.cs",
            "line": 42
          },
          "animation": "LobbyPanel immediate active/inactive; Add updates label and reserve-slot0. Native sound click; record back.",
          "runtimeVerified": false,
          "motionStatus": "Source traced; real Unity recording pending"
        }
      ],
      "exclusions": [
        "New Loadout landing not implemented: ",
        "Gadget/hoverboard details not currently routed: ",
        "Separate X-Droid details: ",
        "Droid skins and Elixir tanks shop: ",
        "Mystery Draw: ",
        "Gem success / promo legacy objects: ",
        "Purchase reveal Share: ",
        "Market supply/prices on weapon details: ",
        "Weapon abilities overlay button: ",
        "Hunt streak / demotion profile views: ",
        "Legacy AnimatedUIPanel is not proof of current page animation: ",
        "Inventory Launcher tab: "
      ],
      "crossChecks": [
        "Never invoke purchase/equip/store/backend callbacks for offline visual fixtures.",
        "Capture is an injected-data native view, not evidence of successful backend transitions.",
        "Preserve original/current production UI and new-review responsive rules; no screen redesign performed by this audit.",
        "Each state includes source evidence; multiple data/error cases may share the same screenshot while their transition checks remain separate.",
        "Important source discrepancies: Gems orphan confirmation; Elixir max999 not affordability capped; stats WinRatio wired kd_ratio; unhandled missing ability maps; missing shop data error UI."
      ],
      "entry": "Main lobby; planned new Loadout landing links here",
      "outgoing": [
        "owned-weapon-item-details",
        "main-lobby"
      ]
    },
    "owned-weapon-item-details": {
      "revision": "all-screen-audit-v1",
      "states": [
        {
          "id": "ITEM01",
          "screenId": "owned-weapon-item-details",
          "group": "Owned weapon details",
          "title": "Weapon details \u2014 add available",
          "trigger": "Tap info on an owned unequipped WeaponItemData.",
          "result": "Editable native stats, abilities, owned tag and ADD TO LOADOUT action.",
          "source": {
            "file": "Assets/_Scripts/UI/Lobby/LoadoutWeaponDetails.cs",
            "line": 42
          },
          "original": "assets/states/ITEM01.png",
          "updated": null,
          "checks": [
            "Correct native UI state",
            "Back/cancel restores originating screen",
            "Long values and supported phone safe areas"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "ITEM01",
          "captureNote": "Native Unity UI with sample data."
        },
        {
          "id": "ITEM02",
          "screenId": "owned-weapon-item-details",
          "group": "Owned weapon details",
          "title": "Weapon details \u2014 equipped",
          "trigger": "Already equipped item or successful Add.",
          "result": "Button reads EQUIPPED and is non-interactable; Add writes reserve slot 0.",
          "source": {
            "file": "Assets/_Scripts/UI/Lobby/LoadoutWeaponDetails.cs",
            "line": 55
          },
          "original": "assets/states/ITEM02.png",
          "updated": null,
          "checks": [
            "Correct native UI state",
            "Back/cancel restores originating screen",
            "Long values and supported phone safe areas"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "ITEM02",
          "captureNote": "Native Unity UI with sample data."
        },
        {
          "id": "ITEM03",
          "screenId": "owned-weapon-item-details",
          "group": "Owned weapon details",
          "title": "Expanded 3D inspection",
          "trigger": "Tap expand-model button.",
          "result": "Centre/left/right containers hidden; background transparent; Armoury camera shows rotatable model.",
          "source": {
            "file": "Assets/_Scripts/UI/Lobby/WeaponDetailsViewModel.cs",
            "line": 206
          },
          "original": "assets/states/ITEM03.png",
          "updated": null,
          "checks": [
            "Correct native UI state",
            "Back/cancel restores originating screen",
            "Long values and supported phone safe areas"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "ITEM03",
          "captureNote": "Native Unity UI with sample data. Original 3D preview scene and bundled model."
        },
        {
          "id": "ITEM04",
          "screenId": "owned-weapon-item-details",
          "group": "Owned weapon details",
          "title": "3D model loading / missing asset",
          "trigger": "Expanded inspection requests downloadable shopPrefabAsset.",
          "result": "Async wait has no dedicated loading message in this class; model appears when available.",
          "source": {
            "file": "Assets/_Scripts/UI/Lobby/WeaponDetailsViewModel.cs",
            "line": 241
          },
          "original": "assets/states/ITEM04.png",
          "updated": null,
          "checks": [
            "Correct native UI state",
            "Back/cancel restores originating screen",
            "Long values and supported phone safe areas"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "ITEM04",
          "captureNote": "Native Unity UI with sample data. Exact pending-model UI, original environment visible and no fabricated spinner. Original 3D preview scene and bundled model."
        },
        {
          "id": "ITEM05",
          "screenId": "owned-weapon-item-details",
          "group": "Owned weapon details",
          "title": "3D drag / auto-rotation resumes",
          "trigger": "Drag model then release.",
          "result": "Auto-rotation stops during drag and restarts after release.",
          "source": {
            "file": "Assets/_Scripts/UI/Lobby/WeaponDetailsViewModel.cs",
            "line": 194
          },
          "original": "assets/states/ITEM05.png",
          "updated": null,
          "checks": [
            "Correct native UI state",
            "Back/cancel restores originating screen",
            "Long values and supported phone safe areas"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "sources": [
            {
              "file": "Assets/_Scripts/UI/ItemMenus/ObjectInspector3D.cs",
              "line": 17
            },
            {
              "file": "Assets/_Scripts/UI/Lobby/RotatableWeapon.cs",
              "line": 29
            }
          ],
          "captureKey": "ITEM05",
          "captureNote": "Native Unity UI with sample data. Real model rotated45degrees; one static interaction frame, not proof of animation. Original 3D preview scene and bundled model."
        },
        {
          "id": "ITEM06",
          "screenId": "owned-weapon-item-details",
          "group": "Owned weapon details",
          "title": "Rifle / SMG abilities",
          "trigger": "Select weapon of this supported type.",
          "result": "Up to three mapped ability containers visible.",
          "source": {
            "file": "Assets/_Scripts/UI/Lobby/WeaponAbilitiesOverlay.cs",
            "line": 37
          },
          "original": "assets/states/ITEM06.png",
          "updated": null,
          "checks": [
            "Correct native UI state",
            "Back/cancel restores originating screen",
            "Long values and supported phone safe areas"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "ITEM06",
          "captureNote": "Native Unity UI with sample data."
        },
        {
          "id": "ITEM07",
          "screenId": "owned-weapon-item-details",
          "group": "Owned weapon details",
          "title": "Sniper abilities",
          "trigger": "Select weapon of this supported type.",
          "result": "Up to three mapped ability containers visible.",
          "source": {
            "file": "Assets/_Scripts/UI/Lobby/WeaponAbilitiesOverlay.cs",
            "line": 39
          },
          "original": "assets/states/ITEM07.png",
          "updated": null,
          "checks": [
            "Correct native UI state",
            "Back/cancel restores originating screen",
            "Long values and supported phone safe areas"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "ITEM07",
          "captureNote": "Native Unity UI with sample data."
        },
        {
          "id": "ITEM08",
          "screenId": "owned-weapon-item-details",
          "group": "Owned weapon details",
          "title": "Launcher abilities",
          "trigger": "Select weapon of this supported type.",
          "result": "Up to three mapped ability containers visible.",
          "source": {
            "file": "Assets/_Scripts/UI/Lobby/WeaponAbilitiesOverlay.cs",
            "line": 40
          },
          "original": "assets/states/ITEM08.png",
          "updated": null,
          "checks": [
            "Correct native UI state",
            "Back/cancel restores originating screen",
            "Long values and supported phone safe areas"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "ITEM08",
          "captureNote": "Native Unity UI with sample data."
        },
        {
          "id": "ITEM09",
          "screenId": "owned-weapon-item-details",
          "group": "Owned weapon details",
          "title": "Volt abilities",
          "trigger": "Select weapon of this supported type.",
          "result": "Up to three mapped ability containers visible.",
          "source": {
            "file": "Assets/_Scripts/UI/Lobby/WeaponAbilitiesOverlay.cs",
            "line": 45
          },
          "original": "assets/states/ITEM09.png",
          "updated": null,
          "checks": [
            "Correct native UI state",
            "Back/cancel restores originating screen",
            "Long values and supported phone safe areas"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "ITEM09",
          "captureNote": "Native Unity UI with sample data."
        },
        {
          "id": "ITEM10",
          "screenId": "owned-weapon-item-details",
          "group": "Owned weapon details",
          "title": "Shockwave abilities",
          "trigger": "Select weapon of this supported type.",
          "result": "Up to three mapped ability containers visible.",
          "source": {
            "file": "Assets/_Scripts/UI/Lobby/WeaponAbilitiesOverlay.cs",
            "line": 46
          },
          "original": "assets/states/ITEM10.png",
          "updated": null,
          "checks": [
            "Correct native UI state",
            "Back/cancel restores originating screen",
            "Long values and supported phone safe areas"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "ITEM10",
          "captureNote": "Native Unity UI with sample data."
        },
        {
          "id": "ITEM11",
          "screenId": "owned-weapon-item-details",
          "group": "Owned weapon details",
          "title": "Unsupported ability mapping",
          "trigger": "Weapon type/category has no mapping, e.g. Specials Zapper.",
          "result": "All ability containers disabled; logged error, no invented abilities.",
          "source": {
            "file": "Assets/_Scripts/UI/Lobby/WeaponAbilitiesOverlay.cs",
            "line": 50
          },
          "original": "assets/states/ITEM11.png",
          "updated": null,
          "checks": [
            "Correct native UI state",
            "Back/cancel restores originating screen",
            "Long values and supported phone safe areas"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "ITEM11",
          "captureNote": "Native Unity UI with sample data."
        }
      ],
      "flows": [
        {
          "id": "ASPF04",
          "title": "Inventory \u2192 weapon details \u2192 equipped \u2192 inventory",
          "steps": [
            "INV01",
            "ITEM01",
            "ITEM02",
            "INV12"
          ],
          "screenIds": [
            "inventory",
            "owned-weapon-item-details"
          ],
          "source": {
            "file": "Assets/_Scripts/UI/Lobby/LoadoutWeaponDetails.cs",
            "line": 42
          },
          "animation": "LobbyPanel immediate active/inactive; Add updates label and reserve-slot0. Native sound click; record back.",
          "runtimeVerified": false,
          "motionStatus": "Source traced; real Unity recording pending"
        },
        {
          "id": "ASPF05",
          "title": "Weapon details \u2192 expanded model \u2192 drag \u2192 details",
          "steps": [
            "ITEM01",
            "ITEM04",
            "ITEM03",
            "ITEM05",
            "ITEM01"
          ],
          "screenIds": [
            "owned-weapon-item-details"
          ],
          "source": {
            "file": "Assets/_Scripts/UI/Lobby/WeaponDetailsViewModel.cs",
            "line": 206
          },
          "animation": "Container visibility + Armoury camera switch; async model; 30degrees/sec auto-rotation, stop/resume during drag. No screen tween here.",
          "runtimeVerified": false,
          "motionStatus": "Source traced; real Unity recording pending"
        }
      ],
      "exclusions": [
        "New Loadout landing not implemented: ",
        "Gadget/hoverboard details not currently routed: ",
        "Separate X-Droid details: ",
        "Droid skins and Elixir tanks shop: ",
        "Mystery Draw: ",
        "Gem success / promo legacy objects: ",
        "Purchase reveal Share: ",
        "Market supply/prices on weapon details: ",
        "Weapon abilities overlay button: ",
        "Hunt streak / demotion profile views: ",
        "Legacy AnimatedUIPanel is not proof of current page animation: ",
        "Inventory Launcher tab: "
      ],
      "crossChecks": [
        "Never invoke purchase/equip/store/backend callbacks for offline visual fixtures.",
        "Capture is an injected-data native view, not evidence of successful backend transitions.",
        "Preserve original/current production UI and new-review responsive rules; no screen redesign performed by this audit.",
        "Each state includes source evidence; multiple data/error cases may share the same screenshot while their transition checks remain separate.",
        "Important source discrepancies: Gems orphan confirmation; Elixir max999 not affordability capped; stats WinRatio wired kd_ratio; unhandled missing ability maps; missing shop data error UI."
      ],
      "entry": "Inventory weapon info button",
      "outgoing": [
        "inventory"
      ]
    },
    "x-droid-selection-and-equip": {
      "revision": "all-screen-audit-v1",
      "states": [
        {
          "id": "DR01",
          "screenId": "x-droid-selection-and-equip",
          "group": "X-Droid selection",
          "title": "Owned droids \u2014 default selection",
          "trigger": "Page opens after OwnedXDroids available.",
          "result": "Cards populate; first owned droid selected after one frame, preview loads.",
          "source": {
            "file": "Assets/_Scripts/UI/Lobby/XDroids/XDroidControllerUI.cs",
            "line": 31
          },
          "original": "assets/states/DR01.png",
          "updated": null,
          "checks": [
            "Correct native UI state",
            "Back/cancel restores originating screen",
            "Long values and supported phone safe areas"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "DR01",
          "captureNote": "Native Unity UI with sample data. Original 3D preview scene and bundled model."
        },
        {
          "id": "DR02",
          "screenId": "x-droid-selection-and-equip",
          "group": "X-Droid selection",
          "title": "Waiting / no owned droids",
          "trigger": "OwnedXDroids null (waiting) or empty list.",
          "result": "No card/preview; no dedicated spinner/empty label in this controller.",
          "source": {
            "file": "Assets/_Scripts/UI/Lobby/XDroids/XDroidControllerUI.cs",
            "line": 34
          },
          "original": "assets/states/DR02.png",
          "updated": null,
          "checks": [
            "Correct native UI state",
            "Back/cancel restores originating screen",
            "Long values and supported phone safe areas"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "DR02",
          "captureNote": "Native Unity UI with sample data. No owned items loaded: zero cards and no model; serialized metadata remains as source. Original 3D preview scene and bundled model."
        },
        {
          "id": "DR03",
          "screenId": "x-droid-selection-and-equip",
          "group": "X-Droid selection",
          "title": "Switch selection \u2014 dissolving out",
          "trigger": "Choose another card with model already visible.",
          "result": "Old droid dissolves out before removal; gun dissolves over 0.5 s.",
          "source": {
            "file": "Assets/_Scripts/UI/Lobby/XDroids/XDroidControllerUI.cs",
            "line": 147
          },
          "original": "assets/states/DR03.png",
          "updated": null,
          "checks": [
            "Correct native UI state",
            "Back/cancel restores originating screen",
            "Long values and supported phone safe areas"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "DR03",
          "captureNote": "Native Unity UI with sample data. Real skinned-model dissolve midpoint; renderer must copy source textures as controller does, not overlay a flat alpha image. Original 3D preview scene and bundled model."
        },
        {
          "id": "DR04",
          "screenId": "x-droid-selection-and-equip",
          "group": "X-Droid selection",
          "title": "Switch selection \u2014 awaiting model",
          "trigger": "Old preview removed and new downloadable asset pending.",
          "result": "No preview until load complete; a newer selection supersedes stale result.",
          "source": {
            "file": "Assets/_Scripts/UI/Lobby/XDroids/XDroidControllerUI.cs",
            "line": 169
          },
          "original": "assets/states/DR04.png",
          "updated": null,
          "checks": [
            "Correct native UI state",
            "Back/cancel restores originating screen",
            "Long values and supported phone safe areas"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "DR04",
          "captureNote": "Native Unity UI with sample data. Cards loaded while selection model download waits. Original 3D preview scene and bundled model."
        },
        {
          "id": "DR05",
          "screenId": "x-droid-selection-and-equip",
          "group": "X-Droid selection",
          "title": "Switch selection \u2014 dissolving in",
          "trigger": "Selected droid model has loaded.",
          "result": "New droid dissolves in from 1.1 to 0 at deltaTime rate; original materials restored.",
          "source": {
            "file": "Assets/_Scripts/UI/Lobby/XDroids/XDroidControllerUI.cs",
            "line": 214
          },
          "original": "assets/states/DR05.png",
          "updated": null,
          "checks": [
            "Correct native UI state",
            "Back/cancel restores originating screen",
            "Long values and supported phone safe areas"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "DR05",
          "captureNote": "Native Unity UI with sample data. Original 3D preview scene and bundled model."
        },
        {
          "id": "DR06",
          "screenId": "x-droid-selection-and-equip",
          "group": "X-Droid selection",
          "title": "Droid ready / weapon attachment",
          "trigger": "Droid visible; reserve-slot-0 weapon loads separately.",
          "result": "Animation controller applied and weapon attaches with 0.5 s dissolve.",
          "source": {
            "file": "Assets/_Scripts/UI/Lobby/XDroids/XDroidControllerUI.cs",
            "line": 195
          },
          "original": "assets/states/DR06.png",
          "updated": null,
          "checks": [
            "Correct native UI state",
            "Back/cancel restores originating screen",
            "Long values and supported phone safe areas"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "DR06",
          "captureNote": "Native Unity UI with sample data. Uses source reserve-slot0 Rifle3rdPerson_main downloadable asset attached at HandAnchor; scripts disabled before activation. Original 3D preview scene and bundled model."
        },
        {
          "id": "DR07",
          "screenId": "x-droid-selection-and-equip",
          "group": "X-Droid selection",
          "title": "Equip request / success",
          "trigger": "Tap Equip for a different selected droid.",
          "result": "Lobby cosmetic preview changes then BackendRouter.PutXDroid persists selection; success applies RPC if player available.",
          "source": {
            "file": "Assets/_Scripts/UI/Lobby/XDroids/XDroidControllerUI.cs",
            "line": 129
          },
          "original": "assets/states/DR01.png",
          "updated": null,
          "checks": [
            "Correct native UI state",
            "Back/cancel restores originating screen",
            "Long values and supported phone safe areas"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "sources": [
            {
              "file": "Assets/_Scripts/Items/ItemManager.cs",
              "line": 708
            }
          ],
          "captureKey": "DR01",
          "captureNote": "Native Unity UI with sample data. This state shares its visual layout with capture DR01. Original 3D preview scene and bundled model."
        },
        {
          "id": "DR08",
          "screenId": "x-droid-selection-and-equip",
          "group": "X-Droid selection",
          "title": "Equip failed / unchanged",
          "trigger": "Backend selection request fails or current droid selected again.",
          "result": "Failure logs and leaves server selection unchanged; same-current request returns. No dedicated failure dialog.",
          "source": {
            "file": "Assets/_Scripts/Items/ItemManager.cs",
            "line": 716
          },
          "original": "assets/states/DR01.png",
          "updated": null,
          "checks": [
            "Correct native UI state",
            "Back/cancel restores originating screen",
            "Long values and supported phone safe areas"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "DR01",
          "captureNote": "Native Unity UI with sample data. This state shares its visual layout with capture DR01. Original 3D preview scene and bundled model."
        }
      ],
      "flows": [
        {
          "id": "ASPF06",
          "title": "X-Droid selection \u2192 dissolve-out \u2192 load \u2192 dissolve-in \u2192 equip",
          "steps": [
            "DR01",
            "DR03",
            "DR04",
            "DR05",
            "DR06",
            "DR07"
          ],
          "screenIds": [
            "x-droid-selection-and-equip"
          ],
          "source": {
            "file": "Assets/_Scripts/UI/Lobby/XDroids/XDroidControllerUI.cs",
            "line": 140
          },
          "animation": "Droid dissolve about1.1s each; gun dissolve0.5s. Test rapid reselection and leaving during every phase. Real Unity model/material recording required.",
          "runtimeVerified": false,
          "motionStatus": "Source traced; real Unity recording pending"
        }
      ],
      "exclusions": [
        "New Loadout landing not implemented: ",
        "Gadget/hoverboard details not currently routed: ",
        "Separate X-Droid details: ",
        "Droid skins and Elixir tanks shop: ",
        "Mystery Draw: ",
        "Gem success / promo legacy objects: ",
        "Purchase reveal Share: ",
        "Market supply/prices on weapon details: ",
        "Weapon abilities overlay button: ",
        "Hunt streak / demotion profile views: ",
        "Legacy AnimatedUIPanel is not proof of current page animation: ",
        "Inventory Launcher tab: "
      ],
      "crossChecks": [
        "Never invoke purchase/equip/store/backend callbacks for offline visual fixtures.",
        "Capture is an injected-data native view, not evidence of successful backend transitions.",
        "Preserve original/current production UI and new-review responsive rules; no screen redesign performed by this audit.",
        "Each state includes source evidence; multiple data/error cases may share the same screenshot while their transition checks remain separate.",
        "Important source discrepancies: Gems orphan confirmation; Elixir max999 not affordability capped; stats WinRatio wired kd_ratio; unhandled missing ability maps; missing shop data error UI."
      ],
      "entry": "Main lobby X-Droids",
      "outgoing": [
        "main-lobby",
        "buy-gems"
      ]
    },
    "shop-home-featured-drop": {
      "revision": "all-screen-audit-v1",
      "states": [
        {
          "id": "SHOP01",
          "screenId": "shop-home-featured-drop",
          "group": "Shop home / featured drop",
          "title": "Featured drop available",
          "trigger": "Valid earliest drop purchase date passed and quantity positive.",
          "result": "Shop card reads LIMITED EDITION; opens drop details. Card-level buy handler absent.",
          "source": {
            "file": "Assets/_Scripts/UI/Lobby/ItemDropCard.cs",
            "line": 157
          },
          "original": "assets/states/SHOP01.png",
          "updated": null,
          "checks": [
            "Correct native UI state",
            "Back/cancel restores originating screen",
            "Long values and supported phone safe areas"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "SHOP01",
          "captureNote": "Native Unity UI with sample data."
        },
        {
          "id": "SHOP02",
          "screenId": "shop-home-featured-drop",
          "group": "Shop home / featured drop",
          "title": "Featured drop upcoming",
          "trigger": "Valid earliest drop purchase date is in future.",
          "result": "DROPPING IN with D/H/M suffix; card still navigates details.",
          "source": {
            "file": "Assets/_Scripts/UI/Lobby/ItemDropCard.cs",
            "line": 106
          },
          "original": "assets/states/SHOP02.png",
          "updated": null,
          "checks": [
            "Correct native UI state",
            "Back/cancel restores originating screen",
            "Long values and supported phone safe areas"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "SHOP02",
          "captureNote": "Native Unity UI with sample data."
        },
        {
          "id": "SHOP03",
          "screenId": "shop-home-featured-drop",
          "group": "Shop home / featured drop",
          "title": "Featured drop sold out",
          "trigger": "Earliest valid drop quantity <=0.",
          "result": "Card title reads SOLD OUT; details purchase configured disabled.",
          "source": {
            "file": "Assets/_Scripts/UI/Lobby/ItemDropCard.cs",
            "line": 87
          },
          "original": "assets/states/SHOP03.png",
          "updated": null,
          "checks": [
            "Correct native UI state",
            "Back/cancel restores originating screen",
            "Long values and supported phone safe areas"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "SHOP03",
          "captureNote": "Native Unity UI with sample data."
        },
        {
          "id": "SHOP04",
          "screenId": "shop-home-featured-drop",
          "group": "Shop home / featured drop",
          "title": "No drop / invalid or unresolvable drop",
          "trigger": "Empty data, invalid date or item missing from ItemLibrary.",
          "result": "Drop card hidden; other Shop navigation remains.",
          "source": {
            "file": "Assets/_Scripts/UI/Lobby/ItemDropCard.cs",
            "line": 185
          },
          "original": "assets/states/SHOP04.png",
          "updated": null,
          "checks": [
            "Correct native UI state",
            "Back/cancel restores originating screen",
            "Long values and supported phone safe areas"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "SHOP04",
          "captureNote": "Native Unity UI with sample data."
        },
        {
          "id": "SHOP05",
          "screenId": "shop-home-featured-drop",
          "group": "Shop home / featured drop",
          "title": "Drop refresh failure",
          "trigger": "GetDropItems callback fails.",
          "result": "Cached source cleared and card hidden; refresh on future enable after cooldown.",
          "source": {
            "file": "Assets/_Scripts/UI/Lobby/ItemDropCard.cs",
            "line": 358
          },
          "original": "assets/states/SHOP04.png",
          "updated": null,
          "checks": [
            "Correct native UI state",
            "Back/cancel restores originating screen",
            "Long values and supported phone safe areas"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "SHOP04",
          "captureNote": "Native Unity UI with sample data. This state shares its visual layout with capture SHOP04."
        },
        {
          "id": "SHOP06",
          "screenId": "shop-home-featured-drop",
          "group": "Shop home / featured drop",
          "title": "Artwork waiting / fallback",
          "trigger": "Backend card image pending or download missing/fails.",
          "result": "Bundled item image used as fallback; successful backend card suppresses duplicate item icon.",
          "source": {
            "file": "Assets/_Scripts/UI/Lobby/ItemDropCard.cs",
            "line": 233
          },
          "original": "assets/states/SHOP01.png",
          "updated": null,
          "checks": [
            "Correct native UI state",
            "Back/cancel restores originating screen",
            "Long values and supported phone safe areas"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "sources": [
            {
              "file": "Assets/_Scripts/UI/Lobby/ItemDropCard.cs",
              "line": 320
            }
          ],
          "captureKey": "SHOP01",
          "captureNote": "Native Unity UI with sample data. This state shares its visual layout with capture SHOP01."
        }
      ],
      "flows": [
        {
          "id": "ASPF07",
          "title": "Shop \u2192 catalogue \u2192 weapon category \u2192 details",
          "steps": [
            "SHOP01",
            "CAT01",
            "ARM01",
            "SD01"
          ],
          "screenIds": [
            "shop-home-featured-drop",
            "shop-category-catalogue",
            "weapon-shop-armoury-browser",
            "shop-weapon-drop-details"
          ],
          "source": {
            "file": "Assets/_Scripts/UI/Lobby/ShopWeaponControllerUI.cs",
            "line": 241
          },
          "animation": "Immediate page change, Armoury environment activation and asynchronous rotating weapon preview.",
          "runtimeVerified": false,
          "motionStatus": "Source traced; real Unity recording pending"
        },
        {
          "id": "ASPF08",
          "title": "Featured drop upcoming / active / sold-out review",
          "steps": [
            "SHOP02",
            "SHOP01",
            "SD02",
            "SD03"
          ],
          "screenIds": [
            "shop-home-featured-drop",
            "shop-weapon-drop-details"
          ],
          "source": {
            "file": "Assets/_Scripts/UI/Lobby/ItemDropCard.cs",
            "line": 80
          },
          "animation": "Data refresh/caption changes; source refresh cooldown2s on enable, no continuous countdown loop evidenced.",
          "runtimeVerified": false,
          "motionStatus": "Source traced; real Unity recording pending"
        },
        {
          "id": "ASPF09",
          "title": "Armoury buy \u2192 quantity \u2192 reveal \u2192 Shop",
          "steps": [
            "ARM07",
            "ARM11",
            "ARM12",
            "ARM14",
            "ARM16",
            "SHOP01"
          ],
          "screenIds": [
            "weapon-shop-armoury-browser",
            "shop-home-featured-drop"
          ],
          "source": {
            "file": "Assets/_Scripts/UI/Lobby/Shop/ShopPurchaseHandler.cs",
            "line": 96
          },
          "animation": "Quantity popup immediate show; reveal waits0.75s then purchased text slide0.5s easeOutBack;1s later image scale10\u21920.9 in0.5s easeInOutBack;1s later buttons/info slide1.25s easeOutQuad.",
          "runtimeVerified": false,
          "motionStatus": "Source traced; real Unity recording pending"
        },
        {
          "id": "ASPF12",
          "title": "Shop \u2192 Elixir \u2192 quantity \u2192 purchase reveal",
          "steps": [
            "CAT01",
            "EL01",
            "ELD01",
            "ELD02",
            "ELD04",
            "ELD06",
            "SHOP01"
          ],
          "screenIds": [
            "shop-category-catalogue",
            "elixir-shop",
            "elixir-purchase-details",
            "shop-home-featured-drop"
          ],
          "source": {
            "file": "Assets/_Scripts/UI/Lobby/Shop2/ElixirDetailsView.cs",
            "line": 59
          },
          "animation": "Native purchase reveal sequence reused with vial artwork. Check delayed balance refresh and safe page exit.",
          "runtimeVerified": false,
          "motionStatus": "Source traced; real Unity recording pending"
        }
      ],
      "exclusions": [
        "New Loadout landing not implemented: ",
        "Gadget/hoverboard details not currently routed: ",
        "Separate X-Droid details: ",
        "Droid skins and Elixir tanks shop: ",
        "Mystery Draw: ",
        "Gem success / promo legacy objects: ",
        "Purchase reveal Share: ",
        "Market supply/prices on weapon details: ",
        "Weapon abilities overlay button: ",
        "Hunt streak / demotion profile views: ",
        "Legacy AnimatedUIPanel is not proof of current page animation: ",
        "Inventory Launcher tab: "
      ],
      "crossChecks": [
        "Never invoke purchase/equip/store/backend callbacks for offline visual fixtures.",
        "Capture is an injected-data native view, not evidence of successful backend transitions.",
        "Preserve original/current production UI and new-review responsive rules; no screen redesign performed by this audit.",
        "Each state includes source evidence; multiple data/error cases may share the same screenshot while their transition checks remain separate.",
        "Important source discrepancies: Gems orphan confirmation; Elixir max999 not affordability capped; stats WinRatio wired kd_ratio; unhandled missing ability maps; missing shop data error UI."
      ],
      "entry": "Main lobby Shop",
      "outgoing": [
        "shop-category-catalogue",
        "shop-weapon-drop-details",
        "buy-gems",
        "main-lobby"
      ]
    },
    "shop-category-catalogue": {
      "revision": "all-screen-audit-v1",
      "states": [
        {
          "id": "CAT01",
          "screenId": "shop-category-catalogue",
          "group": "Shop category catalogue",
          "title": "Active catalogue categories",
          "trigger": "Open All Items.",
          "result": "Weapons and Elixir Vials routes; inactive Droid Skins and Elixir Tanks excluded.",
          "source": {
            "file": "Assets/Prefabs/UI/New/MainMenu/LobbyUICanvas.prefab",
            "line": 86066
          },
          "original": "assets/states/CAT01.png",
          "updated": null,
          "checks": [
            "Correct native UI state",
            "Back/cancel restores originating screen",
            "Long values and supported phone safe areas"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "sources": [
            {
              "file": "Assets/Prefabs/UI/New/MainMenu/LobbyUICanvas.prefab",
              "line": 69436
            },
            {
              "file": "Assets/Prefabs/UI/New/MainMenu/LobbyUICanvas.prefab",
              "line": 211471
            },
            {
              "file": "Assets/Prefabs/UI/New/MainMenu/LobbyUICanvas.prefab",
              "line": 264049
            }
          ],
          "captureKey": "CAT01",
          "captureNote": "Native Unity UI with sample data."
        }
      ],
      "flows": [
        {
          "id": "ASPF07",
          "title": "Shop \u2192 catalogue \u2192 weapon category \u2192 details",
          "steps": [
            "SHOP01",
            "CAT01",
            "ARM01",
            "SD01"
          ],
          "screenIds": [
            "shop-home-featured-drop",
            "shop-category-catalogue",
            "weapon-shop-armoury-browser",
            "shop-weapon-drop-details"
          ],
          "source": {
            "file": "Assets/_Scripts/UI/Lobby/ShopWeaponControllerUI.cs",
            "line": 241
          },
          "animation": "Immediate page change, Armoury environment activation and asynchronous rotating weapon preview.",
          "runtimeVerified": false,
          "motionStatus": "Source traced; real Unity recording pending"
        },
        {
          "id": "ASPF12",
          "title": "Shop \u2192 Elixir \u2192 quantity \u2192 purchase reveal",
          "steps": [
            "CAT01",
            "EL01",
            "ELD01",
            "ELD02",
            "ELD04",
            "ELD06",
            "SHOP01"
          ],
          "screenIds": [
            "shop-category-catalogue",
            "elixir-shop",
            "elixir-purchase-details",
            "shop-home-featured-drop"
          ],
          "source": {
            "file": "Assets/_Scripts/UI/Lobby/Shop2/ElixirDetailsView.cs",
            "line": 59
          },
          "animation": "Native purchase reveal sequence reused with vial artwork. Check delayed balance refresh and safe page exit.",
          "runtimeVerified": false,
          "motionStatus": "Source traced; real Unity recording pending"
        }
      ],
      "exclusions": [
        "New Loadout landing not implemented: ",
        "Gadget/hoverboard details not currently routed: ",
        "Separate X-Droid details: ",
        "Droid skins and Elixir tanks shop: ",
        "Mystery Draw: ",
        "Gem success / promo legacy objects: ",
        "Purchase reveal Share: ",
        "Market supply/prices on weapon details: ",
        "Weapon abilities overlay button: ",
        "Hunt streak / demotion profile views: ",
        "Legacy AnimatedUIPanel is not proof of current page animation: ",
        "Inventory Launcher tab: "
      ],
      "crossChecks": [
        "Never invoke purchase/equip/store/backend callbacks for offline visual fixtures.",
        "Capture is an injected-data native view, not evidence of successful backend transitions.",
        "Preserve original/current production UI and new-review responsive rules; no screen redesign performed by this audit.",
        "Each state includes source evidence; multiple data/error cases may share the same screenshot while their transition checks remain separate.",
        "Important source discrepancies: Gems orphan confirmation; Elixir max999 not affordability capped; stats WinRatio wired kd_ratio; unhandled missing ability maps; missing shop data error UI."
      ],
      "entry": "ShopFront AllItemsButton",
      "outgoing": [
        "weapon-shop-armoury-browser",
        "elixir-shop",
        "buy-gems",
        "shop-home-featured-drop"
      ]
    },
    "weapon-shop-armoury-browser": {
      "revision": "all-screen-audit-v1",
      "states": [
        {
          "id": "ARM01",
          "screenId": "weapon-shop-armoury-browser",
          "group": "Weapon shop / Armoury browser",
          "title": "Assault rifles category",
          "trigger": "Select Assault rifles tab.",
          "result": "Matching shop weapons populate; first weapon automatically selected.",
          "source": {
            "file": "Assets/_Scripts/UI/Lobby/ShopWeaponControllerUI.cs",
            "line": 52
          },
          "original": "assets/states/ARM01.png",
          "updated": null,
          "checks": [
            "Correct native UI state",
            "Back/cancel restores originating screen",
            "Long values and supported phone safe areas"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "ARM01",
          "captureNote": "Native Unity UI with sample data. Original 3D preview scene and bundled model."
        },
        {
          "id": "ARM02",
          "screenId": "weapon-shop-armoury-browser",
          "group": "Weapon shop / Armoury browser",
          "title": "Snipers category",
          "trigger": "Select Snipers tab.",
          "result": "Matching shop weapons populate; first weapon automatically selected.",
          "source": {
            "file": "Assets/_Scripts/UI/Lobby/ShopWeaponControllerUI.cs",
            "line": 52
          },
          "original": "assets/states/ARM02.png",
          "updated": null,
          "checks": [
            "Correct native UI state",
            "Back/cancel restores originating screen",
            "Long values and supported phone safe areas"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "ARM02",
          "captureNote": "Native Unity UI with sample data. Original 3D preview scene and bundled model."
        },
        {
          "id": "ARM03",
          "screenId": "weapon-shop-armoury-browser",
          "group": "Weapon shop / Armoury browser",
          "title": "Launchers category",
          "trigger": "Select Launchers tab.",
          "result": "Matching shop weapons populate; first weapon automatically selected.",
          "source": {
            "file": "Assets/_Scripts/UI/Lobby/ShopWeaponControllerUI.cs",
            "line": 52
          },
          "original": "assets/states/ARM03.png",
          "updated": null,
          "checks": [
            "Correct native UI state",
            "Back/cancel restores originating screen",
            "Long values and supported phone safe areas"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "ARM03",
          "captureNote": "Native Unity UI with sample data. Original 3D preview scene and bundled model."
        },
        {
          "id": "ARM04",
          "screenId": "weapon-shop-armoury-browser",
          "group": "Weapon shop / Armoury browser",
          "title": "Special weapons category",
          "trigger": "Select Special weapons tab.",
          "result": "Matching shop weapons populate; first weapon automatically selected.",
          "source": {
            "file": "Assets/_Scripts/UI/Lobby/ShopWeaponControllerUI.cs",
            "line": 52
          },
          "original": "assets/states/ARM04.png",
          "updated": null,
          "checks": [
            "Correct native UI state",
            "Back/cancel restores originating screen",
            "Long values and supported phone safe areas"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "ARM04",
          "captureNote": "Native Unity UI with sample data. Original 3D preview scene and bundled model."
        },
        {
          "id": "ARM05",
          "screenId": "weapon-shop-armoury-browser",
          "group": "Weapon shop / Armoury browser",
          "title": "SMGs category",
          "trigger": "Select SMGs tab.",
          "result": "Matching shop weapons populate; first weapon automatically selected.",
          "source": {
            "file": "Assets/_Scripts/UI/Lobby/ShopWeaponControllerUI.cs",
            "line": 52
          },
          "original": "assets/states/ARM05.png",
          "updated": null,
          "checks": [
            "Correct native UI state",
            "Back/cancel restores originating screen",
            "Long values and supported phone safe areas"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "ARM05",
          "captureNote": "Native Unity UI with sample data. Original 3D preview scene and bundled model."
        },
        {
          "id": "ARM06",
          "screenId": "weapon-shop-armoury-browser",
          "group": "Weapon shop / Armoury browser",
          "title": "Selected weapon already owned",
          "trigger": "Selected weapon slug exists in owned list.",
          "result": "OWNED tag visible; purchase reads BUY MORE.",
          "source": {
            "file": "Assets/_Scripts/UI/Lobby/ShopWeaponControllerUI.cs",
            "line": 117
          },
          "original": "assets/states/ARM06.png",
          "updated": null,
          "checks": [
            "Correct native UI state",
            "Back/cancel restores originating screen",
            "Long values and supported phone safe areas"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "ARM06",
          "captureNote": "Native Unity UI with sample data. Original 3D preview scene and bundled model."
        },
        {
          "id": "ARM07",
          "screenId": "weapon-shop-armoury-browser",
          "group": "Weapon shop / Armoury browser",
          "title": "Selected weapon unowned",
          "trigger": "Selected weapon absent from owned list.",
          "result": "OWNED hidden; purchase reads BUY FOR.",
          "source": {
            "file": "Assets/_Scripts/UI/Lobby/ShopWeaponControllerUI.cs",
            "line": 121
          },
          "original": "assets/states/ARM01.png",
          "updated": null,
          "checks": [
            "Correct native UI state",
            "Back/cancel restores originating screen",
            "Long values and supported phone safe areas"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "ARM01",
          "captureNote": "Native Unity UI with sample data. This state shares its visual layout with capture ARM01. Original 3D preview scene and bundled model."
        },
        {
          "id": "ARM08",
          "screenId": "weapon-shop-armoury-browser",
          "group": "Weapon shop / Armoury browser",
          "title": "Empty shop category notice",
          "trigger": "No matching weapons in selected category.",
          "result": "Shop Notice modal with category-specific no-weapons message and Okay.",
          "source": {
            "file": "Assets/_Scripts/UI/Lobby/ShopWeaponControllerUI.cs",
            "line": 246
          },
          "original": "assets/states/ARM08.png",
          "updated": null,
          "checks": [
            "Correct native UI state",
            "Back/cancel restores originating screen",
            "Long values and supported phone safe areas"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "ARM08",
          "captureNote": "Native Unity UI with sample data. Original 3D preview scene and bundled model."
        },
        {
          "id": "ARM09",
          "screenId": "weapon-shop-armoury-browser",
          "group": "Weapon shop / Armoury browser",
          "title": "Weapon showcase loading / rapid switch",
          "trigger": "Select weapon starts downloadable showcase request.",
          "result": "Old model removed; stale coroutine stopped on new selection or page exit.",
          "source": {
            "file": "Assets/_Scripts/UI/Lobby/ShopWeaponControllerUI.cs",
            "line": 138
          },
          "original": "assets/states/ARM09.png",
          "updated": null,
          "checks": [
            "Correct native UI state",
            "Back/cancel restores originating screen",
            "Long values and supported phone safe areas"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "ARM09",
          "captureNote": "Native Unity UI with sample data. Original 3D preview scene and bundled model."
        },
        {
          "id": "ARM10",
          "screenId": "weapon-shop-armoury-browser",
          "group": "Weapon shop / Armoury browser",
          "title": "Rotate weapon / drag",
          "trigger": "Showcase ready, auto rotates; user drags.",
          "result": "Drag stops automatic rotation; release resumes.",
          "source": {
            "file": "Assets/_Scripts/UI/Lobby/ShopWeaponControllerUI.cs",
            "line": 183
          },
          "original": "assets/states/ARM10.png",
          "updated": null,
          "checks": [
            "Correct native UI state",
            "Back/cancel restores originating screen",
            "Long values and supported phone safe areas"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "ARM10",
          "captureNote": "Native Unity UI with sample data. Original 3D preview scene and bundled model."
        },
        {
          "id": "ARM11",
          "screenId": "weapon-shop-armoury-browser",
          "group": "Weapon shop / Armoury browser",
          "title": "Quantity picker \u2014 minimum",
          "trigger": "Buy pressed with sufficient Gems.",
          "result": "Shared quantity popup starts at 1; displays per-user/affordable cap and total price.",
          "source": {
            "file": "Assets/_Scripts/UI/Lobby/Shop/ShopPurchaseHandler.cs",
            "line": 96
          },
          "original": "assets/states/ARM11.png",
          "updated": null,
          "checks": [
            "Correct native UI state",
            "Back/cancel restores originating screen",
            "Long values and supported phone safe areas"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "ARM11",
          "captureNote": "Native Unity UI with sample data. Original 3D preview scene and bundled model."
        },
        {
          "id": "ARM12",
          "screenId": "weapon-shop-armoury-browser",
          "group": "Weapon shop / Armoury browser",
          "title": "Quantity picker \u2014 maximum",
          "trigger": "Tap + to available/affordable cap.",
          "result": "Quantity cannot exceed cap (min of 99 or drop stock/per-user cap, and affordability); minus cannot go below1.",
          "source": {
            "file": "Assets/_Scripts/UI/Lobby/Shop/ShopPurchaseHandler.cs",
            "line": 104
          },
          "original": "assets/states/ARM12.png",
          "updated": null,
          "checks": [
            "Correct native UI state",
            "Back/cancel restores originating screen",
            "Long values and supported phone safe areas"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "sources": [
            {
              "file": "Assets/_Scripts/UI/Lobby/Shop2/MultiplePurchasePopup.cs",
              "line": 73
            }
          ],
          "captureKey": "ARM12",
          "captureNote": "Native Unity UI with sample data. Original 3D preview scene and bundled model."
        },
        {
          "id": "ARM13",
          "screenId": "weapon-shop-armoury-browser",
          "group": "Weapon shop / Armoury browser",
          "title": "Insufficient Gems",
          "trigger": "Buy pressed below single-item cost.",
          "result": "YOU NEED MORE GEMS modal; Buy Gems routes to 204, Dismiss returns.",
          "source": {
            "file": "Assets/_Scripts/UI/Lobby/Shop/ShopPurchaseHandler.cs",
            "line": 120
          },
          "original": "assets/states/ARM13.png",
          "updated": null,
          "checks": [
            "Correct native UI state",
            "Back/cancel restores originating screen",
            "Long values and supported phone safe areas"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "ARM13",
          "captureNote": "Native Unity UI with sample data. Original 3D preview scene and bundled model."
        },
        {
          "id": "ARM14",
          "screenId": "weapon-shop-armoury-browser",
          "group": "Weapon shop / Armoury browser",
          "title": "Purchase submitting / inventory refreshing",
          "trigger": "Confirm quantity purchase.",
          "result": "Quantity popup closes; request runs then refreshes owned items; no dedicated spinner set by purchase handler.",
          "source": {
            "file": "Assets/_Scripts/UI/Lobby/Shop/ShopPurchaseHandler.cs",
            "line": 152
          },
          "original": "assets/states/ARM01.png",
          "updated": null,
          "checks": [
            "Correct native UI state",
            "Back/cancel restores originating screen",
            "Long values and supported phone safe areas"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "sources": [
            {
              "file": "Assets/_Scripts/Items/ItemManager.cs",
              "line": 477
            }
          ],
          "captureKey": "ARM01",
          "captureNote": "Native Unity UI with sample data. This state shares its visual layout with capture ARM01. Original 3D preview scene and bundled model."
        },
        {
          "id": "ARM15",
          "screenId": "weapon-shop-armoury-browser",
          "group": "Weapon shop / Armoury browser",
          "title": "Purchase rejected / request failed",
          "trigger": "Purchase callback fails.",
          "result": "Error dialogue presents sanitized backend message or Failed to purchase the item.; Okay dismisses.",
          "source": {
            "file": "Assets/_Scripts/Items/ItemManager.cs",
            "line": 683
          },
          "original": "assets/states/ARM15.png",
          "updated": null,
          "checks": [
            "Correct native UI state",
            "Back/cancel restores originating screen",
            "Long values and supported phone safe areas"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "ARM15",
          "captureNote": "Native Unity UI with sample data. Original 3D preview scene and bundled model."
        },
        {
          "id": "ARM16",
          "screenId": "weapon-shop-armoury-browser",
          "group": "Weapon shop / Armoury browser",
          "title": "Weapon purchase reveal",
          "trigger": "Purchase succeeds and owned items refreshed.",
          "result": "ItemPurchasedOverlay stages purchased text, weapon image, then details/buttons; Continue routes ShopFront.",
          "source": {
            "file": "Assets/_Scripts/UI/Lobby/PurchaseReveal.cs",
            "line": 141
          },
          "original": "assets/states/ARM16.png",
          "updated": null,
          "checks": [
            "Correct native UI state",
            "Back/cancel restores originating screen",
            "Long values and supported phone safe areas"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "sources": [
            {
              "file": "Assets/Prefabs/UI/New/MainMenu/LobbyUICanvas.prefab",
              "line": 265760
            }
          ],
          "captureKey": "ARM16",
          "captureNote": "Native Unity UI with sample data."
        },
        {
          "id": "ARM17",
          "screenId": "weapon-shop-armoury-browser",
          "group": "Weapon shop / Armoury browser",
          "title": "Reveal art unavailable",
          "trigger": "Weapon purchased art missing URL or download fails.",
          "result": "Weapon image remains clear; reveal background uses bundled fallback or transparent. Success UI still proceeds.",
          "source": {
            "file": "Assets/_Scripts/UI/Lobby/PurchaseReveal.cs",
            "line": 35
          },
          "original": "assets/states/ARM17.png",
          "updated": null,
          "checks": [
            "Correct native UI state",
            "Back/cancel restores originating screen",
            "Long values and supported phone safe areas"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "ARM17",
          "captureNote": "Native Unity UI with sample data."
        }
      ],
      "flows": [
        {
          "id": "ASPF07",
          "title": "Shop \u2192 catalogue \u2192 weapon category \u2192 details",
          "steps": [
            "SHOP01",
            "CAT01",
            "ARM01",
            "SD01"
          ],
          "screenIds": [
            "shop-home-featured-drop",
            "shop-category-catalogue",
            "weapon-shop-armoury-browser",
            "shop-weapon-drop-details"
          ],
          "source": {
            "file": "Assets/_Scripts/UI/Lobby/ShopWeaponControllerUI.cs",
            "line": 241
          },
          "animation": "Immediate page change, Armoury environment activation and asynchronous rotating weapon preview.",
          "runtimeVerified": false,
          "motionStatus": "Source traced; real Unity recording pending"
        },
        {
          "id": "ASPF09",
          "title": "Armoury buy \u2192 quantity \u2192 reveal \u2192 Shop",
          "steps": [
            "ARM07",
            "ARM11",
            "ARM12",
            "ARM14",
            "ARM16",
            "SHOP01"
          ],
          "screenIds": [
            "weapon-shop-armoury-browser",
            "shop-home-featured-drop"
          ],
          "source": {
            "file": "Assets/_Scripts/UI/Lobby/Shop/ShopPurchaseHandler.cs",
            "line": 96
          },
          "animation": "Quantity popup immediate show; reveal waits0.75s then purchased text slide0.5s easeOutBack;1s later image scale10\u21920.9 in0.5s easeInOutBack;1s later buttons/info slide1.25s easeOutQuad.",
          "runtimeVerified": false,
          "motionStatus": "Source traced; real Unity recording pending"
        }
      ],
      "exclusions": [
        "New Loadout landing not implemented: ",
        "Gadget/hoverboard details not currently routed: ",
        "Separate X-Droid details: ",
        "Droid skins and Elixir tanks shop: ",
        "Mystery Draw: ",
        "Gem success / promo legacy objects: ",
        "Purchase reveal Share: ",
        "Market supply/prices on weapon details: ",
        "Weapon abilities overlay button: ",
        "Hunt streak / demotion profile views: ",
        "Legacy AnimatedUIPanel is not proof of current page animation: ",
        "Inventory Launcher tab: "
      ],
      "crossChecks": [
        "Never invoke purchase/equip/store/backend callbacks for offline visual fixtures.",
        "Capture is an injected-data native view, not evidence of successful backend transitions.",
        "Preserve original/current production UI and new-review responsive rules; no screen redesign performed by this audit.",
        "Each state includes source evidence; multiple data/error cases may share the same screenshot while their transition checks remain separate.",
        "Important source discrepancies: Gems orphan confirmation; Elixir max999 not affordability capped; stats WinRatio wired kd_ratio; unhandled missing ability maps; missing shop data error UI."
      ],
      "entry": "Catalogue Weapons",
      "outgoing": [
        "shop-weapon-drop-details",
        "buy-gems"
      ]
    },
    "shop-weapon-drop-details": {
      "revision": "all-screen-audit-v1",
      "states": [
        {
          "id": "SD01",
          "screenId": "shop-weapon-drop-details",
          "group": "Shop weapon / drop details",
          "title": "Catalogue weapon details",
          "trigger": "Armoury More Details.",
          "result": "Weapon stats, abilities and BUY MORE configured, even if entry came from unowned catalogue weapon.",
          "source": {
            "file": "Assets/_Scripts/UI/Lobby/ShopDropItemViewDetails.cs",
            "line": 17
          },
          "original": "assets/states/SD01.png",
          "updated": null,
          "checks": [
            "Correct native UI state",
            "Back/cancel restores originating screen",
            "Long values and supported phone safe areas"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "SD01",
          "captureNote": "Native Unity UI with sample data."
        },
        {
          "id": "SD02",
          "screenId": "shop-weapon-drop-details",
          "group": "Shop weapon / drop details",
          "title": "Drop details available",
          "trigger": "Featured drop opens with resolved weapon and positive quantity.",
          "result": "Purchase reads BUY NOW and uses drop price when >0, else item gem price.",
          "source": {
            "file": "Assets/_Scripts/UI/Lobby/ShopDropItemViewDetails.cs",
            "line": 39
          },
          "original": "assets/states/SD02.png",
          "updated": null,
          "checks": [
            "Correct native UI state",
            "Back/cancel restores originating screen",
            "Long values and supported phone safe areas"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "SD02",
          "captureNote": "Native Unity UI with sample data."
        },
        {
          "id": "SD03",
          "screenId": "shop-weapon-drop-details",
          "group": "Shop weapon / drop details",
          "title": "Drop sold out",
          "trigger": "Drop quantity <=0.",
          "result": "Buy button disabled; price reads SOLD OUT.",
          "source": {
            "file": "Assets/_Scripts/UI/Lobby/Shop/ShopPurchaseHandler.cs",
            "line": 41
          },
          "original": "assets/states/SD03.png",
          "updated": null,
          "checks": [
            "Correct native UI state",
            "Back/cancel restores originating screen",
            "Long values and supported phone safe areas"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "SD03",
          "captureNote": "Native Unity UI with sample data."
        },
        {
          "id": "SD04",
          "screenId": "shop-weapon-drop-details",
          "group": "Shop weapon / drop details",
          "title": "Invalid price / missing item data",
          "trigger": "No positive gem price or no server data.",
          "result": "Purchase disabled; error logged, no dedicated friendly notice.",
          "source": {
            "file": "Assets/_Scripts/UI/Lobby/Shop/ShopPurchaseHandler.cs",
            "line": 33
          },
          "original": "assets/states/SD04.png",
          "updated": null,
          "checks": [
            "Correct native UI state",
            "Back/cancel restores originating screen",
            "Long values and supported phone safe areas"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "SD04",
          "captureNote": "Native Unity UI with sample data."
        },
        {
          "id": "SD05",
          "screenId": "shop-weapon-drop-details",
          "group": "Shop weapon / drop details",
          "title": "Expanded 3D inspection",
          "trigger": "Tap expand model on shop details.",
          "result": "Same fullscreen inspector/drag/async-loading behaviour as owned details.",
          "source": {
            "file": "Assets/_Scripts/UI/Lobby/WeaponDetailsViewModel.cs",
            "line": 206
          },
          "original": "assets/states/SD05.png",
          "updated": null,
          "checks": [
            "Correct native UI state",
            "Back/cancel restores originating screen",
            "Long values and supported phone safe areas"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "SD05",
          "captureNote": "Native Unity UI with sample data. Original 3D preview scene and bundled model."
        },
        {
          "id": "SD06",
          "screenId": "shop-weapon-drop-details",
          "group": "Shop weapon / drop details",
          "title": "Quantity picker \u2014 minimum",
          "trigger": "Buy pressed with sufficient Gems.",
          "result": "Shared quantity popup starts at 1; displays per-user/affordable cap and total price.",
          "source": {
            "file": "Assets/_Scripts/UI/Lobby/Shop/ShopPurchaseHandler.cs",
            "line": 96
          },
          "original": "assets/states/SD06.png",
          "updated": null,
          "checks": [
            "Correct native UI state",
            "Back/cancel restores originating screen",
            "Long values and supported phone safe areas"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "SD06",
          "captureNote": "Native Unity UI with sample data."
        },
        {
          "id": "SD07",
          "screenId": "shop-weapon-drop-details",
          "group": "Shop weapon / drop details",
          "title": "Quantity picker \u2014 maximum",
          "trigger": "Tap + to available/affordable cap.",
          "result": "Quantity cannot exceed cap (min of 99 or drop stock/per-user cap, and affordability); minus cannot go below1.",
          "source": {
            "file": "Assets/_Scripts/UI/Lobby/Shop/ShopPurchaseHandler.cs",
            "line": 104
          },
          "original": "assets/states/SD07.png",
          "updated": null,
          "checks": [
            "Correct native UI state",
            "Back/cancel restores originating screen",
            "Long values and supported phone safe areas"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "sources": [
            {
              "file": "Assets/_Scripts/UI/Lobby/Shop2/MultiplePurchasePopup.cs",
              "line": 73
            }
          ],
          "captureKey": "SD07",
          "captureNote": "Native Unity UI with sample data."
        },
        {
          "id": "SD08",
          "screenId": "shop-weapon-drop-details",
          "group": "Shop weapon / drop details",
          "title": "Insufficient Gems",
          "trigger": "Buy pressed below single-item cost.",
          "result": "YOU NEED MORE GEMS modal; Buy Gems routes to 204, Dismiss returns.",
          "source": {
            "file": "Assets/_Scripts/UI/Lobby/Shop/ShopPurchaseHandler.cs",
            "line": 120
          },
          "original": "assets/states/SD08.png",
          "updated": null,
          "checks": [
            "Correct native UI state",
            "Back/cancel restores originating screen",
            "Long values and supported phone safe areas"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "SD08",
          "captureNote": "Native Unity UI with sample data."
        },
        {
          "id": "SD09",
          "screenId": "shop-weapon-drop-details",
          "group": "Shop weapon / drop details",
          "title": "Purchase submitting / inventory refreshing",
          "trigger": "Confirm quantity purchase.",
          "result": "Quantity popup closes; request runs then refreshes owned items; no dedicated spinner set by purchase handler.",
          "source": {
            "file": "Assets/_Scripts/UI/Lobby/Shop/ShopPurchaseHandler.cs",
            "line": 152
          },
          "original": "assets/states/SD02.png",
          "updated": null,
          "checks": [
            "Correct native UI state",
            "Back/cancel restores originating screen",
            "Long values and supported phone safe areas"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "sources": [
            {
              "file": "Assets/_Scripts/Items/ItemManager.cs",
              "line": 477
            }
          ],
          "captureKey": "SD02",
          "captureNote": "Native Unity UI with sample data. This state shares its visual layout with capture SD02."
        },
        {
          "id": "SD10",
          "screenId": "shop-weapon-drop-details",
          "group": "Shop weapon / drop details",
          "title": "Purchase rejected / request failed",
          "trigger": "Purchase callback fails.",
          "result": "Error dialogue presents sanitized backend message or Failed to purchase the item.; Okay dismisses.",
          "source": {
            "file": "Assets/_Scripts/Items/ItemManager.cs",
            "line": 683
          },
          "original": "assets/states/SD10.png",
          "updated": null,
          "checks": [
            "Correct native UI state",
            "Back/cancel restores originating screen",
            "Long values and supported phone safe areas"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "SD10",
          "captureNote": "Native Unity UI with sample data."
        },
        {
          "id": "SD11",
          "screenId": "shop-weapon-drop-details",
          "group": "Shop weapon / drop details",
          "title": "Weapon purchase reveal",
          "trigger": "Purchase succeeds and owned items refreshed.",
          "result": "ItemPurchasedOverlay stages purchased text, weapon image, then details/buttons; Continue routes ShopFront.",
          "source": {
            "file": "Assets/_Scripts/UI/Lobby/PurchaseReveal.cs",
            "line": 141
          },
          "original": "assets/states/ARM16.png",
          "updated": null,
          "checks": [
            "Correct native UI state",
            "Back/cancel restores originating screen",
            "Long values and supported phone safe areas"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "sources": [
            {
              "file": "Assets/Prefabs/UI/New/MainMenu/LobbyUICanvas.prefab",
              "line": 265760
            }
          ],
          "captureKey": "ARM16",
          "captureNote": "Native Unity UI with sample data. This state shares its visual layout with capture ARM16."
        },
        {
          "id": "SD12",
          "screenId": "shop-weapon-drop-details",
          "group": "Shop weapon / drop details",
          "title": "Reveal art unavailable",
          "trigger": "Weapon purchased art missing URL or download fails.",
          "result": "Weapon image remains clear; reveal background uses bundled fallback or transparent. Success UI still proceeds.",
          "source": {
            "file": "Assets/_Scripts/UI/Lobby/PurchaseReveal.cs",
            "line": 35
          },
          "original": "assets/states/ARM17.png",
          "updated": null,
          "checks": [
            "Correct native UI state",
            "Back/cancel restores originating screen",
            "Long values and supported phone safe areas"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "ARM17",
          "captureNote": "Native Unity UI with sample data. This state shares its visual layout with capture ARM17."
        }
      ],
      "flows": [
        {
          "id": "ASPF07",
          "title": "Shop \u2192 catalogue \u2192 weapon category \u2192 details",
          "steps": [
            "SHOP01",
            "CAT01",
            "ARM01",
            "SD01"
          ],
          "screenIds": [
            "shop-home-featured-drop",
            "shop-category-catalogue",
            "weapon-shop-armoury-browser",
            "shop-weapon-drop-details"
          ],
          "source": {
            "file": "Assets/_Scripts/UI/Lobby/ShopWeaponControllerUI.cs",
            "line": 241
          },
          "animation": "Immediate page change, Armoury environment activation and asynchronous rotating weapon preview.",
          "runtimeVerified": false,
          "motionStatus": "Source traced; real Unity recording pending"
        },
        {
          "id": "ASPF08",
          "title": "Featured drop upcoming / active / sold-out review",
          "steps": [
            "SHOP02",
            "SHOP01",
            "SD02",
            "SD03"
          ],
          "screenIds": [
            "shop-home-featured-drop",
            "shop-weapon-drop-details"
          ],
          "source": {
            "file": "Assets/_Scripts/UI/Lobby/ItemDropCard.cs",
            "line": 80
          },
          "animation": "Data refresh/caption changes; source refresh cooldown2s on enable, no continuous countdown loop evidenced.",
          "runtimeVerified": false,
          "motionStatus": "Source traced; real Unity recording pending"
        },
        {
          "id": "ASPF10",
          "title": "Drop buy \u2192 insufficient Gems \u2192 native store \u2192 return",
          "steps": [
            "SD02",
            "SD08",
            "GEM02",
            "GEM04",
            "GEM05"
          ],
          "screenIds": [
            "shop-weapon-drop-details",
            "buy-gems"
          ],
          "source": {
            "file": "Assets/_Scripts/UI/Lobby/Shop/ShopPurchaseHandler.cs",
            "line": 120
          },
          "animation": "ConfirmPopup scales0\u21921 over0.3s easeOutBack; closes1\u21920 over0.2s easeInBack. Store sheet belongs to OS. Needs sandbox device capture.",
          "runtimeVerified": false,
          "motionStatus": "Source traced; real Unity recording pending"
        },
        {
          "id": "ASPF11",
          "title": "Drop purchase \u2192 quantity \u2192 reject \u2192 retry",
          "steps": [
            "SD02",
            "SD06",
            "SD09",
            "SD10",
            "SD02"
          ],
          "screenIds": [
            "shop-weapon-drop-details"
          ],
          "source": {
            "file": "Assets/_Scripts/Items/ItemManager.cs",
            "line": 683
          },
          "animation": "Quantity closes before request; generic error dialogue from DialogueManager; no loading spinner in purchase handler.",
          "runtimeVerified": false,
          "motionStatus": "Source traced; real Unity recording pending"
        }
      ],
      "exclusions": [
        "New Loadout landing not implemented: ",
        "Gadget/hoverboard details not currently routed: ",
        "Separate X-Droid details: ",
        "Droid skins and Elixir tanks shop: ",
        "Mystery Draw: ",
        "Gem success / promo legacy objects: ",
        "Purchase reveal Share: ",
        "Market supply/prices on weapon details: ",
        "Weapon abilities overlay button: ",
        "Hunt streak / demotion profile views: ",
        "Legacy AnimatedUIPanel is not proof of current page animation: ",
        "Inventory Launcher tab: "
      ],
      "crossChecks": [
        "Never invoke purchase/equip/store/backend callbacks for offline visual fixtures.",
        "Capture is an injected-data native view, not evidence of successful backend transitions.",
        "Preserve original/current production UI and new-review responsive rules; no screen redesign performed by this audit.",
        "Each state includes source evidence; multiple data/error cases may share the same screenshot while their transition checks remain separate.",
        "Important source discrepancies: Gems orphan confirmation; Elixir max999 not affordability capped; stats WinRatio wired kd_ratio; unhandled missing ability maps; missing shop data error UI."
      ],
      "entry": "Armoury MoreDetails or featured drop",
      "outgoing": [
        "shop-home-featured-drop",
        "buy-gems"
      ]
    },
    "elixir-shop": {
      "revision": "all-screen-audit-v1",
      "states": [
        {
          "id": "EL01",
          "screenId": "elixir-shop",
          "group": "Elixir shop",
          "title": "Available Elixir product cards",
          "trigger": "Shop items have matching vial slugs.",
          "result": "Only matched1/3/5/10/25/50/100-vial native cards enabled with quantity/price.",
          "source": {
            "file": "Assets/_Scripts/UI/Lobby/Shop2/ElixirShopContainer.cs",
            "line": 22
          },
          "original": "assets/states/EL01.png",
          "updated": null,
          "checks": [
            "Correct native UI state",
            "Back/cancel restores originating screen",
            "Long values and supported phone safe areas"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "EL01",
          "captureNote": "Native Unity UI with sample data."
        },
        {
          "id": "EL02",
          "screenId": "elixir-shop",
          "group": "Elixir shop",
          "title": "Partial / empty Elixir catalogue",
          "trigger": "Some or all expected slugs absent.",
          "result": "Unmatched serialized inactive cards remain hidden; no explicit no-products message.",
          "source": {
            "file": "Assets/_Scripts/UI/Lobby/Shop2/ElixirShopContainer.cs",
            "line": 71
          },
          "original": "assets/states/EL02.png",
          "updated": null,
          "checks": [
            "Correct native UI state",
            "Back/cancel restores originating screen",
            "Long values and supported phone safe areas"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "EL02",
          "captureNote": "Native Unity UI with sample data."
        },
        {
          "id": "EL03",
          "screenId": "elixir-shop",
          "group": "Elixir shop",
          "title": "Elixir card artwork override/fallback",
          "trigger": "Backend provides explicit card_image_id.",
          "result": "Remote override requested; bundled image retained otherwise.",
          "source": {
            "file": "Assets/_Scripts/UI/Lobby/Shop2/ElixirShopCard.cs",
            "line": 25
          },
          "original": "assets/states/EL01.png",
          "updated": null,
          "checks": [
            "Correct native UI state",
            "Back/cancel restores originating screen",
            "Long values and supported phone safe areas"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "EL01",
          "captureNote": "Native Unity UI with sample data. This state shares its visual layout with capture EL01."
        }
      ],
      "flows": [
        {
          "id": "ASPF12",
          "title": "Shop \u2192 Elixir \u2192 quantity \u2192 purchase reveal",
          "steps": [
            "CAT01",
            "EL01",
            "ELD01",
            "ELD02",
            "ELD04",
            "ELD06",
            "SHOP01"
          ],
          "screenIds": [
            "shop-category-catalogue",
            "elixir-shop",
            "elixir-purchase-details",
            "shop-home-featured-drop"
          ],
          "source": {
            "file": "Assets/_Scripts/UI/Lobby/Shop2/ElixirDetailsView.cs",
            "line": 59
          },
          "animation": "Native purchase reveal sequence reused with vial artwork. Check delayed balance refresh and safe page exit.",
          "runtimeVerified": false,
          "motionStatus": "Source traced; real Unity recording pending"
        }
      ],
      "exclusions": [
        "New Loadout landing not implemented: ",
        "Gadget/hoverboard details not currently routed: ",
        "Separate X-Droid details: ",
        "Droid skins and Elixir tanks shop: ",
        "Mystery Draw: ",
        "Gem success / promo legacy objects: ",
        "Purchase reveal Share: ",
        "Market supply/prices on weapon details: ",
        "Weapon abilities overlay button: ",
        "Hunt streak / demotion profile views: ",
        "Legacy AnimatedUIPanel is not proof of current page animation: ",
        "Inventory Launcher tab: "
      ],
      "crossChecks": [
        "Never invoke purchase/equip/store/backend callbacks for offline visual fixtures.",
        "Capture is an injected-data native view, not evidence of successful backend transitions.",
        "Preserve original/current production UI and new-review responsive rules; no screen redesign performed by this audit.",
        "Each state includes source evidence; multiple data/error cases may share the same screenshot while their transition checks remain separate.",
        "Important source discrepancies: Gems orphan confirmation; Elixir max999 not affordability capped; stats WinRatio wired kd_ratio; unhandled missing ability maps; missing shop data error UI."
      ],
      "entry": "Catalogue ElixirVialsButton",
      "outgoing": [
        "elixir-purchase-details",
        "buy-gems",
        "main-lobby"
      ]
    },
    "elixir-purchase-details": {
      "revision": "all-screen-audit-v1",
      "states": [
        {
          "id": "ELD01",
          "screenId": "elixir-purchase-details",
          "group": "Elixir purchase details",
          "title": "Elixir details",
          "trigger": "Select available card.",
          "result": "Title/description/price and estimated hunts floor(vials/3) visible; close returns Elixir shop.",
          "source": {
            "file": "Assets/_Scripts/UI/Lobby/Shop2/ElixirDetailsView.cs",
            "line": 32
          },
          "original": "assets/states/ELD01.png",
          "updated": null,
          "checks": [
            "Correct native UI state",
            "Back/cancel restores originating screen",
            "Long values and supported phone safe areas"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "ELD01",
          "captureNote": "Native Unity UI with sample data."
        },
        {
          "id": "ELD02",
          "screenId": "elixir-purchase-details",
          "group": "Elixir purchase details",
          "title": "Quantity purchase picker",
          "trigger": "Buy with sufficient Gems.",
          "result": "Quantity popup starts1, max999 (this path is not capped by affordability); total recalculates.",
          "source": {
            "file": "Assets/_Scripts/UI/Lobby/Shop2/ElixirDetailsView.cs",
            "line": 59
          },
          "original": "assets/states/ELD02.png",
          "updated": null,
          "checks": [
            "Correct native UI state",
            "Back/cancel restores originating screen",
            "Long values and supported phone safe areas"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "ELD02",
          "captureNote": "Native Unity UI with sample data."
        },
        {
          "id": "ELD03",
          "screenId": "elixir-purchase-details",
          "group": "Elixir purchase details",
          "title": "Insufficient Gems",
          "trigger": "Balance below pack cost.",
          "result": "More Gems popup offers Buy Gems or Dismiss.",
          "source": {
            "file": "Assets/_Scripts/UI/Lobby/Shop2/ElixirDetailsView.cs",
            "line": 74
          },
          "original": "assets/states/ELD03.png",
          "updated": null,
          "checks": [
            "Correct native UI state",
            "Back/cancel restores originating screen",
            "Long values and supported phone safe areas"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "ELD03",
          "captureNote": "Native Unity UI with sample data."
        },
        {
          "id": "ELD04",
          "screenId": "elixir-purchase-details",
          "group": "Elixir purchase details",
          "title": "Purchase pending / balance refresh retries",
          "trigger": "Confirm quantity; backend accepted, owned item balance has not caught up.",
          "result": "Original details until callback; retries balance refresh; accepted Elixir purchase still reports success after refresh failure.",
          "source": {
            "file": "Assets/_Scripts/Items/ItemManager.cs",
            "line": 617
          },
          "original": "assets/states/ELD01.png",
          "updated": null,
          "checks": [
            "Correct native UI state",
            "Back/cancel restores originating screen",
            "Long values and supported phone safe areas"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "ELD01",
          "captureNote": "Native Unity UI with sample data. This state shares its visual layout with capture ELD01."
        },
        {
          "id": "ELD05",
          "screenId": "elixir-purchase-details",
          "group": "Elixir purchase details",
          "title": "Elixir purchase rejected",
          "trigger": "Backend purchase failure.",
          "result": "Error/Okay dialogue on details, then retry possible.",
          "source": {
            "file": "Assets/_Scripts/Items/ItemManager.cs",
            "line": 683
          },
          "original": "assets/states/ELD05.png",
          "updated": null,
          "checks": [
            "Correct native UI state",
            "Back/cancel restores originating screen",
            "Long values and supported phone safe areas"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "ELD05",
          "captureNote": "Native Unity UI with sample data."
        },
        {
          "id": "ELD06",
          "screenId": "elixir-purchase-details",
          "group": "Elixir purchase details",
          "title": "Elixir purchase reveal",
          "trigger": "Purchase success callback.",
          "result": "Purchase reveal uses transparent bundled vial/icon override, black background, text and button entrance.",
          "source": {
            "file": "Assets/_Scripts/UI/Lobby/PurchaseReveal.cs",
            "line": 117
          },
          "original": "assets/states/ELD06.png",
          "updated": null,
          "checks": [
            "Correct native UI state",
            "Back/cancel restores originating screen",
            "Long values and supported phone safe areas"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "ELD06",
          "captureNote": "Native Unity UI with sample data."
        }
      ],
      "flows": [
        {
          "id": "ASPF12",
          "title": "Shop \u2192 Elixir \u2192 quantity \u2192 purchase reveal",
          "steps": [
            "CAT01",
            "EL01",
            "ELD01",
            "ELD02",
            "ELD04",
            "ELD06",
            "SHOP01"
          ],
          "screenIds": [
            "shop-category-catalogue",
            "elixir-shop",
            "elixir-purchase-details",
            "shop-home-featured-drop"
          ],
          "source": {
            "file": "Assets/_Scripts/UI/Lobby/Shop2/ElixirDetailsView.cs",
            "line": 59
          },
          "animation": "Native purchase reveal sequence reused with vial artwork. Check delayed balance refresh and safe page exit.",
          "runtimeVerified": false,
          "motionStatus": "Source traced; real Unity recording pending"
        },
        {
          "id": "ASPF13",
          "title": "Elixir insufficient Gems / cancel / retry",
          "steps": [
            "ELD01",
            "ELD03",
            "GEM02",
            "ELD01"
          ],
          "screenIds": [
            "elixir-purchase-details",
            "buy-gems"
          ],
          "source": {
            "file": "Assets/_Scripts/UI/Lobby/Shop2/ElixirDetailsView.cs",
            "line": 74
          },
          "animation": "ConfirmPopup scale in/out; Buy Gems Back returns ShopFront by prefab, not automatic originating Elixir details. Final Elixir step is explicit navigation again.",
          "runtimeVerified": false,
          "motionStatus": "Source traced; real Unity recording pending"
        }
      ],
      "exclusions": [
        "New Loadout landing not implemented: ",
        "Gadget/hoverboard details not currently routed: ",
        "Separate X-Droid details: ",
        "Droid skins and Elixir tanks shop: ",
        "Mystery Draw: ",
        "Gem success / promo legacy objects: ",
        "Purchase reveal Share: ",
        "Market supply/prices on weapon details: ",
        "Weapon abilities overlay button: ",
        "Hunt streak / demotion profile views: ",
        "Legacy AnimatedUIPanel is not proof of current page animation: ",
        "Inventory Launcher tab: "
      ],
      "crossChecks": [
        "Never invoke purchase/equip/store/backend callbacks for offline visual fixtures.",
        "Capture is an injected-data native view, not evidence of successful backend transitions.",
        "Preserve original/current production UI and new-review responsive rules; no screen redesign performed by this audit.",
        "Each state includes source evidence; multiple data/error cases may share the same screenshot while their transition checks remain separate.",
        "Important source discrepancies: Gems orphan confirmation; Elixir max999 not affordability capped; stats WinRatio wired kd_ratio; unhandled missing ability maps; missing shop data error UI."
      ],
      "entry": "Available Elixir card",
      "outgoing": [
        "elixir-shop",
        "buy-gems",
        "shop-home-featured-drop"
      ]
    },
    "buy-gems": {
      "revision": "all-screen-audit-v1",
      "states": [
        {
          "id": "GEM01",
          "screenId": "buy-gems",
          "group": "Buy Gems",
          "title": "Buy Gems \u2014 balance sufficient",
          "trigger": "Open Buy Gems with gems_balance>=10.",
          "result": "Title BUY GEMS; store products populate wired native cards.",
          "source": {
            "file": "Assets/_Scripts/UI/Lobby/Shop2/BuyGemsController.cs",
            "line": 22
          },
          "original": "assets/states/GEM01.png",
          "updated": null,
          "checks": [
            "Correct native UI state",
            "Back/cancel restores originating screen",
            "Long values and supported phone safe areas"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "GEM01",
          "captureNote": "Native Unity UI with sample data. Nominal initialized product state, orphan confirmation intentionally isolated as GEM07. Sample prices, not current store offers."
        },
        {
          "id": "GEM02",
          "screenId": "buy-gems",
          "group": "Buy Gems",
          "title": "Buy Gems \u2014 low balance",
          "trigger": "Open Buy Gems with gems_balance<10.",
          "result": "Title YOU DONT HAVE ENOUGH GEMS (fixed threshold10, not requested item price).",
          "source": {
            "file": "Assets/_Scripts/UI/Lobby/Shop2/BuyGemsController.cs",
            "line": 25
          },
          "original": "assets/states/GEM02.png",
          "updated": null,
          "checks": [
            "Correct native UI state",
            "Back/cancel restores originating screen",
            "Long values and supported phone safe areas"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "GEM02",
          "captureNote": "Native Unity UI with sample data. Nominal initialized product state, orphan confirmation intentionally isolated as GEM07. Sample prices, not current store offers."
        },
        {
          "id": "GEM03",
          "screenId": "buy-gems",
          "group": "Buy Gems",
          "title": "Product metadata unavailable / IAP not initialized",
          "trigger": "Store products missing or purchasing unavailable.",
          "result": "Card initialization depends on IAP Products; BuyProduct only logs unavailability; no dedicated error UI in these classes.",
          "source": {
            "file": "Assets/_Scripts/IAP/IAPManager.cs",
            "line": 291
          },
          "original": "assets/states/GEM03.png",
          "updated": null,
          "checks": [
            "Correct native UI state",
            "Back/cancel restores originating screen",
            "Long values and supported phone safe areas"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "GEM03",
          "captureNote": "Native Unity UI with sample data. Original product metadata placeholders without initialization. Not a claimed runtime empty state."
        },
        {
          "id": "GEM04",
          "screenId": "buy-gems",
          "group": "Buy Gems",
          "title": "Native purchase sheet",
          "trigger": "Tap initialized GemPackCard Buy.",
          "result": "Unity IAP opens platform store purchase; platform-owned sheet is outside native Unity layout.",
          "source": {
            "file": "Assets/_Scripts/UI/Lobby/Shop2/GemPackCard.cs",
            "line": 47
          },
          "original": "assets/states/GEM01.png",
          "updated": null,
          "checks": [
            "Correct native UI state",
            "Back/cancel restores originating screen",
            "Long values and supported phone safe areas"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "boundary": "Platform store IAP",
          "captureKey": "GEM01",
          "captureNote": "Native Unity UI with sample data. This state shares its visual layout with capture GEM01. Nominal initialized product state, orphan confirmation intentionally isolated as GEM07. Sample prices, not current store offers."
        },
        {
          "id": "GEM05",
          "screenId": "buy-gems",
          "group": "Buy Gems",
          "title": "Store success / receipt validation / balance refresh",
          "trigger": "Platform purchase completes.",
          "result": "Receipt validated via backend, local profile synced; success callback exists but no current BuyGemsController subscriber found.",
          "source": {
            "file": "Assets/_Scripts/IAP/IAPManager.cs",
            "line": 343
          },
          "original": "assets/states/GEM05.png",
          "updated": null,
          "checks": [
            "Correct native UI state",
            "Back/cancel restores originating screen",
            "Long values and supported phone safe areas"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "GEM05",
          "captureNote": "Native Unity UI with sample data. Nominal initialized product state, orphan confirmation intentionally isolated as GEM07. Sample prices, not current store offers."
        },
        {
          "id": "GEM06",
          "screenId": "buy-gems",
          "group": "Buy Gems",
          "title": "Store cancelled / failed / invalid receipt",
          "trigger": "Platform fails/cancels or backend receipt rejects.",
          "result": "Failure callback/log; no subscribed Unity error modal in current page code.",
          "source": {
            "file": "Assets/_Scripts/IAP/IAPManager.cs",
            "line": 254
          },
          "original": "assets/states/GEM01.png",
          "updated": null,
          "checks": [
            "Correct native UI state",
            "Back/cancel restores originating screen",
            "Long values and supported phone safe areas"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "GEM01",
          "captureNote": "Native Unity UI with sample data. This state shares its visual layout with capture GEM01. Nominal initialized product state, orphan confirmation intentionally isolated as GEM07. Sample prices, not current store offers."
        },
        {
          "id": "GEM07",
          "screenId": "buy-gems",
          "group": "Buy Gems",
          "title": "Orphan confirmation serialized visible \u2014 investigate",
          "trigger": "PurchaseGems prefab root activated as serialized.",
          "result": "GemsPurchaseConfirmation is active at scale1/fullscreen; Purchase and Cancel persistent targets are null. This is a source discrepancy, not a verified purchase route.",
          "source": {
            "file": "Assets/Prefabs/UI/New/MainMenu/LobbyUICanvas.prefab",
            "line": 163184
          },
          "original": "assets/states/GEM07.png",
          "updated": null,
          "checks": [
            "Correct native UI state",
            "Back/cancel restores originating screen",
            "Long values and supported phone safe areas"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "sources": [
            {
              "file": "Assets/Prefabs/UI/New/MainMenu/LobbyUICanvas.prefab",
              "line": 136742
            },
            {
              "file": "Assets/Prefabs/UI/New/MainMenu/LobbyUICanvas.prefab",
              "line": 243763
            }
          ],
          "classification": "Prefab anomaly requiring runtime check",
          "captureKey": "GEM07",
          "captureNote": "Native Unity UI with sample data. Original serialized-visible orphan confirmation with null callbacks; investigate in runtime. Do not treat as functioning checkout."
        }
      ],
      "flows": [
        {
          "id": "ASPF10",
          "title": "Drop buy \u2192 insufficient Gems \u2192 native store \u2192 return",
          "steps": [
            "SD02",
            "SD08",
            "GEM02",
            "GEM04",
            "GEM05"
          ],
          "screenIds": [
            "shop-weapon-drop-details",
            "buy-gems"
          ],
          "source": {
            "file": "Assets/_Scripts/UI/Lobby/Shop/ShopPurchaseHandler.cs",
            "line": 120
          },
          "animation": "ConfirmPopup scales0\u21921 over0.3s easeOutBack; closes1\u21920 over0.2s easeInBack. Store sheet belongs to OS. Needs sandbox device capture.",
          "runtimeVerified": false,
          "motionStatus": "Source traced; real Unity recording pending"
        },
        {
          "id": "ASPF13",
          "title": "Elixir insufficient Gems / cancel / retry",
          "steps": [
            "ELD01",
            "ELD03",
            "GEM02",
            "ELD01"
          ],
          "screenIds": [
            "elixir-purchase-details",
            "buy-gems"
          ],
          "source": {
            "file": "Assets/_Scripts/UI/Lobby/Shop2/ElixirDetailsView.cs",
            "line": 74
          },
          "animation": "ConfirmPopup scale in/out; Buy Gems Back returns ShopFront by prefab, not automatic originating Elixir details. Final Elixir step is explicit navigation again.",
          "runtimeVerified": false,
          "motionStatus": "Source traced; real Unity recording pending"
        },
        {
          "id": "ASPF16",
          "title": "Buy Gems store cancellation / failure",
          "steps": [
            "GEM01",
            "GEM04",
            "GEM06",
            "GEM01"
          ],
          "screenIds": [
            "buy-gems"
          ],
          "source": {
            "file": "Assets/_Scripts/IAP/IAPManager.cs",
            "line": 254
          },
          "animation": "Store-owned transitions plus Unity page return. Validate cancellation and receipt-validation failure with sandbox; no real money purchase for capture.",
          "runtimeVerified": false,
          "motionStatus": "Source traced; real Unity recording pending"
        }
      ],
      "exclusions": [
        "New Loadout landing not implemented: ",
        "Gadget/hoverboard details not currently routed: ",
        "Separate X-Droid details: ",
        "Droid skins and Elixir tanks shop: ",
        "Mystery Draw: ",
        "Gem success / promo legacy objects: ",
        "Purchase reveal Share: ",
        "Market supply/prices on weapon details: ",
        "Weapon abilities overlay button: ",
        "Hunt streak / demotion profile views: ",
        "Legacy AnimatedUIPanel is not proof of current page animation: ",
        "Inventory Launcher tab: "
      ],
      "crossChecks": [
        "Never invoke purchase/equip/store/backend callbacks for offline visual fixtures.",
        "Capture is an injected-data native view, not evidence of successful backend transitions.",
        "Preserve original/current production UI and new-review responsive rules; no screen redesign performed by this audit.",
        "Each state includes source evidence; multiple data/error cases may share the same screenshot while their transition checks remain separate.",
        "Important source discrepancies: Gems orphan confirmation; Elixir max999 not affordability capped; stats WinRatio wired kd_ratio; unhandled missing ability maps; missing shop data error UI."
      ],
      "entry": "Gem balance button or insufficient funds",
      "outgoing": [
        "shop-home-featured-drop"
      ]
    },
    "player-statistics": {
      "revision": "all-screen-audit-v1",
      "states": [
        {
          "id": "STAT01",
          "screenId": "player-statistics",
          "group": "Player statistics",
          "title": "Player statistics loaded",
          "trigger": "GetPlayerStats succeeds and XP current/next exist.",
          "result": "Stats populate, XP/rank header refreshed; several fields intentionally n/a in current code.",
          "source": {
            "file": "Assets/_Scripts/UI/Lobby/PlayerStatsAndRankScreen.cs",
            "line": 76
          },
          "original": "assets/states/STAT01.png",
          "updated": null,
          "checks": [
            "Correct native UI state",
            "Back/cancel restores originating screen",
            "Long values and supported phone safe areas"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "STAT01",
          "captureNote": "Native Unity UI with sample data."
        },
        {
          "id": "STAT02",
          "screenId": "player-statistics",
          "group": "Player statistics",
          "title": "Statistics loading / no response yet",
          "trigger": "Stats query pending.",
          "result": "Current serialized/cached labels remain; no dedicated spinner/loading component in this controller.",
          "source": {
            "file": "Assets/_Scripts/UI/Lobby/PlayerStatsLobbyUIData.cs",
            "line": 22
          },
          "original": "assets/states/STAT02.png",
          "updated": null,
          "checks": [
            "Correct native UI state",
            "Back/cancel restores originating screen",
            "Long values and supported phone safe areas"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "STAT02",
          "captureNote": "Native Unity UI with sample data."
        },
        {
          "id": "STAT03",
          "screenId": "player-statistics",
          "group": "Player statistics",
          "title": "Statistics request failed",
          "trigger": "Query callback false/null.",
          "result": "Logs failure; ReceivedUpdate fires but null stats short-circuits; cached UI persists when existing.",
          "source": {
            "file": "Assets/_Scripts/UI/Lobby/PlayerStatsLobbyUIData.cs",
            "line": 35
          },
          "original": "assets/states/STAT02.png",
          "updated": null,
          "checks": [
            "Correct native UI state",
            "Back/cancel restores originating screen",
            "Long values and supported phone safe areas"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "STAT02",
          "captureNote": "Native Unity UI with sample data. This state shares its visual layout with capture STAT02."
        },
        {
          "id": "STAT04",
          "screenId": "player-statistics",
          "group": "Player statistics",
          "title": "XP/rank unavailable / incomplete",
          "trigger": "XP handler/current level/next level absent.",
          "result": "Rank updater returns; existing header values remain.",
          "source": {
            "file": "Assets/_Scripts/UI/Lobby/PlayerStatsAndRankScreen.cs",
            "line": 117
          },
          "original": "assets/states/STAT02.png",
          "updated": null,
          "checks": [
            "Correct native UI state",
            "Back/cancel restores originating screen",
            "Long values and supported phone safe areas"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "STAT02",
          "captureNote": "Native Unity UI with sample data. This state shares its visual layout with capture STAT02."
        },
        {
          "id": "STAT05",
          "screenId": "player-statistics",
          "group": "Player statistics",
          "title": "Long name / large stats / rank changed",
          "trigger": "Updated valid user/XP response with large counters.",
          "result": "Native uppercase name, level/XP slider and rank colour gradient reflect data.",
          "source": {
            "file": "Assets/_Scripts/UI/Lobby/PlayerStatsAndRankScreen.cs",
            "line": 125
          },
          "original": "assets/states/STAT05.png",
          "updated": null,
          "checks": [
            "Correct native UI state",
            "Back/cancel restores originating screen",
            "Long values and supported phone safe areas"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "STAT05",
          "captureNote": "Native Unity UI with sample data."
        }
      ],
      "flows": [
        {
          "id": "ASPF14",
          "title": "Profile stats \u2192 ranks \u2192 XP help \u2192 ranks \u2192 stats",
          "steps": [
            "STAT01",
            "RANK01",
            "RANK06",
            "RANK01",
            "STAT01"
          ],
          "screenIds": [
            "player-statistics",
            "ranks-and-progression"
          ],
          "source": {
            "file": "Assets/Prefabs/UI/New/MainMenu/LobbyUICanvas.prefab",
            "line": 183768
          },
          "animation": "Native tab/overlay SetActive; rank card highlight/scale changes immediately, not animated interpolation in RanksPageElement.",
          "runtimeVerified": false,
          "motionStatus": "Source traced; real Unity recording pending"
        },
        {
          "id": "ASPF15",
          "title": "Profile loading / failure / successful refresh",
          "steps": [
            "STAT02",
            "STAT03",
            "STAT01",
            "STAT05"
          ],
          "screenIds": [
            "player-statistics"
          ],
          "source": {
            "file": "Assets/_Scripts/UI/Lobby/PlayerStatsLobbyUIData.cs",
            "line": 22
          },
          "animation": "Data replacement only; retry loop waits for response but callback failure ends loop; no dedicated Retry button in this page.",
          "runtimeVerified": false,
          "motionStatus": "Source traced; real Unity recording pending"
        }
      ],
      "exclusions": [
        "New Loadout landing not implemented: ",
        "Gadget/hoverboard details not currently routed: ",
        "Separate X-Droid details: ",
        "Droid skins and Elixir tanks shop: ",
        "Mystery Draw: ",
        "Gem success / promo legacy objects: ",
        "Purchase reveal Share: ",
        "Market supply/prices on weapon details: ",
        "Weapon abilities overlay button: ",
        "Hunt streak / demotion profile views: ",
        "Legacy AnimatedUIPanel is not proof of current page animation: ",
        "Inventory Launcher tab: "
      ],
      "crossChecks": [
        "Never invoke purchase/equip/store/backend callbacks for offline visual fixtures.",
        "Capture is an injected-data native view, not evidence of successful backend transitions.",
        "Preserve original/current production UI and new-review responsive rules; no screen redesign performed by this audit.",
        "Each state includes source evidence; multiple data/error cases may share the same screenshot while their transition checks remain separate.",
        "Important source discrepancies: Gems orphan confirmation; Elixir max999 not affordability capped; stats WinRatio wired kd_ratio; unhandled missing ability maps; missing shop data error UI."
      ],
      "entry": "Player card; Stats tab default",
      "outgoing": [
        "ranks-and-progression",
        "main-lobby"
      ]
    },
    "ranks-and-progression": {
      "revision": "all-screen-audit-v1",
      "states": [
        {
          "id": "RANK01",
          "screenId": "ranks-and-progression",
          "group": "Ranks and progression",
          "title": "Basic rank highlighted",
          "trigger": "Current level enters Basic threshold (1 in serialized configuration).",
          "result": "Matching rank card enlarged/solid frame and gradient; other cards use off scale/frame.",
          "source": {
            "file": "Assets/_Scripts/UI/Lobby/RanksMainCoordinator.cs",
            "line": 8
          },
          "original": "assets/states/RANK01.png",
          "updated": null,
          "checks": [
            "Correct native UI state",
            "Back/cancel restores originating screen",
            "Long values and supported phone safe areas"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "sources": [
            {
              "file": "Assets/Prefabs/UI/New/MainMenu/LobbyUICanvas.prefab",
              "line": 230643
            },
            {
              "file": "Assets/Animation/Events/LevelSystem/RanksPageElement.cs",
              "line": 34
            }
          ],
          "captureKey": "RANK01",
          "captureNote": "Native Unity UI with sample data."
        },
        {
          "id": "RANK02",
          "screenId": "ranks-and-progression",
          "group": "Ranks and progression",
          "title": "Rookie rank highlighted",
          "trigger": "Current level enters Rookie threshold (21 in serialized configuration).",
          "result": "Matching rank card enlarged/solid frame and gradient; other cards use off scale/frame.",
          "source": {
            "file": "Assets/_Scripts/UI/Lobby/RanksMainCoordinator.cs",
            "line": 8
          },
          "original": "assets/states/RANK02.png",
          "updated": null,
          "checks": [
            "Correct native UI state",
            "Back/cancel restores originating screen",
            "Long values and supported phone safe areas"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "sources": [
            {
              "file": "Assets/Prefabs/UI/New/MainMenu/LobbyUICanvas.prefab",
              "line": 230643
            },
            {
              "file": "Assets/Animation/Events/LevelSystem/RanksPageElement.cs",
              "line": 34
            }
          ],
          "captureKey": "RANK02",
          "captureNote": "Native Unity UI with sample data."
        },
        {
          "id": "RANK03",
          "screenId": "ranks-and-progression",
          "group": "Ranks and progression",
          "title": "Prime rank highlighted",
          "trigger": "Current level enters Prime threshold (41 in serialized configuration).",
          "result": "Matching rank card enlarged/solid frame and gradient; other cards use off scale/frame.",
          "source": {
            "file": "Assets/_Scripts/UI/Lobby/RanksMainCoordinator.cs",
            "line": 8
          },
          "original": "assets/states/RANK03.png",
          "updated": null,
          "checks": [
            "Correct native UI state",
            "Back/cancel restores originating screen",
            "Long values and supported phone safe areas"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "sources": [
            {
              "file": "Assets/Prefabs/UI/New/MainMenu/LobbyUICanvas.prefab",
              "line": 230643
            },
            {
              "file": "Assets/Animation/Events/LevelSystem/RanksPageElement.cs",
              "line": 34
            }
          ],
          "captureKey": "RANK03",
          "captureNote": "Native Unity UI with sample data."
        },
        {
          "id": "RANK04",
          "screenId": "ranks-and-progression",
          "group": "Ranks and progression",
          "title": "Elite rank highlighted",
          "trigger": "Current level enters Elite threshold (61 in serialized configuration).",
          "result": "Matching rank card enlarged/solid frame and gradient; other cards use off scale/frame.",
          "source": {
            "file": "Assets/_Scripts/UI/Lobby/RanksMainCoordinator.cs",
            "line": 8
          },
          "original": "assets/states/RANK04.png",
          "updated": null,
          "checks": [
            "Correct native UI state",
            "Back/cancel restores originating screen",
            "Long values and supported phone safe areas"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "sources": [
            {
              "file": "Assets/Prefabs/UI/New/MainMenu/LobbyUICanvas.prefab",
              "line": 230643
            },
            {
              "file": "Assets/Animation/Events/LevelSystem/RanksPageElement.cs",
              "line": 34
            }
          ],
          "captureKey": "RANK04",
          "captureNote": "Native Unity UI with sample data."
        },
        {
          "id": "RANK05",
          "screenId": "ranks-and-progression",
          "group": "Ranks and progression",
          "title": "Master rank highlighted",
          "trigger": "Current level enters Master threshold (81 in serialized configuration).",
          "result": "Matching rank card enlarged/solid frame and gradient; other cards use off scale/frame.",
          "source": {
            "file": "Assets/_Scripts/UI/Lobby/RanksMainCoordinator.cs",
            "line": 8
          },
          "original": "assets/states/RANK05.png",
          "updated": null,
          "checks": [
            "Correct native UI state",
            "Back/cancel restores originating screen",
            "Long values and supported phone safe areas"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "sources": [
            {
              "file": "Assets/Prefabs/UI/New/MainMenu/LobbyUICanvas.prefab",
              "line": 230643
            },
            {
              "file": "Assets/Animation/Events/LevelSystem/RanksPageElement.cs",
              "line": 34
            }
          ],
          "captureKey": "RANK05",
          "captureNote": "Native Unity UI with sample data."
        },
        {
          "id": "RANK06",
          "screenId": "ranks-and-progression",
          "group": "Ranks and progression",
          "title": "Earning XP help overlay",
          "trigger": "Tap Earning XP on Ranks.",
          "result": "HowToOverlay active over ranks; Close returns to same ranks tab.",
          "source": {
            "file": "Assets/Prefabs/UI/New/MainMenu/LobbyUICanvas.prefab",
            "line": 39516
          },
          "original": "assets/states/RANK06.png",
          "updated": null,
          "checks": [
            "Correct native UI state",
            "Back/cancel restores originating screen",
            "Long values and supported phone safe areas"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "sources": [
            {
              "file": "Assets/Prefabs/UI/New/MainMenu/LobbyUICanvas.prefab",
              "line": 15633
            }
          ],
          "captureKey": "RANK06",
          "captureNote": "Native Unity UI with sample data."
        },
        {
          "id": "RANK07",
          "screenId": "ranks-and-progression",
          "group": "Ranks and progression",
          "title": "Return to statistics / reopen profile",
          "trigger": "Tap Stats tab, Back, or reopen profile.",
          "result": "Tabs are SetActive operations; Start initially selects Stats, subsequent reopen state should be checked for persistence.",
          "source": {
            "file": "Assets/Prefabs/UI/New/MainMenu/LobbyUICanvas.prefab",
            "line": 220614
          },
          "original": "assets/states/STAT01.png",
          "updated": null,
          "checks": [
            "Correct native UI state",
            "Back/cancel restores originating screen",
            "Long values and supported phone safe areas"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "STAT01",
          "captureNote": "Native Unity UI with sample data. This state shares its visual layout with capture STAT01."
        }
      ],
      "flows": [
        {
          "id": "ASPF14",
          "title": "Profile stats \u2192 ranks \u2192 XP help \u2192 ranks \u2192 stats",
          "steps": [
            "STAT01",
            "RANK01",
            "RANK06",
            "RANK01",
            "STAT01"
          ],
          "screenIds": [
            "player-statistics",
            "ranks-and-progression"
          ],
          "source": {
            "file": "Assets/Prefabs/UI/New/MainMenu/LobbyUICanvas.prefab",
            "line": 183768
          },
          "animation": "Native tab/overlay SetActive; rank card highlight/scale changes immediately, not animated interpolation in RanksPageElement.",
          "runtimeVerified": false,
          "motionStatus": "Source traced; real Unity recording pending"
        }
      ],
      "exclusions": [
        "New Loadout landing not implemented: ",
        "Gadget/hoverboard details not currently routed: ",
        "Separate X-Droid details: ",
        "Droid skins and Elixir tanks shop: ",
        "Mystery Draw: ",
        "Gem success / promo legacy objects: ",
        "Purchase reveal Share: ",
        "Market supply/prices on weapon details: ",
        "Weapon abilities overlay button: ",
        "Hunt streak / demotion profile views: ",
        "Legacy AnimatedUIPanel is not proof of current page animation: ",
        "Inventory Launcher tab: "
      ],
      "crossChecks": [
        "Never invoke purchase/equip/store/backend callbacks for offline visual fixtures.",
        "Capture is an injected-data native view, not evidence of successful backend transitions.",
        "Preserve original/current production UI and new-review responsive rules; no screen redesign performed by this audit.",
        "Each state includes source evidence; multiple data/error cases may share the same screenshot while their transition checks remain separate.",
        "Important source discrepancies: Gems orphan confirmation; Elixir max999 not affordability capped; stats WinRatio wired kd_ratio; unhandled missing ability maps; missing shop data error UI."
      ],
      "entry": "Profile Ranks tab",
      "outgoing": [
        "player-statistics",
        "main-lobby"
      ]
    },
    "friends-party-list": {
      "revision": "all-screen-audit-v1",
      "states": [
        {
          "id": "FRI01",
          "screenId": "friends-party-list",
          "group": "Friends / party list",
          "title": "Friends list populated",
          "trigger": "Open Invite Friends with cached/current friends.",
          "result": "Rows show username, raw presence status, downloaded avatar and level badge; counter is total/100, not filtered total.",
          "exit": "Close FriendsPanel \u2192 main lobby.",
          "source": {
            "file": "Assets/_Scripts/Friends/UI/FriendListUIManager.cs",
            "line": 48
          },
          "original": "assets/states/FRI01.png",
          "updated": null,
          "checks": [
            "Long username",
            "100/100",
            "Large list scrolling",
            "Status changes while open"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "visualDistinct": true,
          "captureKey": "FRI01",
          "captureNote": "Native Unity UI with sample data."
        },
        {
          "id": "FRI02",
          "screenId": "friends-party-list",
          "group": "Friends / party list",
          "title": "Empty friends list",
          "trigger": "Friends response contains no items.",
          "result": "No friend rows; counter 0/100. Source does not add a special empty-message component.",
          "exit": "Close/back \u2192 main-lobby; or choose another available tab.",
          "source": {
            "file": "Assets/_Scripts/Friends/UI/FriendListUIManager.cs",
            "line": 48
          },
          "original": "assets/states/FRI02.png",
          "updated": null,
          "checks": [],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "visualDistinct": true,
          "captureKey": "FRI02",
          "captureNote": "Native Unity UI with sample data."
        },
        {
          "id": "FRI03",
          "screenId": "friends-party-list",
          "group": "Friends / party list",
          "title": "Refreshing cached list",
          "trigger": "Friends panel enabled.",
          "result": "GetFriendsList runs; cached rows stay until response. There is no distinct loading spinner in this controller.",
          "exit": "Close/back \u2192 main-lobby; or choose another available tab.",
          "source": {
            "file": "Assets/_Scripts/Friends/UI/FriendListUIManager.cs",
            "line": 26
          },
          "original": "assets/states/FRI01.png",
          "updated": null,
          "checks": [],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "visualDistinct": false,
          "captureKey": "FRI01",
          "captureNote": "Native Unity UI with sample data. This state shares its visual layout with capture FRI01."
        },
        {
          "id": "FRI04",
          "screenId": "friends-party-list",
          "group": "Friends / party list",
          "title": "Friends refresh fails",
          "trigger": "GetFriends backend reports failure.",
          "result": "Logs failure and retains last successful list; no visible error/retry banner is wired from this panel.",
          "exit": "Close/back \u2192 main-lobby; or choose another available tab.",
          "source": {
            "file": "Assets/_Scripts/Friends/FriendManager.cs",
            "line": 29
          },
          "original": "assets/states/FRI01.png",
          "updated": null,
          "checks": [
            "Reopen to refresh",
            "Offline startup",
            "Existing cached friends retained"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "visualDistinct": false,
          "captureKey": "FRI01",
          "captureNote": "Native Unity UI with sample data. This state shares its visual layout with capture FRI01."
        },
        {
          "id": "FRI05",
          "screenId": "friends-party-list",
          "group": "Friends / party list",
          "title": "Search input open",
          "trigger": "Tap search in Friends.",
          "result": "Replaces search button with dynamic FriendFilterInput; clears existing filter and focuses keyboard.",
          "exit": "Clear \u00d7 or close page restores search button and full list.",
          "source": {
            "file": "Assets/_Scripts/Friends/UI/FriendListFilterController.cs",
            "line": 41
          },
          "original": "assets/states/FRI05.png",
          "updated": null,
          "checks": [
            "Phone keyboard and safe area",
            "Long text"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "visualDistinct": true,
          "captureKey": "FRI05",
          "captureNote": "Native Unity UI with sample data."
        },
        {
          "id": "FRI06",
          "screenId": "friends-party-list",
          "group": "Friends / party list",
          "title": "Filtered friends",
          "trigger": "Enter a partial case-insensitive username.",
          "result": "Trimmed query filters rows; total counter still counts all friends.",
          "exit": "Close/back \u2192 main-lobby; or choose another available tab.",
          "source": {
            "file": "Assets/_Scripts/Friends/UI/FriendListUIManager.cs",
            "line": 42
          },
          "original": "assets/states/FRI06.png",
          "updated": null,
          "checks": [],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "visualDistinct": true,
          "captureKey": "FRI06",
          "captureNote": "Native Unity UI with sample data."
        },
        {
          "id": "FRI07",
          "screenId": "friends-party-list",
          "group": "Friends / party list",
          "title": "Filter has no matches",
          "trigger": "Enter query that matches no friend.",
          "result": "List becomes empty; total count remains unchanged and filter is still editable.",
          "exit": "Clear \u00d7 restores all rows.",
          "source": {
            "file": "Assets/_Scripts/Friends/UI/FriendListUIManager.cs",
            "line": 72
          },
          "original": "assets/states/FRI07.png",
          "updated": null,
          "checks": [],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "visualDistinct": true,
          "captureKey": "FRI07",
          "captureNote": "Native Unity UI with sample data."
        },
        {
          "id": "FRI08",
          "screenId": "friends-party-list",
          "group": "Friends / party list",
          "title": "Invite available \u2014 leader with room",
          "trigger": "Local player leads or has no party, friend not already in lobby, party below 2.",
          "result": "Invite visible; it creates a lobby if absent, otherwise invites to existing one. Current code does not require friend status in_lobby.",
          "exit": "Close/back \u2192 main-lobby; or choose another available tab.",
          "source": {
            "file": "Assets/_Scripts/Friends/UI/FriendUIItem.cs",
            "line": 122
          },
          "original": "assets/states/FRI08.png",
          "updated": null,
          "checks": [
            "Offline friend still shows Invite",
            "Double tap",
            "Party fills during click"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "visualDistinct": true,
          "captureKey": "FRI08",
          "captureNote": "Native Unity UI with sample data."
        },
        {
          "id": "FRI09",
          "screenId": "friends-party-list",
          "group": "Friends / party list",
          "title": "Invite hidden \u2014 party full or nonleader",
          "trigger": "Party has 2 users, target already invited/joined, or local player is member.",
          "result": "Invite is hidden; available Kick/Leave depends on roles.",
          "exit": "Close/back \u2192 main-lobby; or choose another available tab.",
          "source": {
            "file": "Assets/_Scripts/Friends/UI/FriendUIItem.cs",
            "line": 125
          },
          "original": "assets/states/FRI09.png",
          "updated": null,
          "checks": [],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "visualDistinct": true,
          "captureKey": "FRI09",
          "captureNote": "Native Unity UI with sample data."
        },
        {
          "id": "FRI10",
          "screenId": "friends-party-list",
          "group": "Friends / party list",
          "title": "Kick available \u2014 leader",
          "trigger": "Target friend is in local party and is not local user.",
          "result": "Kick replaces Invite for that row.",
          "exit": "Close/back \u2192 main-lobby; or choose another available tab.",
          "source": {
            "file": "Assets/_Scripts/Friends/UI/FriendUIItem.cs",
            "line": 137
          },
          "original": "assets/states/FRI10.png",
          "updated": null,
          "checks": [],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "visualDistinct": true,
          "captureKey": "FRI10",
          "captureNote": "Native Unity UI with sample data."
        },
        {
          "id": "FRI11",
          "screenId": "friends-party-list",
          "group": "Friends / party list",
          "title": "Kick confirmation",
          "trigger": "Leader taps Kick.",
          "result": "Shared dialog displays KICK DEMO PILOT? with KICK and CANCEL. Confirm calls backend and closes dialog; Cancel only closes.",
          "exit": "Cancel \u2192 party list; confirm \u2192 backend request then updated party.",
          "source": {
            "file": "Assets/_Scripts/Friends/UI/FriendUIItem.cs",
            "line": 172
          },
          "original": "assets/states/FRI11.png",
          "updated": null,
          "checks": [
            "Long friend name",
            "Member leaves while dialog open"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "visualDistinct": true,
          "captureKey": "FRI11",
          "captureNote": "Native Unity UI with sample data."
        },
        {
          "id": "FRI12",
          "screenId": "friends-party-list",
          "group": "Friends / party list",
          "title": "Leave available \u2014 party member",
          "trigger": "Local player is nonleader; friend row belongs to party owner.",
          "result": "Leave control appears on owner row; unrelated rows have no Leave.",
          "exit": "Close/back \u2192 main-lobby; or choose another available tab.",
          "source": {
            "file": "Assets/_Scripts/Friends/UI/FriendUIItem.cs",
            "line": 144
          },
          "original": "assets/states/FRI12.png",
          "updated": null,
          "checks": [],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "visualDistinct": true,
          "captureKey": "FRI12",
          "captureNote": "Native Unity UI with sample data."
        },
        {
          "id": "FRI13",
          "screenId": "friends-party-list",
          "group": "Friends / party list",
          "title": "Leave-party confirmation",
          "trigger": "Party member taps Leave.",
          "result": "Same shared dialog says LEAVE LOBBY? with LEAVE/CANCEL; confirm sends leave and closes.",
          "exit": "Cancel \u2192 party list; confirm \u2192 solo lobby/list.",
          "source": {
            "file": "Assets/_Scripts/Friends/UI/FriendUIItem.cs",
            "line": 199
          },
          "original": "assets/states/FRI13.png",
          "updated": null,
          "checks": [],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "visualDistinct": true,
          "captureKey": "FRI13",
          "captureNote": "Native Unity UI with sample data."
        },
        {
          "id": "FRI14",
          "screenId": "friends-party-list",
          "group": "Friends / party list",
          "title": "Party action fails",
          "trigger": "Create/invite/kick/leave backend operation fails.",
          "result": "These FriendUIItem calls provide no failure callback UI. Dialog may already be closed; row state waits for authoritative lobby refresh.",
          "exit": "Close/back \u2192 main-lobby; or choose another available tab.",
          "source": {
            "file": "Assets/_Scripts/Friends/MultiplayerLobbyManager.cs",
            "line": 191
          },
          "original": "assets/states/FRI01.png",
          "updated": null,
          "checks": [
            "Create failure",
            "Invite failure",
            "Kick failure",
            "Leave failure"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "visualDistinct": false,
          "captureKey": "FRI01",
          "captureNote": "Native Unity UI with sample data. This state shares its visual layout with capture FRI01."
        },
        {
          "id": "FRI15",
          "screenId": "friends-party-list",
          "group": "Friends / party list",
          "title": "Party invitation pending",
          "trigger": "Invite succeeds.",
          "result": "InvitePendingPopup shows recipient and a 120-second decreasing timer/fill; joined/removed event dismisses it.",
          "exit": "Join/remove event or 120s expiry dismisses.",
          "source": {
            "file": "Assets/_Scripts/Friends/UI/LobbyInvitePendingPopup.cs",
            "line": 31
          },
          "original": "assets/states/FRI15.png",
          "updated": null,
          "checks": [
            "120,60,1,0 seconds",
            "Matchmaking success clears invites"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "visualDistinct": true,
          "captureKey": "FRI15",
          "captureNote": "Native Unity UI with sample data."
        },
        {
          "id": "FRI16",
          "screenId": "friends-party-list",
          "group": "Friends / party list",
          "title": "Party invitation received",
          "trigger": "Standard party invitation received.",
          "result": "InviteToHuntReceivedPopup has accept/reject and 120s timer. Expiry rejects; withdrawn invites removed from queue.",
          "exit": "Accept \u2192 lobby membership; reject/expiry \u2192 next queued invite.",
          "source": {
            "file": "Assets/_Scripts/Friends/UI/LobbyInviteReceivedPopup.cs",
            "line": 70
          },
          "original": "assets/states/FRI16.png",
          "updated": null,
          "checks": [
            "Multiple queued",
            "Withdrawn while showing",
            "Accept failure"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "visualDistinct": true,
          "captureKey": "FRI16",
          "captureNote": "Native Unity UI with sample data."
        },
        {
          "id": "FRI17",
          "screenId": "friends-party-list",
          "group": "Friends / party list",
          "title": "Avatar pending or unavailable",
          "trigger": "Friend has no avatar URL or image download/cache miss.",
          "result": "Row clears sprite first, tries cache again after 1s; no explicit placeholder is assigned by script.",
          "exit": "Close/back \u2192 main-lobby; or choose another available tab.",
          "source": {
            "file": "Assets/_Scripts/Friends/UI/FriendUIItem.cs",
            "line": 233
          },
          "original": "assets/states/FRI17.png",
          "updated": null,
          "checks": [
            "Missing URL",
            "Failed image",
            "Recycled row does not retain old portrait"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "visualDistinct": true,
          "captureKey": "FRI17",
          "captureNote": "Native Unity UI with sample data."
        }
      ],
      "flows": [
        {
          "id": "FRIFLOW01",
          "screenId": "friends-party-list",
          "title": "Open Friends \u2192 filter \u2192 clear",
          "steps": [
            "FRI01",
            "FRI05",
            "FRI06",
            "FRI07",
            "FRI01"
          ],
          "animation": "SetActive input replacement plus native ScrollRect; no bespoke page tween in these controllers.",
          "actualAnimation": "SetActive input replacement plus native ScrollRect; no bespoke page tween in these controllers.",
          "proposedAnimation": "Review native panel entry and keyboard movement.",
          "source": {
            "file": "Assets/_Scripts/Friends/UI/FriendListFilterController.cs",
            "line": 41
          },
          "exit": "Close \u2192 main-lobby",
          "motionStatus": "Source traced \u00b7 Unity recording pending",
          "runtimeVerified": false
        },
        {
          "id": "FRIFLOW02",
          "screenId": "friends-party-list",
          "title": "Invite \u2192 pending \u2192 joined \u2192 kick",
          "steps": [
            "FRI08",
            "FRI15",
            "FRI10",
            "FRI11",
            "FRI01"
          ],
          "animation": "120-second decrement text/fill; asynchronous row/button refresh; immediate confirmation show/hide.",
          "actualAnimation": "120-second decrement text/fill; asynchronous row/button refresh; immediate confirmation show/hide.",
          "proposedAnimation": "Optional restrained row arrival/removal treatment.",
          "source": {
            "file": "Assets/_Scripts/Friends/UI/FriendsLobbyPopup.cs",
            "line": 114
          },
          "exit": "Cancel keeps party; kick backend returns updated party",
          "motionStatus": "Source traced \u00b7 Unity recording pending",
          "runtimeVerified": false
        },
        {
          "id": "FRIFLOW03",
          "screenId": "friends-party-list",
          "title": "Receive invite \u2192 accept/reject/expiry",
          "steps": [
            "FRI16",
            "FRI12",
            "FRI13",
            "FRI01"
          ],
          "animation": "Continuous fill decreases and ceil-seconds text; expire rejects standard invite.",
          "actualAnimation": "Continuous fill decreases and ceil-seconds text; expire rejects standard invite.",
          "proposedAnimation": "Review interruption/queue behavior before new animation.",
          "source": {
            "file": "Assets/_Scripts/Friends/UI/LobbyInviteReceivedPopup.cs",
            "line": 70
          },
          "exit": "Accepted membership or next invite",
          "motionStatus": "Source traced \u00b7 Unity recording pending",
          "runtimeVerified": false
        }
      ],
      "exclusions": [
        "Debug page is developer-only, tab inactive in source prefab and nondev debug panel destroyed. Not an ordinary sixth settings category.",
        "MothershipVoiceoverContainerSlider, DisplayMemoryContainerToggle and AntiAliasingContainerToggle are serialized inactive. Do not count them as active ordinary-player states without runtime evidence activating them.",
        "No reachable Report issue/Support/onboarding control found in audited SettingsCanvas/Friends prefab or their controllers. Optional identity entry is active from Gameplay; its3pages are a separate audit.",
        "No per-screen Animator/tween is wired by these controllers. Default Unity selectable states, ScrollRects, timers and pointer-driven HUD editing are actual motion; proposed redesign animation is separate.",
        "Account sync/error states share the visible base settings controls. No saving/offline/error UI should be invented and described as existing.",
        "System microphone/Bluetooth permission alerts are native OS UI and need physical-device recording, not a fabricated Unity screenshot.",
        "Friends service failures and invite races still need live verification; no invite, friend request, kick, leave, save or account write was executed.",
        "Custom HUD drag has no explicit safe-area clamp in CustomHudSettingsObject.OnDrag; account import clamps normalized positions. Redesign must verify full control bounds/touch on each phone."
      ],
      "crossChecks": [
        "Incoming friend popup over open Settings/Friends/HUD",
        "Long names/messages with keyboard and asymmetric safe area",
        "Party role changes while confirmation open",
        "Pending request response after panel closed",
        "Settings account refresh during drag",
        "Exit settings while matchmaking continues",
        "HUD save/default toggles followed by phone-aspect change",
        "Standard versus Arena Exit Hunt outcomes"
      ],
      "entry": "Main Lobby \u2192 Invite Friends",
      "outgoing": [
        "main-lobby",
        "find-add-a-friend",
        "friend-requests"
      ]
    },
    "find-add-a-friend": {
      "revision": "all-screen-audit-v1",
      "states": [
        {
          "id": "ADD01",
          "screenId": "find-add-a-friend",
          "group": "Find / add a friend",
          "title": "Empty search",
          "trigger": "Open Add New Friend.",
          "result": "Username cleared; Search disabled; result card, send dialog and success toast hidden.",
          "exit": "Close/back \u2192 friends-party-list; or choose another available tab.",
          "source": {
            "file": "Assets/_Scripts/Friends/UI/SearchPlayerUIManager.cs",
            "line": 55
          },
          "original": "assets/states/ADD01.png",
          "updated": null,
          "checks": [],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "visualDistinct": true,
          "captureKey": "ADD01",
          "captureNote": "Native Unity UI with sample data."
        },
        {
          "id": "ADD02",
          "screenId": "find-add-a-friend",
          "group": "Find / add a friend",
          "title": "Search ready",
          "trigger": "Type nonblank username.",
          "result": "Search becomes interactable; whitespace-only remains disabled.",
          "exit": "Close/back \u2192 friends-party-list; or choose another available tab.",
          "source": {
            "file": "Assets/_Scripts/Friends/UI/SearchPlayerUIManager.cs",
            "line": 50
          },
          "original": "assets/states/ADD02.png",
          "updated": null,
          "checks": [],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "visualDistinct": true,
          "captureKey": "ADD02",
          "captureNote": "Native Unity UI with sample data."
        },
        {
          "id": "ADD03",
          "screenId": "find-add-a-friend",
          "group": "Find / add a friend",
          "title": "Searching",
          "trigger": "Tap Search.",
          "result": "Searching... message; hide prior result; Search disabled until response.",
          "exit": "Close/back \u2192 friends-party-list; or choose another available tab.",
          "source": {
            "file": "Assets/_Scripts/Friends/UI/SearchPlayerUIManager.cs",
            "line": 36
          },
          "original": "assets/states/ADD03.png",
          "updated": null,
          "checks": [
            "Close/reopen resets form",
            "Phone keyboard avoids covered Send",
            "Rapid repeat search and stale callbacks"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "visualDistinct": true,
          "captureKey": "ADD03",
          "captureNote": "Native Unity UI with sample data."
        },
        {
          "id": "ADD04",
          "screenId": "find-add-a-friend",
          "group": "Find / add a friend",
          "title": "Player found",
          "trigger": "Search returns a player.",
          "result": "Show AddNewFriendCard with username/avatar and Add Friend action; clear status message.",
          "exit": "Close/back \u2192 friends-party-list; or choose another available tab.",
          "source": {
            "file": "Assets/_Scripts/Friends/UI/SearchPlayerUIManager.cs",
            "line": 77
          },
          "original": "assets/states/ADD04.png",
          "updated": null,
          "checks": [],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "visualDistinct": true,
          "captureKey": "ADD04",
          "captureNote": "Native Unity UI with sample data."
        },
        {
          "id": "ADD05",
          "screenId": "find-add-a-friend",
          "group": "Find / add a friend",
          "title": "No matching player",
          "trigger": "Search succeeds with null player.",
          "result": "No Player Matches This User Name.; result hidden; search enabled for nonblank query.",
          "exit": "Close/back \u2192 friends-party-list; or choose another available tab.",
          "source": {
            "file": "Assets/_Scripts/Friends/UI/SearchPlayerUIManager.cs",
            "line": 86
          },
          "original": "assets/states/ADD05.png",
          "updated": null,
          "checks": [],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "visualDistinct": true,
          "captureKey": "ADD05",
          "captureNote": "Native Unity UI with sample data."
        },
        {
          "id": "ADD06",
          "screenId": "find-add-a-friend",
          "group": "Find / add a friend",
          "title": "Search error",
          "trigger": "Search backend fails.",
          "result": "Something went wrong, please try again later.; result hidden; can retry.",
          "exit": "Close/back \u2192 friends-party-list; or choose another available tab.",
          "source": {
            "file": "Assets/_Scripts/Friends/UI/SearchPlayerUIManager.cs",
            "line": 95
          },
          "original": "assets/states/ADD06.png",
          "updated": null,
          "checks": [],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "visualDistinct": true,
          "captureKey": "ADD06",
          "captureNote": "Native Unity UI with sample data."
        },
        {
          "id": "ADD07",
          "screenId": "find-add-a-friend",
          "group": "Find / add a friend",
          "title": "Request message empty",
          "trigger": "Tap Add Friend on found result.",
          "result": "SendFriendRequestBG opens; message cleared and Send disabled until nonblank message.",
          "exit": "Close/back \u2192 friends-party-list; or choose another available tab.",
          "source": {
            "file": "Assets/_Scripts/Friends/UI/SearchPlayerUIManager.cs",
            "line": 102
          },
          "original": "assets/states/ADD07.png",
          "updated": null,
          "checks": [],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "visualDistinct": true,
          "captureKey": "ADD07",
          "captureNote": "Native Unity UI with sample data."
        },
        {
          "id": "ADD08",
          "screenId": "find-add-a-friend",
          "group": "Find / add a friend",
          "title": "Request message ready",
          "trigger": "Enter a nonblank request message.",
          "result": "Send becomes enabled; Cancel closes without sending.",
          "exit": "Close/back \u2192 friends-party-list; or choose another available tab.",
          "source": {
            "file": "Assets/_Scripts/Friends/UI/SearchPlayerUIManager.cs",
            "line": 107
          },
          "original": "assets/states/ADD08.png",
          "updated": null,
          "checks": [],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "visualDistinct": true,
          "captureKey": "ADD08",
          "captureNote": "Native Unity UI with sample data."
        },
        {
          "id": "ADD09",
          "screenId": "find-add-a-friend",
          "group": "Find / add a friend",
          "title": "Request sending",
          "trigger": "Tap Send.",
          "result": "Message dialog closes before backend reply; no distinct progress indicator.",
          "exit": "Close/back \u2192 friends-party-list; or choose another available tab.",
          "source": {
            "file": "Assets/_Scripts/Friends/UI/SearchPlayerUIManager.cs",
            "line": 113
          },
          "original": "assets/states/ADD04.png",
          "updated": null,
          "checks": [],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "visualDistinct": false,
          "captureKey": "ADD04",
          "captureNote": "Native Unity UI with sample data. This state shares its visual layout with capture ADD04."
        },
        {
          "id": "ADD10",
          "screenId": "find-add-a-friend",
          "group": "Find / add a friend",
          "title": "Request sent toast",
          "trigger": "Send request succeeds.",
          "result": "PopupPlayer shown for two seconds then hides automatically.",
          "exit": "Close/back \u2192 friends-party-list; or choose another available tab.",
          "source": {
            "file": "Assets/_Scripts/Friends/UI/SearchPlayerUIManager.cs",
            "line": 118
          },
          "original": "assets/states/ADD10.png",
          "updated": null,
          "checks": [],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "visualDistinct": true,
          "captureKey": "ADD10",
          "captureNote": "Native Unity UI with sample data."
        },
        {
          "id": "ADD11",
          "screenId": "find-add-a-friend",
          "group": "Find / add a friend",
          "title": "Request send failed",
          "trigger": "Send backend fails, including rejection/limit/duplicate if reported.",
          "result": "Only error log is emitted; no visible failure dialog; message dialog has already closed.",
          "exit": "Close/back \u2192 friends-party-list; or choose another available tab.",
          "source": {
            "file": "Assets/_Scripts/Friends/UI/SearchPlayerUIManager.cs",
            "line": 123
          },
          "original": "assets/states/ADD04.png",
          "updated": null,
          "checks": [],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "visualDistinct": false,
          "captureKey": "ADD04",
          "captureNote": "Native Unity UI with sample data. This state shares its visual layout with capture ADD04."
        },
        {
          "id": "ADD12",
          "screenId": "find-add-a-friend",
          "group": "Find / add a friend",
          "title": "Result avatar pending",
          "trigger": "Image absent or not cached yet.",
          "result": "Found player remains selectable; avatar retried once after 1s, otherwise remains cleared.",
          "exit": "Close/back \u2192 friends-party-list; or choose another available tab.",
          "source": {
            "file": "Assets/_Scripts/Friends/UI/SearchPlayerFriendUI.cs",
            "line": 45
          },
          "original": "assets/states/ADD12.png",
          "updated": null,
          "checks": [],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "visualDistinct": true,
          "captureKey": "ADD12",
          "captureNote": "Native Unity UI with sample data."
        }
      ],
      "flows": [
        {
          "id": "ADDFLOW01",
          "screenId": "find-add-a-friend",
          "title": "Search \u2192 result \u2192 request message \u2192 toast",
          "steps": [
            "ADD01",
            "ADD02",
            "ADD03",
            "ADD04",
            "ADD07",
            "ADD08",
            "ADD09",
            "ADD10"
          ],
          "animation": "Immediate active-state swaps; successful request toast auto-hides after2seconds.",
          "actualAnimation": "Immediate active-state swaps; successful request toast auto-hides after2seconds.",
          "proposedAnimation": "Optional loading/reply entrance animation must remain cancellable.",
          "source": {
            "file": "Assets/_Scripts/Friends/UI/SearchPlayerUIManager.cs",
            "line": 36
          },
          "exit": "Close returns Friends",
          "motionStatus": "Source traced \u00b7 Unity recording pending",
          "runtimeVerified": false
        },
        {
          "id": "ADDFLOW02",
          "screenId": "find-add-a-friend",
          "title": "Search no match/error \u2192 retry",
          "steps": [
            "ADD03",
            "ADD05",
            "ADD06",
            "ADD02",
            "ADD03"
          ],
          "animation": "Status text swaps and button interactability; no separate spinner/tween.",
          "actualAnimation": "Status text swaps and button interactability; no separate spinner/tween.",
          "proposedAnimation": "Keep error recovery legible.",
          "source": {
            "file": "Assets/_Scripts/Friends/UI/SearchPlayerUIManager.cs",
            "line": 77
          },
          "exit": "Retry or close",
          "motionStatus": "Source traced \u00b7 Unity recording pending",
          "runtimeVerified": false
        }
      ],
      "exclusions": [
        "Debug page is developer-only, tab inactive in source prefab and nondev debug panel destroyed. Not an ordinary sixth settings category.",
        "MothershipVoiceoverContainerSlider, DisplayMemoryContainerToggle and AntiAliasingContainerToggle are serialized inactive. Do not count them as active ordinary-player states without runtime evidence activating them.",
        "No reachable Report issue/Support/onboarding control found in audited SettingsCanvas/Friends prefab or their controllers. Optional identity entry is active from Gameplay; its3pages are a separate audit.",
        "No per-screen Animator/tween is wired by these controllers. Default Unity selectable states, ScrollRects, timers and pointer-driven HUD editing are actual motion; proposed redesign animation is separate.",
        "Account sync/error states share the visible base settings controls. No saving/offline/error UI should be invented and described as existing.",
        "System microphone/Bluetooth permission alerts are native OS UI and need physical-device recording, not a fabricated Unity screenshot.",
        "Friends service failures and invite races still need live verification; no invite, friend request, kick, leave, save or account write was executed.",
        "Custom HUD drag has no explicit safe-area clamp in CustomHudSettingsObject.OnDrag; account import clamps normalized positions. Redesign must verify full control bounds/touch on each phone."
      ],
      "crossChecks": [
        "Incoming friend popup over open Settings/Friends/HUD",
        "Long names/messages with keyboard and asymmetric safe area",
        "Party role changes while confirmation open",
        "Pending request response after panel closed",
        "Settings account refresh during drag",
        "Exit settings while matchmaking continues",
        "HUD save/default toggles followed by phone-aspect change",
        "Standard versus Arena Exit Hunt outcomes"
      ],
      "entry": "Friends \u2192 Add New Friend",
      "outgoing": [
        "friends-party-list"
      ]
    },
    "friend-requests": {
      "revision": "all-screen-audit-v1",
      "states": [
        {
          "id": "REQ01",
          "screenId": "friend-requests",
          "group": "Friend requests",
          "title": "No incoming requests",
          "trigger": "Request collection empty.",
          "result": "Count labels 0; no-request color; Accept All and Reject All disabled; no rows.",
          "exit": "Close/back \u2192 friends-party-list; or choose another available tab.",
          "source": {
            "file": "Assets/_Scripts/Friends/UI/FriendRequestUIManager.cs",
            "line": 60
          },
          "original": "assets/states/REQ01.png",
          "updated": null,
          "checks": [],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "visualDistinct": true,
          "captureKey": "REQ01",
          "captureNote": "Native Unity UI with sample data."
        },
        {
          "id": "REQ02",
          "screenId": "friend-requests",
          "group": "Friend requests",
          "title": "Incoming requests list",
          "trigger": "One or more incoming requests.",
          "result": "Rows show username, status text and request message; request-count styling uses has-request color; bulk actions enabled.",
          "exit": "Close/back \u2192 friends-party-list; or choose another available tab.",
          "source": {
            "file": "Assets/_Scripts/Friends/UI/FriendRequestUIManager.cs",
            "line": 60
          },
          "original": "assets/states/REQ02.png",
          "updated": null,
          "checks": [
            "Long message",
            "Empty message",
            "100+ count width",
            "Scrolling"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "visualDistinct": true,
          "captureKey": "REQ02",
          "captureNote": "Native Unity UI with sample data."
        },
        {
          "id": "REQ03",
          "screenId": "friend-requests",
          "group": "Friend requests",
          "title": "Request refresh failure",
          "trigger": "GetFriendRequests fails.",
          "result": "Cached requests remain; only log/no dedicated error UI from friend panel.",
          "exit": "Close/back \u2192 friends-party-list; or choose another available tab.",
          "source": {
            "file": "Assets/_Scripts/Friends/FriendManager.cs",
            "line": 47
          },
          "original": "assets/states/REQ02.png",
          "updated": null,
          "checks": [],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "visualDistinct": false,
          "captureKey": "REQ02",
          "captureNote": "Native Unity UI with sample data. This state shares its visual layout with capture REQ02."
        },
        {
          "id": "REQ04",
          "screenId": "friend-requests",
          "group": "Friend requests",
          "title": "Accept one \u2014 optimistic removal",
          "trigger": "Tap row Accept.",
          "result": "Row hides immediately while reply is in flight. Success refreshes request and friend data.",
          "exit": "Close/back \u2192 friends-party-list; or choose another available tab.",
          "source": {
            "file": "Assets/_Scripts/Friends/UI/FriendRequestUIItem.cs",
            "line": 23
          },
          "original": "assets/states/REQ04.png",
          "updated": null,
          "checks": [
            "Double tap",
            "Remote withdrawal",
            "List refresh races"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "visualDistinct": true,
          "captureKey": "REQ04",
          "captureNote": "Native Unity UI with sample data."
        },
        {
          "id": "REQ05",
          "screenId": "friend-requests",
          "group": "Friend requests",
          "title": "Reject one \u2014 optimistic removal",
          "trigger": "Tap row Reject.",
          "result": "Row hides immediately; server reply determines authoritative list.",
          "exit": "Close/back \u2192 friends-party-list; or choose another available tab.",
          "source": {
            "file": "Assets/_Scripts/Friends/UI/FriendRequestUIItem.cs",
            "line": 32
          },
          "original": "assets/states/REQ04.png",
          "updated": null,
          "checks": [],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "visualDistinct": true,
          "captureKey": "REQ04",
          "captureNote": "Native Unity UI with sample data. This state shares its visual layout with capture REQ04."
        },
        {
          "id": "REQ06",
          "screenId": "friend-requests",
          "group": "Friend requests",
          "title": "Reply failure restores row",
          "trigger": "Accept/reject callback fails.",
          "result": "Hidden row is made active again; no custom inline error text.",
          "exit": "Close/back \u2192 friends-party-list; or choose another available tab.",
          "source": {
            "file": "Assets/_Scripts/Friends/UI/FriendRequestUIItem.cs",
            "line": 25
          },
          "original": "assets/states/REQ02.png",
          "updated": null,
          "checks": [],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "visualDistinct": false,
          "captureKey": "REQ02",
          "captureNote": "Native Unity UI with sample data. This state shares its visual layout with capture REQ02."
        },
        {
          "id": "REQ07",
          "screenId": "friend-requests",
          "group": "Friend requests",
          "title": "Accept all",
          "trigger": "Tap Accept All with requests.",
          "result": "Snapshots current requests and submits accept for each; no confirmation dialog or aggregate success state in controller.",
          "exit": "Close/back \u2192 friends-party-list; or choose another available tab.",
          "source": {
            "file": "Assets/_Scripts/Friends/UI/FriendRequestUIManager.cs",
            "line": 91
          },
          "original": "assets/states/REQ07.png",
          "updated": null,
          "checks": [
            "Partial failure",
            "New request arrives mid-batch",
            "Capacity exceeded"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "visualDistinct": true,
          "captureKey": "REQ07",
          "captureNote": "Native Unity UI with sample data."
        },
        {
          "id": "REQ08",
          "screenId": "friend-requests",
          "group": "Friend requests",
          "title": "Reject all",
          "trigger": "Tap Reject All.",
          "result": "Snapshots requests and submits reject per item; list updates through responses, not a distinct confirmation page.",
          "exit": "Close/back \u2192 friends-party-list; or choose another available tab.",
          "source": {
            "file": "Assets/_Scripts/Friends/UI/FriendRequestUIManager.cs",
            "line": 98
          },
          "original": "assets/states/REQ07.png",
          "updated": null,
          "checks": [
            "Partial failure",
            "New request arrives mid-batch"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "visualDistinct": true,
          "captureKey": "REQ07",
          "captureNote": "Native Unity UI with sample data. This state shares its visual layout with capture REQ07."
        },
        {
          "id": "REQ09",
          "screenId": "friend-requests",
          "group": "Friend requests",
          "title": "Incoming-request popup",
          "trigger": "New/unseen request notification arrives.",
          "result": "FriendRequestReceivedPopup has accept/reject and 120s fill/timer; responses hide and advance queue; withdrawn current request also advances.",
          "exit": "Close/back \u2192 friends-party-list; or choose another available tab.",
          "source": {
            "file": "Assets/_Scripts/Friends/UI/FriendInviteReceivedPopup.cs",
            "line": 92
          },
          "original": "assets/states/REQ09.png",
          "updated": null,
          "checks": [
            "Accept",
            "Reject",
            "Queue",
            "120s expiry: no explicit dismiss callback to advance queue in this caller",
            "Manual dismiss then next request"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "visualDistinct": true,
          "captureKey": "REQ09",
          "captureNote": "Native Unity UI with sample data."
        },
        {
          "id": "REQ10",
          "screenId": "friend-requests",
          "group": "Friend requests",
          "title": "Friend accepted notification",
          "trigger": "Server reports own friend request accepted.",
          "result": "FriendRequestAcceptedPopup is queued, displays for 5 seconds, then advances next notification.",
          "exit": "5s expiry advances next notification; Dismiss hides.",
          "source": {
            "file": "Assets/_Scripts/Friends/UI/FriendInviteAcceptedPopup.cs",
            "line": 37
          },
          "original": "assets/states/REQ10.png",
          "updated": null,
          "checks": [
            "Several notifications",
            "Manual dismiss and queued successor"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "visualDistinct": true,
          "captureKey": "REQ10",
          "captureNote": "Native Unity UI with sample data."
        }
      ],
      "flows": [
        {
          "id": "REQFLOW01",
          "screenId": "friend-requests",
          "title": "Respond singly or in bulk",
          "steps": [
            "REQ02",
            "REQ04",
            "REQ05",
            "REQ06",
            "REQ07",
            "REQ08",
            "REQ01"
          ],
          "animation": "Immediate row hide/re-enable and pooled list rebuild; bulk requests individually asynchronous.",
          "actualAnimation": "Immediate row hide/re-enable and pooled list rebuild; bulk requests individually asynchronous.",
          "proposedAnimation": "Optional row collapse must preserve source state and scroll.",
          "source": {
            "file": "Assets/_Scripts/Friends/UI/FriendRequestUIItem.cs",
            "line": 23
          },
          "exit": "Friends or remaining request list",
          "motionStatus": "Source traced \u00b7 Unity recording pending",
          "runtimeVerified": false
        },
        {
          "id": "REQFLOW02",
          "screenId": "friend-requests",
          "title": "Incoming notification / accepted notification queue",
          "steps": [
            "REQ09",
            "REQ02",
            "REQ10"
          ],
          "animation": "Incoming request timer120seconds; accepted notification5seconds; fill countdown in FriendsLobbyPopup.",
          "actualAnimation": "Incoming request timer120seconds; accepted notification5seconds; fill countdown in FriendsLobbyPopup.",
          "proposedAnimation": "Review manual dismissal vs queue advancement.",
          "source": {
            "file": "Assets/_Scripts/Friends/UI/FriendsLobbyPopup.cs",
            "line": 114
          },
          "exit": "Next queued notification or hidden",
          "motionStatus": "Source traced \u00b7 Unity recording pending",
          "runtimeVerified": false
        }
      ],
      "exclusions": [
        "Debug page is developer-only, tab inactive in source prefab and nondev debug panel destroyed. Not an ordinary sixth settings category.",
        "MothershipVoiceoverContainerSlider, DisplayMemoryContainerToggle and AntiAliasingContainerToggle are serialized inactive. Do not count them as active ordinary-player states without runtime evidence activating them.",
        "No reachable Report issue/Support/onboarding control found in audited SettingsCanvas/Friends prefab or their controllers. Optional identity entry is active from Gameplay; its3pages are a separate audit.",
        "No per-screen Animator/tween is wired by these controllers. Default Unity selectable states, ScrollRects, timers and pointer-driven HUD editing are actual motion; proposed redesign animation is separate.",
        "Account sync/error states share the visible base settings controls. No saving/offline/error UI should be invented and described as existing.",
        "System microphone/Bluetooth permission alerts are native OS UI and need physical-device recording, not a fabricated Unity screenshot.",
        "Friends service failures and invite races still need live verification; no invite, friend request, kick, leave, save or account write was executed.",
        "Custom HUD drag has no explicit safe-area clamp in CustomHudSettingsObject.OnDrag; account import clamps normalized positions. Redesign must verify full control bounds/touch on each phone."
      ],
      "crossChecks": [
        "Incoming friend popup over open Settings/Friends/HUD",
        "Long names/messages with keyboard and asymmetric safe area",
        "Party role changes while confirmation open",
        "Pending request response after panel closed",
        "Settings account refresh during drag",
        "Exit settings while matchmaking continues",
        "HUD save/default toggles followed by phone-aspect change",
        "Standard versus Arena Exit Hunt outcomes"
      ],
      "entry": "Friends \u2192 Friend Requests",
      "outgoing": [
        "friends-party-list"
      ]
    },
    "gameplay-settings": {
      "revision": "all-screen-audit-v1",
      "states": [
        {
          "id": "GP01",
          "screenId": "gameplay-settings",
          "group": "Gameplay settings",
          "title": "Gameplay tab open",
          "trigger": "Select Gameplay in Settings.",
          "result": "Show GameplayMainBody and selected-tab styling. Settings initially defaults to Graphics; all other tab bodies hidden.",
          "exit": "Close/back \u2192 main-lobby; or choose another available tab.",
          "source": {
            "file": "Assets/_Scripts/UI/Settings/SettingsPanelsUIController.cs",
            "line": 93
          },
          "original": "assets/states/GP01.png",
          "updated": null,
          "checks": [
            "Back closes settings",
            "Reopen preserves initialized category"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "visualDistinct": true,
          "captureKey": "GP01",
          "captureNote": "Native Unity UI with sample data."
        },
        {
          "id": "GP02",
          "screenId": "gameplay-settings",
          "group": "Gameplay settings",
          "title": "Hip fire off",
          "trigger": "Select Hip fire Off.",
          "result": "Binds primary fire to hip fire. Selected toggle changes color and persists locally/account sync.",
          "exit": "Close/back \u2192 main-lobby; or choose another available tab.",
          "source": {
            "file": "Assets/_Scripts/UI/Settings/Performance/Controller/HipFireDisplay.cs",
            "line": 5
          },
          "original": "assets/states/GP02.png",
          "updated": null,
          "checks": [],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "visualDistinct": true,
          "captureKey": "GP02",
          "captureNote": "Native Unity UI with sample data."
        },
        {
          "id": "GP03",
          "screenId": "gameplay-settings",
          "group": "Gameplay settings",
          "title": "Hip fire on",
          "trigger": "Select Hip fire On.",
          "result": "Binds primary fire to hip fire. Selected toggle changes color and persists locally/account sync.",
          "exit": "Close/back \u2192 main-lobby; or choose another available tab.",
          "source": {
            "file": "Assets/_Scripts/UI/Settings/Performance/Controller/HipFireDisplay.cs",
            "line": 5
          },
          "original": "assets/states/GP03.png",
          "updated": null,
          "checks": [],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "visualDistinct": true,
          "captureKey": "GP03",
          "captureNote": "Native Unity UI with sample data."
        },
        {
          "id": "GP04",
          "screenId": "gameplay-settings",
          "group": "Gameplay settings",
          "title": "Vibration off",
          "trigger": "Select Vibration Off.",
          "result": "Enabling by user interaction invokes a short test vibration; requires device check. Selected toggle changes color and persists locally/account sync.",
          "exit": "Close/back \u2192 main-lobby; or choose another available tab.",
          "source": {
            "file": "Assets/_Scripts/UI/Settings/Performance/Controller/VibrationDisplay.cs",
            "line": 5
          },
          "original": "assets/states/GP04.png",
          "updated": null,
          "checks": [],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "visualDistinct": true,
          "captureKey": "GP04",
          "captureNote": "Native Unity UI with sample data."
        },
        {
          "id": "GP05",
          "screenId": "gameplay-settings",
          "group": "Gameplay settings",
          "title": "Vibration on",
          "trigger": "Select Vibration On.",
          "result": "Enabling by user interaction invokes a short test vibration; requires device check. Selected toggle changes color and persists locally/account sync.",
          "exit": "Close/back \u2192 main-lobby; or choose another available tab.",
          "source": {
            "file": "Assets/_Scripts/UI/Settings/Performance/Controller/VibrationDisplay.cs",
            "line": 5
          },
          "original": "assets/states/GP05.png",
          "updated": null,
          "checks": [],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "visualDistinct": true,
          "captureKey": "GP05",
          "captureNote": "Native Unity UI with sample data."
        },
        {
          "id": "GP06",
          "screenId": "gameplay-settings",
          "group": "Gameplay settings",
          "title": "Camera FOV minimum",
          "trigger": "Drag camera FOV slider to minimum.",
          "result": "Value is clamped from camera base FOV to base \u00d71.2; displayed as one decimal; save/apply on pointer release.",
          "exit": "Close/back \u2192 main-lobby; or choose another available tab.",
          "source": {
            "file": "Assets/_Scripts/UI/Settings/Controls/SettingsThirdPersonCameraFov.cs",
            "line": 77
          },
          "original": "assets/states/GP06.png",
          "updated": null,
          "checks": [
            "Actual camera base value",
            "No camera target",
            "Account multiplier restored"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "visualDistinct": true,
          "captureKey": "GP06",
          "captureNote": "Native Unity UI with sample data."
        },
        {
          "id": "GP07",
          "screenId": "gameplay-settings",
          "group": "Gameplay settings",
          "title": "Camera FOV maximum",
          "trigger": "Drag camera FOV slider to maximum.",
          "result": "Value is clamped from camera base FOV to base \u00d71.2; displayed as one decimal; save/apply on pointer release.",
          "exit": "Close/back \u2192 main-lobby; or choose another available tab.",
          "source": {
            "file": "Assets/_Scripts/UI/Settings/Controls/SettingsThirdPersonCameraFov.cs",
            "line": 77
          },
          "original": "assets/states/GP07.png",
          "updated": null,
          "checks": [
            "Actual camera base value",
            "No camera target",
            "Account multiplier restored"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "visualDistinct": true,
          "captureKey": "GP07",
          "captureNote": "Native Unity UI with sample data."
        },
        {
          "id": "GP08",
          "screenId": "gameplay-settings",
          "group": "Gameplay settings",
          "title": "Identity verification available",
          "trigger": "Settings opened from lobby.",
          "result": "Optional identity entry is created dynamically on Gameplay; it opens the separate verification pages.",
          "exit": "Entry \u2192 verification-setup; Back \u2192 lobby.",
          "source": {
            "file": "Assets/_Scripts/Sentinel/Runtime/SentinelKycSettingsEntry.cs",
            "line": 40
          },
          "original": "assets/states/GP08.png",
          "updated": null,
          "checks": [],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "visualDistinct": true,
          "captureKey": "GP08",
          "captureNote": "Native Unity UI with sample data."
        },
        {
          "id": "GP09",
          "screenId": "gameplay-settings",
          "group": "Gameplay settings",
          "title": "In-hunt settings",
          "trigger": "Settings.Init(true).",
          "result": "Exit Hunt becomes visible and optional identity entry hidden. All five setting tabs share this context.",
          "exit": "Close/back \u2192 main-lobby; or choose another available tab.",
          "source": {
            "file": "Assets/_Scripts/UI/Settings/SettingsPanelsUIController.cs",
            "line": 79
          },
          "original": "assets/states/GP09.png",
          "updated": null,
          "checks": [],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "visualDistinct": true,
          "affectedScreenIds": [
            "gameplay-settings",
            "controls-settings",
            "audio-settings",
            "graphics-settings",
            "performance-display-settings"
          ],
          "captureKey": "GP09",
          "captureNote": "Native Unity UI with sample data."
        },
        {
          "id": "GP10",
          "screenId": "gameplay-settings",
          "group": "Gameplay settings",
          "title": "Leave Hunt confirmation",
          "trigger": "Tap Exit Hunt from in-hunt Settings.",
          "result": "ConfirmExitHuntOverlay asks LEAVE THE HUNT? with Yes, Leave / No, Stay Here.",
          "exit": "Cancel \u2192 same Settings tab; Confirm \u2192 end-hunt flow, or Arena forfeit.",
          "source": {
            "file": "Assets/_Scripts/UI/Settings/PrepareExit.cs",
            "line": 22
          },
          "original": "assets/states/GP10.png",
          "updated": null,
          "checks": [
            "Arena forfeit",
            "Standard hunt reward status",
            "Cancel leaves hunt running"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "visualDistinct": true,
          "affectedScreenIds": [
            "gameplay-settings",
            "controls-settings",
            "audio-settings",
            "graphics-settings",
            "performance-display-settings"
          ],
          "captureKey": "GP10",
          "captureNote": "Native Unity UI with sample data."
        },
        {
          "id": "GP11",
          "screenId": "gameplay-settings",
          "group": "Gameplay settings",
          "title": "Account settings loading",
          "trigger": "Authenticated settings GET in progress.",
          "result": "Local/cached controls can be applied while remote state loads; no distinct visible loading UI.",
          "exit": "Close/back \u2192 main-lobby; or choose another available tab.",
          "source": {
            "file": "Assets/_Scripts/Settings/Account/AccountSettingsSyncManager.cs",
            "line": 262
          },
          "original": "assets/states/GP01.png",
          "updated": null,
          "checks": [
            "Switch accounts",
            "Close/reopen",
            "Cross-device conflict",
            "Interrupted save"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "visualDistinct": false,
          "affectedScreenIds": [
            "gameplay-settings",
            "controls-settings",
            "audio-settings",
            "graphics-settings",
            "performance-display-settings",
            "custom-hud-layout-editor"
          ],
          "captureKey": "GP01",
          "captureNote": "Native Unity UI with sample data. This state shares its visual layout with capture GP01."
        },
        {
          "id": "GP12",
          "screenId": "gameplay-settings",
          "group": "Gameplay settings",
          "title": "Offline settings with pending changes",
          "trigger": "GET timeout/offline or transient write failure.",
          "result": "Keep local settings and queued changes; retry sync later; no visible error banner implemented.",
          "exit": "Close/back \u2192 main-lobby; or choose another available tab.",
          "source": {
            "file": "Assets/_Scripts/Settings/Account/AccountSettingsSyncManager.cs",
            "line": 375
          },
          "original": "assets/states/GP01.png",
          "updated": null,
          "checks": [
            "Switch accounts",
            "Close/reopen",
            "Cross-device conflict",
            "Interrupted save"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "visualDistinct": false,
          "affectedScreenIds": [
            "gameplay-settings",
            "controls-settings",
            "audio-settings",
            "graphics-settings",
            "performance-display-settings",
            "custom-hud-layout-editor"
          ],
          "captureKey": "GP01",
          "captureNote": "Native Unity UI with sample data. This state shares its visual layout with capture GP01."
        },
        {
          "id": "GP13",
          "screenId": "gameplay-settings",
          "group": "Gameplay settings",
          "title": "Settings saving",
          "trigger": "Local setting changes queued and PATCH starts.",
          "result": "Controls retain chosen values during asynchronous save; no explicit saving indicator.",
          "exit": "Close/back \u2192 main-lobby; or choose another available tab.",
          "source": {
            "file": "Assets/_Scripts/Settings/Account/AccountSettingsSyncManager.cs",
            "line": 397
          },
          "original": "assets/states/GP01.png",
          "updated": null,
          "checks": [
            "Switch accounts",
            "Close/reopen",
            "Cross-device conflict",
            "Interrupted save"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "visualDistinct": false,
          "affectedScreenIds": [
            "gameplay-settings",
            "controls-settings",
            "audio-settings",
            "graphics-settings",
            "performance-display-settings",
            "custom-hud-layout-editor"
          ],
          "captureKey": "GP01",
          "captureNote": "Native Unity UI with sample data. This state shares its visual layout with capture GP01."
        },
        {
          "id": "GP14",
          "screenId": "gameplay-settings",
          "group": "Gameplay settings",
          "title": "Settings conflict reconciled",
          "trigger": "Server PATCH returns409 with current document.",
          "result": "Pending local changes overlay current server values; bounded immediate retry then backoff.",
          "exit": "Close/back \u2192 main-lobby; or choose another available tab.",
          "source": {
            "file": "Assets/_Scripts/Settings/Account/AccountSettingsSyncManager.cs",
            "line": 476
          },
          "original": "assets/states/GP01.png",
          "updated": null,
          "checks": [
            "Switch accounts",
            "Close/reopen",
            "Cross-device conflict",
            "Interrupted save"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "visualDistinct": false,
          "affectedScreenIds": [
            "gameplay-settings",
            "controls-settings",
            "audio-settings",
            "graphics-settings",
            "performance-display-settings",
            "custom-hud-layout-editor"
          ],
          "captureKey": "GP01",
          "captureNote": "Native Unity UI with sample data. This state shares its visual layout with capture GP01."
        },
        {
          "id": "GP15",
          "screenId": "gameplay-settings",
          "group": "Gameplay settings",
          "title": "Non-transient settings save failure",
          "trigger": "PATCH fails without transient status.",
          "result": "Pending values requeued/cache saved; no immediate scheduled retry in this branch or visible error UI.",
          "exit": "Close/back \u2192 main-lobby; or choose another available tab.",
          "source": {
            "file": "Assets/_Scripts/Settings/Account/AccountSettingsSyncManager.cs",
            "line": 459
          },
          "original": "assets/states/GP01.png",
          "updated": null,
          "checks": [
            "Switch accounts",
            "Close/reopen",
            "Cross-device conflict",
            "Interrupted save"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "visualDistinct": false,
          "affectedScreenIds": [
            "gameplay-settings",
            "controls-settings",
            "audio-settings",
            "graphics-settings",
            "performance-display-settings",
            "custom-hud-layout-editor"
          ],
          "captureKey": "GP01",
          "captureNote": "Native Unity UI with sample data. This state shares its visual layout with capture GP01."
        }
      ],
      "flows": [
        {
          "id": "GPFLOW01",
          "screenId": "gameplay-settings",
          "title": "Settings \u2192 Gameplay settings \u2192 another tab / Back",
          "steps": [
            "GP01",
            "GP02",
            "GP03"
          ],
          "animation": "SettingsPanelsUIController toggles bodies with SetActive; tab selector updates image/text color immediately; Back plays lobby UI sound and hides settings.",
          "actualAnimation": "SettingsPanelsUIController toggles bodies with SetActive; tab selector updates image/text color immediately; Back plays lobby UI sound and hides settings.",
          "proposedAnimation": "Native tab motion can be designed later; no completed motion recording implied.",
          "source": {
            "file": "Assets/_Scripts/UI/Settings/SettingsPanelsUIController.cs",
            "line": 93
          },
          "exit": "Any settings tab or underlying lobby/hunt",
          "motionStatus": "Source traced \u00b7 Unity recording pending",
          "runtimeVerified": false
        },
        {
          "id": "GPFLOW02",
          "screenId": "gameplay-settings",
          "title": "In hunt \u2192 leave confirmation \u2192 cancel / end flow",
          "steps": [
            "GP09",
            "GP10"
          ],
          "animation": "Immediate overlay visibility and click/close sounds; Arena routes to forfeit; other hunt routes end-hunt screens.",
          "actualAnimation": "Immediate overlay visibility and click/close sounds; Arena routes to forfeit; other hunt routes end-hunt screens.",
          "proposedAnimation": "Future exit transition must not bypass results/forfeit logic.",
          "source": {
            "file": "Assets/_Scripts/UI/Settings/PrepareExit.cs",
            "line": 22
          },
          "exit": "Settings on cancel; hunt end flow on confirm",
          "motionStatus": "Source traced \u00b7 Unity recording pending",
          "runtimeVerified": false
        }
      ],
      "exclusions": [
        "Debug page is developer-only, tab inactive in source prefab and nondev debug panel destroyed. Not an ordinary sixth settings category.",
        "MothershipVoiceoverContainerSlider, DisplayMemoryContainerToggle and AntiAliasingContainerToggle are serialized inactive. Do not count them as active ordinary-player states without runtime evidence activating them.",
        "No reachable Report issue/Support/onboarding control found in audited SettingsCanvas/Friends prefab or their controllers. Optional identity entry is active from Gameplay; its3pages are a separate audit.",
        "No per-screen Animator/tween is wired by these controllers. Default Unity selectable states, ScrollRects, timers and pointer-driven HUD editing are actual motion; proposed redesign animation is separate.",
        "Account sync/error states share the visible base settings controls. No saving/offline/error UI should be invented and described as existing.",
        "System microphone/Bluetooth permission alerts are native OS UI and need physical-device recording, not a fabricated Unity screenshot.",
        "Friends service failures and invite races still need live verification; no invite, friend request, kick, leave, save or account write was executed.",
        "Custom HUD drag has no explicit safe-area clamp in CustomHudSettingsObject.OnDrag; account import clamps normalized positions. Redesign must verify full control bounds/touch on each phone."
      ],
      "crossChecks": [
        "Incoming friend popup over open Settings/Friends/HUD",
        "Long names/messages with keyboard and asymmetric safe area",
        "Party role changes while confirmation open",
        "Pending request response after panel closed",
        "Settings account refresh during drag",
        "Exit settings while matchmaking continues",
        "HUD save/default toggles followed by phone-aspect change",
        "Standard versus Arena Exit Hunt outcomes"
      ],
      "entry": "Settings \u2192 Gameplay",
      "outgoing": [
        "main-lobby",
        "controls-settings",
        "audio-settings",
        "graphics-settings",
        "performance-display-settings",
        "verification-setup"
      ]
    },
    "controls-settings": {
      "revision": "all-screen-audit-v1",
      "states": [
        {
          "id": "CTL01",
          "screenId": "controls-settings",
          "group": "Controls settings",
          "title": "Controls tab \u2014 top",
          "trigger": "Select Controls.",
          "result": "Scrollable control preferences; current values are loaded. Back hides full Settings.",
          "exit": "Close/back \u2192 main-lobby; or choose another available tab.",
          "source": {
            "file": "Assets/_Scripts/UI/Settings/SettingsPanelsUIController.cs",
            "line": 93
          },
          "original": "assets/states/CTL01.png",
          "updated": null,
          "checks": [],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "visualDistinct": true,
          "captureKey": "CTL01",
          "captureNote": "Native Unity UI with sample data."
        },
        {
          "id": "CTL02",
          "screenId": "controls-settings",
          "group": "Controls settings",
          "title": "Controls sliders \u2014 minimum",
          "trigger": "Drag +/-/scroll to review all sensitivity controls.",
          "result": "Slider text updates live; settings classes persist/apply on change-end. Values across touch, ADS, sniper, free-look and gyro are independent.",
          "exit": "Close/back \u2192 main-lobby; or choose another available tab.",
          "source": {
            "file": "Assets/_Scripts/UI/Settings/SharedComponents/PlanetXUISlider.cs",
            "line": 110
          },
          "original": "assets/states/CTL02.png",
          "updated": null,
          "checks": [
            "Horizontal: TouchHorizontalSensitivityContainerSlider",
            "Vertical: TouchVerticalSensitivityContainerSlider",
            "ADS horizontal: TouchADSHorizontalSensitivityContainerSlider",
            "ADS vertical: TouchADSVerticalSensitivityContainerSlider",
            "Sniper ADS horizontal: TouchADSSniperHorizontalSensitivityContainerSlider",
            "Sniper ADS vertical: TouchADSSniperVerticalSensitivityContainerSlider",
            "360 view: FishEyeCameraSensitivity",
            "Gyro horizontal: GyroHorizontalSensitivityContainerSlider",
            "Gyro vertical: GyroVerticalSensitivityContainerSlider",
            "Gyro ADS horizontal: GyroADSHorizontalSensitivityContainerSlider",
            "Gyro ADS vertical: GyroADSVerticalSensitivityContainerSlider"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "visualDistinct": true,
          "captureKey": "CTL02",
          "captureNote": "Native Unity UI with sample data."
        },
        {
          "id": "CTL03",
          "screenId": "controls-settings",
          "group": "Controls settings",
          "title": "Controls sliders \u2014 edited values",
          "trigger": "Drag +/-/scroll to review all sensitivity controls.",
          "result": "Slider text updates live; settings classes persist/apply on change-end. Values across touch, ADS, sniper, free-look and gyro are independent.",
          "exit": "Close/back \u2192 main-lobby; or choose another available tab.",
          "source": {
            "file": "Assets/_Scripts/UI/Settings/SharedComponents/PlanetXUISlider.cs",
            "line": 110
          },
          "original": "assets/states/CTL03.png",
          "updated": null,
          "checks": [
            "Horizontal: TouchHorizontalSensitivityContainerSlider",
            "Vertical: TouchVerticalSensitivityContainerSlider",
            "ADS horizontal: TouchADSHorizontalSensitivityContainerSlider",
            "ADS vertical: TouchADSVerticalSensitivityContainerSlider",
            "Sniper ADS horizontal: TouchADSSniperHorizontalSensitivityContainerSlider",
            "Sniper ADS vertical: TouchADSSniperVerticalSensitivityContainerSlider",
            "360 view: FishEyeCameraSensitivity",
            "Gyro horizontal: GyroHorizontalSensitivityContainerSlider",
            "Gyro vertical: GyroVerticalSensitivityContainerSlider",
            "Gyro ADS horizontal: GyroADSHorizontalSensitivityContainerSlider",
            "Gyro ADS vertical: GyroADSVerticalSensitivityContainerSlider"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "visualDistinct": true,
          "captureKey": "CTL03",
          "captureNote": "Native Unity UI with sample data."
        },
        {
          "id": "CTL04",
          "screenId": "controls-settings",
          "group": "Controls settings",
          "title": "Controls sliders \u2014 maximum",
          "trigger": "Drag +/-/scroll to review all sensitivity controls.",
          "result": "Slider text updates live; settings classes persist/apply on change-end. Values across touch, ADS, sniper, free-look and gyro are independent.",
          "exit": "Close/back \u2192 main-lobby; or choose another available tab.",
          "source": {
            "file": "Assets/_Scripts/UI/Settings/SharedComponents/PlanetXUISlider.cs",
            "line": 110
          },
          "original": "assets/states/CTL04.png",
          "updated": null,
          "checks": [
            "Horizontal: TouchHorizontalSensitivityContainerSlider",
            "Vertical: TouchVerticalSensitivityContainerSlider",
            "ADS horizontal: TouchADSHorizontalSensitivityContainerSlider",
            "ADS vertical: TouchADSVerticalSensitivityContainerSlider",
            "Sniper ADS horizontal: TouchADSSniperHorizontalSensitivityContainerSlider",
            "Sniper ADS vertical: TouchADSSniperVerticalSensitivityContainerSlider",
            "360 view: FishEyeCameraSensitivity",
            "Gyro horizontal: GyroHorizontalSensitivityContainerSlider",
            "Gyro vertical: GyroVerticalSensitivityContainerSlider",
            "Gyro ADS horizontal: GyroADSHorizontalSensitivityContainerSlider",
            "Gyro ADS vertical: GyroADSVerticalSensitivityContainerSlider"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "visualDistinct": true,
          "captureKey": "CTL04",
          "captureNote": "Native Unity UI with sample data."
        },
        {
          "id": "CTL05",
          "screenId": "controls-settings",
          "group": "Controls settings",
          "title": "Controls scrolled \u2014 ADS / gyro section",
          "trigger": "Drag +/-/scroll to review all sensitivity controls.",
          "result": "Slider text updates live; settings classes persist/apply on change-end. Values across touch, ADS, sniper, free-look and gyro are independent.",
          "exit": "Close/back \u2192 main-lobby; or choose another available tab.",
          "source": {
            "file": "Assets/_Scripts/UI/Settings/SharedComponents/PlanetXUISlider.cs",
            "line": 110
          },
          "original": "assets/states/CTL05.png",
          "updated": null,
          "checks": [
            "Horizontal: TouchHorizontalSensitivityContainerSlider",
            "Vertical: TouchVerticalSensitivityContainerSlider",
            "ADS horizontal: TouchADSHorizontalSensitivityContainerSlider",
            "ADS vertical: TouchADSVerticalSensitivityContainerSlider",
            "Sniper ADS horizontal: TouchADSSniperHorizontalSensitivityContainerSlider",
            "Sniper ADS vertical: TouchADSSniperVerticalSensitivityContainerSlider",
            "360 view: FishEyeCameraSensitivity",
            "Gyro horizontal: GyroHorizontalSensitivityContainerSlider",
            "Gyro vertical: GyroVerticalSensitivityContainerSlider",
            "Gyro ADS horizontal: GyroADSHorizontalSensitivityContainerSlider",
            "Gyro ADS vertical: GyroADSVerticalSensitivityContainerSlider"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "visualDistinct": true,
          "captureKey": "CTL05",
          "captureNote": "Native Unity UI with sample data."
        },
        {
          "id": "CTL06",
          "screenId": "controls-settings",
          "group": "Controls settings",
          "title": "Hold to ADS off",
          "trigger": "Choose Off/Disable.",
          "result": "Selected toggle color changes; local preference/account sync and available gameplay target updated.",
          "exit": "Close/back \u2192 main-lobby; or choose another available tab.",
          "source": {
            "file": "Assets/_Scripts/UI/Settings/Performance/Controller/HoldToADSToggle.cs",
            "line": 7
          },
          "original": "assets/states/CTL06.png",
          "updated": null,
          "checks": [
            "Reopen persists",
            "Device gameplay behavior",
            "Remote settings refresh"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "visualDistinct": true,
          "captureKey": "CTL06",
          "captureNote": "Native Unity UI with sample data."
        },
        {
          "id": "CTL07",
          "screenId": "controls-settings",
          "group": "Controls settings",
          "title": "Hold to ADS on",
          "trigger": "Choose On/Enable.",
          "result": "Selected toggle color changes; local preference/account sync and available gameplay target updated.",
          "exit": "Close/back \u2192 main-lobby; or choose another available tab.",
          "source": {
            "file": "Assets/_Scripts/UI/Settings/Performance/Controller/HoldToADSToggle.cs",
            "line": 7
          },
          "original": "assets/states/CTL07.png",
          "updated": null,
          "checks": [
            "Reopen persists",
            "Device gameplay behavior",
            "Remote settings refresh"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "visualDistinct": true,
          "captureKey": "CTL07",
          "captureNote": "Native Unity UI with sample data."
        },
        {
          "id": "CTL08",
          "screenId": "controls-settings",
          "group": "Controls settings",
          "title": "Camera rotation in ADS off",
          "trigger": "Choose Off/Disable.",
          "result": "Selected toggle color changes; local preference/account sync and available gameplay target updated.",
          "exit": "Close/back \u2192 main-lobby; or choose another available tab.",
          "source": {
            "file": "Assets/_Scripts/UI/Settings/Performance/Controller/CameraRotationWhileADS.cs",
            "line": 13
          },
          "original": "assets/states/CTL08.png",
          "updated": null,
          "checks": [
            "Reopen persists",
            "Device gameplay behavior",
            "Remote settings refresh"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "visualDistinct": true,
          "captureKey": "CTL08",
          "captureNote": "Native Unity UI with sample data."
        },
        {
          "id": "CTL09",
          "screenId": "controls-settings",
          "group": "Controls settings",
          "title": "Camera rotation in ADS on",
          "trigger": "Choose On/Enable.",
          "result": "Selected toggle color changes; local preference/account sync and available gameplay target updated.",
          "exit": "Close/back \u2192 main-lobby; or choose another available tab.",
          "source": {
            "file": "Assets/_Scripts/UI/Settings/Performance/Controller/CameraRotationWhileADS.cs",
            "line": 13
          },
          "original": "assets/states/CTL09.png",
          "updated": null,
          "checks": [
            "Reopen persists",
            "Device gameplay behavior",
            "Remote settings refresh"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "visualDistinct": true,
          "captureKey": "CTL09",
          "captureNote": "Native Unity UI with sample data."
        },
        {
          "id": "CTL10",
          "screenId": "controls-settings",
          "group": "Controls settings",
          "title": "Peek off",
          "trigger": "Choose Off/Disable.",
          "result": "Selected toggle color changes; local preference/account sync and available gameplay target updated.",
          "exit": "Close/back \u2192 main-lobby; or choose another available tab.",
          "source": {
            "file": "Assets/_Scripts/UI/Settings/Performance/Controller/EnablePeekToggle.cs",
            "line": 7
          },
          "original": "assets/states/CTL10.png",
          "updated": null,
          "checks": [
            "Reopen persists",
            "Device gameplay behavior",
            "Remote settings refresh"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "visualDistinct": true,
          "captureKey": "CTL10",
          "captureNote": "Native Unity UI with sample data."
        },
        {
          "id": "CTL11",
          "screenId": "controls-settings",
          "group": "Controls settings",
          "title": "Peek on",
          "trigger": "Choose On/Enable.",
          "result": "Selected toggle color changes; local preference/account sync and available gameplay target updated.",
          "exit": "Close/back \u2192 main-lobby; or choose another available tab.",
          "source": {
            "file": "Assets/_Scripts/UI/Settings/Performance/Controller/EnablePeekToggle.cs",
            "line": 7
          },
          "original": "assets/states/CTL11.png",
          "updated": null,
          "checks": [
            "Reopen persists",
            "Device gameplay behavior",
            "Remote settings refresh"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "visualDistinct": true,
          "captureKey": "CTL11",
          "captureNote": "Native Unity UI with sample data."
        },
        {
          "id": "CTL12",
          "screenId": "controls-settings",
          "group": "Controls settings",
          "title": "Gyroscope movement off",
          "trigger": "Choose Off/Disable.",
          "result": "Selected toggle color changes; local preference/account sync and available gameplay target updated. Also hides the two dependent movement gyro sensitivity rows; this changes scroll content height.",
          "exit": "Close/back \u2192 main-lobby; or choose another available tab.",
          "source": {
            "file": "Assets/_Scripts/UI/Settings/Controls/SettingsUseGyroInMovementToggle.cs",
            "line": 34
          },
          "original": "assets/states/CTL12.png",
          "updated": null,
          "checks": [
            "Reopen persists",
            "Device gameplay behavior",
            "Remote settings refresh",
            "Dependent slider rows hidden/shown",
            "Scroll height updates without blank gap"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "visualDistinct": true,
          "captureKey": "CTL12",
          "captureNote": "Native Unity UI with sample data."
        },
        {
          "id": "CTL13",
          "screenId": "controls-settings",
          "group": "Controls settings",
          "title": "Gyroscope movement on",
          "trigger": "Choose On/Enable.",
          "result": "Selected toggle color changes; local preference/account sync and available gameplay target updated. Also reveals the two dependent movement gyro sensitivity rows; this changes scroll content height.",
          "exit": "Close/back \u2192 main-lobby; or choose another available tab.",
          "source": {
            "file": "Assets/_Scripts/UI/Settings/Controls/SettingsUseGyroInMovementToggle.cs",
            "line": 34
          },
          "original": "assets/states/CTL13.png",
          "updated": null,
          "checks": [
            "Reopen persists",
            "Device gameplay behavior",
            "Remote settings refresh",
            "Dependent slider rows hidden/shown",
            "Scroll height updates without blank gap"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "visualDistinct": true,
          "captureKey": "CTL13",
          "captureNote": "Native Unity UI with sample data."
        },
        {
          "id": "CTL14",
          "screenId": "controls-settings",
          "group": "Controls settings",
          "title": "Gyroscope aiming off",
          "trigger": "Choose Off/Disable.",
          "result": "Selected toggle color changes; local preference/account sync and available gameplay target updated. Also hides the two dependent ADS gyro sensitivity rows; this changes scroll content height.",
          "exit": "Close/back \u2192 main-lobby; or choose another available tab.",
          "source": {
            "file": "Assets/_Scripts/UI/Settings/Controls/SettingsUseGyroInADSToggle.cs",
            "line": 34
          },
          "original": "assets/states/CTL14.png",
          "updated": null,
          "checks": [
            "Reopen persists",
            "Device gameplay behavior",
            "Remote settings refresh",
            "Dependent slider rows hidden/shown",
            "Scroll height updates without blank gap"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "visualDistinct": true,
          "captureKey": "CTL14",
          "captureNote": "Native Unity UI with sample data."
        },
        {
          "id": "CTL15",
          "screenId": "controls-settings",
          "group": "Controls settings",
          "title": "Gyroscope aiming on",
          "trigger": "Choose On/Enable.",
          "result": "Selected toggle color changes; local preference/account sync and available gameplay target updated. Also reveals the two dependent ADS gyro sensitivity rows; this changes scroll content height.",
          "exit": "Close/back \u2192 main-lobby; or choose another available tab.",
          "source": {
            "file": "Assets/_Scripts/UI/Settings/Controls/SettingsUseGyroInADSToggle.cs",
            "line": 34
          },
          "original": "assets/states/CTL15.png",
          "updated": null,
          "checks": [
            "Reopen persists",
            "Device gameplay behavior",
            "Remote settings refresh",
            "Dependent slider rows hidden/shown",
            "Scroll height updates without blank gap"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "visualDistinct": true,
          "captureKey": "CTL15",
          "captureNote": "Native Unity UI with sample data."
        },
        {
          "id": "CTL16",
          "screenId": "controls-settings",
          "group": "Controls settings",
          "title": "Gyro horizontal invert off",
          "trigger": "Choose Off/Disable.",
          "result": "Selected toggle color changes; local preference/account sync and available gameplay target updated.",
          "exit": "Close/back \u2192 main-lobby; or choose another available tab.",
          "source": {
            "file": "Assets/_Scripts/UI/Settings/Controls/SettingsGyroInvertHorizontalToggle.cs",
            "line": 18
          },
          "original": "assets/states/CTL16.png",
          "updated": null,
          "checks": [
            "Reopen persists",
            "Device gameplay behavior",
            "Remote settings refresh"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "visualDistinct": true,
          "captureKey": "CTL16",
          "captureNote": "Native Unity UI with sample data."
        },
        {
          "id": "CTL17",
          "screenId": "controls-settings",
          "group": "Controls settings",
          "title": "Gyro horizontal invert on",
          "trigger": "Choose On/Enable.",
          "result": "Selected toggle color changes; local preference/account sync and available gameplay target updated.",
          "exit": "Close/back \u2192 main-lobby; or choose another available tab.",
          "source": {
            "file": "Assets/_Scripts/UI/Settings/Controls/SettingsGyroInvertHorizontalToggle.cs",
            "line": 18
          },
          "original": "assets/states/CTL17.png",
          "updated": null,
          "checks": [
            "Reopen persists",
            "Device gameplay behavior",
            "Remote settings refresh"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "visualDistinct": true,
          "captureKey": "CTL17",
          "captureNote": "Native Unity UI with sample data."
        },
        {
          "id": "CTL18",
          "screenId": "controls-settings",
          "group": "Controls settings",
          "title": "Gyro vertical invert off",
          "trigger": "Choose Off/Disable.",
          "result": "Selected toggle color changes; local preference/account sync and available gameplay target updated.",
          "exit": "Close/back \u2192 main-lobby; or choose another available tab.",
          "source": {
            "file": "Assets/_Scripts/UI/Settings/Controls/SettingsGyroInvertVerticalToggle.cs",
            "line": 18
          },
          "original": "assets/states/CTL18.png",
          "updated": null,
          "checks": [
            "Reopen persists",
            "Device gameplay behavior",
            "Remote settings refresh"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "visualDistinct": true,
          "captureKey": "CTL18",
          "captureNote": "Native Unity UI with sample data."
        },
        {
          "id": "CTL19",
          "screenId": "controls-settings",
          "group": "Controls settings",
          "title": "Gyro vertical invert on",
          "trigger": "Choose On/Enable.",
          "result": "Selected toggle color changes; local preference/account sync and available gameplay target updated.",
          "exit": "Close/back \u2192 main-lobby; or choose another available tab.",
          "source": {
            "file": "Assets/_Scripts/UI/Settings/Controls/SettingsGyroInvertVerticalToggle.cs",
            "line": 18
          },
          "original": "assets/states/CTL19.png",
          "updated": null,
          "checks": [
            "Reopen persists",
            "Device gameplay behavior",
            "Remote settings refresh"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "visualDistinct": true,
          "captureKey": "CTL19",
          "captureNote": "Native Unity UI with sample data."
        },
        {
          "id": "CTL20",
          "screenId": "controls-settings",
          "group": "Controls settings",
          "title": "HUD layout Default",
          "trigger": "Choose Default HUD.",
          "result": "Custom applies saved Custom 1; Default resets live layout. Customise UI button opens separate HUD editor.",
          "exit": "Customise UI \u2192 custom-hud-layout-editor; another tab/back.",
          "source": {
            "file": "Assets/_Scripts/UI/Settings/Controls/SettingsCustomisableHUDToggle.cs",
            "line": 29
          },
          "original": "assets/states/CTL20.png",
          "updated": null,
          "checks": [],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "visualDistinct": true,
          "captureKey": "CTL20",
          "captureNote": "Native Unity UI with sample data."
        },
        {
          "id": "CTL21",
          "screenId": "controls-settings",
          "group": "Controls settings",
          "title": "HUD layout Custom",
          "trigger": "Choose Custom HUD.",
          "result": "Custom applies saved Custom 1; Default resets live layout. Customise UI button opens separate HUD editor.",
          "exit": "Customise UI \u2192 custom-hud-layout-editor; another tab/back.",
          "source": {
            "file": "Assets/_Scripts/UI/Settings/Controls/SettingsCustomisableHUDToggle.cs",
            "line": 29
          },
          "original": "assets/states/CTL21.png",
          "updated": null,
          "checks": [],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "visualDistinct": true,
          "captureKey": "CTL21",
          "captureNote": "Native Unity UI with sample data."
        }
      ],
      "flows": [
        {
          "id": "CTLFLOW01",
          "screenId": "controls-settings",
          "title": "Settings \u2192 Controls settings \u2192 another tab / Back",
          "steps": [
            "CTL01",
            "CTL02",
            "CTL03"
          ],
          "animation": "SettingsPanelsUIController toggles bodies with SetActive; tab selector updates image/text color immediately; Back plays lobby UI sound and hides settings.",
          "actualAnimation": "SettingsPanelsUIController toggles bodies with SetActive; tab selector updates image/text color immediately; Back plays lobby UI sound and hides settings.",
          "proposedAnimation": "Native tab motion can be designed later; no completed motion recording implied.",
          "source": {
            "file": "Assets/_Scripts/UI/Settings/SettingsPanelsUIController.cs",
            "line": 93
          },
          "exit": "Any settings tab or underlying lobby/hunt",
          "motionStatus": "Source traced \u00b7 Unity recording pending",
          "runtimeVerified": false
        },
        {
          "id": "CTLFLOW02",
          "screenId": "controls-settings",
          "title": "Custom HUD selection \u2192 edit \u2192 return",
          "steps": [
            "CTL20",
            "CTL21",
            "HUD01",
            "HUD02",
            "HUD09",
            "CTL21"
          ],
          "animation": "Asynchronous asset preparation then settings hidden; editor close destroys clones and reopens settings.",
          "actualAnimation": "Asynchronous asset preparation then settings hidden; editor close destroys clones and reopens settings.",
          "proposedAnimation": "Loading/entry/exit transitions require real Unity rehearsal.",
          "source": {
            "file": "Assets/_Scripts/UI/CustomHUD/CustomHudManager.cs",
            "line": 124
          },
          "exit": "Controls settings",
          "motionStatus": "Source traced \u00b7 Unity recording pending",
          "runtimeVerified": false
        },
        {
          "id": "CTLFLOW03",
          "screenId": "controls-settings",
          "title": "Gyro enabled \u2192 dependent rows appear \u2192 disable",
          "steps": [
            "CTL12",
            "CTL13",
            "CTL14",
            "CTL15"
          ],
          "animation": "SetActive on two dependent sensitivity rows for each gyro toggle; native layout reflow, no tween defined.",
          "actualAnimation": "Immediate dependent-row visibility and native layout rebuild.",
          "proposedAnimation": "Review reflow while scrolled before choosing any optional expansion animation.",
          "source": {
            "file": "Assets/_Scripts/UI/Settings/Controls/SettingsUseGyroInMovementToggle.cs",
            "line": 65
          },
          "exit": "Controls tab remains open",
          "motionStatus": "Source traced \u00b7 Unity recording pending",
          "runtimeVerified": false
        }
      ],
      "exclusions": [
        "Debug page is developer-only, tab inactive in source prefab and nondev debug panel destroyed. Not an ordinary sixth settings category.",
        "MothershipVoiceoverContainerSlider, DisplayMemoryContainerToggle and AntiAliasingContainerToggle are serialized inactive. Do not count them as active ordinary-player states without runtime evidence activating them.",
        "No reachable Report issue/Support/onboarding control found in audited SettingsCanvas/Friends prefab or their controllers. Optional identity entry is active from Gameplay; its3pages are a separate audit.",
        "No per-screen Animator/tween is wired by these controllers. Default Unity selectable states, ScrollRects, timers and pointer-driven HUD editing are actual motion; proposed redesign animation is separate.",
        "Account sync/error states share the visible base settings controls. No saving/offline/error UI should be invented and described as existing.",
        "System microphone/Bluetooth permission alerts are native OS UI and need physical-device recording, not a fabricated Unity screenshot.",
        "Friends service failures and invite races still need live verification; no invite, friend request, kick, leave, save or account write was executed.",
        "Custom HUD drag has no explicit safe-area clamp in CustomHudSettingsObject.OnDrag; account import clamps normalized positions. Redesign must verify full control bounds/touch on each phone."
      ],
      "crossChecks": [
        "Incoming friend popup over open Settings/Friends/HUD",
        "Long names/messages with keyboard and asymmetric safe area",
        "Party role changes while confirmation open",
        "Pending request response after panel closed",
        "Settings account refresh during drag",
        "Exit settings while matchmaking continues",
        "HUD save/default toggles followed by phone-aspect change",
        "Standard versus Arena Exit Hunt outcomes"
      ],
      "entry": "Settings \u2192 Controls",
      "outgoing": [
        "main-lobby",
        "gameplay-settings",
        "audio-settings",
        "graphics-settings",
        "performance-display-settings",
        "custom-hud-layout-editor"
      ]
    },
    "audio-settings": {
      "revision": "all-screen-audit-v1",
      "states": [
        {
          "id": "AUD01",
          "screenId": "audio-settings",
          "group": "Audio settings",
          "title": "Audio tab \u2014 saved levels",
          "trigger": "Select Audio.",
          "result": "Master, Environment, Music, SFX and UI volume plus Voice Chat controls initialize from saved settings.",
          "exit": "Close/back \u2192 main-lobby; or choose another available tab.",
          "source": {
            "file": "Assets/_Scripts/Audio/AudioSettingsManager.cs",
            "line": 24
          },
          "original": "assets/states/AUD01.png",
          "updated": null,
          "checks": [],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "visualDistinct": true,
          "captureKey": "AUD01",
          "captureNote": "Native Unity UI with sample data."
        },
        {
          "id": "AUD02",
          "screenId": "audio-settings",
          "group": "Audio settings",
          "title": "All volumes muted",
          "trigger": "Drag volume controls to boundary.",
          "result": "Numbers and fill reflect0\u2013100; mixer previews while dragging and persists on release.",
          "exit": "Close/back \u2192 main-lobby; or choose another available tab.",
          "source": {
            "file": "Assets/_Scripts/UI/Settings/Audio/SettingsMasterVolume.cs",
            "line": 29
          },
          "original": "assets/states/AUD02.png",
          "updated": null,
          "checks": [
            "Master versus channel attenuation",
            "Plus/minus boundary",
            "Reopen restores"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "visualDistinct": true,
          "captureKey": "AUD02",
          "captureNote": "Native Unity UI with sample data."
        },
        {
          "id": "AUD03",
          "screenId": "audio-settings",
          "group": "Audio settings",
          "title": "All volumes maximum",
          "trigger": "Drag volume controls to boundary.",
          "result": "Numbers and fill reflect0\u2013100; mixer previews while dragging and persists on release.",
          "exit": "Close/back \u2192 main-lobby; or choose another available tab.",
          "source": {
            "file": "Assets/_Scripts/UI/Settings/Audio/SettingsMasterVolume.cs",
            "line": 29
          },
          "original": "assets/states/AUD03.png",
          "updated": null,
          "checks": [
            "Master versus channel attenuation",
            "Plus/minus boundary",
            "Reopen restores"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "visualDistinct": true,
          "captureKey": "AUD03",
          "captureNote": "Native Unity UI with sample data."
        },
        {
          "id": "AUD04",
          "screenId": "audio-settings",
          "group": "Audio settings",
          "title": "Master volume being changed",
          "trigger": "Drag Master volume slider.",
          "result": "Only selected channel updates; value/fill preview live and save on release.",
          "exit": "Close/back \u2192 main-lobby; or choose another available tab.",
          "source": {
            "file": "Assets/_Scripts/UI/Settings/Audio/SettingsMasterVolume.cs",
            "line": 11
          },
          "original": "assets/states/AUD04.png",
          "updated": null,
          "checks": [
            "0,25,100",
            "Release while leaving tab"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "visualDistinct": true,
          "captureKey": "AUD04",
          "captureNote": "Native Unity UI with sample data."
        },
        {
          "id": "AUD05",
          "screenId": "audio-settings",
          "group": "Audio settings",
          "title": "Environment volume being changed",
          "trigger": "Drag Environment volume slider.",
          "result": "Only selected channel updates; value/fill preview live and save on release.",
          "exit": "Close/back \u2192 main-lobby; or choose another available tab.",
          "source": {
            "file": "Assets/_Scripts/UI/Settings/Audio/SettingsEnvironmentVolume.cs",
            "line": 11
          },
          "original": "assets/states/AUD05.png",
          "updated": null,
          "checks": [
            "0,25,100",
            "Release while leaving tab"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "visualDistinct": true,
          "captureKey": "AUD05",
          "captureNote": "Native Unity UI with sample data."
        },
        {
          "id": "AUD06",
          "screenId": "audio-settings",
          "group": "Audio settings",
          "title": "Music volume being changed",
          "trigger": "Drag Music volume slider.",
          "result": "Only selected channel updates; value/fill preview live and save on release.",
          "exit": "Close/back \u2192 main-lobby; or choose another available tab.",
          "source": {
            "file": "Assets/_Scripts/UI/Settings/Audio/SettingsMusicVolume.cs",
            "line": 11
          },
          "original": "assets/states/AUD06.png",
          "updated": null,
          "checks": [
            "0,25,100",
            "Release while leaving tab"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "visualDistinct": true,
          "captureKey": "AUD06",
          "captureNote": "Native Unity UI with sample data."
        },
        {
          "id": "AUD07",
          "screenId": "audio-settings",
          "group": "Audio settings",
          "title": "SFX volume being changed",
          "trigger": "Drag SFX volume slider.",
          "result": "Only selected channel updates; value/fill preview live and save on release.",
          "exit": "Close/back \u2192 main-lobby; or choose another available tab.",
          "source": {
            "file": "Assets/_Scripts/UI/Settings/Audio/SettingsSFXVolume.cs",
            "line": 11
          },
          "original": "assets/states/AUD07.png",
          "updated": null,
          "checks": [
            "0,25,100",
            "Release while leaving tab"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "visualDistinct": true,
          "captureKey": "AUD07",
          "captureNote": "Native Unity UI with sample data."
        },
        {
          "id": "AUD08",
          "screenId": "audio-settings",
          "group": "Audio settings",
          "title": "UI volume being changed",
          "trigger": "Drag UI volume slider.",
          "result": "Only selected channel updates; value/fill preview live and save on release.",
          "exit": "Close/back \u2192 main-lobby; or choose another available tab.",
          "source": {
            "file": "Assets/_Scripts/UI/Settings/Audio/SettingsUIVolume.cs",
            "line": 11
          },
          "original": "assets/states/AUD08.png",
          "updated": null,
          "checks": [
            "0,25,100",
            "Release while leaving tab"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "visualDistinct": true,
          "captureKey": "AUD08",
          "captureNote": "Native Unity UI with sample data."
        },
        {
          "id": "AUD09",
          "screenId": "audio-settings",
          "group": "Audio settings",
          "title": "Voice chat disabled",
          "trigger": "Select Voice Chat Off.",
          "result": "IsFeatureEnabled updated on supported non-server platforms; permission and connection behavior remains a device/runtime boundary.",
          "exit": "Close/back \u2192 main-lobby; or choose another available tab.",
          "source": {
            "file": "Assets/_Scripts/UI/Settings/Audio/SettingsVoiceChatToggle.cs",
            "line": 15
          },
          "original": "assets/states/AUD09.png",
          "updated": null,
          "checks": [],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "visualDistinct": true,
          "captureKey": "AUD09",
          "captureNote": "Native Unity UI with sample data."
        },
        {
          "id": "AUD10",
          "screenId": "audio-settings",
          "group": "Audio settings",
          "title": "Voice chat enabled",
          "trigger": "Select Voice Chat On.",
          "result": "IsFeatureEnabled updated on supported non-server platforms; permission and connection behavior remains a device/runtime boundary.",
          "exit": "Close/back \u2192 main-lobby; or choose another available tab.",
          "source": {
            "file": "Assets/_Scripts/UI/Settings/Audio/SettingsVoiceChatToggle.cs",
            "line": 15
          },
          "original": "assets/states/AUD10.png",
          "updated": null,
          "checks": [],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "visualDistinct": true,
          "captureKey": "AUD10",
          "captureNote": "Native Unity UI with sample data."
        },
        {
          "id": "AUD11",
          "screenId": "audio-settings",
          "group": "Audio settings",
          "title": "Voice permissions unresolved or denied",
          "trigger": "Microphone/Bluetooth permission flow has not granted access.",
          "result": "Native OS prompt is outside Unity UI; denied permissions leave voice unavailable. Settings toggle does not itself display a bespoke Unity error state.",
          "exit": "Close/back \u2192 main-lobby; or choose another available tab.",
          "source": {
            "file": "Assets/_Scripts/VoiceChat/VoiceChatManager.cs",
            "line": 229
          },
          "original": "assets/states/AUD10.png",
          "updated": null,
          "checks": [
            "iOS mic allow/deny",
            "Android microphone/Bluetooth",
            "Settings return/resume"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "visualDistinct": false,
          "captureKey": "AUD10",
          "captureNote": "Native Unity UI with sample data. This state shares its visual layout with capture AUD10."
        }
      ],
      "flows": [
        {
          "id": "AUDFLOW01",
          "screenId": "audio-settings",
          "title": "Settings \u2192 Audio settings \u2192 another tab / Back",
          "steps": [
            "AUD01",
            "AUD02",
            "AUD03"
          ],
          "animation": "SettingsPanelsUIController toggles bodies with SetActive; tab selector updates image/text color immediately; Back plays lobby UI sound and hides settings.",
          "actualAnimation": "SettingsPanelsUIController toggles bodies with SetActive; tab selector updates image/text color immediately; Back plays lobby UI sound and hides settings.",
          "proposedAnimation": "Native tab motion can be designed later; no completed motion recording implied.",
          "source": {
            "file": "Assets/_Scripts/UI/Settings/SettingsPanelsUIController.cs",
            "line": 93
          },
          "exit": "Any settings tab or underlying lobby/hunt",
          "motionStatus": "Source traced \u00b7 Unity recording pending",
          "runtimeVerified": false
        },
        {
          "id": "AUDFLOW02",
          "screenId": "audio-settings",
          "title": "Drag volume \u2192 preview \u2192 save",
          "steps": [
            "AUD01",
            "AUD04",
            "AUD02",
            "AUD03"
          ],
          "animation": "Native Slider updates fill/number live; mixer level previews on value change; persistence on pointer-up.",
          "actualAnimation": "Native Slider updates fill/number live; mixer level previews on value change; persistence on pointer-up.",
          "proposedAnimation": "Show recorded slider movement with audio where relevant.",
          "source": {
            "file": "Assets/_Scripts/UI/Settings/Audio/SettingsMasterVolume.cs",
            "line": 11
          },
          "exit": "Audio tab retained",
          "motionStatus": "Source traced \u00b7 Unity recording pending",
          "runtimeVerified": false
        }
      ],
      "exclusions": [
        "Debug page is developer-only, tab inactive in source prefab and nondev debug panel destroyed. Not an ordinary sixth settings category.",
        "MothershipVoiceoverContainerSlider, DisplayMemoryContainerToggle and AntiAliasingContainerToggle are serialized inactive. Do not count them as active ordinary-player states without runtime evidence activating them.",
        "No reachable Report issue/Support/onboarding control found in audited SettingsCanvas/Friends prefab or their controllers. Optional identity entry is active from Gameplay; its3pages are a separate audit.",
        "No per-screen Animator/tween is wired by these controllers. Default Unity selectable states, ScrollRects, timers and pointer-driven HUD editing are actual motion; proposed redesign animation is separate.",
        "Account sync/error states share the visible base settings controls. No saving/offline/error UI should be invented and described as existing.",
        "System microphone/Bluetooth permission alerts are native OS UI and need physical-device recording, not a fabricated Unity screenshot.",
        "Friends service failures and invite races still need live verification; no invite, friend request, kick, leave, save or account write was executed.",
        "Custom HUD drag has no explicit safe-area clamp in CustomHudSettingsObject.OnDrag; account import clamps normalized positions. Redesign must verify full control bounds/touch on each phone."
      ],
      "crossChecks": [
        "Incoming friend popup over open Settings/Friends/HUD",
        "Long names/messages with keyboard and asymmetric safe area",
        "Party role changes while confirmation open",
        "Pending request response after panel closed",
        "Settings account refresh during drag",
        "Exit settings while matchmaking continues",
        "HUD save/default toggles followed by phone-aspect change",
        "Standard versus Arena Exit Hunt outcomes"
      ],
      "entry": "Settings \u2192 Audio",
      "outgoing": [
        "main-lobby",
        "controls-settings",
        "gameplay-settings",
        "graphics-settings",
        "performance-display-settings"
      ]
    },
    "graphics-settings": {
      "revision": "all-screen-audit-v1",
      "states": [
        {
          "id": "GFX01",
          "screenId": "graphics-settings",
          "group": "Graphics settings",
          "title": "Smooth selected",
          "trigger": "Open with saved category or choose Smooth.",
          "result": "One quality card selected. Mapping preserves texture tier: raw level base + category0/1/2.",
          "exit": "Close/back \u2192 main-lobby; or choose another available tab.",
          "source": {
            "file": "Assets/_Scripts/UI/Settings/Graphics/View/GraphicsToggleGroupSettings.cs",
            "line": 18
          },
          "original": "assets/states/GFX01.png",
          "updated": null,
          "checks": [
            "Low/high texture tiers",
            "Category persisted",
            "No double offset"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "visualDistinct": true,
          "captureKey": "GFX01",
          "captureNote": "Native Unity UI with sample data."
        },
        {
          "id": "GFX02",
          "screenId": "graphics-settings",
          "group": "Graphics settings",
          "title": "Balanced selected",
          "trigger": "Open with saved category or choose Balanced.",
          "result": "One quality card selected. Mapping preserves texture tier: raw level base + category0/1/2.",
          "exit": "Close/back \u2192 main-lobby; or choose another available tab.",
          "source": {
            "file": "Assets/_Scripts/UI/Settings/Graphics/View/GraphicsToggleGroupSettings.cs",
            "line": 18
          },
          "original": "assets/states/GFX02.png",
          "updated": null,
          "checks": [
            "Low/high texture tiers",
            "Category persisted",
            "No double offset"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "visualDistinct": true,
          "captureKey": "GFX02",
          "captureNote": "Native Unity UI with sample data."
        },
        {
          "id": "GFX03",
          "screenId": "graphics-settings",
          "group": "Graphics settings",
          "title": "Quality selected",
          "trigger": "Open with saved category or choose Quality.",
          "result": "One quality card selected. Mapping preserves texture tier: raw level base + category0/1/2.",
          "exit": "Close/back \u2192 main-lobby; or choose another available tab.",
          "source": {
            "file": "Assets/_Scripts/UI/Settings/Graphics/View/GraphicsToggleGroupSettings.cs",
            "line": 18
          },
          "original": "assets/states/GFX03.png",
          "updated": null,
          "checks": [
            "Low/high texture tiers",
            "Category persisted",
            "No double offset"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "visualDistinct": true,
          "captureKey": "GFX03",
          "captureNote": "Native Unity UI with sample data."
        },
        {
          "id": "GFX04",
          "screenId": "graphics-settings",
          "group": "Graphics settings",
          "title": "Quality change awaiting Apply",
          "trigger": "Selection prepared after quality-change flag.",
          "result": "PrepareGraphicsLevel enables Apply only when _hasQualityBeenChanged is true; this gating deserves runtime check for first change after opening.",
          "exit": "Close/back \u2192 main-lobby; or choose another available tab.",
          "source": {
            "file": "Assets/_Scripts/UI/Settings/Graphics/Controller/GraphicQualitySettings.cs",
            "line": 48
          },
          "original": "assets/states/GFX04.png",
          "updated": null,
          "checks": [
            "First change after opening",
            "Switch twice before Apply",
            "Leave tab without Apply"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "visualDistinct": true,
          "captureKey": "GFX04",
          "captureNote": "Native Unity UI with sample data."
        },
        {
          "id": "GFX05",
          "screenId": "graphics-settings",
          "group": "Graphics settings",
          "title": "Quality applied",
          "trigger": "Tap Apply.",
          "result": "SetRawGraphicsLevel invoked; click sound; Apply disabled. No confirmation or success popup in this controller.",
          "exit": "Close/back \u2192 main-lobby; or choose another available tab.",
          "source": {
            "file": "Assets/_Scripts/UI/Settings/Graphics/Controller/GraphicQualitySettings.cs",
            "line": 57
          },
          "original": "assets/states/GFX03.png",
          "updated": null,
          "checks": [
            "Return/reopen",
            "Unsupported requested tier clamping",
            "Runtime terrain/render refresh"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "visualDistinct": true,
          "captureKey": "GFX03",
          "captureNote": "Native Unity UI with sample data. This state shares its visual layout with capture GFX03."
        }
      ],
      "flows": [
        {
          "id": "GFXFLOW01",
          "screenId": "graphics-settings",
          "title": "Settings \u2192 Graphics settings \u2192 another tab / Back",
          "steps": [
            "GFX01",
            "GFX02",
            "GFX03"
          ],
          "animation": "SettingsPanelsUIController toggles bodies with SetActive; tab selector updates image/text color immediately; Back plays lobby UI sound and hides settings.",
          "actualAnimation": "SettingsPanelsUIController toggles bodies with SetActive; tab selector updates image/text color immediately; Back plays lobby UI sound and hides settings.",
          "proposedAnimation": "Native tab motion can be designed later; no completed motion recording implied.",
          "source": {
            "file": "Assets/_Scripts/UI/Settings/SettingsPanelsUIController.cs",
            "line": 93
          },
          "exit": "Any settings tab or underlying lobby/hunt",
          "motionStatus": "Source traced \u00b7 Unity recording pending",
          "runtimeVerified": false
        },
        {
          "id": "GFXFLOW02",
          "screenId": "graphics-settings",
          "title": "Choose quality \u2192 Apply",
          "steps": [
            "GFX01",
            "GFX02",
            "GFX03",
            "GFX04",
            "GFX05"
          ],
          "animation": "Selection color immediate; Apply disabled after action; graphics runtime updates independently.",
          "actualAnimation": "Selection color immediate; Apply disabled after action; graphics runtime updates independently.",
          "proposedAnimation": "Review selected-card and button response after runtime correctness check.",
          "source": {
            "file": "Assets/_Scripts/UI/Settings/Graphics/Controller/GraphicQualitySettings.cs",
            "line": 48
          },
          "exit": "Graphics tab retained",
          "motionStatus": "Source traced \u00b7 Unity recording pending",
          "runtimeVerified": false
        }
      ],
      "exclusions": [
        "Debug page is developer-only, tab inactive in source prefab and nondev debug panel destroyed. Not an ordinary sixth settings category.",
        "MothershipVoiceoverContainerSlider, DisplayMemoryContainerToggle and AntiAliasingContainerToggle are serialized inactive. Do not count them as active ordinary-player states without runtime evidence activating them.",
        "No reachable Report issue/Support/onboarding control found in audited SettingsCanvas/Friends prefab or their controllers. Optional identity entry is active from Gameplay; its3pages are a separate audit.",
        "No per-screen Animator/tween is wired by these controllers. Default Unity selectable states, ScrollRects, timers and pointer-driven HUD editing are actual motion; proposed redesign animation is separate.",
        "Account sync/error states share the visible base settings controls. No saving/offline/error UI should be invented and described as existing.",
        "System microphone/Bluetooth permission alerts are native OS UI and need physical-device recording, not a fabricated Unity screenshot.",
        "Friends service failures and invite races still need live verification; no invite, friend request, kick, leave, save or account write was executed.",
        "Custom HUD drag has no explicit safe-area clamp in CustomHudSettingsObject.OnDrag; account import clamps normalized positions. Redesign must verify full control bounds/touch on each phone."
      ],
      "crossChecks": [
        "Incoming friend popup over open Settings/Friends/HUD",
        "Long names/messages with keyboard and asymmetric safe area",
        "Party role changes while confirmation open",
        "Pending request response after panel closed",
        "Settings account refresh during drag",
        "Exit settings while matchmaking continues",
        "HUD save/default toggles followed by phone-aspect change",
        "Standard versus Arena Exit Hunt outcomes"
      ],
      "entry": "Settings initial/default category; Settings \u2192 Graphics",
      "outgoing": [
        "main-lobby",
        "controls-settings",
        "audio-settings",
        "gameplay-settings",
        "performance-display-settings"
      ]
    },
    "performance-display-settings": {
      "revision": "all-screen-audit-v1",
      "states": [
        {
          "id": "PERF01",
          "screenId": "performance-display-settings",
          "group": "Performance / display settings",
          "title": "Performance tab",
          "trigger": "Select Performance.",
          "result": "Active ordinary controls are Display FPS and Display Ping. Memory usage and Anti-aliasing remain inactive in the serialized prefab.",
          "exit": "Close/back \u2192 main-lobby; or choose another available tab.",
          "source": {
            "file": "Assets/_Scripts/UI/Settings/SettingsPanelsUIController.cs",
            "line": 93
          },
          "original": "assets/states/PERF01.png",
          "updated": null,
          "checks": [],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "visualDistinct": true,
          "captureKey": "PERF01",
          "captureNote": "Native Unity UI with sample data."
        },
        {
          "id": "PERF02",
          "screenId": "performance-display-settings",
          "group": "Performance / display settings",
          "title": "FPS display off",
          "trigger": "Choose display Off.",
          "result": "Preference changes while actual overlay is gated to a ready hunt; lobby/settings/loading stay free of performance readouts.",
          "exit": "Close/back \u2192 main-lobby; or choose another available tab.",
          "source": {
            "file": "Assets/_Scripts/UI/Settings/Performance/Controller/FPSDisplaySettings.cs",
            "line": 7
          },
          "original": "assets/states/PERF02.png",
          "updated": null,
          "checks": [
            "Ready hunt displays",
            "Loading hides",
            "Return to lobby hides"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "visualDistinct": true,
          "captureKey": "PERF02",
          "captureNote": "Native Unity UI with sample data."
        },
        {
          "id": "PERF03",
          "screenId": "performance-display-settings",
          "group": "Performance / display settings",
          "title": "FPS display on",
          "trigger": "Choose display On.",
          "result": "Preference changes while actual overlay is gated to a ready hunt; lobby/settings/loading stay free of performance readouts.",
          "exit": "Close/back \u2192 main-lobby; or choose another available tab.",
          "source": {
            "file": "Assets/_Scripts/UI/Settings/Performance/Controller/FPSDisplaySettings.cs",
            "line": 7
          },
          "original": "assets/states/PERF03.png",
          "updated": null,
          "checks": [
            "Ready hunt displays",
            "Loading hides",
            "Return to lobby hides"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "visualDistinct": true,
          "captureKey": "PERF03",
          "captureNote": "Native Unity UI with sample data."
        },
        {
          "id": "PERF04",
          "screenId": "performance-display-settings",
          "group": "Performance / display settings",
          "title": "Ping display off",
          "trigger": "Choose display Off.",
          "result": "Preference changes while actual overlay is gated to a ready hunt; lobby/settings/loading stay free of performance readouts.",
          "exit": "Close/back \u2192 main-lobby; or choose another available tab.",
          "source": {
            "file": "Assets/_Scripts/UI/Settings/Performance/Controller/PingDisplaySettings.cs",
            "line": 7
          },
          "original": "assets/states/PERF04.png",
          "updated": null,
          "checks": [
            "Ready hunt displays",
            "Loading hides",
            "Return to lobby hides"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "visualDistinct": true,
          "captureKey": "PERF04",
          "captureNote": "Native Unity UI with sample data."
        },
        {
          "id": "PERF05",
          "screenId": "performance-display-settings",
          "group": "Performance / display settings",
          "title": "Ping display on",
          "trigger": "Choose display On.",
          "result": "Preference changes while actual overlay is gated to a ready hunt; lobby/settings/loading stay free of performance readouts.",
          "exit": "Close/back \u2192 main-lobby; or choose another available tab.",
          "source": {
            "file": "Assets/_Scripts/UI/Settings/Performance/Controller/PingDisplaySettings.cs",
            "line": 7
          },
          "original": "assets/states/PERF05.png",
          "updated": null,
          "checks": [
            "Ready hunt displays",
            "Loading hides",
            "Return to lobby hides"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "visualDistinct": true,
          "captureKey": "PERF05",
          "captureNote": "Native Unity UI with sample data."
        },
        {
          "id": "PERF06",
          "screenId": "performance-display-settings",
          "group": "Performance / display settings",
          "title": "Enabled stats suppressed outside hunt",
          "trigger": "FPS/Ping preferences on, but current scene lobby or loading.",
          "result": "CanShowInCurrentState false suppresses readouts independently of saved On controls.",
          "exit": "Close/back \u2192 main-lobby; or choose another available tab.",
          "source": {
            "file": "Assets/_Scripts/UI/Settings/Performance/Controller/PerformanceStatsDisplayVisibility.cs",
            "line": 17
          },
          "original": "assets/states/PERF06.png",
          "updated": null,
          "checks": [],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "visualDistinct": false,
          "captureKey": "PERF06",
          "captureNote": "Native Unity UI with sample data."
        }
      ],
      "flows": [
        {
          "id": "PERFFLOW01",
          "screenId": "performance-display-settings",
          "title": "Settings \u2192 Performance / display settings \u2192 another tab / Back",
          "steps": [
            "PERF01",
            "PERF02",
            "PERF03"
          ],
          "animation": "SettingsPanelsUIController toggles bodies with SetActive; tab selector updates image/text color immediately; Back plays lobby UI sound and hides settings.",
          "actualAnimation": "SettingsPanelsUIController toggles bodies with SetActive; tab selector updates image/text color immediately; Back plays lobby UI sound and hides settings.",
          "proposedAnimation": "Native tab motion can be designed later; no completed motion recording implied.",
          "source": {
            "file": "Assets/_Scripts/UI/Settings/SettingsPanelsUIController.cs",
            "line": 93
          },
          "exit": "Any settings tab or underlying lobby/hunt",
          "motionStatus": "Source traced \u00b7 Unity recording pending",
          "runtimeVerified": false
        }
      ],
      "exclusions": [
        "Debug page is developer-only, tab inactive in source prefab and nondev debug panel destroyed. Not an ordinary sixth settings category.",
        "MothershipVoiceoverContainerSlider, DisplayMemoryContainerToggle and AntiAliasingContainerToggle are serialized inactive. Do not count them as active ordinary-player states without runtime evidence activating them.",
        "No reachable Report issue/Support/onboarding control found in audited SettingsCanvas/Friends prefab or their controllers. Optional identity entry is active from Gameplay; its3pages are a separate audit.",
        "No per-screen Animator/tween is wired by these controllers. Default Unity selectable states, ScrollRects, timers and pointer-driven HUD editing are actual motion; proposed redesign animation is separate.",
        "Account sync/error states share the visible base settings controls. No saving/offline/error UI should be invented and described as existing.",
        "System microphone/Bluetooth permission alerts are native OS UI and need physical-device recording, not a fabricated Unity screenshot.",
        "Friends service failures and invite races still need live verification; no invite, friend request, kick, leave, save or account write was executed.",
        "Custom HUD drag has no explicit safe-area clamp in CustomHudSettingsObject.OnDrag; account import clamps normalized positions. Redesign must verify full control bounds/touch on each phone."
      ],
      "crossChecks": [
        "Incoming friend popup over open Settings/Friends/HUD",
        "Long names/messages with keyboard and asymmetric safe area",
        "Party role changes while confirmation open",
        "Pending request response after panel closed",
        "Settings account refresh during drag",
        "Exit settings while matchmaking continues",
        "HUD save/default toggles followed by phone-aspect change",
        "Standard versus Arena Exit Hunt outcomes"
      ],
      "entry": "Settings \u2192 Performance",
      "outgoing": [
        "main-lobby",
        "controls-settings",
        "audio-settings",
        "graphics-settings",
        "gameplay-settings"
      ]
    },
    "custom-hud-layout-editor": {
      "revision": "all-screen-audit-v1",
      "states": [
        {
          "id": "HUD01",
          "screenId": "custom-hud-layout-editor",
          "group": "Custom HUD layout editor",
          "title": "HUD assets loading",
          "trigger": "Tap Customise UI.",
          "result": "Marks settings open, asynchronously requests InHuntCanvas then editor then background; repeated open returns early.",
          "exit": "Close/back \u2192 controls-settings; or choose another available tab.",
          "source": {
            "file": "Assets/_Scripts/UI/CustomHUD/CustomHudManager.cs",
            "line": 124
          },
          "original": "assets/states/CTL20.png",
          "updated": null,
          "checks": [
            "Repeat tap",
            "Cancel async",
            "Missing one of three assets"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "visualDistinct": false,
          "captureKey": "CTL20",
          "captureNote": "Native Unity UI with sample data. This state shares its visual layout with capture CTL20."
        },
        {
          "id": "HUD02",
          "screenId": "custom-hud-layout-editor",
          "group": "Custom HUD layout editor",
          "title": "HUD editor \u2014 no selection",
          "trigger": "All three HUD assets loaded.",
          "result": "Settings closes; preview HUD gets draggable proxy rectangles, unwanted runtime components removed; default or cached Custom 1 positions applied.",
          "exit": "Exit \u2192 Controls without saving; Save and Use applies layout.",
          "source": {
            "file": "Assets/_Scripts/UI/CustomHUD/CustomHudManager.cs",
            "line": 157
          },
          "original": "assets/states/HUD02.png",
          "updated": null,
          "checks": [],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "visualDistinct": true,
          "captureKey": "HUD02",
          "captureNote": "Native Unity UI with sample data. Native proxy creation completed; absent GameManager only prevents final saved-loadout lookup. Default offline layout."
        },
        {
          "id": "HUD03",
          "screenId": "custom-hud-layout-editor",
          "group": "Custom HUD layout editor",
          "title": "HUD object selected",
          "trigger": "Tap movable HUD object.",
          "result": "Previous proxy deselects; selected proxy tint changes and Scale/Opacity values load from selected item.",
          "exit": "Close/back \u2192 controls-settings; or choose another available tab.",
          "source": {
            "file": "Assets/_Scripts/UI/CustomHUD/CustomHudManager.cs",
            "line": 577
          },
          "original": "assets/states/HUD03.png",
          "updated": null,
          "checks": [],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "visualDistinct": true,
          "captureKey": "HUD03",
          "captureNote": "Native Unity UI with sample data. Native proxy creation completed; absent GameManager only prevents final saved-loadout lookup. Default offline layout."
        },
        {
          "id": "HUD04",
          "screenId": "custom-hud-layout-editor",
          "group": "Custom HUD layout editor",
          "title": "HUD object dragged",
          "trigger": "Pointer drag selected proxy.",
          "result": "Proxy position follows local pointer minus initial offset, preventing snap; consumes event so underlying game control does not activate.",
          "exit": "Close/back \u2192 controls-settings; or choose another available tab.",
          "source": {
            "file": "Assets/_Scripts/UI/CustomHUD/CustomHudSettingsObject.cs",
            "line": 45
          },
          "original": "assets/states/HUD04.png",
          "updated": null,
          "checks": [
            "No jump on grab",
            "No accidental fire",
            "Corners and safe-area edges",
            "Joystick and gadget selections"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "visualDistinct": true,
          "captureKey": "HUD04",
          "captureNote": "Native Unity UI with sample data. Native proxy creation completed; absent GameManager only prevents final saved-loadout lookup. Default offline layout."
        },
        {
          "id": "HUD05",
          "screenId": "custom-hud-layout-editor",
          "group": "Custom HUD layout editor",
          "title": "HUD scale edited",
          "trigger": "Move Scale slider with selected object.",
          "result": "SetScale changes proxy and child scale; label is rounded percent.",
          "exit": "Close/back \u2192 controls-settings; or choose another available tab.",
          "source": {
            "file": "Assets/_Scripts/UI/CustomHUD/CustomHudSettings.cs",
            "line": 40
          },
          "original": "assets/states/HUD05.png",
          "updated": null,
          "checks": [
            "Serialized min/max",
            "Selection rect remains accurate",
            "HorizontalLayoutGroup special case"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "visualDistinct": true,
          "captureKey": "HUD05",
          "captureNote": "Native Unity UI with sample data. Native proxy creation completed; absent GameManager only prevents final saved-loadout lookup. Default offline layout."
        },
        {
          "id": "HUD06",
          "screenId": "custom-hud-layout-editor",
          "group": "Custom HUD layout editor",
          "title": "HUD opacity edited",
          "trigger": "Move Opacity slider.",
          "result": "Child CanvasGroup alpha changes; selected-outline remains separate; label rounded percent.",
          "exit": "Close/back \u2192 controls-settings; or choose another available tab.",
          "source": {
            "file": "Assets/_Scripts/UI/CustomHUD/CustomHudSettings.cs",
            "line": 55
          },
          "original": "assets/states/HUD06.png",
          "updated": null,
          "checks": [
            "0% recoverable selection",
            "100% removes temporary CanvasGroup",
            "Repeated change"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "visualDistinct": true,
          "captureKey": "HUD06",
          "captureNote": "Native Unity UI with sample data. Native proxy creation completed; absent GameManager only prevents final saved-loadout lookup. Default offline layout."
        },
        {
          "id": "HUD07",
          "screenId": "custom-hud-layout-editor",
          "group": "Custom HUD layout editor",
          "title": "HUD directional nudge",
          "trigger": "Press arrow control with selected item.",
          "result": "Nudges by MoveAmount (default1) on local X/Y axis; DownArrow lacks null guard and should be tested with no selection.",
          "exit": "Close/back \u2192 controls-settings; or choose another available tab.",
          "source": {
            "file": "Assets/_Scripts/UI/CustomHUD/CustomHudSettings.cs",
            "line": 70
          },
          "original": "assets/states/HUD07.png",
          "updated": null,
          "checks": [
            "All4 arrows",
            "No selection",
            "Hold/repeat if UI supplies it"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "visualDistinct": true,
          "captureKey": "HUD07",
          "captureNote": "Native Unity UI with sample data. Native proxy creation completed; absent GameManager only prevents final saved-loadout lookup. Default offline layout."
        },
        {
          "id": "HUD08",
          "screenId": "custom-hud-layout-editor",
          "group": "Custom HUD layout editor",
          "title": "HUD reset to defaults",
          "trigger": "Tap Reset.",
          "result": "All preview objects reset position/scale/opacity; selected object values refreshed. No confirmation dialog in source.",
          "exit": "Continue editing, Save and Use or Exit.",
          "source": {
            "file": "Assets/_Scripts/UI/CustomHUD/CustomHudManager.cs",
            "line": 406
          },
          "original": "assets/states/HUD03.png",
          "updated": null,
          "checks": [],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "visualDistinct": true,
          "captureKey": "HUD03",
          "captureNote": "Native Unity UI with sample data. This state shares its visual layout with capture HUD03. Native proxy creation completed; absent GameManager only prevents final saved-loadout lookup. Default offline layout."
        },
        {
          "id": "HUD09",
          "screenId": "custom-hud-layout-editor",
          "group": "Custom HUD layout editor",
          "title": "Save and Use",
          "trigger": "Tap Save and Use.",
          "result": "Writes Custom 1, closes editor, applies HUD, enables Custom HUD preference and notifies account sync.",
          "exit": "Close/back \u2192 controls-settings; or choose another available tab.",
          "source": {
            "file": "Assets/_Scripts/UI/CustomHUD/CustomHudSettings.cs",
            "line": 20
          },
          "original": "assets/states/CTL21.png",
          "updated": null,
          "checks": [
            "Reopen same layout",
            "Cross-device normalized load",
            "Storage failure"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "visualDistinct": true,
          "captureKey": "CTL21",
          "captureNote": "Native Unity UI with sample data. This state shares its visual layout with capture CTL21."
        },
        {
          "id": "HUD10",
          "screenId": "custom-hud-layout-editor",
          "group": "Custom HUD layout editor",
          "title": "Exit without saving",
          "trigger": "Tap Exit.",
          "result": "Destroy preview/editor/background and reopen prior Settings context; unsaved preview transforms not saved. No unsaved-changes confirmation.",
          "exit": "Controls settings.",
          "source": {
            "file": "Assets/_Scripts/UI/CustomHUD/CustomHudSettings.cs",
            "line": 35
          },
          "original": "assets/states/CTL20.png",
          "updated": null,
          "checks": [
            "Edited unsaved state",
            "Repeated open/exit",
            "During global loading suppress reopen"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "visualDistinct": true,
          "captureKey": "CTL20",
          "captureNote": "Native Unity UI with sample data. This state shares its visual layout with capture CTL20."
        },
        {
          "id": "HUD11",
          "screenId": "custom-hud-layout-editor",
          "group": "Custom HUD layout editor",
          "title": "Asset failure or async cancellation",
          "trigger": "Any HUD asset null/error or task cancellation.",
          "result": "Code throws missing-data/download exception or returns on cancellation; no dedicated HUD error widget or local cleanup handler in this method.",
          "exit": "Close/back \u2192 controls-settings; or choose another available tab.",
          "source": {
            "file": "Assets/_Scripts/UI/CustomHUD/CustomHudManager.cs",
            "line": 141
          },
          "original": "assets/states/CTL20.png",
          "updated": null,
          "checks": [
            "First/second/third asset fails",
            "CustomHudSettingsOpen recovery",
            "Partial clone cleanup"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "visualDistinct": false,
          "captureKey": "CTL20",
          "captureNote": "Native Unity UI with sample data. This state shares its visual layout with capture CTL20."
        },
        {
          "id": "HUD12",
          "screenId": "custom-hud-layout-editor",
          "group": "Custom HUD layout editor",
          "title": "Saved layout adapted to another phone",
          "trigger": "Account HUD loaded using normalized safe-area coordinates.",
          "result": "Clamp normalized position\u00b10.5, scale0.5\u20132 and opacity0\u20131; convert to safe-area width/height; cache while Default selected.",
          "exit": "Close/back \u2192 controls-settings; or choose another available tab.",
          "source": {
            "file": "Assets/_Scripts/UI/CustomHUD/CustomHudManager.cs",
            "line": 496
          },
          "original": "assets/states/HUD12.png",
          "updated": null,
          "checks": [
            "Left/right notch",
            "Landscape reversal",
            "Gadget legacy DroneButton mapping",
            "Training does not apply custom HUD"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "visualDistinct": true,
          "captureKey": "HUD12",
          "captureNote": "Native Unity UI with sample data. Native proxy creation completed; absent GameManager only prevents final saved-loadout lookup. Default offline layout."
        }
      ],
      "flows": [
        {
          "id": "CTLFLOW02",
          "screenId": "controls-settings",
          "title": "Custom HUD selection \u2192 edit \u2192 return",
          "steps": [
            "CTL20",
            "CTL21",
            "HUD01",
            "HUD02",
            "HUD09",
            "CTL21"
          ],
          "animation": "Asynchronous asset preparation then settings hidden; editor close destroys clones and reopens settings.",
          "actualAnimation": "Asynchronous asset preparation then settings hidden; editor close destroys clones and reopens settings.",
          "proposedAnimation": "Loading/entry/exit transitions require real Unity rehearsal.",
          "source": {
            "file": "Assets/_Scripts/UI/CustomHUD/CustomHudManager.cs",
            "line": 124
          },
          "exit": "Controls settings",
          "motionStatus": "Source traced \u00b7 Unity recording pending",
          "runtimeVerified": false
        },
        {
          "id": "HUDFLOW01",
          "screenId": "custom-hud-layout-editor",
          "title": "Select \u2192 drag / nudge \u2192 scale / opacity \u2192 save",
          "steps": [
            "HUD02",
            "HUD03",
            "HUD04",
            "HUD05",
            "HUD06",
            "HUD07",
            "HUD09"
          ],
          "animation": "Native pointer-driven movement and transform/CanvasGroup changes; no timeline animation.",
          "actualAnimation": "Native pointer-driven movement and transform/CanvasGroup changes; no timeline animation.",
          "proposedAnimation": "Capture continuous native gesture recording; inspect at supported safe areas.",
          "source": {
            "file": "Assets/_Scripts/UI/CustomHUD/CustomHudSettingsObject.cs",
            "line": 45
          },
          "exit": "Controls with Custom enabled",
          "motionStatus": "Source traced \u00b7 Unity recording pending",
          "runtimeVerified": false
        },
        {
          "id": "HUDFLOW02",
          "screenId": "custom-hud-layout-editor",
          "title": "Edit \u2192 reset / discard",
          "steps": [
            "HUD02",
            "HUD04",
            "HUD08",
            "HUD10"
          ],
          "animation": "Immediate ResetToDefault then close/destroy; no unsaved confirmation.",
          "actualAnimation": "Immediate ResetToDefault then close/destroy; no unsaved confirmation.",
          "proposedAnimation": "Optional reset animation should preserve pointer and selection state.",
          "source": {
            "file": "Assets/_Scripts/UI/CustomHUD/CustomHudSettings.cs",
            "line": 30
          },
          "exit": "Controls with prior saved choice",
          "motionStatus": "Source traced \u00b7 Unity recording pending",
          "runtimeVerified": false
        }
      ],
      "exclusions": [
        "Debug page is developer-only, tab inactive in source prefab and nondev debug panel destroyed. Not an ordinary sixth settings category.",
        "MothershipVoiceoverContainerSlider, DisplayMemoryContainerToggle and AntiAliasingContainerToggle are serialized inactive. Do not count them as active ordinary-player states without runtime evidence activating them.",
        "No reachable Report issue/Support/onboarding control found in audited SettingsCanvas/Friends prefab or their controllers. Optional identity entry is active from Gameplay; its3pages are a separate audit.",
        "No per-screen Animator/tween is wired by these controllers. Default Unity selectable states, ScrollRects, timers and pointer-driven HUD editing are actual motion; proposed redesign animation is separate.",
        "Account sync/error states share the visible base settings controls. No saving/offline/error UI should be invented and described as existing.",
        "System microphone/Bluetooth permission alerts are native OS UI and need physical-device recording, not a fabricated Unity screenshot.",
        "Friends service failures and invite races still need live verification; no invite, friend request, kick, leave, save or account write was executed.",
        "Custom HUD drag has no explicit safe-area clamp in CustomHudSettingsObject.OnDrag; account import clamps normalized positions. Redesign must verify full control bounds/touch on each phone."
      ],
      "crossChecks": [
        "Incoming friend popup over open Settings/Friends/HUD",
        "Long names/messages with keyboard and asymmetric safe area",
        "Party role changes while confirmation open",
        "Pending request response after panel closed",
        "Settings account refresh during drag",
        "Exit settings while matchmaking continues",
        "HUD save/default toggles followed by phone-aspect change",
        "Standard versus Arena Exit Hunt outcomes"
      ],
      "entry": "Controls \u2192 Customise UI",
      "outgoing": [
        "controls-settings"
      ]
    },
    "game-modes": {
      "revision": "all-screen-audit-v1",
      "states": [
        {
          "id": "MODE-01",
          "screenId": "game-modes",
          "group": "Game Mode Selection",
          "title": "Mode picker \u2014 settled layout",
          "trigger": "Lobby Game Modes opens panel 102.",
          "result": "Card layout is hidden for one frame while layout is rebuilt, then alpha/input are restored.",
          "exit": "Back returns to MainMenu.",
          "source": {
            "file": "Assets/_Scripts/UI/Lobby/LobbyPanel.cs",
            "line": 59
          },
          "original": "assets/states/MODE01.png",
          "updated": null,
          "checks": [
            "First open",
            "Reopen",
            "One-frame hidden settle",
            "No overlap on short viewport"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "MODE01",
          "captureNote": "Native Unity UI with sample data. This state shares its visual layout with capture MODE01. Async missing-feedback states reuse settled prior screen. Time and attempts are injected samples."
        },
        {
          "id": "MODE-02",
          "screenId": "game-modes",
          "group": "Game Mode Selection",
          "title": "Solo selected",
          "trigger": "No joined two-player party; Solo is selected.",
          "result": "Solo selected root visible; Duo root hidden.",
          "exit": "Choose Duo or a mode.",
          "source": {
            "file": "Assets/_Scripts/UI/Lobby/Shared/LobbySoloDuosToggle.cs",
            "line": 45
          },
          "original": "assets/states/MODE01.png",
          "updated": null,
          "checks": [],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "MODE01",
          "captureNote": "Native Unity UI with sample data. This state shares its visual layout with capture MODE01. Async missing-feedback states reuse settled prior screen. Time and attempts are injected samples."
        },
        {
          "id": "MODE-03",
          "screenId": "game-modes",
          "group": "Game Mode Selection",
          "title": "Duo selected",
          "trigger": "User chooses Duo or joined party contains two or more players.",
          "result": "Duo highlight is visible.",
          "exit": "Solo becomes available again when fewer than two joined users remain.",
          "source": {
            "file": "Assets/_Scripts/UI/Lobby/Shared/LobbySoloDuosToggle.cs",
            "line": 32
          },
          "original": "assets/states/MODE03.png",
          "updated": null,
          "checks": [
            "Party arrival while page open",
            "Party departure",
            "Selected root geometry"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "MODE03",
          "captureNote": "Native Unity UI with sample data. This state shares its visual layout with capture MODE03."
        },
        {
          "id": "MODE-04",
          "screenId": "game-modes",
          "group": "Game Mode Selection",
          "title": "Solo unavailable in joined party",
          "trigger": "At least two lobby users have joined.",
          "result": "Force Duo and disable Solo button.",
          "exit": "Member leaves; solo interactability restores.",
          "source": {
            "file": "Assets/_Scripts/UI/Lobby/Shared/LobbySoloDuosToggle.cs",
            "line": 34
          },
          "original": "assets/states/MODE03.png",
          "updated": null,
          "checks": [
            "Leader and member",
            "Two versus one joined user"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "MODE03",
          "captureNote": "Native Unity UI with sample data. This state shares its visual layout with capture MODE03."
        },
        {
          "id": "MODE-05",
          "screenId": "game-modes",
          "group": "Game Mode Selection",
          "title": "Treasure Rush available",
          "trigger": "Valid rotation/round exists.",
          "result": "Show available Treasure Rush card, hide unavailable card. Round timer reflects live/upcoming data. JoinHuntLobbyUIComponent early-return means its older direct availability code is inactive.",
          "exit": "Selecting mode returns to lobby via helper when a hunt exists.",
          "source": {
            "file": "Assets/_Scripts/ExtractionRoyale/HuntScreenDeterminationSystem.cs",
            "line": 33
          },
          "original": "assets/states/MODE01.png",
          "updated": null,
          "checks": [
            "V2 rotation",
            "Legacy round",
            "Mode changes during page open"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "MODE01",
          "captureNote": "Native Unity UI with sample data. This state shares its visual layout with capture MODE01. Async missing-feedback states reuse settled prior screen. Time and attempts are injected samples."
        },
        {
          "id": "MODE-06",
          "screenId": "game-modes",
          "group": "Game Mode Selection",
          "title": "Treasure Rush unavailable",
          "trigger": "No valid current rotation/round.",
          "result": "Unavailable Treasure Rush card replaces active card.",
          "exit": "Data refresh restores availability; other modes remain selectable.",
          "source": {
            "file": "Assets/_Scripts/ExtractionRoyale/HuntScreenDeterminationSystem.cs",
            "line": 67
          },
          "original": "assets/states/MODE06.png",
          "updated": null,
          "checks": [],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "MODE06",
          "captureNote": "Native Unity UI with sample data. This state shares its visual layout with capture MODE06."
        },
        {
          "id": "MODE-07",
          "screenId": "game-modes",
          "group": "Game Mode Selection",
          "title": "Extraction Royale available",
          "trigger": "Current rotation has extraction_royale, or legacy hunt exists.",
          "result": "Available card and unlocked button; scheduled V2 rotation can be selected but receives no start callback until live.",
          "exit": "Selection returns to lobby when SelectV2HuntMode succeeds.",
          "source": {
            "file": "Assets/_Scripts/ExtractionRoyale/JoinExtractionRoyaleUIComponent.cs",
            "line": 56
          },
          "original": "assets/states/MODE01.png",
          "updated": null,
          "checks": [
            "Scheduled rotation",
            "Live rotation",
            "Rotation disappears during click"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "MODE01",
          "captureNote": "Native Unity UI with sample data. This state shares its visual layout with capture MODE01. Async missing-feedback states reuse settled prior screen. Time and attempts are injected samples."
        },
        {
          "id": "MODE-08",
          "screenId": "game-modes",
          "group": "Game Mode Selection",
          "title": "Extraction Royale locked",
          "trigger": "No Extraction Royale rotation/hunt exists.",
          "result": "Unavailable card/lock; button not interactable.",
          "exit": "Refresh when rotation becomes available.",
          "source": {
            "file": "Assets/_Scripts/ExtractionRoyale/JoinExtractionRoyaleUIComponent.cs",
            "line": 98
          },
          "original": "assets/states/MODE08.png",
          "updated": null,
          "checks": [],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "MODE08",
          "captureNote": "Native Unity UI with sample data. This state shares its visual layout with capture MODE08."
        },
        {
          "id": "MODE-09",
          "screenId": "game-modes",
          "group": "Game Mode Selection",
          "title": "Time Trial \u2014 attempts available",
          "trigger": "Mode picker enabled on same/new UTC day with attempts remaining.",
          "result": "Badge displays N ATTEMPTS REMAINING in has-attempt colour; new UTC day resets local count to three.",
          "exit": "Open race lobby.",
          "source": {
            "file": "Assets/_Scripts/UI/Lobby/HoverboardRacing/JoinHoverboardRacingUIComponent.cs",
            "line": 35
          },
          "original": "assets/states/MODE01.png",
          "updated": null,
          "checks": [
            "1 and 3 attempts",
            "UTC date boundary",
            "No backend-backed assumption"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "MODE01",
          "captureNote": "Native Unity UI with sample data. This state shares its visual layout with capture MODE01. Async missing-feedback states reuse settled prior screen. Time and attempts are injected samples."
        },
        {
          "id": "MODE-10",
          "screenId": "game-modes",
          "group": "Game Mode Selection",
          "title": "Time Trial \u2014 no attempts",
          "trigger": "Local attempts count is zero.",
          "result": "Badge shows 0 ATTEMPTS REMAINING with no-attempt colour; entry itself still opens race screen.",
          "exit": "Open locked race screen or wait for entry re-enable on next UTC day.",
          "source": {
            "file": "Assets/_Scripts/UI/Lobby/HoverboardRacing/JoinHoverboardRacingUIComponent.cs",
            "line": 45
          },
          "original": "assets/states/MODE10.png",
          "updated": null,
          "checks": [],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "MODE10",
          "captureNote": "Native Unity UI with sample data. This state shares its visual layout with capture MODE10."
        },
        {
          "id": "MODE-11",
          "screenId": "game-modes",
          "group": "Game Mode Selection",
          "title": "Mothership available / branch-build hidden",
          "trigger": "Normal build, or development branch build with bundle missing.",
          "result": "Normal card selects Mothership then returns to lobby. DEV_BUILD && BRANCH_BUILD hides entry if assigned bundle catalogue lacks lobby mothership scene.",
          "exit": "Lobby Join executes mothership handoff.",
          "source": {
            "file": "Assets/_Scripts/UI/Lobby/JoinMotherShipUIComponent.cs",
            "line": 29
          },
          "original": "assets/states/MODE11.png",
          "updated": null,
          "checks": [
            "Available",
            "Missing branch bundle",
            "Unready bundle catalogue fails open"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "MODE11",
          "captureNote": "Native Unity UI with sample data. This state shares its visual layout with capture MODE11."
        },
        {
          "id": "MODE-12",
          "screenId": "game-modes",
          "group": "Game Mode Selection",
          "title": "Arena interface loading / unavailable",
          "trigger": "Arena clicked; downloadable UI request is pending, cancelled, faulted or invalid.",
          "result": "Pending initial state is remembered; failure logs an error and clears loading flag, with no dedicated visible failure panel.",
          "exit": "Retry entry after failed load; success shows Opponent choice.",
          "source": {
            "file": "Assets/_Scripts/UI/BattleArena/Lobby/JoinBattleArenaUIComponent.cs",
            "line": 64
          },
          "original": "assets/states/MODE01.png",
          "updated": null,
          "checks": [
            "Repeated click during load",
            "Cancelled request",
            "Missing component"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "MODE01",
          "captureNote": "Native Unity UI with sample data. This state shares its visual layout with capture MODE01. Async missing-feedback states reuse settled prior screen. Time and attempts are injected samples."
        }
      ],
      "flows": [
        {
          "id": "MODE-FLOW-01",
          "screenId": "game-modes",
          "title": "Open and settle mode picker",
          "states": [
            "MODE-01",
            "MODE-02"
          ],
          "steps": [
            "MODE-01",
            "MODE-02"
          ],
          "trigger": "Main lobby Game Modes",
          "result": "Cards visible and interactive after one frame.",
          "source": {
            "file": "Assets/_Scripts/UI/Lobby/LobbyPanel.cs",
            "line": 59
          },
          "motion": "CanvasGroup hidden/rebuild/yield-one-frame/restore. This is visibility gating, not a tween.",
          "recording": null,
          "motionStatus": "Source traced \u00b7 Unity recording pending",
          "runtimeVerified": false
        },
        {
          "id": "MODE-FLOW-02",
          "screenId": "game-modes",
          "title": "Solo / Duo and party lock",
          "states": [
            "MODE-02",
            "MODE-03",
            "MODE-04"
          ],
          "steps": [
            "MODE-02",
            "MODE-03",
            "MODE-04"
          ],
          "trigger": "Select mode size or joined member arrives",
          "result": "Selected highlight moves; Solo disabled for2joined.",
          "source": {
            "file": "Assets/_Scripts/UI/Lobby/Shared/LobbySoloDuosToggle.cs",
            "line": 32
          },
          "motion": "SetActive selection roots; no scripted interpolation.",
          "recording": null,
          "motionStatus": "Source traced \u00b7 Unity recording pending",
          "runtimeVerified": false
        },
        {
          "id": "MODE-FLOW-03",
          "screenId": "game-modes",
          "title": "Training route",
          "states": [
            "MODE-01",
            "TRAIN-01",
            "TRAIN-03",
            "TRAIN-04"
          ],
          "steps": [
            "MODE-01",
            "TRAIN-01",
            "TRAIN-03",
            "TRAIN-04"
          ],
          "trigger": "Select Training, map, then lobby Join",
          "result": "Launch training through global loading.",
          "source": {
            "file": "Assets/_Scripts/UI/Lobby/SelectTrainingHuntUIComponent.cs",
            "line": 100
          },
          "motion": "Panel activation/deactivation; global loading. Retained confirmation excluded.",
          "recording": null,
          "motionStatus": "Source traced \u00b7 Unity recording pending",
          "runtimeVerified": false
        },
        {
          "id": "MODE-FLOW-04",
          "screenId": "game-modes",
          "title": "Arena route",
          "states": [
            "MODE-01",
            "MODE-12",
            "OPP-01"
          ],
          "steps": [
            "MODE-01",
            "MODE-12",
            "OPP-01"
          ],
          "trigger": "Select Battle Arena",
          "result": "Download then opponent page.",
          "source": {
            "file": "Assets/_Scripts/UI/BattleArena/Lobby/JoinBattleArenaUIComponent.cs",
            "line": 64
          },
          "motion": "Async asset load and canvas switch; no invented spinner.",
          "recording": null,
          "motionStatus": "Source traced \u00b7 Unity recording pending",
          "runtimeVerified": false
        },
        {
          "id": "MODE-FLOW-05",
          "screenId": "game-modes",
          "title": "Time Trial route",
          "states": [
            "MODE-09",
            "RACE-01",
            "RACE-04"
          ],
          "steps": [
            "MODE-09",
            "RACE-01",
            "RACE-04"
          ],
          "trigger": "Open Daily Time Trial then Start",
          "result": "Consume local attempt, global loading and race.",
          "source": {
            "file": "Assets/_Scripts/UI/Lobby/HoverboardRacing/JoinHoverboardRacingUIComponent.cs",
            "line": 51
          },
          "motion": "Downloaded canvas activation; prize glimmer; actual loading is global.",
          "recording": null,
          "motionStatus": "Source traced \u00b7 Unity recording pending",
          "runtimeVerified": false
        }
      ],
      "exclusions": [
        "Training launch confirmation retained but inactive: s_confirmDialog.Init is commented out; direct current flow configures main lobby. Do not count retained LaunchTrainingHunt as active.",
        "Arena old embedded matchmade/friend-ready roots: Prefab retains s_matchmadeVisuals/s_opponentReadyRoot fields no longer present on controllers; active transition is separate BattleArenaLobbyLoadingScreen.",
        "Race loading button retained but not enabled by active manager: s_loadingButton is setfalse in Init and nevertrue by this class. Hidden spinner speed-360 is not an active launch state; launch uses global loader.",
        "Hunt/rematch token coordinator is not lobby authority: Dedicated-server pair management and posthunt/rematch UI are beyond current lobby32-page scope; same wager UI reused, but different authority lifecycle.",
        "Native OS camera permission prompts: System iOS/Android permission dialog and actual camera/mirroring cannot be certified by editor fixture. Use no actual identity or camera data during this audit.",
        "Parked tournament pages and in-match race/game HUD: Existing page catalogue excludes inactive tournament entry; current task covers lobby-side pages and their handoffs, not redesign of full game HUD.",
        "Race leaderboard retained but unwired: Leaderboard root inactive; PrizesTab and Leaderboardtab empty persistent calls. LobbyHoverboardRacingUIManager adds only close/start listeners; no active leaderboard switching route found."
      ],
      "crossChecks": [],
      "entry": "See state triggers and transitions below.",
      "outgoing": [
        "main-lobby",
        "training-map-selection",
        "opponent-choice",
        "hoverboard-race-lobby"
      ]
    },
    "training-map-selection": {
      "revision": "all-screen-audit-v1",
      "states": [
        {
          "id": "TRAIN-01",
          "screenId": "training-map-selection",
          "group": "Training map selection",
          "title": "Available training map cards",
          "trigger": "Training mode opens SelectTrainingHunt panel 103.",
          "result": "Map cards use the same selection screen; Mini Island, Megacity, Beach, Desert, Mushroom and Swamp are serialized candidates.",
          "exit": "Back returns directly to MainMenu (serialized SelectPanel argument100); selecting a map also returns to MainMenu.",
          "source": {
            "file": "Assets/_Scripts/UI/Lobby/JoinTrainingHuntsUIComponent.cs",
            "line": 22
          },
          "original": "assets/states/TRAIN01.png",
          "updated": null,
          "checks": [
            "Horizontal scroll",
            "Card text",
            "Long display names",
            "Training Back goes to Main Lobby, not Game Modes"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "TRAIN01",
          "captureNote": "Native Unity UI with sample data. This state shares its visual layout with capture TRAIN01."
        },
        {
          "id": "TRAIN-02",
          "screenId": "training-map-selection",
          "group": "Training map selection",
          "title": "Some maps hidden by bundle availability",
          "trigger": "Development build catalog lacks required bundle(s); release build skipped Megacity download.",
          "result": "Hide unavailable map button; development Megacity remains available; catalogue-not-ready fails open.",
          "exit": "Choose another map; availability is evaluated in Awake.",
          "source": {
            "file": "Assets/_Scripts/UI/Lobby/SelectTrainingHuntUIComponent.cs",
            "line": 29
          },
          "original": "assets/states/TRAIN02.png",
          "updated": null,
          "checks": [
            "Megacity release skipped",
            "Non-Megacity dev bundles missing",
            "Catalogue unavailable",
            "Remaining card reflow"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "TRAIN02",
          "captureNote": "Native Unity UI with sample data. This state shares its visual layout with capture TRAIN02."
        },
        {
          "id": "TRAIN-03",
          "screenId": "training-map-selection",
          "group": "Training map selection",
          "title": "Training selected \u2014 lobby return",
          "trigger": "Available map card clicked.",
          "result": "Return to MainMenu and set TRAINING MODE card/map callback. Confirmation dialog Init call is commented out.",
          "exit": "Main lobby Join starts selected training load; mode picker can replace selection.",
          "source": {
            "file": "Assets/_Scripts/UI/Lobby/SelectTrainingHuntUIComponent.cs",
            "line": 100
          },
          "original": "assets/states/TRAIN03.png",
          "updated": null,
          "checks": [
            "Each available map selection",
            "No stale previously selected map"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "TRAIN03",
          "captureNote": "Native Unity UI with sample data. This state shares its visual layout with capture TRAIN03."
        },
        {
          "id": "TRAIN-04",
          "screenId": "training-map-selection",
          "group": "Training map selection",
          "title": "Training launch loading",
          "trigger": "Main lobby Join invokes LoadTrainingHunt for selected map.",
          "result": "Global loading canvas shows Loading Training Hunt and 10% before scene loading.",
          "exit": "Complete scene load or CancelGame on missing scene info.",
          "source": {
            "file": "Assets/_Scripts/GameManager.cs",
            "line": 1817
          },
          "original": "assets/states/TRAIN04.png",
          "updated": null,
          "checks": [
            "Slow asset load",
            "Cancel/changed gamestate",
            "Map bundle failure"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "TRAIN04",
          "captureNote": "Native Unity UI with sample data. This state shares its visual layout with capture TRAIN04. Native Assets/Resources/LoadingScreenCanvas.prefab and DefaultLoadingBackground; distinct from arena loader."
        },
        {
          "id": "TRAIN-05",
          "screenId": "training-map-selection",
          "group": "Training map selection",
          "title": "Training load error",
          "trigger": "Selected map scene info is missing or load fails.",
          "result": "CancelGame error returns to menu rather than keeping hidden training UI.",
          "exit": "Dismiss error then choose another map/retry.",
          "source": {
            "file": "Assets/_Scripts/GameManager.cs",
            "line": 1846
          },
          "original": "assets/states/TRAIN05.png",
          "updated": null,
          "checks": [
            "Missing scene info",
            "Cancel while load pending"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "TRAIN05",
          "captureNote": "Native Unity UI with sample data. This state shares its visual layout with capture TRAIN05. Original Assets/Prefabs/UI/Old/DialogueBoxCanvas.prefab is actually nested in DoNotDestroy.prefab. CreateDialogueMessage buttonTitle argument is ignored by current implementation, so source button text remains CLOSE. Offline fixture injects display only."
        }
      ],
      "flows": [
        {
          "id": "MODE-FLOW-03",
          "screenId": "game-modes",
          "title": "Training route",
          "states": [
            "MODE-01",
            "TRAIN-01",
            "TRAIN-03",
            "TRAIN-04"
          ],
          "steps": [
            "MODE-01",
            "TRAIN-01",
            "TRAIN-03",
            "TRAIN-04"
          ],
          "trigger": "Select Training, map, then lobby Join",
          "result": "Launch training through global loading.",
          "source": {
            "file": "Assets/_Scripts/UI/Lobby/SelectTrainingHuntUIComponent.cs",
            "line": 100
          },
          "motion": "Panel activation/deactivation; global loading. Retained confirmation excluded.",
          "recording": null,
          "motionStatus": "Source traced \u00b7 Unity recording pending",
          "runtimeVerified": false
        },
        {
          "id": "TRAIN-FLOW-01",
          "screenId": "training-map-selection",
          "title": "Map availability and selection",
          "states": [
            "TRAIN-01",
            "TRAIN-02",
            "TRAIN-03"
          ],
          "steps": [
            "TRAIN-01",
            "TRAIN-02",
            "TRAIN-03"
          ],
          "trigger": "Available map selection",
          "result": "Return main lobby configured for selected training map.",
          "source": {
            "file": "Assets/_Scripts/UI/Lobby/SelectTrainingHuntUIComponent.cs",
            "line": 29
          },
          "motion": "Availability changes active cards; selected map does not animate into confirmation.",
          "recording": null,
          "motionStatus": "Source traced \u00b7 Unity recording pending",
          "runtimeVerified": false
        },
        {
          "id": "TRAIN-FLOW-02",
          "screenId": "training-map-selection",
          "title": "Training load failure",
          "states": [
            "TRAIN-03",
            "TRAIN-04",
            "TRAIN-05"
          ],
          "steps": [
            "TRAIN-03",
            "TRAIN-04",
            "TRAIN-05"
          ],
          "trigger": "Selected training launch fails scene lookup",
          "result": "Error/menu recovery.",
          "source": {
            "file": "Assets/_Scripts/GameManager.cs",
            "line": 1846
          },
          "motion": "Global loading then existing dialogue; no custom training error animation traced.",
          "recording": null,
          "motionStatus": "Source traced \u00b7 Unity recording pending",
          "runtimeVerified": false
        }
      ],
      "exclusions": [
        "Training launch confirmation retained but inactive: s_confirmDialog.Init is commented out; direct current flow configures main lobby. Do not count retained LaunchTrainingHunt as active.",
        "Arena old embedded matchmade/friend-ready roots: Prefab retains s_matchmadeVisuals/s_opponentReadyRoot fields no longer present on controllers; active transition is separate BattleArenaLobbyLoadingScreen.",
        "Race loading button retained but not enabled by active manager: s_loadingButton is setfalse in Init and nevertrue by this class. Hidden spinner speed-360 is not an active launch state; launch uses global loader.",
        "Hunt/rematch token coordinator is not lobby authority: Dedicated-server pair management and posthunt/rematch UI are beyond current lobby32-page scope; same wager UI reused, but different authority lifecycle.",
        "Native OS camera permission prompts: System iOS/Android permission dialog and actual camera/mirroring cannot be certified by editor fixture. Use no actual identity or camera data during this audit.",
        "Parked tournament pages and in-match race/game HUD: Existing page catalogue excludes inactive tournament entry; current task covers lobby-side pages and their handoffs, not redesign of full game HUD.",
        "Race leaderboard retained but unwired: Leaderboard root inactive; PrizesTab and Leaderboardtab empty persistent calls. LobbyHoverboardRacingUIManager adds only close/start listeners; no active leaderboard switching route found."
      ],
      "crossChecks": [],
      "entry": "See state triggers and transitions below.",
      "outgoing": [
        "game-modes",
        "main-lobby"
      ]
    },
    "opponent-choice": {
      "revision": "all-screen-audit-v1",
      "states": [
        {
          "id": "OPP-01",
          "screenId": "opponent-choice",
          "group": "Opponent choice",
          "title": "Choose friend or random",
          "trigger": "Arena canvas download succeeded and enters SelectingOpponent.",
          "result": "MainPage active; parent lobby canvas disabled; podium cameras disabled.",
          "exit": "Friend opens friend list; Random starts search; Back closes Arena.",
          "source": {
            "file": "Assets/_Scripts/UI/BattleArena/Lobby/BattleArena_SelectingOpponentState.cs",
            "line": 15
          },
          "original": "assets/states/OPP01.png",
          "updated": null,
          "checks": [
            "Main lobby does not draw underneath",
            "Return restores previous lobby canvas"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "OPP01",
          "captureNote": "Native Unity UI with sample data. This state shares its visual layout with capture OPP01."
        },
        {
          "id": "OPP-02",
          "screenId": "opponent-choice",
          "group": "Opponent choice",
          "title": "Arena open request pending",
          "trigger": "Arena downloadable UI is loading.",
          "result": "No second instance; requested initial state may replace earlier request.",
          "exit": "Load completes to requested state or fails back to prior view.",
          "source": {
            "file": "Assets/_Scripts/UI/BattleArena/Lobby/JoinBattleArenaUIComponent.cs",
            "line": 47
          },
          "original": "assets/states/MODE01.png",
          "updated": null,
          "checks": [],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "MODE01",
          "captureNote": "Native Unity UI with sample data. This state shares its visual layout with capture MODE01. Async missing-feedback states reuse settled prior screen. Time and attempts are injected samples."
        },
        {
          "id": "OPP-03",
          "screenId": "opponent-choice",
          "group": "Opponent choice",
          "title": "Arena UI load failed",
          "trigger": "DCDM request faulted/cancelled/missing prefab/component.",
          "result": "Log error, reset guard, allow another entry attempt; no explicit visual error page implemented.",
          "exit": "Try opening Arena again.",
          "source": {
            "file": "Assets/_Scripts/UI/BattleArena/Lobby/JoinBattleArenaUIComponent.cs",
            "line": 84
          },
          "original": "assets/states/MODE01.png",
          "updated": null,
          "checks": [],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "MODE01",
          "captureNote": "Native Unity UI with sample data. This state shares its visual layout with capture MODE01. Async missing-feedback states reuse settled prior screen. Time and attempts are injected samples."
        },
        {
          "id": "OPP-04",
          "screenId": "opponent-choice",
          "group": "Opponent choice",
          "title": "Exit arena \u2014 lobby restored",
          "trigger": "Arena UI disabled/closed.",
          "result": "Restore prior lobby canvas, despawn podium, cancel matchmaker and refresh Photon lobby session.",
          "exit": "Main lobby.",
          "source": {
            "file": "Assets/_Scripts/UI/BattleArena/Lobby/BattleArenaLobbyUIManager.cs",
            "line": 75
          },
          "original": "assets/states/LOBBYRETURN.png",
          "updated": null,
          "checks": [],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "LOBBYRETURN",
          "captureNote": "Native Unity UI with sample data. This state shares its visual layout with capture LOBBYRETURN. Exit/revocation/failure restores previous screen; original lobby sample."
        },
        {
          "id": "OPP-05",
          "screenId": "opponent-choice",
          "group": "Opponent choice",
          "title": "Arena challenge invitation received",
          "trigger": "Incoming battle_arena lobby invite passes filters and loading prefab preload completes or times out20s.",
          "result": "Show inviter name/avatar, Accept/Reject and120s dismissal countdown. Pending invites queue; missing avatar does not block invitation.",
          "exit": "Accept transitions immediately; Reject or120s expiry sends rejection and shows next queued invite.",
          "source": {
            "file": "Assets/_Scripts/Friends/UI/BattleArenaInviteReceivedPopup.cs",
            "line": 110
          },
          "original": "assets/states/OPP05.png",
          "updated": null,
          "checks": [
            "120/1/0 seconds",
            "Multiple queued invites",
            "Avatar missing",
            "Preload delayed20s"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "OPP05",
          "captureNote": "Native Unity UI with sample data. This state shares its visual layout with capture OPP05. Prefab has countdown fill but no serialized TMP timer field; do not invent timer. Normally reparents to TopOverlayCanvas; isolate ancestors so Friends page does not leak underneath."
        },
        {
          "id": "OPP-06",
          "screenId": "opponent-choice",
          "group": "Opponent choice",
          "title": "Invitation revoked / rejected / expired",
          "trigger": "Invitation removed from current list, user rejects, or120s timeout.",
          "result": "Hide current popup; remove stale pending invites; show next valid invite; unload preloaded arena loader when no pending invite remains.",
          "exit": "Return previous lobby screen or next invite.",
          "source": {
            "file": "Assets/_Scripts/Friends/UI/BattleArenaInviteReceivedPopup.cs",
            "line": 73
          },
          "original": "assets/states/LOBBYRETURN.png",
          "updated": null,
          "checks": [
            "Revoked while preload waiting",
            "Reject",
            "Timer expiry"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "LOBBYRETURN",
          "captureNote": "Native Unity UI with sample data. This state shares its visual layout with capture LOBBYRETURN. Exit/revocation/failure restores previous screen; original lobby sample."
        },
        {
          "id": "OPP-07",
          "screenId": "opponent-choice",
          "group": "Opponent choice",
          "title": "Accepted invitation \u2014 join and open wager",
          "trigger": "User accepts invitation.",
          "result": "Show friend transition immediately; accept API, join lobby session (retry failure every2s, wait up to20s), request SetXToken directly rather than Opponent choice.",
          "exit": "Token setup if Arena UI appears; missing UI path hides loader and resumes invite queue.",
          "source": {
            "file": "Assets/_Scripts/Friends/UI/BattleArenaInviteReceivedPopup.cs",
            "line": 152
          },
          "original": "assets/states/CHAL07.png",
          "updated": null,
          "checks": [
            "Slow API",
            "Session retry",
            "SetXToken direct entry"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "CHAL07",
          "captureNote": "Native Unity UI with sample data. This state shares its visual layout with capture CHAL07. Native loading prefab; its original bottom progress labels are very small at 1280\u00d7720. Preserve this finding for redesign."
        },
        {
          "id": "OPP-08",
          "screenId": "opponent-choice",
          "group": "Opponent choice",
          "title": "Accepted invite failed / UI timeout",
          "trigger": "Accept API fails, Arena component missing or Arena UI missing for20s.",
          "result": "Hide loader, clear loading guard, resume queued invitations; no dedicated invitation error dialog in these branches.",
          "exit": "Previous screen; another valid queued invite may show.",
          "source": {
            "file": "Assets/_Scripts/Friends/UI/BattleArenaInviteReceivedPopup.cs",
            "line": 195
          },
          "original": "assets/states/LOBBYRETURN.png",
          "updated": null,
          "checks": [
            "Accept API failure",
            "Missing entry component",
            "UI open20s timeout"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "LOBBYRETURN",
          "captureNote": "Native Unity UI with sample data. This state shares its visual layout with capture LOBBYRETURN. Exit/revocation/failure restores previous screen; original lobby sample."
        }
      ],
      "flows": [
        {
          "id": "MODE-FLOW-04",
          "screenId": "game-modes",
          "title": "Arena route",
          "states": [
            "MODE-01",
            "MODE-12",
            "OPP-01"
          ],
          "steps": [
            "MODE-01",
            "MODE-12",
            "OPP-01"
          ],
          "trigger": "Select Battle Arena",
          "result": "Download then opponent page.",
          "source": {
            "file": "Assets/_Scripts/UI/BattleArena/Lobby/JoinBattleArenaUIComponent.cs",
            "line": 64
          },
          "motion": "Async asset load and canvas switch; no invented spinner.",
          "recording": null,
          "motionStatus": "Source traced \u00b7 Unity recording pending",
          "runtimeVerified": false
        },
        {
          "id": "OPP-FLOW-01",
          "screenId": "opponent-choice",
          "title": "Choose opponent route",
          "states": [
            "OPP-01",
            "CHAL-01"
          ],
          "steps": [
            "OPP-01",
            "CHAL-01"
          ],
          "trigger": "Friend choice",
          "result": "Friend list page.",
          "source": {
            "file": "Assets/_Scripts/UI/BattleArena/Lobby/BattleArena_SelectingOpponentState.cs",
            "line": 32
          },
          "motion": "SetActive state roots.",
          "recording": null,
          "motionStatus": "Source traced \u00b7 Unity recording pending",
          "runtimeVerified": false
        },
        {
          "id": "OPP-FLOW-02",
          "screenId": "opponent-choice",
          "title": "Choose random route",
          "states": [
            "OPP-01",
            "RANDOM-01"
          ],
          "steps": [
            "OPP-01",
            "RANDOM-01"
          ],
          "trigger": "Random choice",
          "result": "Automatic search.",
          "source": {
            "file": "Assets/_Scripts/UI/BattleArena/Lobby/BattleArena_SelectingOpponentState.cs",
            "line": 37
          },
          "motion": "SetActive state roots then spinning search icon.",
          "recording": null,
          "motionStatus": "Source traced \u00b7 Unity recording pending",
          "runtimeVerified": false
        },
        {
          "id": "CHAL-FLOW-03",
          "screenId": "choose-a-friend-to-challenge",
          "title": "Back and invitation cleanup",
          "states": [
            "CHAL-06",
            "CHAL-08",
            "OPP-01"
          ],
          "steps": [
            "CHAL-06",
            "CHAL-08",
            "OPP-01"
          ],
          "trigger": "Back while invite pending",
          "result": "Cancel only local outgoing pending invites; incoming unaffected.",
          "source": {
            "file": "Assets/_Scripts/UI/BattleArena/Lobby/BattleArena_SelectingFriendState.cs",
            "line": 237
          },
          "motion": "Immediate root switch and loader hide; network cleanup separate.",
          "recording": null,
          "motionStatus": "Source traced \u00b7 Unity recording pending",
          "runtimeVerified": false
        },
        {
          "id": "RANDOM-FLOW-03",
          "screenId": "random-opponent-search",
          "title": "Readiness timeout or cancellation",
          "states": [
            "RANDOM-03",
            "RANDOM-05",
            "RANDOM-06",
            "OPP-01"
          ],
          "steps": [
            "RANDOM-03",
            "RANDOM-05",
            "RANDOM-06",
            "OPP-01"
          ],
          "trigger": "No controllers20s or Back",
          "result": "Failure recovery or opponent choice.",
          "source": {
            "file": "Assets/_Scripts/UI/BattleArena/Lobby/BattleArena_SelectingRandomState.cs",
            "line": 66
          },
          "motion": "Existing modal and immediate state switching.",
          "recording": null,
          "motionStatus": "Source traced \u00b7 Unity recording pending",
          "runtimeVerified": false
        },
        {
          "id": "TOKEN-FLOW-03",
          "screenId": "set-x-token-amount-challenge-setup",
          "title": "Opponent left and return",
          "states": [
            "TOKEN-03",
            "TOKEN-10",
            "OPP-01"
          ],
          "steps": [
            "TOKEN-03",
            "TOKEN-10",
            "OPP-01"
          ],
          "trigger": "Opponent absent5s or initialization timeout20s",
          "result": "OK returns opponent choice.",
          "source": {
            "file": "Assets/_Scripts/UI/BattleArena/BattleArenaSetXtokenUI.cs",
            "line": 662
          },
          "motion": "Wager update disabled; error modal displayed; cleanup destroys countdown.",
          "recording": null,
          "motionStatus": "Source traced \u00b7 Unity recording pending",
          "runtimeVerified": false
        },
        {
          "id": "OPP-FLOW-03",
          "screenId": "opponent-choice",
          "title": "Incoming Arena invitation: accept, reject, timeout",
          "states": [
            "OPP-05",
            "OPP-06",
            "OPP-07",
            "OPP-08",
            "TOKEN-01",
            "TOKEN-03"
          ],
          "steps": [
            "OPP-05",
            "OPP-06",
            "OPP-07",
            "OPP-08",
            "TOKEN-01",
            "TOKEN-03"
          ],
          "trigger": "Incoming Arena invitation",
          "result": "Accept skips directly to wager after friend transition; decline/revoke/expiry returns prior UI or next invitation. Failure hides loader.",
          "source": {
            "file": "Assets/_Scripts/Friends/UI/BattleArenaInviteReceivedPopup.cs",
            "line": 110
          },
          "motion": "Dismiss fill shrinks every frame over120s; integer remaining seconds updates when changed. Accepted friend banner1s then loader.",
          "recording": null,
          "motionStatus": "Source traced \u00b7 Unity recording pending",
          "runtimeVerified": false
        }
      ],
      "exclusions": [
        "Training launch confirmation retained but inactive: s_confirmDialog.Init is commented out; direct current flow configures main lobby. Do not count retained LaunchTrainingHunt as active.",
        "Arena old embedded matchmade/friend-ready roots: Prefab retains s_matchmadeVisuals/s_opponentReadyRoot fields no longer present on controllers; active transition is separate BattleArenaLobbyLoadingScreen.",
        "Race loading button retained but not enabled by active manager: s_loadingButton is setfalse in Init and nevertrue by this class. Hidden spinner speed-360 is not an active launch state; launch uses global loader.",
        "Hunt/rematch token coordinator is not lobby authority: Dedicated-server pair management and posthunt/rematch UI are beyond current lobby32-page scope; same wager UI reused, but different authority lifecycle.",
        "Native OS camera permission prompts: System iOS/Android permission dialog and actual camera/mirroring cannot be certified by editor fixture. Use no actual identity or camera data during this audit.",
        "Parked tournament pages and in-match race/game HUD: Existing page catalogue excludes inactive tournament entry; current task covers lobby-side pages and their handoffs, not redesign of full game HUD.",
        "Race leaderboard retained but unwired: Leaderboard root inactive; PrizesTab and Leaderboardtab empty persistent calls. LobbyHoverboardRacingUIManager adds only close/start listeners; no active leaderboard switching route found."
      ],
      "crossChecks": [],
      "entry": "See state triggers and transitions below.",
      "outgoing": [
        "game-modes",
        "choose-a-friend-to-challenge",
        "random-opponent-search"
      ]
    },
    "choose-a-friend-to-challenge": {
      "revision": "all-screen-audit-v1",
      "states": [
        {
          "id": "CHAL-01",
          "screenId": "choose-a-friend-to-challenge",
          "group": "Choose a friend to challenge",
          "title": "Friends loading",
          "trigger": "Select Friend on opponent page.",
          "result": "Friend rows cleared; fetch list; no dedicated loading indicator added by controller.",
          "exit": "Successful fetch populates; failure falls back to cached FriendManager.Friends.",
          "source": {
            "file": "Assets/_Scripts/UI/BattleArena/Lobby/BattleArena_SelectingFriendState.cs",
            "line": 30
          },
          "original": "assets/states/CHAL01.png",
          "updated": null,
          "checks": [
            "Slow fetch",
            "Missing FriendManager",
            "Exit before response"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "CHAL01",
          "captureNote": "Native Unity UI with sample data. This state shares its visual layout with capture CHAL01. Loading, empty friends and no matches share blank list; no source empty label/spinner."
        },
        {
          "id": "CHAL-02",
          "screenId": "choose-a-friend-to-challenge",
          "group": "Choose a friend to challenge",
          "title": "Friend list populated",
          "trigger": "Current or cached friend list is available.",
          "result": "Pooled friend rows show name/avatar/status; empty search shows all non-null friends.",
          "exit": "Search, invite or Back.",
          "source": {
            "file": "Assets/_Scripts/UI/BattleArena/Lobby/BattleArena_SelectingFriendState.cs",
            "line": 118
          },
          "original": "assets/states/CHAL02.png",
          "updated": null,
          "checks": [
            "Long names",
            "Many rows",
            "Missing avatar",
            "Cached-list recovery"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "CHAL02",
          "captureNote": "Native Unity UI with sample data. This state shares its visual layout with capture CHAL02."
        },
        {
          "id": "CHAL-03",
          "screenId": "choose-a-friend-to-challenge",
          "group": "Choose a friend to challenge",
          "title": "Search matching friends",
          "trigger": "Search text changes.",
          "result": "Trimmed case-insensitive substring filter rebuilds rows and resets scroll to top.",
          "exit": "Clear search to restore rows.",
          "source": {
            "file": "Assets/_Scripts/UI/BattleArena/Lobby/BattleArena_SelectingFriendState.cs",
            "line": 139
          },
          "original": "assets/states/CHAL03.png",
          "updated": null,
          "checks": [
            "Case variants",
            "Whitespace",
            "Partial names"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "CHAL03",
          "captureNote": "Native Unity UI with sample data. This state shares its visual layout with capture CHAL03."
        },
        {
          "id": "CHAL-04",
          "screenId": "choose-a-friend-to-challenge",
          "group": "Choose a friend to challenge",
          "title": "Empty list / no search results",
          "trigger": "No friends or no username matches.",
          "result": "No rows; controller has no separate empty-state label.",
          "exit": "Clear search, return or refresh list.",
          "source": {
            "file": "Assets/_Scripts/UI/BattleArena/Lobby/BattleArena_SelectingFriendState.cs",
            "line": 271
          },
          "original": "assets/states/CHAL01.png",
          "updated": null,
          "checks": [
            "No friends",
            "No matches",
            "Null usernames"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "CHAL01",
          "captureNote": "Native Unity UI with sample data. This state shares its visual layout with capture CHAL01. Loading, empty friends and no matches share blank list; no source empty label/spinner."
        },
        {
          "id": "CHAL-05",
          "screenId": "choose-a-friend-to-challenge",
          "group": "Choose a friend to challenge",
          "title": "Invite available",
          "trigger": "Local player is leader, friend not already in Arena lobby, fewer than two users.",
          "result": "Invite button shown. Friend status currently does not gate invite.",
          "exit": "Invite sends create/invite request and immediately hides button.",
          "source": {
            "file": "Assets/_Scripts/UI/BattleArena/Lobby/BattleArenaFriendUIItem.cs",
            "line": 74
          },
          "original": "assets/states/CHAL02.png",
          "updated": null,
          "checks": [
            "Offline friend still eligible in source",
            "No lobby",
            "One-person lobby"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "CHAL02",
          "captureNote": "Native Unity UI with sample data. This state shares its visual layout with capture CHAL02."
        },
        {
          "id": "CHAL-06",
          "screenId": "choose-a-friend-to-challenge",
          "group": "Choose a friend to challenge",
          "title": "Invited / joined / not leader / lobby full",
          "trigger": "Invitation sent, friend already included, caller not leader, or lobby already has two users.",
          "result": "Invite action hidden; current code does not show a separate sent confirmation here.",
          "exit": "Lobby refresh can restore action; Back cancels local outgoing pending invitations.",
          "source": {
            "file": "Assets/_Scripts/UI/BattleArena/Lobby/BattleArenaFriendUIItem.cs",
            "line": 91
          },
          "original": "assets/states/CHAL06.png",
          "updated": null,
          "checks": [
            "Invite request failure refresh",
            "Invitation rejected",
            "Already joined",
            "Non-leader"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "CHAL06",
          "captureNote": "Native Unity UI with sample data. This state shares its visual layout with capture CHAL06."
        },
        {
          "id": "CHAL-07",
          "screenId": "choose-a-friend-to-challenge",
          "group": "Choose a friend to challenge",
          "title": "Friend accepted \u2014 challenge transition",
          "trigger": "Current Arena invitation owner receives other user joined.",
          "result": "Friend challenge screen covers session switch, then Connecting To Opponent loader; wait for transition and Photon join callback before token setup.",
          "exit": "Token setup when join callback/transition finish; exit cancels coroutine.",
          "source": {
            "file": "Assets/_Scripts/UI/BattleArena/Lobby/BattleArena_SelectingFriendState.cs",
            "line": 177
          },
          "original": "assets/states/CHAL07.png",
          "updated": null,
          "checks": [
            "Slow join",
            "Back during transition",
            "Join callback failure (current flow still continues)"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "CHAL07",
          "captureNote": "Native Unity UI with sample data. This state shares its visual layout with capture CHAL07. Native loading prefab; its original bottom progress labels are very small at 1280\u00d7720. Preserve this finding for redesign."
        },
        {
          "id": "CHAL-08",
          "screenId": "choose-a-friend-to-challenge",
          "group": "Choose a friend to challenge",
          "title": "Back \u2014 outgoing invite cancellation",
          "trigger": "Back pressed or state exits.",
          "result": "Return Opponent choice; stop readiness coroutine; cancel only local-owner pending outgoing battle invites, preserve incoming invites.",
          "exit": "Opponent choice.",
          "source": {
            "file": "Assets/_Scripts/UI/BattleArena/Lobby/BattleArena_SelectingFriendState.cs",
            "line": 237
          },
          "original": "assets/states/OPP01.png",
          "updated": null,
          "checks": [],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "OPP01",
          "captureNote": "Native Unity UI with sample data. This state shares its visual layout with capture OPP01."
        }
      ],
      "flows": [
        {
          "id": "OPP-FLOW-01",
          "screenId": "opponent-choice",
          "title": "Choose opponent route",
          "states": [
            "OPP-01",
            "CHAL-01"
          ],
          "steps": [
            "OPP-01",
            "CHAL-01"
          ],
          "trigger": "Friend choice",
          "result": "Friend list page.",
          "source": {
            "file": "Assets/_Scripts/UI/BattleArena/Lobby/BattleArena_SelectingOpponentState.cs",
            "line": 32
          },
          "motion": "SetActive state roots.",
          "recording": null,
          "motionStatus": "Source traced \u00b7 Unity recording pending",
          "runtimeVerified": false
        },
        {
          "id": "CHAL-FLOW-01",
          "screenId": "choose-a-friend-to-challenge",
          "title": "Search and invite friend",
          "states": [
            "CHAL-01",
            "CHAL-02",
            "CHAL-03",
            "CHAL-05",
            "CHAL-06"
          ],
          "steps": [
            "CHAL-01",
            "CHAL-02",
            "CHAL-03",
            "CHAL-05",
            "CHAL-06"
          ],
          "trigger": "Friend list/filter/invite",
          "result": "Invitation hides Invite until lobby refresh.",
          "source": {
            "file": "Assets/_Scripts/UI/BattleArena/Lobby/BattleArena_SelectingFriendState.cs",
            "line": 139
          },
          "motion": "Pooled rows, immediate visibility changes; no row entrance tween traced.",
          "recording": null,
          "motionStatus": "Source traced \u00b7 Unity recording pending",
          "runtimeVerified": false
        },
        {
          "id": "CHAL-FLOW-02",
          "screenId": "choose-a-friend-to-challenge",
          "title": "Accepted friend transition",
          "states": [
            "CHAL-06",
            "CHAL-07",
            "RANDOM-03",
            "TOKEN-01",
            "TOKEN-03"
          ],
          "steps": [
            "CHAL-06",
            "CHAL-07",
            "RANDOM-03",
            "TOKEN-01",
            "TOKEN-03"
          ],
          "trigger": "Friend accepts invitation",
          "result": "One-second friend transition, connection loader, podium reveal.",
          "source": {
            "file": "Assets/_Scripts/UI/BattleArena/Lobby/BattleArena_SelectingFriendState.cs",
            "line": 177
          },
          "motion": "FriendsChallenge root for1s; load5/50/80; two-second character dissolve cover before hide.",
          "recording": null,
          "motionStatus": "Source traced \u00b7 Unity recording pending",
          "runtimeVerified": false
        },
        {
          "id": "CHAL-FLOW-03",
          "screenId": "choose-a-friend-to-challenge",
          "title": "Back and invitation cleanup",
          "states": [
            "CHAL-06",
            "CHAL-08",
            "OPP-01"
          ],
          "steps": [
            "CHAL-06",
            "CHAL-08",
            "OPP-01"
          ],
          "trigger": "Back while invite pending",
          "result": "Cancel only local outgoing pending invites; incoming unaffected.",
          "source": {
            "file": "Assets/_Scripts/UI/BattleArena/Lobby/BattleArena_SelectingFriendState.cs",
            "line": 237
          },
          "motion": "Immediate root switch and loader hide; network cleanup separate.",
          "recording": null,
          "motionStatus": "Source traced \u00b7 Unity recording pending",
          "runtimeVerified": false
        }
      ],
      "exclusions": [
        "Training launch confirmation retained but inactive: s_confirmDialog.Init is commented out; direct current flow configures main lobby. Do not count retained LaunchTrainingHunt as active.",
        "Arena old embedded matchmade/friend-ready roots: Prefab retains s_matchmadeVisuals/s_opponentReadyRoot fields no longer present on controllers; active transition is separate BattleArenaLobbyLoadingScreen.",
        "Race loading button retained but not enabled by active manager: s_loadingButton is setfalse in Init and nevertrue by this class. Hidden spinner speed-360 is not an active launch state; launch uses global loader.",
        "Hunt/rematch token coordinator is not lobby authority: Dedicated-server pair management and posthunt/rematch UI are beyond current lobby32-page scope; same wager UI reused, but different authority lifecycle.",
        "Native OS camera permission prompts: System iOS/Android permission dialog and actual camera/mirroring cannot be certified by editor fixture. Use no actual identity or camera data during this audit.",
        "Parked tournament pages and in-match race/game HUD: Existing page catalogue excludes inactive tournament entry; current task covers lobby-side pages and their handoffs, not redesign of full game HUD.",
        "Race leaderboard retained but unwired: Leaderboard root inactive; PrizesTab and Leaderboardtab empty persistent calls. LobbyHoverboardRacingUIManager adds only close/start listeners; no active leaderboard switching route found."
      ],
      "crossChecks": [],
      "entry": "See state triggers and transitions below.",
      "outgoing": [
        "opponent-choice",
        "set-x-token-amount-challenge-setup"
      ]
    },
    "random-opponent-search": {
      "revision": "all-screen-audit-v1",
      "states": [
        {
          "id": "RANDOM-01",
          "screenId": "random-opponent-search",
          "group": "Random opponent search",
          "title": "Searching for random opponent",
          "trigger": "Enter SelectingRandom.",
          "result": "Automatically ensures Photon lobby session and starts matchmaking; challenging visuals active.",
          "exit": "Back cancels; success transitions to connection loading; failure shows Retry/Back.",
          "source": {
            "file": "Assets/_Scripts/UI/BattleArena/Lobby/BattleArena_SelectingRandomState.cs",
            "line": 33
          },
          "original": "assets/states/RANDOM01.png",
          "updated": null,
          "checks": [
            "One request per entry",
            "Repeated Back",
            "Spinner remains responsive"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "RANDOM01",
          "captureNote": "Native Unity UI with sample data. This state shares its visual layout with capture RANDOM01."
        },
        {
          "id": "RANDOM-02",
          "screenId": "random-opponent-search",
          "group": "Random opponent search",
          "title": "Random opponent found \u2014 transition",
          "trigger": "Matchmaker returns session.",
          "result": "Show RandomChallenge transition before joining new session to cover player despawn.",
          "exit": "After transition, connecting progress then token selection.",
          "source": {
            "file": "Assets/_Scripts/UI/BattleArena/Lobby/BattleArena_SelectingRandomState.cs",
            "line": 213
          },
          "original": "assets/states/RANDOM02.png",
          "updated": null,
          "checks": [],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "RANDOM02",
          "captureNote": "Native Unity UI with sample data. This state shares its visual layout with capture RANDOM02. Native loading prefab; its original bottom progress labels are very small at 1280\u00d7720. Preserve this finding for redesign."
        },
        {
          "id": "RANDOM-03",
          "screenId": "random-opponent-search",
          "group": "Random opponent search",
          "title": "Connecting to opponent",
          "trigger": "Arena session is joining or matched players not yet ready.",
          "result": "Loading progress uses 5% shown, 50% local controller ready, 80% opponent controller ready.",
          "exit": "Ready controllers and finished transition enter token selection.",
          "source": {
            "file": "Assets/_Scripts/UI/BattleArena/Lobby/BattleArenaLobbyLoadingScreenManager.cs",
            "line": 255
          },
          "original": "assets/states/CONNECT50.png",
          "updated": null,
          "checks": [
            "5/50/80 percent",
            "Local only",
            "Both ready"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "CONNECT50",
          "captureNote": "Native Unity UI with sample data. This state shares its visual layout with capture CONNECT50. Native loading prefab; its original bottom progress labels are very small at 1280\u00d7720. Preserve this finding for redesign."
        },
        {
          "id": "RANDOM-04",
          "screenId": "random-opponent-search",
          "group": "Random opponent search",
          "title": "No opponent / failed join",
          "trigger": "Matchmaking or session join fails.",
          "result": "Hide search visuals/loader and show FailedToFindOpponentDialog with Retry and Back.",
          "exit": "Retry starts search; Back closes Arena via dialog.",
          "source": {
            "file": "Assets/_Scripts/UI/BattleArena/Lobby/BattleArena_SelectingRandomState.cs",
            "line": 193
          },
          "original": "assets/states/RANDOM04.png",
          "updated": null,
          "checks": [
            "Matchmaking failure",
            "Join failure",
            "Retry native listener disabled in fixture"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "RANDOM04",
          "captureNote": "Native Unity UI with sample data. This state shares its visual layout with capture RANDOM04."
        },
        {
          "id": "RANDOM-05",
          "screenId": "random-opponent-search",
          "group": "Random opponent search",
          "title": "Matched-player readiness timeout",
          "trigger": "After matchmade, required player controllers not ready for 20 seconds.",
          "result": "Same failure dialog; no indefinite loading after timer expires.",
          "exit": "Retry search or Back.",
          "source": {
            "file": "Assets/_Scripts/UI/BattleArena/Lobby/BattleArena_SelectingRandomState.cs",
            "line": 66
          },
          "original": "assets/states/RANDOM04.png",
          "updated": null,
          "checks": [
            "Exactly20 seconds",
            "Readiness on same frame as timeout"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "RANDOM04",
          "captureNote": "Native Unity UI with sample data. This state shares its visual layout with capture RANDOM04."
        },
        {
          "id": "RANDOM-06",
          "screenId": "random-opponent-search",
          "group": "Random opponent search",
          "title": "Search cancelled",
          "trigger": "Back pressed during random search.",
          "result": "Cancel PlayFab matchmaking and return SelectingOpponent; exit hides loader unless handing to token state.",
          "exit": "Opponent choice or start search again.",
          "source": {
            "file": "Assets/_Scripts/UI/BattleArena/Lobby/BattleArena_SelectingRandomState.cs",
            "line": 164
          },
          "original": "assets/states/OPP01.png",
          "updated": null,
          "checks": [],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "OPP01",
          "captureNote": "Native Unity UI with sample data. This state shares its visual layout with capture OPP01."
        }
      ],
      "flows": [
        {
          "id": "OPP-FLOW-02",
          "screenId": "opponent-choice",
          "title": "Choose random route",
          "states": [
            "OPP-01",
            "RANDOM-01"
          ],
          "steps": [
            "OPP-01",
            "RANDOM-01"
          ],
          "trigger": "Random choice",
          "result": "Automatic search.",
          "source": {
            "file": "Assets/_Scripts/UI/BattleArena/Lobby/BattleArena_SelectingOpponentState.cs",
            "line": 37
          },
          "motion": "SetActive state roots then spinning search icon.",
          "recording": null,
          "motionStatus": "Source traced \u00b7 Unity recording pending",
          "runtimeVerified": false
        },
        {
          "id": "CHAL-FLOW-02",
          "screenId": "choose-a-friend-to-challenge",
          "title": "Accepted friend transition",
          "states": [
            "CHAL-06",
            "CHAL-07",
            "RANDOM-03",
            "TOKEN-01",
            "TOKEN-03"
          ],
          "steps": [
            "CHAL-06",
            "CHAL-07",
            "RANDOM-03",
            "TOKEN-01",
            "TOKEN-03"
          ],
          "trigger": "Friend accepts invitation",
          "result": "One-second friend transition, connection loader, podium reveal.",
          "source": {
            "file": "Assets/_Scripts/UI/BattleArena/Lobby/BattleArena_SelectingFriendState.cs",
            "line": 177
          },
          "motion": "FriendsChallenge root for1s; load5/50/80; two-second character dissolve cover before hide.",
          "recording": null,
          "motionStatus": "Source traced \u00b7 Unity recording pending",
          "runtimeVerified": false
        },
        {
          "id": "RANDOM-FLOW-01",
          "screenId": "random-opponent-search",
          "title": "Find and connect opponent",
          "states": [
            "RANDOM-01",
            "RANDOM-02",
            "RANDOM-03",
            "TOKEN-01",
            "TOKEN-03"
          ],
          "steps": [
            "RANDOM-01",
            "RANDOM-02",
            "RANDOM-03",
            "TOKEN-01",
            "TOKEN-03"
          ],
          "trigger": "Successful random matchmaking",
          "result": "Token setup after both controllers ready.",
          "source": {
            "file": "Assets/_Scripts/UI/BattleArena/Lobby/BattleArena_SelectingRandomState.cs",
            "line": 213
          },
          "motion": "Search spinner -200deg/s; RandomChallenge root1s then connection loader, podium dissolve cover.",
          "recording": null,
          "motionStatus": "Source traced \u00b7 Unity recording pending",
          "runtimeVerified": false
        },
        {
          "id": "RANDOM-FLOW-02",
          "screenId": "random-opponent-search",
          "title": "Failure and retry",
          "states": [
            "RANDOM-01",
            "RANDOM-04",
            "RANDOM-01"
          ],
          "steps": [
            "RANDOM-01",
            "RANDOM-04",
            "RANDOM-01"
          ],
          "trigger": "Matchmaker/session failure; Retry",
          "result": "Restart search; Back closes Arena.",
          "source": {
            "file": "Assets/_Scripts/UI/BattleArena/Lobby/BattleArena_SelectingRandomState.cs",
            "line": 193
          },
          "motion": "Search visuals hide; existing modal shown. Retry button also has source LeaveLobbyComponent, requires live wiring review.",
          "recording": null,
          "motionStatus": "Source traced \u00b7 Unity recording pending",
          "runtimeVerified": false
        },
        {
          "id": "RANDOM-FLOW-03",
          "screenId": "random-opponent-search",
          "title": "Readiness timeout or cancellation",
          "states": [
            "RANDOM-03",
            "RANDOM-05",
            "RANDOM-06",
            "OPP-01"
          ],
          "steps": [
            "RANDOM-03",
            "RANDOM-05",
            "RANDOM-06",
            "OPP-01"
          ],
          "trigger": "No controllers20s or Back",
          "result": "Failure recovery or opponent choice.",
          "source": {
            "file": "Assets/_Scripts/UI/BattleArena/Lobby/BattleArena_SelectingRandomState.cs",
            "line": 66
          },
          "motion": "Existing modal and immediate state switching.",
          "recording": null,
          "motionStatus": "Source traced \u00b7 Unity recording pending",
          "runtimeVerified": false
        }
      ],
      "exclusions": [
        "Training launch confirmation retained but inactive: s_confirmDialog.Init is commented out; direct current flow configures main lobby. Do not count retained LaunchTrainingHunt as active.",
        "Arena old embedded matchmade/friend-ready roots: Prefab retains s_matchmadeVisuals/s_opponentReadyRoot fields no longer present on controllers; active transition is separate BattleArenaLobbyLoadingScreen.",
        "Race loading button retained but not enabled by active manager: s_loadingButton is setfalse in Init and nevertrue by this class. Hidden spinner speed-360 is not an active launch state; launch uses global loader.",
        "Hunt/rematch token coordinator is not lobby authority: Dedicated-server pair management and posthunt/rematch UI are beyond current lobby32-page scope; same wager UI reused, but different authority lifecycle.",
        "Native OS camera permission prompts: System iOS/Android permission dialog and actual camera/mirroring cannot be certified by editor fixture. Use no actual identity or camera data during this audit.",
        "Parked tournament pages and in-match race/game HUD: Existing page catalogue excludes inactive tournament entry; current task covers lobby-side pages and their handoffs, not redesign of full game HUD.",
        "Race leaderboard retained but unwired: Leaderboard root inactive; PrizesTab and Leaderboardtab empty persistent calls. LobbyHoverboardRacingUIManager adds only close/start listeners; no active leaderboard switching route found."
      ],
      "crossChecks": [],
      "entry": "See state triggers and transitions below.",
      "outgoing": [
        "opponent-choice",
        "set-x-token-amount-challenge-setup"
      ]
    },
    "set-x-token-amount-challenge-setup": {
      "revision": "all-screen-audit-v1",
      "states": [
        {
          "id": "TOKEN-01",
          "screenId": "set-x-token-amount-challenge-setup",
          "group": "Set X-Token amount / challenge setup",
          "title": "Wager UI/podium loading",
          "trigger": "Enter SetXToken after friend/random connection.",
          "result": "Download wager canvas; keep loader until canvas, podium and both characters exist, plus two-second dissolve coverage.",
          "exit": "Reveal token setup; exit stops pending jobs.",
          "source": {
            "file": "Assets/_Scripts/UI/BattleArena/Lobby/BattleArena_SetXTokenState.cs",
            "line": 112
          },
          "original": "assets/states/CONNECT80.png",
          "updated": null,
          "checks": [
            "Wager asset delayed",
            "Podium delayed",
            "Character dissolve coverage",
            "Exit mid-load"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "CONNECT80",
          "captureNote": "Native Unity UI with sample data. This state shares its visual layout with capture CONNECT80. Native loading prefab; its original bottom progress labels are very small at 1280\u00d7720. Preserve this finding for redesign."
        },
        {
          "id": "TOKEN-02",
          "screenId": "set-x-token-amount-challenge-setup",
          "group": "Set X-Token amount / challenge setup",
          "title": "First-visit instructions",
          "trigger": "Wager UI opens and first-instruction preference is absent.",
          "result": "Show instruction root once; real OnEnable immediately writes preference. Fixture must set root directly instead.",
          "exit": "Dismiss instructions via existing prefab close control.",
          "source": {
            "file": "Assets/_Scripts/UI/BattleArena/BattleArenaSetXtokenUI.cs",
            "line": 92
          },
          "original": "assets/states/TOKEN02.png",
          "updated": null,
          "checks": [
            "First visit",
            "Returning visit",
            "No preference writes during capture"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "TOKEN02",
          "captureNote": "Native Unity UI with sample data. This state shares its visual layout with capture TOKEN02."
        },
        {
          "id": "TOKEN-03",
          "screenId": "set-x-token-amount-challenge-setup",
          "group": "Set X-Token amount / challenge setup",
          "title": "Choose token amount \u2014 no selection",
          "trigger": "Both controllers ready with SelectedToken=-1.",
          "result": "Show names, token values 0/5/10/25/50/100, 120S selection window and zero total/FIGHTING FOR HONOUR.",
          "exit": "Select an affordable amount, exit or wait.",
          "source": {
            "file": "Assets/_Scripts/UI/BattleArena/BattleArenaSetXtokenUI.cs",
            "line": 551
          },
          "original": "assets/states/TOKEN03.png",
          "updated": null,
          "checks": [
            "Initial120S",
            "Long names",
            "0 token balance"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "TOKEN03",
          "captureNote": "Native Unity UI with sample data. This state shares its visual layout with capture TOKEN03."
        },
        {
          "id": "TOKEN-04",
          "screenId": "set-x-token-amount-challenge-setup",
          "group": "Set X-Token amount / challenge setup",
          "title": "Unaffordable token options",
          "trigger": "Local balance below one or more token values.",
          "result": "Unavailable button disabled; text/background alpha0.5; opponent side remains display-only.",
          "exit": "Select affordable option; balance changes require live verification.",
          "source": {
            "file": "Assets/_Scripts/UI/BattleArena/Lobby/BattleArenaTokenUI.cs",
            "line": 39
          },
          "original": "assets/states/TOKEN04.png",
          "updated": null,
          "checks": [
            "Balance0",
            "Exact balance5/10/25/50/100",
            "Half-alpha edge"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "TOKEN04",
          "captureNote": "Native Unity UI with sample data. This state shares its visual layout with capture TOKEN04. 25/50/100 alpha0.5; original runtime additionally disables Buttons. Visual fixture only."
        },
        {
          "id": "TOKEN-05",
          "screenId": "set-x-token-amount-challenge-setup",
          "group": "Set X-Token amount / challenge setup",
          "title": "Local selected; opponent undecided",
          "trigger": "Local token changes while opponent remains -1.",
          "result": "Local highlight changes, total includes selected amount, timer continues; WINNER TAKES ALL when total>0.",
          "exit": "Opponent chooses; local may change; Back exits.",
          "source": {
            "file": "Assets/_Scripts/UI/BattleArena/BattleArenaSetXtokenUI.cs",
            "line": 616
          },
          "original": "assets/states/TOKEN05.png",
          "updated": null,
          "checks": [
            "Zero selection",
            "Positive selection",
            "Replicated selection before UI subscribed"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "TOKEN05",
          "captureNote": "Native Unity UI with sample data. This state shares its visual layout with capture TOKEN05."
        },
        {
          "id": "TOKEN-06",
          "screenId": "set-x-token-amount-challenge-setup",
          "group": "Set X-Token amount / challenge setup",
          "title": "Different token amounts selected",
          "trigger": "Both have selected unequal amounts.",
          "result": "Both chosen values highlighted; total sums them; timer continues because they disagree.",
          "exit": "Agree on affordable same value or exit/time out.",
          "source": {
            "file": "Assets/_Scripts/UI/BattleArena/BattleArenaSetXtokenUI.cs",
            "line": 272
          },
          "original": "assets/states/TOKEN06.png",
          "updated": null,
          "checks": [
            "Changing amount repeatedly",
            "No premature countdown"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "TOKEN06",
          "captureNote": "Native Unity UI with sample data. This state shares its visual layout with capture TOKEN06."
        },
        {
          "id": "TOKEN-07",
          "screenId": "set-x-token-amount-challenge-setup",
          "group": "Set X-Token amount / challenge setup",
          "title": "Both choose zero \u2014 honour battle",
          "trigger": "Both select zero and affordability check passes.",
          "result": "Total0 and FIGHTING FOR HONOUR; launch countdown begins.",
          "exit": "Countdown to arena join.",
          "source": {
            "file": "Assets/_Scripts/UI/BattleArena/BattleArenaSetXtokenUI.cs",
            "line": 627
          },
          "original": "assets/states/TOKEN07.png",
          "updated": null,
          "checks": [
            "No balance deducted",
            "Same countdown as positive amount"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "TOKEN07",
          "captureNote": "Native Unity UI with sample data. This state shares its visual layout with capture TOKEN07."
        },
        {
          "id": "TOKEN-08",
          "screenId": "set-x-token-amount-challenge-setup",
          "group": "Set X-Token amount / challenge setup",
          "title": "Both agree on positive amount",
          "trigger": "Both selections equal and within each player balance.",
          "result": "Both highlights agree; winner-takes-all total and countdown begins.",
          "exit": "Countdown then arena join.",
          "source": {
            "file": "Assets/_Scripts/UI/BattleArena/BattleArenaSetXtokenUI.cs",
            "line": 635
          },
          "original": "assets/states/TOKEN08.png",
          "updated": null,
          "checks": [
            "Exact affordability",
            "Other player cannot afford",
            "Change during countdown"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "TOKEN08",
          "captureNote": "Native Unity UI with sample data. This state shares its visual layout with capture TOKEN08."
        },
        {
          "id": "TOKEN-09",
          "screenId": "set-x-token-amount-challenge-setup",
          "group": "Set X-Token amount / challenge setup",
          "title": "Preparing for battle countdown",
          "trigger": "Agreement triggers downloaded BattleArenaLobbyCountdownSequence.",
          "result": "Animator displays PREPARING FOR BATTLE/countdown; UI waits10s then invokes settled once (network OnStartBattle may also arrive).",
          "exit": "Global arena loading; cancellation/disable destroys countdown.",
          "source": {
            "file": "Assets/_Scripts/UI/BattleArena/BattleArenaSetXtokenUI.cs",
            "line": 677
          },
          "original": "assets/states/TOKEN09.png",
          "updated": null,
          "checks": [
            "Countdown0\u201310",
            "Duplicate OnStartBattle",
            "Exit during sequence",
            "Asset download failed has no dedicated guard"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "TOKEN09",
          "captureNote": "Native Unity UI with sample data. This state shares its visual layout with capture TOKEN09. Static midpoint only. Prefer real Animator clip SampleAnimation at5.25s; digit activation alone does not verify flip rotation."
        },
        {
          "id": "TOKEN-10",
          "screenId": "set-x-token-amount-challenge-setup",
          "group": "Set X-Token amount / challenge setup",
          "title": "Opponent left / controllers timed out",
          "trigger": "Controllers fail to initialize within20s, or opponent missing for5s.",
          "result": "Show YOUR OPPONENT HAS LEFT dialog and OK; disable update/controller listeners.",
          "exit": "OK returns Opponent choice and disconnects/cancels matchmaker.",
          "source": {
            "file": "Assets/_Scripts/UI/BattleArena/BattleArenaSetXtokenUI.cs",
            "line": 662
          },
          "original": "assets/states/TOKEN10.png",
          "updated": null,
          "checks": [
            "Join timeout20s",
            "Transient absence<5s",
            "Opponent leaves>5s",
            "Repeated error callback"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "TOKEN10",
          "captureNote": "Native Unity UI with sample data. This state shares its visual layout with capture TOKEN10."
        },
        {
          "id": "TOKEN-11",
          "screenId": "set-x-token-amount-challenge-setup",
          "group": "Set X-Token amount / challenge setup",
          "title": "Selection timer exhausted",
          "trigger": "120-second window expires without agreement.",
          "result": "Displayed timer is an unclamped rounded timestamp subtraction; lobby UI has no local timeout dialog in this class. Dedicated hunt/rematch coordinator separately marks timed out.",
          "exit": "Live lobby authority behavior requires verification; Back remains exit.",
          "source": {
            "file": "Assets/_Scripts/UI/BattleArena/BattleArenaSetXtokenUI.cs",
            "line": 272
          },
          "original": "assets/states/TOKEN11.png",
          "updated": null,
          "checks": [
            "0S",
            "Negative timer risk",
            "Lobby vs dedicated rematch distinction"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "TOKEN11",
          "captureNote": "Native Unity UI with sample data. This state shares its visual layout with capture TOKEN11."
        },
        {
          "id": "TOKEN-12",
          "screenId": "set-x-token-amount-challenge-setup",
          "group": "Set X-Token amount / challenge setup",
          "title": "Local/opponent voice controls enabled",
          "trigger": "Voice feature enabled, MicMode All / enemy listening enabled.",
          "result": "Corresponding toggles shown with active cyan or muted low-alpha colours; opponent speech indicator follows proximity speech.",
          "exit": "Toggle mute; app settings may hide controls.",
          "source": {
            "file": "Assets/_Scripts/UI/BattleArena/BattleArenaSetXtokenUI.cs",
            "line": 341
          },
          "original": "assets/states/TOKEN12.png",
          "updated": null,
          "checks": [
            "Both muted",
            "Only local enabled",
            "Only opponent listening",
            "Speech indicator"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "TOKEN12",
          "captureNote": "Native Unity UI with sample data. This state shares its visual layout with capture TOKEN12."
        },
        {
          "id": "TOKEN-13",
          "screenId": "set-x-token-amount-challenge-setup",
          "group": "Set X-Token amount / challenge setup",
          "title": "Voice controls unavailable",
          "trigger": "Voice feature disabled, mic not All, or enemy listening disabled.",
          "result": "Hide the associated controls and speech indicator.",
          "exit": "Settings change may restore controls.",
          "source": {
            "file": "Assets/_Scripts/UI/BattleArena/BattleArenaSetXtokenUI.cs",
            "line": 336
          },
          "original": "assets/states/TOKEN03.png",
          "updated": null,
          "checks": [],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "TOKEN03",
          "captureNote": "Native Unity UI with sample data. This state shares its visual layout with capture TOKEN03."
        },
        {
          "id": "TOKEN-14",
          "screenId": "set-x-token-amount-challenge-setup",
          "group": "Set X-Token amount / challenge setup",
          "title": "Exit challenge",
          "trigger": "Back pressed before settled.",
          "result": "Disable wager component, switch opponent page, leave session/cancel matchmaker; countdown and resources destroyed.",
          "exit": "Opponent choice.",
          "source": {
            "file": "Assets/_Scripts/UI/BattleArena/BattleArenaSetXtokenUI.cs",
            "line": 538
          },
          "original": "assets/states/OPP01.png",
          "updated": null,
          "checks": [
            "Exit while countdown",
            "Exit while loading",
            "No lingering overlays"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "OPP01",
          "captureNote": "Native Unity UI with sample data. This state shares its visual layout with capture OPP01."
        },
        {
          "id": "TOKEN-15",
          "screenId": "set-x-token-amount-challenge-setup",
          "group": "Set X-Token amount / challenge setup",
          "title": "Arena allocation failed",
          "trigger": "After settlement, available arena lookup/session join fails.",
          "result": "CancelGame shows SORRY / Failed to find an available arena, please try again later.",
          "exit": "Dismiss, return to menu, retry challenge.",
          "source": {
            "file": "Assets/_Scripts/UI/BattleArena/Lobby/BattleArena_SetXTokenState.cs",
            "line": 71
          },
          "original": "assets/states/TOKEN15.png",
          "updated": null,
          "checks": [
            "Allocation failure",
            "Server join failure"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "TOKEN15",
          "captureNote": "Native Unity UI with sample data. This state shares its visual layout with capture TOKEN15. Original Assets/Prefabs/UI/Old/DialogueBoxCanvas.prefab is actually nested in DoNotDestroy.prefab. CreateDialogueMessage buttonTitle argument is ignored by current implementation, so source button text remains CLOSE. Offline fixture injects display only."
        }
      ],
      "flows": [
        {
          "id": "CHAL-FLOW-02",
          "screenId": "choose-a-friend-to-challenge",
          "title": "Accepted friend transition",
          "states": [
            "CHAL-06",
            "CHAL-07",
            "RANDOM-03",
            "TOKEN-01",
            "TOKEN-03"
          ],
          "steps": [
            "CHAL-06",
            "CHAL-07",
            "RANDOM-03",
            "TOKEN-01",
            "TOKEN-03"
          ],
          "trigger": "Friend accepts invitation",
          "result": "One-second friend transition, connection loader, podium reveal.",
          "source": {
            "file": "Assets/_Scripts/UI/BattleArena/Lobby/BattleArena_SelectingFriendState.cs",
            "line": 177
          },
          "motion": "FriendsChallenge root for1s; load5/50/80; two-second character dissolve cover before hide.",
          "recording": null,
          "motionStatus": "Source traced \u00b7 Unity recording pending",
          "runtimeVerified": false
        },
        {
          "id": "RANDOM-FLOW-01",
          "screenId": "random-opponent-search",
          "title": "Find and connect opponent",
          "states": [
            "RANDOM-01",
            "RANDOM-02",
            "RANDOM-03",
            "TOKEN-01",
            "TOKEN-03"
          ],
          "steps": [
            "RANDOM-01",
            "RANDOM-02",
            "RANDOM-03",
            "TOKEN-01",
            "TOKEN-03"
          ],
          "trigger": "Successful random matchmaking",
          "result": "Token setup after both controllers ready.",
          "source": {
            "file": "Assets/_Scripts/UI/BattleArena/Lobby/BattleArena_SelectingRandomState.cs",
            "line": 213
          },
          "motion": "Search spinner -200deg/s; RandomChallenge root1s then connection loader, podium dissolve cover.",
          "recording": null,
          "motionStatus": "Source traced \u00b7 Unity recording pending",
          "runtimeVerified": false
        },
        {
          "id": "TOKEN-FLOW-01",
          "screenId": "set-x-token-amount-challenge-setup",
          "title": "First visit, choose, agree, countdown",
          "states": [
            "TOKEN-02",
            "TOKEN-03",
            "TOKEN-05",
            "TOKEN-06",
            "TOKEN-08",
            "TOKEN-09"
          ],
          "steps": [
            "TOKEN-02",
            "TOKEN-03",
            "TOKEN-05",
            "TOKEN-06",
            "TOKEN-08",
            "TOKEN-09"
          ],
          "trigger": "Both choose equal affordable token amount",
          "result": "Real countdown then arena allocation.",
          "source": {
            "file": "Assets/_Scripts/UI/BattleArena/BattleArenaSetXtokenUI.cs",
            "line": 627
          },
          "motion": "Real Animator MatchmakingCountdownSequence; UI waits10s and prevents duplicate settled invocation. Dedicated rematch authority uses11s; distinguish contexts.",
          "recording": null,
          "motionStatus": "Source traced \u00b7 Unity recording pending",
          "runtimeVerified": false
        },
        {
          "id": "TOKEN-FLOW-02",
          "screenId": "set-x-token-amount-challenge-setup",
          "title": "Zero-token battle",
          "states": [
            "TOKEN-03",
            "TOKEN-07",
            "TOKEN-09"
          ],
          "steps": [
            "TOKEN-03",
            "TOKEN-07",
            "TOKEN-09"
          ],
          "trigger": "Both choose0",
          "result": "Honour wording then same real countdown.",
          "source": {
            "file": "Assets/_Scripts/UI/BattleArena/BattleArenaSetXtokenUI.cs",
            "line": 278
          },
          "motion": "Same countdown; no special zero-token animation traced.",
          "recording": null,
          "motionStatus": "Source traced \u00b7 Unity recording pending",
          "runtimeVerified": false
        },
        {
          "id": "TOKEN-FLOW-03",
          "screenId": "set-x-token-amount-challenge-setup",
          "title": "Opponent left and return",
          "states": [
            "TOKEN-03",
            "TOKEN-10",
            "OPP-01"
          ],
          "steps": [
            "TOKEN-03",
            "TOKEN-10",
            "OPP-01"
          ],
          "trigger": "Opponent absent5s or initialization timeout20s",
          "result": "OK returns opponent choice.",
          "source": {
            "file": "Assets/_Scripts/UI/BattleArena/BattleArenaSetXtokenUI.cs",
            "line": 662
          },
          "motion": "Wager update disabled; error modal displayed; cleanup destroys countdown.",
          "recording": null,
          "motionStatus": "Source traced \u00b7 Unity recording pending",
          "runtimeVerified": false
        },
        {
          "id": "TOKEN-FLOW-04",
          "screenId": "set-x-token-amount-challenge-setup",
          "title": "Voice setting changes",
          "states": [
            "TOKEN-12",
            "TOKEN-13",
            "TOKEN-12"
          ],
          "steps": [
            "TOKEN-12",
            "TOKEN-13",
            "TOKEN-12"
          ],
          "trigger": "Mute/listening/feature settings change",
          "result": "Show/hide and recolour controls; indicator follows speech.",
          "source": {
            "file": "Assets/_Scripts/UI/BattleArena/BattleArenaSetXtokenUI.cs",
            "line": 341
          },
          "motion": "Discrete tint and active-state changes, not a new UI page.",
          "recording": null,
          "motionStatus": "Source traced \u00b7 Unity recording pending",
          "runtimeVerified": false
        },
        {
          "id": "OPP-FLOW-03",
          "screenId": "opponent-choice",
          "title": "Incoming Arena invitation: accept, reject, timeout",
          "states": [
            "OPP-05",
            "OPP-06",
            "OPP-07",
            "OPP-08",
            "TOKEN-01",
            "TOKEN-03"
          ],
          "steps": [
            "OPP-05",
            "OPP-06",
            "OPP-07",
            "OPP-08",
            "TOKEN-01",
            "TOKEN-03"
          ],
          "trigger": "Incoming Arena invitation",
          "result": "Accept skips directly to wager after friend transition; decline/revoke/expiry returns prior UI or next invitation. Failure hides loader.",
          "source": {
            "file": "Assets/_Scripts/Friends/UI/BattleArenaInviteReceivedPopup.cs",
            "line": 110
          },
          "motion": "Dismiss fill shrinks every frame over120s; integer remaining seconds updates when changed. Accepted friend banner1s then loader.",
          "recording": null,
          "motionStatus": "Source traced \u00b7 Unity recording pending",
          "runtimeVerified": false
        }
      ],
      "exclusions": [
        "Training launch confirmation retained but inactive: s_confirmDialog.Init is commented out; direct current flow configures main lobby. Do not count retained LaunchTrainingHunt as active.",
        "Arena old embedded matchmade/friend-ready roots: Prefab retains s_matchmadeVisuals/s_opponentReadyRoot fields no longer present on controllers; active transition is separate BattleArenaLobbyLoadingScreen.",
        "Race loading button retained but not enabled by active manager: s_loadingButton is setfalse in Init and nevertrue by this class. Hidden spinner speed-360 is not an active launch state; launch uses global loader.",
        "Hunt/rematch token coordinator is not lobby authority: Dedicated-server pair management and posthunt/rematch UI are beyond current lobby32-page scope; same wager UI reused, but different authority lifecycle.",
        "Native OS camera permission prompts: System iOS/Android permission dialog and actual camera/mirroring cannot be certified by editor fixture. Use no actual identity or camera data during this audit.",
        "Parked tournament pages and in-match race/game HUD: Existing page catalogue excludes inactive tournament entry; current task covers lobby-side pages and their handoffs, not redesign of full game HUD.",
        "Race leaderboard retained but unwired: Leaderboard root inactive; PrizesTab and Leaderboardtab empty persistent calls. LobbyHoverboardRacingUIManager adds only close/start listeners; no active leaderboard switching route found."
      ],
      "crossChecks": [],
      "entry": "See state triggers and transitions below.",
      "outgoing": [
        "opponent-choice"
      ]
    },
    "hoverboard-race-lobby": {
      "revision": "all-screen-audit-v1",
      "states": [
        {
          "id": "RACE-01",
          "screenId": "hoverboard-race-lobby",
          "group": "Hoverboard race lobby",
          "title": "Race available",
          "trigger": "Local attemptsLeft>0 when race lobby Init runs.",
          "result": "Show attempts, best time, Start; locked/loading buttons hidden. Countdown to next UTC midnight refreshes each second.",
          "exit": "Start consumes one attempt and loads time trial; Close returns modes.",
          "source": {
            "file": "Assets/_Scripts/UI/Lobby/HoverboardRacing/LobbyHoverboardRacingUIManager.cs",
            "line": 34
          },
          "original": "assets/states/RACE01.png",
          "updated": null,
          "checks": [
            "3/2/1 attempts",
            "Best time absent/recorded",
            "Long timer text"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "RACE01",
          "captureNote": "Native Unity UI with sample data. This state shares its visual layout with capture RACE01. Original source has an unassigned map image and generic gift/prize placeholders. Its manager only initializes attempts, best time and countdown; final race artwork and prize binding need review."
        },
        {
          "id": "RACE-02",
          "screenId": "hoverboard-race-lobby",
          "group": "Hoverboard race lobby",
          "title": "No attempts remaining",
          "trigger": "Local attemptsLeft==0.",
          "result": "Hide Start and show locked button; countdown to UTC midnight stays visible.",
          "exit": "Close/reopen after daily reset; no purchase/replenish action in controller.",
          "source": {
            "file": "Assets/_Scripts/UI/Lobby/HoverboardRacing/LobbyHoverboardRacingUIManager.cs",
            "line": 43
          },
          "original": "assets/states/RACE02.png",
          "updated": null,
          "checks": [
            "Exactly0",
            "Daily boundary while page already open"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "RACE02",
          "captureNote": "Native Unity UI with sample data. This state shares its visual layout with capture RACE02. Original source has an unassigned map image and generic gift/prize placeholders. Its manager only initializes attempts, best time and countdown; final race artwork and prize binding need review."
        },
        {
          "id": "RACE-03",
          "screenId": "hoverboard-race-lobby",
          "group": "Hoverboard race lobby",
          "title": "Midnight refresh boundary",
          "trigger": "Timer crosses UTC midnight while race page remains open.",
          "result": "Timer rolls to next midnight; attempt reset is in entry component OnEnable, not race page Update, so automatic re-unlock is not implemented here.",
          "exit": "Close/re-enable mode entry recalculates daily attempts.",
          "source": {
            "file": "Assets/_Scripts/UI/Lobby/HoverboardRacing/LobbyHoverboardRacingUIManager.cs",
            "line": 73
          },
          "original": "assets/states/RACE03.png",
          "updated": null,
          "checks": [
            "Page stays open through midnight",
            "Reopen after midnight"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "RACE03",
          "captureNote": "Native Unity UI with sample data. This state shares its visual layout with capture RACE03. Original source has an unassigned map image and generic gift/prize placeholders. Its manager only initializes attempts, best time and countdown; final race artwork and prize binding need review."
        },
        {
          "id": "RACE-04",
          "screenId": "hoverboard-race-lobby",
          "group": "Hoverboard race lobby",
          "title": "Race start loading",
          "trigger": "Start clicked.",
          "result": "Decrement local attempt before load; global loading shows Loading Hoverboard Racing, starting at10%.",
          "exit": "Race scene entry; failed/interrupted load must verify consumed-attempt policy.",
          "source": {
            "file": "Assets/_Scripts/GameManager.cs",
            "line": 1939
          },
          "original": "assets/states/RACE04.png",
          "updated": null,
          "checks": [
            "Double tap",
            "Load failed after decrement",
            "Returning from race"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "RACE04",
          "captureNote": "Native Unity UI with sample data. This state shares its visual layout with capture RACE04. Native Assets/Resources/LoadingScreenCanvas.prefab and DefaultLoadingBackground; distinct from arena loader."
        },
        {
          "id": "RACE-05",
          "screenId": "hoverboard-race-lobby",
          "group": "Hoverboard race lobby",
          "title": "Race lobby asset load pending / failed",
          "trigger": "Downloaded HoverboardLobbyCanvas is not immediately available or fails.",
          "result": "Entry waits; current loader has no IsFaulted/IsCanceled/null guard and no dedicated error panel.",
          "exit": "Retry entry or global download recovery; failure behavior needs runtime verification.",
          "source": {
            "file": "Assets/_Scripts/UI/Lobby/HoverboardRacing/JoinHoverboardRacingUIComponent.cs",
            "line": 56
          },
          "original": "assets/states/MODE01.png",
          "updated": null,
          "checks": [],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "MODE01",
          "captureNote": "Native Unity UI with sample data. This state shares its visual layout with capture MODE01. Async missing-feedback states reuse settled prior screen. Time and attempts are injected samples."
        },
        {
          "id": "RACE-06",
          "screenId": "hoverboard-race-lobby",
          "group": "Hoverboard race lobby",
          "title": "Close race lobby",
          "trigger": "Close pressed.",
          "result": "Invoke close callback, release downloaded asset and deactivate/destroy race canvas.",
          "exit": "Mode picker remains.",
          "source": {
            "file": "Assets/_Scripts/UI/Lobby/HoverboardRacing/LobbyHoverboardRacingUIManager.cs",
            "line": 90
          },
          "original": "assets/states/MODE01.png",
          "updated": null,
          "checks": [],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "MODE01",
          "captureNote": "Native Unity UI with sample data. This state shares its visual layout with capture MODE01. Async missing-feedback states reuse settled prior screen. Time and attempts are injected samples."
        }
      ],
      "flows": [
        {
          "id": "MODE-FLOW-05",
          "screenId": "game-modes",
          "title": "Time Trial route",
          "states": [
            "MODE-09",
            "RACE-01",
            "RACE-04"
          ],
          "steps": [
            "MODE-09",
            "RACE-01",
            "RACE-04"
          ],
          "trigger": "Open Daily Time Trial then Start",
          "result": "Consume local attempt, global loading and race.",
          "source": {
            "file": "Assets/_Scripts/UI/Lobby/HoverboardRacing/JoinHoverboardRacingUIComponent.cs",
            "line": 51
          },
          "motion": "Downloaded canvas activation; prize glimmer; actual loading is global.",
          "recording": null,
          "motionStatus": "Source traced \u00b7 Unity recording pending",
          "runtimeVerified": false
        },
        {
          "id": "RACE-FLOW-01",
          "screenId": "hoverboard-race-lobby",
          "title": "Attempts expire and renew",
          "states": [
            "RACE-01",
            "RACE-04",
            "RACE-02",
            "RACE-03"
          ],
          "steps": [
            "RACE-01",
            "RACE-04",
            "RACE-02",
            "RACE-03"
          ],
          "trigger": "Starts use local attempts; new UTC day",
          "result": "Locked state; attempt renewal on entry OnEnable.",
          "source": {
            "file": "Assets/_Scripts/UI/Lobby/HoverboardRacing/LobbyHoverboardRacingUIManager.cs",
            "line": 34
          },
          "motion": "Countdown text updates1Hz; prize sheen moves90units over1s with3s delays.",
          "recording": null,
          "motionStatus": "Source traced \u00b7 Unity recording pending",
          "runtimeVerified": false
        }
      ],
      "exclusions": [
        "Training launch confirmation retained but inactive: s_confirmDialog.Init is commented out; direct current flow configures main lobby. Do not count retained LaunchTrainingHunt as active.",
        "Arena old embedded matchmade/friend-ready roots: Prefab retains s_matchmadeVisuals/s_opponentReadyRoot fields no longer present on controllers; active transition is separate BattleArenaLobbyLoadingScreen.",
        "Race loading button retained but not enabled by active manager: s_loadingButton is setfalse in Init and nevertrue by this class. Hidden spinner speed-360 is not an active launch state; launch uses global loader.",
        "Hunt/rematch token coordinator is not lobby authority: Dedicated-server pair management and posthunt/rematch UI are beyond current lobby32-page scope; same wager UI reused, but different authority lifecycle.",
        "Native OS camera permission prompts: System iOS/Android permission dialog and actual camera/mirroring cannot be certified by editor fixture. Use no actual identity or camera data during this audit.",
        "Parked tournament pages and in-match race/game HUD: Existing page catalogue excludes inactive tournament entry; current task covers lobby-side pages and their handoffs, not redesign of full game HUD.",
        "Race leaderboard retained but unwired: Leaderboard root inactive; PrizesTab and Leaderboardtab empty persistent calls. LobbyHoverboardRacingUIManager adds only close/start listeners; no active leaderboard switching route found."
      ],
      "crossChecks": [],
      "entry": "See state triggers and transitions below.",
      "outgoing": [
        "game-modes"
      ]
    },
    "verification-setup": {
      "revision": "all-screen-audit-v1",
      "states": [
        {
          "id": "KYCSET-01",
          "screenId": "verification-setup",
          "group": "Verification setup",
          "title": "Optional verification form",
          "trigger": "Gameplay Settings identity verification entry opens with no active client state.",
          "result": "Show country input, document type, Continue, Check existing review and Close.",
          "exit": "Continue validates then loads eligibility/policies; Close dismisses only.",
          "source": {
            "file": "Assets/_Scripts/Sentinel/Runtime/SentinelKycSettingsEntry.cs",
            "line": 230
          },
          "original": "assets/states/KYCSET01.png",
          "updated": null,
          "checks": [
            "Landscape original scaling",
            "Keyboard overlap",
            "Entry hidden in hunt settings"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "KYCSET01",
          "captureNote": "Native Unity UI with sample data. This state shares its visual layout with capture KYCSET01. Native original generator; visual sample only. No client, authentication, permissions, camera hardware, legal acceptance or upload."
        },
        {
          "id": "KYCSET-02",
          "screenId": "verification-setup",
          "group": "Verification setup",
          "title": "Document type choice",
          "trigger": "Change document type pressed.",
          "result": "Cycle Passport \u2192 Identity card \u2192 Driver\u2019s licence \u2192 Passport.",
          "exit": "Continue with selected type.",
          "source": {
            "file": "Assets/_Scripts/Sentinel/Runtime/SentinelKycSettingsEntry.cs",
            "line": 377
          },
          "original": "assets/states/KYCSET02.png",
          "updated": null,
          "checks": [
            "All3 labels",
            "Long localized label"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "KYCSET02",
          "captureNote": "Native Unity UI with sample data. This state shares its visual layout with capture KYCSET02. Native original generator; visual sample only. No client, authentication, permissions, camera hardware, legal acceptance or upload."
        },
        {
          "id": "KYCSET-03",
          "screenId": "verification-setup",
          "group": "Verification setup",
          "title": "Country input invalid",
          "trigger": "Continue with length outside2\u20133 or non-ASCII letters.",
          "result": "Status page says Enter a valid two or three letter issuing-country code; input auto-uppercase and max3characters.",
          "exit": "Close/reopen form to retry when no active client.",
          "source": {
            "file": "Assets/_Scripts/Sentinel/Runtime/SentinelKycSettingsEntry.cs",
            "line": 247
          },
          "original": "assets/states/KYCSET03.png",
          "updated": null,
          "checks": [
            "Blank",
            "1letter",
            "Digits",
            "Accents",
            "2/3ASCII letters"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "KYCSET03",
          "captureNote": "Native Unity UI with sample data. This state shares its visual layout with capture KYCSET03. Native original generator; visual sample only. No client, authentication, permissions, camera hardware, legal acceptance or upload."
        },
        {
          "id": "KYCSET-04",
          "screenId": "verification-setup",
          "group": "Verification setup",
          "title": "Sign-in required",
          "trigger": "Country valid but no authenticated user.",
          "result": "Status message requests sign-in before verification.",
          "exit": "Close; sign in through account flow; reopen.",
          "source": {
            "file": "Assets/_Scripts/Sentinel/Runtime/SentinelKycSettingsEntry.cs",
            "line": 257
          },
          "original": "assets/states/KYCSET04.png",
          "updated": null,
          "checks": [],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "KYCSET04",
          "captureNote": "Native Unity UI with sample data. This state shares its visual layout with capture KYCSET04. Native original generator; visual sample only. No client, authentication, permissions, camera hardware, legal acceptance or upload."
        },
        {
          "id": "KYCSET-05",
          "screenId": "verification-setup",
          "group": "Verification setup",
          "title": "Current step-up request expired",
          "trigger": "Optional identity request no longer belongs to current player/session.",
          "result": "Status explains expired request/gameplay session change; no camera or operation begins.",
          "exit": "Close and await current request.",
          "source": {
            "file": "Assets/_Scripts/Sentinel/Runtime/SentinelKycSettingsEntry.cs",
            "line": 247
          },
          "original": "assets/states/KYCSET05.png",
          "updated": null,
          "checks": [],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "KYCSET05",
          "captureNote": "Native Unity UI with sample data. This state shares its visual layout with capture KYCSET05. Native original generator; visual sample only. No client, authentication, permissions, camera hardware, legal acceptance or upload."
        },
        {
          "id": "KYCSET-06",
          "screenId": "verification-setup",
          "group": "Verification setup",
          "title": "Existing workflow reopened",
          "trigger": "Overlay opened while client has non-idle state.",
          "result": "Reopen cached policy view if awaiting consent with text; otherwise show mapped status. Close does not cancel workflow.",
          "exit": "Continue displayed workflow or explicitly Cancel; Close hides overlay.",
          "source": {
            "file": "Assets/_Scripts/Sentinel/Runtime/SentinelKycSettingsEntry.cs",
            "line": 234
          },
          "original": "assets/states/KYCPOL01.png",
          "updated": null,
          "checks": [
            "Pending review reopen",
            "Awaiting policies reopen",
            "Close vs Cancel distinction"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "KYCPOL01",
          "captureNote": "Native Unity UI with sample data. This state shares its visual layout with capture KYCPOL01. Native original generator; visual sample only. No client, authentication, permissions, camera hardware, legal acceptance or upload."
        },
        {
          "id": "KYCSET-07",
          "screenId": "verification-setup",
          "group": "Verification setup",
          "title": "Eligibility check in progress",
          "trigger": "Valid country/type submitted.",
          "result": "LoadingCountryPolicy/LoadingPolicies statuses; country and document may be unavailable; preaccepted current policies can skip policy screen.",
          "exit": "Await policies/consent or Unavailable.",
          "source": {
            "file": "Assets/_Scripts/Sentinel/Runtime/SentinelKycWorkflow.cs",
            "line": 141
          },
          "original": "assets/states/KYCSET07.png",
          "updated": null,
          "checks": [
            "Country unsupported",
            "Document notallowed",
            "Policy alreadyaccepted",
            "Request failure"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "KYCSET07",
          "captureNote": "Native Unity UI with sample data. This state shares its visual layout with capture KYCSET07. Native original generator; visual sample only. No client, authentication, permissions, camera hardware, legal acceptance or upload."
        }
      ],
      "flows": [
        {
          "id": "KYCSET-FLOW-01",
          "screenId": "verification-setup",
          "title": "Form and eligibility",
          "states": [
            "KYCSET-01",
            "KYCSET-02",
            "KYCSET-07",
            "KYCPOL-01"
          ],
          "steps": [
            "KYCSET-01",
            "KYCSET-02",
            "KYCSET-07",
            "KYCPOL-01"
          ],
          "trigger": "Country/type Continue",
          "result": "Eligibility then current policies or unavailable.",
          "source": {
            "file": "Assets/_Scripts/Sentinel/Runtime/SentinelKycSettingsEntry.cs",
            "line": 247
          },
          "motion": "SetActive form/policy/status; no animation/tween in generator.",
          "recording": null,
          "motionStatus": "Source traced \u00b7 Unity recording pending",
          "runtimeVerified": false
        },
        {
          "id": "KYCSTATUS-FLOW-03",
          "screenId": "verification-status",
          "title": "Cancel, close, reopen",
          "states": [
            "KYCSTATUS-10",
            "KYCSET-06",
            "KYCSTATUS-15"
          ],
          "steps": [
            "KYCSTATUS-10",
            "KYCSET-06",
            "KYCSTATUS-15"
          ],
          "trigger": "Close/reopen or explicitCancel/accountchange",
          "result": "Close preserves flow; Cancel clears operation/resume/images.",
          "source": {
            "file": "Assets/_Scripts/Sentinel/Runtime/SentinelKycSettingsEntry.cs",
            "line": 297
          },
          "motion": "Overlay SetActive; cancellation clears camera overlay. No gameplay gating.",
          "recording": null,
          "motionStatus": "Source traced \u00b7 Unity recording pending",
          "runtimeVerified": false
        }
      ],
      "exclusions": [
        "Training launch confirmation retained but inactive: s_confirmDialog.Init is commented out; direct current flow configures main lobby. Do not count retained LaunchTrainingHunt as active.",
        "Arena old embedded matchmade/friend-ready roots: Prefab retains s_matchmadeVisuals/s_opponentReadyRoot fields no longer present on controllers; active transition is separate BattleArenaLobbyLoadingScreen.",
        "Race loading button retained but not enabled by active manager: s_loadingButton is setfalse in Init and nevertrue by this class. Hidden spinner speed-360 is not an active launch state; launch uses global loader.",
        "Hunt/rematch token coordinator is not lobby authority: Dedicated-server pair management and posthunt/rematch UI are beyond current lobby32-page scope; same wager UI reused, but different authority lifecycle.",
        "Native OS camera permission prompts: System iOS/Android permission dialog and actual camera/mirroring cannot be certified by editor fixture. Use no actual identity or camera data during this audit.",
        "Parked tournament pages and in-match race/game HUD: Existing page catalogue excludes inactive tournament entry; current task covers lobby-side pages and their handoffs, not redesign of full game HUD.",
        "Race leaderboard retained but unwired: Leaderboard root inactive; PrizesTab and Leaderboardtab empty persistent calls. LobbyHoverboardRacingUIManager adds only close/start listeners; no active leaderboard switching route found."
      ],
      "crossChecks": [],
      "entry": "See state triggers and transitions below.",
      "outgoing": [
        "gameplay-settings",
        "verification-policy-review",
        "verification-status"
      ]
    },
    "verification-policy-review": {
      "revision": "all-screen-audit-v1",
      "states": [
        {
          "id": "KYCPOL-01",
          "screenId": "verification-policy-review",
          "group": "Verification policy review",
          "title": "Current policies ready",
          "trigger": "Server supplies nonempty current Terms and Privacy.",
          "result": "Scrollable combined policy text; Accept both policies and Decline; start at top.",
          "exit": "Explicit acceptance creates operation; Decline cancels; Close hides.",
          "source": {
            "file": "Assets/_Scripts/Sentinel/Runtime/SentinelKycSettingsEntry.cs",
            "line": 313
          },
          "original": "assets/states/KYCPOL01.png",
          "updated": null,
          "checks": [
            "Long text",
            "Both policy headings",
            "Top/bottom scroll",
            "No clipping"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "KYCPOL01",
          "captureNote": "Native Unity UI with sample data. This state shares its visual layout with capture KYCPOL01. Native original generator; visual sample only. No client, authentication, permissions, camera hardware, legal acceptance or upload."
        },
        {
          "id": "KYCPOL-02",
          "screenId": "verification-policy-review",
          "group": "Verification policy review",
          "title": "Policy scroll / end of text",
          "trigger": "User scrolls policy content.",
          "result": "Clamped vertical ScrollRect; content height preferredHeight+40 or viewport max. There is no implemented must-scroll-to-bottom gate.",
          "exit": "Accept/Decline remain available.",
          "source": {
            "file": "Assets/_Scripts/Sentinel/Runtime/SentinelKycSettingsEntry.cs",
            "line": 125
          },
          "original": "assets/states/KYCPOL02.png",
          "updated": null,
          "checks": [
            "Long policy",
            "Short policy",
            "Reopen resets to top"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "KYCPOL02",
          "captureNote": "Native Unity UI with sample data. This state shares its visual layout with capture KYCPOL02. Native original generator; visual sample only. No client, authentication, permissions, camera hardware, legal acceptance or upload."
        },
        {
          "id": "KYCPOL-03",
          "screenId": "verification-policy-review",
          "group": "Verification policy review",
          "title": "Policy unavailable",
          "trigger": "Terms/privacy missing or empty.",
          "result": "Show current policy information unavailable status; no acceptance. Workflow also rejects invalid policies.",
          "exit": "Close, retry later.",
          "source": {
            "file": "Assets/_Scripts/Sentinel/Runtime/SentinelKycSettingsEntry.cs",
            "line": 315
          },
          "original": "assets/states/KYCPOL03.png",
          "updated": null,
          "checks": [],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "KYCPOL03",
          "captureNote": "Native Unity UI with sample data. This state shares its visual layout with capture KYCPOL03. Native original generator; visual sample only. No client, authentication, permissions, camera hardware, legal acceptance or upload."
        },
        {
          "id": "KYCPOL-04",
          "screenId": "verification-policy-review",
          "group": "Verification policy review",
          "title": "Acceptance submitting",
          "trigger": "User explicitly accepts current policies.",
          "result": "Disable Accept immediately then show Starting the requested verification steps; backend acceptance must succeed.",
          "exit": "Operation/session creation, or Unavailable on acceptance failure.",
          "source": {
            "file": "Assets/_Scripts/Sentinel/Runtime/SentinelKycSettingsEntry.cs",
            "line": 269
          },
          "original": "assets/states/KYCPOL04.png",
          "updated": null,
          "checks": [
            "Repeated Accept",
            "Acceptance failed",
            "Account changed",
            "No automatic legal acceptance in QA"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "KYCPOL04",
          "captureNote": "Native Unity UI with sample data. This state shares its visual layout with capture KYCPOL04. Native original generator; visual sample only. No client, authentication, permissions, camera hardware, legal acceptance or upload."
        },
        {
          "id": "KYCPOL-05",
          "screenId": "verification-policy-review",
          "group": "Verification policy review",
          "title": "Policies declined",
          "trigger": "User chooses Decline.",
          "result": "Cancel workflow and show You declined the current policies. No verification images were collected.",
          "exit": "Close; normal gameplay remains available.",
          "source": {
            "file": "Assets/_Scripts/Sentinel/Runtime/SentinelKycSettingsEntry.cs",
            "line": 277
          },
          "original": "assets/states/KYCPOL05.png",
          "updated": null,
          "checks": [],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "KYCPOL05",
          "captureNote": "Native Unity UI with sample data. This state shares its visual layout with capture KYCPOL05. Native original generator; visual sample only. No client, authentication, permissions, camera hardware, legal acceptance or upload."
        }
      ],
      "flows": [
        {
          "id": "KYCSET-FLOW-01",
          "screenId": "verification-setup",
          "title": "Form and eligibility",
          "states": [
            "KYCSET-01",
            "KYCSET-02",
            "KYCSET-07",
            "KYCPOL-01"
          ],
          "steps": [
            "KYCSET-01",
            "KYCSET-02",
            "KYCSET-07",
            "KYCPOL-01"
          ],
          "trigger": "Country/type Continue",
          "result": "Eligibility then current policies or unavailable.",
          "source": {
            "file": "Assets/_Scripts/Sentinel/Runtime/SentinelKycSettingsEntry.cs",
            "line": 247
          },
          "motion": "SetActive form/policy/status; no animation/tween in generator.",
          "recording": null,
          "motionStatus": "Source traced \u00b7 Unity recording pending",
          "runtimeVerified": false
        },
        {
          "id": "KYCPOL-FLOW-01",
          "screenId": "verification-policy-review",
          "title": "Review, accept or decline",
          "states": [
            "KYCPOL-01",
            "KYCPOL-02",
            "KYCPOL-04",
            "KYCSTATUS-01",
            "KYCSTATUS-02"
          ],
          "steps": [
            "KYCPOL-01",
            "KYCPOL-02",
            "KYCPOL-04",
            "KYCSTATUS-01",
            "KYCSTATUS-02"
          ],
          "trigger": "Explicit policy acceptance",
          "result": "Create operation/session; decline path ends at KYCPOL-05.",
          "source": {
            "file": "Assets/_Scripts/Sentinel/Runtime/SentinelKycWorkflow.cs",
            "line": 177
          },
          "motion": "Clamped ScrollRect; acceptance disables button and changes status immediately. No acceptance during audit.",
          "recording": null,
          "motionStatus": "Source traced \u00b7 Unity recording pending",
          "runtimeVerified": false
        }
      ],
      "exclusions": [
        "Training launch confirmation retained but inactive: s_confirmDialog.Init is commented out; direct current flow configures main lobby. Do not count retained LaunchTrainingHunt as active.",
        "Arena old embedded matchmade/friend-ready roots: Prefab retains s_matchmadeVisuals/s_opponentReadyRoot fields no longer present on controllers; active transition is separate BattleArenaLobbyLoadingScreen.",
        "Race loading button retained but not enabled by active manager: s_loadingButton is setfalse in Init and nevertrue by this class. Hidden spinner speed-360 is not an active launch state; launch uses global loader.",
        "Hunt/rematch token coordinator is not lobby authority: Dedicated-server pair management and posthunt/rematch UI are beyond current lobby32-page scope; same wager UI reused, but different authority lifecycle.",
        "Native OS camera permission prompts: System iOS/Android permission dialog and actual camera/mirroring cannot be certified by editor fixture. Use no actual identity or camera data during this audit.",
        "Parked tournament pages and in-match race/game HUD: Existing page catalogue excludes inactive tournament entry; current task covers lobby-side pages and their handoffs, not redesign of full game HUD.",
        "Race leaderboard retained but unwired: Leaderboard root inactive; PrizesTab and Leaderboardtab empty persistent calls. LobbyHoverboardRacingUIManager adds only close/start listeners; no active leaderboard switching route found."
      ],
      "crossChecks": [],
      "entry": "See state triggers and transitions below.",
      "outgoing": [
        "verification-setup",
        "verification-status"
      ]
    },
    "verification-status": {
      "revision": "all-screen-audit-v1",
      "states": [
        {
          "id": "KYCSTATUS-01",
          "screenId": "verification-status",
          "group": "Verification status",
          "title": "Creating identity operation",
          "trigger": "Policies accepted/current.",
          "result": "Generic in-progress status with starting_identity_operation safe code; active Cancel.",
          "exit": "Close returns to settings; active states may Cancel; pending review may Check. Result states require a new explicit workflow to retry.",
          "source": {
            "file": "Assets/_Scripts/Sentinel/Runtime/SentinelKycWorkflow.cs",
            "line": 193
          },
          "original": "assets/states/KYCSTATUS01.png",
          "updated": null,
          "checks": [
            "Operation expired",
            "Create operation failed"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "KYCSTATUS01",
          "captureNote": "Native Unity UI with sample data. This state shares its visual layout with capture KYCSTATUS01. Native original generator; visual sample only. No client, authentication, permissions, camera hardware, legal acceptance or upload."
        },
        {
          "id": "KYCSTATUS-02",
          "screenId": "verification-status",
          "group": "Verification status",
          "title": "Creating verification session",
          "trigger": "Identity operation valid.",
          "result": "Generic in-progress status with starting_kyc_session; no camera until valid grant.",
          "exit": "Close returns to settings; active states may Cancel; pending review may Check. Result states require a new explicit workflow to retry.",
          "source": {
            "file": "Assets/_Scripts/Sentinel/Runtime/SentinelKycWorkflow.cs",
            "line": 220
          },
          "original": "assets/states/KYCSTATUS02.png",
          "updated": null,
          "checks": [
            "Grant missing slots",
            "Expired grant"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "KYCSTATUS02",
          "captureNote": "Native Unity UI with sample data. This state shares its visual layout with capture KYCSTATUS02. Native original generator; visual sample only. No client, authentication, permissions, camera hardware, legal acceptance or upload."
        },
        {
          "id": "KYCSTATUS-03",
          "screenId": "verification-status",
          "group": "Verification status",
          "title": "Document front capture prompt",
          "trigger": "Capture workflow begins.",
          "result": "Camera overlay requests document front; Capture/Cancel; only explicit Use Photo advances.",
          "exit": "Close returns to settings; active states may Cancel; pending review may Check. Result states require a new explicit workflow to retry.",
          "source": {
            "file": "Assets/_Scripts/Sentinel/Runtime/SentinelKycMobileCapture.cs",
            "line": 175
          },
          "original": "assets/states/KYCSTATUS03.png",
          "updated": null,
          "checks": [
            "No real camera in review fixture",
            "Permission pending",
            "Rear camera unavailable"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "KYCSTATUS03",
          "captureNote": "Native Unity UI with sample data. This state shares its visual layout with capture KYCSTATUS03. Native original generator; visual sample only. No client, authentication, permissions, camera hardware, legal acceptance or upload. Source CreateElement leaves camera preview and colour overlay unparented. Preserved; no camera opened."
        },
        {
          "id": "KYCSTATUS-04",
          "screenId": "verification-status",
          "group": "Verification status",
          "title": "Document back capture prompt",
          "trigger": "Identity card/driving licence front uploaded.",
          "result": "Second document side requested. Passport skips this step.",
          "exit": "Close returns to settings; active states may Cancel; pending review may Check. Result states require a new explicit workflow to retry.",
          "source": {
            "file": "Assets/_Scripts/Sentinel/Runtime/SentinelKycWorkflow.cs",
            "line": 239
          },
          "original": "assets/states/KYCSTATUS04.png",
          "updated": null,
          "checks": [
            "Passport skips",
            "ID/license back required"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "KYCSTATUS04",
          "captureNote": "Native Unity UI with sample data. This state shares its visual layout with capture KYCSTATUS04. Native original generator; visual sample only. No client, authentication, permissions, camera hardware, legal acceptance or upload. Source CreateElement leaves camera preview and colour overlay unparented. Preserved; no camera opened."
        },
        {
          "id": "KYCSTATUS-05",
          "screenId": "verification-status",
          "group": "Verification status",
          "title": "Selfie capture prompt",
          "trigger": "Document uploads complete.",
          "result": "Front camera prompt centers face; Capture/Cancel.",
          "exit": "Close returns to settings; active states may Cancel; pending review may Check. Result states require a new explicit workflow to retry.",
          "source": {
            "file": "Assets/_Scripts/Sentinel/Runtime/SentinelKycMobileCapture.cs",
            "line": 175
          },
          "original": "assets/states/KYCSTATUS05.png",
          "updated": null,
          "checks": [
            "Front camera absent",
            "Rotation/mirroring"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "KYCSTATUS05",
          "captureNote": "Native Unity UI with sample data. This state shares its visual layout with capture KYCSTATUS05. Native original generator; visual sample only. No client, authentication, permissions, camera hardware, legal acceptance or upload. Source CreateElement leaves camera preview and colour overlay unparented. Preserved; no camera opened."
        },
        {
          "id": "KYCSTATUS-06",
          "screenId": "verification-status",
          "group": "Verification status",
          "title": "Liveness challenge colours",
          "trigger": "Baseline uploaded; server provides three RGB challenge steps.",
          "result": "Full-screen challenge colour rendered while front camera runs, with0.45s illumination before sampling; each frame explicit capture/review.",
          "exit": "Close returns to settings; active states may Cancel; pending review may Check. Result states require a new explicit workflow to retry.",
          "source": {
            "file": "Assets/_Scripts/Sentinel/Runtime/SentinelKycMobileCapture.cs",
            "line": 111
          },
          "original": "assets/states/KYCSTATUS06.png",
          "updated": null,
          "checks": [
            "Each RGB colour",
            "Three sequential steps",
            "Keep camera UI controls legible"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "KYCSTATUS06",
          "captureNote": "Native Unity UI with sample data. This state shares its visual layout with capture KYCSTATUS06. Native original generator; visual sample only. No client, authentication, permissions, camera hardware, legal acceptance or upload. Source CreateElement leaves camera preview and colour overlay unparented. Preserved; no camera opened."
        },
        {
          "id": "KYCSTATUS-07",
          "screenId": "verification-status",
          "group": "Verification status",
          "title": "Photo review / retake",
          "trigger": "Capture frame returned.",
          "result": "Camera stops; show captured review image with Use Photo, Retake and Cancel.",
          "exit": "Close returns to settings; active states may Cancel; pending review may Check. Result states require a new explicit workflow to retry.",
          "source": {
            "file": "Assets/_Scripts/Sentinel/Runtime/SentinelKycMobileCapture.cs",
            "line": 123
          },
          "original": "assets/states/KYCSTATUS07.png",
          "updated": null,
          "checks": [
            "Use synthetic nonidentity placeholder",
            "Retake same step",
            "No image saved to disk"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "KYCSTATUS07",
          "captureNote": "Native Unity UI with sample data. This state shares its visual layout with capture KYCSTATUS07. Native original generator; visual sample only. No client, authentication, permissions, camera hardware, legal acceptance or upload. Source CreateElement leaves camera preview and colour overlay unparented. Preserved; no camera opened."
        },
        {
          "id": "KYCSTATUS-08",
          "screenId": "verification-status",
          "group": "Verification status",
          "title": "Uploading confirmed image",
          "trigger": "User explicitly chooses Use Photo.",
          "result": "Submitting the confirmed verification image status; repeat capture/upload until5passport or6otherdocument artifacts complete.",
          "exit": "Close returns to settings; active states may Cancel; pending review may Check. Result states require a new explicit workflow to retry.",
          "source": {
            "file": "Assets/_Scripts/Sentinel/Runtime/SentinelKycWorkflow.cs",
            "line": 264
          },
          "original": "assets/states/KYCSTATUS08.png",
          "updated": null,
          "checks": [
            "Expired upload URL",
            "Upload failed",
            "Oversized JPEG",
            "Cancel during upload"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "KYCSTATUS08",
          "captureNote": "Native Unity UI with sample data. This state shares its visual layout with capture KYCSTATUS08. Native original generator; visual sample only. No client, authentication, permissions, camera hardware, legal acceptance or upload."
        },
        {
          "id": "KYCSTATUS-09",
          "screenId": "verification-status",
          "group": "Verification status",
          "title": "Submitting for review",
          "trigger": "Required confirmed images uploaded.",
          "result": "Sending the verification request for review status.",
          "exit": "Close returns to settings; active states may Cancel; pending review may Check. Result states require a new explicit workflow to retry.",
          "source": {
            "file": "Assets/_Scripts/Sentinel/Runtime/SentinelKycWorkflow.cs",
            "line": 289
          },
          "original": "assets/states/KYCSTATUS09.png",
          "updated": null,
          "checks": [
            "Submission failed",
            "Late response after cancel"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "KYCSTATUS09",
          "captureNote": "Native Unity UI with sample data. This state shares its visual layout with capture KYCSTATUS09. Native original generator; visual sample only. No client, authentication, permissions, camera hardware, legal acceptance or upload."
        },
        {
          "id": "KYCSTATUS-10",
          "screenId": "verification-status",
          "group": "Verification status",
          "title": "Review pending",
          "trigger": "Submission accepted / review still pending.",
          "result": "Pending message with Check review status and Cancel verification. Automatic poll backoff begins5s and caps60s.",
          "exit": "Close returns to settings; active states may Cancel; pending review may Check. Result states require a new explicit workflow to retry.",
          "source": {
            "file": "Assets/_Scripts/Sentinel/Runtime/SentinelKycWorkflow.cs",
            "line": 317
          },
          "original": "assets/states/KYCSTATUS10.png",
          "updated": null,
          "checks": [
            "Check visible",
            "Cancel visible",
            "Reopen later",
            "Poll remains pending"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "KYCSTATUS10",
          "captureNote": "Native Unity UI with sample data. This state shares its visual layout with capture KYCSTATUS10. Native original generator; visual sample only. No client, authentication, permissions, camera hardware, legal acceptance or upload."
        },
        {
          "id": "KYCSTATUS-11",
          "screenId": "verification-status",
          "group": "Verification status",
          "title": "Checking review",
          "trigger": "Manual Check or poll begins.",
          "result": "Checking current review status with Check/Cancel retained.",
          "exit": "Close returns to settings; active states may Cancel; pending review may Check. Result states require a new explicit workflow to retry.",
          "source": {
            "file": "Assets/_Scripts/Sentinel/Runtime/SentinelKycWorkflow.cs",
            "line": 323
          },
          "original": "assets/states/KYCSTATUS11.png",
          "updated": null,
          "checks": [
            "Repeated Check",
            "Stale response",
            "Resume saved review"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "KYCSTATUS11",
          "captureNote": "Native Unity UI with sample data. This state shares its visual layout with capture KYCSTATUS11. Native original generator; visual sample only. No client, authentication, permissions, camera hardware, legal acceptance or upload."
        },
        {
          "id": "KYCSTATUS-12",
          "screenId": "verification-status",
          "group": "Verification status",
          "title": "Review temporarily unavailable",
          "trigger": "Polling/operation/receipt temporarily unavailable.",
          "result": "Stay PendingReview with safe identity_review_unavailable status; retain resume and backoff.",
          "exit": "Close returns to settings; active states may Cancel; pending review may Check. Result states require a new explicit workflow to retry.",
          "source": {
            "file": "Assets/_Scripts/Sentinel/Runtime/SentinelKycWorkflow.cs",
            "line": 377
          },
          "original": "assets/states/KYCSTATUS12.png",
          "updated": null,
          "checks": [
            "No false rejection",
            "Retry backoff",
            "Check action"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "KYCSTATUS12",
          "captureNote": "Native Unity UI with sample data. This state shares its visual layout with capture KYCSTATUS12. Native original generator; visual sample only. No client, authentication, permissions, camera hardware, legal acceptance or upload."
        },
        {
          "id": "KYCSTATUS-13",
          "screenId": "verification-status",
          "group": "Verification status",
          "title": "Verified",
          "trigger": "Approved session AND approved operation AND fresh receipt redeemed successfully.",
          "result": "Identity verification complete; Check/Cancel hidden.",
          "exit": "Close returns to settings; active states may Cancel; pending review may Check. Result states require a new explicit workflow to retry.",
          "source": {
            "file": "Assets/_Scripts/Sentinel/Runtime/SentinelKycWorkflow.cs",
            "line": 349
          },
          "original": "assets/states/KYCSTATUS13.png",
          "updated": null,
          "checks": [
            "Approval alone is insufficient",
            "Replay receipt blocked",
            "Close"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "KYCSTATUS13",
          "captureNote": "Native Unity UI with sample data. This state shares its visual layout with capture KYCSTATUS13. Native original generator; visual sample only. No client, authentication, permissions, camera hardware, legal acceptance or upload."
        },
        {
          "id": "KYCSTATUS-14",
          "screenId": "verification-status",
          "group": "Verification status",
          "title": "Rejected",
          "trigger": "Session status rejected.",
          "result": "Verification not approved; saved resume cleared; Check/Cancel hidden.",
          "exit": "Close returns to settings; active states may Cancel; pending review may Check. Result states require a new explicit workflow to retry.",
          "source": {
            "file": "Assets/_Scripts/Sentinel/Runtime/SentinelKycWorkflow.cs",
            "line": 345
          },
          "original": "assets/states/KYCSTATUS14.png",
          "updated": null,
          "checks": [
            "Close",
            "New attempt policy separate"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "KYCSTATUS14",
          "captureNote": "Native Unity UI with sample data. This state shares its visual layout with capture KYCSTATUS14. Native original generator; visual sample only. No client, authentication, permissions, camera hardware, legal acceptance or upload."
        },
        {
          "id": "KYCSTATUS-15",
          "screenId": "verification-status",
          "group": "Verification status",
          "title": "Cancelled",
          "trigger": "Cancel verification or account changes.",
          "result": "Cancelled status, active work/images cleared; controls hidden.",
          "exit": "Close returns to settings; active states may Cancel; pending review may Check. Result states require a new explicit workflow to retry.",
          "source": {
            "file": "Assets/_Scripts/Sentinel/Runtime/SentinelKycWorkflow.cs",
            "line": 385
          },
          "original": "assets/states/KYCSTATUS15.png",
          "updated": null,
          "checks": [
            "Cancel in every stage",
            "Close does not cancel",
            "Account switch"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "KYCSTATUS15",
          "captureNote": "Native Unity UI with sample data. This state shares its visual layout with capture KYCSTATUS15. Native original generator; visual sample only. No client, authentication, permissions, camera hardware, legal acceptance or upload."
        },
        {
          "id": "KYCSTATUS-16",
          "screenId": "verification-status",
          "group": "Verification status",
          "title": "Unavailable / interrupted / invalid review",
          "trigger": "Unsupported country/doc, failed grant/upload/camera, incomplete or expired saved session, unknown/terminal review outcome.",
          "result": "Unavailable message; normal gameplay remains available; safe status code; Check/Cancel hidden.",
          "exit": "Close returns to settings; active states may Cancel; pending review may Check. Result states require a new explicit workflow to retry.",
          "source": {
            "file": "Assets/_Scripts/Sentinel/Runtime/SentinelKycWorkflow.cs",
            "line": 410
          },
          "original": "assets/states/KYCSTATUS16.png",
          "updated": null,
          "checks": [
            "Camera permission denied",
            "Camera busy",
            "Startup20s timeout",
            "Capture300s timeout",
            "Background interruption",
            "Invalid resume",
            "Incomplete review"
          ],
          "review": "Not reviewed",
          "revision": "all-screen-audit-v1",
          "captureStatus": "Original Unity fixture captured",
          "runtimeVerified": false,
          "captureKey": "KYCSTATUS16",
          "captureNote": "Native Unity UI with sample data. This state shares its visual layout with capture KYCSTATUS16. Native original generator; visual sample only. No client, authentication, permissions, camera hardware, legal acceptance or upload."
        }
      ],
      "flows": [
        {
          "id": "KYCPOL-FLOW-01",
          "screenId": "verification-policy-review",
          "title": "Review, accept or decline",
          "states": [
            "KYCPOL-01",
            "KYCPOL-02",
            "KYCPOL-04",
            "KYCSTATUS-01",
            "KYCSTATUS-02"
          ],
          "steps": [
            "KYCPOL-01",
            "KYCPOL-02",
            "KYCPOL-04",
            "KYCSTATUS-01",
            "KYCSTATUS-02"
          ],
          "trigger": "Explicit policy acceptance",
          "result": "Create operation/session; decline path ends at KYCPOL-05.",
          "source": {
            "file": "Assets/_Scripts/Sentinel/Runtime/SentinelKycWorkflow.cs",
            "line": 177
          },
          "motion": "Clamped ScrollRect; acceptance disables button and changes status immediately. No acceptance during audit.",
          "recording": null,
          "motionStatus": "Source traced \u00b7 Unity recording pending",
          "runtimeVerified": false
        },
        {
          "id": "KYCSTATUS-FLOW-01",
          "screenId": "verification-status",
          "title": "Capture and review sequence",
          "states": [
            "KYCSTATUS-03",
            "KYCSTATUS-07",
            "KYCSTATUS-08",
            "KYCSTATUS-04",
            "KYCSTATUS-05",
            "KYCSTATUS-06",
            "KYCSTATUS-09"
          ],
          "steps": [
            "KYCSTATUS-03",
            "KYCSTATUS-07",
            "KYCSTATUS-08",
            "KYCSTATUS-04",
            "KYCSTATUS-05",
            "KYCSTATUS-06",
            "KYCSTATUS-09"
          ],
          "trigger": "Valid verification session and explicit capture/use actions",
          "result": "5passport or6other images then submission.",
          "source": {
            "file": "Assets/_Scripts/Sentinel/Runtime/SentinelKycWorkflow.cs",
            "line": 235
          },
          "motion": "Camera preview is live device surface; colour challenges held0.45s before capture; real device permission/camera verification separate.",
          "recording": null,
          "motionStatus": "Source traced \u00b7 Unity recording pending",
          "runtimeVerified": false
        },
        {
          "id": "KYCSTATUS-FLOW-02",
          "screenId": "verification-status",
          "title": "Review, retry and result",
          "states": [
            "KYCSTATUS-10",
            "KYCSTATUS-11",
            "KYCSTATUS-12",
            "KYCSTATUS-13"
          ],
          "steps": [
            "KYCSTATUS-10",
            "KYCSTATUS-11",
            "KYCSTATUS-12",
            "KYCSTATUS-13"
          ],
          "trigger": "Review polling/manualCheck",
          "result": "Only fresh receipt redemption yields Verified; rejection/unavailable separate.",
          "source": {
            "file": "Assets/_Scripts/Sentinel/Runtime/SentinelKycWorkflow.cs",
            "line": 323
          },
          "motion": "Text-state updates; polling5\u219260s backoff, not animation.",
          "recording": null,
          "motionStatus": "Source traced \u00b7 Unity recording pending",
          "runtimeVerified": false
        },
        {
          "id": "KYCSTATUS-FLOW-03",
          "screenId": "verification-status",
          "title": "Cancel, close, reopen",
          "states": [
            "KYCSTATUS-10",
            "KYCSET-06",
            "KYCSTATUS-15"
          ],
          "steps": [
            "KYCSTATUS-10",
            "KYCSET-06",
            "KYCSTATUS-15"
          ],
          "trigger": "Close/reopen or explicitCancel/accountchange",
          "result": "Close preserves flow; Cancel clears operation/resume/images.",
          "source": {
            "file": "Assets/_Scripts/Sentinel/Runtime/SentinelKycSettingsEntry.cs",
            "line": 297
          },
          "motion": "Overlay SetActive; cancellation clears camera overlay. No gameplay gating.",
          "recording": null,
          "motionStatus": "Source traced \u00b7 Unity recording pending",
          "runtimeVerified": false
        }
      ],
      "exclusions": [
        "Training launch confirmation retained but inactive: s_confirmDialog.Init is commented out; direct current flow configures main lobby. Do not count retained LaunchTrainingHunt as active.",
        "Arena old embedded matchmade/friend-ready roots: Prefab retains s_matchmadeVisuals/s_opponentReadyRoot fields no longer present on controllers; active transition is separate BattleArenaLobbyLoadingScreen.",
        "Race loading button retained but not enabled by active manager: s_loadingButton is setfalse in Init and nevertrue by this class. Hidden spinner speed-360 is not an active launch state; launch uses global loader.",
        "Hunt/rematch token coordinator is not lobby authority: Dedicated-server pair management and posthunt/rematch UI are beyond current lobby32-page scope; same wager UI reused, but different authority lifecycle.",
        "Native OS camera permission prompts: System iOS/Android permission dialog and actual camera/mirroring cannot be certified by editor fixture. Use no actual identity or camera data during this audit.",
        "Parked tournament pages and in-match race/game HUD: Existing page catalogue excludes inactive tournament entry; current task covers lobby-side pages and their handoffs, not redesign of full game HUD.",
        "Race leaderboard retained but unwired: Leaderboard root inactive; PrizesTab and Leaderboardtab empty persistent calls. LobbyHoverboardRacingUIManager adds only close/start listeners; no active leaderboard switching route found."
      ],
      "crossChecks": [],
      "entry": "See state triggers and transitions below.",
      "outgoing": [
        "verification-setup",
        "gameplay-settings"
      ]
    }
  }
}