**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`.
53 lines
1.6 KiB
JavaScript
53 lines
1.6 KiB
JavaScript
// Undercooked palette (phase 07, task 01).
|
|
//
|
|
// The canvas half of app/static/assets/palette.css: the same hex values,
|
|
// re-exported for the 2D renderer, so a tint in the HUD and a tint on
|
|
// the floor can never disagree. tests/unit/test_assets.py asserts the two
|
|
// files agree in both directions; edit one and the build fails until the
|
|
// other follows. No bundler, no framework, no remote import (A10/A12).
|
|
|
|
export const DEFAULT_PALETTE = Object.freeze({
|
|
cook1: "#e0533d",
|
|
cook2: "#3d84a8",
|
|
cook3: "#7da84b",
|
|
cook4: "#b0699a",
|
|
danger: "#ff5a4e",
|
|
hot: "#ffa63d",
|
|
ready: "#67d16c",
|
|
dirty: "#9a8f7a",
|
|
});
|
|
|
|
// Okabe-Ito (colourblind-safe, deutan/protan) cook colours: the
|
|
// [data-palette="cb"] block of the CSS, the same semantics.
|
|
export const COLORBLIND_PALETTE = Object.freeze({
|
|
...DEFAULT_PALETTE,
|
|
cook1: "#d55e00",
|
|
cook2: "#0072b2",
|
|
cook3: "#009e73",
|
|
cook4: "#cc79a7",
|
|
});
|
|
|
|
/** The four seat colours, in seat order (index 0 is seat 1). */
|
|
export const COOK_COLORS = Object.freeze([
|
|
DEFAULT_PALETTE.cook1,
|
|
DEFAULT_PALETTE.cook2,
|
|
DEFAULT_PALETTE.cook3,
|
|
DEFAULT_PALETTE.cook4,
|
|
]);
|
|
|
|
/** The seat colours under [data-palette="cb"], in seat order. */
|
|
export const COOK_COLORS_COLORBLIND = Object.freeze([
|
|
COLORBLIND_PALETTE.cook1,
|
|
COLORBLIND_PALETTE.cook2,
|
|
COLORBLIND_PALETTE.cook3,
|
|
COLORBLIND_PALETTE.cook4,
|
|
]);
|
|
|
|
/** The semantic state colours shared by the HUD and the canvas. */
|
|
export const SEMANTIC = Object.freeze({
|
|
danger: DEFAULT_PALETTE.danger,
|
|
hot: DEFAULT_PALETTE.hot,
|
|
ready: DEFAULT_PALETTE.ready,
|
|
dirty: DEFAULT_PALETTE.dirty,
|
|
});
|