/storm:write
Phase 3 of the STORM pipeline. Writes each outline section in parallel (one Task subagent per section), each grounded in top-k relevant sources from the research information table, with inline [n] citations.
CRITICAL: Prerequisites
- Load
storm-enginevia the Skill tool. outline.mdMUST exist (phase 2 complete). If absent, stop and instruct the user to run/storm:outlinefirst.
Completion Contract
This phase is complete iff article.md exists and every outline section (except Introduction/Conclusion/Summary placeholders) has body text. If --force is not set and it exists, skip and exit early.
Procedure
- Resolve output dir.
- Read
outline.mdandresearch/sources.json. Index sources for retrieval (simple: rank by keyword/heading overlap with the section title). - Identify sections to write — skip any whose heading is exactly "Introduction", "Conclusion", or "Summary" (these are filled in
polish). - Parallel writing — for each section, launch ONE Task subagent (single message, parallel). Each subagent:
- Receives: topic, section heading, top-k relevant sources (default
--retrieve-top-k3), the full outline for context. - Writes the section body with inline
[n]citations mapping tosources.jsonids. - If no relevant sources, writes uncited and marks
<!-- TODO: no source -->. - Returns the section markdown.
- Receives: topic, section heading, top-k relevant sources (default
- Assemble — concatenate sections in outline order under their headings into
article.md. Preserve the heading hierarchy fromoutline.md. - Verify every non-placeholder section has body. Update
run-config.json:phases.write = "completed", section count, any TODO-flagged sections.
Citation Rules
- Only cite
[n]wherenis an existingidinsources.json. Never mint a new id here. - Place
[n]immediately after the claim it supports. Multi-source claims use[1][2]. - Do not cite in placeholder sections.
Output
Report: number of sections written, number of citations used, list of sections flagged as TODO (no source), and the path to article.md.