# QUAD GOD: Stake Engine submit checklist (v1 release, 2026-10-29; Stake review fixes 2026-11-06)

Legend: **[x]** done here · **[ ] JACOB** needs Jacob (Studio account, decisions, outside services).

Release folder: `/root/neo-claw-context/1563660265692860476/quadgod/release/` (also at https://games.bet-llm.com/quadgod/release/)

| File | What it is |
|---|---|
| `quadgod_frontend.zip` | Front end, the exact Stake upload (`node build.mjs --stake`): `index.html` at the zip root, relative URLs, production build. 9.76 MB (9,757,531 bytes), 250 files. sha256 `feb789cd13f91d7c6af286902ce8730fc773a09ce69c8d3e868475c47cacc9f5` (build 202611062251, standard bet bar, see § S; replaces `4b2a1f7f…` from § R) |
| `quadgod_math.zip` | Math (from the math agent): `index.json` + 4 LUTs + 4 `books_*.jsonl.zst` at the zip root (modes base, ante, allnighter, tournament). 147.9 MB (147,906,328 bytes). sha256 `06c5c0663126adf2e7baab2f7956050858c6a4e1ddaf5f3405943617dd2e034f` |
| `tile/` (+ `quadgod_tile.zip`, 0.63 MB) | Tile layers with no text: `tile_bg_3x4.png` (816×1092), `tile_bg_16x9.png` (1280×720), padded square `tile_fg.png` (1440×1440), cuts `tile_fg_3x4.png` / `tile_fg_16x9.png`, preview mocks `tile_mock_*.jpg` (background + foreground only; no title or gradient, which Stake adds). |
| `quadgod_artkit.zip` | Art kit for reviewers (16.0 MB): 38 screens at 2560×1440 (phone 1440×2560 / 2560×1184) of every key moment, every shipped sprite (1x and x4), code-drawn blocks, logo, UI crops, tile layers. |
| `STUDIO_DETAILS.md` | Name, short description, Game details for reviewers, per-mode Game Info, the official disclaimer. |
| `ASSET_LICENCES.md` | Per-asset sources and licences, with the OFL texts. **Read the UNVERIFIED section first.** |

---

## A. Before uploading: open items only Jacob can handle

- [ ] **JACOB: name check.** Post the share link on engineplayers.com/reviews and run its **Name check / Game DNA** for "QUAD GOD". [213] passes locally (no restricted words, no series tie). "Quad" is a common word in block-puzzle slang (a four-line clear), so check for a live title with the same or a near name.
- [ ] **JACOB: Mai art licences.** Every shipped image (92 PNGs: Gamer A ×7 poses + cams, 4 rivals with K.O. and cams, 7 backgrounds × 2 layouts, power-ups, crown, props, logo, key art) **and the tile** are Mai Game Studio output. The studio's model licences are undocumented: ask Mai which models produced the `qg_*` jobs (ids in `ASSET_LICENCES.md` and `tools/studio_manifest.json`) and whether commercial use in real-money gambling is allowed. Audio (100% our synthesis), fonts (OFL) and libraries (MIT / GSAP no-charge) are fine.
- [ ] **JACOB: code-only animation is a review risk.** Gamer A swaps between 7 still poses with a code rig (breathe, bob, squash, headset flies); rivals have still walk-out and K.O. poses; pieces, power-ups and banners move by tweens, squash and particles. No frame animation ships (budget rule: no animation jobs in dev). Reviewers marked code-only motion "poor animations" on MOG CITY (4.3/9), Coin Critters and CORNERED. The production list (with a costed plan to come) is `notes/animation_backlog.md`. Decide: submit now, or productionize the animation first.
- [ ] **JACOB: [253] falling-block / trade-dress.** The core is a falling-block line-clear puzzle, the same family as STACKED. The word "Tetris" (or "-tris", "tetromino") appears nowhere (code strings, rules, titles, shipped file names; checked by grep and by the compliance harness). Trade dress restyled on purpose: 8×16 well (not 10×20), our own block colours, a claw holds the next piece (no next box), target brackets only during a tease (no ghost piece), no garbage rows, no "?" blocks, no real consoles or controllers (original hexagon pad), no Korobeiniki or any recognisable game melody. The mechanic is generic, but [253] reviewers judge "closely resembles an existing game"; the 16-bit retro-gaming theme makes the reference more obvious than STACKED's construction site. Expect the question.
- [ ] **JACOB: base music theme pick.** Candidate **A "PLAYER ONE" is in the zip**; candidate B "HIGH SCORE" is not shipped (listen to both on https://games.bet-llm.com/quadgod/audio/). If you prefer B: ship `music_base_b` instead of `music_base_a` (Stake filter in `build.mjs` + the base candidates in `src/audio.js`), rebuild, re-run the exact-upload suites and re-upload the front end.
- [ ] **JACOB: the 360×640 board width.** On a 360×640 phone (16:9 portrait, e.g. older Androids) the board is 73% of the screen width, not the 87-88% of modern tall phones (390×844, 430×932), because the 16-row well hits the height limit first. Stake's own 425×812 mobile test size gets 76%. Everything fits and plays (viewport check § E); decide whether that is acceptable or worth a dedicated short-phone layout.
- [ ] **JACOB: [217] content glance.** All characters are adults; THE LEGEND (the grand-final rival) has a cigarette in his mouth in his walk-out art (art-kit screen 25). STACKED shipped its host with an unlit cigar the same way. Keep, or ask for a clean variant (Mai, $0).
- [ ] **JACOB: launch plan.** Stake Challenge request, streamer budget, X posts (hooks: "a gamer plays every drop", the LONG BOI, the TOURNAMENT K.O.s).

## B. Studio steps (skill §9)

1. [ ] **JACOB:** Stake Studio → create the game QUAD GOD → **Files** → **Import files**: the `quadgod_frontend.zip` contents as the **front end**, the `quadgod_math.zip` contents as the **math** (both zips are flat, no wrapper folder; folder upload needs Chrome or Edge).
2. [ ] **JACOB:** **Publish new version** (math and front end publish separately).
3. [ ] **JACOB:** **Play Game** against the real RGS and try: one base round; BUY → BOOST on (coin reads OFF, tap it off); BUY → ALL-NIGHTER (100x, a confirm appears); BUY → TOURNAMENT (1,000x, confirm) at the lowest bet; a replay link from the bet history. Expect the intro splash on first load, music after the first tap and a clean console. Test hooks are off on the real RGS (`?timescale`, `?force`, `?skipintro` do nothing; verified on the exact zip, § E).
4. [ ] **JACOB:** **Media → Create tile**: background `tile/tile_bg_3x4.png` (3:4) and `tile/tile_bg_16x9.png` (16:9); foreground `tile/tile_fg.png`, enlarged to fill the red focus box; pick a gradient from the dawn palette (magenta / purple reads well with the sky). Stake adds the title and gradient, so the layers and mocks carry no text. `tile/tile_mock_*.jpg` show background + foreground only.
5. [ ] **JACOB:** cover + details: paste from `STUDIO_DETAILS.md` (name, short description, **Game details**, a **Game Info** description for each of the 4 modes).
6. [ ] **JACOB:** link the art kit (`quadgod_artkit.zip`, e.g. https://games.bet-llm.com/quadgod/release/quadgod_artkit.zip or a Drive link) in the submission notes.
7. [ ] **JACOB:** **Submit for review.**

## C. Pre-submit technical checks (done on the exact zip)

- [x] `index.html` at the zip root, every URL relative (the only absolute strings in `main.js` are the w3.org namespace strings), no source maps, no screenshots, no dev files. The zip holds `index.html`, `main.js` (824 KB), `version.txt`, `fonts/px/` (4 bitmap-font atlases + 2 OFL texts) and `a/` (manifest + 92 images + 133 sounds). Static check `tools/release/check_zip.py`: 9/9.
- [x] No gallery / offline / demo hooks and no in-browser demo RGS (`__GALLERY__` and `__LOCALRGS__` are false, so the code is compiled out); the dev "reset demo balance" item and strings are gone; only the default music ships (8 tracks, `music_base_b` dropped); no `LICENCES` dev ledger.
- [x] `rgs_url` read only from the launch URL; the launcher (`play.html`) is not in the zip.
- [x] Test hooks (`?timescale`, `?ff`, `?skipintro`, `?force`, `__quadgod.beat`, `__quadgod._dbg`, `/paper/*`) switch on only when authenticate returns `meta.paper` (our paper RGS). With it stripped they do nothing: hook gate 5/5 (§ E).
- [x] Console clean: no logs, no Pixi banner, no 404s (every suite checks it).
- [x] Official disclaimer verbatim in the rules (INFO tab). RTP, max win and hit rate per mode are generated at build time from the publish files' LUTs: all 4 modes at 96.50%; max win 10,000x (ALL-NIGHTER 2,305x).
- [x] Every mode has a description and cost in the rules (MODES tab), the buy menu and `STUDIO_DETAILS.md`; the rules have a CONTROLS section for every button.
- [x] Math: `verify_publish.py` ALL CRITICAL CHECKS PASS and `check_books.py` 190,000 / 190,000 books clean (math agent, `math/MATH_REPORT.md`). The exact-upload QA played real books from these publish files.
- [x] Download size: front-end zip 9.8 MB (images 1.5 MB, sounds 8.1 MB MP3 streamed after first paint, `main.js` 0.82 MB).
- [x] Grep of the shipped `main.js` for "stake engine" / "powered by stake": 0 hits (own loader). Banned words (tetris, -tris, tetromino, korobeiniki): 0 hits in any shipped file or name.
- [x] Tile: no text, numbers or multipliers in any layer; mocks are background + foreground only.

## D. Review risks (read before submitting)

- **Animation is code motion only** (§ A). This is the biggest rating risk; the art is pixel stills plus code motion.
- **IP line [253]** (§ A).
- **Pixel art vs the lobby.** About 80% of top Engine tiles are painterly cartoon art; pixel art works best as a deliberate retro nod (skill §7). QUAD GOD is all-in on the retro-gaming theme, so it is deliberate, but it is a style risk with reviewers who mark "low quality assets".
- **Base hit rate 40.21% with most wins below the stake** (SINGLE = 0.5x): shown as plain "RETURNED", which is compliant, but the base game can read as low-paying at first.
- **ALL-NIGHTER max win 2,305x** (the buy's book-level max), not the 10,000x cap; the rules state each mode's own max.
- **No back-to-back bonus or state across bets**: every bonus is inside one book (rules say so).

## E. Test results on the exact upload

Exact upload: `quadgod_frontend.zip` sha256 `415c1317…24aa2e` (same hash as the tested copy `release_test/quadgod_frontend.zip.tested`), unzipped into a fresh `release_test/game/`, served read-only by the local play-money RGS (`game/stake/quadgod_rgs.py`, bound to 127.0.0.1, serving the real `math/publish_files`: 190,000 books). Every suite ran once under the heavy lock. Logs and screenshots: `game/shots/release/`.

| Suite | Result | Notes |
|---|---|---|
| Static zip check (`check_zip.py`) | 9/9 PASS | 247 files, 9.70 MB |
| Compliance (`compliance_release.py`) | 31/31 automated PASS; 3 replay checks PASS by screenshot | Wallet calls counted from the network. The 3 replay checks read drawn text, which needs the test hooks; a replay has no authenticate, so on the Stake build the hooks are correctly off and the harness reads nothing. Screenshots show every point: `9_replay_ready.png` (400×225: "REPLAY · ALL-NIGHTER · BET €5.00 · REAL COST €500.00", PLAY), `9_replay_done.png` ("REPLAY COMPLETE · WIN €985.00 · TAP AGAIN TO REWATCH", AGAIN button), `9_replay_invalid.png` ("This replay could not be found." dialog). Replay sent no wallet calls (automated PASS). |
| Social sweep (`social_release.py`, XSC) | PASS: 0 restricted phrases, 325 strings | Intro, menus, rules, buy menu + confirms, BOOST, a forced big win, a bought ALL-NIGHTER and TOURNAMENT (real books). Replay strings can't be captured on the Stake build (hooks off, see above); the same code passed the hosted-build sweep. The first run crashed on a harness bug (missing regex) before testing anything; it was fixed and the sweep ran once. |
| Real input, desktop | 18/18 PASS | real mouse and keyboard, $1,000 paper balance |
| Real input, iPhone (touch emulation) | 18/18 PASS | |
| Music start | 4/4 PASS | ~2 Mbps link: base music 4.8 s after the first tap; ALL-NIGHTER plays its own tracks (chill + hype), back to base after; console clean |
| Viewports | 12/12 PASS | 390×844, 430×932, 360×640, 425×812, 820×1180, 844×390, 667×375, 400×225, 800×450, 1024×576, 1280×720, 1920×1080: no scroll, touch-action none, every control on screen, nothing over the board, no overlaps, console clean. Board width: 88% / 87% (390 / 430 wide), 76% (425×812), 73% (360×640) |
| Hook gate (meta stripped) | 5/5 PASS | no `_dbg`/offline/demo/music hooks, `beat()` refuses, `?timescale=20` ignored (3.2 s round), no `/paper/*` request, console clean |

## F. Stake AI review prompt self-check (`reference/stake_ai_review_prompt.md`)

Run against the exact upload (paper RGS) and the source. **Summary: 30 PASS · 0 FAIL · 1 AT RISK · 1 NEEDS A HUMAN · 1 N/A.**

| ID | Guideline | Verdict | Evidence |
|---|---|---|---|
| 181 | Authenticates on launch | PASS | compliance § E |
| 274 | Invalid rgs_url fails correctly | PASS | connection-error screen, no bet bar |
| 183 | Bet sends a successful play | PASS | space / SPIN → one `/wallet/play` |
| 275 | No Stake Engine loader | PASS | 0 hits for "stake engine" / "powered by stake"; own QUAD GOD loader and intro |
| 213 | Title unique, no restricted terms | PASS (locally) | "QUAD GOD"; engineplayers Name check is Jacob's step (§ A) |
| 217 | No offensive content | NEEDS A HUMAN | adult gamers only, no minors, gore or sexual content; THE LEGEND has an unlit cigarette in his walk-out art |
| 253 | Distinct from existing titles | AT RISK | falling-block line-clear mechanic; trade dress restyled (§ A) |
| 242 | Uses every bet parameter | PASS | 40-level rewrite: opens on the default, clamps to min / max |
| 187 | Active round restores its bet | PASS | end-round blocked + reload → resumed at its own bet and settled |
| 219 | Currencies | PASS | USD, EUR, CAD (CA$), MXN (MX$), JPY and KRW (0 dp); XSC → SC |
| 221 | Zero-win sends no end-round | PASS | compliance [221] |
| 222 | Insufficient balance sends no play | PASS | balance 0 → "INSUFFICIENT BALANCE", 0 plays |
| 228 | Space bar bets | PASS | compliance [183][228] |
| 227 | Main frame doesn't scroll | PASS | 12 viewports |
| 104 | Autoplay needs confirmation | PASS | AUTO opens a panel; START needed |
| 31 | High-cost modes confirm | PASS | ALL-NIGHTER 100x and TOURNAMENT 1,000x confirm; BOOST 1.5x is a toggle |
| 107 | Sound can be turned off | PASS | MENU → SOUND OFF mutes the master bus (SFX and music both route through it) |
| 25 | RTP and max win stated | PASS | MODES tab, generated from the LUTs (4 modes) |
| 24 / 26 | Payouts and win combinations explained | PASS | paytable: SINGLE / DOUBLE / TRIPLE / QUAD / PERFECT CLEAR at the current bet, combo ladder, power-ups; pieces pay nothing by type |
| 27 | Every mode has description and cost | PASS | MODES tab + buy menu; costs match `index.json` |
| 29 | Free games and re-triggers | PASS | BONUSES tab: ALL-NIGHTER 3 crowns / 10 spins / +3; TOURNAMENT 4+ crowns, spins per match, +1 per K.O. |
| 235 | Every control explained | PASS | rules INFO → CONTROLS |
| 185 | General disclaimer | PASS | verbatim in INFO |
| 266 | Mystery Mode chances | N/A | no mystery mode |
| 193 | Laptop 1024×576 | PASS | compliance + viewports |
| 195 | Popout S 400×225 / L 800×450 | PASS | compliance + viewports |
| 194 | Mobile 425×812 | PASS | compliance + viewports |
| 223 | No double-tap zoom | PASS | `user-scalable=no`, `touch-action: none` |
| 239 / 240 | English; invalid language OK | PASS | English only; `lang=fr` → English (replay test) |
| 77 | Social wording | PASS | social sweep NONE (325 strings) + compliance [77][225] |
| 78 | SC/GC, no "$" | PASS | compliance [78] |
| 171-174 | Replay | PASS | no wallet calls (automated); bet + real cost, PLAY AGAIN, missing-event error (screenshots, § E) |
| 273 | Sub-cent payouts | PASS | `money()` in `src/platform.js` adds decimals until the amount is exact |

## R. Stake review feedback (from STACKED, 2026-11-06) and fixes in this zip

Stake's reviewers flagged two things on STACKED, the game QUAD GOD was forked from. Both are fixed here before QUAD GOD gets the same note.
1. **Balance must show 2 decimals** ("wins may show up to four decimal places, the balance must be displayed with two"). The BALANCE readout and the NET position now use `money(v, {balance:true})`: exactly the currency's decimals, rounded down with integer maths on micros (USD $997.009 → $997.00, JPY 0 decimals, KWD 3). Wins keep their sub-cent digits.
2. **Replay must closely resemble Stake's example card.** A replay now opens on the "Bet Replay" card: Mode / Base Bet / Cost Multiplier / Total Bet Cost (highlighted) / Payout Multiplier / Total Win (green), "▶ Start Replay", and the footer "This is a replay of a previous bet round. No bets will be placed." Social mode uses Stake's wording: Base Play / Feature Multiplier / Total Play Worth / Final Multiplier. During playback a strip at the top shows mode, base bet, cost multiplier and total cost. After the round the card returns with "▶ Replay Again". It fits popout S (400×225, two columns). No wallet calls are made.

Tests:
- Hosted demo (`tools/compliance_test.py`, replay section rewritten for the card plus a social card): **35 PASS · 0 FAIL**.
- Exact zip (sha `4b2a1f7f2eec0075…`, served by `game/stake/quadgod_rgs.py` on 127.0.0.1 against the real publish files): `replay_card_check.py` **16/16** (6 viewports × real/social, Start → Replay Again, 0 wallet calls). Screenshots are in `game/shots/replay_card/`.
- The previous zip (sha `415c1317…24aa2e`) and its source are backed up in `../.backup_release1/`. Math is unchanged: `quadgod_math.zip` stays as it is.

## S. Standard bet bar (2026-11-06, build 202611062251)

Jacob asked for the standard Pragmatic-style bet bar used on STACKED in place of the old pixel bar. This zip has it:
- A crisp DOM bar over the pixel canvas, scaled like STACKED's (design 1920×1080 landscape, 1080×1700 portrait), in Inter (SIL OFL, added to `ASSET_LICENCES.md`).
- Landscape: round BUY BONUS coin · ☰ menu · BALANCE · WIN · BET chip with ▲▼ · turbo · big SPIN · autoplay.
- Phone portrait: a readout row (BALANCE · WIN · BET ▲▼) above a controls row (BUY BONUS · ☰ · SPIN · turbo · autoplay).
- Turbo and autoplay are on the bar in every layout, so they are no longer in the menu. The BOOST toggle turns the coin to OFF + mode name and SPIN magenta. In replay the balance and bet controls are hidden and SPIN reads PLAY / AGAIN.
- The bar hides while a panel is open. Panels now use the full screen height.

Tests on this build:
- `tools/compliance_test.py` (local build; bar checks updated for turbo/auto on the bar): **35 PASS · 0 FAIL**.
- `tools/real_input.py` (real taps on the DOM bar): desk **18/18**, iPhone **18/18**.
- Exact zip (sha `feb789cd…`) on `game/stake/quadgod_rgs.py`: `replay_card_check.py` **16/16**.
- Screenshots checked at 1920×1080, 1280×720, 1024×576, 844×390, 400×225, 425×812, 390×844, 360×640.
- The previous zip (sha `4b2a1f7f…`) is backed up as `../.backup_release1/quadgod_frontend_20261106_cardfix.zip`. Math is unchanged.
