feat(db): normalize star systems into multi-table schema with GJ primary keys

Replaces flat star_systems table with 7 normalized tables: star_systems,
system_gates (with hop_distance_from_gateway), system_history,
historical_events (1:N), system_economy, system_factions, system_culture.

Primary key is now the GJ astronomical ID (e.g., "GJ 244A") — S-number
identifiers removed entirely. The astronomical_id column is dropped as
redundant. Database moved to server/data/systems.db (ships with game).

10 core systems fully populated with structured data.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-14 03:41:29 +01:00
co-authored by Claude Opus 4.6
parent 23d9ff0a58
commit 7f307c1225
3 changed files with 136 additions and 103 deletions
+2 -103
View File
@@ -95,107 +95,6 @@ CREATE INDEX IF NOT EXISTS idx_decision_refs_source ON decision_refs(source_id);
CREATE INDEX IF NOT EXISTS idx_decision_refs_target ON decision_refs(target_id);
-- ---------------------------------------------------------------------------
-- Star Systems Wiki Mirror
-- Populated by: python3 tooling/db/wiki_sync.py sync
-- Source: wiki/star-systems/*/index.md (YAML frontmatter)
-- Star Systems live in a separate database: server/data/systems.db
-- Schema: server/data/systems-schema.sql
-- ---------------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS star_systems (
-- I. Identity and Location
system_id TEXT PRIMARY KEY,
astronomical_id TEXT NOT NULL,
proper_name TEXT,
system_name TEXT,
star_type TEXT,
geographic_sector TEXT,
geographic_band TEXT,
political_zone TEXT,
-- II. Physical Character
habitable_planet_count INTEGER,
inhabited_planet_count INTEGER,
asteroid_belt TEXT,
gas_giant TEXT,
habitability_profile TEXT,
-- III. Gate Infrastructure
horizon_station INTEGER, -- boolean 0/1
aperture_count INTEGER,
gate_connections INTEGER,
gate_topology TEXT,
span_gate_network TEXT,
-- IV. Settlement History
settlement_wave TEXT,
founding_motivation TEXT,
founding_culture_primary TEXT,
founding_culture_secondary TEXT,
cultural_persistence TEXT,
historical_event TEXT,
historical_event_age_years INTEGER,
religious_status TEXT,
religious_generation_count INTEGER,
-- V. Economic Life
economic_tier TEXT,
population TEXT,
economic_base_primary TEXT,
economic_base_secondary TEXT,
distribution_index TEXT,
imprint_access TEXT,
supply_dependency TEXT,
-- VI. Governance
governance_type TEXT,
dominant_faction TEXT,
primary_fault_line TEXT,
secondary_fault_line TEXT,
-- VII. Faction Presence
assembly_presence TEXT,
commission_presence TEXT,
syndic_presence TEXT,
syndic_type TEXT,
separatist_presence TEXT,
separatist_type TEXT,
institute_presence TEXT,
guardians_presence TEXT,
faction_notes TEXT,
-- VIII. Cultural Voice
cultural_register TEXT,
cultural_register_secondary TEXT,
ambient_anxiety TEXT,
local_pride TEXT,
atmospheric_tone TEXT,
atmospheric_tone_secondary TEXT,
active_situation TEXT,
silence_threshold TEXT,
silence_topic TEXT,
-- IX. Political Character
earth_alignment TEXT,
earth_proximity TEXT,
earth_tension TEXT,
-- X. Narrative Profile
primary_archetype TEXT,
secondary_archetype TEXT,
narrative_notable TEXT,
narrative_hook TEXT,
generation_priority TEXT,
-- XI. Content Notes
stability_index TEXT,
system_volatility TEXT,
cultural_corridor TEXT,
calibration_note TEXT,
synced_at TEXT DEFAULT (datetime('now'))
);
CREATE INDEX IF NOT EXISTS idx_star_systems_astro ON star_systems(astronomical_id);
CREATE INDEX IF NOT EXISTS idx_star_systems_sector ON star_systems(geographic_sector);
CREATE INDEX IF NOT EXISTS idx_star_systems_wave ON star_systems(settlement_wave);
CREATE INDEX IF NOT EXISTS idx_star_systems_topology ON star_systems(gate_topology);
CREATE INDEX IF NOT EXISTS idx_star_systems_star_type ON star_systems(star_type);