---
name: consulting-slides
description: Build consulting-standard PowerPoint decks (.pptx) with python-pptx from a brief, notes or data. Use when the user asks for a steering committee, board, client or management deck, an executive summary, a recommendation deck, or "McKinsey-style" or "consulting-style" slides. Produces action titles, one message per slide, native editable charts, source lines and an automated check.
license: MIT
---

# Consulting slides

Build a native, editable `.pptx` that a partner could review without rewriting the titles. The deck is written storyline first, then built with `scripts/deckkit.py`, then checked with `scripts/check_deck.py`.

Requirements: Python 3.9+ and `python-pptx` (`pip install python-pptx` in a virtual environment; never install globally). LibreOffice is optional, for rendering slide images.

## Workflow

Follow these steps in order. Do not start writing python-pptx code before step 3 is done.

1. **Read the brief.** Note the audience, the decision they must make, the slide budget, the data you were given and its source. If the data is invented or a sample, the deck is illustrative (see "Illustrative label").
2. **Write the storyline as a list of action titles only**, one per slide, in a file `storyline.md`. Read the titles alone, top to bottom: they must tell the whole argument. Fix the storyline here, not in code.
3. **Assign each title one exhibit** from the menu below. One message, one exhibit per slide.
4. **Write `build_deck.py`**, importing `deckkit` from this skill's `scripts/` folder. Use the helpers; do not hand-position shapes unless no helper fits.
5. **Run it**, then run `python scripts/check_deck.py <deck>.pptx`. Fix every ERROR. Read every WARNING and fix it unless you can say why it is wrong.
6. **Look at the slides** if you can render them (LibreOffice: `soffice --headless --convert-to pdf deck.pptx`, then `pdftoppm -png -r 80 deck.pdf slide`). Check for overflow, overlap and labels that collide. Fix, re-run, re-check. Stop after the deck passes; do not polish forever.
7. **Report** what you built: file name, slide count, the storyline, and anything in the brief you could not support with data.

## The rules

### 1. Action titles

- Every content slide title is a full sentence that states the "so what", with a verb and, where possible, a number: "Wholesale margin fell 6 points because green coffee costs rose faster than prices", not "Margin analysis".
- At most two lines at 20pt across the full slide width: roughly 90 characters. If it is longer, the slide is carrying two messages; split it.
- The body proves the title and nothing else. If a chart shows something the title does not claim, cut it or move it.
- Titles of consecutive slides should read as a paragraph (the "horizontal logic"). The executive summary is those titles, grouped.

### 2. Storyline and MECE structure

- Lead with the answer: slide 2 is the executive summary (situation, complication, resolution, or the answer followed by 3-4 supporting points).
- Supporting points are mutually exclusive and collectively exhaustive: no overlaps, no gaps at that level. Group them under at most 3-5 headings.
- Every section starts with a tracker label (small text above the title) so the reader knows where they are.
- End with decisions or next steps with owners and dates, not with "Questions?".

### 3. One message per slide

- One exhibit per slide: a chart, a table, a 2x2, a process, or a short text block. Never two charts that make different points.
- Body text at 12-16pt. If it does not fit at 12pt, the slide has too much on it.
- No more than 5 bullets, none longer than two lines.

### 4. Charts

- Use native PowerPoint charts (python-pptx `add_chart`), never images of charts, so the client can edit the numbers.
- Choose the chart for the comparison: ranking → sorted horizontal bar; change over time → column or line; build-up or bridge → waterfall (`deckkit.waterfall`); composition → 100% stacked bar; correlation → scatter.
- Start value axes at zero. No 3D, no shadows, no gridlines, no chart borders.
- Put data labels on the bars and delete the value axis instead of making readers read a scale.
- Grey for context, one accent colour for the data point the title talks about. Legend only when there are two or more series; otherwise label directly.
- The chart has a short unit line above it: "Gross margin by channel, FY2025, %".

### 5. Sources and footnotes

- Every slide with data has a source line at the bottom left: "Source: …; team analysis". If the data was given in the brief, cite the brief ("Source: client finance data (FY2023-25), as provided in brief").
- Footnotes for definitions and exclusions go above the source line, numbered.

### 6. Illustrative label

- If any number on a slide is invented, sample or placeholder data, put the `deckkit.illustrative()` label on that slide (top right) and say so on the title slide: "Illustrative example · Fictional company and sample data".
- Never present invented data as real. Never invent a source.

### 7. Template and format

- 16:9 (13.333 x 7.5 in). One font family (default Arial). Ink `#1F2933` for text, grey `#8A9099` for context, one accent (default `#1F5AA6`).
- If the user supplies a template `.pptx` or `.potx`, open it with `Presentation(template)` and build on its layouts and theme colours instead of deckkit's defaults; read `reference.md` § "Using a client template".
- Slide numbers bottom right. No logos, clip art, stock photos or decorative shapes unless the template has them.

## Exhibit menu (deckkit helpers)

| Message type | Helper |
|---|---|
| Title slide | `title_slide(prs, title, subtitle, note)` |
| Executive summary | `exec_summary(slide, rows)` with (heading, sentence) pairs |
| Ranking or comparison | `bar_chart(slide, categories, values, highlight=..., horizontal=True)` |
| Trend | `column_chart(slide, categories, series)` or `line_chart(...)` |
| Bridge or build-up | `waterfall(slide, steps)` |
| Options or criteria | `table(slide, header, rows, highlight_row=...)` |
| Next steps | `table` with Action / Owner / Date columns |
| Takeaway beside a chart | `callout(slide, heading, bullets)` on the right third |

Every content slide starts with `content_slide(prs, title, tracker)` and ends with `source(slide, text)`. Read `reference.md` for the layout grid, chart details and a full worked example.

## Additional resources

- `reference.md`: layout grid, chart recipes, template handling, common failures.
- `scripts/deckkit.py`: python-pptx helpers used above.
- `scripts/check_deck.py`: automated checks (title length and form, source lines, illustrative labels, text overflow estimate, fonts, chart count per slide).
