feat(novel): DATA/plot.md - the story baseline (main line + side-story register)
Some checks failed
Create Release / Check if Version Bump PR Merged (push) Has been cancelled
Post-Merge Version Bump / Check if Version Bump Needed (push) Has been cancelled
Create Release / Create Git Tag and GitHub Release (push) Has been cancelled
Post-Merge Version Bump / Create Version Bump PR (push) Has been cancelled

The pack had a premise (a few sentences), per-book summaries and a weekly timeline,
but no single spine saying what the main line is and which threads are side stories.

plot.md is the one prose file in DATA/: the author's telling, split into backbone
beats, an explicit side-story register, the verbatim transcription (spoken tellings
are expected - dictating into a note app is often the easiest way to produce a
baseline), deviations once the novel departs from it, and open threads.

The hierarchy is written into the file so it cannot drift: plot.md is INTENT, the
manuscript is REALISED, the wiki is DETAIL; on conflict the agent reports instead of
silently picking. Side stories are first-class - an unregistered thread is invisible
to the agent.

Wired in: SCHEMA (tree, naming table, new 5.4), templates/DATA/plot.md,
OpenNovelAgent load list + read-both-backbone-and-side-stories rule, /init asks for
a spoken telling and scaffolds the file, Importer maps fragments into it,
StoryReviewer measures chapters against it.
This commit is contained in:
Claus Lohmar 2026-10-17 00:05:19 +01:00
parent 4b9a535d6c
commit 8763b36378
6 changed files with 164 additions and 12 deletions

View file

@ -46,7 +46,7 @@ Classify the source into ONE of two cases by inspecting the directory:
### Case A — Existing OpenNovelWriter project ### Case A — Existing OpenNovelWriter project
**Signals:** a `DATA/` folder with `wiki.yaml.md`, `timeline.yaml.md`, `glossary.yaml.md`, **Signals:** a `DATA/` folder with `wiki.yaml.md`, `timeline.yaml.md`, `glossary.yaml.md`, `plot.md`,
chapter folders like `01/DE/`, and an `.opencode/` with agent files. chapter folders like `01/DE/`, and an `.opencode/` with agent files.
**Action:** this is a *reset/upgrade*. Preserve all DATA files and chapters, and **Action:** this is a *reset/upgrade*. Preserve all DATA files and chapters, and
@ -146,3 +146,24 @@ Approve to write?
<faithful>Extract and summarize; never invent story facts.</faithful> <faithful>Extract and summarize; never invent story facts.</faithful>
<approve>Present the mapping plan before writing.</approve> <approve>Present the mapping plan before writing.</approve>
</principles> </principles>
## Extracting the story baseline — `DATA/plot.md`
Sources usually carry the story in fragments rather than one spine: per-book summaries
(`Zusammenfassung.md`), a premise paragraph, weekly timeline notes, chapter titles, idea
files. Reconstruct them into `plot.md`:
- **§1 Backbone** — the beats that must happen, per book. An existing manuscript's chapter
titles are legitimate raw material: they already encode the spine in order. Mark
anything inferred as *inferred*, and never invent a beat no source supports.
- **§2 Side stories** — threads you can point to in the source (a subplot with its own
characters, a mystery spanning chapters, a secondary family), each with the file you
took it from. **Flag them as candidates** for the author; never promote a fragment to a
canonical side story on your own.
- **§3 Baseline telling** — only if the source holds a first-person telling or transcript.
Verbatim, dated.
- **§4 Deviations** — left empty on import; it fills as the novel departs from the baseline.
Never discard the summaries you drew from: `plot.md` holds the spine, the originals stay
as detail. Report what was mapped and what could not be placed.

View file

@ -48,16 +48,31 @@ The author is the creative authority. You are the partner who does the work:
BEFORE you draft, revise, or translate a chapter, you MUST load: BEFORE you draft, revise, or translate a chapter, you MUST load:
1. `AGENTS.md` — project rules (languages, genre, audience) 1. `AGENTS.md` — project rules (languages, genre, audience)
2. `DATA/style.md` — the author's voice (MANDATORY) 2. `DATA/plot.md` — the story baseline: the main line + the side stories (MANDATORY)
3. `DATA/wiki.yaml.md` — the world wiki (characters, places, magic) 3. `DATA/style.md` — the author's voice (MANDATORY)
4. `DATA/timeline.yaml.md` — the timeline (what has happened so far) 4. `DATA/wiki.yaml.md` — the world wiki (characters, places, magic)
5. `DATA/glossary.yaml.md` — translations (when translating) 5. `DATA/timeline.yaml.md` — the timeline (what has happened so far)
6. `DATA/glossary.yaml.md` — translations (when translating)
WHY: Without these files you produce generic AI prose instead of continuing the WHY: Without these files you produce generic AI prose instead of continuing the
author's story. Inconsistent names, wrong tone, contradictions with the world = author's story. Inconsistent names, wrong tone, contradictions with the world =
wasted work. wasted work.
CONSEQUENCE OF SKIPPING: Work that doesn't fit the established world = rework. CONSEQUENCE OF SKIPPING: Work that doesn't fit the established world = rework.
**The baseline is intent, not a cage.** `DATA/plot.md` holds the main line AND an
explicit register of side stories. Read both:
- Side stories are expected — they are what makes the world feel lived-in. Never treat
the backbone as the only permitted material. If you invent a thread that is worth
keeping, add it to the side-story register in `plot.md` (same turn, no extra question).
- The backbone is what must happen; the side stories are how it feels. A chapter that
advances neither is a chapter to reconsider.
- If the manuscript and the baseline disagree, do not silently pick one: report the
conflict and ask. The written novel outranks the baseline for what is *realised*; the
baseline outranks it for what is *planned*.
- If the author dictates a fresh telling, it goes into `plot.md` as a new dated section —
never overwrite the earlier one.
</critical_context_requirement> </critical_context_requirement>
<critical_rules priority="absolute" enforcement="strict"> <critical_rules priority="absolute" enforcement="strict">

View file

@ -92,3 +92,17 @@ and suggest improvements. You report; you never rewrite.
<specific>Cite the exact passage; no vague critique.</specific> <specific>Cite the exact passage; no vague critique.</specific>
<report_only>Critique and suggest; never rewrite.</report_only> <report_only>Critique and suggest; never rewrite.</report_only>
</principles> </principles>
## Measuring against the baseline — `DATA/plot.md`
Review the manuscript against the baseline, not against itself:
1. **Backbone coverage** — is every §1 beat written, placed in a chapter, or still open?
Report beats that have gone missing (the usual failure: a beat the author told once and
nobody wrote down).
2. **Side-story presence** — which registered side stories appear in the written chapters,
which have stalled, which were never placed?
3. **Unregistered threads** — anything in the manuscript doing side-story work but absent
from the register. Those are the ones that will contradict something later.
4. **Deviations** — where the novel has left the baseline, so §4 stays honest.

View file

@ -47,11 +47,23 @@ content in that language. Map the language to its ISO code in
Ask these questions one at a time. Record the answers: Ask these questions one at a time. Record the answers:
1. **Basic plot / premise** — the most important question: 1. **The baseline telling** — the most important question, and the one the author is
> "Tell me the basic plot — what is the story about? What is to come?" most likely to want to *speak* rather than type:
> "Tell me the story — what happens, from the beginning to the end? Take your time."
The author describes the story in a few sentences. This is the SEED: you will Say explicitly that a **spoken telling is welcome**: many authors dictate into a
use it to pre-fill the world wiki and timeline, and to start building the world. note app and paste the transcript. If the author pastes one, keep it **verbatim**
in `DATA/plot.md` §3 — do not tidy it, ASR errors and all; it is the author's voice.
Then split it into:
- **`plot.md` §1 Backbone** — the beats that must happen, one per line;
- **`plot.md` §2 Side stories** — every thread that is not the main line: whose
story it is, which books it spans, its status. Ask *"What else is going on
besides the main line?"* — side stories are expected, not optional.
**Keep asking until the author says there is nothing left to tell.** The telling is
the seed for the wiki and the timeline, and the baseline every chapter is measured
against.
2. **Series title** (for metadata; defaults to the folder/workspace name) 2. **Series title** (for metadata; defaults to the folder/workspace name)
3. **Sequel or standalone?** 3. **Sequel or standalone?**
@ -95,9 +107,12 @@ created and named):
### Step 4: Populate the DATA files ### Step 4: Populate the DATA files
- **`plot.md`** → §1 backbone beats from the telling, §2 the side-story register, §3 the
verbatim transcription if the author dictated. The agent measures every chapter
against this file, so never leave §1 or §2 empty.
- **`wiki.yaml.md`** → `meta:` block with the answers from Step 2 (title, author, - **`wiki.yaml.md`** → `meta:` block with the answers from Step 2 (title, author,
canonical, languages, genre, audience). Also fill `concept.premise:` with the canonical, languages, genre, audience). `concept.premise:` gets the SHORT premise —
basic plot from Step 2, question 1. `plot.md` holds the long form.
- **`timeline.yaml.md`** → `story:` MUST be seeded with the premise as the first - **`timeline.yaml.md`** → `story:` MUST be seeded with the premise as the first
entry. Do NOT leave it empty. Example: entry. Do NOT leave it empty. Example:

View file

@ -25,6 +25,7 @@ Novels/ # the container vault (Obsidian)
│ │ ├── wiki.yaml.md # world wiki (canonical) │ │ ├── wiki.yaml.md # world wiki (canonical)
│ │ ├── timeline.yaml.md # timeline (lore history + plot) │ │ ├── timeline.yaml.md # timeline (lore history + plot)
│ │ ├── glossary.yaml.md # translation glossary │ │ ├── glossary.yaml.md # translation glossary
│ │ ├── plot.md # the story baseline: main line + side stories
│ │ └── style.md # the author's writing style │ │ └── style.md # the author's writing style
│ ├── 01/ # Book 1 (folder = number, title optional) │ ├── 01/ # Book 1 (folder = number, title optional)
│ │ ├── DE/ # language folder (ISO-639-1 code) │ │ ├── DE/ # language folder (ISO-639-1 code)
@ -58,7 +59,7 @@ own, make the *book folder* a git repository — not the vault.)
| **Language folder** | ISO-639-1 code (code only) | `DE`, `EN`, `PT` | | **Language folder** | ISO-639-1 code (code only) | `DE`, `EN`, `PT` |
| **Chapter file** | localized chapter word + 3-digit number | `Kapitel 001.md` | | **Chapter file** | localized chapter word + 3-digit number | `Kapitel 001.md` |
| **Chapter number** | 3 digits, zero-padded | `001` … `100` | | **Chapter number** | 3 digits, zero-padded | `001` … `100` |
| **DATA files** | fixed English names | `wiki.yaml.md`, `timeline.yaml.md`, `glossary.yaml.md` | | **DATA files** | fixed English names | `wiki.yaml.md`, `timeline.yaml.md`, `glossary.yaml.md`, `plot.md` |
**Chapter word per language** (defined in `.opencode/languages.yaml`): **Chapter word per language** (defined in `.opencode/languages.yaml`):
- `de` → `Kapitel` - `de` → `Kapitel`
@ -158,6 +159,52 @@ terms:
--- ---
### 5.4 `plot.md` — the Story Baseline
The one DATA file that is **prose, not YAML**. It carries the author's own telling of
the story — the spine that both author and agent build around — and an explicit register
of the side stories that weave around it.
```markdown
# Plot — <series title>
> Baseline = the author's telling. It is the *main line*, not the whole story:
> side stories, subplots and new characters are expected and MUST be recorded here,
> or they are invisible to the agent.
## 1. Backbone — what must happen
### Book 1 — <title>
1. beat …
2. beat …
## 2. Side stories (register)
| thread | whose story | spans | status |
|---|---|---|---|
| … | … | book 1–2 | planned / placed / written |
## 3. Baseline telling (verbatim, dated)
Paste the transcription here, newest first. Never delete an older telling.
## 4. Deviations — where the written novel left the baseline
## 5. Open threads / unresolved questions
```
**Rules**
1. **Hierarchy:** `plot.md` is *intent* (what should happen), the manuscript is
*realised* (what is written), `Notizen/`/`wiki.yaml.md` is *detail canon*. On conflict,
the agent **reports** rather than silently picking; the author rules per case.
2. **The telling is verbatim material.** Spoken word transcribed by a note app is full of
errors, especially in invented names. Keep it as it came — it is the author's voice —
but when anything from it is *used*, normalise names against `wiki.yaml.md` and the
glossary first.
3. **Side stories are first-class.** A thread that is not in the register does not exist
as far as the agent is concerned. Add it the moment it is invented.
4. **Never delete a telling.** Re-recordings are appended as new dated sections; the older
one is history and shows how the story grew.
---
## 6. Chapter Conventions ## 6. Chapter Conventions
- One `.md` file per chapter. - One `.md` file per chapter.

View file

@ -0,0 +1,40 @@
# Plot — {{SERIES_TITLE}}
> **Baseline = the author's telling.** This is the main line of the story, not the
> whole of it: side stories, subplots and new characters are expected — and they MUST
> be recorded in section 2, or the agent cannot see them.
>
> Hierarchy: this file is *intent*, the manuscript is *realised*, the wiki is *detail*.
> Where they disagree, report it and let the author rule — never silently pick one.
## 1. Backbone — what must happen
### Book 1 — {{BOOK_1_TITLE}}
1. {{BEAT}}
2. {{BEAT}}
### Book 2 — {{BOOK_2_TITLE}}
1. {{BEAT}}
## 2. Side stories (register)
| thread | whose story | spans | status |
|---|---|---|---|
| {{THREAD}} | {{CHARACTER}} | book 1 | planned |
Status values: `idea` → `planned` → `placed` (a chapter is assigned) → `written`.
## 3. Baseline telling (verbatim, dated)
### {{DATE}} — first telling
{{Paste the transcription here, exactly as it came. Do not tidy it.}}
## 4. Deviations — where the written novel left the baseline
| chapter | baseline said | novel does | ruling |
|---|---|---|---|
## 5. Open threads / unresolved questions
- {{QUESTION}}