Review found three tests in test_character_creation_screen.gd could not fail against the bug they named — including both tests claiming to enforce §7 (Luck is invisible) and the only test covering origin->calling gating. The five-ability-cards test asserted the script's own range(5) loop bound, not the scene. The Luck sweep filtered on `Label` and missed both RichTextLabels (the only nodes rendering authored prose) plus every Button and the LineEdit. The reroll test's pool assertion already held true before the reroll ran. The origin-gating test ran only against the deserter origin, which allows all 7 callings, so shown==allowed was a trivial 7==7. Rewrote all four to assert against the scene, the rules tables, or a restrictive injected origin instead of values the code already guaranteed. Added a node-count guard tying authored cards/chips to Races/Callings/ Skills/Attributes table sizes. Deleted the test-only _complete_a_valid_draft_for_test() from the shipped Control and replaced it with a test-file helper that drives the real click handlers, closing the gap where no test touched _on_race_pressed/_on_calling_pressed/ _on_pool_pressed/_on_bonus_pressed at all. Guarded _ready() against a degenerate origin (empty/missing allowed_callings) indexing an empty array. Each fixed guard was deliberately re-broken and confirmed red before being reverted (see .superpowers/sdd/task-6-report-fix.md, gitignored). 291 tests green, up from 289. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
/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.