agentsclimarketplace

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.

Install
npx -y skills add DukeTwoCan/autonovel-agent-skills --skill autonovel-foundation

Assembled 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:

  1. Primary genre and primary engine — record each resolved value, writing None selected when the corresponding value is null.
  2. 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.
  3. Reader promises — state concrete experiences this novel must deliver.
  4. How the selected packs combine — resolve tensions between potentially competing structures, tones, or expectations.
  5. Required genre payoffs — name observable story events or outcomes.
  6. Audience-level constraints — turn the rating, audience packs, and content tags into usable limits.
  7. 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 in resolved.json's exclusions list as a literal NEVER include requirement, or None when empty.
  • {STORY_CONTRACT}: the complete bounded story-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 advanced is true: commit the validated foundation files and hand off to autonovel-drafting.
  • If advanced is false and iteration < 20: discuss with the user what to regenerate (often outline or characters), then loop back to the relevant step.
  • If advanced is false and iteration >= 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.

Keep looking

Skills are one crate of 328,083. Ordering is by how many stacks a row turns up in, so the top of any crate is what has actually been picked rather than what has the most stars.