New commands: author (generates proposal JSON per system from wiki + DB
data), commit-system (writes approved proposal to DB), wipe-system
(clears a system's bodies/stations), unfinished (lists systems without
bodies). Removed the batch populate command.
The author command reads the wiki page, extracts habitable/inhabited
counts, generates a body ID matrix based on star type, and writes a
reviewable JSON proposal. Human reviews, edits, then commits.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Rust binary (server/src/bin/atlas.rs) with commands: show-system,
show-body, show-station, list-bodies, list-stations, add-body,
add-station, stats, populate. Reads from server/data/systems.db.
Wrapper at tooling/atlas, skill at .claude/skills/atlas/SKILL.md.
Scope note: atlas will grow to cover the full geographic hierarchy
(planetary surfaces, settlements, districts) as the cascade progresses.
Also: removed stale star_systems table from settledreach.db (belongs
in systems.db only) and ran initial populate pass (329 bodies + 301
horizon stations across 301 systems).
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
New tables for the celestial body hierarchy below system level:
- bodies: planets, moons, gas giants, asteroid belts, oort clouds
with physical properties, settlement data, and cultural overrides
- stations: orbital/surface facilities with type, population,
docking class, and gate infrastructure flag
Naming convention: GJ-{n}b (planet), GJ-{n}b-1 (moon),
GJ-{n}b-S1 (station), GJ-{n}-oort (oort cloud).
Self-referential parent_body_id for moon→planet relationships.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Three wireframes for the Reach Navigator insert app:
- Galaxy hop-ring map (concentric layout, sector-colored, contextual gate lanes)
- System orbital schematic (star + orbits + oort cloud + horizon station)
- Body info panel (planetary screenshot, profile stats, GTTR entry)
Navigation flow: hop-ring → click system → orbital → click body → info panel.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Test character model (test_raw.glb) with eye, hair, and body textures
for validation of the character compositor pipeline.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Per-body-type texture maps (BaseColor, Normal, Roughness/ORM) for all
clothing items across all body types. Adds eyebrow variants, facial
hair (beard, moustache, mutton chops), hair styles (12 variants),
and head templates. Sprint 28 character visuals pipeline output.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Updated clothing models (boots_work, coveralls_basic, jacket_utility,
pants_cargo, shirt_henley) for average_m and reference variants.
Added segmented body textures (BaseColor, Normal, Roughness) for all
body types: average_f, average_m, child, heavy_f, heavy_m, muscular_f,
muscular_m, teen_f, teen_m. Sprint 28 character visuals work.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
6-phase cascade: wiki content → economics → planetary maps → player
control → world gen → detail coloring. Each phase completes before
the next begins. Agents must not discuss detail from later phases.
vendor/ added to .gitignore for cloned reference repos (8 Godot
plugins for world generation research).
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
3 rounds of SW1 (endgame feature vision) with 5 agents + Qatux.
Produced endgame-feature-vision.md (692 lines) covering the full
galaxy-to-ground generation pipeline, cultural cascade, replayability
architecture, and player experience beats.
Workshop was cut short when PO redirected to a 6-phase development
cascade (wiki content → economics → planetary maps → player control →
world gen → detail coloring). v0.2 target dropped. Heritage roots
(D-104/D-105/D-101/D-107) flagged for supersession — real-world
cultural corridors replace abstract roots.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Sprint 28: Character Visuals — character creation screen with live 3D
preview, face-based body segmentation, solidified hair and clothing,
skin/eye/eyebrow tinting, manifest-driven content, pre-push lint hooks.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Sprint 28 lesson: 3 review rounds without launching the game missed
critical bugs. Now enforced:
- pr-push: mandatory headless smoke test before pushing, visual
verification question for UI changes
- pr-review: parse check before spawning reviewers, process gap flag
if runtime testing wasn't performed
- Araminta: check Poly Haven + Quaternius before creating assets
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Body segments: face-based exclusive assignment for all 8 body types
(average/muscular/teen m/f, child) + hips segment
Hair: solidified 20mm, normals recalculated, white masks (was black)
Clothing: peasant tunic/pants/shoes solidified 25mm for all body types
Eye: iris mask from T_Eye_Split.png green channel
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Segmentation:
- Face-based exclusive assignment (no overlap, no caps needed)
- Hips split from torso (pelvis as own segment)
- Torso_upper independent (spine_03 + clavicle, not a variant)
- Clavicle moved from arm_upper to torso_upper
Hair pipeline:
- Solidify modifier (20mm) for scalp hair volume
- Normal recalculation before solidify for consistent direction
- Eyebrows/facial hair NOT solidified
- Fixed mask generation (was outputting black, now white)
Clothing pipeline:
- Solidify modifier (25mm) for clothing thickness
- Peasant shoes added from Fantasy pack
Tooling:
- convert_outfit.py with solidify support
- inspect_glb.py, check_hair_symmetry.py for debugging
- Segment reference distribution locked
- Q-063 footsteps VFX filed
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Major changes from runtime testing and iteration:
- Asset manifest (manifest.json) controls all available content —
replaces filesystem scanning, solves DirAccess/PCK export issue
- Dynamic tabs: only show tabs with manifest content
- Body segmentation: face-based exclusive assignment, hips split from
torso, torso_upper independent (not a variant)
- Eye color with iris-only mask from T_Eye_Split.png green channel
- Eyebrows tinted with hair color (from body segment, not separate GLB)
- Hair/clothing loaded as skinned meshes on shared skeleton
- Segment hiding disabled for clothing (solidify handles coverage)
- Gender-aware randomizer (no facial hair on female/teen)
- Clothing slots hidden when empty in manifest
- UI: color docks docked to bottom on all tabs, padding, flow layout
- Debug tab with per-segment visibility toggles
- Screenshot automation with test config JSON
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Writing ALPHA caused Godot to treat all meshes as transparent, breaking
per-pixel depth testing. Hair clipped through the head, clothing through
the body — all caused by object-level depth sorting instead of z-buffer.
Removing ALPHA makes everything opaque with correct depth behavior.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
TabContainer and its VBoxContainer parent vanish during scene
instantiation when loaded as a child of MainMenu in Godot 4.6.
Moving the entire tab panel construction to _ready() resolves
the issue — the .tscn now only defines the preview side and footer.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@onready path resolution fails when the scene is instantiated as a
child of MainMenu — the node path is valid in the .tscn but the
layout hierarchy breaks during child instantiation in Godot 4.6.
Using find_child() is more robust for scenes that are dynamically
added to another scene's tree.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Godot 4.6 TabContainer silently destroys children defined in .tscn
during scene instantiation ("Parent path has vanished"). Moving tab
shell creation to _ready() fixes the right-side settings panel.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Load UAL animation library onto the skeleton and play idle animation
after character assembly. Adds play_animation() and stop_animation()
public API. Searches all animation libraries for matching animation
name with common idle variant fallbacks.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
GDScript strict mode rejects type inference from Variant-returning
functions. JSON.parse_string() returns Variant — use explicit type
annotation to satisfy the parser.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Pre-existing formatting issues in generator_spike.rs and
validate_ron.rs caught by the new pre-push lint hook.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Runs GDScript parse check (headless Godot) and Rust lint (clippy +
fmt --check) before every push. Catches type inference errors and
formatting issues that code reviews missed in sprint 28.
Uses the existing .config/hooks/ infrastructure (core.hooksPath).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Dictionary.get() returns Variant, which fails GDScript's strict type
inference (warnings-as-errors). Add explicit type casts on all
dictionary access in clothing and accessory tab code.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Remove character_select.tscn and character_select.gd entirely
(Smuggler/Detective archetypes removed per v0.2 pivot)
- New Game goes straight to character creation
- Rename Randomise→Randomize throughout (US English convention)
- Add *.import and *.uid to client gitignore (import artifacts)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The original "top-down (0°)" was ambiguous — 0° in the code's pitch
convention is horizontal (eye-level), not overhead. The implementation
correctly uses -80° for near-top-down. Updated the decision text to
match the confirmed implementation.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Stig's review fix caught the first reference (line 9) but missed the
class docstring at line 27. Both now say 18 segments per D-160.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
13 fixes from PR #99 review on #705 (character editor):
- #10/#11: Add _get_swatch_color() helper; fix stale closure in
_make_color_swatch (reads current color at click time, not
construction time); fix _on_modal_ok to use helper instead of
wrong get_child(0) traversal
- #12: Replace HSV palette with D-165 hardcoded hex values (6×9
rows, muted HSL per spec — reds/greens/blues/purples/browns/grays)
- #13: Fix fallback asset IDs to match actual files — hair: bald/
bob/buzzed/long; heads: head_001–004; facial hair: beard/moustache/
mutton_chops (stubble removed — no asset)
- #14: Remove invented "slot field" TODO comment; replace with
name-prefix convention note
- #15: Fix overhead camera pitch 0.0°→-80.0° (0° was horizontal,
not top-down as intended per D-158)
- #16: Make hair highlight swatch non-interactive (_make_display_swatch);
remove _on_hair_highlight_changed and _hair_highlight_auto flag
- #17: Remove no-op self-assignment in _on_hair_selected; remove
redundant assignment inside _hair_highlight_auto block
- #18: Store _clothing_dock_container/_accessory_dock_container as
instance vars — eliminates fragile get_child(3).get_child(0) chain
- #19: Fix test_r_key_triggers_randomise — replaces assert_bool(true)
with a real assertion checking body_type or skin_tone changed
- #20: Cache scan results in _cached_hair_ids/_cached_head_ids during
tab build; _on_randomise() reads cache (no re-scan per keypress)
- #21: Fix character_visual.gd docstring "21 segments" → "18 segments"
- #22: Fix _get_accessory_ids_for_slot — apply slot name-prefix
filtering instead of returning all accessories for every slot
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Warning fix:
- Remove torso_upper from hides in 3 coverage.json files
(coveralls_basic, jacket_utility, shirt_henley) and the generator
script — redundant when torso_variant is "full"
Suggestions addressed:
- Add pants_cargo authoring note about foot segment distinction
- Add pipeline_log.json provenance output to Surface Deform batch
pipeline (tracks method per variant: surface_deform/shrinkwrap/copy)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Full character creation UI with 5-tab customisation panel (Body, Head,
Hair, Clothing, Accessories), live 3D compositor preview via SubViewport,
D-165 color picker modal, keyboard navigation, and game flow integration.
- CharacterCreation scene + script (~1440 lines) implementing wireframe spec
- SubViewport with Camera3D (frontal/dramatic/overhead presets per D-158)
- Cardinal rotation (Q/E) per D-155, randomise (R), Tab/Enter/Esc navigation
- Body type grid (11 types, D-159), skin tone dock (9 tones, shared state)
- Head template, hair, facial hair, eyebrow grids with DirAccess asset scanning
- Clothing slot selector with per-item Primary/Secondary/Accent tints
- Accessory slot selector with Primary/Secondary tints (Array[Color] descriptor)
- 54-swatch color picker modal (D-165) with hex input and recent colors
- Auto-derive flags for highlight, eyebrow tint, facial hair tint from hair primary
- Game flow: main_menu → archetype select → character creation → game start
- GameState.character_visual_descriptor field for gameplay consumption
- Updated accessory_tints from single Color to Array[Color] in descriptor + compositor
- 40+ GdUnit tests covering scene structure, signals, keyboard nav, color derivation
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Five placeholder clothing items fitted to all 11 body types via the
Surface Deform batch pipeline (60 GLBs total):
- coveralls_basic, jacket_utility, pants_cargo, shirt_henley, boots_work
Each item includes reference.glb, reference_mask.png, coverage.json,
and 11 body-type variant GLBs. All Surface Deform binds succeeded
with no Shrinkwrap fallbacks needed (#711).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Three new Blender/Python scripts for the clothing production pipeline:
- blender_surface_deform_batch.py: fits a reference clothing GLB to all
11 body types via Surface Deform modifier in headless mode
- blender_create_clothing_refs.py: procedurally creates placeholder
reference meshes from average_m body segments
- setup_clothing_metadata.py: generates coverage.json and
reference_mask.png for each clothing item
Surface Deform headless bind confirmed working in Blender 5.0 via
temp_override — upgrades confidence from MEDIUM to HIGH (#710).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
6 wireframe views (Body, Head, Hair, Clothing, Accessories, Color Picker)
as Frame0 JSON source + PNG exports, plus summary spec document.
Layout: 60% preview pane with [Q]/[E] rotation, 35% tabbed panel with
search bar, scrollable grid, and docked color controls per tab.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
D-159 was missing teen body type — updated to 5 types × 2 genders + 1 child = 11.
D-165 records the character creator color palette (6×9 HSL-computed swatches).
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>