Autonovel foundation
Skill DukeTwoCan/autonovel-agent-skills/skills/creative/autonovel-foundation
Collaboration-first Agent Skills pipeline for planning, drafting, revising, reviewing, and exporting long-form fiction.
npx -y skills add DukeTwoCan/autonovel-agent-skills --skill autonovel-foundationAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
2 things to look at
- 22 days oldThe repository was created 22 days ago. New is not bad, but a brand new repository carrying a familiar-sounding name is the shape a typosquat arrives in, and there has been no time for anyone else to find a problem with it.
- 1 stars1 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
What its author says it does
Copied from the file, not written here
Autonovel Phase 1 — build world.md, characters.md, outline.md, canon.md, voice.md from a seed concept. Iterates until foundation_score (from lib/slop_detect.py) meets the adaptive threshold. Reads $AUTONOVEL_WORKSPACE/$NOVEL_SLUG/seed.txt; writes the five foundation files; updates state.json. Hands off to autonovel-drafting when foundation_score plateaus or threshold met.
The file declares its own license as MIT. That is the author’s claim about this one file, and it is not the same thing as the license GitHub reports for the repository, which is listed with the other numbers below.
SKILL.md
11.6 KB, as published. Nobody here has run it
Autonovel — Phase 1 (Foundation)
Build the foundation of a novel: world, characters, outline, canon, voice fingerprint.
When to use this skill
- State.json shows
"phase": "foundation" - User says "let's start a new novel" or "build the foundation"
- Foundation files don't exist yet, OR they exist but foundation_score < threshold
Prerequisites
Verify workspace and seed:
!`test -f "$AUTONOVEL_WORKSPACE/$NOVEL_SLUG/seed.txt" && echo "seed ok" || echo "missing seed"`
!`test -f "$AUTONOVEL_WORKSPACE/$NOVEL_SLUG/state.json" && cat "$AUTONOVEL_WORKSPACE/$NOVEL_SLUG/state.json"`
If either is missing, hand back to the umbrella autonovel skill to set up the novel.
Workflow
The agent generates each foundation document in sequence, evaluating after the last. Use the prompts in references/ as templates — fill in the bracketed placeholders from the seed and any prior outputs.
Step 0 — Compile genre context and create the story contract
Read profile (primary_genre, primary_engine, tags, content_tags,
rating, shape, pitch) from state.json. When an explicit Foundation
revision is requested, confirm and apply the requested seed or profile changes
before compilation, then recompile the genre context with the single command
below. Without an explicit revision, leave the seed and profile unchanged.
Compile the complete resolved context once:
python ${HERMES_SKILL_DIR}/../autonovel/lib/genre_resolver.py compile --state "$AUTONOVEL_WORKSPACE/$NOVEL_SLUG/state.json" --workspace "$AUTONOVEL_WORKSPACE/$NOVEL_SLUG" --task all
Treat genre_context/story-contract.md as a persistent, create-once source of
truth. Reuse it unchanged when it already exists and no explicit Foundation
revision was requested. When it does not exist, read
genre_context/resolved.json, genre_context/compiled/contract.md, seed.txt,
the profile, and the rating definition from
${HERMES_SKILL_DIR}/../autonovel/references/ratings.md, then generate the
contract as a story-specific decision record with exactly these seven
requirements:
- Primary genre and primary engine — record each resolved value, writing
None selectedwhen the corresponding value is null. - Secondary packs and their roles — name every selected non-primary pack
and state what it contributes. This section must not list, restate, or assign
a role to either primary value from section 1, even though those IDs also
appear in
selected_pack_ids. - Reader promises — state concrete experiences this novel must deliver.
- How the selected packs combine — resolve tensions between potentially competing structures, tones, or expectations.
- Required genre payoffs — name observable story events or outcomes.
- Audience-level constraints — turn the rating, audience packs, and content tags into usable limits.
- Explicitly rejected interpretations — state plausible directions this novel will not take.
The contract must make story-specific decisions rather than summarize source
packs. Estimate its size with ceil(character_count / 4) and enforce a hard
maximum of 1,500 estimated tokens. Condense and regenerate before continuing
when it exceeds the limit; never truncate it.
After compilation, replace the existing contract only when explicit Foundation revision mode is active. Generate the replacement from the newly compiled context, rerun every contract acceptance check, and then regenerate affected Foundation documents. Routine Foundation iterations reuse the existing contract.
Foundation acceptance requires all seven labeled sections, the resolved
primary genre and primary engine (including explicit None selected values),
and every selected pack from resolved.json. Missing reader promises, required
genre payoffs, audience-level constraints, explicit rejections, or any selected
pack blocks foundation acceptance.
Gate the contract before generating any later artifact:
python ${HERMES_SKILL_DIR}/lib/validation.py contract "$AUTONOVEL_WORKSPACE/$NOVEL_SLUG"
On a nonzero exit, repair only story-contract.md from the reported stable
codes and rerun this command. Do not continue to Step 1 until it exits zero.
For every Foundation prompt, build these shared substitutions:
{GENRE_PROFILE}: the profile line with primary genre/engine, positive tags, content tags, shape, and pitch.{RATING_DEFINITION}: the profile rating and its one-line definition.{GENRE_EXCLUSIONS}: every value inresolved.json'sexclusionslist as a literalNEVER includerequirement, orNonewhen empty.{STORY_CONTRACT}: the complete boundedstory-contract.md.
If Intimacy is selected or profile.content_tags is non-empty, read
genres/special/intimacy/guardrails.md before generating characters.md.
Verify every character intended for intimate scenes has an explicit stated
adult age on the page. An unaged intimate character blocks foundation
acceptance.
If profile.content_tags is non-empty, the outline (Steps 3-4) must include a
content-tag coverage map: each content tag → the specific scene(s) that
deliver it, placed along the escalation arc described by
genres/special/intimacy/beats.md. An unmapped content tag blocks foundation
acceptance.
Step 1 — Generate world.md
Read the prompt template at ${HERMES_SKILL_DIR}/references/world-prompt.md,
the seed, genre_context/compiled/world.md, and the story contract. Substitute
the compiled packet as {GENRE_WORLD_BLOCK} plus all shared Step 0 values.
Generate world.md per the prompt. Write it to
$AUTONOVEL_WORKSPACE/$NOVEL_SLUG/world.md.
Budget: ~16k tokens of output. The world doc covers: setting, history, geography, technology/magic, social structure, economic system, and one signature aesthetic detail per system.
Step 2 — Generate characters.md
Read ${HERMES_SKILL_DIR}/references/characters-prompt.md, the seed,
world.md, genre_context/compiled/characters.md, and the story contract.
Substitute the compiled packet as {GENRE_CHARACTER_BLOCK} plus all shared
Step 0 values.
Name pools first (mandatory — see the NAME SELECTION note in the prompt file):
!`python3 ${HERMES_SKILL_DIR}/lib/namegen.py styles`
!`python3 ${HERMES_SKILL_DIR}/lib/namegen.py propose --style <style-matching-world.md> --count 30`
Generate characters.md — protagonist, 2-4 supporting cast, 1-2 antagonists, names chosen from the proposed pools. Each character: name, role, contradictions, voice signature, secret, arc. Then gate the major cast before accepting:
!`python3 ${HERMES_SKILL_DIR}/lib/namegen.py check <Name1> <Name2> <Name3> ...`
Acceptance requires exit code 0 (no distinctiveness issues). Write to $AUTONOVEL_WORKSPACE/$NOVEL_SLUG/characters.md. Budget ~12k tokens.
Step 3 — Generate outline.md (act-level)
Read ${HERMES_SKILL_DIR}/references/outline-prompt.md, seed, world,
characters, genre_context/compiled/outline.md, and the story contract.
Substitute the compiled packet as {GENRE_OUTLINE_BLOCK} plus all shared
Step 0 values. Generate the architecture pass: 4-6 scalable act ranges and a
title/primary-structure movement for every requested chapter. Write the
temporary architecture draft to
$AUTONOVEL_WORKSPACE/$NOVEL_SLUG/outline.md. Budget ~10k tokens.
Step 4 — Expand outline to scene level
Use the same prompt's scene-card pass. Read the architecture draft and expand
every chapter into the exact labeled fields, reveal budget, and 2-5 row scene
table required by the prompt. Replace outline.md with the single complete
document; do not append a second set of chapter headings. Budget ~12k tokens.
Gate the complete outline before generating canon or voice:
python ${HERMES_SKILL_DIR}/lib/validation.py outline "$AUTONOVEL_WORKSPACE/$NOVEL_SLUG"
On a nonzero exit, repair only the reported outline fields or act ranges and rerun this command. Do not continue to Step 5 until it exits zero.
Step 5 — Generate canon.md
Read ${HERMES_SKILL_DIR}/references/canon-prompt.md, all prior foundation
files, and the story contract. Substitute all shared Step 0 values. Canon uses
the story contract as its genre source of truth; do not load generic pack files
into this prompt. Generate canon: rules that MUST stay consistent — magic
system limits, world-rule edge cases, character backstory anchors, timeline
pins. Write to canon.md. Budget ~8k tokens.
Step 6 — Generate voice.md (voice fingerprint)
Read ${HERMES_SKILL_DIR}/references/voice-prompt.md, seed, characters, and
the story contract. Substitute all shared Step 0 values. Voice uses the story
contract as its genre source of truth; do not load generic pack files into this
prompt. Generate the voice fingerprint: narrative POV, tense, narrator
distance, signature rhythms, dialogue style markers, sample paragraph in the
target voice. Write to voice.md. Budget ~6k tokens.
Step 7 — Evaluate and run the hard boundary
Run:
!`python3 ${HERMES_SKILL_DIR}/lib/slop_detect.py "$AUTONOVEL_WORKSPACE/$NOVEL_SLUG/world.md" --genre-context "$AUTONOVEL_WORKSPACE/$NOVEL_SLUG/genre_context/resolved.json"`
!`python3 ${HERMES_SKILL_DIR}/lib/slop_detect.py "$AUTONOVEL_WORKSPACE/$NOVEL_SLUG/characters.md" --genre-context "$AUTONOVEL_WORKSPACE/$NOVEL_SLUG/genre_context/resolved.json"`
!`python3 ${HERMES_SKILL_DIR}/lib/slop_detect.py "$AUTONOVEL_WORKSPACE/$NOVEL_SLUG/outline.md" --genre-context "$AUTONOVEL_WORKSPACE/$NOVEL_SLUG/genre_context/resolved.json"`
Average the three scores into foundation_score, then hand that score to the
deterministic validator. This command owns score
recording, iteration changes, and the phase transition:
python ${HERMES_SKILL_DIR}/lib/validation.py complete-foundation "$AUTONOVEL_WORKSPACE/$NOVEL_SLUG" --score <avg_score>
Read the JSON result. Exit code nonzero means a hard artifact gate failed and
state.json remained byte-identical. Exit code zero with advanced: false
means the artifacts passed but the score remains below the current threshold.
Exit code zero with advanced: true means the validated foundation moved to
drafting atomically.
Step 8 — Decide: continue, regenerate, or advance
- If the validator returns issues: report their stable codes and paths, regenerate only the responsible artifact, and rerun Step 7. Never edit the phase by hand.
- If
advancedis true: commit the validated foundation files and hand off toautonovel-drafting. - If
advancedis false anditeration < 20: discuss with the user what to regenerate (often outline or characters), then loop back to the relevant step. - If
advancedis false anditeration >= 20: report to the user and ask whether to lower the threshold or accept the current foundation despite its low score. The hard gates remain non-waivable.
Step 9 — Commit
!`cd "$AUTONOVEL_WORKSPACE/$NOVEL_SLUG" && git add . && git commit -m "phase 1: foundation iteration $(python -c 'import json; print(json.load(open("state.json"))["iteration"])')"`
Handoff
When phase complete, invoke autonovel-drafting.