diff --git a/docs/workshops/system-economic-specialization/heritage-taxonomy-draft.md b/docs/workshops/system-economic-specialization/heritage-taxonomy-draft.md new file mode 100644 index 000000000..3cc247c6e --- /dev/null +++ b/docs/workshops/system-economic-specialization/heritage-taxonomy-draft.md @@ -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`).