The entry-point coordinator read as an internal name ("GameFlow" buried in
scenes/flow/), so it wasn't obvious THIS is the scene that boots first — the
title screen looked like the entry point. Renamed to the Godot-conventional
Main (scenes/Main.tscn + scripts/main.gd) so the boot scene is self-evident.
TitleScreen is unchanged and still shown BY Main as its first screen.
Also drops the hand-written gd_scene uid (now matches sibling scenes) —
closes the Minor review finding. Full suite 327/327 green.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
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>
The human's first F6 run found four defects headless GUT could not see, all
now fixed and break-proven.
1. Fifteen Labels shipped invisible. _fonts() sets a default font and size but
never a default font_color for the base Label type, so a Label with no
type-variation inherited Godot's built-in default — WHITE — and rendered
white-on-parchment: the four race names, four race blurbs, and seven calling
names, every unreadable string on the sheet. New CardTitle / CardBody roles
(mock #3a2f1c / #6a5a3a) fix it. NOT a global default Label colour: the Title
screen has 12 bare Labels on a dark background that rely on white.
2. The PRIMARY badge covered the rolled value. The ability card is a
PanelContainer, and a Container force-fits its children, so the badge's
authored anchors were dead letters — it stretched to the card's full width
and centred over the value. Nesting it under a plain Control (not a
Container) restores absolute positioning. The badges also carried _flat()'s
12/6 card padding; a new tight pill stylebox matches the mock's 2px 9px.
3. Race cards overflowed their own border (108px card, 114px of content). Bumped
to 140. The CHOSEN badge on the calling card moved from centre to the mock's
top-right, and the ability card got its own AbilityCard variation with 16px
top headroom for the badge (ParchmentCard is shared with the shell).
4. The default window (1600x900) was larger than a 1600x900 laptop's usable
area, so the WM clamped it to 1589x752 and the run came up pillarboxed.
Default is now 1280x720, resizable; the 1920x1080 design canvas is unchanged
(canvas_items + keep scales it, so no layout number moved).
Also closes M4-b's two open copy items: the cutpurse origin fragment (it
contradicted its own blurb) and the Hint label (it omitted the roll's floor of
8, now pinned to NewGame.roll_attributes).
Guards for 1-4 are new and each was re-broken and watched go red. The overflow
guard in 3 was FIRST WRITTEN AS A TAUTOLOGY — Godot clamps Control.size up to
its combined minimum, so `min <= size` is `x <= x` — and passed against the bug,
29/29, until it was rewritten to measure against the card that clips. That is
traps.md #17 and the thirteenth cannot-fail assertion this branch has caught.
319 client tests green, content build green, theme drift guard satisfied.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Variant C of the mock: seven nameplate calling cards in one row, with the chosen
calling's blurb AND mechanics in a detail panel below — the one card you
committed to is the only one that talks.
Editor-first (ADR 0001): the tree is in the .tscn, the script binds. No rules
here — CreationDraft holds them, CreationCopy derives the display strings, the
prose comes from ContentDB. Emits creation_confirmed(Dictionary); M4-c
constructs. Five ability cards. Never six (§7).
The seed placeholder was a flat 1240 gold — 12.4 million copper under the real
model, which is 1,240 plot points in the command bar. It reseeds to 347c, a
party carrying silver and no gold: '◈ 3s 47c'.
This is the only call site of Currency.format() — the display edge.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QYa9u7Kdxv5gX4AnwWexy8
Wider consumable tiles overflowed the command bar, shoving END TURN under
the dock column. Trim the vitals min-width (230->120) and END TURN
(150->140) and separation so the row fits — END TURN lands cleanly at the
bottom-right, below the dock.
Move the dock handle to the outer (right) side per mock 2a: the menu now
sits left of the handle and slides right off-screen to hide, the handle
staying at the world's right edge. Dock sits flush to that edge.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The 62px tiles clipped longer names (Draught, Antidote). Widen to 93px
(~1.5x) — there is room in the command bar — so labels fit while tiles stay
uniform.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The narration RichTextLabel had no theme styling, so it rendered near-white
and was unreadable on parchment. Add a base RichTextLabel style to the theme
(dark INK_BODY serif at 20px, italic face wired) — systemic and previews in
the editor; every parchment prose surface now reads as dark ink. Also clip
the consumable slot labels so a long name ("Antidote") can't stretch its tile
wider than the empty ones — all 8 stay a uniform 62px.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Move the three shell scenes (SystemDock, NarrationBook, MainWindowShell)
from build-everything-in-_ready() to authored .tscn node trees with the
theme + type-variations set in the editor, so the layout previews and can
be arranged in the Godot editor. Scripts keep only on-load work: @onready
node refs, DM-loop wiring, the dock slide, and binding seed ShellState into
the fixed authored turn-order tokens + consumable slots.
Fixes the dock offset + over-long buttons (now fixed-width DockButtons in a
right-anchored menu). Headless probe: root 1920x1080, world/book split
1180/740, dock at the world's right edge — no collapse. Suite 138/138.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>