# Demonstrated workflow evidence

The Record & Replay session lasted 11 minutes 39 seconds and contained 67 game-window clicks, 2 drags, and 15 window transitions.

Stable outer workflow:

1. Open BlueStacks Air multi-instance manager.
2. Create a fresh instance with parameterized CPU/RAM, portrait `1440x2560`, and 320 DPI. Standalone and legacy single batch default to 4 CPU cores/4 GB RAM; adaptive dual batch uses 3 CPU cores/3072 MB per engine.
3. Start that exact instance.
4. Complete the new-player flow inside Arena of Valor.
5. Leave the tutorial match unattended for about 6 minutes 44 seconds.
6. Complete post-match reward and first-draw screens.
7. Close the instance.
8. Delete the completed instance in the demonstrated cleanup step.
9. Create the next fresh instance.

Observed cleanup variation: BlueStacks Manager can expose a same-sized pencil button near the stopped row's name plus a collapse chevron after the right-side trash control. Keep exact engine/display-name validation and the single filtered-row checkbox gate, exclude the left-side pencil, and inspect only the row's right-side management cluster. Trash is rightmost when three controls are exposed and second-rightmost when the fourth collapse chevron is exposed. Require BlueStacks' exact delete-confirmation window before confirming.

Important limitation: BlueStacks exposes the game as one `AXWindow`. The event stream recorded timestamps and outer-window targets but no in-game coordinates or screenshots. Use ADB screenshots with native macOS Vision OCR for stable text and visual templates for graphical state; do not convert the 67 unlabeled clicks into blind coordinate replay.

Observed ADB facts:

- BlueStacks instance ports are stored as `bst.instance.<engine>.adb_port` in `/Users/Shared/Library/Application Support/BlueStacks/bluestacks.conf`.
- A running instance uses `/Applications/BlueStacks.app/Contents/MacOS/BlueStacks --instance <engine>`.
- Landscape game input and screenshots use logical `2560x1440` coordinates.
- Immediately after launch, ADB can temporarily return a blank portrait `1440x2560` frame before the game requests landscape. Wait for rotation instead of treating that transient frame as a fatal resolution mismatch.
- Game package: `com.garena.game.kgtw`.
- Allow up to 1600 seconds for the tutorial-battle onboarding stage and 2100 seconds for the staged game workflow as a whole; the batch supervisor retains its larger 3600-second outer watchdog. The MOBA choice and its immediate follow-up are separate 75-second stages, so choosing the wrong tutorial branch cannot consume the full battle allowance.
- Resolve the package launcher and start it with `am start -W`; do not trust `monkey` reporting `Events injected: 1` by itself. One observed run stayed on the portrait BlueStacks Store for the full orientation timeout. Verify that `mCurrentFocus` reaches the game package, retry launch up to three times, and during onboarding relaunch at most twice if a reversed portrait framebuffer belongs to another foreground package.
- Fresh engines 92 and 94 demonstrated a stronger startup failure: `mCurrentFocus` reported `SGameRealActivity`, but `screencap` still showed the portrait BlueStacks Store and the next `input keyevent 3` timed out. Repeating ADB launch commands inside the same stuck player does not recover this state. Preserve a diagnostic frame, restart that exact owned player once under the lifecycle lock, reconnect its ADB transport, and retry the already-installed package; do not delete/recreate the guest unless the bounded restart also fails.
- A BlueStacks host-side modal titled `使用鍵盤和滑鼠進行遊戲` can appear on a fresh engine and pause the player while remaining completely absent from ADB screenshots. Disable per-instance game controls and mark the per-app hint cache complete before first game launch. Retain an exact-window macOS Vision fallback that clicks `繼續` only when both the full modal title and one unique Continue button are recognized in that engine's host window.

Observed pre-battle path:

1. Launch the game package.
2. Dismiss the optional Google Play Games profile prompt.
3. On the login screen, expand additional providers and choose `Guest`.
4. Tap `開始遊戲`.
5. In a dedicated MOBA-choice state, recognize the page-specific `我很熟悉` label (or the same page's `你了解MOBA遊戲嗎？` header as fallback), then tap the fixed lower-right `進入遊戲` target. Never use the left `進入引導` branch and never depend only on the cropped `進入遊戲` button. If the next frame contains `請選擇一個英雄為你出戰`, abort that round immediately because the novice branch was selected.
6. On `進階設置`, keep the default advanced control settings and tap its centered lower `進入遊戲`. A single ADB tap was intermittently ignored in rounds 79, 81, and 86, so stay in this dedicated state and retry at two-second intervals with a six-tap bound. Advance only after `去戰鬥` proves that the page exited; never move into the long onboarding wait merely because one tap was sent.
7. On new-player benefits, tap `去戰鬥`. The same guide can render over a partially downloaded lobby with overlapping `START` art; treat that resource-loading variant as an OR condition and tap the same lower-right target.
8. Tap `開始配隊`, then `準備`.
9. After matchmaking succeeds, tap the centered `準備` button within 30 seconds.
10. Do not choose a hero. Automatic selection occurs after roughly 50 seconds and is simpler and safer than another UI branch.
11. Wait without battle input.

Confirmed post-battle and draw path:

1. Treat the terminal battle outcome (`VICTORY` or `DEFEAT`) as its own confirmed state; both outcomes follow exactly the same continuation path. A single recorded ADB tap did not always leave the outcome screen, so do not enter result handling after merely sending one tap. While either recognized outcome template remains, retry the same lower-center tap at ten-second intervals with a shared six-input limit, and enter result handling only after `請點擊繼續` or `返回大廳` is recognized. Then advance the variable number of victory/team/rating screens while `請點擊繼續` remains visible, using a separate bounded six-input loop. On the scoreboard, choose the centered lower `返回大廳`; do not wait for or branch on a separate MVP step. Both two-page and three-page result sequences have been observed.
2. Complete the forced hero reward screen. Immediately after a fresh account returns from the tutorial scoreboard, wait specifically for the `新手福利中心` guide; the lobby's normal `活動中心` label is already visible before this guide settles and must never skip this state. When the lobby guide first points at the `新手福利中心` gift box with a yellow cursor, tap the gift box. Either hero-reward page can render with its hero art missing; treat the bottom `點擊螢幕任意地方繼續` instruction as the stable OR condition and tap a central safe area. If the reward guide later blocks the back arrow, let the inactivity prompt appear and choose `是` to advance the guide, use the upper-left return arrow on the matchmaking page, return from the benefit page, skip the remaining lobby benefit guide, let the sign-in reward settle, and return to the lobby. The final benefit-page return must advance into a separate lobby-only wait state: the lobby can retain the `新手福利中心` label briefly, and treating that label as another benefit header opens `玩家資料` by tapping the lobby avatar. Recover an already-open `玩家資料` page with one recognized upper-left back action only.
3. Open 活動中心. Its lobby entry can appear either as the earlier purple-backed label or as white `活動中心` text over a hero banner; treat those appearances as OR conditions. The left menu is scrollable and its rows move. OCR the visible `7/25至尊次元突破` label, search with a bounded top-reset then downward scan when absent, and tap the recognized label itself. Only after selection enters a separate state should OCR click `一鍵領取` and save the reward screen. Never combine selection and claim in one state or swipe indefinitely.
4. Return to the lobby and enter 次元突破. The 亥犽 poster artwork may be completely black while resources are missing, so after the recognized lobby entry has completed its page transition, tap the exact center of the game canvas without waiting for poster artwork or `立即前往`. This first tap only starts the resource download: wait two seconds, press the upper-left return control, and continue to the backpack while the download runs in the background. Do not wait for `活動教學` during this first visit. Use the same center tap when re-entering the poster for the draw sequence; only the second visit may show `活動教學`, and it may also go directly to the draw page.
5. Return to the lobby, open 背包, use all three `LSR雙倍卡包`, confirm, and save the reward screen. The result can contain one or two distinct reward types, so recognize the stable `共獲得` prefix and do not require the literal `共獲得2個獎勵`.
6. Re-enter 次元突破, enable `自動轉換`, use the one free draw, then perform three ten-draws. Any of these steps can be interrupted by a gift popup whose stable text is `這是送給您的禮物` while the center reward artwork and reward name vary. Before dismissing it, save a uniquely named screenshot containing the timestamp and engine name; then tap the right-side `確定` and resume the same draw stage. A popup awarded by the previous draw can race with the next ten-draw tap: after dismissing it, require both the `X10抽10次` button and the expected top token count before deciding whether the pending draw was committed. Counts `30→20→10` distinguish the three paid ten-draws. If the count did not decrease, return to and retry that same draw stage; never advance merely because the main draw page reappeared. Do not treat these popup screenshots as jackpot evidence.
7. The third ten-draw triggers one automatic free ten-draw, yielding 41 draws total. Confirm that automatic result first, then save the main draw page (0 badges, prices 9/90) as the final screenshot. The existing first/third-checkpoint jackpot comparison remains authoritative even when one or more gift-popup audit screenshots were captured.

Fresh-instance rule:

- Cloning an instance after guest login also clones its application data and is not a new guest account.
- Use a brand-new engine and install `/Users/longmountain/Downloads/Garena+%E5%82%B3%E8%AA%AA%E5%B0%8D%E6%B1%BA%EF%BC%9A%E5%86%A5%E5%AE%9A%E7%8E%8B%E7%89%8C%E7%89%88%E6%9C%AC_1.63.1.4_APKPure.xapk` by extracting its three APKs and running `adb install-multiple`.
