Two F6-review follow-ups from the human's read of the running screen.
1. GRANTED skill chips now read as 'you already have this', not 'unavailable'.
The elf's granted `perception` shared SkillChip's dim `disabled` look with the
'picks are spent' chips, so it read as blocked. Split out a fourth state,
SkillChipGranted — a solid gold fill, cream text, and a ✓ prefix (owned) — while
the pool-is-spent chips keep the plain dim disabled. Applied per-chip in _bind_skills.
2. Enlarged the small mono/body/prose roles for readability on sub-1920 laptops
(the 1920 design canvas scales DOWN on a smaller screen, so 11-13px text got
tiny): DM prose 20->22, MONO 13->14, section labels 13->14, card title 19->20,
card body 13->14, chips 11->12, skill chips 12->14, the two flag pills +1. Big
serif headings unchanged.
Two layout consequences the guards caught and I fixed, not silenced:
- Race cards overflowed the taller blurb -> card min-height 140->180 (the overflow
guard, which measures against the card the engine does NOT derive from the text,
went red first; traps.md #17).
- The 9-chip Human bonus row, wider at the bigger font, blew the whole sheet past
the viewport -> BonusRow HBoxContainer -> HFlowContainer so it wraps instead of
forcing the sheet wide. Nothing depends on the row's type (tests check child
count + visibility only).
319 client tests green (theme drift guard + overflow guard included); screenshot-
verified at 1280x720: granted chip owned, no clipping, bonus row wraps cleanly.
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.