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: HISTORY.md
+4-1Lines changed: 4 additions & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -2,7 +2,10 @@
2
2
3
3
## Recent Schema Updates
4
4
5
-
- Added optional `story.settings[]` entries for reusable story-level Settings and optional `narratives[].storytelling.moments[].setting_id` references so Moments can point at a shared Setting while preserving free-text `setting`.
5
+
- Moved canonical Moments to required `story.moments[]` so storytelling units belong to the story and can reference Storybeats and Storypoints across multiple narratives.
6
+
- Added narrative-qualified `story.moments[].storybeats[]` and `story.moments[].storypoints[]` references, requiring `narrative_id` on each referenced structural element.
7
+
- Deprecated `narratives[].storytelling.moments[]` as a legacy/import compatibility slot while keeping it schema-valid for older payloads.
8
+
- Added optional `story.settings[]` entries for reusable story-level Settings and optional Moment `setting_id` references so Moments can point at a shared Setting while preserving free-text `setting`.
6
9
- Added a canonical story settings example and refreshed validation fixtures so canonical Storybeats omit legacy `signpost` keys.
7
10
- Added optional `subtext.storybeats[].appreciation` as a derived interoperability field based on `throughline + scope + sequence`.
8
11
- Clarified that Storybeat importers should derive the appreciation identity when the field is omitted so lighter-weight payloads remain compatible.
Copy file name to clipboardExpand all lines: README.md
+8Lines changed: 8 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -24,6 +24,8 @@ By clearly delineating narrative structure (Subtext) from presentation (Storytel
24
24
25
25
NCP also includes an optional `story.ideation` layer (`character`, `theme`, `plot`, `genre`) so creators can capture early concepts before committing to full storyform structure.
26
26
27
+
Storytelling Moments live at `story.moments[]` so scenes, chapters, sequences, and levels can reference Storybeats and Storypoints across multiple narratives without duplicating the storytelling unit.
28
+
27
29
---
28
30
29
31
### Authorship, AI, and Creative Intent
@@ -67,6 +69,11 @@ Use [/VALIDATION.md](/VALIDATION.md) for validating your own NCP files and CI se
67
69
## Templates
68
70
69
71
-[Complete Storyform template](/examples/complete-storyform-template.json): blank-slate NCP fixture with canonical Storypoint Appreciations excluding `Event` and `Progression` labels, plus Signpost-only Storybeats (no Progression/Event Storybeats). `narrative_function` is intentionally omitted so teams can fill in only what they need.
72
+
-[Cross-narrative Moments](/examples/cross-narrative-moments.json): story-level Moment fixture showing one scene referencing Storybeats and Storypoints from two different narratives.
73
+
74
+
## Integration Notes
75
+
76
+
-[MovieLabs OMC integration](/docs/omc-integration.md): adapter guidance for using NCP as the authorial-intent layer alongside OMC production-facing narrative entities.
@@ -56,6 +56,7 @@ The highest-level object representing the entire story, containing its metadata
56
56
"plot": [],
57
57
"genre": []
58
58
},
59
+
"moments": [],
59
60
"narratives": [],
60
61
"created_at": "2025-02-05T14:30:00Z"
61
62
}
@@ -71,7 +72,7 @@ The highest-level object representing the entire story, containing its metadata
71
72
- Each domain is an array of lightweight nodes requiring only `id` and `summary`.
72
73
- Nodes remain open/extensible so creators and LLM workflows can attach additional metadata without breaking schema compatibility.
73
74
74
-
This layer informs narratives as projects mature, while keeping strict structural meaning in `narratives[].subtext` and `narratives[].storytelling`.
75
+
This layer informs narratives as projects mature, while keeping strict structural meaning in `narratives[].subtext`, `narratives[].storytelling`, and story-level `story.moments[]`.
75
76
76
77
For open-source adopters, this creates a shared on-ramp: communities can exchange early creative concepts in a common format without forcing immediate commitment to full Dramatica Storyform structure, while still preserving interoperability with canonical narrative objects.
77
78
@@ -127,6 +128,40 @@ This structure provides both depth (meaning) and flexibility (presentation) with
127
128
"story": {
128
129
"id": "story_123e4567",
129
130
"title": "The Journey Within",
131
+
"moments": [
132
+
{
133
+
"id": "moment_gate_lockdown",
134
+
"summary": "The gate locks down.",
135
+
"synopsis": "The public evacuation crisis and a private relationship rupture happen in the same audience-facing scene.",
136
+
"setting": "The transit gate concourse.",
137
+
"timing": "Minutes before the final convoy window closes.",
138
+
"imperatives": "Carry both the external evacuation turn and the personal relationship turn.",
139
+
"storybeats": [
140
+
{
141
+
"sequence": 0,
142
+
"narrative_id": "narrative_AbnHJ147",
143
+
"storybeat_id": "beat_public_crisis"
144
+
},
145
+
{
146
+
"sequence": 1,
147
+
"narrative_id": "narrative_MnT90210",
148
+
"storybeat_id": "beat_private_rupture"
149
+
}
150
+
],
151
+
"storypoints": [
152
+
{
153
+
"sequence": 0,
154
+
"narrative_id": "narrative_AbnHJ147",
155
+
"storypoint_id": "storypoint_public_goal"
156
+
},
157
+
{
158
+
"sequence": 1,
159
+
"narrative_id": "narrative_MnT90210",
160
+
"storypoint_id": "storypoint_relationship_issue"
161
+
}
162
+
]
163
+
}
164
+
],
130
165
"narratives": [
131
166
{
132
167
"id": "narrative_AbnHJ147",
@@ -140,8 +175,7 @@ This structure provides both depth (meaning) and flexibility (presentation) with
140
175
"dynamics": []
141
176
},
142
177
"storytelling": {
143
-
"overviews": [],
144
-
"moments": []
178
+
"overviews": []
145
179
}
146
180
}
147
181
]
@@ -194,7 +228,11 @@ Overviews deliver high-level storytelling components, such as Throughline descri
194
228
**Why?** Overviews help authors clearly communicate their narrative's essential themes and structural direction, ensuring audiences can effortlessly follow and deeply connect with the story.
195
229
196
230
## Moments
197
-
Moments organize storytelling into narrative units like acts, scenes, chapters, or sequences. Each Moment includes a concise synopsis and structured references linking to associated Storybeats, providing clear narrative structure and aiding audience comprehension and engagement.
231
+
Moments organize storytelling into narrative units like acts, scenes, chapters, sequences, or levels. Canonical Moments live on `story.moments[]`, not inside a single narrative, because a storytelling unit belongs to the audience-facing story and can carry material from more than one narrative at the same time. A scene can turn the public Objective Story, illustrate a private Relationship Story issue, and echo a Main Character Storypoint without becoming three separate scenes.
232
+
233
+
Each story-level Moment includes a concise synopsis and narrative-qualified references to associated Storybeats and Storypoints. The `narrative_id` on each reference preserves which formal narrative owns the structural element while allowing the Moment to gather them into one storytelling unit.
234
+
235
+
Legacy or importer-only payloads may still contain `narratives[].storytelling.moments[]`, but canonical exporters should emit `story.moments[]`.
198
236
199
237
**Why?** Structuring storytelling through Moments ensures narratives are approachable and engaging, helping audiences intuitively grasp story progression and emotional dynamics.
200
238
@@ -423,6 +461,8 @@ Surface-level narrative elements that quickly orient the audience, such as Logli
423
461
424
462
Organizational narrative units—such as Acts, Scenes, Sequences, Chapters, and Levels—that help structure the narrative temporally. These units can vary in scale and can be flexibly defined to organize narrative flow in any specific context.
425
463
464
+
Canonical Moments live directly on `story.moments[]`. This makes them story-level storytelling units: they can reference Storybeats and Storypoints from any narrative in the story instead of being trapped inside one narrative's `storytelling` object.
465
+
426
466
```json
427
467
"moments": [
428
468
{
@@ -438,9 +478,33 @@ Organizational narrative units—such as Acts, Scenes, Sequences, Chapters, and
438
478
{ "type": "space", "limit": 10 }
439
479
],
440
480
"storybeats": [
441
-
{ "sequence": 0, "storybeat_id": "beat_123456" },
442
-
{ "sequence": 1, "storybeat_id": "beat_789012" },
443
-
{ "sequence": 2, "storybeat_id": "beat_345678" }
481
+
{
482
+
"sequence": 0,
483
+
"narrative_id": "narrative_public_crisis",
484
+
"storybeat_id": "beat_123456"
485
+
},
486
+
{
487
+
"sequence": 1,
488
+
"narrative_id": "narrative_private_reckoning",
489
+
"storybeat_id": "beat_789012"
490
+
},
491
+
{
492
+
"sequence": 2,
493
+
"narrative_id": "narrative_public_crisis",
494
+
"storybeat_id": "beat_345678"
495
+
}
496
+
],
497
+
"storypoints": [
498
+
{
499
+
"sequence": 0,
500
+
"narrative_id": "narrative_public_crisis",
501
+
"storypoint_id": "storypoint_public_goal"
502
+
},
503
+
{
504
+
"sequence": 1,
505
+
"narrative_id": "narrative_private_reckoning",
506
+
"storypoint_id": "storypoint_private_issue"
507
+
}
444
508
]
445
509
},
446
510
{
@@ -455,8 +519,23 @@ Organizational narrative units—such as Acts, Scenes, Sequences, Chapters, and
`story.moments[]` is the canonical home for audience-facing storytelling units such as scenes, acts, chapters, sequences, or levels. Moments belong to the story because storytelling units often carry structural material from more than one formal narrative.
74
+
75
+
For example, one scene might advance a public evacuation narrative while also turning a mentor-student relationship narrative. Keeping that scene in `story.moments[]` lets the Moment reference both narratives without duplicating the scene or forcing one narrative to own it.
`storybeats` is an ordered list of narrative-qualified Storybeat references:
86
+
87
+
```json
88
+
"storybeats": [
89
+
{
90
+
"sequence": 0,
91
+
"narrative_id": "narrative_evacuation",
92
+
"storybeat_id": "beat_evac_signpost_2"
93
+
},
94
+
{
95
+
"sequence": 1,
96
+
"narrative_id": "narrative_mentor_student",
97
+
"storybeat_id": "beat_mentor_signpost_2"
98
+
}
99
+
]
100
+
```
101
+
102
+
`storypoints` is an ordered list of narrative-qualified Storypoint references:
103
+
104
+
```json
105
+
"storypoints": [
106
+
{
107
+
"sequence": 0,
108
+
"narrative_id": "narrative_evacuation",
109
+
"storypoint_id": "storypoint_evac_goal"
110
+
},
111
+
{
112
+
"sequence": 1,
113
+
"narrative_id": "narrative_mentor_student",
114
+
"storypoint_id": "storypoint_mentor_issue"
115
+
}
116
+
]
117
+
```
118
+
119
+
`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.
120
+
121
+
`narratives[].storytelling.moments[]` remains a deprecated legacy/import compatibility slot. Canonical exporters should emit `story.moments[]`.
122
+
69
123
## Ideation Model (Optional Beginner Layer)
70
124
71
125
`story.ideation` is optional. If present, it must contain all four arrays:
@@ -277,10 +331,11 @@ When `appreciation` is present on a Storybeat, it should restate the structural
277
331
278
332
## Storytelling Model
279
333
280
-
`storytelling` contains two required arrays:
334
+
`storytelling` contains one required array:
281
335
282
336
-`overviews`
283
-
-`moments`
337
+
338
+
It may also contain deprecated legacy `moments` for importer compatibility. Canonical exporters should use story-level `story.moments[]`.
284
339
285
340
### Overviews
286
341
@@ -298,9 +353,11 @@ IDs are opaque strings. Plain UUIDs are fine; type prefixes are optional.
298
353
Canonical exporters should emit those exact Title Case values.
299
354
Importers/normalizers may accept legacy inputs such as `logline`, `genre`, `blended_throughlines`, `Premise Overview`, and `Four Throughlines Extraction`, but they should normalize those values before schema validation or export.
300
355
301
-
### Moments
356
+
### Legacy Narrative-Local Moments
302
357
303
-
Required keys per item:
358
+
`narratives[].storytelling.moments[]` is retained for older payloads that nested Moments inside a single narrative. New canonical exports should use `story.moments[]`.
`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.
312
369
313
-
`storybeats` inside a moment is an ordered reference list:
370
+
`storybeats` inside a legacy narrative-local Moment is an ordered reference list:
0 commit comments