Skip to content

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 a YYYY-MM-DD-shaped prefix is treated as a session header — even one with a malformed day part (2026-07-001). That tolerance enables the @Data rescue 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; Rada denotes 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 *.md under 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- @Narrator
    data- @Data
    lokacj- / lokalizacj- @Lokacje
    log- @Logi
    exact PU @PU
    transfer- @Transfer
    intel- @Intel
    uczestnic- @Uczestnicy

    A 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@Data is inline; every other tag's items are 4-space nested children on a single flat level (a nested interior is written as its full Parent/Interior path on one line). Empty tags are omitted. The authored tag order is the order of the key table below; the tool-managed @Pliki section 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.

- @Narrator:
    - Anward

@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).

- @Lokacje:
    - Thuzal
    - Thuzal/Rezydencja Tussal
    - Thuzal -> Rezydencja Tussal -> Ogród Tussala

@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).

- @Logi:
    - https://nerthus.pl/logizsesjierasteraztussalem

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,20.2). These grants drive the monthly PU batch (PU model).

- @PU:
    - Eraster: 0,2
    - Lord Tussal: 0,2

@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.

- @Transfer:
    - 10 Korony, Eraster -> Lord Tussal
    - 2 Dzbanek herbaty, Lord Tussal -> Eraster

@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.

- @Uczestnicy:
    - Opat Perrin

@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.

- @Pliki: (auto)
    - Postaci/Gracze/Eraster.md
    - Wątki/Intrygi w Thuzal.md

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