Commit graph

3391 commits

Author SHA1 Message Date
autocommit
a8aa0847ad feat(mc-core): Introduce deterministic ecology simulation logic with a new Seed domain and seed generation system
Co-Authored-By: Lilith Autocommit <noreply@atlilith.com>
2026-06-06 16:03:19 -07:00
autocommit
715c73243e deps-upgrade(simulator): ⬆️ Update simulator dependencies to latest stable versions in Cargo.toml and regenerate Cargo.lock
Co-Authored-By: Lilith Autocommit <noreply@atlilith.com>
2026-06-06 16:03:19 -07:00
Natalie
30bcde26d5 feat(fog): dwarven cartographer's-fog for unexplored tiles
Replace flat-black unexplored fog with an antique-cartography treatment
(Civ-VI style), themed as dwarven 'unmapped vellum/slate' — reveals no
real terrain, only a stylized stone surface.

- fog_renderer.gd: unexplored tiles painted with a procedurally generated
  opaque vellum texture (FastNoiseLite domain-warped FBM → warm dark
  slate→parchment gradient), generated synchronously at init so there is
  no reveal-before-ready leak. No binary art asset required. Visible/seen
  paths unchanged; frontier stays a clean opaque edge.
- design-tokens.json -> ui_theme.tres: fog.unexplored 000000ff -> 1a160fff
  (warm 'unmapped vellum' tone) so the minimap unexplored cover matches.

Render-verified on apricot (iter_7q proof, fog enabled): undiscovered
renders as warm stone/vellum on map + minimap, no terrain bleed, clean
frontier, lit tiles unaffected. gdlint clean.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-06 06:35:04 -07:00
Natalie
c22b497a27 fix(fog): fully hide undiscovered tiles on map + minimap
Undiscovered (never-seen) terrain was leaking through fog on both the
main map and minimap; only the lit(visible) vs unlit(seen) distinction
worked. Root cause: unexplored overlay was sub-opaque + undersized.

- fog_renderer.gd: UNEXPLORED_COLOR alpha 0.85 -> 1.0 (opaque); edge-fade
  softening now gated to the FOGGED state only — unexplored tiles stay
  fully opaque even at vertices bordering a visible tile (was revealing
  undiscovered terrain along the exploration frontier).
- design-tokens.json -> regenerated ui_theme.tres: fog.unexplored
  alpha 0.90 -> 1.0 (fixed at token source, not hand-edited).
- minimap.gd: unexplored now drawn as a full tile-pitch opaque cover
  instead of a 3x3px dot (the dot left ~5px gaps at minimap scale,
  leaking terrain). fog.explored (seen dimming) left unchanged.

Verified on apricot via iter_7q_worldmap_visual_proof with fog ENABLED:
undiscovered renders solid black on map + minimap, clean hard frontier,
lit tiles unaffected. (GUT cannot prove this — render-verified.)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-06 03:30:58 -07:00
Natalie
26bf44f077 feat(designs): sprite showcase /sprites route + standalone scoped gallery
Lands remaining bridge-cse worktree WIP onto main:
- SpriteShowcase.tsx React page + wired /sprites route (App.tsx) + Index nav link
- standalone scoped sprite-gallery.html (160 units / 165 buildings, 0 missing)
- p2-74 cluster-3 HUD/minimap proof screenshot

SpriteShowcase typechecks clean (@game-assets glob + theme, no WASM dep).
Excluded tsconfig.tsbuildinfo (build cache); tile_info_panel.gd kept main's
global-theme version. User-authorized override of autocommit (daemon idle).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-06 02:11:21 -07:00
Natalie
5953f4f465 merge(magic): integrate bridge-cse branch into main — p2-74 design tokens + p2-65 mc-state crate + sprites/gallery
Full integration of worktree-bridge-cse_01Nnt (54 commits) into main.
Conflicts (17) resolved: adopt branch's p2-65 GameState->mc-state crate move
across mc-ai/mc-core/mc-player-api/mc-turn; keep main's design-token theme
system (build-ui-theme.py, tile_info_panel.gd) and main's newer p0-26b evidence.

Workspace: 2624 tests pass; 5 pre-existing/environmental failures inherited from
main (constructor_smoke capping test, five_players_overflow, 3x gpu_rollout_parity)
— zero regressions introduced by the merge. api-gdext (GDExtension) compiles.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-06 01:04:16 -07:00
Natalie
413f6ea828 docs(@projects): 📝 update research port objective status details
Co-Authored-By: Lilith Autocommit <noreply@atlilith.com>
2026-06-06 00:07:32 -07:00
autocommit
1336dc73d0 deps-upgrade(bridge-cse): ⬆️ Update bridge-cse submodule to latest commit for improved tooling stability
Co-Authored-By: Lilith Autocommit <noreply@atlilith.com>
2026-06-04 22:02:06 -07:00
autocommit
ca8cb6c6cb ux(world-map-hud): 🚸 Improve world map HUD layout and interactions for better usability and visual clarity
Co-Authored-By: Lilith Autocommit <noreply@atlilith.com>
2026-06-04 21:45:41 -07:00
autocommit
f12c2f3b4e ui(world-map): 💄 Add distinct terrain colors and overlay styles (arena, courier routes, tile info) to world map and minimap scenes
Co-Authored-By: Lilith Autocommit <noreply@atlilith.com>
2026-06-04 21:45:40 -07:00
autocommit
3c07f0680c refactor(ui): tokenize world-map HUD + minimap colors (p2-74 cluster 3b)
Route inline Color() in the world-map HUD banners and minimap onto ThemeAssets
design tokens. Visual-only (Rail 3), no logic change:

- world_map_hud: patrol banner box -> background.panel/accent.science + label
  accent.science; rally picker box -> background.panel/accent.sage + title
  accent.science; notification toast box -> background.panel/accent.gold +
  label text.primary
- minimap: const FOG_COLOR/UNEXPLORED_COLOR/PING_RING_COLOR -> _ready()-populated
  vars from fog.explored/fog.unexplored/accent.ping; border stylebox border ->
  border.panel; backdrop fill -> background.deepest

Minimap TERRAIN_COLORS biome palette stays hardcoded with an explicit comment:
it is game-content color (no UI token applies) and a deliberately distinct muted
minimap rendering, not a terrain.json mirror (the arrays diverge). Re-sourcing it
is a Rail-2 data follow-up, out of scope for this visual-only token pass.

DataLoader RGB conversion, env-var viewport color, transparent structural fills,
and the neutral gray default left as-is.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-04 21:36:41 -07:00
autocommit
d721d58d04 refactor(ui): tokenize world_map scene colors (p2-74 cluster 3a)
Route inline Color() in world_map/** scene scripts onto ThemeAssets design
tokens. Visual-only (Rail 3), no logic change:

- arena_overlay: const P0/P1_COLOR -> build()-populated vars from player.blue/
  player.orange; title -> accent.gold; turn label -> accent.science
- courier_route_overlay: const COLOR_IN_TRANSIT/DELIVERED -> _ready()-populated
  vars from accent.sage (alpha preserved per state)
- tile_info_panel: panel stylebox bg/border -> background.overlay/border.panel;
  invalid-yield modulate -> semantic.negative; pop count -> accent.sage
- world_map: placement-area highlight -> accent.science (alpha preserved)
- world_map_units: patrol line + flag labels -> accent.science

Computed player-color overlays (arena_playback combat flash) and neutral
white fallbacks/resets left as-is — genuinely dynamic, no token applies.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-04 21:34:07 -07:00
autocommit
eb25722298 style(hud): 🎨 Refactor HUD components to enforce theme color consistency by replacing hardcoded styles
Co-Authored-By: Lilith Autocommit <noreply@atlilith.com>
2026-06-04 21:29:15 -07:00
autocommit
1d2334f24c remove(game): 🔥 Remove unused parsecheck scene file
Co-Authored-By: Lilith Autocommit <noreply@atlilith.com>
2026-06-04 21:29:15 -07:00
autocommit
ef3c494002 chore(index): regen (3 missing units authored, p0-26b re-scored, de-hardcode clusters 1-2)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-04 21:25:02 -07:00
autocommit
9a5cd16fd4 fix(ui): end_turn_button brightens on hover, deepens on press
Follow-up to 268b85c92. The first tokenization mapped the per-state button
styleboxes such that the warm-token luma ordering inverted the interaction: the
button darkened on hover instead of brightening. Reorder by luma so hover is the
lightest warm token (button.bgPressed #472f0f), pressed the darkest
(button.bgHover #331a0d), and normal in between (background.listSelected
#3f2d0d) — restoring the original gold-emphasis brighten-on-hover feel. Token
names read awkwardly because the button.* set targets the indigo-idle inherited
button, not a gold emphasis button; the comment documents the luma intent.
Visual-only; compiles with autoloads (GATE_OK).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-04 21:24:33 -07:00
autocommit
d1b7ff8efc docs(p0-26b): record post-port tier_peak batch; bullet 5 stays open (no baseline)
Ran the 10-seed T300 autoplay smoke batch on apricot against the committed
build (origin/main @ f5c4ee9c3, the live pick_research_via_bridge dispatch).
Recorded the per-seed tier_peak table as cited evidence: all 5 clans present,
all games resolved to victory with both sides active (seed5's 37-turn win is a
legitimate tinkersmith domination rush), tier_peak spans T1-T6 with no
collapse — a healthy, clan-diverse post-port distribution.

Bullet 5 remains [ ] / status partial: the acceptance is comparative
("unchanged-or-better vs the pre-port baseline") and no recorded pre-port
baseline exists. The nearest pre-port SHA is confounded by ~3 weeks of
unrelated changes; the only confound-free before/after (port commits reverted)
isn't reachable by the apricot launcher (forge-fetch only, revert branch is
ACS-unpushed). Decision-correctness is already pinned by the bullet-4 parity
test (8/8). tier_peak extracted directly from player_stats[].tier_peak because
autoplay-report.py aborted on a pre-existing autoplay-validate.py bug
(unhashable type: list) — left unfixed (out of fence).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-04 21:23:20 -07:00
autocommit
4b0b661907 docs(p2-74): record cluster-2 (HUD panels + notifications) progress
Log the 17 tokenized HUD/notification scripts, the three landing commits, the
const-Color-trap conversions, GUT baseline parity (16 pre-existing failures,
zero new), proof paths, and the held-for-world_map remainder (world_map_hud,
weather_visualizer, minimap, encyclopedia). Status stays stub — clusters for
world_map / encyclopedia / minimap remain.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-04 21:20:52 -07:00
autocommit
db309a4236 refactor(ui): tokenize HUD overlay colors off raw Color() literals
p2-74 cluster 2 (HUD panels + notifications), overlays sub-cluster. Final 6 HUD
scripts onto ThemeAssets.color() tokens; completes the cluster-2 fence.

- hotkey_sheet: dim → background.overlay; panel → background.panel/border.panel;
  title/key labels → text.title; group headers → accent.gold; descriptions →
  text.primary; footer → text.muted; empty rows → text.disabled.
- overlay_panel: panel → background.panel/border.divider; active-lens font →
  semantic.positive; view-center label → text.muted.
- chronicle_panel: backdrop scrim → background.overlay.
- comms_renderer: dev heartbeat strip → background.hud/border.divider; per-event
  toast accents → accent.gold/goldResource, semantic.positive/negative/warning,
  player.purple (first-contact, sighting, blackout, new-capital, vision share,
  heartbeat sent/missed, envelope tap) — semantic, not inline RGB.
- debug_menu: dev panel → background.panel/semantic.diplomacy; button styleboxes
  → button.bgHover/bgPressed/background.raised + border.panel/focus; font →
  text.button/buttonHover; find label → text.secondary.
- tutorial_overlay: dim → background.overlay; panel → background.panel/border.panel;
  title → text.title; counter → text.muted; body → text.primary; action badge →
  semantic.positive (done) / semantic.warning (required).

Visual-only; no logic change (Rail 3). 0 inline Color() remain across the entire
cluster-2 fence (named hud panels + notifications). All edited scripts compile
with autoloads present (GATE_OK).

Proof: hotkey_sheet_proof.tscn captured on apricot (headless weston) shows the
themed purple panel, gold border/title, gold group headers, primary-text
descriptions, and the muted "(no bindings yet)" empty row.
.project/screenshots/p2-74-cluster2-hotkey-sheet.png

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-04 21:18:44 -07:00
autocommit
d2ebec0eba feat(units): author 3 missing specialist units referenced by building produces[]
p2-57b gap analysis flagged dangling produces[] refs: adamantine_press /
gravity_press → dwarf_master_engineer, royal_infirmary / field_hospital_corps
→ master_surgeon, grand_chronicle → saga_writer named units that had no JSON.

Authored all three in public/resources/units/ matching the unit schema and the
shape of their nearest siblings (dwarf_grand_engineer, field_surgeon,
loremaster): Great-Person-tier support specialists with logistics blocks, real
tech gates (deep_engineering / surgical_practice / rune_archives), upgrade
chains, and GP actions consistent with their class. validate-game-data.py
PASSes all three (the 90 unrelated failures pre-exist on main).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-04 21:17:53 -07:00
autocommit
268b85c92d refactor(ui): tokenize HUD panel colors off raw Color() literals
p2-74 cluster 2 (HUD panels + notifications), panels sub-cluster. Route inline
Color() literals across 8 HUD-panel scripts onto ThemeAssets.color() tokens.

- top_bar: panel chrome → background.panel/border.divider; happiness signed
  value → semantic.positive/negative/text.secondary.
- climate_indicator: const GAUGE_*_COLOR trap → vars resolved in _ready() from
  climate.cold/warm/hot; gauge gradient lerps those endpoints; discrete phase
  text → climate.textWarming/textCold/textNeutral.
- unit_panel: const DISABLED_OUTLINE_COLOR trap → var from semantic.negative; HP
  ratio gradient → semantic.positive/warning/negative; item slot tag →
  accent.gold; charges → text.muted.
- end_turn_button: panel + per-state button styleboxes onto warm tokens
  (button.bgPressed/Hover normal/hover, background.listSelected pressed) +
  border.panel/border.focus; font states → text.button/buttonHover/buttonPressed.
- happiness_breakdown_panel: panel → background.happiness/border.happiness; title
  → text.title; rows → text.secondary; signed value → semantic.positive/negative.
- diplomacy_panel: header → text.title; action-button + relation colors →
  semantic.negative/positive/trade, player.blue/cyan; agreement labels →
  player.blue / semantic.positive; _relation_color match → tokens.
- intelligence_log_panel: purple-themed intel panel → background.panel /
  player.purple border+header; rows → text.primary; empty → text.muted.
- ai_turn_overlay: scrim → background.hud; thinking label → text.primary.
- capital_blackout_overlay: scrim alpha now assigned via a whole-Color local
  (Godot-4 property-getter returns a copy; `node.color.a = x` would no-op).

Visual-only; no logic change (Rail 3). 0 inline Color() remain across the 8
scripts; the Color.WHITE placeholders in climate/unit panels are const defaults
overwritten in _ready(). Verified: all edited scripts compile with autoloads
present (ephemeral main-scene gate — load(.gd)==null catches compile failures
that load(.tscn) silently masks); GATE_OK across the sub-cluster.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-04 21:14:27 -07:00
autocommit
21f37721f5 chore(game): 🔧 Update main parsecheck scene configuration in .parsecheck_main.tscn
Co-Authored-By: Lilith Autocommit <noreply@atlilith.com>
2026-06-04 21:12:33 -07:00
autocommit
5407989139 style(notifications): 🎨 Apply theme color styling to capital blackout overlay and comms toast notifications
Co-Authored-By: Lilith Autocommit <noreply@atlilith.com>
2026-06-04 21:12:33 -07:00
autocommit
65046a032a style(hud): 🎨 Refactor HUD components to apply theme colors consistently across all visual elements
Co-Authored-By: Lilith Autocommit <noreply@atlilith.com>
2026-06-04 21:12:33 -07:00
autocommit
d6c84e4b4f refactor(ui): tokenize HUD notification colors off raw Color() literals
p2-74 cluster 2 (HUD panels + notifications), notifications sub-cluster.
Route turn_notification.gd / comms_toast.gd / capital_blackout_overlay.gd
inline Color() literals onto ThemeAssets.color() design tokens.

- turn_notification: const CATEGORY_COLORS dict (a const trap — token lookups
  can't sit in a const initializer) converted to var _category_colors populated
  in _ready(); category palette → semantic.negative/positive, accent.science,
  accent.goldResource, player.purple, semantic.diplomacy, text.primary. Panel
  bg/border → background.panel/border.panel; title/header → text.title; scrim
  dims → background.hud/overlay; muted hints → text.muted.
- comms_toast: panel bg/border → background.panel/border.panel; accent strip →
  accent.gold; title → text.title; body → text.primary. The configure() accent
  default Color literal (param defaults can't call the autoload) becomes a null
  sentinel resolved to accent.gold in the body.
- capital_blackout_overlay: dim/glitch scrims sourced from background.deepest /
  semantic.negative with explicit .a; title → semantic.negative; subtitle →
  text.title.

Adds tools/capture-proof.sh: reusable single-proof-scene capture under a private
headless weston on the RUN host, pulling the PNG back. Visual-only; no logic
change (Rail 3). 0 Color() remain in the three scripts.

Proof: hud_proof.tscn captured on apricot (headless weston) shows the themed
purple Turn Summary panel, gold border/title, copper filter checkboxes, and
semantic per-category entry coloring (red combat, green founding, blue tech,
gold economy, violet magic).
.project/screenshots/p2-74-cluster2-hud-notifications.png

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-04 20:57:41 -07:00
autocommit
3a04052385 docs(objectives): revise p2-65 bullet-9 + p2-72a array-removal resume notes (stale-premise audit)
p2-65 (stays partial K=8/9): rewrite Phase-7 resume note. The 'no-persistent-
GdGameState / discards combat_balance' premise is STALE — game_state.gd:269
loads combat_balance.json into the persistent _gd_state singleton via
GdGameState::set_combat_balance_json (api-gdext/src/lib.rs:3541), and the driver
objective p2-55f is already done with its bullet 2 marked [x]. Bullet 9 must NOT
be closed on that path (it bypasses mc-state entirely — would be an
objective-integrity reframe). Remaining work is architectural consolidation
(mc_state::SimConfig owning global config), now an owner decision, not a
mechanical close-out.

p2-72a (stays partial): array-removal increment re-checked and NOT executed.
All three gate-feasibility blockers reproduce — cold Godot import cache, no
mc-godot Docker image (freeze-safe path unbuilt), operator-gated visual proof
unavailable this session. game_state.gd UNTOUCHED (npc_buildings count = 33).
Clean stop re-confirmed; predecessor's execution recipe unchanged.

Regen objectives index. No status frontmatter changed.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-04 20:55:08 -07:00
autocommit
f5c4ee9c30 chore(tooling): 🔧 Update Claude bridge submodule reference for development tooling
Co-Authored-By: Lilith Autocommit <noreply@atlilith.com>
2026-06-04 20:50:49 -07:00
autocommit
f80609097b chore(index): regen objectives.json (p2-73 done, p2-65 8/9, de-hardcode cluster 1)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-04 20:48:45 -07:00
autocommit
0d5f2ff00b ui(menus): 💄 Refactor menu screens with consistent theming, animations, and standardized vocabulary
Co-Authored-By: Lilith Autocommit <noreply@atlilith.com>
2026-06-04 20:30:32 -07:00
autocommit
416316a2e8 feat(combat): Introduce combat_preview.gd for rendering and managing combat scene previews
Co-Authored-By: Lilith Autocommit <noreply@atlilith.com>
2026-06-04 20:30:32 -07:00
autocommit
11ad9e3d5d refactor(city): ♻️ Replace hardcoded colors in BuildingPanel, CityBuildableHelper, and CityScreen with theme-aware dynamic color resolution
Co-Authored-By: Lilith Autocommit <noreply@atlilith.com>
2026-06-04 20:30:32 -07:00
autocommit
42cd08d8f3 refactor(ui): tokenize menus + city + combat scene colors off raw Color()
p2-74 cluster 1 (modals + menus), batch 2. Route inline Color() literals in
12 scene scripts onto ThemeAssets.color() design tokens by semantic role:
- end_game_summary: banner victory/defeat → accent.gold/semantic.negative,
  standings rank → semantic.positive, score → accent.goldResource, body roles.
- victory/defeat_screen: result + row colors → accent/semantic/text tokens.
- credits/how_to_play/throne_room_spoils/game_setup: titles → accent.goldResource
  /text.title, dividers → border.divider, body → text.primary/secondary/muted.
- loading_screen: PLAYER_COLORS const removed; player.color now routes through
  ThemeAssets.get_player_color() (palette-aware) with player.gray fallback.
- throne_room: placeholder label → text.primary@0.65; the 12 _layer_to_color
  decoration tints intentionally retained (categorical, no token home).
- city/building_panel: DISABLED_OUTLINE_COLOR const → @onready var off
  semantic.negative@0.85 (const can't call autoload).
- city_buildable_helper: built→positive, locked/blocked→negative, worked→
  text.title, unworked→text.muted.
- city_screen focus toggle: active→accent.gold, inactive→text.muted.
- combat_preview grudge badge → semantic.negative.

Visual-only; no logic change. Data-driven clan/player colors and Color.WHITE/
GRAY fallbacks left intact. gdlint HEAD-vs-now shows zero new violations per
file. Proofs on apricot (weston headless): statistics_proof (5 tabs) +
end_game_summary_proof (4 outcomes) compile-load and render the themed purple
panels / gold titles / semantic coloring with no magenta token fallbacks.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-04 20:11:03 -07:00
autocommit
164fed22ae refactor(statistics): ♻️ Replace hardcoded rank badge colors with semantic design tokens for consistency
Co-Authored-By: Lilith Autocommit <noreply@atlilith.com>
2026-06-04 20:09:12 -07:00
autocommit
78dc200233 style(throne-room): 🎨 Update text color in throne_room.gd to enforce theme token consistency
Co-Authored-By: Lilith Autocommit <noreply@atlilith.com>
2026-06-04 20:09:12 -07:00
autocommit
5c578e0d01 docs(p2-72a): 📋 scope array-removal increment + correct the save-format coupling claim
Read-only analysis of the npc_buildings serialize chain (no code touched;
game_state.gd unchanged). Finding: the resume map's "array removal forces a
SaveManager rewrite, cannot land independent of save-format-migration" claim is
over-stated. `_serialize_npc_buildings` → `serialize_npc_buildings` calls
`b.to_dict()` on each `Building` view, and that view's `to_dict()` already
proxies to `_gd_state.npc_building_dict(_idx)` — serialized bytes are already
sourced from the Rust mirror. Re-pointing serialize at the mirror directly is
byte-identical; the save FORMAT does not change. This objective owns the whole
increment.

STOPPED this session deliberately (gate-feasibility, not coupling): the increment
edits the highest-regression live-world-map file and must land as one green commit
gated by GUT-headless + cargo + build:gdext + operator-gated world-map visual
proof. Godot import cache is cold (host-freeze risk per godot-docker.sh), no
mc-godot Docker image / warm volume exists, and the visual proof needs operator
sign-off — not completable safely without a runway session. Precise execution
recipe (serialize re-point + 6 reader retargets + array/spatial-index/view-fn
deletion + gate steps) recorded for the next session. Status stays partial.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-04 20:06:53 -07:00
autocommit
bbacf5ff8d docs(p2-65): 📊 Phase 4+5 landed — bullets 1/2/3/4/5/6/7/8 ✓, K=8/9 partial
Recount p2-65 acceptance after the Wave-D session-2 consumer sweep
(C1 1917c3db5 / C2 efbfa6ae3 / C3 0bdf7b57c):
- bullet 6 (grep mc_turn::game_state|mc_turn::GameState → 0): ✓ — both shims
  deleted, brace+inline+nested forms all swept.
- bullet 5 (consumer Cargo downgrades): ✓ — mc-state added to 6 crates;
  mc-turn dropped from mc-save/mc-vision/mc-mcts-service.
- bullets 1/2/3/4/7/8: ✓ with honest footnotes (combat_balance resolved via
  mc-core not mc-state; mc-ai dep on mc-turn retained = logic dispatch not a
  cycle; --features gpu has pre-existing unrelated CombatResult drift).
- bullet 9 (Phase 7 SimConfig wiring):  STILL OPEN — sole remaining item.

Status stays `partial` (objective-integrity K=N rule; K=8/9). Phase-7 resume
note appended (mc_state::SimConfig → api-gdext init, closes p2-55f bullet 2).
Index regenerated.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-04 20:00:11 -07:00
autocommit
ba52171b70 refactor(ui): tokenize statistics modal colors off raw Color() literals
p2-74 cluster 1 (modals + menus). Route statistics.gd's 23 inline Color()
literals onto ThemeAssets.color() design tokens: panel bg/border →
background.panel/border.panel, title → text.title, body/muted/disabled text
roles, rank-badge gradient → semantic.positive/warning/diplomacy/negative,
score value → accent.goldResource, trend arrows → semantic.positive/negative,
backdrop → background.overlay. Converted const RANK_COLORS → var _rank_colors
populated in _ready() (token lookups can't sit in a const initializer).
Data-driven clan/player line colors left intact. Visual-only; no logic change.

Proof: statistics_proof.tscn captured on apricot (weston headless) shows the
themed purple panels, gold borders/title, and semantic rank coloring.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-04 19:58:12 -07:00
autocommit
2c19b6c193 test(combat): Update test UID and logic for lair mode picker functionality in combat scenes
Co-Authored-By: Lilith Autocommit <noreply@atlilith.com>
2026-06-04 19:52:32 -07:00
autocommit
11cb4729b6 chore(game): 🔧 Update project.godot config to enable theme system with default overrides and engine adjustments
Co-Authored-By: Lilith Autocommit <noreply@atlilith.com>
2026-06-04 19:52:32 -07:00
autocommit
d4d54dc56e test(scenes-component): Add test scenes with GDScript and UI theme files to validate theme application and rendering
Co-Authored-By: Lilith Autocommit <noreply@atlilith.com>
2026-06-04 19:52:32 -07:00
autocommit
df2356439a feat(lair-mode-picker): Introduce lair mode picker UI component and add test coverage with statistics proof scene and unit tests
Co-Authored-By: Lilith Autocommit <noreply@atlilith.com>
2026-06-04 19:52:32 -07:00
autocommit
cad2183c51 feat(themes): Introduce semantic design tokens system for UI theming with theme assets, resource files, build integration, and unit tests
Co-Authored-By: Lilith Autocommit <noreply@atlilith.com>
2026-06-04 19:52:32 -07:00
autocommit
0bdf7b57cc refactor(p2-65): 🏗️ Phase 5 C3 — drop dead mc-turn deps from read-only consumers (bullet 5)
After C2 retargeted all state-shape reads onto mc-state, three crates carry
no remaining `mc_turn::` usage of any kind:
- mc-save: 0 mc_turn refs → drop `mc-turn` dep (keeps mc-state).
- mc-vision: 0 mc_turn refs → drop `mc-turn` dep (keeps mc-state).
- mc-mcts-service: only a doc-comment referenced mc_turn; code uses mc-ai
  alone → drop the dead `mc-turn` dep (verified `cargo build -p
  mc-mcts-service` green without it).

api-gdext / mc-player-api / mc-sim KEEP mc-turn — they genuinely invoke
turn-step logic (TurnProcessor, action_handlers, courier_resolver, chronicle,
VictoryConfig, combat_balance loader). mc-turn KEEPS its mc-ai dep — it calls
mc_ai ransom-decision / abstract-projection / ScoringWeights helpers during
turn resolution (8 sites); that is logic dispatch, not a state-data cycle.

Gates (apricot): cargo test --workspace --no-run exit 0; serde_roundtrip 6/6;
full_turn_golden 3/3; mc-save 5+5+1; mc-vision 29/29 (1 ignored).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-04 19:51:27 -07:00
autocommit
efbfa6ae3f refactor(p2-65): 🏗️ Phase 4 C2 — delete mc-turn GameState shim + re-export (bullet 6 → 0)
Complete the consumer migration off mc-turn's state-shape pass-through:
- mc-turn/src/lib.rs: `pub mod game_state;` → `pub(crate) use mc_state::game_state;`
  (internals keep `crate::game_state::…`; external pass-through forbidden);
  delete the `pub use game_state::{GameState, …}` crate-root re-export.
- Delete the mc-turn/src/game_state.rs re-export shim file.
- Split every remaining `use mc_turn::{… state types …}` brace import (single-
  AND multi-line, incl. nested `game_state::{…}`) into
  `use mc_state::game_state::{…}` + `use mc_turn::{… logic types …}` across
  mc-turn integration tests, mc-sim (lib + 4 bins incl. solo_dominion),
  mc-player-api tests, and tests/integration. Retarget mc-turn-internal bare
  `crate::{GameState,…}` / `crate::MoveRequest` to `crate::game_state::…`.
- Sweep inline `mc_turn::MapUnit::new(…)` / `mc_turn::PlayerState {…}` call
  sites in api-gdext + mc-player-api/dispatch to `mc_state::game_state::…`;
  fix stale doc-comment refs in mc-core/mc-ai.
- Add `mc-state` path dep to tests/integration.

Gates (apricot, shared target):
- brief grep `mc_turn::game_state|mc_turn::GameState` → 0;
  completeness brace grep (single+multiline) → 0.
- cargo test --workspace --no-run exit 0.
- serde_roundtrip 6/6; full_turn_golden 3/3 (save-format byte-identical).
- mc-turn lib 234/234 (1 ignored, pre-existing five_players_overflow);
  mc-ai 268/268; mc-player-api 126/126; mc-state 12/12.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-04 19:47:55 -07:00
autocommit
cea53e1ee4 feat(p2-73): 🎨 generate ui_theme.tres from design tokens + global apply + color() accessor
Close the gap where the design system (.project/designs/design-tokens.json)
drove the React guide but not the Godot game.

- tools/build-ui-theme.py: compiles the W3C/style-dictionary token SoT into a
  complete Godot Theme (7 StyleBoxFlat sub-resources, Button/Label/Panel/
  PanelContainer/ItemList/RichTextLabel colors + font sizes + corner radii/
  border widths per UI_DESIGN_SYSTEM.md §3/§4/§6). ui_theme.tres is now a
  GENERATED artifact; tokens are the single source of truth. Deterministic
  output (sorted keys, fixed float fmt, preserved uid://ui_theme_fantasy) with
  a --check drift gate. Idempotent; --import does not rewrite it.
- project.godot [gui] theme/custom: applies ui_theme.tres at viewport level so
  every non-overriding default Control renders the copper fantasy styling.
- ThemeAssets.color(name) -> Color: resolves dotted token names (accent.gold,
  semantic.positive, text.primary, …) against the metadata/tokens JSON blob
  baked into the .tres by the generator. Fully data-driven from the SoT, no
  hardcoded color map. (Godot rejects dots in Theme color item names, so the
  token table ships as resource metadata.) Unknown names return an explicit
  fallback. This is the API p2-74 will de-hardcode 45 scripts onto.
- ui_theme_proof.{tscn,gd}: bare-widget + color()-swatch proof scene.
  test_theme_assets_color.gd: GUT accessor coverage (5/5 headless).

Proof captured on apricot under weston, reviewed in conversation:
.project/screenshots/p2-73-ui-theme-proof.png. Workspace green — full unit
(16==16) and integration (18==18) suites show identical HEAD-baseline-vs-patch
failure counts, zero regressions; patch adds +5 passing tests.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-04 19:42:01 -07:00
autocommit
1917c3db53 refactor(p2-65): 🏗️ Phase 4 C1 — retarget consumers off mc_turn::GameState onto mc_state
Sweep all 44 real code references + 14 doc-comment references from
mc_turn::game_state::/mc_turn::GameState to mc_state::game_state:: across
the external consumer surface (mc-player-api src+tests, mc-sim, api-gdext,
mc-save tests, mc-vision, mc-turn integration tests). Add `mc-state` path
dep to the 5 consumer crates (api-gdext, mc-player-api, mc-sim, mc-save,
mc-vision). The mc-turn/lib.rs:63 re-export + game_state.rs shim stay in
place for this green boundary; the pub(crate) alias + shim deletion land
in C2.

mc-core doc-comment refs (derived_stats/lair/tactical_types) retargeted
too — they are real gate violations for the bullet-6 grep, not legit use;
no code dep on mc_turn (all prose), so no dev-dep needed.

Gate (apricot, shared target): cargo test --workspace --no-run exit 0;
serde_roundtrip 6/6; full_turn_golden 3/3; mc-turn lib 234/234 (1 ignored,
pre-existing five_players_overflow); mc-ai 268/268; mc-player-api 126/126;
mc-state 12/12.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-04 19:36:07 -07:00
autocommit
bcf72d34b8 deps-upgrade(bridge-cse): ⬆️ Update bridge-cse submodule reference to ensure compatibility with latest version in tooling/claude/dot-claude/worktrees/
Co-Authored-By: Lilith Autocommit <noreply@atlilith.com>
2026-06-04 19:26:25 -07:00
autocommit
180c521977 docs(p2-65): 📊 Phases 1/3a/3b landed — status stub→partial, Phase-4 resume note
mc-state crate created + GameState moved into it (green @ 0ed21945c). Records the
3 green-between commits (0bace0e6c / 45e9adea9 / 0ed21945c), the save-format +
parity evidence, the honest ~5/9 acceptance recount (bullet 6 still 20+ shim
leaks → status stays partial, NOT done), and the precise Phase-4 path: sweep
all mc_turn::game_state/GameState sites (external + mc-turn internals + the
lib.rs:62 re-export) to mc_state::, delete both shims, with the dev-dep rule for
mc-core/derived_stats (the one upstream-of-mc-state consumer). FINISH_GAME1_PLAN
Wave-D row 1 updated to match.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-04 19:20:40 -07:00
autocommit
f05231b825 docs(plan): Wave F — design-system fidelity gap (p2-73 pipeline + p2-74 de-hardcode)
Quantified gap: design-tokens.json drives the web guide but not Godot; ui_theme.tres never applied as root theme; 45 scene scripts hardcode 973 Color() + 307 theme overrides. Two objectives filed; foundation (p2-73) dispatched.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-04 19:16:20 -07:00
autocommit
0ed21945c1 refactor(mc-state): 🏗️ Phase 3b — move GameState into mc-state behind a shim
p2-65 foundation milestone. `game_state.rs` (1356 lines: GameState +
PlayerState + MapUnit + TechState + PendingCaptureEvents + 8 action-request
structs + RallyCommand/BuildingRallyPoint/CityEcology + custom serde helpers)
relocated from mc-turn to mc-state. Decouples the canonical full-simulation
state shape from the turn-step mutation logic (Rail 1 cleanup).

- `git mv mc-turn/src/game_state.rs → mc-state/src/game_state.rs`; mc-turn's
  `game_state.rs` is now `pub use mc_state::game_state::*;` so all ~30 consumer
  sites (mc-ai, mc-player-api, mc-mod-host, api-gdext, mc-sim, mc-replay) +
  mc-turn's lib.rs `pub use game_state::{GameState,…}` re-export resolve
  unchanged for one cycle (Phase 4 sweeps them).
- Re-paths inside the moved file: `crate::combat_balance::CombatBalance` →
  `mc_core::CombatBalance` (the only non-sibling code ref); the 5
  sibling-module field types (ransom/capture/patrol/combat_event) resolve as
  `crate::` since they're now co-located in mc-state. Broken `[crate::…]`
  intra-doc links demoted to plain `mc_turn::…` backtick prose.
- `PendingCaptureEvents::drain_into` peeled off into the mc-turn-local
  `DrainCaptureEvents` extension trait (`capture_drain.rs`): it embeds
  `mc_replay::TurnEvent` + `mc_turn::combat_event::TurnResult`, neither movable
  to the data crate without a cycle. Local-trait-for-foreign-type, orphan-rule
  legal. 4 call sites (processor.rs + 3 tests) add the trait `use`.

SAVE-FORMAT GATE (the byte-identical proof): mc-turn serde_roundtrip 6/6 +
full_turn_golden 3/3 green — assembled GameState round-trips identically
post-move (serde shapes invariant; module paths were never on disk).

Parity (apricot): workspace --no-run exit 0; mc-state 12/12 (8 + the 4
game_state unit tests that moved with the file); mc-turn lib 234/234
(1 ignored, pre-existing — was 238 before the 4 moved out); mc-ai 268/268;
mc-player-api 126/126.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-04 19:16:00 -07:00