deck-design-ppt — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited deck-design-ppt (Agent Skill) and scored it 96/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 1 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 1 flagged
The text {match} tells the agent to skip the normal "ask the user first" gate. Used adversarially it removes the human-in-the-loop check before destructive or sensitive actions, turning a normally-gated agent into a fire-and-forget executor.
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
The brief is everything the user provides about what they want. Before generating anything, extract these signals:
| Signal | Examples | Defaults if absent |
|---|---|---|
| Objective | "pitch to Series A investors", "board strategy update", "SBIR Phase II proposal deck" | General presentation |
| Audience | "DoD program managers", "VC partners", "internal team" | General professional |
| Brand identity | Logo colors, company name, client palette | Palette defaults |
| Tone / firm style | "McKinsey-style", "clean and modern", "urgent/high-stakes" | Infer from audience + objective |
| Density | "dense and evidence-heavy", "keep it simple", specific L1/L2/L3 | Infer from audience + objective |
| Data | Tables, metrics, timelines, comparisons, evaluations | None — build from research or request more |
Not every brief contains all signals. Extract what's there, infer what you can, and use defaults for the rest. Do not ask the user to fill out a checklist. If the user provides a custom palette, brand guide, or design spec, follow it — the built-in styles are defaults, not constraints.
When the input is a storyboard artifact (from the consultant skill), the brief extraction is already done. Map directly:
| Storyboard field | deck-design-ppt step |
|---|---|
| Firm overlay | Style (Phase 1, step 2) |
| Density level | Density (Phase 1, step 3) |
| Per-slide data shape | Pattern routing (Phase 1, step 6) |
| Per-slide structured data | Build script data objects (Phase 2, step 8) |
Skip Phase 1 steps 1 and 5. The storyboard provides the content decisions; deck-design-ppt provides the visual execution.
| Tier | Namespace | What it answers | Use when |
|---|---|---|---|
| Tier 1 | P-series (p01 … p15) | "What communication move is this slide making?" | All decks |
| Tier 2 | C-series (c01 … c06) | "What dense consulting composition does this slide require?" | MBB-style engagement deliverables |
All patterns work across all 5 styles — the palette controls the visual identity, not the pattern.
Patterns are reference implementations, not constraints. Use them when they fit the content. When a slide needs a layout that no pattern covers, build custom using pptxgenjs directly — the grid constants, theme tokens, and slide master chrome still apply. The pattern library is a starting vocabulary, not a ceiling.
consulting-mckinsey / consulting-bcg / consulting-bain / founder / sequoia. See Style Routing.Before writing any code, produce a deck outline in markdown. This prevents sparse slides, content overlap, and mid-build surprises.
The outline must include:
Save the outline as {slug}-outline.md alongside the build script. It serves as both a planning artifact and documentation for future edits.
masters/patterns/<pattern>.slots.md.const { createDeck } = require('./skills/deck-design-ppt/masters');
createDeck('consulting-mckinsey', [
{ pattern: 'p01-cover', data: { title: '...', subtitle: '...' } },
{ pattern: 'p10-agenda', data: { items: [...] } },
{ pattern: 'p04-scorecard', data: { title: '...', cards: [...] } },
{ pattern: 'p03-evidence', data: { chart: {...}, callouts: [...] } },
{ pattern: 'c05-divider', data: { sectionNum: '02', title: '...' } },
{ pattern: 'p08-closer', data: { title: '...', nextSteps: [...] } },
], 'strategy-update.pptx');node build-deck.js — produces the .pptx directly. No HTML, no browser, no rendering step.Use the pptx skill's thumbnail script to generate a preview grid of the deck.
Save deliverables to the current working directory (or a user-specified output folder). Use kebab-case naming derived from the deck title:
{slug}.pptx — the deliverablebuild-{slug}.js — the build script (reproducible){slug}-outline.md — the deck outline (content plan)Intermediate artifacts (QA thumbnails, temp rasterizations) go to the system temp directory — do not leave them in the workspace.
Self-contained: package.json + node_modules/ are inside the skill folder. All require() calls resolve locally — no workspace-level install needed. Run npm install inside this skill folder if node_modules/ is missing.
The build kit lives in masters/:
| File | Purpose |
|---|---|
masters/index.js | createDeck(palette, slides, output) — orchestrator |
masters/grid.js | Spatial constants (margins, body zone, footer Y). One grid, all patterns use it. |
masters/theme.js | Palette name → theme object (colors, fonts, flags) |
masters/layouts.js | Defines slide masters (COVER, CONTENT, DIVIDER, CLOSER) parameterized by theme |
masters/patterns/*.js | 21 pattern functions — each fills content into the body zone |
masters/patterns/*.slots.md | Character budgets per pattern (loaded just-in-time) |
masters/examples/*.js | 8 advanced visual reference scripts (dumbbell, gauge, process flow, composite, scenario, multi-panel, data table, gantt) |
Slide masters are parameterized by the theme — one set of master definitions works for all 5 styles. The theme controls:
Pattern functions receive a slide (already has master chrome), the pptx instance, content data, and the theme. They only place content in the body zone — never touch the header, footer, or margins.
Grid constants (grid.js) define the spatial contract:
bodyY / bodyEndY — body zone boundariesmarginL / contentW — horizontal marginsfooterRuleY / footerTextY — footer positionscenterY(contentH) — vertically center content in body zone| If the deck is… | Use palette | Notes |
|---|---|---|
| Consulting / board / exec update / engagement deliverable | consulting-mckinsey, consulting-bcg, or consulting-bain | Match firm by content shape |
| Startup pitch / product narrative / growth story | founder | Clean, modern blue |
| Crisis / urgency / downturn memo / "burn/runway" rhetoric | sequoia | Dark, dramatic, red accent |
Palette files in palettes/ define colors, fonts, chart rules, and mode variations.
For every consulting deck, pick the firm style whose philosophy best fits the content:
| Content shape | Best fit | Why |
|---|---|---|
| Conclusion-first, variance analysis, "what happened and why" | McKinsey | Verdict-driven titles + waterfall exhibits |
| Framework evaluation, multi-criteria scoring, "how options compare" | BCG | Evaluation matrices + panel mini-headers |
| Diagnostic, decision support, "here are the facts, here's what we think" | Bain | Facts-vs-Perspectives frame |
Load the corresponding firm reference:
| Firm style | Reference |
|---|---|
| McKinsey | references/mckinsey.md |
| BCG | references/bcg.md |
| Bain | references/bain.md |
When density level requires references/craft.md (L2+), the firm file layers on top.
| Context | Level | Pattern scope | Also read |
|---|---|---|---|
| Startup pitch, roadshow, board update | L1 Narrative | P-series only | — |
| Corporate strategy, business review | L2 Structured | P + selective C-series | references/craft.md §1–§4 |
| MBB engagement, due diligence, deep analysis | L3 Dense | Full library; C-series expected | references/craft.md §1–§7 |
| User input shape / intent | Pattern | Notes |
|---|---|---|
| Cover page / identity | p01-cover | Slide 1 in almost every deck |
| 2×2 positioning / quadrant map | p02-matrix | Needs 2 axes + 4–8 items |
| Claim + chart proof (line, bar) | p03-evidence | Native PowerPoint chart + sidebar callouts |
| 4–8 KPIs / metrics / health check | p04-scorecard | Cards with number + label + trend |
| Timeline / progression | p05-narrative-arc | Milestones on a horizontal axis |
| Binary choice (A vs B) | p06-fork | Criteria grid with recommendation |
| Process / mechanism / flywheel | p07-machine | Numbered steps with connector |
| Closing ask / next step | p08-closer | Centered recommendation + bullets |
| Comparison table (rows × columns) | p09-data-table | Financial tables, delta coloring |
| Agenda / table of contents | p10-agenda | Section list with active highlight |
| Product / platform demo | p11-product-showcase | Product area + feature cards |
| Team / founders / engagement team | p12-team-grid | 4 cards with name + role + bio |
| Dense evidence: exhibit + sidebar | c01-multi-evidence | Chart + metrics row + drivers sidebar |
| Start/end with intermediate deltas | c02-waterfall | Stacked bar bridge + interpretation panels |
| Color-coded evaluation grid | c03-eval-grid | Criteria × options with RAG fills |
| Facts vs perspectives (two-column) | c04-facts-perspectives | 57/43 split — data left, judgment right |
| Section divider (full-bleed) | c05-divider | Dark background, section number + title |
| Stacked vertical bar chart | p13-stacked-bar | Segmented bars with legend, annotation sidebar |
| Ranked horizontal bars | p14-horizontal-bar | Data-driven widths, highlight row, value labels |
| Bubble matrix (size = magnitude) | p15-bubble-matrix | Area-proportional circles on rows × columns grid |
| Gantt / workplan timeline | c06-workplan | Calendar grid, row spans, milestone markers |
masters/examples/)No pre-built pattern. Study the script, adapt the technique.
| Visual type | Script | Technique |
|---|---|---|
| Dumbbell chart (before→after) | dumbbell-chart.js | Axis scaling, arrow shapes, SVG gradient bg |
| Gauge / arc indicators | gauge-arcs.js | Arc math, stacked distribution bars, bar-anchored text |
| Process flow diagram | process-flow-diagram.js | Node graphs, icon rasterization, SVG gradients |
| Multi-zone composite | multi-zone-composite.js | Zone layout, data-driven bars, rich text footer columns |
| Scenario comparison cards | scenario-cards.js | Nested columns, multi-level bullets |
| Multi-panel segmented bars | multi-panel-analysis.js | Stacked bars, dashed brackets, rotated labels |
| Data table with takeaways | outsourcing-mix-table.js | Row fills, chip highlights, chevron connectors |
| Gantt workplan | gantt-workplan.js | Calendar grid, requirement bubbles, status markers |
p01-cover (most decks) or c05-divider (mid-deck section entry).p10-agenda at section openings; c05-divider for chapter breaks.[1]), restart numbering per slide.p10-agenda (active item) or c05-divider. Close with a synthesis slide before the next section.c02) per variance analysis. BCG: panel mini-headers on every multi-panel slide. Bain: ≥40% of analytic slides use c04-facts-perspectives in diagnostic mode.*.slots.md) defines character limits and item counts. Before routing, verify your content fits: too few items produces a sparse slide; too many causes crowding. When in doubt, check the slot file's data schema and item ranges.bodyY and bodyEndY. Anchor elements to zone boundaries and use valign + fit:'shrink' — never manually estimate text heights for Y positioning.Slot budgets are stored per-pattern at masters/patterns/<pattern>.slots.md. Load just-in-time when building each slide — do not read all 21 upfront.
createDeck() API directly.masters/examples/ for techniques.~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.