Rada data tables¶
Nerthus.Core (until cutover). This page describes the frozen system that runs today and is deleted at cutover. Replaced by: not yet written.
Three committed JSON tables under .nerthus/data-tables/ at the repo root hold the lore data a Radny edits directly in a text editor: the denomination ladder (currency.json), the role capability bundles (roles.json), and the reputation town list (towns.json). This page is the lookup for their file locations, seeded contents, and shared lifecycle rules; what each table means is owned by its domain page and linked from each section.
Shared lifecycle rules¶
| Rule | Detail |
|---|---|
| Location | .nerthus/data-tables/ — committed, Rada-owned |
| Read on use | The daemon reads each table on every use; an edit takes effect on the next request, no restart |
| Seed only when absent | The boot scaffold seeds a table only when its file is missing, so Rada edits survive every boot and re-init |
| Fallback | A missing or malformed table falls back silently to the baked-in defaults — the exact constants the seed wrote, never a second copy to reconcile |
The public schema route serves the effective table contents — denominations, towns, and role names — but neither the PU constants nor the full capability bundles (route in API). The Rada's tunable PU constants are not a data table: they live in the pu block of config.json (see Configuration).
currency.json — denomination table¶
The denomination ladder; the lowest tier is the base unit (multiplier 1). Base-unit arithmetic in Kogi, holdings, and transfers are owned by the currency model.
Canonical (@generyczne_nazwy) |
Short | Tier | Kogi multiplier | Stem |
|---|---|---|---|---|
| Korony Elanckie | Korony | Gold (złoto) | 10000 | kor |
| Talary Hirońskie | Talary | Silver (srebro) | 100 | tal |
| Kogi Skeltvorskie | Kogi | Copper (miedź) | 1 | kog |
Seeded shape:
{
"denominations": [
{ "name": "Korony Elanckie", "short": "Korony", "tier": "Gold", "multiplier": 10000, "stem": "kor" },
{ "name": "Talary Hirońskie", "short": "Talary", "tier": "Silver", "multiplier": 100, "stem": "tal" },
{ "name": "Kogi Skeltvorskie", "short": "Kogi", "tier": "Copper", "multiplier": 1, "stem": "kog" }
]
}
- Exchange: 100 Kogi = 1 Talar, 100 Talarów = 1 Korona (10 000 Kogi = 1 Korona).
- The canonical diacritical name (
Hirońskie,Skeltvorskie) is the identity; matching rules (short names, stems, declined forms) are in the currency model. - Adding a denomination is a row edit — a new row reshapes all Kogi arithmetic automatically. A row without a
stemsilently misses declined mentions.
roles.json — roles & capability bundles¶
One row per role, carrying its bundle-key role, the collective aliases a @rola may spell it as, and its capabilities. The seed writes nine rows, one per baked bundle key, in sorted order: bot, gracz, it, koordynator, mc, namiestnik, narrator, radny, smc. The committed file is authoritative when present, so a Radny adds a role, rebinds its capabilities, or gives it a new label with a reviewable commit — never a code change. For the capability bundles the file is the source of truth: when it names roles, the in-code bundles go unread. For the authored-label set it is an additive overlay — the file's role and aliases join the baked labels, so a Radny adds or rebinds a label but cannot retire a baked collective. Capability ids and full/own/none grading are in Capabilities; the label⇄bundle mapping is the contributor store reference's; tokens and the ACL model in Permissions.
Seeded shape (excerpt):
{
"roles": [
{ "role": "bot", "aliases": ["boty"], "capabilities": ["entity.read", "discord.send", "apikey.manage.own", "..."] },
{ "role": "koordynator", "aliases": [], "capabilities": ["admin.all"] },
{ "role": "narrator", "aliases": ["narratorzy"], "capabilities": ["session.write", "pu.award", "..."] },
{ "role": "radny", "aliases": ["rada"], "capabilities": ["governance.write", "..."] }
]
}
aliases is the collective label a @rola line speaks (@rola: narratorzy → the
narrator bundle); role self-aliases too, so @rola: narrator resolves the same. Three
seeded roles carry a collective: narratorzy → narrator, rada → radny, boty →
bot. The other four (gracz, koordynator, namiestnik, it) ship an empty aliases.
To add a role, append a row with all three fields; the label it introduces is recognized on
the next model rebuild.
The seeded bundle per role, and how bundles combine into a Person's effective set, are in Capabilities. A caps edit is recomputed on every request, so it takes effect on live tokens immediately; a label edit (adding a role or an alias) is picked up on the next model rebuild — roles.json is fingerprinted, so a committed edit self-heals with no restart.
towns.json — town / reputation list¶
The reputation-bearing settlements a character's sheet tracks (Pozytywna / Neutralna / Negatywna — see the player model). Seeded list:
Tuzmer, Ithan, Mythar, Mirvenis-Adur, Thuzal, Nithal, Werbin, KH, Torneg, Eder, Karka-han
Adding a settlement is a row edit, picked up on the next request.
Not a table: entity types¶
The eight-type set (NPC, Grupa, Lokacja, Mapa, Gracz, Postać, Przedmiot, Region) is a closed design contract whose one authority is the baked in-code list — new-entity validation and the integrity report both check against it. The set is structural, not Rada data: currency assumes Przedmiot, auth own-scoping assumes Gracz/Postać, and the importer's index sections assume the rest. A former data-tables/entity-types.json is retired — the boot scaffold no longer writes it and nothing reads it. The type contract is owned by the entity model.