12 KiB
D&D Scene Descriptions
Status: Implemented
The durable output contract is D&D Scene Description Artifact Contract.
Purpose
Add a focused D&D artifact that describes each accepted scene with a bounded classification, a concise title, and a concise summary. This is the explicit home for the small amount of source-bounded synthesis useful to downstream applications; scene chunking should not remain the long-term owner of those descriptive fields.
The feature follows ADR-0009. It is intentionally richer than a fact-only occurrence extractor, but every model-produced field has a specific scene-description purpose and is grounded by the exact accepted chunk range.
Desired End State
A D&D pipeline that uses accepted scene chunks can add a
dnd/scene-descriptions artifact lane. The extractor runs once per accepted
chunk and returns exactly one description for that chunk. The merged,
normalized artifact is an ordered list with one independently identified and
evidenced scene record for every successful chunk extraction.
Use these production identities:
| Concern | Identity |
|---|---|
| Extractor key | dnd/scene-descriptions |
| Normalizer key | dnd/scene-descriptions |
| Artifact kind | dnd/scene-description-list |
| Durable schema ID | notarius.dnd.scene_descriptions |
| Durable schema name | notarius_dnd_scene_descriptions_v1 |
| Durable schema version | v1 |
| Durable media type | application/json |
| Private prompt ID | dnd.scene_descriptions |
| Private response schema ID | notarius.dnd.scene_descriptions.llm |
| Private response schema version | v1 |
The lane uses the existing typed artifact, append-order merge, codec, registration, validator-chain, prompt-asset, retry, and output conventions. It does not introduce a new pipeline stage or a dependency on the durable chunk-map export.
Durable Artifact Contract
The durable payload is a strict object containing a scenes array. The array
is ordered by accepted source position. Each scene contains exactly:
id: the accepted chunk ID, copied deterministically;source_ref: the accepted chunk's exact inclusive current-source range;kind: one value from the closed scene-kind vocabulary;title: a concise source-grounded label for the scene; andsummary: a concise source-grounded account of the scene's main activity.
The accepted chunk ID is the scene ID. Do not add a second chunk_id field or
generate an unrelated scene identifier: this artifact has exactly one record
per accepted scene chunk, so the chunk identity is already the stable identity
needed for joining with chunk maps and other range-grounded artifacts.
Every fixed object rejects unknown fields. id and source_ref are
application-owned evidence and identity fields. The model must not emit or
reproduce chunk IDs, source IDs, unit IDs, or ranges.
The extractor maps one successful private response into a single-element
durable scenes array before extraction validation. It attaches the current
chunk ID and range at that boundary rather than relying on normalization to
manufacture required provenance.
Model-Owned Fields
The private model response contains exactly:
kind;title; andsummary.
It represents one scene object, not a list. An accepted chunk is already the scene boundary, so the extractor must neither split the chunk nor return multiple descriptions. It must not return an empty result; inability to classify or describe the chunk is an extraction failure subject to the configured retry and rejection policy.
title should be a short, distinguishing phrase rather than a sentence,
chapter number, or generic label such as “Scene.” It may use names and places
established by the transcript or optional campaign references, but must not
invent a proper noun to make the title more colorful.
summary should briefly state the main activity and material transition or
outcome established within the chunk. It must not add analysis, inferred
motives, hidden state, future consequences, relationship claims, or facts from
outside the chunk. Do not require a structured participant list, encounter
outcome, location, mood, or confidence field.
Scene-Kind Vocabulary
Use this closed vocabulary:
| Kind | Meaning |
|---|---|
combat |
Active combat materially organizes the scene, including initiative-like exchanges or sustained hostile action. Planning a fight or discussing a completed fight is not combat by itself. |
narrative |
Current-session in-world play that is not principally active combat, a prior-session recap, or sustained out-of-character session discussion. This includes exploration, travel, dialogue, investigation, planning in character, and aftermath. |
recap |
The scene's organizing purpose is to recount events from a previous session for the table. An in-world character recounting history during current play remains narrative. |
meta |
The scene's organizing purpose is sustained out-of-character discussion about the game or session rather than advancing current in-world play. |
narrative is the default category for actual current-session gameplay that
does not meet another definition. The model must choose exactly one kind and
must not emit an uncertainty or mixed category.
Residual Mixed-Scene Policy
Scene chunking should normally separate sustained transitions between kinds. When an accepted chunk nevertheless contains more than one kind, classify the activity that best describes the chunk's organizing purpose and main current-session progression:
- use
combatwhen active combat is a substantive central activity, even if the chunk includes brief setup, rules clarification, or immediate aftermath; - use
recapwhen recounting a previous session is the chunk's primary table purpose, not merely a brief reminder before current play; - use
metawhen sustained out-of-character session discussion is primary and the chunk contains no more than incidental in-world progression; and - use
narrativefor all remaining current-session in-world play.
Brief table talk, dice resolution, rules clarification, jokes, or administrative
comments are incidental to the enclosing gameplay scene and do not make it
meta. A short recollection used to orient current action does not make a scene
recap.
This precedence resolves residual ambiguity for description. It does not alter the accepted chunk boundary or authorize the extractor to conceal a demonstrably poor scene plan.
Evidence, References, And Prompt Boundary
The exact accepted chunk range is the evidence for all three model-owned fields. Do not ask the model for finer-grained source ranges, and do not use campaign references as evidence.
The lane requires no generated artifact reference. Existing optional D&D campaign references may be exposed through the established shared slots when they help disambiguate names or setting terms in titles and summaries. They must not introduce events, participants, or claims absent from the current chunk. Do not require an NPC registry: structured participants remain owned by NPC and NPC-interaction artifacts.
Follow the established D&D prompt ordering and prompt-cache boundary:
- shared D&D system and identity policy;
- stable campaign references, including explicit empty placeholders;
- lane task and classification instructions; and
- the variable current-chunk transcript last.
Factor wording genuinely shared with other D&D modules into existing shared prompt assets. Keep scene-kind definitions and mixed-scene policy in scene-description-owned assets rather than broadening unrelated extractors. Do not render the existing shared extraction-evidence asset in this lane: that asset instructs the model to emit source ranges, while scene identity and the entire accepted chunk range are attached deterministically by the application. This is a deliberate exception to the shared extraction prompt sequence, not permission to duplicate compatible shared wording in lane-owned assets.
Merge And Normalization
Use the existing append-order merge behavior. Normalization remains deterministic and must:
- validate every record against the current source document;
- require an exact closed-vocabulary kind without case-folding or repairing an invalid model value;
- trim surrounding title and summary whitespace without otherwise rewriting their prose;
- order scenes by source-document position, with accepted chunk ID as the deterministic tie-breaker;
- remove only completely identical duplicate records; and
- reject conflicting records that reuse one scene ID or exact source range with different model-owned content.
Normalization must not combine adjacent scenes, regenerate titles or summaries, change classifications through heuristics, or infer missing records. Exact deduplication is defensive cleanup, not semantic reconciliation.
Validation And Quality
Provide the same layered production validation used by other typed D&D artifacts:
- valid JSON and strict private/durable shape;
- exactly one private description and one mapped durable scene per chunk;
- closed kind vocabulary;
- non-empty, trimmed title and summary;
- non-empty accepted chunk ID;
- a current-source range exactly equal to the extraction chunk range;
- source-relatedness checks for title and summary; and
- strict durable JSON Schema validation after normalization.
Shape, identity, enum, and source-range violations are deterministic rejections. Source-relatedness should initially remain warning-only unless evaluation establishes a reliable rejection rule. Diagnostics must be bounded and must not copy transcript or campaign-reference content.
Evaluate the lane on a small human-reviewed transcript set covering all four kinds, incidental table talk, brief and sustained recap, combat setup and aftermath, mixed residual chunks, sparse scenes, proper-noun ambiguity, and unsupported synthesis. Review classification agreement, title usefulness, summary fidelity, evidence attachment, and performance on the cost-effective models Notarius is intended to support. Human evaluation is a development aid, not an exact-text CI oracle.
Tests should protect structural contracts, deterministic mapping, normalization, validation, prompt assembly, registration, and one assembled production workflow. Do not assert exact generated prose or use brittle prompt length and shared-prefix change detectors.
Relationship To Scene Chunking
This artifact becomes the intended owner of scene kind, title, and summary.
The existing dnd/scenes chunker remains unchanged in this scope. Downstream
consumers should prefer the normalized scene-description artifact over chunk
annotations for kind, title, and summary.
Removing descriptive fields from the chunker is a separate follow-on scope. It requires its own review of chunker prompt quality, warning/validator consumers, cache behavior, and the compatibility implications of changing accepted plan annotations. Do not couple that migration to the initial artifact lane.
Likewise, do not make combat extraction conditional on scene kind in this scope. A later ordered-pipeline feature may consume the accepted normalized scene-description artifact and no-op combat extraction for non-combat scenes without making generic chunk materialization depend on D&D classification.
Documentation Ownership
Once implemented, the durable contract belongs in docs/integrations/;
selectable keys, optional campaign-reference bindings, and default validator
chains belong in configuration documentation; and prompt, module, validator,
and pipeline mechanics belong in current internal documentation. A maintained
D&D example should demonstrate scene chunking and scene-description extraction
without presenting chunk annotations as the durable description contract.
Non-Goals
This scope does not:
- change scene boundaries or run a second chunker;
- ask the model for IDs, source ranges, segment numbers, or evidence selection;
- add structured participants, locations, encounters, outcomes, moods, confidence, or relationship fields;
- duplicate NPC or NPC-interaction extraction;
- require an NPC registry or another generated artifact;
- enrich descriptions from campaign references when the chunk lacks support;
- semantically merge or reconcile adjacent scene descriptions;
- minimize the existing scene chunker in the same change;
- gate combat extraction by scene kind;
- make scene descriptions generated references for later steps;
- change chunk-map export, chunk caching, or plan validation; or
- introduce a DAG, a new pipeline stage, or a new reference mechanism.