Single-book workflow for comparison
This page shows what comes on top of the single-book workflow when a book is part of a series. Three tasks are at the center:
series-planner, trackers, series canon)harvest-author-rules, harvest-character-evolution, export, promo)new-book, add_book_to_series, copy_recurring_chars_to_new_book, bootstrap-book-from-series, new characters, new plot)The example continues from The Lighthouse Keeper in the single-book workflow. It becomes the Kargholm Saga, a trilogy of self-contained volumes in which each volume is told from a different POV but shares the same island and cast. Characters, plot and outputs are invented and shortened.
Key data:
| Attribute | Value |
|---|---|
| Series | Kargholm Saga |
| Series type | standalone-connected (same world, different POVs per volume) |
| Book 1 | The Lighthouse Keeper (Arne POV) |
| Book 2 | The Homecoming (Inga POV) |
| Book 3 | The Last Light (Mönckeberg POV, with a flashback to 1987) |
| Author persona | Maja Sundberg |
1. Finish the checks
├─ /storyforge:manuscript-checker
├─ /storyforge:chapter-reviewer (chapters with open findings)
└─ optionally /storyforge:voice-checker
2. All chapters at Final: the book status is then Proofread.
You set Editing, Export Ready and Published yourself.
3. Harvest the findings (before the next volume, do not skip)
├─ /storyforge:harvest-author-rules {book} (from book status Revision)
└─ /storyforge:harvest-character-evolution {book} (at Export Ready or Published,
with a question at Editing and Proofread)
4. Production
├─ /storyforge:cover-artist {book}
├─ /storyforge:export-engineer {book} epub
└─ /storyforge:promo-writer {book}
Transition to volume N+1:
5. Add the `B{N+1} (geplant)` sections of the trackers by hand
6. /storyforge:new-book {new-book}
(Step 1 asks for the series and number N+1; if the number is known, it
registers itself via add_book_to_series(series_slug, {new-book}, number=N+1)
and then automatically copies via copy_recurring_chars_to_new_book, as long
as the number is neither missing nor 0 nor 1)
7. /storyforge:bootstrap-book-from-series {old-book} {new-book}
8. /storyforge:character-creator {new-book} "{Name}" (first appearances)
9. /storyforge:book-conceptualizer {new-book}, then /storyforge:plot-architect
10. /storyforge:chapter-writer {new-book} 1
We assume The Lighthouse Keeper has already been through concept, plot, characters and world building. The book README does not carry a series yet (series is empty). In act two, Maja realizes the island is bigger than one book: Inga has her own missing-person case, and Mönckeberg carries the island's history in his head. That is the moment the standalone becomes a series.
/storyforge:series-planner kargholm-saga
The skill first checks whether trackers for this series already exist and shows them. Then it runs in steps, waiting for your confirmation after each:
The skill asks for four things: series title, number of volumes, genres and series type. The types to choose from:
The tool create_series creates {content_root}/series/kargholm-saga/:
series/kargholm-saga/
├── series.yaml # metadata: name, slug, planned volumes, status, book list
├── series-arc.md
├── timeline.md # chronology across all volumes
├── world/
│ └── canon.md # established facts
└── characters/ # trackers
There is no series README. The metadata lives in series.yaml.
This step applies to sequential and duology or trilogy. For standalone-connected and episodic it is skipped, because by definition there is no overarching plot, and the skill does not invent a central question. In our example (standalone-connected) Maja records the thematic thread herself in series-arc.md if she wants, for example:
# Kargholm Saga: Series Arc
## Overarching question
What does an island know, and what does it bear when it is put into words?
## Per volume
- B1 (Arne): What we suppress comes back, but not as what we expect.
- B2 (Inga): What we search for is rarely what we find.
- B3 (Mönckeberg): What an island knows, it knows for everyone.
For each volume the skill records in about 50 words: working title, focus, place in the overall arc, new characters and carried plot threads. Only after you approve all volumes does the canon follow.
world/canon.md records facts that must not be contradicted: geography, dates, character facts, world rules. For each recurring character the skill, after you confirm the recurs_in list, creates a tracker with the tool create_character_tracker. For every band in recurs_in the tool writes the headings ### B{n} Start and ### B{n} Ende with an italic placeholder, plus exactly one ### B{n+1} (geplant) section for the band after the last one. A tracker for Arne with recurs_in from B1 to B3 looks like this after creation and a few handwritten additions:
---
name: Arne Kruse
slug: arne
book_slug: arne-kruse
role: protagonist
status: Profile
recurs_in:
- B1
- B2
- B3
tracker_type: thin
---
# Arne Kruse — Series Evolution Tracker
> Full character profile per book: `projects/<book-slug>/characters/arne-kruse.md`
## Snapshot
72-year-old former lighthouse keeper, speaks briefly and in fragments.
## Evolution per Band
### B1 Start
Calm through isolation. Has sealed away Jürgen's disappearance.
### B1 Ende
*Filled by the harvest tool at end-of-book from book-level frontmatter snapshot fields and relationships.*
### B2 Start
*Where the character begins in B2. Filled by the bootstrap tool from B1 Ende.*
### B2 Ende
*Where the character ends in B2. Filled by the harvest tool at end-of-book.*
### B3 Start
*Where the character begins in B3. Filled by the bootstrap tool from B2 Ende.*
### B3 Ende
*Where the character ends in B3. Filled by the harvest tool at end-of-book.*
### B4 (geplant)
*Planned arc for Book 4. What changes? What carries forward? What new external pressure forces growth? Filled at planning time.*
## Beziehungen über die Bände
- **Inga**: B1 mistrust → B2 mentor → B3 memory
## Updates Log
- 2026-05-07 — Tracker scaffolded by series-planner
The series-planner does not fill any (geplant) text. If you want to record a planned arc for B2 or B3 that the bootstrap reads later, you add a ### B2 (geplant) or ### B3 (geplant) section by hand.
Here the tracker slug (arne) differs from the slug of the book file (arne-kruse). That is why the tracker carries book_slug, otherwise the link would not find the character file (see Character Anatomy). The same goes for Inga: the tracker inga gets book_slug: inga-holm. If both slugs match, you can leave the field out.
A character who is a different narrative figure at different times gets a tracker of their own. The young Pastor Thaden of 1987, for example, gets his own tracker in book 3 with
recurs_infor B3 only.
Book 1 already exists and is linked afterwards:
add_book_to_series(series_slug="kargholm-saga", book_slug="der-leuchtturmhueter", number=1)
This sets series and series_number in the frontmatter of the book README and adds the book to series.yaml. A number already assigned in the series is rejected. Afterwards the skill verifies the link with get_book_full.
As in the single-book workflow: reviewer, optionally voice harvest, humanizer, proofreader per chapter, then manuscript-checker. Once all chapters are Final, the book status is Proofread. To close the book you set the book status to Export Ready yourself, and to Published after the export at the latest. After that the book closing begins.
Harvest first, then export. If you export before the harvest runs have happened, you lose the findings from volume N for volume N+1. The order matters.
/storyforge:harvest-author-rules der-leuchtturmhueter
The skill expects at least the book status Revision (on Drafting it asks). The tool harvest_book_rules collects candidates from the book rules, sorted by type banned_phrase, style_principle or world_rule, each with a recommendation (promote or keep in the book only). You go through them one by one:
Candidate 2/18: style_principle
Value: Arne never speaks in full sentences when alone
Context: book rule from chapter 5
Recommendation: keep book-only
Why: Arne-specific, does not belong in the author profile.
[Promote] [Keep book-only] [Discard] [Edit and promote] [Skip]
Promoted entries land in the author database: banned phrases via write_author_banned_phrase, tics, principles and don'ts via write_author_discovery. Only the entries written through write_author_discovery carry an origin (book and month), banned phrases from write_author_banned_phrase do not. The database rows are read by author slug, so they apply immediately to every book of that author, running ones included. More: Author Profiles.
/storyforge:harvest-character-evolution der-leuchtturmhueter
Gates: at book status Export Ready or Published the skill runs without a question. At Editing or Proofread it asks whether to run anyway. At every status before Editing (for example Drafting or Revision) it blocks. The book also needs a series. The skill lists all trackers whose recurs_in contains the book's band, reads the end state and relationships of each character from the book file and proposes a "B1 Ende":
Tracker arne (Arne Kruse):
Proposed B1 end:
Accepts that Jürgen lives but is someone else. Has not forgiven
Thaden but no longer hates him. Ready to be a listener.
[Accept proposed] [Edit before writing] [Skip] [Keep existing]
What you confirm, the skill writes into the tracker under ### B1 Ende and adds an entry to the updates log. The character's book file stays unchanged: it is the source of truth for volume 1, and the tracker is the bridge between volumes.
As in the single-book workflow. The export does not touch the tracker. It is best to record a cover convention for the series (title font, series marker, palette per volume) in series/kargholm-saga/ so you do not decide it again for volumes 2 and 3.
The trackers carry the sections ### B2 Start and ### B2 Ende with placeholders for B2. The tool creates a ### B2 (geplant) section only for the band after the last entry in recurs_in, and the series-planner fills no (geplant) text. Now that you know where the characters landed, you write the planned arc for B2 by hand into a ### B2 (geplant) section of the tracker file. The bootstrap reads that section in 4c. If it is missing, the planned text arrives empty.
/storyforge:new-book die-heimkehr asks in step 1, among other things, whether the book belongs to an existing series. You answer with the slug and number:
/storyforge:new-book die-heimkehr
→ Series: kargholm-saga, number: 2
series_slug, the skill calls create_book_structure(..., series_slug="kargholm-saga"). That creates the project nested under series/kargholm-saga/die-heimkehr/ (instead of under projects/) and writes series: "kargholm-saga" into the README; series_number initially stays at 0. If a book with the same slug already exists under projects/die-heimkehr (or in another series), the tool rejects the series variant: "Book slug 'die-heimkehr' already exists at {path}. Choose a different title or resolve the collision first."add_book_to_series(series_slug="kargholm-saga", book_slug="die-heimkehr", number=2) and verifies the link with get_book_full. This sets series_number in the README and adds the book to series.yaml.series_number is now 2, so neither missing, 0 nor 1 — the copy step runs. It finds exactly one predecessor with a lower number in series.yaml (der-leuchtturmhueter), shows the planned copy, and after your confirmation calls copy_recurring_chars_to_new_book(series_slug="kargholm-saga", prev_book_slug="der-leuchtturmhueter", new_book_slug="die-heimkehr", new_band="B2", book_category="fiction") itself. The tool returns copied, skipped and new_chars:copied: 4 character files (trackers with B2 in recurs_in)
skipped: 0 (only used when the destination file already exists)
new_chars: 2 characters who first appear in B2 and are created by hand
Characters whose recurs_in does not contain B2 are not selected in the first place. The copies still show the state at the end of volume 1. For characters who first appear in B2 the tool has no source. If the number was still left open in step 1, you register it later yourself via add_book_to_series and then copy the characters by hand with copy_recurring_chars_to_new_book.
/storyforge:bootstrap-book-from-series der-leuchtturmhueter die-heimkehr
The skill goes through all trackers whose recurs_in contains the new band (six here, four of them with a predecessor in volume 1 and two first appearances). For each tracker it reads "B1 Ende" (from the harvest) and "B2 (geplant)" (added by you), plus the last snapshot from volume 1, and proposes a start snapshot for volume 2:
Tracker 1/6: inga (Inga Holm)
B1 Ende: alliance with Arne built, father case open again.
B2 (geplant): lead character, stays two weeks on Kargholm, then travels to Hannover.
Proposed B2 start state:
inventory: ["Hannes Holm's letter, now opened", "address in Hannover"]
states: ["allied-with-arne", "preparing-confrontation"]
[Accept proposed] [Edit before writing] [Skip]
What you confirm goes into the frontmatter of the character file in the new volume, together with series_evolution_imported_from: B1, and an entry in the tracker's updates log. Characters who first appear in volume 2 are skipped by the skill and named at the end. The skill requires both books to belong to the same series and prev to come before new. If the previous book is not at Export Ready or Published, it asks whether to run anyway.
For characters without a predecessor you create the book file and the tracker:
/storyforge:character-creator die-heimkehr "Birgit Holm"
In the tracker (series-planner or create_character_tracker) you enter recurs_in with B2 and B3 and, if the tracker slug differs from the slug of the book file, book_slug, so bootstrap and brief recognize them later.
/storyforge:book-conceptualizer die-heimkehr
/storyforge:plot-architect die-heimkehr
/storyforge:chapter-writer die-heimkehr 1
In the brief each recurring character carries the field series_evolution. It is filled when series_number is at least 1 and a tracker for the character's book slug holds text for the current band — regardless of whether the book lives flat under projects/ or (like die-heimkehr here) nested under series/{series}/. Otherwise it is null, see Character Anatomy. Filled, it looks like this:
characters_present:
- slug: inga-holm
series_evolution:
previous_book_end: "alliance with Arne built ..."
current_book_plan: "lead character, stays two weeks on Kargholm ..."
relationships_evolution: "..."
So the writer knows where Inga stands at the start of volume 2 without looking anything up. Details: Character Anatomy.
The same cycle once more, more compactly:
harvest-author-rules die-heimkehr collects the B2 findingsharvest-character-evolution die-heimkehr writes the ### B2 Ende sectionsnew-book das-letzte-licht asks for the series and number 3, registers itself via add_book_to_series, and with the number known automatically copies via copy_recurring_chars_to_new_book (new_band="B3")Special case volume 3: Mönckeberg is the protagonist here, and there is a 1987 strand in which he is 34. For that you create a separate character and a separate tracker (for example junger-moenckeberg with recurs_in for B3 only).
Then bootstrap-book-from-series die-heimkehr das-letzte-licht, character-creator for the 1987 characters, book-conceptualizer, plot-architect and writing.
There is no dedicated skill for a box set. You can build the three manuscripts into one file yourself with Pandoc and produce the promo texts per book with promo-writer.
Keep recurs_in limited to B1 in the tracker and note the hint under ## Beziehungen über die Bände. Bootstrap skips the character, and you write the memories without a character file of their own.
Bootstrap cannot carry anything over and names them among the first appearances. Create them with character-creator and fill in the tracker.
The skill shows both versions and never writes without your decision. Choose "Edit before writing" and merge them.
Set book_slug in the tracker frontmatter:
slug: junger-moenckeberg
book_slug: moenckeberg-1987 # book file is moenckeberg-1987.md
recurs_in:
- B3
Without the link the brief returns series_evolution: null for the character, no error.
Genres are set per book in the genres field and may differ. The chapter writer loads the genres of the respective book.
The canon applies. Either you adapt volume 2, or you make a formal revision pass on volume 1. world/canon.md should never be changed silently, record changes with date and reason.
Once per book at the end is the standard. You can promote single findings mid-way with /storyforge:promote-rule.
No problem: the harvest can be done afterwards, the export stays untouched. Only if you have already started volume 2 will it lack the findings from volume 1 in the profile until you have harvested.
series-planner (once)harvest-author-rules, harvest-character-evolution, cover, export, promonew-book, add_book_to_series, copy_recurring_chars_to_new_book, bootstrap-book-from-series, first appearances, concept, plotHarvest first, then export. The two harvest runs secure what volume N+1 needs.
Trackers are series-wide, character files are per book. A character has one tracker per series and one file per book in which they appear. Harvest and bootstrap are the bridges, not copy and paste.
The series canon is binding. What stands in
world/canon.mdmust not be silently revoked.
Tracker slug and book slug differ? Set
book_slug. It is a one-liner againstseries_evolution: null.
Standalone-connected is the easiest entry. Every book works alone, the trackers carry the bridges. Sequential demands a continuous plot, episodic is even looser.