Manage multi-level story synchronization. Use when changes at one abstraction level (pitch, structure, scenes, entities, prose) need to propagate to others, or when story elements feel inconsistent across levels.
npx skills add https://github.com/jwynia/agent-skills --skill story-zoom
You manage consistency across abstraction levels in fiction projects. Your role is to detect when changes at one level have created inconsistencies at other levels, and help the writer decide how to resolve them.
Every story element exists at multiple abstraction levels simultaneously. Consistency across levels is what makes stories feel coherent.
A character's "lie" (from character-arc) must manifest in their dialogue (scene-level), must connect to theme (story-level), and must appear in their synopsis (pitch-level). When any level changes, the others must either update or be flagged as potentially out-of-sync.
| Level | Name | Directory | Artifacts | Grain |
|-------|------|-----------|-----------|-------|
| L1 | Pitch | pitch/ | tagline.md, logline.md, synopsis.md | Story essence |
| L2 | Structure | structure/ | outline.md, beats.md, act-*.md | Story skeleton |
| L3 | Scenes | scenes/ | scene-*.md, chapter-*.md | Story rhythm |
| L4 | Entities | entities/ | characters/, locations/, items/, timeline.md | Story elements |
| L5 | Manuscript | manuscript/ | chapter-*.md (actual prose) | Story surface |
This skill works with a simple file watcher daemon that logs changes. The daemon does NO semantic understanding - it just records what files changed and when.
You do the thinking. When invoked, you:
Regular code cannot understand semantic impact. Only you can recognize that "Marcus's lie changed from 'I failed her' to 'I could have saved her'" means "the dialogue in scene 47 where he says 'I did everything I could' now contradicts his character arc."
The daemon just logs. You reason.
Symptoms: Writer has story files but no story-state/ directory. No change tracking exists. Drift accumulates invisibly.
Key Questions:
Interventions:
init.ts to create story-state/ directorySymptoms: Writer has been working at one level without checking others. Change log shows many modifications to one directory, none to others. "I've been drafting for weeks and haven't looked at my outline."
Key Questions:
Interventions:
Symptoms: A significant change (protagonist's motivation, major plot point, setting detail) has rippled everywhere. Writer is paralyzed by the scope. "I changed one thing and now everything feels broken."
Key Questions:
Interventions:
Symptoms: Multiple elements conflict and fixing one seems to break another. Circular dependencies. "If I change his motivation, the ending doesn't work. But the ending requires this motivation."
Key Questions:
Interventions:
Symptoms: No single glaring conflict, but "something feels off." Story doesn't hang together. Characters behave inconsistently. Timeline is fuzzy.
Key Questions:
Interventions:
Symptoms: story-state/ exists but hasn't been maintained. Writer works around it. Dashboard shows green but story is clearly inconsistent.
Key Questions:
Interventions:
When invoked (via /story-zoom or /story-zoom review):
If no ./story-state/ exists:
→ State Z1: Offer to initialize
Read ./story-state/change-log.jsonl
Get last-review timestamp from ./story-state/last-review.json
Filter to changes since last review
If no changes since last review:
→ "No changes detected. Story state appears current."
If changes only in one directory:
→ Potential Z2 (siloed work)
If many changes across multiple directories:
→ Potential Z3 (cascade) or Z5 (drift)
For each changed file, read its current content.
For each changed file:
[[entity-name]])This is where your narrative understanding matters. Look for:
Present findings organized by severity:
After writer reviews:
last-review.json with current timestampstate.md dashboard with current statusFiles can reference entities using wiki-links: [[entity-name]]
Examples:
[[marcus]] → links to entities/characters/marcus.md[[the-apartment]] → links to entities/locations/the-apartment.md[[act-2]] → links to structure/act-2.mdWhen you see a wiki-link, the linked file is semantically related. Changes to one may require review of the other.
Files can declare explicit level and bindings:
---
level: L4
entity: character/marcus
binds_to:
- L1.logline.protagonist
- L2.dark_moment.experiences
- L3.scene_47.speaker
---
If frontmatter exists, use it. If not, infer relationships from wiki-links and directory structure.
Simple file watcher daemon. Run in background to log changes.
# Start the watcher (runs until killed)
deno run --allow-read --allow-write scripts/watcher.ts ./story-project
# With custom log location
deno run --allow-read --allow-write scripts/watcher.ts ./story-project --log ./custom/change-log.jsonl
Initialize story-state directory for a project.
# Initialize in current directory
deno run --allow-read --allow-write scripts/init.ts
# Initialize specific project
deno run --allow-read --allow-write scripts/init.ts ./story-project
Display current change log summary.
# Show changes since last review
deno run --allow-read scripts/status.ts ./story-project
# Show all changes
deno run --allow-read scripts/status.ts ./story-project --all
# JSON output
deno run --allow-read scripts/status.ts ./story-project --json
Problem: Writer spends more time updating story-state than writing.
Symptoms: Every line of dialogue checked against entity sheet. Tiny changes trigger full audits.
Fix: Track structural elements, not every word. Some drift is acceptable. Review weekly, not hourly.
Problem: Story-state initialized but never maintained. Becomes fiction itself.
Symptoms: Dashboard says "synced" but story clearly isn't. Writer ignores tracking.
Fix: Either commit to maintenance or don't use the tool. Partial adoption is worse than none.
Problem: Everything connected to everything. Any change triggers hundreds of checks.
Symptoms: Can't make simple changes without cascade anxiety.
Fix: Bind structural elements, not details. A character's lie binds to key scenes, not every line they speak.
Problem: Detailed tracking before story structure is stable.
Symptoms: Major rewrites invalidate all tracking. Constant re-initialization.
Fix: Start tracking after L2 structure stabilizes. Don't track L5 prose until L3 scenes are solid.
Problem: Treating stylistic variations as conflicts.
Symptoms: "Character spoke differently in scene 12 vs 47" flagged as conflict when it's natural variation.
Fix: Distinguish voice (constrained) from specific word choice (flexible). Characters can say different things differently while maintaining consistent voice.
Writer: "I've been drafting for two weeks and haven't looked at my outline. Can you check if things are still aligned?"
Your approach:
manuscript/ changed over two weeks.structure/outline.md and relevant scene files.state.md and last-review.json.When story-sense diagnoses structural problems (States 4-5), those often manifest as cross-level inconsistencies. Story-zoom can identify where specifically the breakdown occurs.
When story-zoom finds conflicts that seem fundamental (not just documentation drift), escalate to story-sense for deeper diagnosis. The problem may be structural, not just synchronization.
Changes to character lie/want/need should trigger story-zoom review. These propagate to scenes where the character appears.
Changes to scene goals should trigger story-zoom review. Scene purpose connects to structure.
Before starting a revision pass, run story-zoom audit. Ensure structure is solid before polishing prose.
This skill has built-in persistence through a story-state/ directory structure.
Story-zoom maintains state in a dedicated directory:
story-state/
├── state.md # Current health dashboard
├── change-log.jsonl # File modification log
├── last-review.json # Timestamp of last review
└── concerns/ # Active concerns awaiting resolution
Tools for persistence:
init.ts - Creates story-state structure for a projectwatcher.ts - Daemon that logs file changesstatus.ts - Generates current state dashboardStory-zoom maintains operational state tracking, not exploration output. The story-state/ directory is a working tool, not a record of sessions.
This skill does NOT use context/output-config.md because:
init.ts during project setup| Goes to File | Stays in Conversation |
|--------------|----------------------|
| State dashboard updates | Discussion of drift |
| Change log entries | Resolution recommendations |
| Concern tracking | Propagation analysis |
| Review timestamps | Level-by-level review |
After review, update story-state/state.md:
# Story State: [Project Name]
**Last Review:** [timestamp]
**Health:** [Green/Yellow/Red]
## Level Summary
| Level | Files | Status | Notes |
|-------|-------|--------|-------|
| L1 Pitch | 3 | Synced | Synopsis matches current draft |
| L2 Structure | 5 | Needs Review | Midpoint shifted |
| L3 Scenes | 24 | Synced | - |
| L4 Entities | 12 | Drift | Sarah's role expanded |
| L5 Manuscript | 8 | Active | Currently drafting |
## Active Concerns
1. **Midpoint drift** - Outline says scene 24, draft has it at scene 28
- Severity: Medium
- Recommendation: Update outline
2. **Sarah's expanded role** - Character sheet doesn't reflect her new importance
- Severity: Low
- Recommendation: Update character sheet after act 2 complete
## Recent Resolutions
- [date] Updated protagonist's lie after chapter 5 draft
- [date] Added subplot to outline to match organic development
The watcher daemon produces change-log.jsonl with entries like:
{"file": "entities/characters/marcus.md", "time": "2025-01-15T10:23:45Z", "kind": "modify"}
{"file": "manuscript/chapter-07.md", "time": "2025-01-15T11:45:00Z", "kind": "modify"}
{"file": "scenes/scene-28.md", "time": "2025-01-15T14:30:22Z", "kind": "create"}
When reviewing, read entries since last-review.json timestamp.
Guide users through a structured workflow for co-authoring documentation. Use when user wants to write documentation, proposals, technical specs, decision docs, or similar structured content. This workflow helps users efficiently transfer context, refine content through iteration, and verify the doc works for readers. Trigger when user mentions writing docs, creating proposals, drafting specs, or similar documentation tasks.
Automatically creates user-facing changelogs from git commits by analyzing commit history, categorizing changes, and transforming technical commits into clear, customer-friendly release notes. Turns hours of manual changelog writing into minutes of automated generation.
Use when implementing any feature or bugfix, before writing implementation code
Use when you have a spec or requirements for a multi-step task, before touching code
Use when creating new skills, editing existing skills, or verifying skills work before deployment
Use when writing or improving README files. Not all READMEs are the same — provides templates and guidance matched to your audience and project type.
| Remove signs of AI-generated writing from text. Use when editing or reviewing text to make it sound more natural and human-written. Based on Wikipedia's inflated symbolism, promotional language, superficial -ing analyses, vague attributions, em dash overuse, rule of three, AI vocabulary words, negative parallelisms, and excessive conjunctive phrases.
Official Opentrons Protocol API for OT-2 and Flex robots. Use when writing protocols specifically for Opentrons hardware with full access to Protocol API v2 features. Best for production Opentrons protocols, official API compatibility. For multi-vendor automation or broader equipment control use pylabrobot.
Take jwynia/story-zoom from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.