test_committed_tres_matches_builder claimed to catch a builder/artifact drift in game_theme.tres, but its checks array hardcoded exactly three variation/state pairs (PrimaryCTA, ParchmentCard, DarkPanel) checking only bg_color. Every other variation — including all five added for the creation screen (SelectCard, SkillChip, ChosenTag, PrimaryTag, PrimaryCard) — could drift from the builder silently, and this test would keep passing on stale data. Textbook docs/traps.md failure: a test that cannot fail against the bug it names. Rewrote it to derive checks from ThemeKeys.ALL: for every variation, every stylebox state the builder actually set is compared (bg_color, border_color, border widths, corner radii for StyleBoxFlat), and every font colour role the builder actually set is compared too. Failures name the variation and the drifted property. Verified by deliberately drifting SkillChip's pressed stylebox in build_game_theme.gd without regenerating the .tres: the new test failed and named SkillChip/pressed/bg_color+border_color; the old three-pair version would not have caught it (SkillChip was never in its list). Reverted the drift; suite is green at 279 again. No pre-existing drift found in the committed artifact. 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.