Skip to content

The region model

Nerthus.Core (until cutover). This page describes the frozen system that runs today and is deleted at cutover. Replaced by: not yet written.

A Region is a named, time-scoped grouping of locations: Południowa Elancja spans places that sit under different parents in the containment tree, and its borders can move without any directory moving. This page is the contributor model of the Region entity type and the temporal @region membership tag — where region blocks live, who may carry the tag, how membership resolves as of a date, and what regions deliberately are not. The containment tree, Mapa, and doors belong to the location model; the plain introduction is in Locations and maps.

Concepts

  • Region — the eighth entity type in the closed set. A ### <Name> block under the ## Region index section, carrying @typ: Region.
  • Membership — one temporal @region line on the member, naming the region: - @region: Południowa Elancja (2020-04:). A Region block never lists its members.
  • Member — a Lokacja, or a Region (nesting). No other type is a member.
  • As-of-date resolution — membership is always evaluated against a query date; member lists are computed output, never stored state.

The Region entity type

The importer mints no regions — there is no on-disk region source to walk. A Region comes to exist exactly two ways, the Przedmiot precedent (a type with no importer section):

  • hand-authoring a block into nerthus.entities.md, which the index header invites;
  • the APIPOST /regions forces @typ: Region and lands the block under ## Region.
## Region

### Południowa Elancja
- @typ: Region
- @status: Aktywny

The ## Region section is durable across re-import by construction: regeneration splices only the four machine sections (NPC, Grupa, Lokacja, Mapa). The @region lines on Lokacja blocks sit inside a machine section and survive regeneration as operator lines, because region is not a machine-owned tag key. A regression test pins both.

The membership tag

Membership is one line on the member:

### Racicowy Matecznik
- @typ: Lokacja
- @region: Południowa Elancja (2020-04:)
  • Arity: temporal scalar. One region per location at a time, last-active-wins as of the query date — the exact posture of @lokacja and @outerior. Overlap of the containment kind is expressed by nesting (below), not by tagging a place twice.
  • The (from:to) grammar is owned by the tag schema; an open end bound ((2020-04:)) means the membership holds from that month onward.
  • A border move is close-and-append. The update closes the active line's range and appends the new membership dated from the change month — both lines stay, so the record keeps where the place belonged before the border moved:
- @region: Południowa Elancja (2020-04:2026-06)
- @region: Elancja (2026-07:)
  • Values name the region exactly as its heading spells it, canonical diacritics included. A @region value that names no Region block — including one that matches only a same-named Lokacja — is a dangling reference: integrity reports it as an UnresolvedReference Warning, never silently ignores it.

Direction: the member points at the region

A Region block never lists its members. The site already states this doctrine for containment — one direction, the child's @lokacja; the parent-side @zawiera is retired from the closed schema. A region-side member list would be @zawiera reborn, with the same reciprocal-consistency bug class: two places to update, one of them forgotten. One direction means a membership change is a one-line temporal edit on the member, and member lists exist only as computed query output.

Nesting and who may carry @region

A Region may itself carry @region, so Południowa Elancja ⊂ Elancja is expressible:

### Południowa Elancja
- @typ: Region
- @region: Elancja
  • Membership is restricted to Lokacja and Region. @region on any other type draws a RegionMemberType validation Warning, not an Error — lore may legitimately lag, and an authoring mistake is worth surfacing without blocking a write.
  • A nesting cycle is an integrity Error (RegionCycle), exactly as a @lokacja containment loop is. The membership query still terminates on a cycled index.
  • Queries return direct members by default; the transitive closure over nested regions is opt-in (?recurse=true on GET /regions/{name}).

Namespace posture. Region names coexist with location names — the model merges blocks by name and type, so a Region Elancja beside a future Lokacja Elancja is legal. The two never bleed: @region values and region lookups resolve only against ## Region blocks, with an exact folded-name match and no fuzzy stage; region names never enter location resolution. A typo in a @region value is a miss, not a guess at a similarly-named Lokacja.

Resolution as of a date

Membership is always evaluated against a query date (?activeOn=, default: now): last-active-wins among covering ranges, the same evaluation every temporal scalar gets. A membership that changes over time is the designed case — asking "which region was Racicowy Matecznik in during 2019?" and "which is it in now?" are the same query with different dates. @region on a path-qualified heading (### Karczma (Torneg)) works unchanged, and member lists report qualified headings verbatim, so the output is unambiguous.

What regions are not

  • Not maps. A Mapa is a Margonem render, never a region member; regions group places (Lokacja) only.
  • Not the containment chain. @lokacja parenting and the computed @outerior world root express where a place physically sits. A region is orthogonal: it never participates in outerior resolution, door projection, or the location tree, and putting a place in a region moves nothing.
  • Not session placement. Nothing under Lokacje/ or the session scan roots reads regions.

A region is a read-side, named, time-scoped grouping — that is the whole contract. Południowa Elancja is the type specimen: world prose defines it as a region, player logs use it as a location-path prefix, and until this type existed it was an entity of no type at all.

Cmdlet surface

Find-NerthusRegion, Get-NerthusRegion, New-NerthusRegionEntity, Set-NerthusRegionEntity; the location filter is Find-NerthusLocation -Region. Routes, envelopes, and executed examples: API reference — Regions.

See also