# STACKED: Stake Engine submit checklist (v2 release, 2026-10-25; review fixes 2026-11-06)

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

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

| File | What it is |
|---|---|
| `stacked_frontend.zip` | Front end: `index.html` at the zip root, relative URLs, production build. 5.1 MB (fourth build, 2026-11-06: Stake review fixes, see § R). sha256 `496030579b1992215ba93b02e8082c7abb7e3fb948cf655d65144b9f6157bb7b` |
| `stacked_math.zip` | Math: `index.json` + 5 LUTs + 5 `books_*.jsonl.zst` at the zip root (modes base, ante, shift, longboi, topout). 153.6 MB. sha256 `f0f0f5c8593b…5a5d` |
| `tile/` (+ `stacked_tile.zip`, 3.0 MB) | Tile layers with no text: `tile_bg_3x4.png` (816×1092), `tile_bg_16x9.png` (1280×720), padded square `tile_fg.png` (1400×1400), cuts `tile_fg_3x4.png` / `tile_fg_16x9.png`, preview mocks `tile_mock_*.jpg` (background + foreground only; no title or gradient, which Stake adds). |
| `stacked_artkit.zip` | Art kit for reviewers (18.8 MB): 19 screens at 2560×1440 (phone 1440×2560 / 2560×1184) of every key moment, transparent in-game sprites, logo, tile layers, UI crops. |
| `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. **Read the UNVERIFIED section first.** |

---

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

1. **"Game displays sub-cent payouts correctly":** *wins may show up to four decimals, but the balance must be shown with two decimal places* (we showed `$997.009`).
   Fix: the balance (and the NET position when `displayNetPosition` is set) always shows exactly the currency's decimals (2 for USD/EUR, 0 for JPY/KRW, 3 for KWD), rounded down so it never shows more than the player has. Wins and the WIN field keep their sub-cent digits.
2. **"UI clearly displays bet cost and applied multiplier":** *the replay must closely resemble Stake's example card, with all required information visible during the replay; on stake.us use Base Play / Feature Multiplier / Total Play Worth / Final Multiplier.*
   Fix: replays open on Stake's card. It has a REPLAY badge and the "Bet Replay" title, then the rows Mode, Base Bet, Cost Multiplier, **Total Bet Cost**, Payout Multiplier and **Total Win** (green), then ▶ Start Replay and the footer "This is a replay of a previous bet round. No bets will be placed."
   - After the round, the card returns with ▶ Replay Again.
   - During playback, a strip at the top keeps mode, base bet, cost multiplier and total bet cost on screen.
   - In social mode the labels are Base Play / Feature Multiplier / Total Play Worth / Final Multiplier, the title is "Replay", the footer reads "This is a replay of a previous round. Your balance is not used." and amounts show in SC.
   - The card fits popout S (400×225, in two columns) up to 4K.
   - Also fixed: "LOADING REPLAY…" no longer shows behind the replay-not-found box.

Retested on this exact zip (unzipped to `release_test/game/`, paper RGS): **compliance 36/36**. That includes the new replay-card checks (all six rows with the right values at popout S, Replay Again, no wallet calls) and a stake.us card wording check. A separate card check passed **16/16**: real and social mode at 400×225, 800×450, 1920×1080, 390×844, 425×812 and 360×640, each fitting with no scrolling, plus Start → Replay Again with 0 wallet calls. A unit test confirmed balance formatting: `997.009` → `$997.00`, JPY `¥1,234`, KWD `KD1.234`.

## A. Before uploading: decisions only Jacob can make

- [ ] **JACOB: licences.** Read `ASSET_LICENCES.md` § "UNVERIFIED: Jacob to decide".
  - **All shipped art is Mai Game Studio output** (27 images: Big Rocco ×3 poses, 7 block materials + the plain girder tile, HARD HAT, 6 power-up badges, crane hook, frame, logo, 6 backgrounds) **and the tile** (background + foreground). The studio's model licences are undocumented: ask Mai which models produced the `f_*` / `t_tile_*` jobs and whether commercial use in real-money gambling is allowed.
  - **Music is OK as shipped:** the 5 tracks in the zip are code-composed (own work over CC0 samples). The Mai studio music candidates are not in the zip; if you pick one instead, it needs the same Mai answer.
  - Everything else (74 SFX, fonts, libraries) is CC0 / OFL / MIT / own work.
- [ ] **JACOB: name check.** Post the share link on engineplayers.com/reviews and run its **Name check / Game DNA** for "STACKED". [213] passes locally (no restricted words, no series tie). For [253]: "Stacked" is a common slot word (e.g. "stacked wilds"); check for a live title with the same or a near name.
- [ ] **JACOB: IP comfort level.** The core mechanic is a falling-block line-clear puzzle (see § D, review risks). Trade-dress elements were restyled on purpose; decide whether you are happy to submit as is.
- [ ] **JACOB: launch plan.** Stake Challenge request, streamer / Watchtower budget, X posts (hook: "line clears instead of paylines", the LONG BOI girder, the TOP OUT ceiling break into orbit).

## B. Studio steps (skill §9)

1. [ ] **JACOB:** Stake Studio → create the game STACKED (or open it) → **Files** → **Import files**: the `stacked_frontend.zip` contents as the **front end**, the `stacked_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 BONUS → DOUBLE SHIFT (10x, confirm appears); OVERTIME on (coin reads DISABLE, tap it off); a LONG BOI buy; a replay link from the bet history. Expect the intro splash on first load and a clean console. Test hooks are off on the real RGS (`?timescale`, `?force`, `?skipintro` do nothing; verified, § 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; gradient from the warm sunset palette (orange / dusky red works 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 5 modes).
6. [ ] **JACOB:** link the art kit (`stacked_artkit.zip`, e.g. 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 (no absolute host or path in `main.js`, only library doc strings); no source maps; no screenshots; no dev files. The zip holds `index.html`, `main.js`, `version.txt`, `fonts/` (3 WOFF2 + 2 OFL texts) and `a/` (manifest + 27 images + 78 sounds).
- [x] No gallery / offline / demo hooks (`__GALLERY__` false: compiled out), no dev music candidates (only the 5 default tracks), no `LICENCES.md` dev ledger.
- [x] `rgs_url` read only from the launch URL; the launcher (`play.html` / `rgs.json`) is not in the zip.
- [x] Test hooks (`?timescale`, `?ff`, `?skipintro`, `?force`, `__stacked.beat`, `__stacked._dbg`, `/paper/force`) only switch on when authenticate returns `meta.paper` (our paper RGS); with it stripped they do nothing (§ E).
- [x] Console clean: no logs, no Pixi banner, no 404s.
- [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 5 modes at 96.50%.
- [x] Every mode has a description and cost in the rules (MODES and BONUSES tabs), the buy menu and `STUDIO_DETAILS.md`. Rules now include a CONTROLS section covering every button.
- [x] `verify_publish.py` on the unzipped `stacked_math.zip`: ALL CRITICAL CHECKS PASS (§ E). No `publish_files_v1` content in the zip.
- [x] Download size: front-end zip 5.1 MB (first paint: `main.js` 0.82 MB + boot images 0.61 MB + fonts 0.09 MB; SFX 1.9 MB, music 2.1 MB and the bonus backgrounds 0.29 MB stream in after first paint).
- [x] Bet bar follows the Hacksaw HUD spec (BUY BONUS coin, ☰, BALANCE | WIN, BET chip with ▲▼, turbo, ring SPIN, autoplay; OVERTIME's name replaces BET and the coin flips to DISABLE).
- [x] Tile: no text, numbers or multipliers in any layer; the background is bright to the edges (warm sunset sky).
- [x] Fixed in this zip (2026-10-25, second build): the BACK-TO-BACK line is gone from the rules and paytable (the books never produce it); the CEILING BREAK banner subtitle now sits on two lines inside its plate (the plate is sized from rendered bounds); the unused `pu_paint` / `pu_rotate` badges are no longer shipped.

## D. Review risks (read before submitting)

- **Animation is code motion only.** Rocco has three static poses with a code rig (breathe, bob, lean, sweat); pieces, power-ups and banners move by tweens, squash and particles. Frame animation is deferred to productionizing under the budget rule (list in `notes/animation_backlog.md`). Reviewers have marked code-only motion "poor animations" before (MOG CITY 4.3/9, Coin Critters, CORNERED). This is the biggest rating risk.
- **Back-to-back QUAD:** the books never produce one, so it was removed from the rules, the paytable and `STUDIO_DETAILS.md` (the front end's handler stays but can never fire). No player-facing text promises it.
- **IP line.** The word "Tetris" appears nowhere (code strings, rules, titles, file names that ship; checked by grep and by the compliance harness). Trade-dress elements are restyled: an 8×16 well (not 10×20), our own material/colour map (red girder, blue glass, yellow hazard, orange brick, green plate, violet neon, teal concrete), the next piece hangs from a crane hook (no preview box), no ghost piece (a blueprint outline only during a tease), no Korobeiniki. The falling-block line-clear mechanic itself is generic, but [253] reviewers judge "closely resembles an existing game"; expect the question.
- **Host smokes a cigar** (unlit, in the mouth) in the art and the tile. Not listed as prohibited, but [217] is a human judgement.
- **Hit rate 40% with most wins below the stake** (~85% of clears are singles at 0.5x): shown as plain "RETURNED", which is compliant, but the base game reads as low-paying at first; the base RTP split is 48% base / 48% bonuses.
- **LONG BOI max win is 1,735.5x** (the buy's book-level max), not the 10,000x cap; the rules state each mode's own max.

## E. Test results on the exact upload

`stacked_frontend.zip` (sha256 `ec0adb05bfb0d0ceee8efdf22c8ba29cce9afb0878ed7f026561f0830d4b6ea1`) unzipped into a fresh folder `/var/www/philip-resume/stacked/release_test/game/` with the paper-RGS launcher next to it (https://games.bet-llm.com/stacked/release_test/play.html → same-origin route `games.bet-llm.com/stacked/rgs`). Each suite ran once on that folder, 2026-10-25; after the second build (B2B text removed, CEILING BREAK banner fixed, unused badges dropped) compliance and the social sweep were rerun once on the new zip, and again (with the music check) on the third build (music start fix + new coin sounds).

- [x] `verify_publish.py` on the unzipped `stacked_math.zip`:
```
base        rounds=  80000 RTP=96.5000% maxWin=10,000.0x (1 in 3,745,027) sd/cost=17.108 zero=0.598 win=0.140 cave-in=0.000 motherlode=1/1,000,000,000,000 rush=1/1,000,000,000,000 OK
ante        rounds=  80000 RTP=96.5000% maxWin=10,000.0x (1 in 1,872,513) sd/cost=15.747 zero=0.596 win=0.062 cave-in=0.000 motherlode=1/1,000,000,000,000 rush=1/1,000,000,000,000 OK
shift       rounds=  18430 RTP=96.5000% maxWin=10,000.0x (1 in 374,503) sd/cost=4.966 zero=0.001 win=0.081 cave-in=0.000 motherlode=1/1,000,000,000,000 rush=1/1,000,000,000,000 OK
longboi     rounds=  15000 RTP=96.5000% maxWin=1,735.5x (1 in 31,267) sd/cost=0.873 zero=0.000 win=0.312 cave-in=0.000 motherlode=1/1,000,000,000,000 rush=1/1,000,000,000,000 OK
topout      rounds=  15000 RTP=96.5000% maxWin=10,000.0x (1 in 1,560) sd/cost=1.604 zero=0.000 win=0.240 cave-in=0.000 motherlode=1/1,000,000,000,000 rush=1/1,000,000,000,000 OK
base mode 1.0x present: True
ALL CRITICAL CHECKS PASS
```
- [x] `compliance_test.py`: **35 PASS · 0 FAIL**. Covers authenticate on launch, intro first, the >2× confirms (DOUBLE SHIFT 10x, LONG BOI 100x, TOP OUT 400x), OVERTIME arm/DISABLE, space bar, end-round only on paying rounds, the autoplay panel, the disclaimer, RTP + max win for all 5 modes from the publish files, every mode described, no forbidden title words, console clean, 5 viewports (400×225, 800×450, 425×812, 1920×1080, 844×390), 5 currencies, social wording + SC, bonus-buy replay at popout S (no wallet calls, bet + real cost, play again), missing-replay error, bad `rgs_url`, insufficient balance, 40-level bet menu, resume of an unfinished round at its own bet.
- [x] `social_sweep.py`: restricted phrases **NONE** (439 strings: intro, menus, all rules tabs, settings, autoplay, bet menu, buy menu + every confirm, OVERTIME armed, a big win, base rounds, a bought LONG BOI, TOP OUT and a DOUBLE SHIFT with a bonus inside, and a social replay).
- [x] `music_start_release.py` (launcher + paper RGS, network throttled to ~2 Mbps / 150 ms): **4/4**: base music playing 3.4 s after the first (intro) tap, a forced LONG BOI buy plays `music_longboi`, the base track is playing again after the bonus, console clean.
- [x] `hook_gate.py` (run on the first release build; the second build changed only rules text, a banner layout and two images, not the hook gating) (authenticate with `meta.paper` stripped, launch URL with `?timescale=20&skipintro=1&ff=1&force=1&music=base:B`): **6/6**: skipintro ignored, no `_dbg` / offline / demo / music / beat hooks, a round plays at normal speed (7.6 s), no `/paper/*` request, console clean.
- [x] Real input (iPhone 13 touch profile, same code, hosted build, earlier today): 18/18 incl. bet chevrons, autoplay, OVERTIME, LONG BOI and DOUBLE SHIFT buys.

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

Run against the release build and the exact-upload folder (game run with the paper RGS, plus code reading). **Summary: 42 PASS · 0 FAIL · 1 AT RISK · 1 NEEDS A HUMAN · 1 N/A.**

| ID | Guideline | Verdict | Evidence |
|---|---|---|---|
| 181 | Authenticates on launch | PASS | compliance § E; `src/main.js` boot() → `RGS.authenticate` |
| 274 | Invalid rgs_url fails correctly | PASS | `rgs_url=example.invalid` → CONNECTION ERROR screen, no bet bar |
| 183 | Bet sends a successful play | PASS | space/SPIN → one `/wallet/play` |
| 275 | No Stake Engine loader | PASS | grep of the shipped `main.js` for stake engine / powered by stake: 0 hits; own STACKED loader |
| 213 | Title unique, no restricted terms | PASS (locally) | "STACKED"; engineplayers Name check is Jacob's step (§ A) |
| 217 | No offensive content | NEEDS A HUMAN | adult cartoon host, no minors/gore/sexual content; he chews an unlit cigar (art + tile) |
| 253 | Distinct from existing titles | AT RISK | falling-block line-clear mechanic resembles a famous puzzle game; trade dress restyled (§ D) |
| 242 | Uses every bet parameter | PASS | 40-level rewrite: opens on 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, MXN, JPY (0 dp), KRW; XSC/XGC → "SC"/"GC" (`src/platform.js` CUR table) |
| 273 | Sub-cent payouts | PASS | `money()` adds decimals until the value is exact (`src/platform.js`) |
| 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 | keydown on window, `preventDefault` |
| 227 | Main frame doesn't scroll | PASS | scrollHeight ≤ innerHeight at every viewport |
| 104 | Autoplay needs confirmation | PASS | AUTO opens a panel; START needed |
| 31 | High-cost modes confirm | PASS | DOUBLE SHIFT 10x, LONG BOI 100x, TOP OUT 400x confirm; OVERTIME 1.5x does not need it |
| 107 | Sound can be turned off | PASS | SETTINGS → SOUND OFF sets the master gain to 0; every source (SFX, loops, music, fanfare) goes through the master |
| 25 | RTP and max win stated | PASS | MODES tab, generated from the LUTs |
| 24 | Every symbol's payout shown | PASS | pieces pay nothing by type (stated in the paytable); line pays SINGLE–QUAD and 5+ row pays listed with values at the current bet |
| 26 | Win combinations explained | PASS | paytable + BASE GAME tab (line clears, gravity, combo, perfect clear, multipliers) |
| 27 | Every mode has description and cost | PASS | MODES tab + BONUSES tab; costs match `index.json` |
| 29 | Free games and re-triggers | PASS | BONUSES tab: LONG BOI 3 hard hats / 10 spins / +5, TOP OUT 4+ / 5 spins / +2, level-ups +2, ceiling-break reset |
| 235 | Every control explained | PASS | rules INFO → CONTROLS (SPIN, BET ▲▼ + list, TURBO, AUTOPLAY, BUY BONUS / DISABLE, MENU, SETTINGS sound/music, balance/win, close) |
| 185 | General disclaimer | PASS | verbatim in INFO |
| 266 | Mystery Mode chances | N/A | no mystery mode (index.json: base, ante, shift, longboi, topout) |
| 193 | Laptop 1024×576 | PASS | compliance screenshots |
| 195 | Popout S 400×225 / L 800×450 | PASS | compliance |
| 194 | Mobile 425×812 | PASS | compliance (portrait layout) |
| 223 | No double-tap zoom | PASS | `user-scalable=no`, `touch-action: none` |
| 239 | English supported | PASS | English UI |
| 240 | Invalid language OK | PASS | `lang=zz` / `lang=fr` → English |
| 77 | Social wording | PASS | social sweep NONE (439 strings) |
| 78 | SC/GC, no "$" | PASS | compliance [78]; XGC by code |
| 225 | Mode names use social wording | PASS | BASE, OVERTIME, DOUBLE SHIFT, LONG BOI, TOP OUT; coin reads GET BONUS |
| 188 | Replay has no restricted words | PASS | social replay in the sweep |
| 171 | Replay URLs load and play | PASS | longboi replay at popout S |
| 172 | Optional params applied | PASS | currency EUR, amount 5.00, lang fr |
| 173 | Replay can be watched again | PASS | PLAY AGAIN |
| 174 | Bet cost and multiplier shown | PASS | "REPLAY · LONG BOI · BET €5.00 · REAL COST €500.00" |
| 243 | Replays at popout S | PASS | 400×225 |
| — | Bonus floors / max win wording | PASS | rules: bought bonuses win ≥ 10x; max win 10,000x, round ends at the cap |
| — | No gamble / jackpot / cashout / state across bets | PASS | DOUBLE SHIFT's 10 rolls are one bet inside one book |
| — | Wins ≤ stake not celebrated | PASS | "RETURNED $X", no banner/fanfare/coins below the round cost |
| — | High-cost confirmation per session | PASS | first play of each >2× mode |

**For a person to check:** [217] look at Big Rocco and the tile (cigar); [253] decide on the mechanic resemblance and run engineplayers' Game DNA; listen once with sound on (levels were measured, not ear-checked) and confirm SOUND OFF mutes everything including big wins.

**Rebuild later on 2026-11-06 (build 202611061252, sha `496030579b199221…`):** the balance floor now uses integer maths on micros. The earlier float version showed some balances over $100k one cent low ($1,234,567.89 showed as $1,234,567.88). The other games' audit caught this. Retested on the exact zip: compliance **36 PASS · 0 FAIL**, `replay_card_check.py` **16/16**. Zip sha `3bc23000…` from earlier today is superseded and should not be uploaded.
