# Ppt Master Skill

> PPT Master Skill

- Skill: `chaitin/ppt-master-skill` (Agent Skill, multi-file: 5 files)
- Install (CLI): `npx skillmds@latest add chaitin/ppt-master-skill`
- Raw SKILL.md: https://api.skillmd.com/api/skills/chaitin/ppt-master-skill/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: chaitin (https://skillmd.com/u/chaitin)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/chaitin/ppt-master-skill

---

# PPT Master Skill

This built-in skill provides imported PPT Master variants with the same rendering contract used by the Guizang skill:

- The backend selects a stable `skill_id + variant_id + theme_id`.
- The agent produces `deck_spec.slides[].html` and `deck_spec.slides[].css`.
- The backend sanitizes each slide fragment and injects it into `assets/template.html`.
- Existing `template_id` values identify the corresponding skill variant.
- Visual fragments must be authored as a fixed 16:9 canvas. Use `.pm-canvas` or `.pmv` as the slide content root so the backend can preserve the upstream 1280x720 PPT-Master geometry.
- Motion follows the Guizang-style declarative contract: the template/runtime owns animation code, and slide fragments only declare motion hooks with `data-pm-motion` and `data-pm-anim`.
- Validate visual fidelity with `references/alignment-checklist.md`; PPT-Master output should use registered `pm-*` layouts/components instead of generic title-plus-bullet pages.

## Variants

- `attention-transformer-blueprint`
- `data-journalism`
- `glassmorphism-saas`
- `memphis-pop`
- `risograph-zine`
- `cangzhuo-ink-aesthetic`
- `effective-agents-dark-tech`
- `kimsoong-consulting`

## Output Contract

Each visual slide should provide:

- `id`
- `index`
- `layout`
- `intent`
- `html`
- `css`
- `blocks`
- `speaker_notes`
- `citations`

The `html` fragment should use this root pattern:

```html
<div class="visual-slide" data-anchor="slide_01">
  <div class="pm-canvas pm-blueprint" data-pm-motion="blueprint">
    <p class="pm-kicker" data-pm-anim="kicker">...</p>
    <h1 class="pm-title" data-pm-anim="title">...</h1>
    <section class="pm-grid-3">
      <article class="pm-card" data-pm-anim="card">...</article>
    </section>
  </div>
</div>
```

Use the appropriate style class for the selected variant: `pm-blueprint`, `pm-news`, `pm-dark`, `pm-riso`, `pm-cultural`, `pm-cangzhuo`, `pm-consulting`, `pm-showcase`, `pm-glass`, or template-specific classes listed in `skill_context.components`.

## Motion Contract

Do not write animation JavaScript, `@keyframes`, or custom transition choreography in slide fragments. Declare motion only:

- Put `data-pm-motion` on the `.pm-canvas`, `.pmv`, or `.slide-canvas` root.
- Supported motion kinds: `blueprint`, `editorial`, `data`, `swiss`, `glass`, `memphis`, `riso`, `dark`, `consulting`, `business`.
- Mark 3-6 important elements with `data-pm-anim`.
- Supported element roles: `kicker`, `title`, `body`, `line`, `card`, `image`, `metric`, `bar`, `glass-card`, `sticker`, `pop-card`, `shape`.
- Choose roles that match the design: for example, blueprint uses `line/card`, data uses `metric/bar`, editorial uses `image/body`, and memphis uses `sticker/pop-card/shape`.

The backend does not generate fallback `html/css` fragments. Missing slide HTML, missing slide CSS, unsupported layouts, template injection failures, or validator failures must fail explicitly.

## JSON Shape Contract

Agent final output must use the backend stable JSON shapes. These fields must always be arrays, never object maps, string-only items, or tuple arrays:

- `design_plan.design_rhythm`
- `design_plan.rules`
- `outline`
- `outline[].points`
- `outline[].sources`
- `deck_spec.slides`
- `deck_spec.slides[].blocks`
- `deck_spec.slides[].blocks[].items`
- `deck_spec.slides[].citations`

Correct:

```json
{
  "outline": [
    {
      "id": "outline_01",
      "title": "Cover",
      "intent": "Introduce the topic",
      "points": ["Core message", "Audience"],
      "layout": "cover",
      "sources": []
    }
  ]
}
```

Incorrect:

```json
{
  "outline": {
    "page_1": ["Cover", "Core message"]
  }
}
```

