Preview review notes · 2 October 2026

TRIAL BALANCE sales page: what needs Tim before it goes public

An unattended session built this page. It's a noindexed preview on a pages.dev address: no domain, no DNS, no production routes. Every number on it was checked against the game's code or produced by a script in pages/trial-balance/build/. Nobody has approved it for publishing.

Blockers

  1. GAME BUG The guilty party is always the last option on the filing form. partiesWithActivity() returns parties in creation order, and world.js adds the culprit last. I measured it on 100 months × 5 cases: 500 of 500. A player who notices can read the answer off the form. Fix in the game, for example by sorting the form's party list by name. The page doesn't mention it.
  2. GAME BUG The free ledger gives away two of the four schemes. Invoice numbers in world.js come from fixed ranges: legit vendors #2100–2899, the ghost vendor #3300–3699, personal-expense fraud #4400–4699, the clean decoy #4700–4899. The ledger is free, so a player who notices can read the culprit off the memo column. The cycle-2 reviewer measured this on all 1,256 ghost-vendor and personal-expense cases in months 1–500: read the ledger, pull one 1h invoice, file, and it's 3★ at 3h every time, under the partner's line. That undercuts the page's central promise ("the paper costs hours"). Fix: draw every invoice number in a case from one shared range, then rerun npm run sim and node build/ladder.mjs. Fix this before publishing.
  3. GAME DESIGN Brute force works more often than it should. If you accuse each party in turn, cite all of that party's entries and cycle through the schemes, you solve 380 of 500 cases and earn 3★ on 115 of them, as long as you start from the culprit's end of the list (node build/brute.mjs rev). Two things make this possible: citing "all of this party's entries" is a free, complete citation whenever the culprit has only fraud entries, and the last filing is free. The page used to claim you can't guess your way through. That claim is gone. The page now says only that a wrong guess costs 5 hours.
  4. Arcade stage is internal. Promoting it is your call. The page serves its own copy of the game at /play/, which will drift from the repo. To refresh it: cp -R ~/Programming/games/deduction/trial-balance/{index.html,styles.css,src} dist/play/, then redeploy. The hero demo imports /play/src/sim/*.js, so it refreshes too. Rerun node build/check-page.mjs afterwards.
  5. Nobody has played it. HANDOFF step 1 ("Tim plays the slice") is still open. The page claims no players, no timings and no feelings. It also speaks in your first person ("What I like…", "I ran them…", "I think that's a fair simplification…"), so read those lines and make sure you'd say them.
  6. MOEHR HOLDINGS LLC, your real company name, is case 5: "Voss's biggest client", and a fraud victim. It's in the game already, and the page prints it twice. Decide whether that's a wink you want on a public page.
  7. Accounting terminology. The casebook's SKIMMING ("taken out of the till before it was ever written down") is proven by the register tape, which did write it down. A CFE calls that cash larceny. The page says so openly in the accountants' section. Your options: keep that disclosure, or reword the in-game card and drop it.

Review items

How the page was checked

Back to the page