phase: 07_canvas_client_and_hud
**Final report — phase 07 final verification pass** - **Verified:** all 5 tasks present in `complete/`; app boots (`/healthz` 200, `/` 200, static + atlas + `/api/levels` served); `docs/CLIENT.md` module map matches the on-disk `app/static/` tree; no code defects found. - **Tests/lint/coverage:** `bash .agents/validate.sh` → ruff clean, pyright 0 errors, `undercooked-levels validate` pass, **full pytest 1838 passed, 97.21% coverage (floor 90%)**, slow sim stage 2 passed, repo hygiene clean. `uv run pytest tests/e2e -q` → **53 passed** (all 8 suites added this phase). - **Criteria:** (1) two tabs create→join→ready→start→serve one dish, keyboard only — green via `test_us01/02/03/04` ✔; (2) e2e green ✔; (3) canvas non-blank, pixels change after a move — `test_us04_render_smoke` ✔; (4) HUD score within 200 ms of the `served` event — asserted, green ✔; (5) zero console errors + zero off-origin requests — `test_atlas_loads` / `test_us01_landing_surface` ✔; (6) `docs/CLIENT.md` matches layout ✔; (7) 100% suite + 97.21% ✔; (8) docs pass below ✔; (9) no regression in completed phases (all prior suites green) ✔. - **README.md fixed:** status still said "next pending phase is 07" → now 07 complete, 08 pending; the phase-07 client text buried in the phase-05 bullet → its own "canvas client, art, HUD (phase 07)" bullet; stale "What does not exist yet" (claimed movement/controls missing) → rewritten to phases 08–14; "once the room flow ships" → "live in the browser today"; Layout `app/static/` "renderer arrives with the rest of phase 07" → full shipped-client map; Layout `docs/` "CLIENT lands with phase 07" → `CLIENT.md` listed; added `gen_art_index.py` Layout entry. - **AGENTS.md fixed:** "the eight screens" (7 listed) → "the seven screens" (+ `dom.js` is the shared builder, not a screen); e2e naming line → notes the non-story guard `test_atlas_loads.py`. - **Decisions:** no code changes were needed; only the two doc fixes above. Docs re-verified by `test_docs_commands`/`test_docs_index` (44 passed) plus the final full gate. - **Next pending phase:** `08_client_prediction_and_touch`.
This commit is contained in:
+80
@@ -0,0 +1,80 @@
|
||||
# levels/recipes.yaml — the campaign recipe book (PLAN §5/§8, A8).
|
||||
#
|
||||
# Every dish the game knows lives here; no Python enumerates recipes. The
|
||||
# schema is `src/undercooked/sim/recipe.py` and the reference is
|
||||
# docs/LEVELS.md — every model is strict (`extra="forbid"`), so a typo here
|
||||
# fails the load loudly instead of silently defaulting.
|
||||
#
|
||||
# Step lists mirror PLAN §5's station pipelines: pick from the spawn shelf,
|
||||
# chop (~0.9 s), cook on the stove, plate at the prep station, serve at the
|
||||
# window. `seconds` feeds only the validator's greedy target-plausibility
|
||||
# bound; the simulation (phase 04) re-enacts these steps per tick.
|
||||
|
||||
# Catalog of the item kinds the campaign's dishes consume (documentation of
|
||||
# intent; spawn shelves are what actually put items on the floor).
|
||||
ingredients: [tomato, onion, lettuce, dough, patty, rice, fish, plate]
|
||||
|
||||
recipes:
|
||||
# tomato + onion -> chop -> pot on the stove -> plate
|
||||
soup:
|
||||
id: soup
|
||||
name: Tomato Soup
|
||||
base_score: 40
|
||||
ingredients:
|
||||
- {kind: tomato, form: raw}
|
||||
- {kind: onion, form: raw}
|
||||
steps:
|
||||
- {kind: pick, station: spawn_shelf}
|
||||
- {kind: chop, station: chop_board, seconds: 0.9}
|
||||
- {kind: cook, station: stove, seconds: 5.0}
|
||||
- {kind: plate, station: prep, seconds: 0.4}
|
||||
- {kind: serve, station: serve}
|
||||
tags: [hot, soup]
|
||||
|
||||
# lettuce + tomato -> chop -> plate; the fast, no-fire dish
|
||||
salad:
|
||||
id: salad
|
||||
name: Garden Salad
|
||||
base_score: 30
|
||||
ingredients:
|
||||
- {kind: lettuce, form: raw}
|
||||
- {kind: tomato, form: raw}
|
||||
steps:
|
||||
- {kind: pick, station: spawn_shelf}
|
||||
- {kind: chop, station: chop_board, seconds: 0.9}
|
||||
- {kind: plate, station: prep, seconds: 0.4}
|
||||
- {kind: serve, station: serve}
|
||||
tags: [cold, quick]
|
||||
|
||||
# rice + onion straight onto the stove (PLAN §5: raw rice needs no board)
|
||||
fried_rice:
|
||||
id: fried_rice
|
||||
name: Fried Rice
|
||||
base_score: 50
|
||||
ingredients:
|
||||
- {kind: rice, form: raw}
|
||||
- {kind: onion, form: raw}
|
||||
steps:
|
||||
- {kind: pick, station: spawn_shelf}
|
||||
- {kind: cook, station: stove, seconds: 6.0}
|
||||
- {kind: plate, station: prep, seconds: 0.4}
|
||||
- {kind: serve, station: serve}
|
||||
tags: [hot, grain]
|
||||
|
||||
# patty + dough + lettuce -> chop + pan on the stove -> plate. Defined now;
|
||||
# later levels (phase 11) put it in an order pool.
|
||||
burger:
|
||||
id: burger
|
||||
name: Chef's Burger
|
||||
base_score: 70
|
||||
ingredients:
|
||||
- {kind: patty, form: raw}
|
||||
- {kind: dough, form: raw}
|
||||
- {kind: lettuce, form: raw}
|
||||
steps:
|
||||
- {kind: pick, station: spawn_shelf}
|
||||
- {kind: chop, station: chop_board, seconds: 0.9}
|
||||
- {kind: cook, station: stove, seconds: 5.0}
|
||||
- {kind: plate, station: prep, seconds: 0.5}
|
||||
- {kind: serve, station: serve}
|
||||
tags: [hot, stacked]
|
||||
Reference in New Issue
Block a user