From 1efbbcaea98894bc62ee48a9db5e99cafa1aa896 Mon Sep 17 00:00:00 2001 From: Jeroen Schweitzer Date: Wed, 15 Apr 2026 10:54:28 +0200 Subject: [PATCH] feat(tooling): gemma_naming.py batch naming pipeline for atlas (#833) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit New end-to-end pipeline that walks every markers.json in the reach and fills empty `name` fields using the Gemma 2 voice pipeline via `sr-voice serve --stdio`. Per D-191 §4: the same Gemma 2 pipeline the client uses for NPC voicing also produces the atlas content, which is dual-purposed as a quality test of the LLM plumbing. Pipeline per body (hop-ordered, core-first): 1. Load markers.json; identify feature records whose `name` is blank (null or ""). Hand-authored names are never overwritten; the 6 template bodies and any partial authoring stay put. 2. Look up body context (planet_class, settlement_pattern, cultural_corridor, population, economic_role) from systems.db. 3. Build a short corridor-aware few-shot prompt per feature type. Prompts carry 3 concrete `Style: X. Answer: Y` examples so Gemma 2 2B completes a pattern instead of generating to an open-ended instruction — this is the single biggest lever against placeholder echoes on a small model. 4. Stream the prompt into a long-lived sr-voice subprocess, read the JSONL response, post-process (strip markdown, label prefixes, brackets, reject 5+ word outputs and placeholder tokens), check the earth-name blocklist, check per-(corridor, feature_type) + per-body dedup, check the per-stem cap, retry up to 3 times with a bumped seed. 5. On persistent failure, fall back to a deterministic palette generator so every feature ends up with a name. 6. Write markers.json atomically and refresh atlas_* DB rows via sync_markers_to_db. Commit the DB per body so a crash loses at most one body of state. 7. Restart the sr-voice subprocess every `--refresh` requests (default: 200) to prevent KV-cache context bleed. Core design decisions: - Determinism: per-(world_seed, body_id, feature_local_id, attempt) seed so the full run is reproducible. - Ordering: bodies are processed in ascending `hop_distance_from_gateway` so core bodies get first pick at every unique Gemma output and outer sectors fall into the palette fallback when they lose the dedup race. - Dedup scope: (cultural_corridor, feature_type) across the run, PLUS a per-body cross-type set so the same name can't be a river AND an ocean AND a mountain on the same world. Hand-authored names are seeded into both sets on load so templates win priority. - Stem cap: each non-generic root token (e.g. 'Arcturus', 'Meridian') may appear at most `--stem-cap` times across the full run (default 20), preventing single-word runaway. Fallback names bypass the cap. - Earth blocklist: 181 curated entries covering major Earth cities, mountains, rivers, oceans, historical/colonial spellings, and Greek/Roman mythology that reads too literally. Prefixed variants ('Nouveau Paris', 'New Tokyo') explicitly allowed per the product intent that Earth-echo names are fine but must not dominate. Leading 'The ' is stripped before comparison so 'The Great Divide' also matches. Operational features: - `--shard N/M` slices the body list into M partitions for parallel runs. Two terminals × `--shard 0/2` + `--shard 1/2` fits the ~2.5 GB/instance VRAM footprint twice under the 50% cap on a 16 GB AMD GPU and roughly halves wall time. - `--log PATH` writes a timestamped tee of every status line to a file. Default: `.tmp/gemma_naming.shard{N}of{M}.log` when a non-trivial shard is in use. - SQLite `PRAGMA journal_mode=WAL` + `busy_timeout=15000` so two concurrent shards serialize writes without lock errors. - Per-body progress lines report `body K/N`, `sys K/N`, and `hop=H` so the user can watch core sectors finish first. - Each body logs the new names it produced per feature type so the user can eyeball quality as the run progresses. - Checkpoint summary every 25 bodies: cumulative names, rate, ETA — gives the log regular scroll points. - `--mock` uses `server/sr-voice/mock-stdio.sh` for dry-fire pipeline validation without a model load (tested end-to-end). Supporting files: - `tooling/planet-gen/earth_blocklist.txt` — 181 curated entries. - `tooling/db/backfill_cultural_corridor.py` — one-off migration that fills the `cultural_corridor` column on both `star_systems` and `bodies` from the `geographic_sector` values. Before this pass, 99.4% of rows (3221/3240) had a NULL cultural_corridor despite `wiki_sync.py` being aware of the column — the wiki index.md files only carry the sector header, which was never propagated to the DB column. Idempotent, safe to re-run after any wiki_sync rebuild, explicit transaction wrapper with rollback on failure. Full batch runtime estimate: ~20 hours single-shard / ~10 hours double-shard on this hardware. Smoke tests across five hardened iterations (v1–v5) on GJ71b/c/d/d-1/e confirm the pipeline produces clean, varied, culturally-coherent names with zero post-processing residue. --- server/data/systems.db | Bin 2101248 -> 2150400 bytes tooling/db/backfill_cultural_corridor.py | 162 +++ tooling/planet-gen/earth_blocklist.txt | 216 ++++ tooling/planet-gen/gemma_naming.py | 1467 ++++++++++++++++++++++ 4 files changed, 1845 insertions(+) create mode 100755 tooling/db/backfill_cultural_corridor.py create mode 100644 tooling/planet-gen/earth_blocklist.txt create mode 100755 tooling/planet-gen/gemma_naming.py diff --git a/server/data/systems.db b/server/data/systems.db index 34ce951c966b95bf58ca512aae362561981e2314..fe2ea269626e7b9a4e308976e1f11447268475db 100644 GIT binary patch delta 190235 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 V8pu;vD+>QncK9Oy%GqAU{U3|8m0SP- delta 146263 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 str: + return datetime.datetime.now().strftime("%H:%M:%S") + + def __call__(self, msg: str = "") -> None: + line = f"[{self._ts()}] {msg}" if msg else "" + print(line, flush=True) + if self.fh is not None: + self.fh.write(line + "\n") + self.fh.flush() + + def raw(self, msg: str = "") -> None: + """Print without the timestamp prefix (for banner lines).""" + print(msg, flush=True) + if self.fh is not None: + self.fh.write(msg + "\n") + self.fh.flush() + + def close(self) -> None: + if self.fh is not None: + self.fh.close() + self.fh = None + + +# --------------------------------------------------------------------------- +# Corridor palettes (D-191 §4, glossary.md §Corridors, decisions/economics.md D-175) +# --------------------------------------------------------------------------- + +# Each palette is the cultural inflection the prompt asks Gemma to +# produce names in. Palette keys match the values of +# `star_systems.geographic_sector` directly — that column is the real +# source of corridor identity in systems.db (cultural_corridor is a +# legacy field that was never populated beyond sol-gateway-axis). +CORRIDOR_PALETTES: dict[str, dict[str, str]] = { + "core": { + "inflection": "institutional Latin / pan-Anglo / Gateway-era", + "examples": "Meridian, Concord, Cardinal, Prefecture, Lumen, Foro, Axis, Senatus", + }, + "north_reach": { + "inflection": "British / Australian / Irish", + "examples": "Wolcott, Mildern, Ashbourne, Kiln, Briarfell, Tarndale", + }, + "south_reach": { + "inflection": "Portuguese / Swahili / Cape Verdean / Brazilian", + "examples": "Vargas, Inhaca, Monteforte, Serra, Ribeiro, Kilimi", + }, + "east_reach": { + "inflection": "Korean / Japanese / Taiwanese", + "examples": "Hanyang, Takamine, Seoraksan, Tsukuri, Ginoza, Baektu", + }, + "west_reach": { + "inflection": "German / Dutch / Nordic", + "examples": "Vanebach, Kloosterdam, Bergfjord, Hellekade, Straend", + }, + "deep_frontier": { + "inflection": "founder-surname + noun (e.g. 'Okafor Reach', 'Stenner Cross')", + "examples": "Okafor Reach, Stenner Cross, Weller Hold, Pruitt Basin, Vickery Hold", + }, + # Legacy keys retained for backward compatibility with the + # cultural_corridor column on the one system that uses it. + "sol-gateway-axis": { + "inflection": "institutional Latin / pan-Anglo / Gateway-era", + "examples": "Meridian, Concord, Cardinal, Prefecture, Lumen, Foro, Axis, Senatus", + }, + "inner_corridor": { + "inflection": "institutional Latin / pan-Anglo", + "examples": "Meridian, Concord, Prefecture, Cardinal, Lumen, Foro", + }, +} + +DEFAULT_PALETTE = CORRIDOR_PALETTES["core"] + +# Processing order for the main run — core first so those bodies win +# the dedup race and the outer sectors fall into the palette fallback +# path when names collide. +SECTOR_PRIORITY: dict[str, int] = { + "core": 0, + "north_reach": 1, + "south_reach": 2, + "east_reach": 3, + "west_reach": 4, + "deep_frontier": 5, +} + + +def palette_for(corridor: str | None) -> dict[str, str]: + if not corridor: + return DEFAULT_PALETTE + return CORRIDOR_PALETTES.get(corridor, DEFAULT_PALETTE) + + +# --------------------------------------------------------------------------- +# Feature prompt templates — few-shot format +# --------------------------------------------------------------------------- + +# Gemma 2 2B is small and noisy on free-form instruction prompts — it +# loves to echo the prompt back as "[River Name]" / "NAME: ..." / +# "**River: X**" etc. The fix is few-shot: show 3 concrete +# `Input → Output` examples so the model completes a pattern instead +# of generating to an open-ended instruction. +# +# Important rules these templates enforce: +# - The examples ALWAYS show a bare name (no labels, no markdown, +# no brackets, no quotes) so the completion mimics that shape. +# - The examples are DIFFERENT corridors from the one being named, +# to prevent Gemma from just echoing one of the examples. +# - The final line ends with `Answer:` (not `NAME:`) — less likely +# to collide with a real name in post-processing. +# +# All templates share the same few-shot prefix defined below; only +# the question and example axis differ per feature type. + +_FEW_SHOT_RIVER = ( + "You name rivers on alien planets. Reply with ONLY the name, 1-3 words, " + "no brackets, no quotes, no markdown, no label.\n" + "\n" + "Style: British/Australian. Answer: Wolcott Beck\n" + "Style: Korean/Japanese. Answer: Nakamura Stream\n" + "Style: Portuguese/Swahili. Answer: Ribeiro do Sal\n" + "\n" + "Style: {inflection}. Answer:" +) +_FEW_SHOT_OCEAN = ( + "You name oceans on alien planets. Reply with ONLY the name, 1-3 words, " + "no brackets, no quotes, no markdown, no label.\n" + "\n" + "Style: British/Australian. Answer: Tarnsea\n" + "Style: Korean/Japanese. Answer: Aomine Deep\n" + "Style: German/Dutch/Nordic. Answer: Nordhav\n" + "\n" + "Style: {inflection}. Answer:" +) +_FEW_SHOT_SEA = ( + "You name seas on alien planets. Reply with ONLY the name, 1-3 words, " + "no brackets, no quotes, no markdown, no label.\n" + "\n" + "Style: British/Australian. Answer: Harven Sea\n" + "Style: Portuguese/Swahili. Answer: Mar de Quelim\n" + "Style: institutional Latin. Answer: Mare Ardens\n" + "\n" + "Style: {inflection}. Answer:" +) +_FEW_SHOT_LAKE = ( + "You name lakes on alien planets. Reply with ONLY the name, 1-3 words, " + "no brackets, no quotes, no markdown, no label.\n" + "\n" + "Style: British/Australian. Answer: Kelstern Mere\n" + "Style: Korean/Japanese. Answer: Shiromizu\n" + "Style: German/Dutch/Nordic. Answer: Eikmeer\n" + "\n" + "Style: {inflection}. Answer:" +) +_FEW_SHOT_MOUNTAIN = ( + "You name mountain ranges on alien planets. Reply with ONLY the name, " + "1-3 words, no brackets, no quotes, no markdown, no label.\n" + "\n" + "Style: British/Australian. Answer: Drayton Spine\n" + "Style: Korean/Japanese. Answer: Takamine Ridge\n" + "Style: German/Dutch/Nordic. Answer: Drachenberg\n" + "\n" + "Style: {inflection}. Answer:" +) +_FEW_SHOT_CITY_CAPITAL = ( + "You name capital cities on alien planets. Reply with ONLY the name, " + "1-2 words, no brackets, no quotes, no markdown, no label.\n" + "\n" + "Style: British/Australian. Answer: Holmwood\n" + "Style: Korean/Japanese. Answer: Seungmun\n" + "Style: Portuguese/Swahili. Answer: Porto Keli\n" + "\n" + "Style: {inflection}. Planet: {planet_class}. Answer:" +) +_FEW_SHOT_CITY_SECONDARY = ( + "You name secondary cities on alien planets. Reply with ONLY the name, " + "1-2 words, no brackets, no quotes, no markdown, no label.\n" + "\n" + "Style: British/Australian. Answer: Carberry\n" + "Style: Korean/Japanese. Answer: Yurigawa\n" + "Style: German/Dutch/Nordic. Answer: Wolfsturm\n" + "\n" + "Style: {inflection}. Planet: {planet_class}. Answer:" +) +_FEW_SHOT_POI_TRANSIT = ( + "You name gate terminals on alien planets. Reply with ONLY the name, " + "2-3 words ending in 'Gate Terminal', 'Transit', 'Exchange', or " + "'Concourse'. No brackets, no quotes, no markdown, no label.\n" + "\n" + "Style: British/Australian. Answer: Holmwood Gate Terminal\n" + "Style: Korean/Japanese. Answer: Seungmun Transit\n" + "Style: institutional Latin. Answer: Meridian Concourse\n" + "\n" + "Style: {inflection}. Answer:" +) +_FEW_SHOT_POI_INSTITUTIONAL = ( + "You name institutional landmarks on alien planets. Reply with ONLY " + "the name, 2-4 words, no brackets, no quotes, no markdown, no label.\n" + "\n" + "Style: British/Australian. Answer: Holmwood Assembly Hall\n" + "Style: Korean/Japanese. Answer: Seungmun Archive\n" + "Style: institutional Latin. Answer: Meridian Registry\n" + "\n" + "Style: {inflection}. Answer:" +) +_FEW_SHOT_POI_CULTURAL = ( + "You name cultural landmarks on alien planets. Reply with ONLY the " + "name, 2-4 words, no brackets, no quotes, no markdown, no label.\n" + "\n" + "Style: British/Australian. Answer: Holmwood Commons\n" + "Style: Korean/Japanese. Answer: Yurigawa Grounds\n" + "Style: Portuguese/Swahili. Answer: Praça do Vento\n" + "\n" + "Style: {inflection}. Answer:" +) + +FEATURE_PROMPTS: dict[str, str] = { + "river": _FEW_SHOT_RIVER, + "ocean": _FEW_SHOT_OCEAN, + "sea": _FEW_SHOT_SEA, + "lake": _FEW_SHOT_LAKE, + "mountain_range": _FEW_SHOT_MOUNTAIN, + "city_capital": _FEW_SHOT_CITY_CAPITAL, + "city_secondary": _FEW_SHOT_CITY_SECONDARY, + "poi_transit": _FEW_SHOT_POI_TRANSIT, + "poi_institutional": _FEW_SHOT_POI_INSTITUTIONAL, + "poi_cultural": _FEW_SHOT_POI_CULTURAL, +} + + +# --------------------------------------------------------------------------- +# Blocklist +# --------------------------------------------------------------------------- + +def load_blocklist(path: Path = BLOCKLIST_PATH) -> set[str]: + """Load earth_blocklist.txt into a lowercase set for exact-match checks.""" + if not path.exists(): + return set() + blocked: set[str] = set() + for line in path.read_text().splitlines(): + line = line.strip() + if not line or line.startswith("#"): + continue + blocked.add(line.lower()) + return blocked + + +_THE_PREFIX = re.compile(r"^the\s+", re.IGNORECASE) + + +def is_blocked(name: str, blocklist: set[str]) -> bool: + """True iff the case-insensitive name appears in the blocklist. + + Also strips a leading "The " before comparing, so "The Great Divide" + and "Great Divide" both match a `great divide` entry. Prefixed + variants like 'Nouveau Paris', 'Neu Berlin', 'New Tokyo' still do + NOT match because those prefixes are substantive (a new place), while + "The" is just the definite article. + """ + lc = name.strip().lower() + if lc in blocklist: + return True + stripped = _THE_PREFIX.sub("", lc).strip() + return stripped in blocklist + + +def is_placeholder(name: str) -> bool: + """True iff the cleaned name looks like Gemma echoed the prompt + or drifted into verbose poetry rather than producing a usable name. + + Catches: + - Empty, <3 chars, or pure punctuation after cleaning. + - Any whole-word token from _PLACEHOLDER_TOKENS appearing in the + name ('Name', 'Example', 'Placeholder', 'TBD', …). + - Strings that start with 'River ', 'City ', 'Lake ', etc. with a + single-letter suffix (clear prompt fragments). + - 5+ word outputs — the prompt requests 1-3 words; when Gemma + drifts into 'The Grand Lake of the Astral Sea' territory it's + generating description, not a name. 4 words is the practical + upper bound for clean Latin/Korean/Germanic 3-token names with + a 'The' prefix. + """ + s = name.strip() + if len(s) < 3: + return True + if not re.search(r"[A-Za-z]", s): + return True + + lowered = s.lower() + tokens = re.findall(r"[a-z]+", lowered) + if any(tok in _PLACEHOLDER_TOKENS for tok in tokens): + return True + + if len(tokens) >= 5: + return True + + if re.fullmatch( + r"(river|lake|ocean|sea|city|capital|town|mountain|range|peak|poi|" + r"gate|terminal)\s+[a-z]", lowered + ): + return True + return False + + +# --------------------------------------------------------------------------- +# Post-processing +# --------------------------------------------------------------------------- + +_TRAILING_PUNCT = re.compile(r"[\s\.,;:!?\"'`\-]+$") +_LEADING_PUNCT = re.compile(r"^[\s\.,;:!?\"'`\-]+") + +# Strip surrounding square brackets the model likes to emit +# (`[River Name]`, `[Lake Foo]`, `[Optional: Bar]`). +_BRACKET_WRAP = re.compile(r"^\[\s*(.*?)\s*\]$") + +# Tokens that indicate the model failed the instruction and echoed the +# prompt back. If any of these appear as whole words (case-insensitive) +# in the cleaned output, reject the whole name and retry. +_PLACEHOLDER_TOKENS = { + "name", "names", "placeholder", "example", "example1", "exampleone", + "optional", "tbd", "todo", +} + +# Labels Gemma likes to prepend to the answer. Matched case-insensitively +# at the start of the line, with optional whitespace and a `:` or `-`. +_LABEL_PREFIX = re.compile( + r"^(name|answer|output|result|response|city|town|capital|village|river|" + r"stream|ocean|sea|lake|bay|gulf|mountain|range|peak|ridge|spine|poi|" + r"landmark|terminal|gate|optional|alternative|alt|suggestion|" + r"example|note)\s*[:\-]\s*", + re.IGNORECASE, +) + +# Strip markdown bold/italic wrappers (`**X**`, `*X*`, `__X__`, `_X_`) +# that Gemma sometimes emits even when told "no quotes or explanation". +_MD_BOLD = re.compile(r"^\*+\s*(.*?)\s*\*+$") +_MD_UNDER = re.compile(r"^_+\s*(.*?)\s*_+$") + + +def post_process(raw: str) -> str: + """Extract a clean single-line name from Gemma's raw output. + + Handles, in order: + - First non-empty line only (Gemma often continues with an explanation). + - Strip surrounding markdown bold/italic (`**X**`, `*X*`, `__X__`, `_X_`). + - Strip label prefixes the model likes to prepend (`Name:`, `City:`, + `River:`, `Ocean:`, `Mountain:`, etc.) — case-insensitive, with or + without a `:` or `-` separator. + - Strip surrounding quotes / punctuation. + - Collapse internal whitespace. + - Truncate at 40 chars as a hard safety limit. + + The result is the canonical form used for both writing to disk AND + dedup comparison, so "River: Aureus" and a later raw "Aureus" normalize + to the same string and collide as intended. + """ + text = (raw or "").strip() + if not text: + return "" + + # First non-empty line only. + for line in text.splitlines(): + line = line.strip() + if line: + text = line + break + else: + return "" + + # Strip surrounding markdown bold/italic, square brackets, label + # prefixes, and stray asterisks/underscores in alternation until the + # text stops shrinking. This handles every combination: `**Foo**`, + # `**City: Foo**`, `City: **Foo**`, `**City:** Foo`, `_Name: Bar_`, + # `[River Foo]`, `[City: Bar]`, etc. + while True: + before = text + m = _MD_BOLD.match(text) or _MD_UNDER.match(text) or _BRACKET_WRAP.match(text) + if m: + text = m.group(1).strip() + text = text.strip("*_ \t-[]") + new = _LABEL_PREFIX.sub("", text) + if new != text: + text = new.strip() + if text == before: + break + + # Strip surrounding quotes / punctuation. + text = _LEADING_PUNCT.sub("", text) + text = _TRAILING_PUNCT.sub("", text) + + # Collapse internal whitespace. + text = re.sub(r"\s+", " ", text).strip() + + # Hard length safety. + if len(text) > 40: + text = text[:40].rstrip() + + return text + + +# --------------------------------------------------------------------------- +# Fallback palette generator (deterministic, no LLM) +# --------------------------------------------------------------------------- + +_FALLBACK_STEMS: dict[str, list[str]] = { + "north_reach": ["Wolcott", "Mildern", "Ashbourne", "Briarfell", "Tarndale", + "Kelston", "Threlwood", "Harford", "Rowanmoor", "Pennhowe"], + "south_reach": ["Vargas", "Inhaca", "Monteforte", "Ribeiro", "Kilimi", + "Serravale", "Cabo", "Ilhabela", "Moçambo", "Ngola"], + "east_reach": ["Hanyang", "Takamine", "Seorak", "Ginoza", "Baektu", + "Tsukuri", "Naruhan", "Saeyeon", "Morimine", "Taegong"], + "west_reach": ["Vanebach", "Kloosterdam", "Bergfjord", "Hellekade", + "Straend", "Eikhof", "Viskrans", "Nordhölm", "Lindeborg", + "Drachenberg"], + "inner_corridor": ["Meridian", "Concord", "Prefecture", "Cardinal", + "Lumen", "Foro", "Tabula", "Vox", "Axis", "Senatus"], + "inner_orbit": ["Meridian", "Concord", "Prefecture", "Cardinal", + "Lumen", "Foro", "Tabula", "Vox", "Axis", "Senatus"], + "frontier": ["Okafor", "Stenner", "Weller", "Pruitt", "Hale", + "Kettle", "Bowman", "Alder", "Risher", "Vickery"], +} + +_FALLBACK_SUFFIXES: dict[str, list[str]] = { + "river": ["Run", "Water", "Beck", "Rill", "Course"], + "ocean": ["Sea", "Expanse", "Deep", "Reach"], + "sea": ["Sea", "Gulf", "Basin"], + "lake": ["Lake", "Mere", "Tarn", "Pool"], + "mountain_range": ["Range", "Ridge", "Spine", "Heights", "Scarp"], + "city_capital": ["Hold", "Prime", "Seat", "Court"], + "city_secondary": ["Cross", "Reach", "Hollow", "Fields", "Stand"], + "poi_transit": ["Gate Terminal", "Transit", "Concourse", "Exchange"], + "poi_institutional": ["Archive", "Hall", "Assembly", "Registry"], + "poi_cultural": ["Commons", "Grounds", "Circle", "Square"], +} + + +def fallback_name(corridor: str, feature_type: str, salt: int) -> str: + """Deterministic palette-driven fallback when the LLM can't produce + a usable name after retries. Picks a stem + suffix using `salt` so + the same (body, feature) always gets the same fallback.""" + stems = _FALLBACK_STEMS.get(corridor) or _FALLBACK_STEMS["inner_corridor"] + suffixes = _FALLBACK_SUFFIXES.get(feature_type, ["Place"]) + stem = stems[salt % len(stems)] + suffix = suffixes[(salt // max(1, len(stems))) % len(suffixes)] + return f"{stem} {suffix}" + + +# --------------------------------------------------------------------------- +# Subprocess manager +# --------------------------------------------------------------------------- + +class VoiceSubprocess: + """Thin wrapper around sr-voice stdio mode. + + The subprocess holds a KV cache across requests — after N_REFRESH + requests we tear it down and start a fresh one so earlier prompts + don't pollute later ones (context bleed). Real model load takes a + few seconds; mock mode is instantaneous. + """ + + def __init__( + self, + sr_voice_bin: Path, + model_path: Path | None, + mock: bool, + refresh_every: int, + verbose: bool, + ): + self.sr_voice_bin = sr_voice_bin + self.model_path = model_path + self.mock = mock + self.refresh_every = max(1, refresh_every) + self.verbose = verbose + self.proc: subprocess.Popen | None = None + self.request_count = 0 + self._start() + + def _build_cmd(self) -> list[str]: + if self.mock: + return [str(MOCK_STDIO), "serve", "--stdio"] + cmd = [str(self.sr_voice_bin), "serve", "--stdio"] + if self.model_path is not None: + cmd += ["--model", str(self.model_path)] + return cmd + + def _start(self) -> None: + cmd = self._build_cmd() + if self.verbose: + print(f" [subprocess] starting: {' '.join(cmd)}", flush=True) + self.proc = subprocess.Popen( + cmd, + stdin=subprocess.PIPE, + stdout=subprocess.PIPE, + stderr=subprocess.DEVNULL if not self.verbose else None, + text=True, + bufsize=1, # line-buffered + ) + self.request_count = 0 + # Mock prints a stderr banner synchronously; real sr-voice prints + # stderr while loading the model. Either way we drive it request- + # reply so no readiness probe is needed — the first request just + # blocks until the model is ready. + + def request(self, prompt: str, seed: int) -> str: + """Send one JSONL request, read one JSONL response, return raw text. + + On subprocess death, restart once and retry. On restart + threshold, tear down and restart cleanly before the request. + """ + if self.request_count >= self.refresh_every: + if self.verbose: + print( + f" [subprocess] refresh after {self.request_count} requests", + flush=True, + ) + self._stop() + self._start() + + req = json.dumps({"prompt": prompt, "seed": seed}) + assert self.proc is not None and self.proc.stdin is not None and self.proc.stdout is not None + + try: + self.proc.stdin.write(req + "\n") + self.proc.stdin.flush() + line = self.proc.stdout.readline() + except (BrokenPipeError, OSError) as e: + print(f" [subprocess] pipe broken ({e}) — restarting", flush=True) + self._stop() + self._start() + self.proc.stdin.write(req + "\n") # type: ignore[union-attr] + self.proc.stdin.flush() # type: ignore[union-attr] + line = self.proc.stdout.readline() # type: ignore[union-attr] + + self.request_count += 1 + + if not line: + raise RuntimeError("sr-voice returned empty response (subprocess died?)") + + try: + resp = json.loads(line.strip()) + except json.JSONDecodeError as e: + raise RuntimeError(f"sr-voice returned non-JSON: {line!r} ({e})") from e + + if "error" in resp: + raise RuntimeError(f"sr-voice error: {resp['error']}") + + return resp.get("text", "") or "" + + def _stop(self) -> None: + if self.proc is None: + return + try: + if self.proc.stdin: + self.proc.stdin.close() + except Exception: + pass + try: + self.proc.terminate() + self.proc.wait(timeout=5) + except subprocess.TimeoutExpired: + self.proc.kill() + self.proc.wait() + except Exception: + pass + self.proc = None + + def close(self) -> None: + self._stop() + + def __enter__(self) -> "VoiceSubprocess": + return self + + def __exit__(self, *exc) -> None: + self.close() + + +# --------------------------------------------------------------------------- +# Naming (per-feature request + retry) +# --------------------------------------------------------------------------- + +def _seed_for(world_seed: int, body_id: str, local_id: str, attempt: int) -> int: + """Deterministic per-feature seed. Same (world, body, feature) always + starts from the same seed; retries bump `attempt` to get a different + sample path without losing determinism.""" + h = hashlib.sha256( + f"{world_seed}|{body_id}|{local_id}|{attempt}".encode() + ).hexdigest() + return int(h[:16], 16) + + +def body_population_band(population: int) -> str: + if population <= 0: + return "uninhabited" + if population < 100_000: + return "outpost (<100k)" + if population < 10_000_000: + return "small (<10M)" + if population < 100_000_000: + return "medium (<100M)" + if population < 1_000_000_000: + return "large (<1B)" + return "megaworld (1B+)" + + +_STEM_WORD_RE = re.compile(r"[A-Za-z][A-Za-z'\-]{2,}") + +# Tokens so generic they should never count toward stem-dominance — they +# just describe the feature type and don't carry cultural identity. +_IGNORED_STEMS = { + "the", "of", "a", "an", "and", "or", + "river", "sea", "lake", "ocean", "bay", "gulf", "range", "peak", + "peaks", "ridge", "spine", "scarp", "heights", "hollow", "run", + "beck", "water", "course", "flow", "basin", "reach", "hold", + "cross", "prime", "city", "town", "capital", "gate", "terminal", + "transit", "exchange", "concourse", "assembly", "archive", + "commons", "grounds", "square", "circle", "mountain", "mountains", + "stream", "brook", "spring", "tarn", "mere", "pool", "deep", + "expanse", "crest", "summit", "fells", "series", "sea", "maris", + "mare", "aquae", "fluvius", "terrae", +} + + +def _extract_stems(name: str) -> list[str]: + """Return the lowercase 'interesting' stems of a name — cultural + root tokens only, with 'the', 'of', 'river', 'peaks' etc. dropped. + + Used to enforce per-stem dominance caps across the full run so no + single root (e.g. 'Arcturus') can appear in hundreds of names + across 3240 bodies. + """ + return [ + t.lower() for t in _STEM_WORD_RE.findall(name) + if t.lower() not in _IGNORED_STEMS + ] + + +def name_feature( + voice: VoiceSubprocess, + feature_type: str, + ctx: dict, + blocklist: set[str], + corpus: dict[tuple[str, str], set[str]], + body_used: set[str], + stem_counts: dict[str, int], + stem_cap: int, + world_seed: int, + body_id: str, + local_id: str, + log: "Logger", + verbose: bool, + max_attempts: int = 3, +) -> str: + """Request a name from Gemma, enforce blocklist + corridor dedup + + per-body cross-type dedup, fall back to the palette generator on + persistent failure. + + Dedup scopes: + - `corpus[(corridor, feature_type)]` — cross-body dedup within the + same corridor and feature type. Two rivers in the north_reach + should not share a name; two rivers on opposite arcs can. + - `body_used` — per-body set across ALL feature types. Prevents + the same name from appearing as a river AND an ocean AND a + mountain range on the same world, which reads as ridiculous + even when the types differ. + """ + template = FEATURE_PROMPTS.get(feature_type) + corridor = ctx.get("cultural_corridor") or "core" + if template is None: + return fallback_name(corridor, feature_type, _seed_for(world_seed, body_id, local_id, 0)) + + palette = palette_for(corridor) + prompt = template.format( + inflection=palette["inflection"], + planet_class=ctx.get("planet_class") or "habitable", + ) + + dedup_key = (corridor, feature_type) + used = corpus.setdefault(dedup_key, set()) + + def _is_duplicate(candidate: str) -> bool: + lc = candidate.lower() + return ( + lc in (n.lower() for n in used) + or lc in (n.lower() for n in body_used) + ) + + def _exceeds_stem_cap(candidate: str) -> str | None: + """Return the first stem in `candidate` that would exceed the + cap after this accept, or None if all stems are under the cap.""" + if stem_cap <= 0: + return None + for stem in _extract_stems(candidate): + if stem_counts.get(stem, 0) >= stem_cap: + return stem + return None + + def _commit_name(final: str) -> None: + used.add(final) + body_used.add(final) + for stem in _extract_stems(final): + stem_counts[stem] = stem_counts.get(stem, 0) + 1 + + for attempt in range(max_attempts): + seed = _seed_for(world_seed, body_id, local_id, attempt) + try: + raw = voice.request(prompt, seed) + except RuntimeError as e: + if verbose: + log(f" subprocess error on {body_id}/{local_id} attempt " + f"{attempt}: {e} — retrying") + continue + + cleaned = post_process(raw) + if not cleaned: + continue + if is_placeholder(cleaned): + if verbose: + log(f" placeholder '{cleaned}' ({body_id}/{local_id}) — retrying") + continue + if is_blocked(cleaned, blocklist): + if verbose: + log(f" blocklist hit '{cleaned}' ({body_id}/{local_id}) — retrying") + continue + if _is_duplicate(cleaned): + if verbose: + log(f" dedup hit '{cleaned}' ({body_id}/{local_id}) — retrying") + continue + over_stem = _exceeds_stem_cap(cleaned) + if over_stem is not None: + if verbose: + log(f" stem cap hit '{cleaned}' (stem '{over_stem}' at " + f"cap {stem_cap}) {body_id}/{local_id} — retrying") + continue + _commit_name(cleaned) + return cleaned + + # All attempts exhausted — deterministic palette fallback, then dedup. + # Fallback names draw from the palette stems and do NOT count against + # the stem cap (the palette is intentionally narrow and would trigger + # infinite rejection loops otherwise). + salt = _seed_for(world_seed, body_id, local_id, max_attempts) & 0xFFFFFF + fallback = fallback_name(corridor, feature_type, salt) + bump = 0 + while _is_duplicate(fallback) and bump < 100: + bump += 1 + fallback = fallback_name(corridor, feature_type, salt + bump) + used.add(fallback) + body_used.add(fallback) + log(f" fallback: {body_id}/{local_id} → '{fallback}'") + return fallback + + +# --------------------------------------------------------------------------- +# Body walker +# --------------------------------------------------------------------------- + +def load_body_context(body_id: str, system_id: str, conn: sqlite3.Connection) -> dict: + row = conn.execute( + """ + SELECT b.planet_class, b.settlement_pattern, + COALESCE(b.cultural_corridor, s.cultural_corridor, s.geographic_sector), + b.population, b.economic_role + FROM bodies b + JOIN star_systems s ON b.system_id = s.system_id + WHERE b.body_id = ? + """, + (body_id,), + ).fetchone() + if row is None: + return { + "planet_class": None, "settlement_pattern": None, + "cultural_corridor": None, "population": 0, "economic_role": None, + "pop_band": "unknown", + } + planet_class, settlement_pattern, corridor, population, economic_role = row + return { + "planet_class": planet_class, + "settlement_pattern": settlement_pattern, + "cultural_corridor": corridor, + "population": population or 0, + "economic_role": economic_role, + "pop_band": body_population_band(population or 0), + } + + +def load_body_hop_order(conn: sqlite3.Connection) -> dict[str, tuple[int, str]]: + """Return a `{body_id: (hop_distance_from_gateway, body_id)}` map used + as a stable sort key so the pipeline walks the reach from core + outward: Gateway (hop 0) first, then hop 1, hop 2, ... all the way + to the deep frontier. Ordering core-first gives those bodies first + crack at every unique Gemma output and lets outer sectors fall + into the palette fallback when they lose the dedup race. + """ + rows = conn.execute( + """ + SELECT b.body_id, + COALESCE(sg.hop_distance_from_gateway, 99) AS hop + FROM bodies b + LEFT JOIN system_gates sg ON b.system_id = sg.system_id + """ + ).fetchall() + return {body_id: (hop, body_id) for body_id, hop in rows} + + +def _is_blank(value) -> bool: + return value is None or (isinstance(value, str) and value.strip() == "") + + +def _feature_type_for_city(city: dict) -> str: + return "city_capital" if city.get("kind") == "capital" else "city_secondary" + + +def _feature_type_for_poi(poi: dict) -> str: + kind = (poi.get("kind") or "").lower() + if kind in ("transit", "gate_terminal"): + return "poi_transit" + if kind in ("institutional", "corporate", "government"): + return "poi_institutional" + if kind in ("cultural", "commercial", "heritage"): + return "poi_cultural" + return "poi_institutional" + + +def _feature_type_for_ocean(water: dict) -> str: + kind = (water.get("kind") or "ocean").lower() + if kind == "lake": + return "lake" + if kind == "sea": + return "sea" + return "ocean" + + +def process_body( + body_id: str, + system_id: str, + markers_path: Path, + voice: VoiceSubprocess, + conn: sqlite3.Connection, + blocklist: set[str], + corpus: dict[tuple[str, str], set[str]], + stem_counts: dict[str, int], + stem_cap: int, + world_seed: int, + log: "Logger", + verbose: bool, +) -> dict: + """Fill every empty name field in this body's markers.json. Returns + a summary counts dict plus a `generated` dict mapping section name + to the list of new names produced (for the main loop to log).""" + try: + markers = json.loads(markers_path.read_text()) + except json.JSONDecodeError as e: + return {"error": f"invalid JSON: {e}"} + + grid = markers.get("grid") or {} + if grid.get("w") != GRID_W or grid.get("h") != GRID_H: + return { + "error": ( + f"grid mismatch {grid} != {{'w': {GRID_W}, 'h': {GRID_H}}}" + ) + } + + ctx = load_body_context(body_id, system_id, conn) + corridor = ctx.get("cultural_corridor") or "core" + + counts = { + "cities": 0, "rivers": 0, "oceans": 0, "mountain_ranges": 0, "pois": 0, + "preserved": 0, + } + generated: dict[str, list[str]] = { + "cities": [], "rivers": [], "oceans": [], "mountain_ranges": [], "pois": [], + } + changed = False + + # Per-body dedup set — no name may appear twice on the same body, + # even across feature types. Seeded with every hand-authored name + # already present so templates (Lendel, Edict, Estrade, …) keep their + # canonical identifiers and new features don't collide with them. + # Hand-authored names also count against the stem cap so those + # anchors take priority over generator output. + body_used: set[str] = set() + for key in ("cities", "rivers", "oceans", "mountain_ranges", "pois"): + for feat in markers.get(key) or []: + name = feat.get("name") + if name and isinstance(name, str) and name.strip(): + body_used.add(name.strip()) + for stem in _extract_stems(name): + stem_counts[stem] = stem_counts.get(stem, 0) + 1 + + # Cities + for city in markers.get("cities") or []: + if not _is_blank(city.get("name")): + corpus.setdefault((corridor, _feature_type_for_city(city)), set()).add( + city["name"] + ) + counts["preserved"] += 1 + continue + feature_type = _feature_type_for_city(city) + name = name_feature( + voice, feature_type, ctx, blocklist, corpus, body_used, + stem_counts, stem_cap, + world_seed, body_id, city.get("id") or "city_?", + log, verbose, + ) + city["name"] = name + counts["cities"] += 1 + generated["cities"].append(name) + changed = True + + # Rivers + for river in markers.get("rivers") or []: + if not _is_blank(river.get("name")): + corpus.setdefault((corridor, "river"), set()).add(river["name"]) + counts["preserved"] += 1 + continue + name = name_feature( + voice, "river", ctx, blocklist, corpus, body_used, + stem_counts, stem_cap, + world_seed, body_id, river.get("id") or "river_?", + log, verbose, + ) + river["name"] = name + counts["rivers"] += 1 + generated["rivers"].append(name) + changed = True + + # Oceans / seas / lakes + for water in markers.get("oceans") or []: + if not _is_blank(water.get("name")): + corpus.setdefault((corridor, _feature_type_for_ocean(water)), set()).add( + water["name"] + ) + counts["preserved"] += 1 + continue + feature_type = _feature_type_for_ocean(water) + name = name_feature( + voice, feature_type, ctx, blocklist, corpus, body_used, + stem_counts, stem_cap, + world_seed, body_id, water.get("id") or "water_?", + log, verbose, + ) + water["name"] = name + counts["oceans"] += 1 + generated["oceans"].append(name) + changed = True + + # Mountain ranges + for rng_feat in markers.get("mountain_ranges") or []: + if not _is_blank(rng_feat.get("name")): + corpus.setdefault((corridor, "mountain_range"), set()).add( + rng_feat["name"] + ) + counts["preserved"] += 1 + continue + name = name_feature( + voice, "mountain_range", ctx, blocklist, corpus, body_used, + stem_counts, stem_cap, + world_seed, body_id, rng_feat.get("id") or "range_?", + log, verbose, + ) + rng_feat["name"] = name + counts["mountain_ranges"] += 1 + generated["mountain_ranges"].append(name) + changed = True + + # POIs + for poi in markers.get("pois") or []: + if not _is_blank(poi.get("name")): + corpus.setdefault((corridor, _feature_type_for_poi(poi)), set()).add( + poi["name"] + ) + counts["preserved"] += 1 + continue + feature_type = _feature_type_for_poi(poi) + name = name_feature( + voice, feature_type, ctx, blocklist, corpus, body_used, + stem_counts, stem_cap, + world_seed, body_id, poi.get("id") or "poi_?", + log, verbose, + ) + poi["name"] = name + counts["pois"] += 1 + generated["pois"].append(name) + changed = True + + if changed: + markers_path.write_text(json.dumps(markers, indent=2) + "\n") + # Refresh atlas_* rows for this body so DB queries pick up the + # new names without a separate generate_atlas.py pass. Commit + # immediately so a mid-run crash / kill loses at most one body + # of DB state — the markers.json files are already persisted + # above, atomically, via Path.write_text. + sync_markers_to_db(conn, body_id, markers) + conn.commit() + + counts["generated"] = generated + return counts + + +# --------------------------------------------------------------------------- +# Body discovery +# --------------------------------------------------------------------------- + +def _body_id_from_path(markers_path: Path) -> tuple[str, str]: + """From wiki/star-systems/GJ-244A/bodies/GJ244Ad/markers.json + return ('GJ244Ad', 'GJ 244A').""" + body_id = markers_path.parent.name + system_slug = markers_path.parent.parent.parent.name + system_id = system_slug.replace("-", " ", 1) if system_slug.startswith("GJ-") else system_slug + return body_id, system_id + + +def discover_bodies( + body_filter: str | None, + limit: int | None, + hop_order: dict[str, tuple[int, str]], +) -> list[Path]: + """Discover every markers.json under wiki/star-systems/ and return the + list sorted by hop distance from Gateway ascending (core first, deep + frontier last). Files whose body_id is not in the hop_order map — + e.g. bodies deleted from the DB but still carrying a markers.json — + sort to the end with a sentinel hop of 99 so they don't pollute + early dedup decisions. + """ + all_markers = list(WIKI_SYSTEMS.glob("*/bodies/*/markers.json")) + if body_filter: + all_markers = [ + p for p in all_markers if _body_id_from_path(p)[0] == body_filter + ] + + def sort_key(path: Path) -> tuple[int, str]: + body_id = _body_id_from_path(path)[0] + return hop_order.get(body_id, (99, body_id)) + + all_markers.sort(key=sort_key) + + if limit is not None: + all_markers = all_markers[:limit] + return all_markers + + +# --------------------------------------------------------------------------- +# Main +# --------------------------------------------------------------------------- + +def main(): + parser = argparse.ArgumentParser( + description="Batch-name atlas features via Gemma 2 voice pipeline (#833)" + ) + parser.add_argument("--db", default=str(DB_PATH), help="Path to systems.db") + parser.add_argument("--body", help="Process only this body_id") + parser.add_argument( + "--limit", + type=int, + help="Process at most N bodies (in sorted order). Smoke testing.", + ) + parser.add_argument( + "--mock", + action="store_true", + help="Use mock-stdio.sh instead of the real sr-voice binary", + ) + parser.add_argument( + "--sr-voice", + default=str(DEFAULT_SR_VOICE), + help="Path to the sr-voice release binary", + ) + parser.add_argument( + "--model", + default=str(DEFAULT_MODEL), + help="Path to the Gemma 2 GGUF model (ignored in --mock mode)", + ) + parser.add_argument( + "--refresh", + type=int, + default=200, + help="Restart the voice subprocess every N requests (default: 200) " + "to prevent KV-cache context bleed", + ) + parser.add_argument( + "--seed", + type=int, + default=42, + help="World seed for deterministic naming (default: 42)", + ) + parser.add_argument( + "--stem-cap", + type=int, + default=20, + help="Max times any single cultural stem (e.g. 'Arcturus', " + "'Meridian') may appear across the full run before dedup " + "starts rejecting it. 0 = disabled. Default: 20.", + ) + parser.add_argument( + "--shard", + default="0/1", + help="Process a slice of the body list for parallel runs. Format " + "N/M: worker N of M total. Each worker walks bodies in hop " + "order, picking every Mth body starting at offset N. Example: " + "run `--shard 0/2` in one terminal and `--shard 1/2` in " + "another to split the work in half. Default: 0/1 (all bodies).", + ) + parser.add_argument( + "--log", + default=None, + help="Path to a log file. Every status line is written to both " + "stdout and the log. Defaults to " + ".tmp/gemma_naming.shard{N}of{M}.log when --shard is not " + "trivially 0/1; disabled otherwise. Pass '-' to disable.", + ) + parser.add_argument( + "--verbose", + action="store_true", + help="Print per-feature retry detail (noisy) and subprocess " + "lifecycle events", + ) + args = parser.parse_args() + + # Parse shard spec. + try: + shard_n_str, shard_m_str = args.shard.split("/", 1) + shard_n = int(shard_n_str) + shard_m = int(shard_m_str) + if shard_m < 1 or not (0 <= shard_n < shard_m): + raise ValueError + except ValueError: + print( + f"error: invalid --shard '{args.shard}'. " + "Expected N/M with 0 <= N < M, e.g. 0/2.", + file=sys.stderr, + ) + sys.exit(1) + + # Default log path: enable for non-trivial shards, disable for 0/1. + if args.log is None: + if shard_m > 1: + log_path = REPO_ROOT / ".tmp" / f"gemma_naming.shard{shard_n}of{shard_m}.log" + else: + log_path = None + elif args.log == "-": + log_path = None + else: + log_path = Path(args.log) + + db_path = Path(args.db) + if not db_path.exists(): + print(f"error: {db_path} not found", file=sys.stderr) + sys.exit(1) + + sr_voice_bin = Path(args.sr_voice) + model_path = Path(args.model) if args.model else None + + if not args.mock: + if not sr_voice_bin.exists(): + print( + f"error: sr-voice binary not found at {sr_voice_bin}\n" + "Either build it (`make build-sr-voice` in the main workdir) " + "or run with --mock for a dry-fire test.", + file=sys.stderr, + ) + sys.exit(1) + if model_path and not model_path.exists(): + print( + f"error: model not found at {model_path}\n" + "Either download the Gemma 2 GGUF or run with --mock.", + file=sys.stderr, + ) + sys.exit(1) + else: + if not MOCK_STDIO.exists(): + print(f"error: mock stdio script not found at {MOCK_STDIO}", file=sys.stderr) + sys.exit(1) + + log = Logger(log_path) + blocklist = load_blocklist() + + conn = sqlite3.connect(str(db_path), timeout=30.0) + # WAL mode + busy_timeout so two concurrent shards serialize writes + # without locking errors. WAL is a pragma-level switch, safe to + # re-apply on every connect. + conn.execute("PRAGMA journal_mode=WAL") + conn.execute("PRAGMA busy_timeout=15000") + conn.execute("PRAGMA foreign_keys=ON") + ensure_atlas_schema(conn) + + hop_order = load_body_hop_order(conn) + all_markers = discover_bodies(args.body, args.limit, hop_order) + if not all_markers: + log(f"error: no markers.json found (body={args.body})") + conn.close() + sys.exit(1) + + # Apply shard slicing AFTER discovery + sort. Shard 0/2 gets indices + # [0, 2, 4, …], shard 1/2 gets [1, 3, 5, …] — interleaved in hop + # order so both shards advance core → frontier in parallel. + markers_paths = all_markers[shard_n::shard_m] + if not markers_paths: + log(f"error: shard {shard_n}/{shard_m} contains no bodies " + f"(full set = {len(all_markers)}).") + conn.close() + sys.exit(1) + + # Count distinct systems the shard will touch so the progress lines + # can report `systems X/Y done` alongside `bodies X/Y done`. + shard_systems = sorted({_body_id_from_path(p)[1] for p in markers_paths}) + total_shard_systems = len(shard_systems) + seen_systems: set[str] = set() + + first_hop = hop_order.get(_body_id_from_path(markers_paths[0])[0], (99, ""))[0] + last_hop = hop_order.get(_body_id_from_path(markers_paths[-1])[0], (99, ""))[0] + + banner_shard = f"{shard_n}/{shard_m}" if shard_m > 1 else "single" + log.raw("") + log.raw(f" Gemma 2 Batch Naming Pipeline (#833)") + log.raw(f" DB: {db_path}") + log.raw(f" Mode: {'MOCK' if args.mock else 'REAL'}") + log.raw(f" Shard: {banner_shard}") + log.raw(f" sr-voice: {MOCK_STDIO if args.mock else sr_voice_bin}") + if not args.mock: + log.raw(f" model: {model_path}") + log.raw(f" seed: {args.seed} refresh: every {args.refresh} requests " + f"stem-cap: {args.stem_cap}") + log.raw(f" {len(markers_paths)} markers.json files in this shard " + f"(full set: {len(all_markers)})") + log.raw(f" hop {first_hop} → hop {last_hop}, core-first ordering") + log.raw(f" {total_shard_systems} distinct systems") + log.raw(f" blocklist: {len(blocklist)} Earth-major entries") + if log.log_path is not None: + log.raw(f" log: {log.log_path}") + log.raw("") + + corpus: dict[tuple[str, str], set[str]] = {} + stem_counts: dict[str, int] = {} + + totals = { + "cities": 0, "rivers": 0, "oceans": 0, "mountain_ranges": 0, "pois": 0, + "preserved": 0, "errors": 0, + } + bodies_touched = 0 + t_total = time.time() + + try: + with VoiceSubprocess( + sr_voice_bin=sr_voice_bin, + model_path=None if args.mock else model_path, + mock=args.mock, + refresh_every=args.refresh, + verbose=args.verbose, + ) as voice: + for i, markers_path in enumerate(markers_paths): + body_id, system_id = _body_id_from_path(markers_path) + seen_systems.add(system_id) + t0 = time.time() + counts = process_body( + body_id=body_id, + system_id=system_id, + markers_path=markers_path, + voice=voice, + conn=conn, + blocklist=blocklist, + corpus=corpus, + stem_counts=stem_counts, + stem_cap=args.stem_cap, + world_seed=args.seed, + log=log, + verbose=args.verbose, + ) + elapsed = time.time() - t0 + + body_progress = f"body {i+1}/{len(markers_paths)}" + sys_progress = f"sys {len(seen_systems)}/{total_shard_systems}" + hop = hop_order.get(body_id, (99, ""))[0] + progress = f"{body_progress} {sys_progress} hop={hop}" + + if "error" in counts: + totals["errors"] += 1 + log(f" [{progress}] {body_id:14s} ERROR: {counts['error']}") + continue + + generated: dict[str, list[str]] = counts.pop("generated", {}) or { + "cities": [], "rivers": [], "oceans": [], + "mountain_ranges": [], "pois": [], + } + + touched = ( + counts["cities"] + counts["rivers"] + counts["oceans"] + + counts["mountain_ranges"] + counts["pois"] + ) + if touched: + bodies_touched += 1 + for k in ("cities", "rivers", "oceans", "mountain_ranges", "pois", "preserved"): + totals[k] += counts[k] + log( + f" [{progress}] {body_id:14s} +{touched} names " + f"({elapsed:.1f}s) — " + f"cities={counts['cities']} rivers={counts['rivers']} " + f"oceans={counts['oceans']} mtns={counts['mountain_ranges']} " + f"pois={counts['pois']}" + ) + # Print the new names so the user can eyeball quality + # as the run progresses. + for section_label, key in ( + ("cities", "cities"), + ("rivers", "rivers"), + ("waters", "oceans"), + ("mtns", "mountain_ranges"), + ("pois", "pois"), + ): + names = generated.get(key) or [] + if names: + preview = ", ".join(names[:10]) + if len(names) > 10: + preview += f", … (+{len(names) - 10} more)" + log(f" {section_label:7s} {preview}") + else: + totals["preserved"] += counts["preserved"] + if args.verbose: + log( + f" [{progress}] {body_id:14s} " + f"no blanks ({counts['preserved']} preserved)" + ) + + # Periodic cumulative snapshot so the log has regular + # checkpoint lines the user can scroll to. + if (i + 1) % 25 == 0 or (i + 1) == len(markers_paths): + cum = ( + totals["cities"] + totals["rivers"] + totals["oceans"] + + totals["mountain_ranges"] + totals["pois"] + ) + rate = cum / max(time.time() - t_total, 1e-6) + remaining = len(markers_paths) - (i + 1) + if remaining > 0 and (i + 1) > 0: + per_body = (time.time() - t_total) / (i + 1) + eta_s = int(per_body * remaining) + eta = f"{eta_s // 3600}h{(eta_s % 3600) // 60:02d}m" + else: + eta = "--" + log( + f" >> CHECKPOINT bodies {i+1}/{len(markers_paths)} " + f"systems {len(seen_systems)}/{total_shard_systems} " + f"names {cum} {rate:.1f}/s eta {eta}" + ) + + # Final explicit commit for anything we accumulated since + # the last per-body commit (should be no-op since we commit + # per body, but defensive). + conn.commit() + finally: + conn.close() + + elapsed_total = time.time() - t_total + log.raw("") + log.raw(f" Done: {elapsed_total:.0f}s ({elapsed_total/60:.1f} min)") + log.raw(f" shard: {banner_shard}") + log.raw(f" bodies processed: {len(markers_paths)}") + log.raw(f" bodies touched: {bodies_touched}") + log.raw(f" systems seen: {len(seen_systems)}/{total_shard_systems}") + log.raw(f" cities named: {totals['cities']}") + log.raw(f" rivers named: {totals['rivers']}") + log.raw(f" oceans named: {totals['oceans']}") + log.raw(f" mountains named: {totals['mountain_ranges']}") + log.raw(f" pois named: {totals['pois']}") + log.raw(f" preserved: {totals['preserved']}") + log.raw(f" errors: {totals['errors']}") + log.raw("") + log.close() + + if totals["errors"] > 0: + sys.exit(1) + + +if __name__ == "__main__": + main()