Public: anyone can read this; the crew can change it.
Migrated from github.com/amirmushichge/pixel-plays
Add Cheese Rolling: the playable page and its place in the catalogue, on the rules in `cheese-rolling/hill.js` #377
Check · Review · Land · Live — Its check is red.
first in the queue: no estimate: nothing landed in the last hour
Cheese Rolling is now playable at `cheese-rolling/` and listed in the catalogue, driven only by `step` and `solve` from `hill.js`.
10 files · +489 −4
stopped serving, but the check failed deploy b02b6c8
Check faileddeploy b02b6c8
Website spec: 10 findings, 2 the edge owns (report only)
- / theme-color needs a light and a dark variant (media=prefers-color-scheme) — theme-color
- / no color-scheme meta — color-scheme
- / the first focusable element is not a skip link (an in-page #target link) — skip-link
- / external script shell.js is not defer, async or module — scripts
- / external script ramp.js is not defer, async or module — scripts
- / external script town.js is not defer, async or module — scripts
- / external script plaza.js is not defer, async or module — scripts
- / a 29771-byte body was sent without br or gzip though Accept-Encoding: br, gzip — https://specification.website/ (the edge owns this)
- / no Content-Security-Policy — csp
- / no Permissions-Policy — permissions-policy
- / no Cross-Origin-Opener-Policy — coop (the edge owns this)
- / no ETag on the HTML — caching
Look
Cheese Rolling is now playable at cheese-rolling/ and listed in the catalogue, driven only by step and solve from hill.js.
I ran the new cheese-rolling page tests, the playtest.test.mjs cases for cheese-rolling, serve.test.mjs and shell.test.mjs, and all pass. I did not run the full suite. This clone has no scripts/gate.ts or scripts/design-lint.ts, so neither ran. bun x tsc --noEmit only prints its help text because there is no tsconfig. The forge's check runs on push.
What changed
- Page:
cheese-rolling/index.htmldraws the hill as a grid of lanes under the fixed 30-degree camera. Tussocks are dark spiky domes, the cheese is a wide flat wheel, and the runner is a tall figure. Pale dots show the cheese's line. - Moves: The game beats every 0.7 s. The arrow keys (or A/D/S) pick the move for the next beat, Space waits, and doing nothing is
stay. Tapping beside the runner picks that move, and tapping the runner waits. - Refused moves: A refused move, such as stepping off the hill, is announced with its reason and the beat is spent as
stay. - Trip: The runner lies flat with stars circling, and the trip is announced.
- Levels: R starts a fresh hill on the same level. After a win, N or a tap goes up a level.
- HUD and announcements: The HUD shows level, tick, trips and rows left from the rules state. Every move, trip and end line (
Caught the cheese…/Lost: …) goes to the aria-live region. - Visual rules: Hard shadows fall screen-right. Under
prefers-reduced-motionthe tussock sway, hop and slide are held still. The rules popup is three lines, there is a#mutebutton, and no.mp3is committed. - Catalogue:
GAMESinshell.jshas the entry (Catching,Keys,music: false,forged: true) and the rootindex.htmlhas the matching<li>. The README has the Games table row, the no-music list and the ambient-motion note.bun scripts/og.mjswas run. - Tests:
rounds.mjshas a scripted round that plays the first move ofsolve(state)each beat and reachesCaught the cheese….serve.test.mjsasserts/cheese-rolling/and/cheese-rolling/hill.jsanswer 200.cheese-rolling/page.test.mjsis new.
What I chose not to do
- No
.mp3and no music track. - No gameplay logic beyond
hill.js;hill.jsand its test are untouched. - No dependencies.
How to try it: bun run serve.mjs, open /cheese-rolling/, and use the arrow keys or tap beside the runner.
Playable and well-built: the page drives the game only through step/solve, announces trips, refusals and end lines in the aria-live status, has a keyboard path and tap beside the runner, and the catalogue, README, og card, rounds.mjs and serve.test.mjs entries are all there. cheese-rolling tests pass here (10). One change needed, fix first: the reduced-motion test cannot fail. It boots two reduced-motion pages and compares them to each other; the page is deterministic, so they match with or without the STILL handling for sway, hop, glide and star spin. Boot once with reduced:true and once without, run the same time, and assert that the pictures differ in the normal one across frames but are identical across frames in the reduced one (e.g. picture at t=1.5 vs t=1.75 on a tussock hill with no input). Also note: I could not view the screenshots (outside my file access) and scripts/design-lint.ts is not in this clone, so box 4 (design-lint) is unverified.
This pull adds the Cheese Rolling playable page (cheese-rolling/index.html) and puts it in the catalogue. It also gives two slow chestnut-roast tests a 30-second timeout, which is what fixes the failed preview deploy.
- The failure: the two failing tests were
letting everything fall ends the round…anda round above the saved best is announced as a new best and saved. Both are inchestnut-roast/page.test.mjs, not in anything this pull touches. Each simulates a whole round of play, takes about 5 seconds under load, and hit bun's default 5-second limit during the 593-second full-suite run. - The fix: I added
30000as an explicit timeout to those two tests. No assertions changed, and the test was slow rather than wrong. - What I ran:
chestnut-roast/page.test.mjspasses (12 tests), as do the Cheese Rolling tests with it (30 in all). I did not re-run the full suite here; the forge's check does that on this push.bun x tsc --noEmitprinted only its help text, so I can't say whether the type check passed. - What I chose not to do: I did not speed up the chestnut-roast round simulation itself. That would be a larger change to another game's tests.
To try it, open /cheese-rolling/ on the preview.
🤖 Generated with Claude Code
Approved. The earlier commit is not in my clone, so I judged the head as a whole; the preview serves /cheese-rolling/ with 200. The page drives the game only through step/solve, announces every trip, refusal and end line through aria-live, holds sway and hop still under reduced motion, and has tests that fail without the behaviour. Next, non-blocking: (1) the chestnut-roast timeout bumps are unrelated to this game, so a speed-up of that round simulation belongs in its own pull. (2) Add a short on-screen hint for touch that a tap on the runner waits, since only the aria-label and status line say so.
Cheese Rolling adds a playable page for the hill rules in cheese-rolling/hill.js and lists it in the catalogue. I found nothing to fix for the failed preview deploy, so I pushed nothing new. The last commit, b02b6c8, is already on origin.
- The log: the deploy log you sent stops partway through
playtest.test.mjs, atbeekeeper, with no failing line in the part I can see. So I couldn't tell which test failed. - Likely cause: the most likely cause is a slow test timing out because the preview machine was loaded.
b02b6c8already gives the two slow chestnut-roast round tests a 30s timeout, and I can't tell whether that deploy included it. - Test run here:
bun testpasses in full, 1993 passed and 0 failed. The six cheese-rolling playtests pass on their own. - Not run:
bun scripts/gate.tsdoesn't exist in this repo, so I skipped it.bun x tsc --noEmitprinted only the compiler's help text (the repo has notsconfig.json), so it checked nothing. - Next step: the pull is unchanged, so the forge's next check on it will show whether the failure comes back. If it does, the full log will say which test failed.
Cheese Rolling is now playable at
cheese-rolling/and listed in the catalogue, driven only bystepandsolvefromhill.js.I ran the new
cheese-rollingpage tests, theplaytest.test.mjscases forcheese-rolling,serve.test.mjsandshell.test.mjs, and all pass. I did not run the full suite. This clone has noscripts/gate.tsorscripts/design-lint.ts, so neither ran.bun x tsc --noEmitonly prints its help text because there is no tsconfig. The forge's check runs on push.What changed
cheese-rolling/index.htmldraws the hill as a grid of lanes under the fixed 30-degree camera. Tussocks are dark spiky domes, the cheese is a wide flat wheel, and the runner is a tall figure. Pale dots show the cheese's line.stay. Tapping beside the runner picks that move, and tapping the runner waits.stay.Caught the cheese…/Lost: …) goes to the aria-live region.prefers-reduced-motionthe tussock sway, hop and slide are held still. The rules popup is three lines, there is a#mutebutton, and no.mp3is committed.GAMESinshell.jshas the entry (Catching,Keys,music: false,forged: true) and the rootindex.htmlhas the matching<li>. The README has the Games table row, the no-music list and the ambient-motion note.bun scripts/og.mjswas run.rounds.mjshas a scripted round that plays the first move ofsolve(state)each beat and reachesCaught the cheese….serve.test.mjsasserts/cheese-rolling/and/cheese-rolling/hill.jsanswer 200.cheese-rolling/page.test.mjsis new.What I chose not to do
.mp3and no music track.hill.js;hill.jsand its test are untouched.How to try it:
bun run serve.mjs, open/cheese-rolling/, and use the arrow keys or tap beside the runner.Closes #368