skills/writing-outline/SKILL.md
Internal skill for creating detailed section outlines. Called by /writing workflow after PRECIS and master OUTLINE are complete.
npx skillsauth add edwinhu/workflows writing-outlineInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Create a detailed outline for a specific section/part before drafting prose. This is Level 3 of the progressive expansion workflow.
.planning/PRECIS.md # Level 1: Thesis, claims, audience
↓
.planning/OUTLINE.md # Level 2: Master structure (sections, goals)
↓
outlines/Part I.md # Level 3: THIS STEP - Detailed section outline
↓
drafts/Part I.md # Level 4: Prose expansion
Never skip to prose drafting without a detailed outline first.
Auto-load all constraints matching applies-to: writing-outline:
!uv run python3 ${CLAUDE_SKILL_DIR}/../../scripts/load-constraints.py writing-outline
You MUST have these constraints loaded before proceeding. No claiming you "remember" them.
START (PRECIS + master OUTLINE exist)
│
├─ Step 1: Load context (PRECIS, OUTLINE, ACTIVE_WORKFLOW) + the DOMAIN structure template
│ (writing-{domain} → section-role structure, before outlining a section)
│
├─ Step 2: Select section (user choice or next unoutlined)
│
├─ Step 3: Gather structure/depth preferences
│
├─ Step 4: Create detailed outline
│ └─ One topic-sentence BULLET per paragraph; sub-bullets = its evidence/ideas
│ Opening → Body (subsections with transitions) → Closing
│
├─ Step 5: Cross-reference with PRECIS claims
│ └─ Verify: advances claim, within scope, thesis thread
│
├─ Step 6: Update ACTIVE_WORKFLOW.md
│
└─ More sections remaining?
├─ YES → Loop to Step 2 (NO pause, NO "should I continue?")
└─ NO → GATE: Every OUTLINE section has outlines/ file?
├─ NO → Report missing, loop back
└─ YES → Outline Review Gate
└─ Dispatch writing-outline-reviewer subagent
├─ APPROVED → IMMEDIATELY load writing-draft (no pause)
└─ ISSUES_FOUND → fix outlines → re-dispatch (max 5)
If text and flowchart disagree, the flowchart wins.
<EXTREMELY-IMPORTANT> ## The Iron Law of Outline Before ProseNO PROSE WITHOUT OUTLINE. Never skip to prose drafting without a detailed outline in outlines/ first. This is not negotiable.
If you find yourself writing prose without a matching outline file:
Thin outlines produce thin drafts. Each outline must be a list of paragraph TOPIC-SENTENCE bullets (each a full claim), with supporting evidence/ideas as sub-bullets. </EXTREMELY-IMPORTANT>
Before starting, check for an existing handoff:
.planning/HANDOFF.md existsRead(".planning/ACTIVE_WORKFLOW.md")
Read(".planning/PRECIS.md")
Read(".planning/OUTLINE.md")
If master OUTLINE.md is missing, run writing-brainstorm first.
Also load the domain's structure template (same phase-ordering rule as writing-setup Step 3a).
The master OUTLINE pins each section's PLACE in the document, but a section's internal outline
depends on its ROLE — a "Proof of the Claim" Part is structured differently from a "Background"
Part. That role-structure lives in the domain skill, so read its document-structure section
BEFORE outlining a section (keyed on style in ACTIVE_WORKFLOW.md / ## Domain in PRECIS):
| Domain | Read |
|---|---|
| legal | ${CLAUDE_SKILL_DIR}/../../skills/writing-legal/SKILL.md → "Law Review Article Structure" (what a Background vs Proof vs Conclusion section does) |
| econ | ${CLAUDE_SKILL_DIR}/../../skills/writing-econ/SKILL.md → its document-structure section |
| general | ${CLAUDE_SKILL_DIR}/../../skills/writing-general/SKILL.md → its structure guidance |
Outline each section to fit its role in that template (e.g. legal: keep Background from exceeding the Proof; make a Proof section argument-and-evidence, not just exposition).
If not specified by user, present available sections:
AskUserQuestion(questions=[
{
"question": "Which section should I outline in detail?",
"header": "Section",
"options": [
{"label": "Part I / Introduction", "description": "Hook, thesis, roadmap"},
{"label": "Part II / Background", "description": "Context and precedents"},
{"label": "Part III / Argument", "description": "Main claims and evidence"},
{"label": "Part IV / Counterarguments", "description": "Objections and responses"}
],
"multiSelect": false
}
])
For the selected section, ask clarifying questions:
AskUserQuestion(questions=[
{
"question": "How should this section be structured?",
"header": "Structure",
"options": [
{"label": "Chronological", "description": "Events/developments in time order"},
{"label": "Thematic", "description": "Grouped by topic or concept"},
{"label": "Problem-Solution", "description": "Issue then resolution"},
{"label": "Comparative", "description": "Side-by-side analysis"}
],
"multiSelect": false
},
{
"question": "What level of detail do you want?",
"header": "Depth",
"options": [
{"label": "Paragraph-level", "description": "One bullet per paragraph"},
{"label": "Sentence-level", "description": "Key sentences mapped out"},
{"label": "Full skeleton", "description": "Nearly complete argument structure"}
],
"multiSelect": false
}
])
Create directory if needed and write the detailed outline:
mkdir -p outlines
Write to outlines/[Section Name].md (the filename stem MUST equal the ### [Section Name] heading in .planning/OUTLINE.md ## Structure — the section index pairs them; a (Outline) suffix is tolerated but match the OUTLINE.md heading exactly):
---
implements: [CLAIM-XX, CLAIM-YY] # the claims primary-homed to this section in OUTLINE.md
---
# [Section Name] - Detailed Outline
## Section Goal
[From master OUTLINE.md - what this section accomplishes]
## Claim Supported
[Which claim(s) from PRECIS.md this section advances — same CLAIM-XX as the frontmatter]
## Structure: [Chronological/Thematic/Problem-Solution/Comparative]
---
> **FORMAT — this is the contract with the draft phase, follow it exactly.** Each top-level bullet
> `-` is ONE PARAGRAPH, and the bullet text IS that paragraph's TOPIC SENTENCE: a full claim that
> carries the argument (NOT a label, NOT a topic — "The minimum offer period is the only guaranteed
> window in which an outsider can build a blocking position," not "the accumulation window").
> Sub-bullets are that paragraph's supporting evidence/ideas, each with its `[@bibkey]`/authority
> pinned. **Read the top-level bullets top to bottom — they ARE the argument** (that is the Step-5
> check). The draft expands each top-level bullet into a paragraph led by that sentence, developed
> IN PROPORTION to its weight (a minor bullet may merge into a neighbor; a pivotal one may run
> several paragraphs). One identical paragraph per bullet is the flat-prose failure mode — proportional
> is the goal. Optional `### A. Name` group headers may bracket runs of bullets, but the BULLET is
> the paragraph, never the header.
> **`## Opening` / `## Body` / `## Closing` below are SCAFFOLDING labels — they organize this outline,
> they are NOT document headings. The draft renders Opening as the unheaded lead paragraph(s), Body as
> the lettered `## A./B./C.` subsections, and Closing as a trailing UNHEADED bridge — never a "Closing"
> or "Conclusion" heading. Only the section title and the lettered subsections become real headings.
> EXCEPTION by section ROLE: only PARTS (Part I/II/III) get lettered `## A./B./C.` subsection headings.
> An INTRODUCTION or CONCLUSION renders as CONTINUOUS UNHEADED prose even if its Body is grouped A/B/C
> — there the groupings guide paragraph ORDER only, and the section's sole heading is its title.**
## Opening
- [Topic sentence of the opening paragraph — a full claim that frames the section and picks up the prior section]
- context the reader needs
- transition from the previous section (what it established)
## Body
- [Topic sentence — paragraph 1's claim, a full sentence]
- supporting evidence / idea — [@bibkey or named authority]
- supporting evidence / idea
- [Topic sentence — paragraph 2's claim]
- support — [@bibkey]
- anticipated objection + response (if this paragraph carries one)
- [Topic sentence — paragraph 3's claim]
- support
- […one top-level bullet PER PARAGRAPH the section needs — the bullets in order are the section's spine]
## Closing
- [Topic sentence of the closing paragraph — the section's payoff]
- bridge to the next section / thesis thread
---
## Sources Used in This Section
- [@bibkey] — used for [what]
## Open Questions
- [Anything unresolved before drafting]
## Estimated Length
[Paragraph count = number of top-level bullets]
Verify the detailed outline against PRECIS.md:
Topic-sentence argument check (do this every time): read the TOP-LEVEL BULLETS in document order, ignoring all the sub-bullets underneath. Do they form a coherent argument on their own — each a claim that follows from the last and advances the thesis? If the top-level spine doesn't carry the argument, the outline is a topic list, not an argument; sharpen the bullets (or reorder them) before drafting. This is the single best predictor of whether the draft will read like reasoning or like filler.
Report any misalignments.
Update .planning/ACTIVE_WORKFLOW.md:
phase: outline
current_section: [section name]
outlines_complete:
- [list of completed outlines]
After completing a section outline, IMMEDIATELY start the next section. Do NOT:
Pausing between section outlines is procrastination disguised as courtesy.
When ALL sections from OUTLINE.md have detailed outlines in outlines/, proceed to the draft phase.
When outlining reveals unplanned issues, follow the deviation rules from constraints/deviation-rules.md:
Track deviations per section outline. Each section summary should include: Deviations: N auto-fixed (R1: X, R2: Y, R3: Z). R4 escalations: [list or "none"].
Before proceeding to draft phase (see constraints/gate-function-standard.md for the full 6-step gate including SUMMARY):
outlines/outlines/, compare against sections in OUTLINE.md${CLAUDE_SKILL_DIR}/../../skills/writing-outline-reviewer/SKILL.md, then Read() the output.
Follow the reviewer skill instructions: dispatch the subagent, handle APPROVED/ISSUES_FOUND, fix and re-review up to 5 times. Only proceed when APPROVED.human-verify — auto-advance to writing-draft..planning/PHASE_SUMMARY.md (see constraints/phase-summary-frontmatter.md):
Skipping the outline verification is NOT HELPFUL — the user drafts from a thin outline and rewrites every section. You must verify every outline exists and has real structure.
Proceeding to draft with a thin outline is NOT HELPFUL — every section will wander and require complete redrafting. The reviewer must confirm depth before drafting begins.
Before finalizing each outline, verify:
If 5+ iterations on the same section without meaningful progress, STOP and escalate to the user for scope adjustment.
Signs you are stuck:
When escalating, present:
Spinning without progress is anti-helpful. Recognizing when to ask for guidance is competence, not weakness.
| Problem | Fix | |---------|-----| | Outline is just topic list | Rewrite each item as a full topic-sentence claim (one per paragraph); put evidence/ideas in sub-bullets | | No sources mapped | Go back to research or brainstorm | | Section doesn't advance a claim | Rethink why it exists | | Too long for one section | Split into multiple sections | | Transitions missing | Add explicit bridges |
After all section outlines are complete:
Read ${CLAUDE_SKILL_DIR}/../../skills/writing-outline-reviewer/SKILL.md and follow its instructions.
Follow the outline reviewer's instructions:
After outline review APPROVED:
Read ${CLAUDE_SKILL_DIR}/../../skills/writing-draft/SKILL.md and follow its instructions.
Then follow its instructions immediately to expand outlines into prose.
development
Build the meeting-level proxy-voting × ownership panel on the WRDS SGE grid — ISS N-PX fund votes reduced to (item × block) direction cells, joined to institutional and mutual-fund ownership. Use when working with risk.voteanalysis_npx, N-PX fund-level votes, ISS→CRSP fund linking, index/passive/active voting blocks, or a proxy-voting panel that needs ownership attached.
development
Use when "CRSP CIZ", "CRSP v2", "CRSP flat file format 2.0", "crsp.dsf_v2 / msf_v2", "StkDlySecurityData", "StkMthSecurityData", "StkSecurityInfoHist", "stocknames_v2", "DlyRet / MthRet / DlyPrc / MthPrc", "SHRCD or EXCHCD equivalent in new CRSP", "SIZ to CIZ migration", "CRSP data after 2024", "CRSP delisting returns", "CRSP cumulative adjustment factors", "CRSP index INDNO / INDFAM", or any CRSP stock/index query where the legacy SIZ column names no longer exist.
development
Use when linking or deduping datasets by entity name rather than a shared key — 'fuzzy match', 'fuzzy name matching', 'entity resolution', 'record linkage', 'match company/person names', 'dedupe entity names', 'name-based join', 'bridge identifiers' (CIK ↔ permno ↔ gvkey ↔ wficn ↔ EIN ↔ personid), or any use of char n-gram TF-IDF, cosine similarity on names, `sparse_dot_topn`, or RapidFuzz at scale.
development
Use when building a publication-quality table in Python — 'regression table', 'results table', 'summary statistics table', 'etable', 'coefplot', 'great_tables', 'GT', 'gt table', 'format a table for the paper', 'export table to LaTeX/HTML', significance stars, spanners, or column formatting for a table headed into a paper, slide deck, or notebook.