From STORM
Provides the shared STORM methodology, artifact layout, stage-gating contract, citation hygiene, and retrieval fallback. Use when executing any /storm:* skill (generate, research, outline, write, polish). Internal knowledge; never user-invocable.
How this skill is triggered — by the user, by Claude, or both
Slash command
/storm:engineThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Internal knowledge for the STORM plugin. Encodes the methodology ported from Stanford STORM (NAACL'24 / EMNLP'24) into a Claude-native pipeline. Loaded automatically by every `/storm:*` skill.
Internal knowledge for the STORM plugin. Encodes the methodology ported from Stanford STORM (NAACL'24 / EMNLP'24) into a Claude-native pipeline. Loaded automatically by every /storm:* skill.
The pipeline has two stages and four phases. Each phase is independently runnable and resumable — completed phases are loaded from the artifact directory, never re-run.
Stage 1 (Pre-writing) Stage 2 (Writing)
research ---------> outline ---------> write ---------> polish
(persona (draft + (per-section, (summary +
discovery, refine from cited, parallel) dedup)
simulated Q&A, research)
information table)
NEVER skip stage 1. An article generated from parametric memory alone is not a STORM article — it will hallucinate citations and miss the multi-perspective grounding that defines the method. If research/ is absent, run /storm:research first.
NEVER invent citations. Every inline [n] must map to an entry in sources.json collected during research. If a section has no supporting sources, write it without citations and flag the gap in the polish phase — do not fabricate a reference.
All phases read from and write to a single per-topic directory:
<output_dir>/<slug>/
research/
personas.json # discovered personas (name + perspective + rationale)
conversations.jsonl # one record per (persona, turn): question, queries, snippets, answer
sources.json # deduplicated Information objects: {id, title, url, description, snippets}
outline.md # refined outline (markdown headings)
outline-draft.md # pre-research draft (kept for reference)
article.md # per-section draft with inline [n] citations
article-polished.md # final polished article
run-config.json # snapshot of run parameters
Stage-gating contract: a phase is considered complete when its primary artifact exists and is non-empty. Before running a phase, check its output artifact:
research complete iff research/sources.json exists and has ≥1 entry.outline complete iff outline.md exists and has ≥2 sections.write complete iff article.md exists and every outline section (except Introduction/Conclusion/Summary) has body text.polish complete iff article-polished.md exists.If complete and the user did not pass --force, skip the phase and read its artifact. Log what was skipped.
Derive <slug> from the topic by lowercasing, replacing non-alphanumeric runs with -, trimming leading/trailing -, and truncating to 60 chars. Two topics must not collide — append -2, -3, etc. if the dir already exists with a different run-config.json topic.
--output-dir <path> given → use <path>/<slug>/.--save given → use docs/storm/<slug>/ (relative to cwd; create if missing).$(mktemp -d)/storm-<slug>/. Write run-config.json with "temporary": true and inform the user of the absolute path so they can rescue artifacts if desired. Temporary dirs are NOT cleaned up by the plugin (let the OS handle it), so the user can still resume within the session.CRITICAL: prefer connected MCP search tools, fall back to built-in web search only when no MCP search tool is available.
exa-mcp-server__code-search, exa-mcp-server__research-paper-search, exa-mcp-server__company-search, exa-mcp-server__personal-site-search, exa-mcp-server__financial-report-search, exa-mcp-server__x-search.research-paper-search for academic topics, company-search for organizations).WebSearch + WebFetch.--docs <dir> argument; if given, ingest those files as an additional source pool alongside web results (or instead of, if --docs-only).Source shape (mirrors upstream Information): every source must be normalized to
{"id": 1, "title": "...", "url": "...", "description": "...", "snippets": ["..."]}
Assign sequential ids as sources are added. The id is the citation key used in inline [n].
[1] / [1][2] form, placed immediately after the claim they support.## References section lists every cited source, numbered to match, with title — url (accessed YYYY-MM-DD).strip_citations(text) -> text removing all [n] and [n][m] patterns.[n] keys present in the body.<!-- TODO: no source --> so polish can flag it.Ground personas in real structure, not hallucination — mirror STORM's "scrape related Wikipedia TOCs" step:
{"name": "...", "perspective": "...", "rationale": "..."}.For each persona, run a multi-turn dialogue between a WikiWriter (asks questions) and a TopicExpert (answers, grounded in retrieval):
question_to_query), retrieves via the retrieval contract above, and answers with inline source attribution.max_turns (default 3) is reached.(question, queries, snippets, answer) tuple into conversations.jsonl and every cited source into sources.json (deduplicated by URL).outline-draft.md) — this is the LLM's prior structure.outline.md.outline.md is the one write consumes.sources.json for retrieval.[n] citations.polish.article.md preserving outline heading structure.[n] in the body resolves to a References entry and vice versa; drop orphan entries on either side.article-polished.md.run-config.json always contains:
{
"topic": "<original topic>",
"slug": "<derived>",
"temporary": <bool>,
"output_dir": "<absolute>",
"max_perspective": 3,
"max_turns": 3,
"search_top_k": 3,
"retrieve_top_k": 3,
"retriever": "mcp" | "web" | "local",
"started_at": "<ISO from caller>",
"phases": {"research": "completed|skipped|pending", ...}
}
Timestamps: the plugin MUST NOT call date itself in deterministic contexts — accept started_at from the invoking skill via the caller's environment. In practice the invoking /storm:* skill passes the current time; storm-engine never generates timestamps.
Guides creation and editing of skills using test-driven development with pressure scenarios and subagents to verify agent compliance.
Runs a structured interview session to sharpen plans or designs, producing ADRs and a glossary as output.
Applies curated color/font themes to slides, docs, and HTML artifacts. Includes 10 preset themes and can generate custom themes on demand.
npx claudepluginhub daisycatts/dotclaude --plugin storm