docs(workshops): canonical D-237 heritage taxonomy (47 values, approved)

Reconciles the ~30 inconsistent heritage proposals from the 6-sector #1016
content pass into one canonical cultural_specialization heritage vocabulary
(47 values). Key reconciliations: norse_compact->nordic (un-fuses people from
faction), spanish_iberian+spanish_hispanic->spanish, brazilian_portuguese+
lusophone_frontier->brazilian, italian_northern->italian, afrikaans_cape->
afrikaans, french_provencal+french_canadian->french. No compound values; one
token per system (blends take dominant heritage or the cosmopolitan activity
value).

Maintainer decisions (2026-06-01): keep ALL values distinct (no lumping —
welsh/afro_brazilian/cape_malay/xhosa/luxembourgish/konkan all retained);
keep empty-but-complete slots (yoruba/hausa/hungarian/persian/turkic). Fills
the Middle-East gap the pass exposed: arab/persian/turkic added even at near-
zero current usage so the canon is complete.

Logs the southern-African overrepresentation (~25/300, afrikaans=15) as a DLC
content-rewrite rebalancing task (#1019) rather than lumping the taxonomy.

Migration note included: 4 already-shipped hero cultural values use old suffix
forms (afrikaans_cape, french_provencal, italian_northern, norse_compact) and
will be renamed in the culture-write pass when _CULTURAL_HERITAGE is replaced.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-06-01 16:49:00 +02:00
co-authored by Claude Opus 4.8
parent 8addf04835
commit 01ba14ada9
@@ -0,0 +1,199 @@
# Canonical Heritage Taxonomy — APPROVED 2026-06-01
*D-237 `cultural_specialization` heritage-type values. Drafted from the 6-sector
#1016 content pass (which read heritage off the authored system names) +
reconciliation of ~30 inconsistent agent proposals + gap-fill. Maintainer
decisions applied 2026-06-01: keep all values distinct (no lumping), keep
empty-but-complete slots. Final set: **47 heritage values** (token list at bottom).*
## ⚠ Heritage balance note (DLC follow-up)
The southern-African heritages are **overrepresented**: ~25 of ~300 named systems
(~8%) read southern-African, with `afrikaans` alone on **15 systems** — more than
french + italian + russian + arab *combined*. `arab` sits at 2, `persian`/`turkic`
at 0. This is an artifact of the original name-balancing overcorrecting in one
direction. The fix (rewrite a subset of afrikaans/zulu systems into arab/persian/
turkic heritage) is a **full index.md + gttr.md content rewrite per system**, not a
TOML value flip — so it is **out of scope for #1016** and logged as a DLC/content
rebalancing task. The taxonomy below keeps every value distinct so the rebalance
has targets to write *into* when it happens.
## What this is
`cultural_specialization` is ONE field carrying EITHER an **activity** value OR a
**heritage** value (heritage wins when both apply). This document fixes the
**heritage** half. The activity half is unchanged (see bottom).
Heritage is pinned only when a system's founding culture **diverges from its
corridor baseline** (D-167) or is a distinct cross-corridor founder. Corridor-
typical systems stay NULL → D-232 corridor default. This is a menu of *available*
values, not a quota.
## Design rules (why the agent proposals were reconciled, not adopted as-is)
1. **One granularity:** real-world people/nationality level, `lowercase_snake`.
2. **Heritage ≠ activity ≠ faction.** `norse_compact` illegally fused a people
(Nordic) with a faction (Compact) → split to `nordic`. `*_frontier` /
`*_cooperative` smuggled an activity register → dropped.
3. **Collapse synonyms:** `spanish_iberian`+`spanish_hispanic``spanish`;
`brazilian_portuguese`+`lusophone_frontier``brazilian`;
`italian_northern``italian`; `afrikaans_cape``afrikaans`;
`french_provencal`+`french_canadian``french`; `polish_czech``polish`+`czech`;
`akan_ghanaian``akan`; `anglo_australian`+`english_cooperative``anglo`.
4. **No compound values.** `japanese_vietnamese`, `english_french` rejected — a
blended system takes its **dominant** heritage, or the `cosmopolitan` activity
value if genuinely fused. One token per system.
5. **Fill gaps from the map, not just from current hits.** Arab/Persian/Turkic
added even though few systems use them now (accepted 300-system reality;
DLC-flagged). The taxonomy is the canon; names can grow into it.
---
## Canonical heritage values (38)
Grouped by macro-region. "Absorbs" = agent proposals folded in. "Corridor" =
where it's *baseline* (so usually NULL there) vs *divergent* (pin-worthy).
### British Isles & Anglo-diaspora
| value | scope | corridor | absorbs | example |
|---|---|---|---|---|
| `anglo` | English / Australian / Canadian-anglo / NZ-pākehā Commonwealth-anglo | **baseline: north_reach** | english, anglo_australian, english_cooperative | Thornfield, Clearwater (cross-corridor in east) |
| `scottish` | Scottish / Highland | divergent | scottish | Calloway Reach, Braemar |
| `irish` | Irish | divergent | irish | Brennan's Drift |
| `welsh` | Welsh | divergent | — | Pemberton *(LUMP? → anglo)* |
### Iberian, Latin & Lusophone
| value | scope | corridor | absorbs | example |
|---|---|---|---|---|
| `portuguese` | Iberian Portuguese | **baseline: south_reach** | portuguese_iberian | Espinho, Ribeiro's Star |
| `brazilian` | Brazilian Portuguese (sertão/várzea register) | divergent (south) | brazilian_portuguese, lusophone_frontier | Sertão, Várzea, Retiro |
| `afro_brazilian` | quilombo / Afro-Brazilian maroon heritage | divergent | afro_brazilian | Quilombo *(LUMP? → brazilian)* |
| `cape_verdean` | Cabo Verde (morna) | divergent | cape_verdean | Velha Guarda |
| `angolan` | Angolan-Portuguese | divergent | angolan_portuguese | Moçâmedes |
| `sao_tomean` | São Toméan (roça) | divergent | são_toméan | Roça Nova |
| `spanish` | Iberian Spanish + Latin-American Hispanic | divergent (south) | spanish_iberian, spanish_hispanic | Puerto Último, Morales' End, Fragua |
| `canarian` | Canary Islands maritime (cofradía) | divergent | canarian | Aguas Bravas, Punta del Sol |
| `italian` | Italian | divergent | italian_northern | Nova Roma |
| `french` | French (incl. Québécois) | divergent | french_provencal, french_canadian | Confluent, Bout du Chemin, Dernier Quai |
### Northern / Central / Eastern European
| value | scope | corridor | absorbs | example |
|---|---|---|---|---|
| `german` | German / Austrian | **baseline: west_reach** | german_frontier | Altgrund, Tiefenbach (deep-frontier divergent) |
| `dutch` | Dutch / Flemish | baseline-adjacent (west) | dutch_frontier | Schuilhoek, Bestevaer |
| `nordic` | Norwegian / Swedish / Danish | baseline-adjacent (west) | norse_compact | Havnfjord, Holmgren's Passage |
| `finnish` | Finnish | divergent | finnish | Uusi Vantaa, Koskinen's Reach |
| `polish` | Polish | divergent | polish, polish_czech | Nowa Huta, Kraków Junction |
| `czech` | Czech | divergent | czech, polish_czech | Nová Tržnice |
| `russian` | Russian successor states | secondary (west) | russian | Novaya Zarya |
| `luxembourgish` | Luxembourgish | divergent | luxembourgish | Echternach *(LUMP? → german)* |
| `hungarian` | Hungarian | divergent | — | Kovács Loop *(or NULL)* |
### Sub-Saharan African
| value | scope | corridor | absorbs | example |
|---|---|---|---|---|
| `afrikaans` | Afrikaner / Cape | divergent (north/south) | afrikaans_cape | Eerste Wacht, Oude Kraal |
| `cape_malay` | Cape Malay | divergent | (part of southern_african_mixed) | Kaapse Baai, Koeberg *(LUMP? → afrikaans)* |
| `zulu` | Zulu | divergent | zulu | Nkosi's Bridge, Isibaya, Mavela |
| `xhosa` | Xhosa | divergent | (part of southern_african_mixed) | Pedra Seca *(LUMP? → zulu/afrikaans)* |
| `herero` | Herero / Namibian | divergent | herero | Okahandja |
| `shona` | Shona / Ndebele (Zimbabwean) | divergent | shona_ndebele | Dzimbahwe |
| `swahili` | East African coastal (Mozambican/Kenyan) | **secondary: south_reach** | swahili | Inhambane, Mwangaza |
| `igbo` | Igbo (Nigerian) | divergent | igbo | Enugu, Okoro's Claim |
| `yoruba` | Yoruba (Nigerian) | divergent | yoruba | *(seed; no firm hit yet)* |
| `hausa` | Hausa (Sahelian) | divergent | hausa | *(seed; no firm hit yet)* |
| `akan` | Akan / Asante (Ghanaian) | divergent | akan_ghanaian | Kumasi |
### South Asian
| value | scope | corridor | absorbs | example |
|---|---|---|---|---|
| `indian` | pan-Indian multi-tradition | divergent | indian | Chandra Deep |
| `bengali` | Bengali | divergent | bengali | Purnima |
| `punjabi` | Punjabi | divergent | punjabi | Singh's Landing |
| `konkan` | Konkan / Marathi coast | divergent | konkan | Ratnagiri *(LUMP? → indian)* |
### East & Southeast Asian
| value | scope | corridor | absorbs | example |
|---|---|---|---|---|
| `chinese` | Han Chinese | **baseline: east_reach** | chinese | Suzhou, Haodu, Songjiang |
| `korean` | Korean | **baseline: east_reach** | korean | Changwon, Miryang |
| `japanese` | Japanese | **baseline: east_reach** | japanese | Oshima, Kurashiki |
| `vietnamese` | Vietnamese | divergent (east) | vietnamese | Dài Lộ, Hạ Long, Xa Vời |
| `tagalog` | Filipino / Tagalog | divergent (east) | tagalog | Dagat, Mabuhay, Marunong |
### Pacific
| value | scope | corridor | absorbs | example |
|---|---|---|---|---|
| `maori` | Māori / Polynesian voyager | divergent | maori | Rekohu, Ngata's Star, Kelburn Crossing |
### Middle East / North Africa / Central Asia — THE GAP
| value | scope | corridor | absorbs | example |
|---|---|---|---|---|
| `arab` | Arabic (Levantine / Gulf / Maghreb) | divergent | — | Dalim, Errai (Ghadames) |
| `persian` | Iranian / Persian | divergent | — | *(none yet — DLC)* |
| `turkic` | Turkish / Central Asian Turkic | divergent | — | *(none yet — DLC)* |
> **Naming-gap note:** Only ~4 of 300 systems currently read Middle-Eastern, and
> Persian/Turkic have zero. Accepted as a 300-system limitation per the maintainer;
> logged for possible **DLC** rebalancing (rename/add systems). The values exist so
> future content can use them without another taxonomy change.
---
## Activity values (UNCHANGED — for reference)
`scholarly | artistic | institutional | commercial | agrarian |
industrial_heritage | medical_elite | ecological | military |
financial_technocratic | cosmopolitan | compact_cooperative`
(Heritage wins when both an activity and a heritage apply.)
---
## Migration impact (must do before the culture write)
The 27 hero systems already shipped `cultural_specialization` values that use the
OLD suffix forms. Renames touch these and require a TOML edit + regen:
| old (shipped) | new (canonical) | hero systems affected |
|---|---|---|
| `afrikaans_cape` | `afrikaans` | Vuurkloof |
| `french_provencal` | `french` | Confluent/VGV |
| `italian_northern` | `italian` | Nova Roma |
| `norse_compact` | `nordic` | Nyrheim |
`scottish`, `chinese`, `tagalog`, `vietnamese`, `zulu` and all activity values are
already canonical — no change. The CI constant `_CULTURAL_HERITAGE` in
`import_economics.py` gets replaced with this 38-value set.
---
## Maintainer decisions (resolved 2026-06-01)
1. **welsh** → KEEP distinct.
2. **afro_brazilian** → KEEP distinct.
3. **cape_malay / xhosa** → KEEP distinct (southern Africa stays fine-grained;
overrepresentation is addressed by the DLC rebalance above, not by lumping).
4. **luxembourgish** → KEEP distinct.
5. **konkan** → KEEP distinct.
6. **hungarian, yoruba, hausa, persian, turkic** → KEEP as available-but-unused
slots (canon should be complete; CI accepts them).
**Result: all 38 values retained, nothing folded.** Everything else is mechanical
reconciliation, not a judgment call.
## Final value list (38) — the CI `_CULTURAL_HERITAGE` set
```
anglo scottish irish welsh
portuguese brazilian afro_brazilian cape_verdean angolan sao_tomean
spanish canarian italian french
german dutch nordic finnish polish czech russian luxembourgish hungarian
afrikaans cape_malay zulu xhosa herero shona swahili igbo yoruba hausa akan
indian bengali punjabi konkan
chinese korean japanese vietnamese tagalog
maori
arab persian turkic
```
**47 values, no duplicates** — this token list is authoritative (it replaces
`_CULTURAL_HERITAGE` in `import_economics.py`).