Phase `02_level_content_and_validation` — final verification **green**. - **Gate:** `bash .agents/validate.sh` → ruff ✅ · pyright 0 errors ✅ · `undercooked-levels validate` OK (2 levels) ✅ · **668 passed** (incl. 10 Playwright e2e) ✅ · coverage **100%** ✅ · repo hygiene ✅ - **Criteria:** `validate` exit 0, one line per level; `list` = `01_first_kitchen`, `02_double_shift` in campaign order; live `:8000` `/healthz` 200, `/api/levels` (+detail) carries both levels with numeric `target_score`/`time_limit` and no grid/station leakage, `/api/config` correct, unknown id → 404, startup log `content loaded: 2 level(s), 4 recipe(s)`; `validate --dir tests/fixtures/levels/_bad/` → exit 1 with named `RECIPE_STATION_MISSING` / `SERVE_REACHABLE` / `TARGET_IMPLAUSIBLE`; A8 lock test proves a YAML-only level reaches loader+API+CLI. - **Defect fixed (pre-existing path, phase-02-triggered):** `undercooked` with unusable content printed the report then a raw traceback and exited `1`. `src/undercooked/__main__.py` now catches `ContentError` → one closing line, exit `2` (like a bad setting); 2 new tests in `tests/unit/test_main.py` (incl. non-content failures still propagate). - **Docs pass (full, project-wide):** README (content gate + exit `2`, config section), AGENTS.md §3, `docs/LEVELS.md` (startup refusal + exact CLI exit codes), `docs/DEPLOYMENT.md` (crash-loop diagnosis bullet); DESIGN/TESTING re-read, consistent. - **Container re-verified (no phase-01 regression):** `podman build -f Containerfile` succeeds; the image ships `levels/` and serves `/healthz` 200, `/api/levels` (2 levels), `/` 200 as non-root. - **Deviation to note:** the phase overview names `tests/fixtures/levels/bad/`; the actual broken-fixture dir is `tests/fixtures/levels/_bad/` (the `_` prefix is what keeps it out of normal discovery). Overview files are read-only to me — README/LEVELS.md document the real path. - No git index/history commands run; all changes left unstaged for the harness. ntfy notification sent.
24 lines
880 B
YAML
24 lines
880 B
YAML
# The recipe book for the `_bad` fixture campaign (phase 02 task 05).
|
|
#
|
|
# `undercooked-levels validate --dir tests/fixtures/levels/_bad` needs a book of
|
|
# its own so the fixture stays self-contained: the tests assert on the rule hits
|
|
# of `99_broken_room.yaml`, and those numbers depend on this book, not on the
|
|
# shipped `levels/recipes.yaml`. One dish, `soup`, whose steps name a
|
|
# `chop_board`, a `stove` and a `prep` station — the fixture kitchen omits the
|
|
# stove on purpose.
|
|
ingredients: [tomato, onion]
|
|
|
|
recipes:
|
|
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}
|