# CANNIBAL ISLAND: Stake Engine submit checklist (first submission)

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

This pack was built 2026-11-09 while nobody was awake. Nothing has been uploaded to Stake Studio or posted anywhere: a human does the upload.

Release folder: `/var/www/philip-resume/cannibalisland/release/` (also at https://games.bet-llm.com/cannibalisland/release/). The game's source is in `/root/neo-claw-context/1569255180405440584/cannibal/`, and the build and QA notes are in `cannibal/game/DEPLOY_NOTES.md`.

| File | What it is |
|---|---|
| `cannibalisland_frontend.zip` | Front end: `index.html` + `main.js` at the zip root, every URL relative. **10.8 MB (10,806,985 bytes, 317 files), sha256 `72731dd8c77f6fde7139a124f5d84949ef86f41b5b80f8fa991c1c55532e7852`.** Built with `node build.mjs --release`. |
| `cannibalisland_math.zip` | Math: `index.json` + 3 LUTs + 3 `books_*.jsonl.zst` (base, ante, bonus) at the zip root, with no wrapper folder. **54.8 MB (54,805,695 bytes), sha256 `5b35691e…8e60`.** |
| `cannibalisland_tile.zip` | Tile with no text, under `tile/`: <ul><li>layers `tile_bg_3x4.png` (1196×1600), `tile_bg_16x9.png` (1920×1080), `tile_fg_3x4.png` and the padded square foreground `tile_fg.png` (1385×1385);</li><li>flattened exports 3:4 at 408×546 / 816×1092 / 1224×1638 and 16:9 at 640×360 / 1280×720;</li><li>preview mocks with the red focus box, `tile_mock_*.jpg`.</li></ul> **17.0 MB (17,035,551 bytes)**; every file is under 10 MB. |
| `profile/` | Studio profile: `banner_1920x1080.jpg` (with logo), `banner_1920x1080_clean.jpg`, `logo_cutout.png`, `tagline.txt` (322/400 chars), `description.txt` (1674/2000 chars), `PROFILE.md`. |
| `STUDIO_DETAILS.md` | Name, short description, Game details (reviewer text), Game Info per mode, volatility, the max win / RTP table. |
| `ASSET_LICENCES.md` | Per-asset sources and licences. **Read the AI-art section first** (86 items are waiting on Jacob's OK). |

---

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

- [ ] **JACOB: RTP and max win sign-off.**
  - The math was built to the defaults: **96.50% RTP in every mode, max win 10,000x**.
  - Nobody has signed these off. If either changes, the math is re-run, both zips are rebuilt and STUDIO_DETAILS changes.
- [ ] **JACOB: AI art licence.** ASSET_LICENCES has **86 "AI art pending"** entries: 47 game images plus 39 rig textures. All are Game Studio (Mai) output, and their XMP says publisher Meta / IPTC trainedAlgorithmicMedia.
  - That is the same situation as MOG CITY, where you accepted the risk on 2026-11-07 ("the license stuff is fine").
  - Confirm the same call covers CANNIBAL ISLAND.
  - Everything else is OK (231 entries): code-composed music, synthesised SFX with Kenney CC0 layers, OFL fonts, MIT/GSAP code.
- [ ] **JACOB: name check.**
  - [213] passes locally.
  - The codename FIRST CONTACT was dropped because a live Engine game already uses it (Talore Labs).
  - Run engineplayers' **Name check / Game DNA** for "CANNIBAL ISLAND" ([253] distinctness). This couldn't be done offline.
- [ ] **JACOB: Studio team and slug.** Undecided. Suggested slug: `cannibalisland`, which matches the math `index.json` and the front end's game id.
- [ ] **JACOB: content call.** Slapstick, no gore, an invented masked tribe with no real-culture motifs, and the heir is never shown being eaten (see STUDIO_DETAILS CONTENT). The creative lead set the title and premise on 2026-11-09. The remaining approval risk is the cannibal theme itself; you decide whether to submit as is.
- [ ] Optional (anyone allowed to touch Caddy): the same-origin RGS route `/cannibalisland/rgs/*` for the demo. The snippet is in DEPLOY_NOTES. It doesn't affect the upload, and the demo uses `:8835` directly.
- [ ] **JACOB: launch plan.** Stake Challenge request, streamer budget, X posts.

## B. Studio steps (skill §9)

1. [ ] **JACOB:** Stake Studio → (team) → **Create game** "CANNIBAL ISLAND" (slug `cannibalisland`).
2. [ ] **JACOB:** **Files** → **Import files**.
   - Upload the `cannibalisland_math.zip` contents as the **math**.
   - Upload the `cannibalisland_frontend.zip` contents as the **front end**.
   - Both zips are flat. Folder upload needs Chrome or Edge.
3. [ ] **JACOB:** **Publish new version** (math and front end publish separately).
4. [ ] **JACOB:** **Play Game** against the real RGS and test these:
   - one base spin;
   - BUY coin → buy menu → **RING THE DINNER BELL** (100x, confirm) → THE FEAST plays through to the outro card and back to base;
   - **EXTRA SEASONING** card on: the BET chip reads EXTRA SEASONING and the coin reads DISABLE; tap the coin to switch it off;
   - the replay link of a round from the bet history.
   - Expect: the intro on first load and a clean console.
   - Test hooks are off on the real RGS: `?force`, `?skipintro` and `?timescale` do nothing (checked, section E).
5. [ ] **JACOB:** **Media → Create tile** with the files in `cannibalisland_tile.zip` → `tile/`.
   - Background: `tile_bg_3x4.png` (3:4) and `tile_bg_16x9.png` (16:9).
   - Foreground: `tile_fg.png`, the heir cut-out. Scale it so his upside-down face fills the red focus box at the top middle.
   - Gradient: a jungle teal or sunset orange from the art.
   - The title is added by Stake. Compare with `tile_mock_3x4.jpg` / `tile_mock_16x9.jpg`.
   - If Studio wants a flat image instead, use `tile_3x4_*.png` / `cover_16x9_*.png`.
6. [ ] **JACOB:** profile: the banner `profile/banner_1920x1080.jpg` (or `_clean` if Studio overlays the title), plus `tagline.txt` and `description.txt`.
7. [ ] **JACOB:** details: paste from `STUDIO_DETAILS.md`.
   - Name.
   - Short description.
   - **Game details** (reviewer text).
   - **Game Info** for each of the 3 modes: `base`, `ante`, `bonus`.
   - Volatility High.
8. [ ] **JACOB:** optional: put the gallery link in the submission notes: https://games.bet-llm.com/cannibalisland/gallery.html (screenshots, rigs, symbols).
9. [ ] **JACOB:** **Submit for review.**

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

The tests unzipped `cannibalisland_frontend.zip` into a fresh folder (`/cannibalisland/release_test/`), with the paper-RGS launcher added, and ran it against the paper RGS `games.bet-llm.com/cannibalisland/rgs`. Results are in section E. That folder was deleted after QA so the build isn't stored twice; DEPLOY_NOTES says how to recreate it.

- [x] `index.html` at the zip root. Every URL is relative; `main.js` has no absolute host or path (only library comment URLs).
  - No source maps, no `.bak`, no dev files, no books and no screenshots.
  - 317 files, 14 MB unzipped.
- [x] `rgs_url` is read only from the launch URL, with nothing hardcoded. The launcher (`play.html` / `rgs.json`) is **not** in the zip.
- [x] Release build (`__CI_RELEASE__`): the in-browser DEV BOOKS RGS is stubbed out, so a missing or bad `rgs_url` shows only the connection-error screen.
- [x] Test hooks only switch on when authenticate returns `meta.paper` (our paper RGS): `?force`, `/paper/force`, `?timescale`, `?beats`, `?skipintro`, `__mog.force` and `__mog._dbg`.
- [x] Console clean: no logs, no Pixi banner, no 404s.
- [x] Fonts ship as WOFF2 (OFL, with their licence texts).
- [x] The official disclaimer is verbatim in the rules.
- [x] RTP, max win and hit rate per mode are generated at build time from the published math (`modestats.json`). All 3 modes are at 96.50%.
- [x] Every mode has a description: in the rules (MODES tab), the buy menu and `STUDIO_DETAILS.md`.
- [x] `verify_publish.py` on `publish_files`: ALL CRITICAL CHECKS PASS.
  - stakecli: WARN (only the 3 LUT sim_id-order notices). Eligible for the 2-star and 3-star tiers.
  - 3-star limits are met in every mode (CVaR 0.1%: base 292.9, ante 337.2, bonus 32.1).
- [x] Bet bar follows the Hacksaw HUD spec:
  - one slim row with the BUY coin, ☰, BALANCE | WIN, the BET chip with ▲▼, turbo, a ring SPIN and autoplay;
  - the active ante mode's name replaces "BET", and the coin flips to DISABLE.
- [x] Animation: every character, symbol and background is a Rigby2D weighted-mesh rig. 27 rigs, 94 clips; worst crack gate 47 px (limit ≤ 50).
- [x] Audio: 196 clips; master mute persists.
- [x] Tile: no text, numbers or multipliers on any layer, and the focus area is checked on both mocks.

## D. Reviewer pitfalls (Kash Smash rejection logs, the MOG CITY 4.3/9 review)

- [x] Bad `rgs_url`: only a plain connection-error screen.
- [x] Autoplay limits really stop play. The BUY coin is disabled during autoplay and rounds.
- [x] Bet menu built from the full authenticate list; the game opens on `defaultBetLevel`.
- [x] Insufficient balance sends no play request.
- [x] Modes costing more than 2x (RING THE DINNER BELL, 100x) ask for confirmation.
- [x] MAX WIN shown only on the real 10,000x cap.
- [x] Console clean in the release build and in replays.
- [x] Social mode: the full stake.us table is applied to every drawn string, including the replay card. No restricted words are baked into the art, the tile or the profile texts.
- [x] "Low quality assets": one bright cartoon style throughout, with day and night boards in landscape and portrait.
- [x] "Poor animations": Rigby2D mesh rigs only, with no tweened stills and no retired `rig.js`.
- [x] "Poor bet UI bar": Hacksaw HUD (see C).

## E. Test results on the exact upload (2026-11-09)

All jobs ran on philip-pc against `/cannibalisland/release_test/` (the unzipped `cannibalisland_frontend.zip`, sha256 `72731dd8…7852`). Full numbers and job IDs are in `cannibal/game/DEPLOY_NOTES.md` → "QA results (release zip, 2026-11-09)".

- [x] `qa_suite.py` fan-out: **41 PASS / 0 FAIL** across 27 scenarios (run 20261109-140335). Covered:
  - social wording and the social replay;
  - menus at 1024×576, 338×642, 360×640, 425×812 and popout S 400×225;
  - 5 sizes;
  - resume, replay (no wallet calls), invalid replay, rules (disclaimer, RTP/max win);
  - confirm for over 2x, zero balance, bet levels, bad `rgs_url`;
  - EUR / MXN / KRW / USDT / JPY / BTC / CAD.
- [x] Real input, desktop 1280×720 (mouse): **22/22**, 0 tap retries. Covered:
  - intro, spin, turbo, autoplay 10, forced tumble with orbs;
  - buy menu, EXTRA SEASONING on/off via the DISABLE coin;
  - DINNER BELL confirm and THE FEAST to stage 4 → outro card → base;
  - a natural base trigger;
  - console clean.
- [x] Real input, iPhone portrait (touch): **22/22** on the rerun, 0 tap retries.
  - The first run was 21/22. The harness missed sampling the outro card: with TURBO on, the card auto-closes after about 3 s, and the loop polls every 0.7 s while also tapping SPIN to skip.
  - In that run the FEAST still returned to base cleanly.
- [x] Hook gating with `meta.paper` stripped from authenticate (what Stake's RGS returns): **8/8**.
  - `?skipintro` and `?force=wincap` are ignored, `__mog._dbg` is undefined and no `/paper/*` request is sent.
  - Exactly one `/wallet/play` per spin, and the console is clean.
- [x] `sound_test.py`: **9/9** (7–9 one-shots per tumble step; mute persists).
- [x] `music_test.py`: **ALL PASS**, with no stuck or stacked tracks after bonus_typical, bonus_stage5, a buy_trigger_4 buy and a bonus replay.
- Report with screenshots: `cannibal/game/shots/qa-release-20261109/report.html`.
