name: pptx-author description: >- STEP 2 of the PPTX-from-layouts pipeline. Write a slide deck in markdown using the [HINT: layout_name] system so each slide targets a real template layout, then lint it before rendering. Use when the user wants to "draft slides", "write a deck outline", "author presentation markdown", "add layout hints", or has a layout catalog from Step 1 and needs to turn content into slides. Pairs with pptx-profile (Step 1) and pptx-from-layouts (Step 3).
Step 2 — Author (pptx-author)
Write the deck as markdown where every slide names the exact template layout it
should land on, using [HINT: layout_name]. This is the bridge between "I know
my template's layouts" (Step 1) and "render the deck" (Step 3).
STEP 1 — PROFILE STEP 2 — AUTHOR STEP 3 — RENDER
pptx-profile pptx-author pptx-from-layouts
─────────────── ─────────────── ─────────────────
your-template.pptx slides.md (+ [HINT:]) slides.md + config
│ │ │
▼ ▼ ▼
catalog.py ──catalog.md──▶ write & lint ──slides──▶ generate.py ─▶ deck.pptx
└────────────────── config.json ───────────────────▲ (validated)
You are here: Step 2. You need the layout-catalog.md from Step 1 (or use the
bundled Inner Chapter layouts). Output is a slides.md the renderer consumes.
The contract
- Slides are separated by
---. Each begins with a title and (optionally) a hint. # Slide N: Titleor## Title— the title. Make it a claim, not a label ("Three briefs, one foundation" — not "Overview").[HINT: layout_name]— names a real layout from the Step-1 catalog. Copy the value verbatim from the catalog's Hint column. The engine fills that layout's actual placeholders.- Content matches the layout:
column-*/grid-*layouts →[Column N: Header]blocks (or**Header**- body lines).
- image-bearing layouts →
[Image: path/to.jpg]. - tabular data → a markdown table.
- everything else →
-bullets (the last resort, not the reflex).
Hints vs. Visual types — when to use which
| You have… | Author with | Why |
|---|---|---|
| A profiled template + its catalog | [HINT: real-layout-name] |
Precise: targets the exact layout. The "creating" path. |
| No catalog / unsure of layouts | **Visual: type** (e.g. process-4-phase) |
Semantic: the engine auto-picks a layout for that intent. |
[HINT:] always wins if both are present. A hint that doesn't match the template
is ignored with a warning and falls back to auto-detection — so lint first.
Lint before you render
python scripts/lint_hints.py slides.md --config your-template-config.json
# or, against the Step-1 markdown catalog:
python scripts/lint_hints.py slides.md --catalog your-template-layout-catalog.md
# no flag → validates against the bundled Inner Chapter template
The linter flags, per slide: P0 unknown hint (with a "did you mean…?"
suggestion — this will mis-render), P1 missing title, P2 bullets mixed
with a table. Exit code 2 means fix-and-re-run.
Example
# Slide 1: Personas that respond like real humans
[HINT: title-cover]
### Inner Chapter
---
# Slide 2: Three outcomes the research must achieve
[HINT: column-3-centered-a]
[Column 1: Level-set the teams]
- Confirm what's known about each athlete
[Column 2: Capture room content]
- In-home video, voice clips, phone recordings
[Column 3: Deliver for leadership]
- A visceral understanding for senior stakeholders
---
# Slide 3: Why personas are the hard part
[HINT: content-image-right-a]
[Image: assets/persona-diagram.png]
- No world model — pattern-matching only
- Bias toward agreeableness — more positive than real consumers
Typography markers (inline)
| Marker | Result | Marker | Result | |
|---|---|---|---|---|
{bold}text{/bold} |
Bold | {bullet:-} |
Dash bullet | |
{italic}text{/italic} |
Italic | {bullet:1} |
Numbered | |
{blue}text{/blue} |
Brand color | {level:N} |
Indent level |
Then what
Hand slides.md (plus the template + config) to Step 3 — pptx-from-layouts:
python ../pptx-from-layouts/scripts/generate.py slides.md -o deck.pptx \
--template your-template.pptx --config your-template-config.json --validate
For turning raw notes/source docs into a hint-tagged slides.md automatically,
the pptx-outline-architect subagent does the heavy lifting.