The creation screen is done — 302 client tests (up from the 250 baseline), content build green. Also flips the M3 Title screen from planned to done: it shipped in a77bf03/f071392 and the roadmap never caught up, which would have misled M4-c into thinking it must build one. Adds six new trap species to docs/traps.md from this milestone's review passes: substring-collision assertions, a BBCode wrapper masking an empty ContentDB, a test asserting the script's own loop bound, a trivially-true gating fixture, assertions already true before the action under test ran, an "iterates everything" guard that checked three hardcoded pairs, a node-type sweep that missed RichTextLabel, tests that called handlers instead of pressing nodes, GUT silently skipping an unparseable class_name test file at the old count, and a test that can hang instead of fail. Also documents the new client-docs convention: clickable cards are Buttons with mouse_filter = 2 on every child, and pressed on a toggle_mode Button is the chosen state. Human F6 confirmation of the rendered screen against the mock is still outstanding and is not claimed here.
/client — Godot 4.7 game client
GDScript. Holds ALL game state and ALL game rules (charter §2, §4). The AI never mutates state; the client validates and applies everything.
Open: Godot 4.7, import this folder as the project (project.godot).
Responsibilities
- All state: stats, HP/MP, inventory, quest flags, Luck, disposition/approval (§8, §9)
- All rules: deterministic combat, Luck branch-selection, move validation (§6, §7, §10)
- The canon log — compact structured fact list, code-maintained, injected into every call (§11)
- Talks to
/apiover HTTP. No API key, ever. Knows one base URL + role endpoints (§4) - Degrades to authored fallback text (from
/content/fallback) when the API is down (§13)
Key rule — never do this (charter §2)
If an AI response directly sets a variable that persists, stop. Parse → validate → apply or discard.
See docs/ for scene structure, input model, and combat wiring.