Preview review notes · 3 October 2026

FRESHET 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/freshet/build/ or the probes listed in 07-evidence/output/evidence-report.md. Nobody has approved it for publishing.

Blockers

  1. PAR IS WRONG ON RISES 1, 2, 4 The game's par search (solver.js) only tries tiles in the idle flood's footprint plus one ring, and it misses flat tiles the water crosses. Searching every tile (build/probe-par.mjs): rise 1 has two 1-hour clean saves, a berm at (5,7) or (6,7), against par 2; rise 2 has four 2-hour saves against par 3. Rises 3, 5 and 6 hold (build/probe-par3.mjs). On rise 4 the reactive ditcher bot beats par 3 with 2 hours by digging mid-flood (build/probe-ditcher-r4.mjs). npm run sim still passes because it checks par against the same narrow search. Decision needed: the page currently keeps the game as is and turns this into a dare (the "Three stars, and a par you can beat" section, the gripe, and the P.S.). If you fix the solver and retune rises 1, 2 and 4 instead, those three passages and the "That's two shovel-hours, the warden's par" line must be rewritten, and dist/play/ recopied.
  2. STAGE FRESHET is at internal on the arcade, so /play/freshet/ 404s for the public. This preview serves its own copy of the game at /play/ (copied from commit 56df11c). To publish, either promote the game (games-portal/tools/stage.mjs freshet beta, your call) and point the CTAs at the arcade, or keep the copy and accept that it will drift from the repo.
  3. YOUR VOICE The page speaks as you in four places: "That's the moment I like best in the game", "I checked all 268 legal ones", "I'd like it to carry over", and "What I think it gets right". The 268 check was run by this session (build/probe-singles.mjs, reproduced in the evidence report), not by you. Own them or cut them.
  4. NOBODY HAS PLAYED IT Zero players outside the build, so the page has no testimonials, no play time, and no player counts. The only proof is the demo, the code, and the game's bots (labelled as bots). Your own playthrough of rises 1 to 6 is the missing piece.
  5. DEMO COACH The hero's coach lines are written for the page, not OLD MERTEN's words, and they aren't attributed to him. The game's own lines contain em dashes and assume keyboard keys. Check the four demo lines in demo.js sound right to you.
  6. NAME FRESHET was picked to dodge an itch.io match on "Spillway". This session didn't re-check FRESHET itself for collisions.

Test-reader gauntlet: escalated, not passed

Three cycles (the cap): 3.39 → 3.81 → 3.88 overall, against a 4.0 bar. Every other threshold passes: no section under 3.5, skimmer audit 7/7, zero open criticals, 9 of 10 would play, primary audience 70%. The remaining gap is the phone skimmer and the parent persona scoring the bot and par sections, which are written for tactics players. Accept it, or ask for a simpler proof section. Details in 08-test-readers/output/feedback-synthesis.md.

Repo findings (the game's own docs are wrong)

  1. THE HARVEST. GDD.md says "at least half the fields dry". The code (tuning.js HARVEST_FRACTION: 1.0, grade.js) demands every field. The page follows the code.
  2. Water flow. GDD.md and the flood.js header say a droplet moves to its lowest lower neighbor. The code moves to the first lower neighbor in N, W, E, S order. The page says exactly that and never says "steepest" or "lowest". If you change the engine to match the doc, every par and the page's numbers need rechecking.
  3. Entering at rise 2. The demo's finish line links to /play/?rise=2. The season report then counts five rises (15 stars max), since rise 1 was played on this page, not in the game. Fine for now; worth knowing.

Review items (not blocking)

How to refresh

From pages/freshet/: copy the game (cp -R ~/Programming/games/strategy/freshet/{index.html,styles.css,src} dist/play/), serve dist/ on 8794, run node build/check-page.mjs, then npx wrangler pages deploy dist --project-name freshet-draft --branch main --commit-dirty=true.

Back to the page