An experiment, at Jeroen's request: predict how the wiki seed data is structured
WITHOUT reading it, seal the prediction, then score it. The prediction is
a1addf7e2, committed before wiki/ was opened so it could not be retrofitted.
The score, against a rule fixed in advance:
RIGHT — markdown + YAML frontmatter, TOML for economics tables, the body path
shape, more trees than the three I had seen.
WRONG — "a source, never an output". That holds for 253 pages and is backwards
for 3,262: star-systems/ is GENERATED from systems.db by tooling/db/wiki_sync.py,
its <!-- READ-ONLY --> blocks are renders, and body frontmatter IS the body
definition rather than a description of one. Also wrong: "probably no schema
docs" — there are 17 templates, ten authoring guides, economics/schema.md and a
GOVERNANCE.md that states the ownership models plainly.
ABSENT (the expensive bucket) — the two ownership models running in OPPOSITE
directions; the GTTR prose channel; terrain.npz/globe.png; that stations and
districts have NO wiki directories; that `description` frontmatter exists so
agents can filter before loading; and the scale, 11,864 files.
ROOT CAUSE, and it is not missing documentation. The wiki documents itself well.
It was unreachable: wiki/ appears in NEITHER CLAUDE.md's Project Structure block
NOR .claude/rules/project-structure.md, the annotated tree whose entire job is
orienting an agent. The largest tree in the repo — the seed for the whole Reach —
was invisible from both files a session reads first. Every item in the absent
bucket follows from that one omission. The proof is this session: it spent three
days fixing Ferrath's terrain rendering and never once saw
wiki/star-systems/GJ-820B/bodies/GJ820Bc/index.md, the file that defines Ferrath.
Fixed here: wiki/ enters both structure documents with the ownership split stated
where it will be read, and Skill(wiki) carries the traps — never hand-edit a
READ-ONLY block or body frontmatter, stations have no directories, the id is
spelled two ways, editing corp PROSE stales systems.db, and absent variance is
often deliberate rather than a gap.
That last point cost two false findings in one measurement and is worth the
warning: chemosynthetic:false on every body is a namespace reservation for
dextro-DNA-style biochemistry once geology and nature spawn to the 1x1m pixel,
and enabled:false on ~65% is staged rollout — clean planet types first, generator
scripts for the rest after. Both read as defects without the roadmap.
Also measured, since the seed's job is to supply variance: continuous axes are
rich (unique seed per body, 460-716 distinct values across orbit/tilt/ice/land)
while the categoricals that gate morphology are concentrated (68% tectonics low,
51% planet_class frozen). Filed as T-1244 with the design question stated first —
whether the distribution is intended — rather than as a defect.
Method caveat recorded in the findings: the aggregator reads scalar frontmatter
only, and atmosphere_color's "100% null" was a parser artefact, not a finding.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
11 KiB
Findings: how the wiki seed data is actually structured
2026-08-20. Scored against wiki-structure-blind-prediction.md, which was
committed before wiki/ was opened. Scoring rule was fixed in advance: right,
wrong, absent — with absent (a load-bearing thing I did not know
existed) treated as the expensive bucket, because that is what a future session
walks into blind.
The one-line version
The wiki is 93% machine-generated and 7% authored, and for the generated 93% the direction of truth runs DB → wiki, which is the opposite of what the prediction assumed. The single most useful sentence for a new session is: most of the wiki is an OUTPUT you must not hand-edit; a small flat set is an INPUT that generators read.
Scored
Right
wiki/is the authored world-content root;systems.dbis a build artefact. (True for the flat categories only — see Wrong.)- Markdown + YAML frontmatter, with the frontmatter carrying machine-read fields.
- TOML for tabular economics data; JSON (
markers.json) for name pools. star-systems/GJ-{id}/bodies/{body_id}/withheightmap.png,reliefmap.png,markers.json. (All[SEEN], so no credit.)- System dirs hyphenate (
GJ-820B), body dirs do not (GJ820Bc).[SEEN] - More content trees than the three I had seen. There are 16.
- Frontmatter is partly load-bearing and partly decorative, with no strong schema gate on the authored side.
Wrong
- "A source, never an output." Wrong for 93% of the wiki.
star-systems/pages are GENERATED and carry<!-- READ-ONLY -->sections rendered fromsystems.dbandstar-map.jsonbytooling/db/wiki_sync.py. Authored prose lives in designated sections that survive regeneration. Hand-editing a read-only section is silently reverted on the next sync. - "Bodies may not have their own pages." They do — ~2,600 of them — and
their frontmatter IS the body definition, i.e. generator INPUT rather than
description.
wiki/star-systems/GJ-820B/bodies/GJ820Bc/index.mdcarriesseed: 3669559456,land_fraction,axial_tilt_deg, star type. This is the file that defines Ferrath, the body whose Atlas rendering this session spent its entire length fixing, and the session never knew it existed. - "Probably no schema documentation." There is
wiki/GOVERNANCE.md,wiki/_templates/(17 templates, one per entity kind), ten authoring guides underwiki/authoring/, andwiki/economics/schema.md. The documentation is not missing. It is unreachable from where an agent starts. - "One generator (
import_economics)." At least six touch the wiki:wiki_sync.py,scaffold_bodies.py,body_definition_parser.py,populate_gttr_hook.py,populate_terrain_reference.py, plus the atlas sync, withatlas_cohesion_audit.pyauditing.
Absent — the expensive bucket
Things that are load-bearing and that I had no model of at all:
- The two ownership models, and that they run in opposite directions.
wiki/GOVERNANCE.mdstates it plainly; nothing an agent reads at session start points there. This is the fact most likely to cause damage: an agent "fixing" a system page edits a read-only block and the work vanishes. - The GTTR prose layer —
gttr.mdper system,gttr-{location}.mdper station,gttr-{corridor}.mdper corridor, feedinggttr_hookviapopulate_gttr_hook.py. An entire authored content channel, invisible to me. terrain.npzandglobe.pngper body, alongside the two PNGs I knew.- Stations and districts have NO wiki directories — they are
systems.dbrows rendered into each system page's table, with prose in flatgttr-{slug}.md. I would have gone looking forwiki/stations/. - The
descriptionfrontmatter field exists for AGENTS: GOVERNANCE.md says "agents filter by description before loading full files". There is a designed affordance for context-aware loading, and no agent-facing doc mentions it. - Scale: 301 systems, ~2,600 body pages, 11,864 files. The prediction had no sense of magnitude, which matters because it decides whether you grep or query.
A second-order finding: I documented a tree I had not opened
Jeroen, mid-pass: "did you scan the organizations economics and corporations dirs and such? do you know what is in it or do you have statistical scans of it?"
Statistical scans. At that point I had read index.md, GOVERNANCE.md,
directory listings, one body page and a scalar aggregate over 2,625 body files —
and had opened zero corporation, faction, economics, concept or triangle
files. Everything written above about the flat categories came from GOVERNANCE.md
DESCRIBING them. I was one commit from shipping a skill instructing others how to
work in trees I had never looked inside.
Reading them changed material facts:
- Four categories are empty scaffolding.
institutions/,species/,cultural-groups/,lore/hold 0 files while having templates. The distribution is lopsided:corporations/156,economics/17,factions/9,technology/7,contraband/andconcepts/4,triangles/2. - Corp frontmatter carries 14 fields, not the 3 the prediction guessed —
including
scope,faction_type,tags,cross_refs,decision_refs. economics/is an economic MODEL, not a set of lookup vocabularies: 37 authored commodity pages,production_chains.tomlwith real recipes (2t metallic_ore + 0.3 fusion_fuel -> 1t refined_metals), currency zones, shadow economy, behavioural/lore archetypes, and brand generation. The earlier draft of the skill called it "TOML vocabularies + schema.md", which is wrong in a way that would mislead.specialization_vocabulary.tomlis a shared id-space read by bothsystem_economy.economic_specializationandcorporations.corp_specialization— the latter authored in corp page frontmatter, not in a TOML.
The lesson generalises past this experiment: a statistical scan tells you the SHAPE of a tree and nothing about its CONTENT, and the two are easy to conflate when the statistics are detailed enough to feel like knowledge. The check that catches it is the one Jeroen applied — "have you opened one?"
Root cause of the gap
Not missing documentation — missing reachability. The wiki documents itself well (GOVERNANCE.md, templates, authoring guides, economics/schema.md). But:
wiki/does not appear in CLAUDE.md's Project Structure block.wiki/does not appear in.claude/rules/project-structure.md, the detailed annotated tree that exists precisely to orient an agent. Its only match for "wiki" is the parenthetical indb/ # Asset/connector scripts (audio, image, trellis, wiki).
So the single largest content tree in the repo — 11,864 files, the seed data for the entire Reach — is absent from both documents an agent reads first. Everything in the absent bucket follows from that one omission.
The seed is a parameter space, not a reference work
Jeroen's framing (2026-08-20), which corrects the emphasis above: most of this is written once at dev time, and its job is to be the seed for variance in the generator. Not documentation to maintain — the authored input the cascade varies from. Read that way, "is the wiki well documented" is the wrong question; "does the seed supply variance, and does an agent know it IS a seed" is the right one.
Measured variance across 2,625 body definitions
Continuous axes are genuinely rich:
| field | distinct values |
|---|---|
seed |
2,625 — unique per body |
distance_au |
716 |
polar_ice_lat |
691 |
axial_tilt_deg |
578 |
land_fraction |
460 |
Categorical axes — the ones that gate morphology and biome branches — are heavily concentrated:
| field | distinct | dominant value |
|---|---|---|
tectonics |
4 | 67.8% low |
atmosphere |
4 | 66.3% none |
planet_class |
13 | 51.1% frozen |
substrate |
3 | 51.1% ice |
geothermal_flux |
3 | 91.2% low |
name: null on ~89% of bodies is real (531 of 600 sampled), consistent with
"220 named" of 301 systems.
Method caveat, stated because the number was wrong once: the aggregator reads
scalar frontmatter only. atmosphere_color first read as "100% null", which was a
PARSER ARTEFACT — it is a YAML list, and the scalar regex matched only its key
line. Ferrath carries a real colour triple. Any list-valued field in that table
would be similarly wrong; the scalar rows are sound.
Two readings that looked like defects and are not
Both were flagged on first pass and both are deliberate. They are recorded because the mistake is the point: an agent lacking the roadmap reads a zero-variance field as a bug, and may "helpfully" populate or delete it.
chemosynthetic: falseon 100% of bodies is a NAMESPACE RESERVATION for dextro-DNA-style biochemistry, for when geology and nature spawn down to the 1×1 m pixel. It is not meant to vary yet.enabled: falseon ~65% is staged rollout, not dead content: the clean planet types are learned first, then generator scripts are added for the other types and the playable count rises.
What the economics tree is actually for
The economics TOMLs are not merely DB rows for a trade sim. When geology and
nature spawn to the 1×1 m pixel, the economics information generates world
content — production chains and specializations decide what is physically
there. That makes wiki/economics/ a seed for the same generator, one tier up
from the body definitions, and raises the stakes on its vocabularies.
The open question this leaves
A 68%-low-tectonics world is mostly flat BY THE SEED. This session spent its
full length making the Atlas render terrain legibly, and composition.rs already
says "where the terrain is flat, flat is the honest answer". So there is a
ceiling on what renderer work can deliver, and it is set here rather than in the
client. Whether that distribution is intended (most worlds ARE dull; the
interesting ones stand out) or an artefact of the authoring pass is a question
for the seed, not the renderer. Ticketed separately.
What this predicts
A session asked to change world content will, with no prompting otherwise:
- assume the wiki is hand-authored throughout, and hand-edit a generated page;
- not know
wiki_sync.pyexists, so not know the edit is reverted rather than wrong; - go looking for stations under
wiki/stations/; - miss the GTTR channel entirely when asked for location prose;
- and read whole files instead of filtering on
description, burning context the wiki was explicitly designed to save.
That is the same shape as this month's expensive bugs: the information existed, nothing pointed at it, and the failure was silent.