NCP components.

NCP carries a storyform as structured context. These components separate exploratory ideas, deep authorial meaning, and audience-facing storytelling so tools can exchange the same intent without collapsing it into a generic plot summary.

Story envelope

The top-level `story` object identifies the project and holds its shared metadata. It can include title, logline, genre, creation timestamp, reusable settings, ideation, and one or more narratives.

{
  "schema_version": "1.3.0",
  "story": {
    "id": "story_123e4567",
    "title": "Echoes of the Past",
    "logline": "A detective links a cold case to his own haunted history.",
    "created_at": "2025-12-01T12:34:56Z",
    "narratives": []
  }
}

Component reference

Ideation

Optional beginner concept space for authors who are still forming ideas. It lives inside `story`, above and outside formal narratives, with four domains: character, theme, plot, and genre.

"ideation": {
  "character": [
    {
      "id": "idea_char_001",
      "summary": "A protector whose need for control masks grief.",
      "title": "Lead Character Seed",
      "tags": ["character_arc", "inner_conflict"]
    }
  ],
  "theme": [],
  "plot": [],
  "genre": []
}

Settings

Optional reusable story-level places or environments. Moments keep their own free-text `setting` and can also reference a shared `setting_id`.

"settings": [
  {
    "id": "setting_precinct_archive",
    "name": "Precinct Archive",
    "description": "A dimly lit archive room where old case files preserve institutional memory."
  }
]

Narratives

A single story may contain one or more Dramatica storyforms. Each narrative can be `candidate`, `draft`, or `complete`, and each one separates Subtext from Storytelling.

"narratives": [
  {
    "id": "narrative_AbnHJ147",
    "title": "Central Form",
    "status": "draft",
    "subtext": {
      "perspectives": [],
      "players": [],
      "storypoints": [],
      "storybeats": [],
      "dynamics": []
    },
    "storytelling": {
      "overviews": [],
      "moments": []
    }
  }
]

Perspectives

Authorial points of view that frame thematic conflict. NCP keeps perspective separate from character identity so the structural point of view can travel cleanly.

{
  "id": "12345678-1234-1234-1234-123456789012",
  "author_structural_pov": "i",
  "summary": "John Marlowe",
  "storytelling": "John is a seasoned detective whose past is as mysterious as the cases he solves."
}

Players

Character identity records. Players carry role, sensory description, motivations, biography, storytelling expression, and links back to structural perspectives.

{
  "id": "abcdef12-3456-7890-abcd-ef1234567890",
  "name": "Detective John Marlowe",
  "role": "Main Character",
  "visual": "A rumpled trench coat and tired eyes that miss nothing.",
  "audio": "Measured speech with an edge of impatience.",
  "summary": "A dedicated detective haunted by unresolved cases.",
  "bio": "A veteran investigator whose discipline masks unresolved grief.",
  "storytelling": "John exudes a stoic demeanor, masking inner turmoil.",
  "motivations": [
    {
      "narrative_function": "Consider",
      "illustration": "weighing every lead against the emotional cost of reopening old wounds",
      "storytelling": "John keeps circling the evidence."
    }
  ],
  "perspectives": [
    { "perspective_id": "12345678-1234-1234-1234-123456789012" }
  ]
}

Dynamics

Story-level decision vectors such as resolve, growth, approach, limit, driver, outcome, and judgment. Dynamics encode the author's intended direction.

{
  "id": "dynamic_00112233-4455-6677-8899-aabbccddeeff",
  "dynamic": "story_outcome",
  "vector": "success",
  "summary": "The case concludes with John uncovering the truth.",
  "storytelling": "A climactic revelation ties together past and present."
}

Storypoints

Canonical Appreciations such as Objective Story Problem, Main Character Symptom, and Relationship Story Catalyst. Storypoints preserve thematic intent in stable form.

{
  "id": "storypoint_11223344-5566-7788-99aa-bbccddeeff00",
  "appreciation": "Main Character Symptom",
  "narrative_function": "Consider",
  "illustration": "John ponders over a crucial piece of evidence.",
  "summary": "Personal history intersects with the case.",
  "storytelling": "An old photograph sparks memories and hidden truths.",
  "perspectives": [
    { "perspective_id": "12345678-1234-1234-1234-123456789012" }
  ]
}

Storybeats

Sequenced structural turns. Storybeats can carry scope, throughline, sequence, narrative function, summary, storytelling, and perspective links.

{
  "id": "beat_001",
  "scope": "signpost",
  "sequence": 2,
  "throughline": "Main Character",
  "narrative_function": "Preconscious",
  "summary": "The past resurfaces, influencing the current investigation.",
  "storytelling": "Present-day tension blends with haunting memories.",
  "perspectives": [
    { "perspective_id": "12345678-1234-1234-1234-123456789012" }
  ]
}

Overviews

High-level storytelling components such as Logline, Genre, and throughline summaries. They orient an audience or system before individual moments begin.

{
  "id": "12345678-1234-1234-1234-123456789010",
  "label": "Logline",
  "summary": "A dark and atmospheric mystery unfolds in a rain-soaked city.",
  "storytelling": "The narrative juxtaposes gritty realism with introspective flashbacks."
}

Moments

Storytelling units like acts, scenes, chapters, sequences, or interactive beats. Moments can reference Storybeats and optional shared Settings.

{
  "id": "moment_001",
  "act": 1,
  "order": 1,
  "maximum_steps": 3,
  "summary": "The inciting discovery",
  "synopsis": "John uncovers an old case file tied to his own past.",
  "setting": "A dimly lit precinct archive room.",
  "setting_id": "setting_precinct_archive",
  "timing": "Late night, after hours.",
  "imperatives": "Investigate the link before the evidence disappears.",
  "storybeats": [
    { "sequence": 1, "storybeat_id": "beat_001" }
  ]
}

Mappings

Optional custom terminology that keeps canonical meaning while supporting other frameworks, custom vocabularies, or tool-specific namespaces.

{
  "custom_appreciation": "Refusal of the Call",
  "custom_appreciation_namespace": "heros_journey",
  "appreciation": "Main Character Symptom"
}

Full example

This is the canonical `examples/example-story.json` fixture from the NCP repository. It shows story metadata, settings, ideation, a draft narrative, Subtext, Storytelling, and cross-links.

{
  "schema_version": "1.3.0",
  "story": {
    "id": "story_123e4567-e89b-12d3-a456-426614174000",
    "title": "Echoes of the Past",
    "genre": "Mystery Thriller",
    "logline": "A hardened detective uncovers clues linking a cold case to his own haunting history.",
    "created_at": "2025-12-01T12:34:56Z",
    "settings": [
      {
        "id": "setting_precinct_archive",
        "name": "Precinct Archive",
        "description": "A dimly lit archive room where old case files preserve institutional memory and unresolved history."
      }
    ],
    "ideation": {
      "character": [
        {
          "id": "idea_char_001",
          "summary": "A detective whose methodical control hides unresolved personal guilt.",
          "title": "Lead Character Core",
          "notes": "Potentially pairs with a foil who embraces uncertainty.",
          "tags": [
            "protagonist",
            "trauma"
          ]
        }
      ],
      "theme": [
        {
          "id": "idea_theme_001",
          "summary": "Control versus vulnerability as a path to truth.",
          "title": "Theme Thread",
          "tags": [
            "identity",
            "truth"
          ]
        }
      ],
      "plot": [
        {
          "id": "idea_plot_001",
          "summary": "A reopened cold case escalates into a personal reckoning.",
          "title": "Plot Spine"
        }
      ],
      "genre": [
        {
          "id": "idea_genre_001",
          "summary": "Neo-noir mystery with psychological thriller pressure.",
          "title": "Genre Blend"
        }
      ]
    },
    "narratives": [
      {
        "id": "narrative_001",
        "title": "Central Narrative",
        "status": "draft",
        "subtext": {
          "perspectives": [
            {
              "id": "12345678-1234-1234-1234-123456789012",
              "author_structural_pov": "i",
              "summary": "John Marlowe",
              "storytelling": "John is a seasoned detective whose past is as mysterious as the cases he solves."
            }
          ],
          "players": [
            {
              "id": "abcdef12-3456-7890-abcd-ef1234567890",
              "name": "Detective John Marlowe",
              "role": "Main Character",
              "visual": "A rumpled trench coat and tired eyes that miss nothing.",
              "audio": "Measured speech with an edge of impatience.",
              "summary": "A dedicated detective haunted by unresolved cases.",
              "bio": "A veteran investigator whose professional discipline masks unresolved personal grief.",
              "storytelling": "John exudes a stoic demeanor, masking the inner turmoil of his past.",
              "motivations": [
                {
                  "narrative_function": "Consider",
                  "illustration": "weighing every lead against the emotional cost of reopening old wounds",
                  "storytelling": "John keeps circling the evidence, unable to separate the current case from his unresolved history."
                }
              ],
              "perspectives": [
                {
                  "perspective_id": "12345678-1234-1234-1234-123456789012"
                }
              ]
            }
          ],
          "dynamics": [
            {
              "id": "dynamic_00112233-4455-6677-8899-aabbccddeeff",
              "dynamic": "story_outcome",
              "vector": "success",
              "summary": "The case concludes with John uncovering the truth.",
              "storytelling": "A climactic moment of revelation that ties together past and present."
            }
          ],
          "storypoints": [
            {
              "id": "storypoint_11223344-5566-7788-99aa-bbccddeeff00",
              "appreciation": "Main Character Symptom",
              "narrative_function": "Consider",
              "illustration": "John ponders over a crucial piece of evidence.",
              "summary": "A turning point in the investigation where personal history intersects with the case.",
              "storytelling": "The discovery of an old photograph sparks memories and hidden truths.",
              "perspectives": [
                {
                  "perspective_id": "12345678-1234-1234-1234-123456789012"
                }
              ]
            }
          ],
          "storybeats": [
            {
              "id": "beat_001",
              "scope": "signpost",
              "sequence": 2,
              "throughline": "Main Character",
              "narrative_function": "Preconscious",
              "summary": "A moment where the past resurfaces, influencing his current investigation.",
              "storytelling": "A blend of present-day tension and haunting memories creates a surreal experience.",
              "perspectives": [
                {
                  "perspective_id": "12345678-1234-1234-1234-123456789012"
                }
              ]
            }
          ]
        },
        "storytelling": {
          "overviews": [
            {
              "id": "12345678-1234-1234-1234-123456789010",
              "label": "Logline",
              "summary": "A dark and atmospheric mystery unfolds in a rain-soaked city.",
              "storytelling": "The narrative juxtaposes gritty realism with introspective flashbacks."
            },
            {
              "id": "12345678-1234-1234-1234-123456789011",
              "label": "Genre",
              "summary": "Mystery pacing with thriller turns built on memory and regret.",
              "storytelling": "Each reveal tightens the emotional stakes as the genre shifts between introspection and pursuit."
            }
          ],
          "moments": [
            {
              "id": "moment_001",
              "act": 1,
              "order": 1,
              "maximum_steps": 3,
              "summary": "The inciting discovery",
              "synopsis": "John uncovers an old case file that hints at deeper connections to his own past.",
              "setting": "A dimly lit precinct archive room.",
              "setting_id": "setting_precinct_archive",
              "timing": "Late night, after hours.",
              "imperatives": "Investigate the link before the evidence disappears.",
              "storybeats": [
                {
                  "sequence": 1,
                  "storybeat_id": "beat_001"
                }
              ]
            }
          ]
        }
      }
    ]
  }
}