#!/usr/bin/env python3 """Quick diagnostic for an atlas proposal — shows planet count, body summary, and flags. Usage: tooling/atlas-check docs/atlas/proposals/GJ1075.json """ import json from pathlib import Path from tooling.core import console def check(path: Path): with open(path) as f: p = json.load(f) bodies = p.get("bodies", []) stations = p.get("stations", []) planets = [b for b in bodies if b["body_type"] == "planet" and not b.get("parent_body_id")] gas_giants = [b for b in bodies if b["body_type"] == "gas_giant"] moons = [b for b in bodies if b["body_type"] == "moon"] belts = [b for b in bodies if b["body_type"] == "asteroid_belt"] oort = [b for b in bodies if b["body_type"] == "oort_cloud"] sc = p.get("spectral_class", "") if sc.startswith(("G", "F")): min_p = 8 elif sc.startswith("K"): min_p = 7 else: min_p = 6 console.event(f"=== {path.name} — {p.get('proper_name') or p['system_id']} ===") console.event(f" star_type: {p.get('star_type')} spectral: {sc}") console.event(f" planets: {len(planets)} (need {min_p}+) gas_giants: {len(gas_giants)} moons: {len(moons)}") console.event(f" belts: {len(belts)} oort: {len(oort)} stations: {len(stations)}") if planets: console.event(f" orbits: {' → '.join(str(b['orbit_index']) for b in planets)}") console.event(f" gravity: {' / '.join(str(b['surface_gravity']) for b in planets)}") console.event(f" periods: {' / '.join(str(b['orbital_period_days']) for b in planets)} days") inhabited = [b for b in bodies if b.get("inhabited")] if inhabited: for b in inhabited: console.event(f" inhabited: {b['body_id']} ({b.get('proper_name', '?')}) pop={b.get('population')}") for s in stations: console.event(f" station: {s['station_id']} ({s.get('proper_name', '?')}) type={s['station_type']} pop={s.get('population')}") # Flags if len(planets) < min_p: console.event(f" ⚠ need {min_p - len(planets)} more planet(s)") if not belts: console.event(" ⚠ no asteroid belt") if not oort: console.event(" ⚠ no oort cloud") horizons = [s for s in stations if s["station_type"] == "horizon"] if not horizons: console.event(" ⚠ no horizon station") elif not any(s.get("has_gate_infrastructure") for s in horizons): console.event(" ⚠ horizon station missing gate_infrastructure") def report(proposals: list[Path]) -> None: """Run the diagnostic over each proposal. Purely informational — no verdict. The original's arg handling lived in a bare sys.argv loop; the router owns that now. """ for path in proposals: check(path)