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 content description | Data-shape extraction (Phase 1, step 5) + pattern routing (step 6) |
| Structured data | Build script data objects (Phase 2, step 8) |
Skip Phase 1 step 1 (the brief extraction is already done). Steps 5–6 still run here: the storyboard deliberately describes WHAT each slide must prove (the comparison, decomposition, or evaluation), never chart types or data shapes. Deriving the shape from the content description and routing it to a pattern is this skill's job.
If an identity.js produced by the brand-system skill exists in the working directory, the visual identity decisions are already made. Skip Style Routing. Register the identity as a theme in the build script instead:
const { createDeck } = require('<this-skill>/masters');
const { THEMES } = require('<this-skill>/masters/theme');
const brand = require('./identity');
const hex = c => c.replace('#', ''); // themes use bare hex, identity.js uses #-prefixed
THEMES[brand.palette.name] = {
name: brand.firm?.name || brand.palette.name,
accent: hex(brand.palette.accent),
canvas: hex(brand.palette.surface),
mist: hex(brand.palette.surfaceMuted),
midnight: hex(brand.palette.surfaceDark),
text: hex(brand.palette.text),
textSec: hex(brand.palette.textMuted),
textFine: hex(brand.palette.textFine),
border: hex(brand.palette.accentLight),
positive: hex(brand.palette.positive),
caution: hex(brand.palette.warning),
negative: hex(brand.palette.negative),
font: brand.fonts.body.family,
fontDisplay: brand.fonts.heading.family,
headerBar: brand.style === 'institutional' || brand.style === 'data-forward',
darkMode: brand.style === 'dark',
};
createDeck(brand.palette.name, slides, 'deck.pptx');Two caveats:
brand.style shapes composition, not just chrome. institutional / data-forward lean on C-series density, modern / bento on card-heavy P-series, dark on full-bleed sequoia-like treatment, editorial on typography-led patterns over charts.| 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('<this-skill>/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');<this-skill> = this skill's base directory path (provided in context when the skill loads). Node resolves pptxgenjs and sharp from the skill's own node_modules/. No install needed in the user's project.
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 | Orchestrator: createDeck(palette, slides, output) |
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 and 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 | none |
| 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, and 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.