Fix planet generator pipeline bugs: removed atomic .tmp→rename write pattern that caused silent FileNotFoundError on some bodies; fixed --heightmap-size CLI flag being silently ignored (Python default parameter binding gotcha)
Reduce heightmap resolution from 4096x2048 to 1024x512: native simulation grid is 512x256 — the 4096 images were pure interpolation padding with zero information gain. Cuts heightmap sizes from ~3.5MB to ~350KB each.
Generate body content for all 303 star systems: ~2,600 celestial bodies with index.md (YAML frontmatter), globe.png (512x512), heightmap.png (1024x512), terrain.npz, and markers.json
Size impact
Total generated content: ~5.4GB → estimated ~3.5GB after heightmap reduction (bodies still being regenerated at time of push)
Test plan
Spot-checked 10 random body files — valid YAML, correct physical params, assets present
Verified all 2,394 heightmaps are 1024x512 (zero wrong-sized)
Confirmed --heightmap-size flag works correctly with explicit params
Verified deterministic output: same body_id produces identical results across runs
No .tmp files left behind — direct writes are clean
## Summary
- **Fix planet generator pipeline bugs**: removed atomic `.tmp→rename` write pattern that caused silent `FileNotFoundError` on some bodies; fixed `--heightmap-size` CLI flag being silently ignored (Python default parameter binding gotcha)
- **Reduce heightmap resolution from 4096x2048 to 1024x512**: native simulation grid is 512x256 — the 4096 images were pure interpolation padding with zero information gain. Cuts heightmap sizes from ~3.5MB to ~350KB each.
- **Generate body content for all 303 star systems**: ~2,600 celestial bodies with index.md (YAML frontmatter), globe.png (512x512), heightmap.png (1024x512), terrain.npz, and markers.json
## Size impact
Total generated content: ~5.4GB → estimated ~3.5GB after heightmap reduction (bodies still being regenerated at time of push)
## Test plan
- [x] Spot-checked 10 random body files — valid YAML, correct physical params, assets present
- [x] Verified all 2,394 heightmaps are 1024x512 (zero wrong-sized)
- [x] Confirmed `--heightmap-size` flag works correctly with explicit params
- [x] Verified deterministic output: same body_id produces identical results across runs
- [x] No `.tmp` files left behind — direct writes are clean
🤖 Generated with [Claude Code](https://claude.com/claude-code)
"Biome" describes per-zone vegetation classification (Whittaker table).
"Planet class" describes overall planetary character. The conflation
caused the planet generator to misclassify ~270 bodies as barren.
Scope: systems.db column, schema SQL, Rust atlas code, wiki table
headers (Biome → Class), atlas proposal JSONs, all docs/decisions,
tooling scripts. Also normalizes atmosphere vocabulary (breathable →
standard) and expands planet class mapping to all 26 wiki values.
Unknown classes default to temperate for modder safety.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The atomic .tmp→rename pattern caused silent FileNotFoundError on some
bodies. Removed in favour of direct writes — resume logic already handles
interrupted runs. Fixed --heightmap-size CLI flag which was silently
ignored due to Python default parameter binding. Changed default heightmap
resolution from 4096x2048 to 1024x512 (native simulation grid — no
information gain from upscaling).
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Scaffolded index.md, globe.png (512x512), heightmap.png (1024x512),
terrain.npz, and markers.json for ~2600 celestial bodies across the
Settled Reach. Heightmaps render at native simulation resolution.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Runtime smoke test: PR description mentions spot-checking 10 random bodies + verifying all 2,394 heightmaps are correct size + determinism verification. ✓
Sample checked: 28 bodies across all 14+ planet classes (all rare types + samples from common types).
Hoshe (QA): REQUEST_CHANGES
Summary: Impressively large-scale generation with consistent frontmatter structure and clean D-188 rename. Five concrete issues need fixing: a heading formatting bug affecting 216+ files, two missing-class bugs in batch.py and body_definition_parser.py, a gas_giant_ringed profile mismatch, and a latent NameError in parse_system.
#
File
Issue
1
tooling/planet-gen/scaffold_bodies.py
pclass.title() produces Hot_Arid, Cold_Arid, Temperate_Terminator in wiki headings — 216+ files affected. Fix: .replace("_", " ").title()
2
tooling/planet-gen/batch.py (_validate_body_def)
valid_classes set is missing cold_arid, hot_arid, tropical, boreal, temperate_terminator — --dry-run falsely flags 312+ bodies as invalid
3
tooling/planet-gen/body_definition_parser.py:~489
atmo_colors dict missing 5 extended classes — cold_arid/hot_arid/tropical/boreal/temperate_terminator bodies with atmospheres get no rim glow
4
tooling/planet-gen/scaffold_bodies.py
Gas giant profile table always shows Class: gas_giant even for gas_giant_ringed — the .replace("_ringed", "") strips distinction from profile table
5
tooling/planet-gen/body_definition_parser.py:~789
_check_habitability() called outside loop — only checks last body, NameError if system has zero renderable bodies
Araminta (Art Direction): REQUEST_CHANGES
Summary: Solid visual grammar — biome palette reads coherently, ocean depth blending is good, star tints are physically directed, gas giant palettes cover genuine variety. Main concerns are correctness gaps in extended planet classes affecting a non-trivial fraction of the 2,600 pages.
#
File
Issue
1
body_definition_parser.py:~489 + biomes.toml
5 extended classes have no atmosphere rim color. Additionally, biomes.toml has a dead atmosphere_colors.martian entry that nothing maps to — it's the perfect color for cold_arid
5 extended classes missing from cloud/tilt range dicts. Fallback cloud range (0.10, 0.40) is wrong for boreal (should be overcast) and tropical (should be high). GJ534d (boreal) generated only 13.5% cloud cover
3
render_heightmap.py (_render_legend)
Legend caps at 9 items at 1024px — mountain rock, tundra, ice/snow silently dropped on rich worlds. Also: biome IDs 5 and 10 both label "rainforest" creating duplicate legend entries
Legend caps at 9 items — important biomes (tundra, ice, mountain) dropped; duplicate "rainforest" label
_check_habitability outside loop — only checks last body per system
Gas giant _ringed profile mismatch — profile table strips distinction
Gas giant terrain fields — meaningless land_fraction in frontmatter
Stale docstring/comments/CLI — render_heightmap.py references old 4096 resolution
Missing infernal ring color — no artistic intent behind fallback color
Items 1–4 are high-priority (affect rendering correctness or large numbers of files). Items 5–10 are polish. All affected body files will need regeneration after fixes.
## Review: sprint-32/visual → main (type: visual)
**Reviewers:** Hoshe (QA), Araminta (Art Direction)
**Runtime smoke test:** PR description mentions spot-checking 10 random bodies + verifying all 2,394 heightmaps are correct size + determinism verification. ✓
**Sample checked:** 28 bodies across all 14+ planet classes (all rare types + samples from common types).
---
### Hoshe (QA): REQUEST_CHANGES
Summary: Impressively large-scale generation with consistent frontmatter structure and clean D-188 rename. Five concrete issues need fixing: a heading formatting bug affecting 216+ files, two missing-class bugs in batch.py and body_definition_parser.py, a gas_giant_ringed profile mismatch, and a latent NameError in parse_system.
| # | File | Issue |
|---|------|-------|
| 1 | `tooling/planet-gen/scaffold_bodies.py` | `pclass.title()` produces `Hot_Arid`, `Cold_Arid`, `Temperate_Terminator` in wiki headings — 216+ files affected. Fix: `.replace("_", " ").title()` |
| 2 | `tooling/planet-gen/batch.py` (`_validate_body_def`) | `valid_classes` set is missing `cold_arid`, `hot_arid`, `tropical`, `boreal`, `temperate_terminator` — `--dry-run` falsely flags 312+ bodies as invalid |
| 3 | `tooling/planet-gen/body_definition_parser.py:~489` | `atmo_colors` dict missing 5 extended classes — cold_arid/hot_arid/tropical/boreal/temperate_terminator bodies with atmospheres get no rim glow |
| 4 | `tooling/planet-gen/scaffold_bodies.py` | Gas giant profile table always shows `Class: gas_giant` even for `gas_giant_ringed` — the `.replace("_ringed", "")` strips distinction from profile table |
| 5 | `tooling/planet-gen/body_definition_parser.py:~789` | `_check_habitability()` called outside loop — only checks last body, NameError if system has zero renderable bodies |
---
### Araminta (Art Direction): REQUEST_CHANGES
Summary: Solid visual grammar — biome palette reads coherently, ocean depth blending is good, star tints are physically directed, gas giant palettes cover genuine variety. Main concerns are correctness gaps in extended planet classes affecting a non-trivial fraction of the 2,600 pages.
| # | File | Issue |
|---|------|-------|
| 1 | `body_definition_parser.py:~489` + `biomes.toml` | 5 extended classes have no atmosphere rim color. Additionally, `biomes.toml` has a dead `atmosphere_colors.martian` entry that nothing maps to — it's the perfect color for `cold_arid` |
| 2 | `body_definition_parser.py` (`CLASS_CLOUD`, `CLASS_TILT`) | 5 extended classes missing from cloud/tilt range dicts. Fallback cloud range `(0.10, 0.40)` is wrong for boreal (should be overcast) and tropical (should be high). GJ534d (boreal) generated only 13.5% cloud cover |
| 3 | `render_heightmap.py` (`_render_legend`) | Legend caps at 9 items at 1024px — mountain rock, tundra, ice/snow silently dropped on rich worlds. Also: biome IDs 5 and 10 both label "rainforest" creating duplicate legend entries |
| 4 | `scaffold_bodies.py` | Same `pclass.title()` underscore bug as Hoshe #1 |
| 5 | `render_heightmap.py` docstring + CLI | Module docstring still says "4096×2048", `UI_SCALE` comment says "4.0", and `--small` CLI flag is now a no-op |
| 6 | `body_definition_parser.py:~789` | Same `_check_habitability` outside-loop bug as Hoshe #5 |
| 7 | `body_definition_parser.py` (`RING_COLOURS`) | `infernal` gas giant palette has no paired ring color — only 5 of 6 palettes have explicit ring colors |
| 8 | Generated frontmatter (e.g. GJ860Be) | Gas giants carry meaningless `terrain.land_fraction` field — noise that downstream tools may misinterpret |
---
### Verdict: CHANGES REQUESTED
**Deduplicated issue list (10 unique items, priority order):**
1. **`pclass.title()` heading bug** — 216+ files show `Hot_Arid`, `Cold_Arid` etc.
2. **`batch.py` valid_classes** — 5 classes missing from dry-run validation
3. **`atmo_colors` missing 5 classes** — no atmosphere rim glow on atmospheric extended-class bodies; dead `martian` entry in biomes.toml
4. **`CLASS_CLOUD`/`CLASS_TILT` missing 5 classes** — wrong cloud coverage for boreal/tropical worlds
5. **Legend caps at 9 items** — important biomes (tundra, ice, mountain) dropped; duplicate "rainforest" label
6. **`_check_habitability` outside loop** — only checks last body per system
7. **Gas giant `_ringed` profile mismatch** — profile table strips distinction
8. **Gas giant terrain fields** — meaningless `land_fraction` in frontmatter
9. **Stale docstring/comments/CLI** — render_heightmap.py references old 4096 resolution
10. **Missing `infernal` ring color** — no artistic intent behind fallback color
Items 1–4 are high-priority (affect rendering correctness or large numbers of files). Items 5–10 are polish. All affected body files will need regeneration after fixes.
1. Fix pclass.title() underscore bug in scaffold headings (216+ files)
2. Add 5 extended classes to batch.py valid_classes set
3. Add atmosphere rim colors for cold_arid/hot_arid/tropical/boreal/temperate_terminator
4. Add cloud/tilt ranges for extended classes (boreal 55-75%, tropical 60-80%)
5. Fix legend overflow at 1024px + deduplicate rainforest labels
6. Move _check_habitability() inside loop (was only checking last body)
7. Preserve gas_giant_ringed distinction in profile table
8. Drop meaningless terrain fields from gas giant frontmatter
9. Update stale docstrings/comments for 1024x512 default
10. Add infernal ring color
All lookup tables (CLASS_TILT, CLASS_CLOUD, CLASS_POLAR_ICE, CLASS_GEOTHERMAL,
CLASS_OBLATENESS, atmo_colors, tectonic_map, substrate_map) now include the
5 extended planet classes. Body content requires full regeneration.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Summary: Fix commit resolved 8 of 10 original issues cleanly. 4 issues remain — 2 blocking (atmosphere colors applied to wrong layer, profile table raw identifiers), 2 polish (legend text overlap, title panel underscores).
#
Sev
File
Issue
1
BLOCKING
biomes.toml + planet_renderer.py
Atmosphere colors applied to wrong layer. Fix added colors to body_definition_parser.py's Python dict, but planet_renderer.py reads from biomes.toml [atmosphere_colors] via biome_config.py — NOT from body_def. Globe renders of cold_arid/hot_arid/tropical/boreal/temperate_terminator will have no rim glow. Must add 5 entries to biomes.toml, rename dead martian to cold_arid.
2
BLOCKING
scaffold_bodies.py
Profile table outputs raw identifiers.cold_arid, gas_giant_ringed, temperate_terminator shown verbatim. Heading was fixed but table wasn't. Apply .replace('_', ' ') or a display name helper.
3
POLISH
render_heightmap.py (_render_legend)
Legend labels collide. At 15+ items, step shrinks to 66px leaving 46px for text. Labels like "trop. rainforest" (96px) overflow into adjacent swatches. Need text clipping, abbreviation, or two-row layout. Chrome-only.
4
POLISH
render_heightmap.py (_render_title)
Title panel underscores..replace("_ringed", "") only handles one case. Fix: .replace("_", " ").title(). Chrome-only.
Araminta (Art Direction): REQUEST_CHANGES
Summary: The atmosphere rim color fix was applied to the wrong layer — body_definition_parser.py received the colors but planet_renderer.py reads from biomes.toml directly. All 5 extended classes will render globes without atmosphere glow. Legend overflow structurally unsolved.
#
Sev
File
Issue
1
BLOCKING
biomes.toml [atmosphere_colors]
Same as Hoshe #1. Globe renderer uses ATMO_COLORS.get(planet_class) from biomes.toml. Missing: cold_arid, hot_arid, tropical, boreal, temperate_terminator. Dead martian entry still present.
2
BLOCKING
render_heightmap.py (_render_legend)
Legend text overflows into adjacent swatches. PIL draw.text() has no clip — text renders past allocated slot into next swatch area. Garbled legends on biome-rich worlds.
Notes: Three atmosphere colors are identical to base classes (boreal=temperate, tropical=forest, hot_arid=arid) — functional but visually indistinguishable rims. If fixing biomes.toml anyway, could differentiate slightly.
Verdict: CHANGES REQUESTED
Deduplicated issue list (4 items):
#
Sev
Issue
1
BLOCKING
biomes.toml missing 5 atmosphere_colors — globe renderer reads from toml, not body_def. ~400+ globes render without atmosphere glow.
2
BLOCKING
Profile table raw identifiers — cold_arid, gas_giant_ringed shown verbatim in ~500+ wiki pages.
3
POLISH
Legend label overflow — text collides with adjacent swatches on biome-rich worlds (chrome-only).
4
POLISH
Title panel underscores — .replace("_ringed", "") insufficient (chrome-only).
Issue #1 is the critical catch — without this fix, all extended-class globes render without atmosphere glow.
## Review Round 2: sprint-32/visual → main (type: visual)
**Fix commit:** `467c21a0` — addressed 10 issues from round 1.
**Reviewers:** Hoshe (QA), Araminta (Art Direction)
---
### Hoshe (QA): REQUEST_CHANGES
Summary: Fix commit resolved 8 of 10 original issues cleanly. 4 issues remain — 2 blocking (atmosphere colors applied to wrong layer, profile table raw identifiers), 2 polish (legend text overlap, title panel underscores).
| # | Sev | File | Issue |
|---|-----|------|-------|
| 1 | **BLOCKING** | `biomes.toml` + `planet_renderer.py` | **Atmosphere colors applied to wrong layer.** Fix added colors to `body_definition_parser.py`'s Python dict, but `planet_renderer.py` reads from `biomes.toml [atmosphere_colors]` via `biome_config.py` — NOT from `body_def`. Globe renders of cold_arid/hot_arid/tropical/boreal/temperate_terminator will have no rim glow. Must add 5 entries to `biomes.toml`, rename dead `martian` to `cold_arid`. |
| 2 | **BLOCKING** | `scaffold_bodies.py` | **Profile table outputs raw identifiers.** `cold_arid`, `gas_giant_ringed`, `temperate_terminator` shown verbatim. Heading was fixed but table wasn't. Apply `.replace('_', ' ')` or a display name helper. |
| 3 | POLISH | `render_heightmap.py` (`_render_legend`) | **Legend labels collide.** At 15+ items, step shrinks to 66px leaving 46px for text. Labels like "trop. rainforest" (96px) overflow into adjacent swatches. Need text clipping, abbreviation, or two-row layout. Chrome-only. |
| 4 | POLISH | `render_heightmap.py` (`_render_title`) | **Title panel underscores.** `.replace("_ringed", "")` only handles one case. Fix: `.replace("_", " ").title()`. Chrome-only. |
---
### Araminta (Art Direction): REQUEST_CHANGES
Summary: The atmosphere rim color fix was applied to the wrong layer — `body_definition_parser.py` received the colors but `planet_renderer.py` reads from `biomes.toml` directly. All 5 extended classes will render globes without atmosphere glow. Legend overflow structurally unsolved.
| # | Sev | File | Issue |
|---|-----|------|-------|
| 1 | **BLOCKING** | `biomes.toml [atmosphere_colors]` | **Same as Hoshe #1.** Globe renderer uses `ATMO_COLORS.get(planet_class)` from biomes.toml. Missing: cold_arid, hot_arid, tropical, boreal, temperate_terminator. Dead `martian` entry still present. |
| 2 | **BLOCKING** | `render_heightmap.py` (`_render_legend`) | **Legend text overflows into adjacent swatches.** PIL `draw.text()` has no clip — text renders past allocated slot into next swatch area. Garbled legends on biome-rich worlds. |
| 3 | POLISH | `biomes.toml` | Dead `martian` entry in atmosphere_colors. |
| 4 | POLISH | `render_heightmap.py` (`_render_title`) | Same underscore issue as Hoshe #4. |
Notes: Three atmosphere colors are identical to base classes (boreal=temperate, tropical=forest, hot_arid=arid) — functional but visually indistinguishable rims. If fixing biomes.toml anyway, could differentiate slightly.
---
### Verdict: CHANGES REQUESTED
**Deduplicated issue list (4 items):**
| # | Sev | Issue |
|---|-----|-------|
| 1 | **BLOCKING** | **biomes.toml missing 5 atmosphere_colors** — globe renderer reads from toml, not body_def. ~400+ globes render without atmosphere glow. |
| 2 | **BLOCKING** | **Profile table raw identifiers** — `cold_arid`, `gas_giant_ringed` shown verbatim in ~500+ wiki pages. |
| 3 | POLISH | **Legend label overflow** — text collides with adjacent swatches on biome-rich worlds (chrome-only). |
| 4 | POLISH | **Title panel underscores** — `.replace("_ringed", "")` insufficient (chrome-only). |
Issue #1 is the critical catch — without this fix, all extended-class globes render without atmosphere glow.
1. Add 5 extended atmosphere colors to biomes.toml (globe renderer reads
from toml, not body_def) — cold_arid, hot_arid, tropical, boreal,
temperate_terminator. Remove dead martian entry. Slightly differentiate
colors from base classes.
2. Fix profile table raw identifiers — apply .replace('_', ' ') to class
field in wiki body pages.
3. Fix legend text overflow — truncate labels with ellipsis when step
size is too narrow for full text.
4. Fix title panel underscores — use .replace('_', ' ') instead of
.replace('_ringed', '').
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
All 14 prior issues verified resolved. No new blocking issues. 4 polish items noted for future tickets:
P1: Legend omits biome 24 (lithic_pioneer) and 26 (ice_shelf) — terrain renders correctly but legend has no swatch for these
P2: Stale "atomic write" comments in batch.py call sites
P3: batch.py --heightmap-size lacks input validation (CLI edge case only)
P4:atmosphere_color override path silently ignored by globe renderer
Araminta (Art Direction): APPROVE
All 11 atmosphere colors present and differentiated in biomes.toml. Color pairs distinct enough in context. Legend truncation degrades gracefully at high item counts. Temperature bands complete for all extended classes.
One polish item: body_definition_parser.py inline atmo_colors dict has stale values for 5 classes vs biomes.toml — no render impact (globe renderer reads from toml), but frontmatter metadata will be wrong for future consumers. Recommend importing from biome_config instead of maintaining a separate dict.
Verdict: APPROVED
Safe to proceed with batch regeneration. All blocking issues from rounds 1-2 resolved. Polish items can be ticketed for later cleanup.
## Review Round 3: sprint-32/visual → main (type: visual)
**Fix commits:** `467c21a0` (round 1), `a8379871` (round 2)
**Reviewers:** Hoshe (QA), Araminta (Art Direction)
---
### Hoshe (QA): APPROVE
All 14 prior issues verified resolved. No new blocking issues. 4 polish items noted for future tickets:
- **P1:** Legend omits biome 24 (lithic_pioneer) and 26 (ice_shelf) — terrain renders correctly but legend has no swatch for these
- **P2:** Stale "atomic write" comments in batch.py call sites
- **P3:** batch.py `--heightmap-size` lacks input validation (CLI edge case only)
- **P4:** `atmosphere_color` override path silently ignored by globe renderer
---
### Araminta (Art Direction): APPROVE
All 11 atmosphere colors present and differentiated in biomes.toml. Color pairs distinct enough in context. Legend truncation degrades gracefully at high item counts. Temperature bands complete for all extended classes.
One polish item: `body_definition_parser.py` inline `atmo_colors` dict has stale values for 5 classes vs biomes.toml — no render impact (globe renderer reads from toml), but frontmatter metadata will be wrong for future consumers. Recommend importing from `biome_config` instead of maintaining a separate dict.
---
### Verdict: APPROVED
Safe to proceed with batch regeneration. All blocking issues from rounds 1-2 resolved. Polish items can be ticketed for later cleanup.
Full regeneration of ~2,600 bodies with:
- Correct atmosphere rim colors for extended planet classes
- Clean headings and profile tables (no underscores)
- Boreal/tropical cloud coverage at correct ranges
- Gas giants without meaningless terrain fields
- All heightmaps at 1024x512
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Summary
.tmp→renamewrite pattern that caused silentFileNotFoundErroron some bodies; fixed--heightmap-sizeCLI flag being silently ignored (Python default parameter binding gotcha)Size impact
Total generated content: ~5.4GB → estimated ~3.5GB after heightmap reduction (bodies still being regenerated at time of push)
Test plan
--heightmap-sizeflag works correctly with explicit params.tmpfiles left behind — direct writes are clean🤖 Generated with Claude Code
Review: sprint-32/visual → main (type: visual)
Reviewers: Hoshe (QA), Araminta (Art Direction)
Runtime smoke test: PR description mentions spot-checking 10 random bodies + verifying all 2,394 heightmaps are correct size + determinism verification. ✓
Sample checked: 28 bodies across all 14+ planet classes (all rare types + samples from common types).
Hoshe (QA): REQUEST_CHANGES
Summary: Impressively large-scale generation with consistent frontmatter structure and clean D-188 rename. Five concrete issues need fixing: a heading formatting bug affecting 216+ files, two missing-class bugs in batch.py and body_definition_parser.py, a gas_giant_ringed profile mismatch, and a latent NameError in parse_system.
tooling/planet-gen/scaffold_bodies.pypclass.title()producesHot_Arid,Cold_Arid,Temperate_Terminatorin wiki headings — 216+ files affected. Fix:.replace("_", " ").title()tooling/planet-gen/batch.py(_validate_body_def)valid_classesset is missingcold_arid,hot_arid,tropical,boreal,temperate_terminator—--dry-runfalsely flags 312+ bodies as invalidtooling/planet-gen/body_definition_parser.py:~489atmo_colorsdict missing 5 extended classes — cold_arid/hot_arid/tropical/boreal/temperate_terminator bodies with atmospheres get no rim glowtooling/planet-gen/scaffold_bodies.pyClass: gas_gianteven forgas_giant_ringed— the.replace("_ringed", "")strips distinction from profile tabletooling/planet-gen/body_definition_parser.py:~789_check_habitability()called outside loop — only checks last body, NameError if system has zero renderable bodiesAraminta (Art Direction): REQUEST_CHANGES
Summary: Solid visual grammar — biome palette reads coherently, ocean depth blending is good, star tints are physically directed, gas giant palettes cover genuine variety. Main concerns are correctness gaps in extended planet classes affecting a non-trivial fraction of the 2,600 pages.
body_definition_parser.py:~489+biomes.tomlbiomes.tomlhas a deadatmosphere_colors.martianentry that nothing maps to — it's the perfect color forcold_aridbody_definition_parser.py(CLASS_CLOUD,CLASS_TILT)(0.10, 0.40)is wrong for boreal (should be overcast) and tropical (should be high). GJ534d (boreal) generated only 13.5% cloud coverrender_heightmap.py(_render_legend)scaffold_bodies.pypclass.title()underscore bug as Hoshe #1render_heightmap.pydocstring + CLIUI_SCALEcomment says "4.0", and--smallCLI flag is now a no-opbody_definition_parser.py:~789_check_habitabilityoutside-loop bug as Hoshe #5body_definition_parser.py(RING_COLOURS)infernalgas giant palette has no paired ring color — only 5 of 6 palettes have explicit ring colorsterrain.land_fractionfield — noise that downstream tools may misinterpretVerdict: CHANGES REQUESTED
Deduplicated issue list (10 unique items, priority order):
pclass.title()heading bug — 216+ files showHot_Arid,Cold_Aridetc.batch.pyvalid_classes — 5 classes missing from dry-run validationatmo_colorsmissing 5 classes — no atmosphere rim glow on atmospheric extended-class bodies; deadmartianentry in biomes.tomlCLASS_CLOUD/CLASS_TILTmissing 5 classes — wrong cloud coverage for boreal/tropical worlds_check_habitabilityoutside loop — only checks last body per system_ringedprofile mismatch — profile table strips distinctionland_fractionin frontmatterinfernalring color — no artistic intent behind fallback colorItems 1–4 are high-priority (affect rendering correctness or large numbers of files). Items 5–10 are polish. All affected body files will need regeneration after fixes.
Review Round 2: sprint-32/visual → main (type: visual)
Fix commit:
467c21a0— addressed 10 issues from round 1.Reviewers: Hoshe (QA), Araminta (Art Direction)
Hoshe (QA): REQUEST_CHANGES
Summary: Fix commit resolved 8 of 10 original issues cleanly. 4 issues remain — 2 blocking (atmosphere colors applied to wrong layer, profile table raw identifiers), 2 polish (legend text overlap, title panel underscores).
biomes.toml+planet_renderer.pybody_definition_parser.py's Python dict, butplanet_renderer.pyreads frombiomes.toml [atmosphere_colors]viabiome_config.py— NOT frombody_def. Globe renders of cold_arid/hot_arid/tropical/boreal/temperate_terminator will have no rim glow. Must add 5 entries tobiomes.toml, rename deadmartiantocold_arid.scaffold_bodies.pycold_arid,gas_giant_ringed,temperate_terminatorshown verbatim. Heading was fixed but table wasn't. Apply.replace('_', ' ')or a display name helper.render_heightmap.py(_render_legend)render_heightmap.py(_render_title).replace("_ringed", "")only handles one case. Fix:.replace("_", " ").title(). Chrome-only.Araminta (Art Direction): REQUEST_CHANGES
Summary: The atmosphere rim color fix was applied to the wrong layer —
body_definition_parser.pyreceived the colors butplanet_renderer.pyreads frombiomes.tomldirectly. All 5 extended classes will render globes without atmosphere glow. Legend overflow structurally unsolved.biomes.toml [atmosphere_colors]ATMO_COLORS.get(planet_class)from biomes.toml. Missing: cold_arid, hot_arid, tropical, boreal, temperate_terminator. Deadmartianentry still present.render_heightmap.py(_render_legend)draw.text()has no clip — text renders past allocated slot into next swatch area. Garbled legends on biome-rich worlds.biomes.tomlmartianentry in atmosphere_colors.render_heightmap.py(_render_title)Notes: Three atmosphere colors are identical to base classes (boreal=temperate, tropical=forest, hot_arid=arid) — functional but visually indistinguishable rims. If fixing biomes.toml anyway, could differentiate slightly.
Verdict: CHANGES REQUESTED
Deduplicated issue list (4 items):
cold_arid,gas_giant_ringedshown verbatim in ~500+ wiki pages..replace("_ringed", "")insufficient (chrome-only).Issue #1 is the critical catch — without this fix, all extended-class globes render without atmosphere glow.
1. Add 5 extended atmosphere colors to biomes.toml (globe renderer reads from toml, not body_def) — cold_arid, hot_arid, tropical, boreal, temperate_terminator. Remove dead martian entry. Slightly differentiate colors from base classes. 2. Fix profile table raw identifiers — apply .replace('_', ' ') to class field in wiki body pages. 3. Fix legend text overflow — truncate labels with ellipsis when step size is too narrow for full text. 4. Fix title panel underscores — use .replace('_', ' ') instead of .replace('_ringed', ''). Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>Review Round 3: sprint-32/visual → main (type: visual)
Fix commits:
467c21a0(round 1),a8379871(round 2)Reviewers: Hoshe (QA), Araminta (Art Direction)
Hoshe (QA): APPROVE
All 14 prior issues verified resolved. No new blocking issues. 4 polish items noted for future tickets:
--heightmap-sizelacks input validation (CLI edge case only)atmosphere_coloroverride path silently ignored by globe rendererAraminta (Art Direction): APPROVE
All 11 atmosphere colors present and differentiated in biomes.toml. Color pairs distinct enough in context. Legend truncation degrades gracefully at high item counts. Temperature bands complete for all extended classes.
One polish item:
body_definition_parser.pyinlineatmo_colorsdict has stale values for 5 classes vs biomes.toml — no render impact (globe renderer reads from toml), but frontmatter metadata will be wrong for future consumers. Recommend importing frombiome_configinstead of maintaining a separate dict.Verdict: APPROVED
Safe to proceed with batch regeneration. All blocking issues from rounds 1-2 resolved. Polish items can be ticketed for later cleanup.
Review Round 4: sprint-32/visual → main (post-regeneration)
Commit:
32c7d5fa— regenerated all ~2,600 bodies with review fixes applied.Tooling code: Approved in round 3 — no changes since.
Reviewer: Hoshe (QA) — output verification only.
Hoshe (QA): APPROVE
17 bodies sampled across all planet classes. All 14 previously-flagged issues confirmed resolved in regenerated output:
![Heightmap]Verdict: APPROVED
4 rounds, 14 issues found and fixed. Clean to merge.
Pull request closed