Install
$ agentstack add skill-tchr-dev-autonovel-autonovel ✓ scanned · ✓ verified, works with Claude Code, Cursor, and more.
Security review
✓ PassedNo issues found. Passed automated security review. · v0.1.0 How review works →
- ✓ Prompt-injection patterns
- ✓ Secret / credential exfiltration
- ✓ Dangerous shell & filesystem operations
- ✓ Untrusted network calls
- ✓ Known-malicious package signatures
What it can access
- ✓ Network access No
- ✓ Filesystem access No
- ✓ Shell / process execution No
- ✓ Environment & secrets No
- ✓ Dynamic code execution No
From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.
Verified badge
Passed review? Show it. Paste this badge into your README, it links to the public security report.
Reliability & compatibility
Declared compatibility
Compatibility is declared by the source manifest. End-to-end runtime verification is coming, see below.
We're building live execution health for every listing: tool-call success rate, median latency, uptime, and last-checked timestamps, measured, not self-reported. It isn't live yet, so we don't show numbers we can't stand behind.
How agent discovery & health will work →About
Autonovel — pipeline orchestrator
This skill drives the full novel pipeline. It is a state machine over /state.json. Each step delegates to a specialised skill (drafting, evaluation, revision) or a Python script (mechanical work).
Inputs
The user invokes via /autonovel or /autonovel-resume . The ` resolves to = novels//` relative to the autonovel project root.
If the directory does not exist:
- Create
novels// - Initialise state:
python scripts/state.py novels// init - Copy templates:
cp templates/{voice.md,world.md,characters.md,outline.md,canon.md,MYSTERY.md} novels// - Ask the user for
seed.txtcontent (or run theseedskill if they want suggestions)
AUTONOVEL_NOVEL_DIR=novels/ is exported for child Python scripts.
Phase 0 — Setup
- Verify
seed.txtexists and is specific. A good seed has:
- A world differentiator (one specific surreal/sensory thing)
- A central tension (personal + cosmic, in conflict)
- A cost/constraint on the magic
- A sensory hook
If it's vague, push back: "the seed reads like a back-cover blurb. What does breakfast smell like in this world?"
- Verify
state.jsonhasphase: foundation. - Confirm with the user before starting. The pipeline is multi-hour.
Phase 1 — Foundation
LOOP until foundation_score > 7.5 AND lore_score > 7.0:
1. If iteration == 0:
- Run `voice-discovery` (writes voice.md Part 2)
- Run `gen-world`
- Run `gen-characters`
- Run `gen-outline`
- Ask user to fill `MYSTERY.md` (or generate it from outline if user prefers)
- Run `gen-canon`
Else (iterations 2+):
- Identify weakest layer/dimension from prior eval
- Re-run only the relevant generator with a focus instruction (e.g. "expand magic_system: add 3 societal implications, focus on cost trade-offs")
- Re-run `gen-canon` if any of world / characters changed
2. Run `evaluate-foundation`
3. If `overall_score` improved over `state.foundation_score`:
- Snapshot novel dir to `novels//.snapshots/foundation_iter_/`
- Update `state.foundation_score` and `state.lore_score`
- Append to `results.tsv` (use `scripts/results_log.py`)
Else:
- Restore the previous snapshot
- Try a different focus
4. Note the weakest dimension for the next iteration.
5. Halt the loop after 15 iterations regardless of score (operator escape).
Exit: state.phase = "drafting".
Cross-layer consistency checks every iteration:
- Outline references only lore that exists in
world.md - Character abilities match magic system rules
- Foreshadowing ledger balances (every plant has a payoff)
- Voice exemplars exist and aren't generic
- Canon contains all hard facts from world / characters
Phase 2 — First draft
N = number of chapters in outline.md (parse the "### Ch N:" headers)
state.chapters_total = N
FOR ch in 1..N:
FOR attempt in 1..5:
1. Run `draft-chapter `
2. Run `evaluate-chapter ` (which itself runs slop_scan first)
3. If overall_score > 6.0:
- Snapshot the chapter file to chapters/.history/ch_NN_v.md
- Update state.chapters_drafted += 1
- Append to results.tsv
- Append new_canon_entries to canon.md
- Break inner loop, move to next chapter
Else:
- If attempt 4,
flag for revision phase
- state.phase = "revision"
Watch for:
- Freshness decay after Ch 6. If chapters 7+ score consistently lower, push the writer to vary chapter openings and endings explicitly via the brief.
- Compounding tics. If the same AI tell appears in 3+ early chapters, hand-fix in
voice.mdPart 2 by adding it as an anti-exemplar BEFORE drafting more chapters.
Phase 3a — Automated revision
Cycle structure (3-6 cycles, plateau-detect to stop):
CYCLE C:
Diagnosis:
1. `adversarial-edit all` (writes edit_logs/chNN_cuts.json for each)
2. `apply-cuts all --types OVER-EXPLAIN REDUNDANT` (or --min-fat 17 first cycle)
3. `compare-chapters` (Swiss tournament, writes tournament_results.json)
4. `voice-fingerprint` (writes voice_fingerprint.json) — flag outliers
5. `reader-panel` (parallel 4 personas, writes reader_panel.json)
Structural fixes (act on consensus):
For each consensus item from reader_panel.json (3-of-4 or 4-of-4):
a. `gen-brief --chapter ` with shape inferred from question type
- cut_candidate → COMPRESSION
- missing_scene → EXPANSION
- thinnest_character → DEEPENING
- worst_scene / momentum_loss → DRAMATISATION
b. Snapshot chapter to chapters/.history/ before rewrite
c. `gen-revision briefs/chXX_.md`
d. `evaluate-chapter `
e. If score improved → keep. Else → restore snapshot.
Targeted fixes (act on eval callouts):
1. `evaluate-full` → top_suggestion + weakest_chapter
2. `gen-brief --chapter ` (shape inferred from weakest_dimension)
3. `gen-revision`, evaluate, keep/discard same as above
Plateau detection:
novel_score = result of evaluate-full
If |novel_score - state.novel_score| _review.md and reviews/_parsed.json
2. Read parsed.json. If parsed.stop == true: break and report.
3. For each top unqualified item (priority: major > moderate > minor):
a. `gen-brief --chapter ` (chapter inferred from item title/text)
b. snapshot, `gen-revision`, evaluate, keep/discard
c. If pattern-level (e.g. "X recurs across 4 chapters"), do a
mechanical apply-cuts pass with a custom filter
4. Re-run opus-review.
Items that persist across 3+ rounds → accept. They're structural to the
novel's voice/approach, not bugs.
Stopping conditions are computed by scripts/parse_review.py:
- ★★★★½ with 0 major items
- ≥4 stars and >50% of items qualified
- ≤2 items found
Phase 4 — Export (out of scope for the core build)
Out of scope per the user's instruction. If reached, just note it and stop.
Output to user during run
Print one block per phase transition. Inside a phase, print short progress lines per iteration / chapter:
[Phase 1, iter 4] focused: lore_interconnection
evaluate-foundation: overall=7.6 lore=7.1 ← exit threshold met
Phase 1 complete in 4 iterations. Snapshot saved to .snapshots/foundation_final.
[Phase 2] drafting 23 chapters
ch 01: drafted 3147w → eval 7.2 ✓ keep
ch 02: drafted 2980w → eval 5.4 ✗ retry
ch 02: drafted 3204w → eval 6.4 ✓ keep
...
Don't quote-dump the full eval JSON in the conversation — write it to disk and print the one-line summary.
Recovery / resume
If interrupted:
state.jsonrecordsphase,current_focus,iteration,chapters_drafted,novel_score/autonovel-resumereads state and continues from the appropriate point- All snapshots are in
/.snapshots/and per-chapter history inchapters/.history/
Source & license
This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.
- Author: tchr-dev
- Source: tchr-dev/autonovel
- License: MIT
Install and usage instructions live in the source repository linked above.
Reviews
No reviews yet, be the first.
Write a review
Versions
- v0.1.0 Imported from the upstream source.