RISE Specification for the Core Data Model
Version: 1.1
Last Updated: 2025-12-31
Schema Location: /src/Miadi-46/stories/multiverse_3act_2512012121/schema/ncp-schema.json
The NCP Schema enables creators to:
The NCP distinguishes between:
Structural Tension emerges from the gap between subtext and storytelling, driving all great narrative.
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β NCP Document β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β schema_version: "1.1" β
β story: β
β βββ id: string β
β βββ title: string β
β βββ genre: string β
β βββ logline: string β
β βββ created_at: datetime β
β βββ narratives: [] β
β βββ narrative: β
β βββ id: string β
β βββ title: string β
β βββ subtext: β
β β βββ perspectives: [] β
β β βββ players: [] β
β β βββ dynamics: {} β
β β βββ storypoints: {} β
β β βββ storybeats: [] β
β βββ storytelling: β
β βββ overviews: [] β
β βββ moments: [] β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
### Perspective
A thematic lens through which to view the narrative.
- **perspective_id**: Unique identifier (e.g., "main_character", "objective_story")
- **name**: Human-readable name
- **description**: What this throughline explores
- **thematic_question**: Central question posed (e.g., "Can trust survive betrayal?")
- **tension**: Core conflict pair (e.g., "Safety vs Vulnerability")
- **domain**: (Optional) Dramatica-style domain (Universe, Physics, Mind, Psychology)
**Standard Four Throughlines**:
1. **Objective Story**: External plot visible to all characters
2. **Main Character**: Protagonist's internal journey
3. **Influence Character**: Force challenging MC's worldview
4. **Relationship Story**: Bond between MC and IC
### Player
A character or entity carrying narrative weight.
- **player_id**: Unique identifier
- **name**: Character name
- **archetype**: (Optional) Dramatica archetype (Protagonist, Antagonist, Guardian, etc.)
- **wound**: Core trauma or limiting belief
- **desire**: Primary goal or want (external)
- **need**: True need often hidden from character (internal)
- **arc**: Description of transformation
- **role**: Function in story (protagonist, deuteragonist, antagonist, mentor)
- **voice_profile**: (Optional) Speech patterns, vocabulary level
- **visual_signature**: (Optional) Defining visual characteristics
### Dynamics
Forces shaping narrative progression.
- **driver**: What moves the plot (Action or Decision)
- **limit**: What creates urgency (Timelock or Optionlock)
- **outcome**: Story outcome tendency (Success, Failure)
- **judgment**: Personal outcome for MC (Good, Bad)
- **mc_resolve**: Does MC change? (Change, Steadfast)
- **mc_growth**: Does MC grow? (Start, Stop)
- **mc_approach**: How MC solves problems (Do-er, Be-er)
- **mc_mental_sex**: Problem-solving style (Linear, Holistic)
### Storypoints
Key moments in narrative structure.
- **inciting_incident**: What disrupts equilibrium
- beat_id: Reference to triggering storybeat
- description: What happens
- **first_act_turn**: End of setup, commitment to journey
- beat_id: Reference
- description: How world changes
- **midpoint**: Major revelation or reversal
- beat_id: Reference
- description: Central pivot
- **all_is_lost**: Lowest point before climax
- beat_id: Reference
- description: Maximum despair
- **climax**: Peak dramatic confrontation
- beat_id: Reference
- description: Final battle
- **resolution**: New equilibrium established
- beat_id: Reference
- description: How world settles
### Storybeat
A unit of narrative progression with emotional tone.
- **storybeat_id**: Unique identifier
- **title**: Beat name
- **description**: What happens in this beat
- **act**: Which act (1, 2A, 2B, 3)
- **sequence**: Order within act
- **perspective_id**: Which throughline this beat serves
- **player_ids**: Characters involved
- **storypoint_ref**: (Optional) If this is a structural marker
**Tone Object** (3-dimensional):
- **abstraction**: Conceptual level (Concrete, Abstract, Philosophical)
- **spatial**: Physical scope (Intimate, Personal, Social, Public, Cosmic)
- **temporal**: Time sense (Immediate, Short-term, Long-term, Eternal)
**Emotional Weight**: Overall tone (Devastating, Hopeful, Tense, etc.)
### Moment
Specific prose content within storytelling.
- **moment_id**: Unique identifier
- **storybeat_ref**: Which beat this moment belongs to
- **type**: Content type (dialogue, action, description, internal_monologue)
- **content**: The actual prose
- **player_ids**: Characters active in this moment
- **timestamp**: (Optional) In-story time
For multi-episode narratives, additional fields:
### Series Context
- **season**: Season number
- **episode_number**: Episode within season
- **spiral_position**: Position in Four Directions (NORTH, EAST, SOUTH, WEST)
- **spiral_cycle**: Which iteration of the spiral
### Genealogy
- **inherited_from**: Previous episodes this builds on
- episode_id: Which episode
- concept: What was inherited
- teaching: What was learned
- how_we_build_on_it: How this episode advances
### Universe Teachings
Learnings organized by interpretive universe:
- **engineer_world**: Technical insights, action steps
- **ceremony_world**: Relational protocols, commitments
- **story_engine_world**: Narrative techniques, arc patterns
### Spiral Deepening
- **what_we_completed**: Achievement of this episode
- **what_became_visible**: Emergence that couldn't be designed
- **what_invites_next_cycle**: Seeds for continuation
- **next_episode_seeds**: Specific future episode ideas
### Relational Commitments
- **to_builder_archetype**: What we owe engineers
- **to_keeper_archetype**: What we owe ceremony keepers
- **to_weaver_archetype**: What we owe storytellers
- **to_community**: What we owe users
schema_version: Must be presentstory.id: Unique story identifierstory.title: Human-readable titlestory.narratives[].subtext: Must contain perspectives, players, dynamics, storypoints, storybeatsstorybeat.player_ids must reference existing players[].player_idstorybeat.perspective_id must reference existing perspectives[].perspective_idstorypoints.*.beat_id must reference existing storybeats[].storybeat_idmoments[].storybeat_ref must reference existing storybeats[].storybeat_id{
"schema_version": "1.1",
"story": {
"id": "the-threshold",
"title": "The Threshold",
"genre": "Coming of Age Drama",
"logline": "A young woman must choose between the safety of her wound and the vulnerability of her desire.",
"created_at": "2025-12-31T00:00:00Z",
"narratives": [
{
"id": "main-narrative",
"title": "Maya's Journey",
"subtext": {
"perspectives": [
{
"perspective_id": "main_character",
"name": "Maya's Internal Journey",
"thematic_question": "Can trust survive betrayal?",
"tension": "Safety vs Vulnerability"
}
],
"players": [
{
"player_id": "maya_1",
"name": "Maya",
"wound": "Abandoned by father at age 8",
"desire": "To belong to a community",
"need": "To trust herself first",
"arc": "From self-protection to courageous openness",
"role": "protagonist"
}
],
"dynamics": {
"driver": "Decision",
"mc_resolve": "Change",
"outcome": "Success",
"judgment": "Good"
},
"storypoints": {
"inciting_incident": {
"beat_id": "beat_02",
"description": "Maya receives invitation to join community"
}
},
"storybeats": [
{
"storybeat_id": "beat_01",
"title": "The Closed Door",
"description": "Maya maintains distance from neighbors, routine of isolation",
"act": 1,
"sequence": 1,
"perspective_id": "main_character",
"player_ids": ["maya_1"],
"emotional_weight": "Melancholic",
"tone": {
"abstraction": "Concrete",
"spatial": "Intimate",
"temporal": "Immediate"
}
}
]
},
"storytelling": {
"overviews": [],
"moments": []
}
}
]
}
}
from narrative_intelligence import NCPLoaderNode
loader = NCPLoaderNode(validate=True)
ncp_data = loader.load_from_file("story.ncp.json")
# Get character
maya = ncp_data.get_player("maya_1")
print(f"Wound: {maya.wound}")
# Get character's beats
maya_beats = ncp_data.get_player_storybeats("maya_1")
# Get beats by emotion
devastating_beats = ncp_data.get_storybeats_by_emotional_weight("Devastating")
from narrative_intelligence import CharacterArcGenerator, ThematicTensionAnalyzer
# Generate arc analysis
arc_gen = CharacterArcGenerator()
arc = arc_gen.generate(ncp_data, "maya_1")
# Analyze theme
analyzer = ThematicTensionAnalyzer()
theme = analyzer.analyze(ncp_data, "main_character")
| Pattern | Use Case |
|---|---|
*.ncp.json |
Standard NCP document |
*.ncp.enhanced.json |
Extended with series continuity |
s01e01-*.ncp.enhanced.json |
Episode-specific with series context |
Generated following RISE Framework v1.2 - Schema is implementation-agnostic