You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: SPECIFICATION.md
+17Lines changed: 17 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -93,6 +93,22 @@ For open-source adopters, this creates a shared on-ramp: communities can exchang
93
93
```
94
94
95
95
96
+
## Story Settings
97
+
98
+
NCP supports optional reusable story-level Settings for places or environments that recur across Moments. `story.settings[]` defines the shared setting once, while each Moment keeps its own free-text `setting` and may optionally reference the shared entry with `setting_id`.
99
+
100
+
This avoids repeating the same place details across multiple Moments without making every producer model setting identity. Producers that only need free-text Moment settings can omit `story.settings[]` and `setting_id`.
101
+
102
+
```json
103
+
"settings": [
104
+
{
105
+
"id": "setting_precinct_archive",
106
+
"name": "Precinct Archive",
107
+
"description": "A dimly lit archive room where old case files preserve institutional memory."
108
+
}
109
+
]
110
+
```
111
+
96
112
## Narrative: Structuring Subtext & Storytelling
97
113
98
114
A single story may contain one or more narratives (e.g., _The Empire Strikes Back_ has the Luke/Yoda Storyform and the Han/Leia Storyform, _Barbie_ has the Barbie/Ken Storyform and the Barbie/Gloria Storyform). Most stories, however, exhibit a single central narrative (e.g., _Anora_, _Anatomy of a Fall_, etc.).
@@ -414,6 +430,7 @@ Organizational narrative units—such as Acts, Scenes, Sequences, Chapters, and
414
430
"summary": "Infiltrating the neon-lit heart of a dystopian metropolis, Alex plunges into a shadowy realm teeming with digital outlaws.",
415
431
"synopsis": "Freshly arrived in the neon chaos of Neo-Tokyo, Alex is swiftly ensnared in a perilous game played by cyber-criminals, underground syndicates, and relentless AI-driven enforcers.",
416
432
"setting": "The pulsating streets of Neo-Tokyo, where holographic ads blend with the shadowy back alleys controlled by syndicate bosses.",
433
+
"setting_id": "setting_neo_tokyo_streets",
417
434
"timing": "Late night, just hours after Alex's first unsettling discovery upon arriving in the city.",
418
435
"imperatives": "- Establish the dark, chaotic atmosphere of Neo-Tokyo\n- Introduce key threats: cyber-criminals and AI enforcers\n- Show Alex's initial vulnerabilities and resourcefulness",
Copy file name to clipboardExpand all lines: docs/narrative-context-protocol-schema.md
+19-1Lines changed: 19 additions & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -104,6 +104,22 @@ Quick heuristic:
104
104
- If it is an event chain or conflict progression, put it in `plot`.
105
105
- If it is a framing/experience contract with the audience, put it in `genre`.
106
106
107
+
## Story Settings
108
+
109
+
`story.settings[]` is an optional story-level glossary for reusable places or environments. Each setting requires an `id` and `name`, with an optional `description`. Moments may keep their local free-text `setting` prose while also pointing at a shared setting with `setting_id`.
110
+
111
+
Use this when multiple Moments occur in the same place and producers want a stable reference instead of repeating or string-matching setting descriptions.
112
+
113
+
```json
114
+
"settings": [
115
+
{
116
+
"id": "setting_precinct_archive",
117
+
"name": "Precinct Archive",
118
+
"description": "A dimly lit archive room where old case files preserve institutional memory."
119
+
}
120
+
]
121
+
```
122
+
107
123
## Narrative Layers
108
124
109
125
Each item in `story.narratives[]` is a Dramatica storyform: a single, complete argument structure within the story, expressed through `subtext` and `storytelling` layers.
`setting` remains the Moment-specific free-text description. `setting_id` may reference a `story.settings[]` entry when the Moment occurs in a reusable story-level setting.
294
312
295
313
`storybeats` inside a moment is an ordered reference list:
"description": "Optional story-level setting glossary. Each entry is a stable, referenceable place or environment that Moments may identify with setting_id while retaining free-text setting prose.",
"description": "Optional pre-narrative ideation threads for exploratory and beginner workflows.",
@@ -90,17 +115,17 @@
90
115
"subtext": {
91
116
"type": "object",
92
117
"properties": {
93
-
"perspectives": {
94
-
"type": "array",
95
-
"items": {
96
-
"type": "object",
97
-
"properties": {
98
-
"id": {
99
-
"$ref": "#/$defs/perspective_id"
100
-
},
101
-
"author_structural_pov": {
102
-
"type": "string",
103
-
"enum": [
118
+
"perspectives": {
119
+
"type": "array",
120
+
"items": {
121
+
"type": "object",
122
+
"properties": {
123
+
"id": {
124
+
"$ref": "#/$defs/perspective_id"
125
+
},
126
+
"author_structural_pov": {
127
+
"type": "string",
128
+
"enum": [
104
129
"i",
105
130
"you",
106
131
"we",
@@ -348,17 +373,17 @@
348
373
"type": "array",
349
374
"items": {
350
375
"type": "object",
351
-
"properties": {
352
-
"id": {
353
-
"$ref": "#/$defs/stable_id"
354
-
},
355
-
"appreciation": {
356
-
"type": "string",
357
-
"description": "Optional derived structural label, typically throughline + scope + sequence (for example, Objective Story Signpost 1)."
358
-
},
359
-
"scope": {
360
-
"type": "string",
361
-
"enum": [
376
+
"properties": {
377
+
"id": {
378
+
"$ref": "#/$defs/stable_id"
379
+
},
380
+
"appreciation": {
381
+
"type": "string",
382
+
"description": "Optional derived structural label, typically throughline + scope + sequence (for example, Objective Story Signpost 1)."
383
+
},
384
+
"scope": {
385
+
"type": "string",
386
+
"enum": [
362
387
"signpost",
363
388
"progression",
364
389
"event"
@@ -515,6 +540,10 @@
515
540
"setting": {
516
541
"type": "string"
517
542
},
543
+
"setting_id": {
544
+
"$ref": "#/$defs/setting_id",
545
+
"description": "Optional reference to a story.settings[] entry for this Moment. Use with setting to avoid repeating shared place details while preserving the Moment-specific setting prose."
546
+
},
518
547
"timing": {
519
548
"type": "string"
520
549
},
@@ -661,6 +690,10 @@
661
690
"type": "string",
662
691
"description": "Opaque identifier for an overview. Plain UUIDs are fine; type prefixes are not required."
663
692
},
693
+
"setting_id": {
694
+
"type": "string",
695
+
"description": "Opaque identifier for a story-level setting. Plain UUIDs are fine; setting_ prefixes are optional."
description: Optional story-level setting glossary. Each entry is a stable, referenceable place or environment that Moments may identify with setting_id while retaining free-text setting prose.
28
+
items:
29
+
type: object
30
+
properties:
31
+
id:
32
+
"$ref": "#/$defs/setting_id"
33
+
name:
34
+
type: string
35
+
description: Short human-readable setting name.
36
+
description:
37
+
type: string
38
+
description: Optional longer setting description.
39
+
required:
40
+
- id
41
+
- name
42
+
additionalProperties: false
25
43
ideation:
26
44
type: object
27
45
description: Optional pre-narrative ideation threads for exploratory and beginner workflows.
@@ -368,6 +386,9 @@ properties:
368
386
type: string
369
387
setting:
370
388
type: string
389
+
setting_id:
390
+
"$ref": "#/$defs/setting_id"
391
+
description: Optional reference to a story.settings[] entry for this Moment. Use with setting to avoid repeating shared place details while preserving the Moment-specific setting prose.
371
392
timing:
372
393
type: string
373
394
imperatives:
@@ -468,6 +489,9 @@ additionalProperties: false
468
489
overview_id:
469
490
type: string
470
491
description: Opaque identifier for an overview. Plain UUIDs are fine; type prefixes are not required.
492
+
setting_id:
493
+
type: string
494
+
description: Opaque identifier for a story-level setting. Plain UUIDs are fine; setting_ prefixes are optional.
0 commit comments