- HUD status panel moved to y=80 (below TimeDisplay at 16-70)
- Removed redundant time row from HUD (TimeDisplay handles it)
- Debug overlay starts at y=150 (below HUD status panel)
- Stance indicator moved below minimap (y=192, was overlapping at y=16)
- Interaction prompt moved to y=-240 (above dialogue box at -200)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- HUD: programmatically builds ImplantPanel with health/mode/time rows,
replaces raw MarginContainer/VBoxContainer/Labels
- Stance indicator: ImplantPanel with color-coded ImplantDataRow,
replaces custom _draw() with hardcoded bg/text
- Interaction prompt: applies implant theme StyleBox + colors to
existing PanelContainer layout
Minimap left as-is — its circular frame is a distinct diegetic element,
not rectangular panel chrome.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Labels now appear based on zoom level and system importance:
- Always: selected + hovered
- Zoom >= 1.2: hubs, junctions, gateway
- Zoom >= 2.0: all named systems
- Below 1.2: only selected/hovered
Prevents label soup at overview zoom levels.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
All named systems get a label below their dot. text_dim for default,
text_primary for selected/hovered. Removed duplicate label from
_draw_selection (now handled by _draw_systems).
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Generator now queries bodies/stations tables directly for habitable
count, inhabited count, and total population. All 301 systems have
data — unsettled systems show "0 habitable · 0 inhabited" and "0".
Fixed stale worktree path to systems.db.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
"CORE corridor (hop 1)" with sector color. Bodies back to single line
"1 habitable · 1 inhabited" as originally formatted in the data.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Layout now shows each field on its own line:
star type / hop / corridor / habitable / inhabited / pop / GDP
GDP shows "—" placeholder until economics data is available.
Population shows full number without ellipsis.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
New GameplayRenderer extends Node2D with built-in occlusion support.
Subclasses override _gameplay_process() and _gameplay_draw() instead
of _process() and _draw() — these are skipped when a fullscreen
implant app covers gameplay.
Migrated all 5 gameplay renderers:
- CursorRenderer: hover detection + bracket drawing paused
- EntityRenderer: position lerping paused
- FogEntities: fog dot rendering paused
- SoundIndicatorRenderer: directional arrows paused
- WorldRenderer: tile/fog/entity updates paused
No more manual occlusion wiring — the base class handles everything.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- CursorRenderer z_index=100 so it renders above all HUD/implant layers
- Adjacent systems uses ImplantTextBlock (wraps) instead of ImplantDataRow (clips)
- Panel calls reset_size() before clamping to get accurate height on first frame
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
CursorRenderer must always render on top — shouldn't have its z-index
managed by HudGroups. It's a world-space renderer, not a HUD element.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Accidentally deleted when exploring reparenting options. The z-index
model means it stays as a child of HUD — no reparenting needed.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Moved signals above enum per gdlint class-definitions-order rule.
app_changed signal uses int instead of Mode type to avoid the
forward-reference that forced wrong ordering. Callers compare
against HudGroups.Mode.FULLSCREEN etc unchanged.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Replaced visibility toggling with z-index layer management. Nothing
gets hidden — fullscreen apps render on top, gameplay stays underneath.
Supports future hybrid layouts (insert-mode map alongside gameplay).
Added gameplay_occluded signal: WorldRenderer skips tile/fog/entity
updates when a fullscreen implant app covers it. Prevents wasted
render work behind opaque overlays. Other renderers can connect to
the same signal.
Modes: GAMEPLAY (z=0), INSERT (z=10), FULLSCREEN (z=20), MODAL (z=30).
Star map uses app_changed signal to toggle its own visibility based
on whether its app is active.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
gdformat collapsed enum + 3 inline comments into one 300-char line.
Split to multi-line enum with doc comments.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
CursorRenderer extends Node2D, not Control — can't be registered in
HudGroups. Removed from gameplay group. Also dropped typed array
annotation to avoid runtime type mismatch errors.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Deeper taxonomy: map is a family of views (starchart, system, station,
planet, location), not one app. Same HudGroups mechanics — just a
more specific path.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Implant apps use hierarchical groups: implant/map, implant/wiki,
implant/journal, etc. Apps are mutually exclusive with each other
and with gameplay. Opening implant/map hides gameplay + any other
implant app. Closing returns to gameplay.
API: open_app(), close_app(), toggle_app(), is_app_active().
Star map uses implant/map. Future apps register their own group.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
New HudGroups autoload manages show/hide of related HUD elements as
groups. Exclusive groups (gameplay, implant) are mutually exclusive —
opening the star map hides stance indicator, minimap, interaction
prompts, etc. Closing it restores them.
Gameplay nodes registered in main.gd _ready(). Star map registers as
implant group and uses toggle_group() instead of direct visibility.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
ImplantDataRow uses clip_text + ellipsis instead of wrapping — each
info item stays on one line. Panel position clamped so bottom edge
never exceeds screen bounds.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
SIZE_FLAGS_FILL → SIZE_FILL, SIZE_FLAGS_SHRINK_END → SIZE_SHRINK_END.
The _FLAGS_ prefix was removed in Godot 4.6.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Panel now clips content and constrains children to its width.
Components set autowrap and SIZE_FLAGS_FILL so text wraps within
the panel instead of overflowing. Bold markdown markers stripped
in ImplantTextBlock constructor.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
New component library at client/ui/implant/:
- ImplantTheme: shared Resource with colors, spacing, font sizes
- ImplantPanel: PanelContainer root with themed background/border
- ImplantHeader: title + subtitle
- ImplantSeparator: themed horizontal rule with above/below spacing
- ImplantDataRow: single-line text with optional color override
- ImplantTextBlock: RichTextLabel for wrapping narrative text
- default_implant.tres: default theme resource
Star map info panel refactored from 140 lines of manual draw_string
calls to 50 lines of component composition via _rebuild_info_panel().
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Separators now have explicit above (6px) and below (12px) spacing
relative to text baselines. Previously a single 8px block didn't
account for baseline positioning, causing text to merge with
separator lines. Line height bumped to 18px.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Remove severity tiers from PR reviews. Every comment must be addressed
before merge — no "suggestion" category that gets skipped. Teams can
push back on specific comments with a technical rationale; team lead
evaluates and can retract. Bar: "the reviewer was wrong" not "we don't
want to."
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Panel now measures all variable content (GTTR text, adjacent systems)
before calculating height. Fixes clipping on hub systems with many
neighbors and long GTTR excerpts. Unified separator spacing (8px).
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
sprint stop now clears assigned_to on all done tickets in the closing
sprint. Agents don't clean up after themselves — this was causing
5 bookkeeping warnings every sprint.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Show system profile popup on select: name, star type, hop distance,
corridor, GTTR excerpt, body count, population, adjacent systems.
Edge rendering changed to show no edges by default, only selected
system's gate lines on click. Star map data extended with wiki fields
for all 301 systems.
Ticket: #780
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Remove erroneous server/CHANGELOG.md and add the atlas split entry
to the project root CHANGELOG.md where it belongs.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Team worktree windows stay on their sprint branch. PR reviews run from
main. Updated step 9b to explicitly stop the team lead from spawning
reviewers — push the PR and wait for feedback instead.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Add Python/ruff block to .config/hooks/pre-push (runs on tooling/
changes). Add lint-python and setup-venv Makefile targets, wire
both into make lint and make setup respectively.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Drop unused hashlib, math, and os imports from assign-astro-ids,
generate-star-map, and test_quaternius_raw to pass ruff clean.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add venv auto-activation to audio_batch, audio_connector,
image_connector, qdrant_connector, and trellis_connector.
Scripts re-exec into .venv/bin/python when invoked outside
the venv, with a friendly error if .venv is missing.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The refactor from &Commands to individual parameters exposed the
13-argument signature to clippy. Allow attribute is appropriate
here — the parameters map 1:1 to DB columns.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Create tooling/db/common.py with resolve_db_path(), load_config(),
get_connection(), and ensure_venv(). Update ticket, sprint,
sqlite_connector.py, and decisions_sync.py to import from common
instead of duplicating. Fixes pre-existing NameError in
decisions_sync.py (missing import os). Add pyproject.toml with
ruff config (ruff==0.15.9, CVE-clean) and dev dependencies.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Extract 2119-line monolithic atlas.rs into 8 focused modules under
src/bin/atlas/: main.rs (thin dispatch), common.rs (shared types and
DB helpers), show.rs, mutate.rs, stats.rs, systems.rs, author.rs,
and sync_wiki.rs. Commands enum stays in main.rs; each match arm
delegates to module::cmd_fn(&conn, args). No behavior change.
Closes#776.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>