Create or edit PowerPoint (.pptx) presentations in Slide Forge style by delegating to Storyteller, Smith, and Critics.
This is a skill that orchestrates Slide Forge-style PowerPoint creation/editing using:
slide-storyteller (agent): researches, collects sources, writes academic-quality narrative, compresses to bullet plan.slide-smith (agent): builds PPTX from the bullet plan and visual spec.slide-crucible (agent): challenges strategic choices and provokes reflection on alternatives (strategy).slide-gauge (agent): enforces formatting/structure rules (syntax).slide-assayer (agent): enforces content quality, narrative coherence, and reader comprehension (semantics).slide-wanderer (agent): simulates a naive reader evaluating audience comprehension without source context (Phase 3 only).If the runtime cannot spawn agents, redirect to the slide-anvil skill which includes the Enhanced Smith Fallback procedure.
Use this skill whenever the user requests:
This skill is invoked via:
/slide-forge:forge command (new presentation)/slide-forge:reforge command (editing existing presentation)The caller (the agent processing the user's request) acts as supervisor and coordinates all agents through the .slide-forge/ shared workspace.
.slide-forge/)All agents communicate through files in the .slide-forge/ directory. The supervisor creates this directory in Phase 0.
.slide-forge/
├── config.json # Session config (topic, audience, purpose)
├── sources/ # Storyteller's collected materials
│ ├── user-provided/ # User's source files
│ ├── web/ # Web search results
│ ├── images/ # Collected images
│ └── source-index.json # Source registry
├── narrative/ # Storyteller's outputs
│ ├── narrative-full.md # Integrated narrative (meta + outline + prose)
│ ├── slide-plan.md # Bullet-compressed plan
│ └── visual-spec.md # Per-slide visual specs
├── build/ # Smith's outputs
│ ├── create_slides.py # Generated Python script
│ ├── output.pptx # Generated PPTX
│ ├── extracted-text.md # markitdown extracted text (Phase 3)
│ ├── figures/ # Code-generated visualization PNGs
│ └── rendered/ # Rendered slide images
└── feedback/ # Critics' outputs
├── crucible-report.md # Strategic reflection
├── gauge-report.md # Syntax/structure report
├── assayer-report.md # Semantic/depth report
├── wanderer-report.md # Naive reader comprehension report (Phase 3 only)
├── merged-actions.md # Merged fix instructions
└── smith-escalation.md # Smith's escalation report (when content changes needed)
Agents reference rules, style guides, and API docs via relative links in their definitions. When spawning agents, include the relevant absolute paths so the agent can read them directly without searching:
| Reference | Path | Used by |
|---|---|---|
| Rules (canonical) | plugins/slide-forge/references/rules.md | Storyteller, Gauge, Assayer |
| Style guide | plugins/slide-forge/references/style-guide.md | Gauge, Assayer |
| Narrative format | plugins/slide-forge/references/narrative-format.md | Storyteller |
| Phase 1 examples | plugins/slide-forge/references/phase1-examples.md | Storyteller |
| Slide-forge API | plugins/slide-forge/skills/slide-anvil/slide-forge-api.md | Smith (via slide-anvil skill) |
Include the relevant paths in the spawn prompt. Example:
Reference files:
- Rules: plugins/slide-forge/references/rules.md
- Narrative format: plugins/slide-forge/references/narrative-format.md
- Phase 1 examples: plugins/slide-forge/references/phase1-examples.md
Smith loads the slide-anvil skill which links to slide-forge-api.md. As a fallback, the Supervisor SHOULD also include the absolute path plugins/slide-forge/skills/slide-anvil/slide-forge-api.md in Smith's spawn prompt, in case the skill fails to load at runtime.
Use this table when constructing spawn prompts. Each row lists exactly what to include. Detailed phase logic remains in the Orchestration Procedure below. If this table and the procedure conflict, the procedure section is authoritative.
| Agent | Phase | Input files | Reference files | Key instruction | Exclude |
|---|---|---|---|---|---|
| Storyteller | 1a (narrative) | config.json, source file paths | rules.md, narrative-format.md, phase1-examples.md | "Execute Phase 0 + 1a. Stop after narrative-full.md." | -- |
| Storyteller | 1a (post-Crucible, DEEPEN) | crucible-report.md | rules.md, narrative-format.md, phase1-examples.md | "Read crucible report. Execute reflection response + bullet compression + visual specification + flow check." | -- |
| Storyteller | 1a (post-Crucible, PROCEED) | crucible-report.md | rules.md, narrative-format.md, phase1-examples.md | "Execute bullet compression + visual specification + flow check." | -- |
| Storyteller | 1b (revision) | merged-actions.md | rules.md, narrative-format.md, phase1-examples.md | "Fix flagged issues. Do NOT rewrite unflagged slides." | -- |
| Storyteller | 3 (escalation) | smith-escalation.md, slide-plan.md, visual-spec.md | -- | "Revise only affected slides." | -- |
| Crucible | 1a | narrative-full.md | -- | -- | -- |
| Gauge | 1b | slide-plan.md | rules.md, style-guide.md | "Phase 1 -- plan text only, no images." | -- |
| Gauge | 3 | extracted-text.md, rendered images, slide-plan.md | rules.md, style-guide.md | -- | -- |
| Assayer | 1b | narrative-full.md, slide-plan.md | rules.md, style-guide.md | "Phase 1 -- narrative + plan text, no images." | -- |
| Assayer | 3 | extracted-text.md, rendered images, slide-plan.md | rules.md, style-guide.md | -- | -- |
| Wanderer | 3 | extracted-text.md, rendered images | -- | "Naive reader. Evaluate from slides alone." | slide-plan.md, narrative-full.md, visual-spec.md, all source files |
| Smith | 2 (build) | slide-plan.md, visual-spec.md, sources/images/ | (via slide-anvil skill; fallback: slide-forge-api.md) | -- | -- |
| Smith | 3 (revision) | merged-actions.md, slide-plan.md, visual-spec.md | (via slide-anvil skill; fallback: slide-forge-api.md) | "Fix flagged issues. Do NOT rebuild unflagged slides." | -- |
Wanderer isolation rule: Wanderer's spawn prompt must be constructed independently -- never copy from Gauge/Assayer and edit. See Wanderer Input Safeguard in Phase 3.
Reforge note: For content-only reforge (/reforge with content changes but no template change), the Supervisor skips Phase 1 and spawns Smith directly at Phase 2. The Smith rows above apply. See the Reforge section in the Orchestration Procedure for the full content-only reforge flow.
Inputs may include:
Outputs must include:
.slide-forge/build/output.pptx),.slide-forge/build/rendered/),markitdown output).slide-forge/ already exists:
.slide-forge/config.json with topic, audience, purpose, source paths from user input..slide-forge/sources/user-provided/.slide-storyteller with:
.slide-forge/config.json path,rules.md, narrative-format.md, phase1-examples.md (see Reference Files).narrative-full.md. Do NOT proceed to bullet compression."narrative-full.md exists and contains at least one ## Slide header.slide-crucible with path to .slide-forge/narrative/narrative-full.md.
.slide-forge/feedback/crucible-report.md.slide-storyteller with:
rules.md, narrative-format.md, phase1-examples.md (see Reference Files)..slide-forge/feedback/crucible-report.md. Execute Phase 1b (reflection response), Phase 1c (bullet compression), Phase 1d (visual spec)."slide-storyteller with:
rules.md, narrative-format.md, phase1-examples.md (see Reference Files)..slide-forge/feedback/crucible-report.md, then execute Phase 1c (bullet compression) and Phase 1d (visual spec)."slide-plan.md exists with at least one [Major Title] + ▌ block. Verify visual-spec.md exists.slide-gauge with path to .slide-forge/narrative/slide-plan.md.
rules.md, style-guide.md (see Reference Files)..slide-forge/feedback/gauge-report.md.slide-assayer with paths to .slide-forge/narrative/narrative-full.md and slide-plan.md (can run in parallel with gauge).
rules.md, style-guide.md (see Reference Files)..slide-forge/feedback/assayer-report.md..slide-forge/feedback/merged-actions.md, [Spawn Storyteller — Phase 1b revision] with:
.slide-forge/feedback/merged-actions.md,rules.md, narrative-format.md, phase1-examples.md (see Reference Files),slide-plan.md, visual-spec.md, and narrative-full.md as needed. Do NOT rewrite unflagged slides."If Phase 1b reaches the iteration cap (3 iterations) without both critics returning PASS:
slide-plan.md and visual-spec.md.config.json listing all unresolved FAIL items from the final Gauge/Assayer reports.slide-smith with paths to:
.slide-forge/narrative/slide-plan.md.slide-forge/narrative/visual-spec.md.slide-forge/sources/images/output.pptx exists in .slide-forge/build/. Verify PNG count in rendered/ equals expected_slide_count from config.json. If fewer, Smith must re-render before proceeding.Run markitdown on .slide-forge/build/output.pptx and save output to .slide-forge/build/extracted-text.md.
uv run python -m markitdown .slide-forge/build/output.pptx > .slide-forge/build/extracted-text.md
Spawn Phase 3 critics in parallel, passing .slide-forge/build/extracted-text.md as the extracted text source:
Gauge and Assayer (can run in parallel):
slide-gauge with extracted-text.md + rendered image paths + slide-plan.md (context).
Reference paths: rules.md, style-guide.md (see Reference Files).
Output: PASS or FAIL, saved to .slide-forge/feedback/gauge-report.md.slide-assayer with extracted-text.md + rendered image paths + slide-plan.md (context).
Reference paths: rules.md, style-guide.md (see Reference Files).
Output: PASS or FAIL, saved to .slide-forge/feedback/assayer-report.md.Wanderer (runs in parallel with above, but uses a DIFFERENT input set):
Construct this spawn prompt FROM SCRATCH -- do NOT copy from the Gauge/Assayer block above.
slide-wanderer with ONLY these inputs:
extracted-text.mdrendered/slide-*.png)slide-plan.md. NO narrative-full.md. NO visual-spec.md. NO source files.narrative-full.md, slide-plan.md, or any source documents. Evaluate audience comprehension from the slides alone.".slide-forge/feedback/wanderer-report.md. The report includes a write-back — Wanderer's own statement of what it understood from each slide.[Wanderer Write-Back Verification]: After Wanderer completes, the Supervisor compares Wanderer's per-slide write-back ("내가 이해한 메시지: ___") against the intended message from slide-plan.md. If Wanderer's understanding diverges from the intended message on any slide, that slide is a communication failure — even if Wanderer marked it as understood. Add mismatched slides to the merged feedback as FAIL items with the discrepancy noted.
[Critic Synchronization Barrier]: Before merging, the Supervisor MUST verify that ALL parallel critics have completed and their report files exist:
gauge-report.md, assayer-report.md, and wanderer-report.md all exist in .slide-forge/feedback/.PASS or FAIL).If any critic returns FAIL: merge feedback into .slide-forge/feedback/merged-actions.md, pass to Smith for revision.
[Escalation Check]: After Smith revision, check if .slide-forge/feedback/smith-escalation.md exists and is non-empty.
smith-escalation.md, slide-plan.md, visual-spec.mdslide-plan.md and visual-spec.md. Do NOT rewrite unaffected slides."smith-escalation.md, then re-submit to critics (step 14).Max 3 iterations total (escalation counts as part of the iteration, not a separate loop). See Iteration Counter Definition for what constitutes one iteration.
.slide-forge/build/output.pptx to the user.Important notes:
slide-crucible runs only in Phase 1a (strategic reflection). It does NOT participate in Phase 1b/2/3 iteration loops.slide-wanderer runs only in Phase 3 (post-build). It does NOT participate in Phase 1b. It must NOT receive narrative-full.md, slide-plan.md, or source documents..slide-forge/, instruct the next agent to read the file directly (not from cached prompt content).Lightweight checks the supervisor runs before phase transitions:
| Transition | Validation |
|---|---|
| Phase 1a: narrative → Crucible | narrative-full.md exists, contains ## Slide header(s). Completeness: count ## Slide headers — record as expected_slide_count in config.json. |
| Phase 1a: compression → Phase 1b | slide-plan.md exists with [Major Title] + ▌ block(s). visual-spec.md exists. Completeness: count [Major Title] blocks in slide-plan.md — must match expected_slide_count from narrative. |
| Phase 1b → Phase 2 | Gauge PASS + Assayer PASS (or Phase 1b iteration cap reached — see Phase 1b Cap Behavior) |
| Phase 2 → Phase 3 | output.pptx exists in .slide-forge/build/. Completeness: count PNGs in rendered/ — must equal number of [Major Title] blocks in slide-plan.md. If count mismatches, Smith must re-render before proceeding. |
| Phase 3 → Phase 4 | Gauge PASS + Assayer PASS + Wanderer PASS (or all blocking items resolved — see Advisory Downgrade Gate Rule) |
The Supervisor derives and tracks expected_slide_count to prevent incomplete artifacts from passing gates:
## Slide headers in narrative-full.md after Phase 1a completes. Store in config.json as expected_slide_count.[Major Title] blocks in slide-plan.md. Must equal expected_slide_count. If fewer, Storyteller omitted slides — block transition and request completion.rendered/. Must equal expected_slide_count. If fewer, Smith's render was partial — block transition and request re-render.extracted-text.md contains fewer slide sections than expected, flag it in their report.Agents may cache file contents from their prompt context. To prevent this:
config.json has a phases field with timestamps, verify the timestamp is current before passing to the next agent.| Phase | Gauge receives | Assayer receives | Wanderer receives |
|---|---|---|---|
| Phase 1b (Plan) | slide-plan.md (text only) | narrative-full.md + slide-plan.md (text only) | (does not run in Phase 1b) |
| Phase 3 (Post-build) | extracted-text.md + Rendered images (PNG) + slide-plan.md (context) | extracted-text.md + Rendered images (PNG) + slide-plan.md (context) | extracted-text.md + Rendered images (PNG) only — NO narrative-full.md, NO slide-plan.md, NO source docs |
Rules:
.py script files). Always send extractable evidence.slide-plan.md alongside extracted text for context in Phase 3.IMPORTANT: When spawning Wanderer in Phase 3, the Supervisor MUST NOT copy the Gauge/Assayer spawn prompt and reuse it for Wanderer. Gauge and Assayer receive
slide-plan.mdas context; Wanderer must NOT. Construct the Wanderer spawn prompt independently using onlyextracted-text.mdand rendered image paths.
When passing Crucible output back to the Storyteller, use this structure:
## Strategic Reflection Feedback
### Slide-Crucible: [DEEPEN|PROCEED]
[Full Crucible output — implicit strategy, challenges, reflection prompts, alternative sketch]
### Response Required
Storyteller must respond to EVERY reflection prompt below:
1. [prompt] → Storyteller: [reasoning]
2. [prompt] → Storyteller: [reasoning]
...
### Plan Revision Summary
[What changed and why, or explicit defense of current approach]
The Storyteller's response is part of the narrative artifact — it documents the strategic reasoning behind the deck. This reasoning is visible to Gauge and Assayer for context but is not subject to their PASS/FAIL criteria. Wanderer does NOT receive this reasoning (it must remain a naive reader).
When passing Critic output back to the Actor (Storyteller in Phase 1b, Smith in Phase 3) for revision, use this structure. In Phase 1b, only Gauge and Assayer sections are present. In Phase 3, all three critics are included:
## Iteration N Feedback
### Slide-Gauge: [PASS|FAIL]
[Full Slide-Gauge output -- verdict, slide-by-slide issues, fix instructions, minimum patch]
### Slide-Assayer: [PASS|FAIL]
[Full Slide-Assayer output -- verdict, prioritized issues, slide-by-slide critique, flow repair]
### Slide-Wanderer: [PASS|FAIL] (Phase 3 only)
[Full Slide-Wanderer output -- verdict, comprehension summary, slide-by-slide notes, concept introduction map]
Rules:
The Supervisor follows these three steps to produce merged-actions.md. The goal is a prioritized action list, not a perfectly deduplicated merge -- the Actor (Smith/Storyteller) handles overlapping items naturally when fixing.
Step 1 -- Collect and label: Read each critic report. Copy every actionable item (anything requiring a fix) into a flat list. Label each with a sequential number, its source, and the slide number:
#1 [Slide N] [G]: [issue + fix instruction from Gauge]
#2 [Slide N] [A]: [issue + fix instruction from Assayer]
#3 [Slide N] [W]: [issue + fix instruction from Wanderer] (Phase 3 only)
Sequential numbers (#1, #2, ...) reset each iteration. They exist only to make cross-iteration comparison possible (see Step 2 and Termination Rules).
Step 2 -- Apply priority rules: Review the collected list and apply these three rules:
merged-actions.md. Match items across iterations by slide number + source label (e.g., an item on Slide 3 from [G] in iteration 1 corresponds to an item on Slide 3 from [G] in iteration 2 if it addresses the same underlying issue). Mark matched items as RECURRING (existed before, not fixed) or REGRESSED (was passing, now failing). New items need no tag.Step 3 -- Write output: Save to .slide-forge/feedback/merged-actions.md using this template:
## [Phase] Iteration [N] -- Merged Actions
### Required Actions
#1 [Slide 2] [G]: [fix instruction]
#2 [Slide 3] [A]: [fix instruction] -- RECURRING
#3 [Slide 5] [W]: [fix instruction]
...
### Regression Alert
(Items that were passing but now fail. If none: "None.")
- #4 [Slide 4] [G]: [what regressed] -- REGRESSED
### Advisory (not blocking)
(Wanderer items downgraded due to conflict with Gauge/Assayer. Omit section if none.)
- #5 [Slide 7] [W]: [issue] -- conflicts with Gauge rule on same slide
Before overwriting, rename the existing merged-actions.md to merged-actions-iter-[N-1].md to preserve history for iteration tagging.
Important: The unabridged critic reports remain in their individual files (gauge-report.md, assayer-report.md, wanderer-report.md). The Actor receives BOTH the individual reports AND merged-actions.md. The merged list tells the Actor what to fix and in what order; the individual reports provide full context for each fix.
Save the merged feedback to .slide-forge/feedback/merged-actions.md.
An iteration is defined as one complete critic execution round — the cycle where all applicable critics run and produce reports. Activities between critic rounds (Smith rebuilds, Storyteller targeted revisions, escalation handling) are part of the current iteration, not separate iterations.
Example for Phase 3:
The counter increments only when critics are re-spawned (steps 7-8 in Phase 1b, step 14 in Phase 3).
[Slide 3] [G]) remain tagged RECURRING across 2 consecutive iterations with no meaningful change in the fix attempt, escalate to the user rather than looping further.REGRESSED), prioritize it above all NEW issues in the next iteration. If 3+ items regress in a single iteration, pause and escalate to the user — the revision strategy may need rethinking.When all blocking items in merged-actions.md are resolved but advisory items remain (downgraded W-## items), the phase outcome depends on the critics' raw verdicts:
When editing an existing presentation (/slide-forge:reforge), the supervisor first performs a scope assessment:
| Change Type | Examples | Storyteller? |
|---|---|---|
| Structural | Add/delete slides, reorder, restructure narrative arc | Yes (full pipeline from Phase 1a) |
| Content | Update data, fix text, replace visuals | No (Smith direct from Phase 2) |
| Ambiguous | Unclear scope | Ask user to clarify |
The first step in reforge is always: "이 변경은 구조적 변경(슬라이드 추가/삭제/순서변경)인가, 내용 수정(데이터 갱신/텍스트 교정)인가?"
Before Smith starts a content-only reforge, the Supervisor MUST verify that existing .slide-forge/narrative/ artifacts match the current PPTX:
markitdown on the existing PPTX to get current slide text.markitdown output and compare against [Major Title] blocks in slide-plan.md. If counts differ, the artifacts are stale.[Major Title] in slide-plan.md. Minor wording differences are acceptable; completely different titles indicate staleness.config.json. Smith should use the extracted text as the primary reference, with slide-plan.md as secondary context only.slide-plan.md and applies edits.This check prevents Smith from working with stale plans that no longer reflect the actual deck content (e.g., after manual edits in PowerPoint).
If agent spawning is unavailable, redirect to the slide-anvil skill which includes the Enhanced Smith Fallback Workflow. See slide-anvil SKILL.md.
The Enhanced Smith fallback self-executes the same pipeline in role-switching steps:
The same PASS/FAIL gates, iteration caps, and feedback formats defined above apply in fallback mode.
Before declaring "done", verify all rules in rules.md are met.