# QA checklist Internal review pass, run after automated checks have passed. Every box is verified by hand; automation covers the mechanical rules, not these. Reviewer records outcome as **approved** or **rejected with reasons**. Vague rejections are not acceptable — the developer must know exactly what to fix. --- ## Setup - [ ] Bundle extracted, `bananai.json` matches the submitted metadata - [ ] Automated check report reviewed, no overrides applied silently - [ ] Staging deploy reachable ## Functional - [ ] Loads standalone from `index.html` - [ ] Loads embedded in the shell modal - [ ] A full run can be completed start to finish - [ ] Game over fires and reports a plausible score - [ ] `bananai:restart` restarts cleanly, with no state leaking from the previous run - [ ] Closing the modal stops audio and the game loop - [ ] Reopening after close starts fresh - [ ] No console errors or warnings during a full session ## Devices Real hardware, not emulation. - [ ] Desktop Chrome, 1920×1080 - [ ] Desktop Firefox - [ ] Desktop Safari - [ ] iPhone Safari, portrait and landscape - [ ] Mid-range Android Chrome, portrait and landscape - [ ] 320px viewport width — nothing clipped or unreachable - [ ] Resize mid-game does not break rendering or input ## Sizing The failure mode here is silent: the game looks fine until it is given less room than it assumed, and then loses whatever it draws near an edge. - [ ] No `min-width`, `min-height`, `aspect-ratio` or fixed pixel size on the game's root element - [ ] No `position: fixed` anywhere in the game's CSS - [ ] Styles scoped under a game-specific class; `html`, `body` and `:root` untouched for dimensions, overflow and positioning - [ ] `minSize` declared in the manifest and honest - [ ] Canvas height equals frame height — check `canvas - frame` in `/debug-mobile.html`, which must read 0 - [ ] No internal scrolling inside the game document - [ ] **Rotate the device mid-game**: canvas resizes, and every entity is repositioned. Nothing ends up off-screen, nothing stays at an old offset. - [ ] Play in fullscreen and exit again; layout survives both transitions ## Performance - [ ] Stable 30fps minimum on the mid-range Android reference device - [ ] Interactive within 3s on throttled 4G - [ ] Bundle size within limits - [ ] No memory growth across three consecutive runs ## Network isolation - [ ] DevTools network tab shows zero requests outside `bananai.games` and CDN - [ ] Game works with the network disabled after first load - [ ] No `localStorage` writes outside the `game::` namespace ## Sandbox compliance - [ ] No attempt to reach `window.parent` outside the SDK - [ ] No attempt to navigate the top-level window - [ ] No cookie access - [ ] SDK calls present and correctly sequenced ## Audio - [ ] Silent until first user interaction - [ ] Mute control present and working - [ ] Mute state survives restart - [ ] Audio stops on modal close ## Accessibility - [ ] Playable with keyboard where the genre allows - [ ] Text legible at default zoom, contrast ratio at least 4.5:1 - [ ] No content relying on colour alone - [ ] No flashing above three per second — this is a seizure risk, not a preference ## Content - [ ] Matches the declared age rating - [ ] No prohibited content - [ ] Asset licences declared and plausible - [ ] No third-party trademarks - [ ] Instructions accurate and complete in both IT and EN ## Catalogue readiness - [ ] Thumbnail supplied, 400×400, readable at card size - [ ] Title and description free of typos in both languages - [ ] Category correct - [ ] Game ID follows convention and is not already taken --- ## Outcome ``` Game: v Reviewer: Date: Result: approved | rejected Blocking issues: 1. ... Non-blocking notes: 1. ... ```