Skip to content

Council data tables

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, Council-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 Council 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 Council'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 stem silently misses declined mentions.

roles.json — roles & capability bundles

One row per role (gracz, koordynator, namiestnik, narrator, radny), each an array of capability strings. The committed file is authoritative when present, so a Radny rebinds a role's capabilities with a reviewable commit. Capability ids and full/own/none grading are in Capabilities; tokens and the ACL model in Permissions.

Seeded shape (excerpt):

{
  "roles": [
    { "role": "koordynator", "capabilities": ["admin.all"] },
    { "role": "namiestnik",  "capabilities": ["admin.all"] }
  ]
}

The seeded bundle per role, and how bundles combine into a Person's effective set, are in Capabilities. Capabilities are recomputed on every request, so a roles.json edit takes effect on live tokens immediately.

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 seven-type set (NPC, Grupa, Lokacja, Mapa, Gracz, Postać, Przedmiot) 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 Council 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.