# MOG CITY: Stake Engine submit checklist (v4 resubmission)

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

The first submission was reviewed at 4.3/9 ("Low quality assets" ×3, "Poor animations" ×3, "Poor bet UI bar" ×2). v4 replaces the whole front end:
- style-E cartoon art;
- a Hacksaw-style HUD;
- code-driven animation.

The gameplay and math are unchanged, so the same math zip is re-uploaded with it.

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

| File | What it is |
|---|---|
| `mogcity_frontend.zip` | Front end: `index.html` at the zip root, all URLs relative. **v4, 7.6 MB (7,642,323 bytes, 218 entries); rebuilt 2026-11-07 late with the 3★ work, the cast wiggle fix, the style-E bottle girl + left Hexman redraws and the music self-heal fix (sha `ac4e95af…e3c5`). Uploaded to Studio as CoinUp front v6.** |
| `mogcity_math.zip` | Math: `index.json` + 11 LUTs + 11 `books_*.jsonl.zst` at the zip root. Unchanged since 2026-10-23 (204.7 MB). |
| `tile/` (+ `mogcity_tile.zip`) | v4 tile with no text: <ul><li>backgrounds `tile_bg_3x4.png` / `tile_bg_16x9.png`;</li><li>the padded square foreground `tile_fg.png`, plus its cuts `tile_fg_3x4.png` / `tile_fg_16x9.png`;</li><li>two preview mocks, `tile_mock_*.jpg`.</li></ul> |
| `STUDIO_DETAILS.md` | Name, short description, Game details (now with a v4 PRESENTATION section), per-mode Game Info. |
| `ASSET_LICENCES.md` | Per-asset sources and licences. **Read the UNVERIFIED section first.** |

---

## Stake review feedback 2026-11-06

Stake flagged two things on STACKED. MOG CITY had both, so they are fixed here before review.
- [x] **Balance shows the currency's decimals only.** The balance is now floored to 2 decimals for USD (0 for JPY, 3 for KWD), so it can't read `$997.009`. Wins can still show sub-cent amounts (up to 4 decimals). Fixed in `platform.js` `money(v, {balance:true})` and `hud.js`. Follow-up the same day: the floor is integer math on the micro amount, so 1,234,567.89 USD no longer shows as $1,234,567.88 (float error); `game/tools/money_test.mjs` 10/10.
- [x] **Replay card.** Before, there was only a strip, "REPLAY · mode · BET · REAL COST", plus a PLAY/AGAIN spin button. Now replays open on Stake's "Bet Replay" card: Mode / Base Bet / Cost Multiplier / **Total Bet Cost** / Payout Multiplier / **Total Win**, a ▶ Start Replay button and the "No bets will be placed" footer.
  - The card returns as ▶ Replay Again after the round. The strip stays on screen during playback.
  - Social mode uses Base Play / Feature Multiplier / Total Play Worth / Final Multiplier.
  - The card fits popout S (400×225, two columns) up to 4K. New file `src/replay_card.js`; `main.js` changed.
- [x] Tests on the rebuilt bundle (local 127.0.0.1 + paper RGS :8808):
  - `replay_card_check.py`: **16/16** (6 viewports × real/social, plus playback → Replay Again with no wallet calls at 400×225 and 390×844);
  - `compliance_test.py`: **33/33**. Its replay section now checks the card: CLUB NIGHT €5.00 ×100 = €500.00, 147.25x, €736.25, plus a social card at 390×844.
- New `mogcity_frontend.zip` sha256 `be95f2082186a68df6a888de5a859b09a9a3bdbf00303ab2086a613c2e20dd17` (the previous zip `2b79567e…5463` is in `_backup_20261106/`). The math zip is unchanged.

## 3★ push 2026-11-07 (brief: `plan/MOG_CITY_3star_work_2026-11-07.md`)

Staged at https://games.bet-llm.com/mogcity/game_v4dev/ only. The live demo and Studio are untouched. **`mogcity_frontend.zip` was rebuilt 2026-11-07 08:39, after the Hexman / girl-symbol fix, from the staged build that has all of the work below: sha256 `a964ddda0022229a36f6bd025a430940045796b2e5a3ce87324f09f5892e389e`, 7.6 MB.** The two previous zips (`d1c0aca8…`, 08:04, and `dff04512…`, from `2384ffe`) are in `_backup_20261107/`. Unzipped into `/mogcity/release_test/` for the release tests. Don't upload without Jacob's OK.
- [x] **Rigs (steps 1–2):**
  - THE MOGGER and the whole supporting cast run on code mesh rigs (breath, head tilt, hair lag, jaw rub, win nod, flex). The chin jiggle is fixed (`ff706b3`).
  - Flex fix: the win-pose arm fields no longer pinch his face (`d97a3a3`).
  - Every reel symbol has its own land and win animation (`44cf1f3`).
- [x] **Symbol wiggle fix (Jacob):**
  - Props that move as one piece (gavel, insole, tin lid, milk cap, scatter crest) are cut into rigid layers by `game/tools/sym_layers.py`. They go in the lazy `syms` group, +0.16 MB.
  - The truck, hammer, bottle, orb and medallion move as one rigid mesh.
  - New `game/tools/symrig_check.py`: every land + win mode keeps its mesh stretch under 0.35, **22/22** (`0dfad93`).
- [x] **Cast wiggle fix (Jacob: Hexman's thumb swelled, his shirt wiggled under his hand, the girl symbol's hair wiggled):**
  - Hexman's arm motion is removed in both poses. He keeps breath and head sway.
  - The girl symbol (H2) sways and bobs as one rigid piece.
  - New `game/tools/castrig_check.py` measures the stretch and size change of every cast rig over the visible art, in every motion. **9/40 → 40/40** under 0.165 (one-shot nod/gavel under 0.33). Hexman was 1.00 / 0.78.
  - To get there: feathers widen to 6× the travel; the phone hand rides the head; the buzz/flex/DJ/wave amplitudes are trimmed (`2b44a58`).
- [x] **Win readability (steps 3–4):** non-winners dim, plated win labels, and the BONUS WIN plate climbs per tumble. No spin-strip ghosts (`0e46b65`, `c06dbc5`).
- [x] **Declutter (step 5):** chat and the hairline meter step aside for guests and bonus intros. The Gauntlet board is wider in landscape (`6162350`).
- [x] **Short landscape (step 6):** the HUD is re-laid out at 400×225 (values ~6 → ~9 css px), not scaled down (`e6a5f78`).
- [x] **Scatter (step 7):** brighter SIDE PROFILE disc plus a code-drawn gold SCATTER chip (`ee75b64`).
- [x] **Sound and licences (step 8):**
  - The crowd cheer/ohh are rebuilt from public-domain recordings only; the MiniMax TTS layers are gone.
  - The quieter Gauntlet and finale music loops are trimmed up +1.9 / +2.9 dB, measured in LUFS. **Nobody has listened to the new crowd SFX or the trims yet.**
  - Game Studio art traced to Meta AI. The licence ledger now has **39 UNVERIFIED**, down from 54 (`301d65f`).
- [x] QA on game_v4dev: `compliance_test.py` **33/33**.
- [x] QA on game_v4dev: `social_sweep.py` found **no** restricted phrases across 864 distinct strings, with 7 forced features played (incl. GET RATED → THE GAUNTLET, the minimum win). The SCATTER chip is not on the social list.
- [x] Release tests on the rebuilt zip a964ddda (`/mogcity/release_test/`, job dfb429f016, 0 FAIL):
  - compliance: 33/33;
  - real input on iPhone, portrait: 24/24, with the Gauntlet buy playing through all 5 stages back to base;
  - real input on desktop: 24/24;
  - console clean, 0 tap retries.
  
  Also passed: social sweep (no restricted words), castrig 40/40, symrig 22/22.

## Studio upload 2026-11-08 (Jacob: "make the new release, I okay everything"; "send this version to review through coinup")

- [x] **Zip** `mogcity_frontend.zip` sha256 `ac4e95af19120d29cd185b95d4d5d0b30a89643992104665449e1f61dd8dc3e5`, 7,642,323 bytes, 218 entries. Adds the redrawn bottle girl and left Hexman (`67dce66`) and the music self-heal fix (`4fcdb0d`). The previous zip `a964ddda` is in `_backup_20261107/`.
- [x] **Release QA on this zip** (`/mogcity/release_test/`, job dc0dbd86f3, 0 FAIL): compliance **33/33**; real input iPhone portrait **24/24** and desktop **24/24** (Gauntlet buy through all 5 stages); `music_fault_test.py` club, camp + ctx suspend, TRUE ADAM SPIN + source kill + 2 injected finale decode failures: **ALL PASS**, no gap > 3.5 s.
- [x] **Uploaded with stakecli** (stake-general `tools/stakecli`, Philip's Studio login) to **`coinup/mog-city`**: 30 files changed (2.2 MB), 0 deleted, 180 unchanged; re-plan afterwards showed 0 actions. **Published as CoinUp front v6.** Math stays v1.
- [ ] **JACOB: request the review in Studio.** The CoinUp approval thread is closed (rated 4.33/9 on front v4, 10-24; the 3-day lock ended 10-27), so publish could not move it: "approval is closed; version was not changed". stakecli has no resubmit command. In Studio → CoinUp → Mog City, resubmit for approval with **front v6 + math v1**.
- Not touched: `misconduct-labs/mog-city` (front v1, 6.0/9, approval awaiting).

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

- [x] **JACOB: licences.** **Decided 2026-11-07: Jacob accepts all three ("the license stuff is fine").** `ASSET_LICENCES.md` now lists 0 UNVERIFIED and 39 "OK (Jacob accepted the risk)". The three decisions were:
  - **Meta AI art** (27 files: cast, icons, intro bg, tile bg). Meta's AI Terms give no output grant, set no commercial limit and don't name gambling.
  - **The Studio music model** (3 stems). The model is unknown.
  - **stable-audio-2.5** (9 files). You own the output, the AUP has no gambling ban, and the $1M cap applies to Core Models only.
  - The rest of this item is from 2026-10-24 and kept for history. It listed 54 of 177 files, down from 82 of 238 in v3.
  - **Game Studio style-E art** (40 files): model licences are undocumented, so ask Mai.
    - The 14 backgrounds and the intro backdrop.
    - The supporting cast sprites, plus the buy-menu icons and Gauntlet portraits cut from them.
    - The tile background, which is also a Game Studio image.
  - **Music:** stable-audio-2.5 (6 tracks, plus 3 SFX derived from them) and 3 Game Studio stems. None is confirmed for real-money gambling.
  - **Crowd SFX:** two contained MiniMax TTS layers. Fixed 2026-11-07: rebuilt from public-domain recordings.
  - **Now OK:**
    - THE MOGGER (master and all poses) and all 11 reel symbols are paid `google/nano-banana-pro` / `nano-banana-2.1` outputs. Google's generative-AI terms apply, the output is used commercially, and no OpenAI models were used.
    - That covers the tile foreground too.
  - **ElevenLabs** (all 63 voice lines) is covered by your written approval of 2026-10-23. Keep it on file, and check it also covers the caricature characters (use policy §3).
- [ ] **JACOB: name check.**
  - Post the share link on engineplayers.com/reviews for community ratings.
  - Run its **Name check / Game DNA** for "MOG CITY". [213] passes locally, but "City" overlaps Donut Gaming's *Rack City Baddies* / *Rack City Riches*, so watch [253] distinctness.
- [x] On-screen names are invented: THE MOGGER, HEXMAN, ANDROMAXX, FRAT LEADER and the Norwood Reaper. No real names appear in the game, the rules or STUDIO_DETAILS.
- [ ] **JACOB: launch plan.** Stake Challenge request, streamer/Watchtower budget, X posts.

## B. Studio steps (skill §9)

1. [ ] **JACOB:** Stake Studio → MOG CITY → **Files** → **Import files**.
   - Upload the `mogcity_frontend.zip` contents (v4) as the **front end**.
   - Re-upload the `mogcity_math.zip` contents as the **math** if Studio asks for both.
   - Folder upload needs Chrome or Edge. Both zips are flat, with no wrapper folder.
2. [ ] **JACOB:** **Publish new version**. Math and front end publish separately.
3. [ ] **JACOB:** **Play Game** against the real RGS. Test these:
   - one base spin;
   - the BUY coin → buy menu → CLUB NIGHT (100×);
   - an ante card (LIFTS on, check that the coin reads DISABLE, tap 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`, `?timescale` and the other test parameters do nothing there.
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`. Enlarge it to fill the red focus box.
   - Pick a gradient from the pink/purple palette.
   - The title is added by Stake. Compare with `tile/tile_mock_*.jpg`.
5. [ ] **JACOB:** cover + details: paste from `STUDIO_DETAILS.md`.
   - Name.
   - Short description.
   - **Game details** (reviewer text, now with the v4 presentation notes).
   - **Game Info** description for each of the 11 modes. LIFTS and MOGMAXX are now described as buy-menu ante cards.
6. [ ] **JACOB:** optional: link an art kit (2560×1440 screenshots, the tile layers) in the submission notes, and mention the v4 overhaul in reply to the 4.3/9 review.
7. [ ] **JACOB:** **Submit for review.**

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

Tested by unzipping `mogcity_frontend.zip` into a fresh folder (`/mogcity/release_test/`) against the paper RGS (same-origin route `games.bet-llm.com/mogcity/rgs`). Results are in section E.

- [x] `index.html` at the zip root. Every URL is relative, and `main.js` has no absolute host or path.
  - No source maps, no dev files, no screenshots.
  - Only manifest-referenced assets ship: 185 files, 8.3 MB unzipped.
- [x] `rgs_url` is read only from the launch URL; nothing is hardcoded. The launcher (`play.html` / `rgs.json`) is **not** in the zip.
- [x] Production build (`__MOG_DEV__` false). Test hooks (`?force`, `/paper/force`, `?timescale`, `?beats`, `?gskip`, `?cameo`, `?skipintro`, `__mog.force`, `__mog._dbg`) only switch on when authenticate returns `meta.paper` (our paper RGS).
- [x] Console clean: no logs, no Pixi banner, no 404s.
- [x] Fonts ship as WOFF2 files: Inter (subset) and Titan One, both 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 `math/modestats.json`. All 11 modes are at 96.50%.
- [x] Every mode has a description: in the rules, the buy menu and `STUDIO_DETAILS.md`.
- [x] `verify_publish.py` on the `mogcity_math.zip` contents (re-run 2026-10-24): ALL CRITICAL CHECKS PASS.
- [x] Download size: front-end zip **7.5 MB** (v3 was 25.6 MB). First paint is about **2.3 MB** (boot group 1.2 MB + `main.js` 0.97 MB + fonts). The other groups load lazily: club 1.2, base 1.0, gauntlet 0.85, terachad 0.84, vo 0.75, camp 0.73 and wwmog 0.64 MB.
- [x] Bet bar follows the Hacksaw HUD spec (playbook §2):
  - one slim translucent row with the gold BUY BONUS coin, ☰, BALANCE | WIN, the BET chip with ▲▼, turbo, the ring SPIN and autoplay;
  - the active ante mode's name replaces "BET";
  - the coin flips to DISABLE.
- [x] Tile: no text, numbers or multipliers on any layer. The background is bright to the edges.

## D. Reviewer pitfalls (Kash Smash rejection logs + our 4.3/9 review)

- [x] Bad `rgs_url`: only a plain connection-error screen, with no bet bar and no music.
- [x] Autoplay limits really stop play. The BUY coin is disabled during autoplay and rounds (no rebuy loop).
- [x] Bet menu built from the full authenticate list.
- [x] MAX WIN shown only on the real 25,000× cap.
- [x] Console clean in the prod build and in replays.
- [x] Social mode: the full stake.us table is applied to every drawn string (the coin reads GET BONUS). No restricted words are baked into the art or the tile.
- [x] "Low quality assets": every asset is redrawn in one cartoon style, with paid-tier symbols and host.
- [x] "Poor animations": AI clips are gone; motion comes from code rigs (reactions, cut-ins, tumbles, boss beats).
- [x] "Poor bet UI bar": Hacksaw HUD (see C).

## E. Test results on the exact upload

Run once on `/mogcity/release_test/`, 2026-10-24. That folder holds the unzipped `mogcity_frontend.zip` (sha256 `fb426f7f…5cda`) plus the paper-RGS launcher. The tests were adapted to the v4 HUD:
- the ante cards are in the buy menu;
- the DISABLE coin;
- the Gauntlet is armed with `?force=` in the launch URL.

- [x] `verify_publish.py` on the `mogcity_math.zip` contents: ALL CRITICAL CHECKS PASS (11 modes, all 96.5000%).
- [x] compliance_test.py: **31/31**, first run. It includes a new v4 check: the MOGMAXX ante card arms from the buy menu, the coin reads DISABLE, the first spin asks to confirm, and DISABLE switches it off.
  - Also covered: 5 viewports, 5 currencies, social wording, the replay checks, bad `rgs_url`, insufficient balance, bet levels and resume.
- [x] social_sweep.py: restricted phrases **NONE** (1,353 strings). Covered:
  - the intro, menus, rules, settings, autoplay and the buy menu with MOGMAXX armed;
  - every buy confirm;
  - 7 forced features, including GET RATED -> THE GAUNTLET;
  - a social replay.
- [x] Real input, iPhone 13 (touch): **24/24** in one run, no tap retries. Covered:
  - intro, spin, autoplay 10 in turbo, forced APPROACH;
  - buy menu, LIFTS -> MOGMAXX ante cards, the DISABLE coin;
  - CLUB NIGHT buy + play-through;
  - a reload with `?force=gauntlet_all_ko`, then THE GAUNTLET buy through all 5 stages (848.15× book);
  - console clean.
- [x] Real input, desktop 1280x720 (mouse): all 24 checks pass.
  - The first run passed the intro / spin / autoplay / APPROACH / ante checks, but 5 buy-card checks failed.
  - Cause: right after the `?force` reload, headless software GL ran under 1 fps. The buy menu, which pops in from alpha 0, had not drawn its first frame 1.6 s after opening. A tap at the card's final position hit the backdrop and closed the menu.
  - A player can't tap a menu that isn't drawn yet, so this is a harness timing issue, not a game bug. The test now taps only once Pixi hit-tests the button itself at that point.
  - Rerun of the buy section (`--from-buy`): **19/19**, no retries, including THE GAUNTLET through all 5 stages.
- [x] Replay URLs: CLUB NIGHT (EUR, popout S, no wallet calls, bet + real cost, PLAY AGAIN), a missing event (error screen) and a social GET RATED replay. All pass.
- [x] Bad `rgs_url`: plain connection-error screen.
- [x] Console clean: laptop, replays, both real-input runs.
- [x] Hook gating on the same build. With `meta.paper` stripped from authenticate (what Stake's RGS returns):
  - `?skipintro` / `?force` / `?timescale` did nothing;
  - `__mog._dbg` was undefined;
  - no `/paper/*` request was sent (4/4).
- [x] The same build is live at https://games.bet-llm.com/mogcity/game/play.html (paper RGS through the same-origin route). It loads, and `?force=gauntlet_all_ko` served the 848.15× book on a GAUNTLET buy, which started the Gauntlet scene with a clean console.
