Files
undercooked/assets_src/items.svg
T
ducoterra 95ca3fd1fa 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`.
2026-10-10 18:03:52 -04:00

203 lines
9.6 KiB
XML

<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32">
<!-- Undercooked items (phase 07, task 01). Every ItemKind x reachable
ItemForm the simulation can produce (see tools/gen_art_index.py),
32x32. Shared geometry lives in <defs>; the per-kind colour rides
on `currentColor` so a <use> recolors it. -->
<defs>
<g id="grid-dice">
<rect x="8" y="11" width="7" height="7" rx="1.6" fill="currentColor"/>
<rect x="17" y="11" width="7" height="7" rx="1.6" fill="currentColor"/>
<rect x="8" y="20" width="7" height="7" rx="1.6" fill="currentColor"/>
<rect x="17" y="20" width="7" height="7" rx="1.6" fill="currentColor"/>
</g>
<g id="pot-steam">
<rect x="7" y="13.5" width="18" height="11.5" rx="3" fill="#8b8b8b"/>
<rect x="5.6" y="11.2" width="20.8" height="3.4" rx="1.7" fill="#a3a3a3"/>
<path d="M11 7 q1 -1.6 0 -3 M16 6.4 q1 -1.6 0 -3 M21 7 q1 -1.6 0 -3" stroke="#e8e2d4" stroke-width="1.4" stroke-linecap="round" fill="none" opacity="0.9"/>
</g>
<g id="bowl">
<path d="M6.5 13 h19 c0 5.6 -4 8.6 -9.5 8.6 s-9.5 -3 -9.5 -8.6 z" fill="#f6f1e7"/>
<ellipse cx="16" cy="13" rx="9.5" ry="3" fill="#e2dbcb"/>
</g>
<g id="char">
<path d="M16 11 c4.2 0 7.2 2.7 7.2 6 c0 3.6 -3.2 6.3 -7.2 6.3 s-7.2 -2.7 -7.2 -6.3 c0 -3.3 3 -6 7.2 -6 z" fill="#3b3b3b"/>
<path d="M13.2 8.4 q0.8 -1.4 0 -2.8 M17.8 8 q0.8 -1.4 0 -2.8" stroke="#6b6b6b" stroke-width="1.2" stroke-linecap="round" fill="none"/>
</g>
</defs>
<!-- ============================== tomato ============================== -->
<symbol id="item-tomato-raw" viewBox="0 0 32 32">
<circle cx="16" cy="18" r="8" fill="#e0533d"/>
<ellipse cx="13" cy="15.4" rx="2.6" ry="1.7" fill="#f08a63" opacity="0.8"/>
<path d="M16 11.4 v-2.4" stroke="#5d8a3c" stroke-width="1.6" stroke-linecap="round" fill="none"/>
<path d="M16 10.2 c-2.4 -1.4 -4.6 -1 -6 0.6 c2 0.4 4 0.2 6 -0.6 z" fill="#5d8a3c"/>
<path d="M16 10.2 c2.4 -1.4 4.6 -1 6 0.6 c-2 0.4 -4 0.2 -6 -0.6 z" fill="#5d8a3c"/>
</symbol>
<symbol id="item-tomato-chopped" viewBox="0 0 32 32">
<use href="#grid-dice" style="color: #e0533d"/>
</symbol>
<symbol id="item-tomato-cooking" viewBox="0 0 32 32">
<circle cx="16" cy="10.8" r="2.8" fill="#e0533d"/>
<use href="#pot-steam"/>
</symbol>
<symbol id="item-tomato-cooked" viewBox="0 0 32 32">
<path d="M10 12.4 c1 -2.2 11 -2.2 12 0" stroke="#e0533d" stroke-width="2.6" stroke-linecap="round" fill="none"/>
<use href="#bowl"/>
</symbol>
<symbol id="item-tomato-burnt" viewBox="0 0 32 32">
<use href="#char"/>
</symbol>
<!-- ============================== onion ============================== -->
<symbol id="item-onion-raw" viewBox="0 0 32 32">
<ellipse cx="16" cy="18.5" rx="8" ry="7.4" fill="#c9a2cf"/>
<path d="M10.4 14.6 c1.8 -3 9.4 -3 11.2 0 M9.4 19 h13.2 M11.4 23.4 c1.8 1.5 7.4 1.5 9.2 0" stroke="#a67fb0" stroke-width="1" fill="none"/>
<path d="M16 11.6 c0 -2 0.8 -3.2 2.2 -3.8" stroke="#8a6b45" stroke-width="1.6" stroke-linecap="round" fill="none"/>
</symbol>
<symbol id="item-onion-chopped" viewBox="0 0 32 32">
<use href="#grid-dice" style="color: #c9a2cf"/>
</symbol>
<symbol id="item-onion-cooking" viewBox="0 0 32 32">
<circle cx="16" cy="10.8" r="2.8" fill="#c9a2cf"/>
<use href="#pot-steam"/>
</symbol>
<symbol id="item-onion-cooked" viewBox="0 0 32 32">
<path d="M10 12.4 c1 -2.2 11 -2.2 12 0" stroke="#c9a2cf" stroke-width="2.6" stroke-linecap="round" fill="none"/>
<use href="#bowl"/>
</symbol>
<symbol id="item-onion-burnt" viewBox="0 0 32 32">
<use href="#char"/>
</symbol>
<!-- ============================= lettuce ============================= -->
<symbol id="item-lettuce-raw" viewBox="0 0 32 32">
<circle cx="12.5" cy="17" r="5.5" fill="#7db85a"/>
<circle cx="20" cy="16.5" r="5.5" fill="#8bc76c"/>
<circle cx="16.5" cy="20.5" r="5.5" fill="#6ea84e"/>
<path d="M10 15 c2 -2.5 8 -2.5 10 0" stroke="#a9dc8f" stroke-width="1.3" fill="none" stroke-linecap="round"/>
</symbol>
<symbol id="item-lettuce-chopped" viewBox="0 0 32 32">
<use href="#grid-dice" style="color: #7db85a"/>
</symbol>
<symbol id="item-lettuce-cooking" viewBox="0 0 32 32">
<circle cx="16" cy="10.8" r="2.8" fill="#7db85a"/>
<use href="#pot-steam"/>
</symbol>
<symbol id="item-lettuce-cooked" viewBox="0 0 32 32">
<path d="M10 12.4 c1 -2.2 11 -2.2 12 0" stroke="#7db85a" stroke-width="2.6" stroke-linecap="round" fill="none"/>
<use href="#bowl"/>
</symbol>
<symbol id="item-lettuce-burnt" viewBox="0 0 32 32">
<use href="#char"/>
</symbol>
<!-- ============================== dough ============================== -->
<symbol id="item-dough-raw" viewBox="0 0 32 32">
<circle cx="16" cy="18" r="7.5" fill="#d9b97c"/>
<ellipse cx="13.5" cy="15.5" rx="2.4" ry="1.5" fill="#e8d3a5" opacity="0.9"/>
<circle cx="19.5" cy="19" r="0.7" fill="#f2ead8"/>
<circle cx="14.5" cy="20.5" r="0.6" fill="#f2ead8"/>
<circle cx="18.5" cy="14.5" r="0.5" fill="#f2ead8"/>
</symbol>
<symbol id="item-dough-chopped" viewBox="0 0 32 32">
<use href="#grid-dice" style="color: #d9b97c"/>
</symbol>
<symbol id="item-dough-cooking" viewBox="0 0 32 32">
<circle cx="16" cy="10.8" r="2.8" fill="#d9b97c"/>
<use href="#pot-steam"/>
</symbol>
<symbol id="item-dough-cooked" viewBox="0 0 32 32">
<path d="M10 12.4 c1 -2.2 11 -2.2 12 0" stroke="#d9b97c" stroke-width="2.6" stroke-linecap="round" fill="none"/>
<use href="#bowl"/>
</symbol>
<symbol id="item-dough-burnt" viewBox="0 0 32 32">
<use href="#char"/>
</symbol>
<!-- ============================== patty ============================== -->
<symbol id="item-patty-raw" viewBox="0 0 32 32">
<ellipse cx="16" cy="19" rx="8.5" ry="5.5" fill="#8a5a3a"/>
<ellipse cx="16" cy="17.4" rx="7" ry="4" fill="#a06c48"/>
<path d="M11 16.5 c1.5 -1.5 8.5 -1.5 10 0" stroke="#6f462c" stroke-width="0.9" fill="none"/>
</symbol>
<symbol id="item-patty-chopped" viewBox="0 0 32 32">
<use href="#grid-dice" style="color: #8a5a3a"/>
</symbol>
<symbol id="item-patty-cooking" viewBox="0 0 32 32">
<circle cx="16" cy="10.8" r="2.8" fill="#8a5a3a"/>
<use href="#pot-steam"/>
</symbol>
<symbol id="item-patty-cooked" viewBox="0 0 32 32">
<path d="M10 12.4 c1 -2.2 11 -2.2 12 0" stroke="#8a5a3a" stroke-width="2.6" stroke-linecap="round" fill="none"/>
<use href="#bowl"/>
</symbol>
<symbol id="item-patty-burnt" viewBox="0 0 32 32">
<use href="#char"/>
</symbol>
<!-- ============================== fish ============================== -->
<symbol id="item-fish-raw" viewBox="0 0 32 32">
<path d="M8 17 c2.5 -3.5 7 -5 11 -3.5 c2 0.8 3.5 2.4 4 3.5 c-0.5 1.1 -2 2.7 -4 3.5 c-4 1.5 -8.5 0 -11 -3.5 z" fill="#7fb2c9"/>
<path d="M23 17 l5 -3.5 v7 z" fill="#7fb2c9"/>
<circle cx="11.5" cy="16" r="1" fill="#3a322a"/>
<path d="M15 14.5 c1.5 1.5 1.5 3.5 0 5 M18 14.8 c1.2 1.2 1.2 3.4 0 4.6" stroke="#5f95ad" stroke-width="0.9" fill="none"/>
</symbol>
<symbol id="item-fish-chopped" viewBox="0 0 32 32">
<use href="#grid-dice" style="color: #7fb2c9"/>
</symbol>
<symbol id="item-fish-cooking" viewBox="0 0 32 32">
<circle cx="16" cy="10.8" r="2.8" fill="#7fb2c9"/>
<use href="#pot-steam"/>
</symbol>
<symbol id="item-fish-cooked" viewBox="0 0 32 32">
<path d="M10 12.4 c1 -2.2 11 -2.2 12 0" stroke="#7fb2c9" stroke-width="2.6" stroke-linecap="round" fill="none"/>
<use href="#bowl"/>
</symbol>
<symbol id="item-fish-burnt" viewBox="0 0 32 32">
<use href="#char"/>
</symbol>
<!-- ============================== rice ============================== -->
<symbol id="item-rice-raw" viewBox="0 0 32 32">
<ellipse cx="16" cy="19.5" rx="9" ry="5" fill="#e8dfc8"/>
<circle cx="12" cy="18" r="1.8" fill="#f2ead8"/>
<circle cx="16" cy="16" r="1.8" fill="#f2ead8"/>
<circle cx="20" cy="18" r="1.8" fill="#f2ead8"/>
<circle cx="14" cy="20.5" r="1.7" fill="#f2ead8"/>
<circle cx="18.5" cy="20.5" r="1.7" fill="#f2ead8"/>
</symbol>
<symbol id="item-rice-cooking" viewBox="0 0 32 32">
<circle cx="16" cy="10.8" r="2.8" fill="#f2ead8"/>
<use href="#pot-steam"/>
</symbol>
<symbol id="item-rice-cooked" viewBox="0 0 32 32">
<ellipse cx="16" cy="12.2" rx="7" ry="3" fill="#f2ead8"/>
<use href="#bowl"/>
</symbol>
<symbol id="item-rice-burnt" viewBox="0 0 32 32">
<use href="#char"/>
</symbol>
<!-- ============================== plate ============================== -->
<symbol id="item-plate-raw" viewBox="0 0 32 32">
<ellipse cx="16" cy="17" rx="10" ry="6.5" fill="#f6f1e7"/>
<ellipse cx="16" cy="17" rx="10" ry="6.5" fill="none" stroke="#cfc5b5" stroke-width="1.2"/>
<ellipse cx="16" cy="17" rx="5.5" ry="3.4" fill="none" stroke="#e2dbcb" stroke-width="1"/>
</symbol>
<symbol id="item-plate-dirty" viewBox="0 0 32 32">
<ellipse cx="16" cy="17" rx="10" ry="6.5" fill="#f6f1e7"/>
<ellipse cx="16" cy="17" rx="10" ry="6.5" fill="none" stroke="#cfc5b5" stroke-width="1.2"/>
<ellipse cx="13" cy="15.5" rx="3" ry="1.8" fill="#9a8f7a" opacity="0.85"/>
<ellipse cx="20" cy="18.5" rx="2.4" ry="1.5" fill="#8a7d5a" opacity="0.8"/>
<ellipse cx="17" cy="13.8" rx="1.8" ry="1.1" fill="#7d8a5a" opacity="0.8"/>
</symbol>
<symbol id="item-plate-plated" viewBox="0 0 32 32">
<ellipse cx="16" cy="17" rx="10" ry="6.5" fill="#f6f1e7"/>
<ellipse cx="16" cy="17" rx="10" ry="6.5" fill="none" stroke="#cfc5b5" stroke-width="1.2"/>
<ellipse cx="16" cy="16.4" rx="6.5" ry="3" fill="#8a5a3a"/>
<path d="M10.5 15.4 c1 -2 8.5 -2 9.5 0 c0.5 1.2 -8.5 2.2 -9.5 0 z" fill="#7db85a"/>
<circle cx="16" cy="13.4" r="2.6" fill="#e0533d"/>
</symbol>
</svg>