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.
One Obsidian vault holds every book; each book is a subfolder and is the opencode
workspace. The pack is shared at the vault root and inherited by walking up, so a
book no longer gets its own .opencode copy:
- SCHEMA §1 rewritten: container vault -> book folders, shared .opencode + docs
- init.md: scaffolds only the book (AGENTS.md, DATA/, 01/), checks that a shared
pack is reachable, and no longer copies agent/command files into the project
- PACK-NOTES: layout diagram + a headless section documenting the deny-based
permission model
OpenNovelAgent and Importer had bash "*": "ask", which opencode cannot prompt for
in `opencode run` — every tool call was auto-rejected, so the pack only worked in
the interactive TUI or with --dangerously-skip-permissions.
Both now allow bash by default and deny the dangerous commands explicitly
(rm -rf, sudo, mkfs, diskutil, shutdown, reboot). The other eight agents keep
bash: "deny" on purpose: they are note-editing subagents that read and write
through opencode's file tools and never need a shell.
Approval is now expressed as denies for the irreversible commands rather than a
gate on every command.
Timestamps show the pack was authored in the OpenNovelWriter vault
(17:10-21:33, 8 Sept 2026), deployed to Scruffy + Kessler at 21:34:47, and
only then did Scruffy receive its real content (DATA/ 21:46-21:54,
Kapitel 002 22:00, Kapitel 001 on 9 Sept) - Scruffy is the live project and
the best instance, not a stale copy.
Also verified: Scruffy's SCHEMA.md has no unique content (7 structural lines
only), so the pack revision supersedes it without loss, and the Kessler vault
was an import test that should not be the import target.
The novel-writing agent pack existed only as three byte-identical copies inside
Obsidian vaults (Die-Kessler-Zwillinge, Scruffy-der-Weltenhund, OpenNovelWriter),
with no version control anywhere. It is now versioned here as the single source
of truth.
Contents (novel/):
- .opencode/agent/ OpenNovelAgent (primary) + LineEditor, Proofreader,
StyleAnalyst, ContinuityEditor, StoryReviewer, Translator, Importer,
Illustrator, CopyrightWatchdog
- .opencode/command/ import.md, init.md
- .opencode/languages.yaml, .opencode/opencode.json (pristine: default_agent)
- docs/SCHEMA.md canonical schema — the newer OpenNovelWriter revision, which
supersedes the stale copy in the Scruffy vault (adds workspace = book,
images/prompts + images/generated, parallel books, rewrites section 7)
- templates/ AGENTS.md placeholder + DATA/{wiki,timeline,glossary}.yaml.md, style.md
- sync-to-vault.sh dry-run by default; --apply backs up what it replaces and
never touches DATA/, AGENTS.md, chapters or a vault's own opencode.json
- PACK-NOTES.md per-file md5 provenance and the verified cross-vault comparison
Verified before committing: all 10 agents, both commands, languages.yaml and
start.sh are md5-identical across the three vaults.