Session metadata¶
Exact syntax reference for the session header and every structured metadata key a session block may carry. For what the daemon does with this data — distribution, integrity hashing, the participation graph — see the session model.
Session header¶
### 2026-07-01, Eraster rozmawia z Tussalem, Anward
└── date ──┘└ title (may contain commas)┘└ narrator ┘
The header is the universal key: dedup, content hashing, participation, and distribution all key on it. Comparison is case-insensitive. The header is canonical and immutable — the tool never rewrites it.
| Field | Rule |
|---|---|
| Date | The first 10 characters, YYYY-MM-DD; multi-day suffixes below |
| Title | Everything between the date and the last comma — inner commas are preserved |
| Narrator | The text after the last comma, trimmed — kept as the raw header string |
Parsing notes:
- Any
###heading starting with aYYYY-MM-DD-shaped prefix is treated as a session header — even one with a malformed day part (2026-07-001). That tolerance enables the@Datarescue below. - A missing comma right after the date is tolerated.
- The narrator is never resolved to an entity — it stays a raw string. A
co-narrated session lists both names in the one field;
Radadenotes a Council session.
Multi-day suffixes¶
| Form | Example | Start | End |
|---|---|---|---|
Same-month /DD |
2022-12-21/22 |
2022-12-21 |
2022-12-22 |
Cross-month /MM-DD |
2023-01-31/02-01 |
2023-01-31 |
2023-02-01 |
The end date is composed textually from the start's year (and month, for /DD)
plus the suffix; it is never range-checked against the start.
Recognition rules¶
- Session-bearing roots — the daemon scans
*.mdunder exactly four directories:Wątki/,Organizacje/,Postaci/,Świat gry/. A session block anywhere else is invisible. - Bare and
@forms are one format — the@prefix is the canonical spelling.- PU:parses identically to- @PU:. When the tool authors or edits metadata it writes the@-tag form; it never rewrites a hand-authored file to change its shape. -
Directive recognition is prefix-based. These stems map a label to a structured tag:
Stem Tag narrator-@Narratordata-@Datalokacj-/lokalizacj-@Lokacjelog-@Logiexact PU@PUtransfer-@Transferintel-@Inteluczestnic-@UczestnicyA custom label sharing a stem (
- Logistyka:→@Logi) is read as structured — pick narrative labels off those stems. Parsing never alters the file text. -
Rendering is fixed —
@Datais inline; every other tag's items are 4-space nested children on a single flat level (a nested interior is written as its fullParent/Interiorpath on one line). Empty tags are omitted. The authored tag order is the order of the key table below; the tool-managed@Plikisection is always rewritten at the end of the block. - Casing convention — session tags are capitalized, usually plural
(
@Lokacje,@Pliki,@PU); entity-index tags are lowercase singular (@lokacja,@plik). They are different tags in different files — see the tag schema.
Metadata keys¶
| Tag | Shape | Meaning |
|---|---|---|
@Narrator |
nested name(s) | Narrator override in metadata; the header stays untouched |
@Data |
inline YYYY-MM-DD |
Date override — rescues a malformed header date |
@Tytuł |
inline text | Title override — rescues a misspelled header title (@Tytul is accepted too) |
@Lokacje |
nested locations | Where it happened, as Parent/Interior paths |
@Logi |
nested URLs | Game-log links, fetched into the nerthus.logs/ archive |
@PU |
Postać: 0,3 |
Per-character PU grants — drive the monthly PU batch |
@Transfer |
[amount] denom, src -> dst |
Currency/item movements |
@Intel |
target: message |
Directed notifications, delivered via Discord when the session is closed |
@Uczestnicy |
nested names | Explicit participant roster without a PU grant |
@Pliki: (auto) |
nested paths | Distribution bookkeeping — machine-authored, overwritten on the next distribution |
@Narrator¶
Replaces the header-parsed narrator string in parsed metadata. The header itself — the key — is never rewritten.
@Data¶
Inline date override. Validation is shape-only (\d{4}-\d{2}-\d{2}): a value that
fails the shape is ignored, but a calendar-impossible value that fits it
(2024-13-40) still overrides the date — integrity later flags it as
MalformedDate.
### 2026-07-001, Eraster rozmawia z Tussalem, Anward ← broken header date
- @Data: 2026-07-01 ← override fixes the parsed date; header key stays
@Tytuł¶
Inline title override. Any non-empty value wins; there is no shape to validate. The
ASCII spelling @Tytul is accepted alongside the canonical one — a header broken badly
enough to need the override may have lost its diacritics too.
### 2026-07-01, Eraster rowzmaria z Thuzalem, Anward ← misspelled header title
- @Tytuł: Eraster rozmawia z Tussalem ← override fixes the parsed title; header key stays
@Lokacje¶
Nested location references as Parent/Interior paths. Also accepts -> movement
routes and legacy - separators; both normalize into / path segments and feed
the map traversal graph (location model).
@Logi¶
Nested game-log links. The parser extracts http(s):// and file:// URLs into
metadata — file:// is admitted for local transcripts; a bare local path with no
scheme stays in the source but never reaches the parsed record. The log-fetch step
archives each URL under nerthus.logs/ (log model).
Note
@Logi names game transcripts; @Intel triggers Discord delivery. They are
entirely different systems and never overlap.
@PU¶
One Postać: value line per character. The Polish comma-decimal is accepted
(0,2 → 0.2). These grants drive the monthly PU batch
(PU model).
@Transfer¶
[amount] denomination, source -> target — coin, stackable item, or unique item.
Endpoints are in-game entities only, never a Narrator. Syntax and application
rules are owned by the currency model.
@Intel¶
target: message lines — directed notifications delivered via Discord webhooks
(log model).
- @Intel:
- Thuzal: Mieszkańcy Thuzal widzieli, że Eraster odwiedził Lorda Tussal po południu w jego rezydencji.
@Uczestnicy¶
Explicit participant names — attendance without a PU grant. @PU and
@Uczestnicy are unioned for distribution; the names resolve through the
name resolver with fuzzy matching disabled.
@Pliki¶
The resolved distribution target set, recorded by the tool. It is not parsed as structured metadata — the live file set is discovered by scanning — and hand edits to it are overwritten wholesale on the next distribution.
It carries the (auto) marker on its section line, the same authorship marker entity
tags use (tag schema): the tool wrote this section and owns it. The
section has no value of its own, so the marker sits where a value would.
The section-matching regex is not end-anchored, so an unmarked @Pliki written before
the marker existed still matches and is replaced in place on the next distribution.
Custom narrative tags¶
Any other - <Etykieta>: block — - Efekty: (session outcomes),
- Objaśnienia: (clarifications) — is preserved verbatim and carries no
structured weight: it moves no PU, no currency, and no participation. Zmiany is
not a structured directive; entity mutations are entity writes, never session
directives.
- PU:
- Eraster: 0,2
- Efekty: ← custom narrative tag (preserved, not parsed)
- Eraster wręczył Tussalowi łapówkę w postaci dziesięciu koron.
- Zjednał sobie przychylność Lorda Tussal.
Legacy generations (read-only)¶
The pre-tool repository holds three older shapes. The daemon auto-detects and
reads all of them as-is; the parser reports which shape a body used
(Gen1/Gen2/Gen3/Aktualny). No corpus-wide normalization pass exists.
| Shape | Era | Locations | Logs | Metadata |
|---|---|---|---|---|
| Gen1 | –2022 | none | Logi: <url> plain line |
none |
| Gen2 | 2022–2023 | *Lokalizacja: A, B* italic |
Logi: <url> plain line |
none |
| Gen3 | 2024–2025 | - Lokalizacje: list |
- Logi: list |
- PU:, - Efekty: (no @) |
| Aktualny | 2026+ | - @Lokacje: |
- @Logi: |
full @-tag set (the authored form) |
An example block (in Wątki/Intrygi w Thuzal.md) showing the Gen3 shape:
### 2025-01-26, Eraster spotyka się z Tussalem w Thuzal i wraz z nim planuje dalsze działania, Anward
*Lokalizacje: Thuzal, Thuzal/Rezydencja Tussal*
… prose …
- Logi: https://nerthus.pl/logizsesjierasteraztussalem
- Efekty:
- Eraster otrzymał zaproszenie do rezydencji Lorda Tussal …
- PU:
- Eraster: 0.2
See also¶
- Session model — distribution, integrity tiers, the participation graph
- Tag schema — the entity-index tags (
@lokacja,@plik) - API — the session routes, cmdlet mapping, envelopes