--- name: page-builder description: "PPT pipeline 逐页生成器 — 接收 slide-architect 的 Storyboard 单页规格和 decision brief 摘要,按 PageType 专属 prompt 写出 SlideSpec JSON 片段。12 个 PageType 各一份 prompt,统一嵌入 anti-ai-tone 约束。" --- # page-builder 本 skill 把 `storyboard.json` 里每一页的"PageType + 单页意图 + claim + evidence_refs + density"翻译成最终 SlideSpec JSON。12 个 PageType 各有独立 prompt(见 `prompts/`),共享 `context/anti-ai-tone-rules.md` 的硬禁用词表和评分规则。 ## 输入 单页规格(slide-architect 产出 `$MIRISE_WORKSPACE/.artifacts/ppt/{docId}/storyboard.json` 里的一条,附带 decision brief summary 与 evidence ledger): ```json { "page": 2, "page_type": "Dashboard", "intent": "show the KPI proof layer", "audience_question": "What evidence supports the claim?", "takeaway": "Q4 KPI proves the offer works", "claim": "Revenue momentum is real", "support_points": [ "Revenue up 18%", "Lead velocity stable" ], "evidence_refs": [ "q4-sales", "crm-pipeline" ], "density": "standard", "decision_brief_summary": { "main_takeaway": "Momentum is real" }, "evidence_sources": [ { "id": "q4-sales", "tier": "✅", "url": "..." } ] } ``` ## Mode 1:SlideSpec 片段生成 ### 流程 1. 根据 `page_type` 载入对应 prompt(`prompts/.md`)。 2. 把 `context/anti-ai-tone-rules.md` 作为 Handlebars partial 嵌入 system prompt(`{{> ../../context/anti-ai-tone-rules.md }}`)。 3. 按 prompt 的 slot schema 填充文案,引用 `evidence_sources` 时按 5 级 ledger 打 tag(✅🔶🧮📌❓)。 4. 返回 SlideSpec JSON 片段,落地到 `$MIRISE_WORKSPACE/.artifacts/ppt/{docId}/slides/{page:02d}.json`。 5. 先调用 `ppt-pipeline:validate-slide`(脚本 `scripts/validate-slide.ts`)对片段做校验:内部先跑 `validateSlide()` 通用结构校验,再跑 `validateSlideForDocType()` 读取 `doc-types/{doc_type}/page-layouts.yaml` 做 doc-type-aware budget 校验。失败则 reject 并触发**单页重写**(同一 page 重试最多 2 次;仍失败则升级 `slide-architect` 重规划该页——例如自动拆页或改 PageType)。 ### 输出(SlideSpec 片段示例) ```json { "page": 2, "page_type": "Dashboard", "css_class": "slide--dashboard", "content": { "title": "Q4 KPI", "metrics": [ { "label": "营收", "value": "AED 3.2M", "evidence": "✅ [evidence:q4-sales]" } ] } } ``` ### 合并 全部 12 页生成完成后,由 `pipeline-check` 下游步骤合并成完整 SlideSpec 写回 `$MIRISE_WORKSPACE/.artifacts/ppt/{docId}/slides.json` 和 Notion body(通过 `workflows/_shared/notion-body-sync.md`)。 ## 12 个 PageType prompt 清单(位于 `prompts/`) | 文件 | PageType | 对应 CSS | |---|---|---| | Cover.md | Cover | `.slide--cover` | | Dashboard.md | Dashboard | `.slide--dashboard` | | Timeline.md | Timeline | `.slide--timeline` | | TOC.md | TOC | `.slide--toc` | | ChapterCover.md | ChapterCover | `.slide--chapter` | | BulletGrid.md | BulletGrid | `.slide--bullet-grid` | | ComparisonTable.md | ComparisonTable | `.slide--comparison-table` | | StructureTable.md | StructureTable | `.slide--structure-table` | | ProcessFlow.md | ProcessFlow | `.slide--process-flow` | | Callout.md | Callout | `.slide--callout` | | FeeTable.md | FeeTable | `.slide--fee-table` | | ClosingCover.md | ClosingCover | `.slide--closing` | 每份 prompt 的结构: 1. `## 适用场景` — 何时用该 PageType。 2. `## 槽位 schema` — 必填字段 + 可选字段 + 类型。 3. `## 写作规则` — PageType 专属的长度/句式/数据要求。 4. `## Anti-AI-tone 约束` — 内嵌 `context/anti-ai-tone-rules.md` 核心规则(硬禁用词 + `ai_tone_score ≥ 85` 通过,`< 60` 强制 Revising,见 plan §1368)。 5. `## 输出 JSON 模板` — 该 PageType 的 SlideSpec 片段模板。 ## 契约 - 不允许跨页引用;每 prompt 只消费输入里显式传入的 `storyboard` / `decision brief summary` / `evidence_sources`。 - 禁用词命中立即重写,不进入 QA gate(详见 `context/anti-ai-tone-rules.md`)。 - SlideSpec 片段的 `css_class` 必须来自 `config/page-types.yaml`,不得自造。 - `page-builder` 不允许直接回读 Brief,也不允许直接消费原始 DeckPlan slide;结构约束来自 `storyboard.json` 的 page/page_type parity。 - Dashboard / Callout / ChapterCover 的最小内容预算以 `page-layouts.yaml` 为准:`report` Dashboard 可到 5 metrics,`marketing` Dashboard 上限 4;空 Callout、空 ChapterCover 必须在 validator 层被拦下。