{"id":"49287e39-ad9c-4487-8af0-6dcdde33ac48","entityType":"agent","slug":"clawhub-cqcmj74-html-slides-to-pptx","name":"Html Slides To PPTX","canonicalUrl":"https://www.xpersona.co/agent/clawhub-cqcmj74-html-slides-to-pptx","canonicalPath":"/agent/clawhub-cqcmj74-html-slides-to-pptx","generatedAt":"2026-10-12T02:09:41.597Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"editorial-content","verified":true,"confidence":"high","updatedAt":"2026-10-11T20:44:41.235Z","emptyReason":null},"description":"编写可无损还原为 PPTX 的 HTML 幻灯片。先经引导式访谈确认样式/形式/结构并落盘 deck-brief,再生成完整目录结构(assets/theme.css、slides/*.html、playlist.json), 每页严格遵循 html-spec.md 规范,经 validate.js 预检零 ERROR 后用 convert.js 转成 PowerPoint。TRIGGER when: 用户要求\"做PPT/幻灯片/slides/演示文稿\"、\"把内容做成 HTML幻灯片\"、\"生成可转PPTX的slides\",或调用 /html-slides-to-pptx。DO NOT TRIG Skill: Html Slides To PPTX Owner: cqcmj74 Summary: 编写可无损还原为 PPTX 的 HTML 幻灯片。先经引导式访谈确认样式/形式/结构并落盘 deck-brief,再生成完整目录结构(assets/theme.css、slides/*.html、playlist.json), 每页严格遵循 html-spec.md 规范,经 validate.js 预检零 ERROR 后用 convert.js 转成 PowerPoint。TRIGGER when: 用户要求\"做PPT/幻灯片/slides/演示文稿\"、\"把内容做成 HTML幻灯片\"、\"生成可转PPTX的slides\",或调用 /html-slides-to-pptx。DO NOT TRIG Tags: latest:2.1.0 Version history: v2.1.0 | 2026-08-18T01:14:59.551","descriptionLabel":"Technical summary","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. 995 downloads reported by the source. Last updated 10/11/2026.","installCommand":"clawhub skill install s179tv6cb45gbx621g7903gfqh8bd4tj:html-slides-to-pptx","sourceUrl":"https://clawhub.ai/cqcmj74/html-slides-to-pptx","homepage":"https://clawhub.ai/cqcmj74/skills/html-slides-to-pptx","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/cqcmj74/html-slides-to-pptx","kind":"source"},{"label":"Homepage","url":"https://clawhub.ai/cqcmj74/skills/html-slides-to-pptx","kind":"homepage"}],"safetyScore":84,"overallRank":62,"popularityScore":60,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"编写可无损还原为 PPTX 的 HTML 幻灯片。先经引导式访谈确认样式/形式/结构并落盘 deck-brief,再生成完整目录结构(assets/theme.css、slides/*.html、playlist.json), 每页严格遵循 html-spec.md 规范,经 validate.js 预检零 ERROR"},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-10-11T20:44:41.235Z","emptyReason":null},"protocols":[{"protocol":"OPENCLEW","label":"OpenClaw","status":"self-declared","notes":"Declared in the public agent profile."}],"capabilities":[],"verifiedCount":0,"selfDeclaredCount":1,"capabilityMatrix":{"rows":[{"key":"OPENCLEW","type":"protocol","support":"unknown","confidenceSource":"profile","notes":"Listed on profile"}],"flattenedTokens":"protocol:OPENCLEW|unknown|profile"}},"adoption":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-11T20:44:41.235Z","emptyReason":null},"stars":null,"forks":null,"downloads":995,"likes":null,"task":null,"library":null,"packageName":null,"latestVersion":"2.1.0","tractionLabel":"995 downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-11T20:44:41.218Z","emptyReason":null},"lastUpdatedAt":"2026-10-11T20:44:41.235Z","lastCrawledAt":"2026-10-11T20:44:41.218Z","lastIndexedAt":null,"nextCrawlAt":"2026-10-12T20:44:41.218Z","lastVerifiedAt":null,"highlights":[{"version":"2.1.0","createdAt":"2026-08-18T01:14:59.551Z","changelog":"**Version 2.1.0 – Major structure and workflow update** - Added deck-pages.md (基于内容卡的逐页写作原则)、新的卡片模板（assets/deck-pages.template.md）与相关填卡流程 - 明确要求每页先填内容卡再写 HTML，每页出厂必须基于主题片段或样板页，不允空白页手写（assets/snippets/* 新增大量组件片段） - 色板用色纪律升级：强制所有色值来源于 theme.css 变量，页面禁止硬编码 hex - 视觉自查流程扩充到八项，新增内容卡兑付验证和可验证事实、出处核查等判据 - assets、scripts 目录下补充了丰富的测试原型页与工具（如 gen-ladder.js、validate/palette-checks.js） - 移除 skill-card.md，文档结构调整，整体规范升级","fileCount":204,"zipByteSize":644535},{"version":"2.0.1","createdAt":"2026-08-07T02:28:43.031Z","changelog":"fix the text alginment problem of pill text box","fileCount":180,"zipByteSize":524183},{"version":"2.0.0","createdAt":"2026-08-06T09:20:55.299Z","changelog":"### ⚠️ 不兼容变更 - **设计检查默认开启。** `design.tier` 与 `design.formProfile` 的缺省值由 `\"\"`（休眠）改为 `presentation` / `balanced`。**现有项目重跑 `validate.js` 会新增 WARN**（字号下限、画布填充、 结构色面、视觉形式分布等）。 - 保留旧行为：在项目的 `slides/slides.config.json` 写 `{\"design\":{\"tier\":\"\",\"formProfile\":\"\"}}` - 改动原因：休眠是\"新项目零门槛\"的设计，但代价是**最该被检查的新页恰好不被检查** —— 新 deck 可以零报错通过却小字、单调、上重下空 - **`airyPages` 成为豁免填充检查的唯一途径。** 封面/分隔/大字观点/引用/收尾页若未登记， 会因\"底部留白\"被报 WARN。 - 装饰预算上限由每页 ≤2 件放宽为 **≤3 件**（结构形状不计件）。 ### 新增 **设计质量判据（第 4 轮）** - 满填判据由单一\"内容最低边\"扩为**四条并行**：墨迹行覆盖率 ≥55%、连续空白断层 <200px、 上下分布偏斜 ≤88%、内容带底边 ≥847px。此前一根 1px 细线拉到底部即可满足旧判据 - 字号层级检查：页标题/正文比值 ≥1.6、全页字号 ≥3 档 - **结构色面下限**：每个内容页至少一块结构色面（色带/深色面板/卡片底/表头底纹，≥1.5 万 px² 或占比 ≥8%），仅 balanced/rich 档生效。纯白底 + 黑字 + 细线是\"素雅单调\"的根源 - 文字对比度检查：<1.3 报 ERROR、1.3-1.6 报 WARN；豁免 ≥120px 幽灵水印数字与 ≤2 字符纯符号 **内容质量判据（第 5 轮）** - **企业黑话密度检查**：一档词表命中 ≥40‰ 且 ≥3 次时报 WARN。此前七道判据全是几何统计量， \"两块大色块 + 三行黑话\"可完整通过 —— 门禁在压制\"小字堆上半截\"的同时为\"大色块 + 空话\"开了合法通道 **访谈与深化（第 6 轮）** - **推断总表**（`reference/interview-guide.md`）：13 个 deck 族 × 7 轴推荐值 + 委员会动态角色， 外加 5 条多轴冲突消解规则。主循环开场读一张表即可定全轴 - **三条访谈路径 + 依赖图**：快通道 2-3 轮 / 标准 4-6 轮 / 深度档；10 条显式依赖规则替代 此前散在问项括号里的补丁 - **素材 × 深度矩阵**：素材形态（全文稿/大纲要点/裸主题）× 深度档决定执行什么。 裸主题**不再执行四步追问**，改出「假设清单 + 待补数据清单」 - **大纲级形式门禁**：形式分布/同形式连排/原型种数在大纲阶段就算（不消耗 agent 调用，所有档位都跑） - **`design.hedgePages` + `hedgeWords`**：把\"论断降级为观点\"从措辞变成可审计约束 —— validate 规则 6 检查这些页确实出现限定词（我们认为/有待验证/预估…），缺失报 WARN - `slides/deck-insights.md`：深化层详档独立落盘（模板 `assets/deck-insights.template.md`）。 此前 6 列洞察表被压进 brief 一行摘要，写页时无法查 - `assets/slides.config.template.json`：项目配置模板 **测试与守卫** - `scripts/test/threshold-parity.js` — 阈值单一事实源守卫（12 条硬编码扫描 + 9 条文档断言） - `scripts/test/generation-checks.js` — 生成侧回归 **94 条断言**（A 资产自洽 / B 契约传导 / C 端到端门禁 / D 访谈与深化层）。此前 6 个测试全部覆盖转换管线，主链路\"访谈 → brief → 写页\"零覆盖 - `scripts/test/anchor-integrity.js` — 锚点完整性守卫。实测\"改样张设计会静默摧毁转换覆盖\"： 把某页的 `data-chart` 换成纯文本后，设计门禁与生成侧回归全绿，只有 golden 报 diff， 而在\"我重排了这页\"的复核语境里重建基线是自然动作 - npm 脚本：`test:design`（四门禁一次跑全）、`test:thresholds`、`test:generation`、`test:anchors` ### 变更 - **阈值单一事实源**：23 个判据阈值全部收敛到 `config/default.config.js` 的 `design.thresholds`， 校验器只读不写字面量。此前单个阈值散落 4-8 处，改一处漏一处即静默分叉 - **品牌变量语义化**：`--brand-primary` / `--brand-dark`（+ `-dark` / `-soft` 变体）转为正规名， `--lenovo-red` / `--deep-navy` 降为别名（向后兼容，169 处历史引用不受影响）。 18 个主题文件全部改写，转换输出逐字节不变 - **文档分层**：写第一页前的必读面由 3720 行降到 **720 行**（主干三份：`interview-guide.md` / `design-principles.md` / `html-spec.md`），其余 9 份改为按需查阅。零删除，只改读取时机 - **决策委员会重构**：角色由固定五席改为 **2 固定（唱反调者/执行者）+ 3 动态**（按 deck 族取自推断总表）。 取消第一性原理思考者/扩张主义者/局外人 —— 其职能与第一章 steelman、第二章反向追问三重重叠。 评审轮次由硬编码 3 轮改为**冲突驱动**（无实质冲突直连主席，省 5 次调用）；主席变更说明 必须引用意见编号，并报**丢弃率**（>60% 须说明委员会为何失效） - **快速通道口径归一**：改为\"跳到最少交互底线\"—— Q6 色板与 Q5 大纲确认在任何路径都保留。 此前三份文档三种说法，且「跳过剩余全部问题」与「保留 Q6+Q5」字面直接冲突 - 置首推断规则全部上移到推断总表，`theme-presets` / `density-tiers` / `narrative-skeletons` / `content-deepening` 只留判据说明。此前散在 7 份文件且词表互不一致 - 字号上调：片段/模板/原型库正文 22→26px、子说明 18/20→22px（共 48 处）。 22px 是**破档红线而非默认值**，此前被当默认用 - 深度打磨档成本披露由\"约 10 次 agent 调用\"修正为 **13-15 次**（此前漏算交叉评审，而用户据此选档） - 计数口径归一：原型 **30**、片段 28、图标 40、色板预设 16、访谈 **5 阶段 16 问 + 1 确认** - Step 3.5 视觉自查由六关扩为**七关**（新增限定词检查） - 9 个样张页重排（96/98/99/100/104/105/106/107/111）：墨迹覆盖 29-52% → 58-97%、 结构色面 0% → 13.9-45%；细线凑底边的写法全部删除 ### 修复 - **H13：夹具 `theme.css` 缺一个右花括号**，导致 14 个版面令牌被吞进 `.big-num` 规则、 `:root` 下全程未定义；`--on-navy-*` / `--accent-orange` 完全缺失。后果是深色底页面的文字 回退近黑、在 PPTX 中整块不可见（97 页标题实测对比度 1.22:1），而 golden 基线把这个结果 当作正确输出固化了四轮 - 对比度检查的背景解析：`document.elementsFromPoint` 不命中 `<tr>` 元素，导致祖先链推导出的 行底色被画布色覆盖，产生误报（与 H12 同根） - `exemplar-checks.js` 缺 `formProfile` 键 → 结构色面检查在样张上从未触发 ### 已知未处置（有意登记） - `convert.js` 不硬性依赖 validate。改动会变更 CLI 契约（现有调用方可能依赖\"转换总能跑完\"）， 属行为变更而非修复 - `--text-*` 字号令牌零引用（语料/片段/原型库共 59 处硬编码 `font-size`）。迁移会**实际改变字号** 而非纯重构；替代保护是 `generation-checks.js` 的 A1/A2/A3 - 语义门禁只堵企业黑话，**\"具体但编造\"的内容仍能通过**。具体性检测会漏专有名词与命名实体， 按具体性判负会误伤扎实内容，故不做 - 深化层**产物质量**无自动判据。守卫能断言结构（计数/取值/依赖/字段/角色/阈值）， 断言不了\"这条洞察是否深刻\"。丢弃率是委员会自体检指标，不是质量判据 —— 内容质量的最终闸 仍是 Q5 用户确认 - `95-p2-master-media.html` 引用的 `demo.mp4` 在仓库中从未存在，媒体嵌入路径因此未被真正锚定 ### 回归状态 golden 三层 **107/107**（L1 提取 47 + L2 XML 41 + L3 截图 19）、样张门禁 20 页 0 ERROR / 0 WARN、 阈值守卫通过、生成侧回归 94/94、锚点完整性 15/15、phase2/phase3 验收通过、 色板预设一致性 16/16、validate 基线**零 diff**。","fileCount":180,"zipByteSize":520999},{"version":"1.1.2","createdAt":"2026-08-05T07:23:28.083Z","changelog":"Fix: wrong header text color in table rendering, missing partial inner‑tags upon rendering.","fileCount":174,"zipByteSize":463253},{"version":"1.1.1","createdAt":"2026-08-05T05:56:21.882Z","changelog":"- Added 40 inline SVG icons and expanded asset/snippet library with new HTML diagram constructs (e.g., chevron, funnel, hub-spoke, icon grid). - Enhanced visual workflow: visual form (\"text\" vs. \"balanced\" vs. \"rich\") now required; deck-level form ratio and repeat checks enforced. - Updated slides.config.json to support formProfile and stricter visual design structure. - Expanded page archetypes and visual form checklists; improved guidance on using icons/visuals vs. pure text. - Major cleanup: removed legacy cache files and restructured test/fixture assets for better maintainability.","fileCount":176,"zipByteSize":466276},{"version":"1.1.0","createdAt":"2026-08-03T08:43:08.927Z","changelog":"html-slides-to-pptx 1.1.0 is a major update expanding coverage,严控视觉质量,大幅强化规范文件与典型片段。 - 访谈流程升级为6阶段16问,引入“内容深化”手册,支持多角色/决策委员会审大纲 - 新增视觉自查(Step 3.5):逐页截屏辅助 scale-to-fill/字号/对齐/去AI味自查 - 增加和细化页面原型库(page-archetypes.md)、设计总纲(design-principles.md)等规范文档 - 丰富 assets/snippets/与 page-archetypes,主流页型直接复用骨架;色板预设扩增 - 新增 slides.config.json,设计档自动生成,validate 工具升级支持设计 profile 检查 - 规范页面写法/视觉合格线(装饰数/字号/填充率等),强化流程与质量守门员","fileCount":201,"zipByteSize":2458584},{"version":"1.0.0","createdAt":"2026-07-28T02:19:48.897Z","changelog":"Initial release of html-slides-to-pptx. - Generate HTML slides that can be losslessly converted to PPTX, following a strict HTML/CSS subset for maximum compatibility. - Introduces a guided interview process to confirm requirements and style before slide creation. - Automatically sets up project structure, including assets, theme, individual slide files, playlist, and brief. - Enforces rigorous validation: slides must pass all checks with zero errors before conversion. - Supports advanced editable features: charts, shapes, tables, media, and creative layouts. - Provides a CLI-driven workflow for validation, conversion, and reporting.","fileCount":145,"zipByteSize":349738}]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install s179tv6cb45gbx621g7903gfqh8bd4tj:html-slides-to-pptx","setupComplexity":"low","setupSteps":["Node.js workspace detected. Install dependencies securely: run `npm ci --ignore-scripts` to prevent post-install lifecycle triggers from running arbitrary code, then selectively audit the dependency tree.","Setup complexity is classified as HIGH. You must provision dedicated cloud infrastructure or an isolated VM. Do not run this directly on your local workstation.","Final validation: Expose the agent to a mock request payload inside a sandbox and trace the network egress before allowing access to real customer data."],"contract":{"contractStatus":"missing","authModes":[],"requires":[],"forbidden":[],"supportsMcp":false,"supportsA2a":false,"supportsStreaming":false,"inputSchemaRef":null,"outputSchemaRef":null,"dataRegion":null,"contractUpdatedAt":null,"sourceUpdatedAt":null,"freshnessSeconds":null},"invocationGuide":{"preferredApi":{"snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-cqcmj74-html-slides-to-pptx/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-cqcmj74-html-slides-to-pptx/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-cqcmj74-html-slides-to-pptx/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-cqcmj74-html-slides-to-pptx/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-cqcmj74-html-slides-to-pptx/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-cqcmj74-html-slides-to-pptx/trust\""],"jsonRequestTemplate":{"query":"summarize this repo","constraints":{"maxLatencyMs":2000,"protocolPreference":["OPENCLEW"]}},"jsonResponseTemplate":{"ok":true,"result":{"summary":"...","confidence":0.9},"meta":{"source":"CLAWHUB","generatedAt":"2026-10-12T02:09:41.592Z"}},"retryPolicy":{"maxAttempts":3,"backoffMs":[500,1500,3500],"retryableConditions":["HTTP_429","HTTP_503","NETWORK_TIMEOUT"]}},"endpoints":{"dossierUrl":"https://www.xpersona.co/api/v1/agents/clawhub-cqcmj74-html-slides-to-pptx/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-cqcmj74-html-slides-to-pptx/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-cqcmj74-html-slides-to-pptx/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-cqcmj74-html-slides-to-pptx/trust"}},"reliability":{"evidence":{"source":"runtime-metrics","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No trust, reliability, or runtime telemetry is available."},"trust":{"status":"unavailable","handshakeStatus":"UNKNOWN","verificationFreshnessHours":null,"reputationScore":null,"p95LatencyMs":null,"successRate30d":null,"fallbackRate":null,"attempts30d":null,"trustUpdatedAt":null,"trustConfidence":"unknown","sourceUpdatedAt":null,"freshnessSeconds":null},"decisionGuardrails":{"doNotUseIf":["Contract metadata is missing or unavailable for deterministic execution."],"safeUseWhen":[],"riskFlags":["missing_or_unavailable_contract","trust_data_unavailable","schema_references_missing"],"operationalConfidence":"low"},"executionMetrics":{"observedLatencyMsP50":null,"observedLatencyMsP95":null,"estimatedCostUsd":null,"uptime30d":null,"rateLimitRpm":null,"rateLimitBurst":null,"lastVerifiedAt":null,"verificationSource":null},"runtimeMetrics":{"successRate":null,"avgLatencyMs":null,"avgCostUsd":null,"hallucinationRate":null,"retryRate":null,"disputeRate":null,"p50Latency":null,"p95Latency":null,"lastUpdated":null}},"benchmarks":{"evidence":{"source":"no-benchmark-data","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No benchmark suites or observed failure patterns are available."},"suites":[],"failurePatterns":[]},"artifacts":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"high","updatedAt":"2026-10-11T20:44:41.235Z","emptyReason":null},"readme":"Skill: Html Slides To PPTX\n\nOwner: cqcmj74\n\nSummary: 编写可无损还原为 PPTX 的 HTML 幻灯片。先经引导式访谈确认样式/形式/结构并落盘 deck-brief,再生成完整目录结构(assets/theme.css、slides/*.html、playlist.json), 每页严格遵循 html-spec.md 规范,经 validate.js 预检零 ERROR 后用 convert.js 转成 PowerPoint。TRIGGER when: 用户要求\"做PPT/幻灯片/slides/演示文稿\"、\"把内容做成 HTML幻灯片\"、\"生成可转PPTX的slides\",或调用 /html-slides-to-pptx。DO NOT TRIG\n\nTags: latest:2.1.0\n\nVersion history:\n\nv2.1.0 | 2026-08-18T01:14:59.551Z | user\n\n**Version 2.1.0 – Major structure and workflow update**\n\n- Added deck-pages.md (基于内容卡的逐页写作原则)、新的卡片模板（assets/deck-pages.template.md）与相关填卡流程\n- 明确要求每页先填内容卡再写 HTML，每页出厂必须基于主题片段或样板页，不允空白页手写（assets/snippets/* 新增大量组件片段）\n- 色板用色纪律升级：强制所有色值来源于 theme.css 变量，页面禁止硬编码 hex\n- 视觉自查流程扩充到八项，新增内容卡兑付验证和可验证事实、出处核查等判据\n- assets、scripts 目录下补充了丰富的测试原型页与工具（如 gen-ladder.js、validate/palette-checks.js）\n- 移除 skill-card.md，文档结构调整，整体规范升级\n\nv2.0.1 | 2026-08-07T02:28:43.031Z | user\n\nfix the text alginment problem of pill text box\n\nv2.0.0 | 2026-08-06T09:20:55.299Z | user\n\n### ⚠️ 不兼容变更\n\n- **设计检查默认开启。** `design.tier` 与 `design.formProfile` 的缺省值由 `\"\"`（休眠）改为\n  `presentation` / `balanced`。**现有项目重跑 `validate.js` 会新增 WARN**（字号下限、画布填充、\n  结构色面、视觉形式分布等）。\n  - 保留旧行为：在项目的 `slides/slides.config.json` 写 `{\"design\":{\"tier\":\"\",\"formProfile\":\"\"}}`\n  - 改动原因：休眠是\"新项目零门槛\"的设计，但代价是**最该被检查的新页恰好不被检查** ——\n    新 deck 可以零报错通过却小字、单调、上重下空\n- **`airyPages` 成为豁免填充检查的唯一途径。** 封面/分隔/大字观点/引用/收尾页若未登记，\n  会因\"底部留白\"被报 WARN。\n- 装饰预算上限由每页 ≤2 件放宽为 **≤3 件**（结构形状不计件）。\n\n### 新增\n\n**设计质量判据（第 4 轮）**\n\n- 满填判据由单一\"内容最低边\"扩为**四条并行**：墨迹行覆盖率 ≥55%、连续空白断层 <200px、\n  上下分布偏斜 ≤88%、内容带底边 ≥847px。此前一根 1px 细线拉到底部即可满足旧判据\n- 字号层级检查：页标题/正文比值 ≥1.6、全页字号 ≥3 档\n- **结构色面下限**：每个内容页至少一块结构色面（色带/深色面板/卡片底/表头底纹，≥1.5 万 px²\n  或占比 ≥8%），仅 balanced/rich 档生效。纯白底 + 黑字 + 细线是\"素雅单调\"的根源\n- 文字对比度检查：<1.3 报 ERROR、1.3-1.6 报 WARN；豁免 ≥120px 幽灵水印数字与 ≤2 字符纯符号\n\n**内容质量判据（第 5 轮）**\n\n- **企业黑话密度检查**：一档词表命中 ≥40‰ 且 ≥3 次时报 WARN。此前七道判据全是几何统计量，\n  \"两块大色块 + 三行黑话\"可完整通过 —— 门禁在压制\"小字堆上半截\"的同时为\"大色块 + 空话\"开了合法通道\n\n**访谈与深化（第 6 轮）**\n\n- **推断总表**（`reference/interview-guide.md`）：13 个 deck 族 × 7 轴推荐值 + 委员会动态角色，\n  外加 5 条多轴冲突消解规则。主循环开场读一张表即可定全轴\n- **三条访谈路径 + 依赖图**：快通道 2-3 轮 / 标准 4-6 轮 / 深度档；10 条显式依赖规则替代\n  此前散在问项括号里的补丁\n- **素材 × 深度矩阵**：素材形态（全文稿/大纲要点/裸主题）× 深度档决定执行什么。\n  裸主题**不再执行四步追问**，改出「假设清单 + 待补数据清单」\n- **大纲级形式门禁**：形式分布/同形式连排/原型种数在大纲阶段就算（不消耗 agent 调用，所有档位都跑）\n- **`design.hedgePages` + `hedgeWords`**：把\"论断降级为观点\"从措辞变成可审计约束 ——\n  validate 规则 6 检查这些页确实出现限定词（我们认为/有待验证/预估…），缺失报 WARN\n- `slides/deck-insights.md`：深化层详档独立落盘（模板 `assets/deck-insights.template.md`）。\n  此前 6 列洞察表被压进 brief 一行摘要，写页时无法查\n- `assets/slides.config.template.json`：项目配置模板\n\n**测试与守卫**\n\n- `scripts/test/threshold-parity.js` — 阈值单一事实源守卫（12 条硬编码扫描 + 9 条文档断言）\n- `scripts/test/generation-checks.js` — 生成侧回归 **94 条断言**（A 资产自洽 / B 契约传导 /\n  C 端到端门禁 / D 访谈与深化层）。此前 6 个测试全部覆盖转换管线，主链路\"访谈 → brief → 写页\"零覆盖\n- `scripts/test/anchor-integrity.js` — 锚点完整性守卫。实测\"改样张设计会静默摧毁转换覆盖\"：\n  把某页的 `data-chart` 换成纯文本后，设计门禁与生成侧回归全绿，只有 golden 报 diff，\n  而在\"我重排了这页\"的复核语境里重建基线是自然动作\n- npm 脚本：`test:design`（四门禁一次跑全）、`test:thresholds`、`test:generation`、`test:anchors`\n\n### 变更\n\n- **阈值单一事实源**：23 个判据阈值全部收敛到 `config/default.config.js` 的 `design.thresholds`，\n  校验器只读不写字面量。此前单个阈值散落 4-8 处，改一处漏一处即静默分叉\n- **品牌变量语义化**：`--brand-primary` / `--brand-dark`（+ `-dark` / `-soft` 变体）转为正规名，\n  `--lenovo-red` / `--deep-navy` 降为别名（向后兼容，169 处历史引用不受影响）。\n  18 个主题文件全部改写，转换输出逐字节不变\n- **文档分层**：写第一页前的必读面由 3720 行降到 **720 行**（主干三份：`interview-guide.md` /\n  `design-principles.md` / `html-spec.md`），其余 9 份改为按需查阅。零删除，只改读取时机\n- **决策委员会重构**：角色由固定五席改为 **2 固定（唱反调者/执行者）+ 3 动态**（按 deck 族取自推断总表）。\n  取消第一性原理思考者/扩张主义者/局外人 —— 其职能与第一章 steelman、第二章反向追问三重重叠。\n  评审轮次由硬编码 3 轮改为**冲突驱动**（无实质冲突直连主席，省 5 次调用）；主席变更说明\n  必须引用意见编号，并报**丢弃率**（>60% 须说明委员会为何失效）\n- **快速通道口径归一**：改为\"跳到最少交互底线\"—— Q6 色板与 Q5 大纲确认在任何路径都保留。\n  此前三份文档三种说法，且「跳过剩余全部问题」与「保留 Q6+Q5」字面直接冲突\n- 置首推断规则全部上移到推断总表，`theme-presets` / `density-tiers` / `narrative-skeletons` /\n  `content-deepening` 只留判据说明。此前散在 7 份文件且词表互不一致\n- 字号上调：片段/模板/原型库正文 22→26px、子说明 18/20→22px（共 48 处）。\n  22px 是**破档红线而非默认值**，此前被当默认用\n- 深度打磨档成本披露由\"约 10 次 agent 调用\"修正为 **13-15 次**（此前漏算交叉评审，而用户据此选档）\n- 计数口径归一：原型 **30**、片段 28、图标 40、色板预设 16、访谈 **5 阶段 16 问 + 1 确认**\n- Step 3.5 视觉自查由六关扩为**七关**（新增限定词检查）\n- 9 个样张页重排（96/98/99/100/104/105/106/107/111）：墨迹覆盖 29-52% → 58-97%、\n  结构色面 0% → 13.9-45%；细线凑底边的写法全部删除\n\n### 修复\n\n- **H13：夹具 `theme.css` 缺一个右花括号**，导致 14 个版面令牌被吞进 `.big-num` 规则、\n  `:root` 下全程未定义；`--on-navy-*` / `--accent-orange` 完全缺失。后果是深色底页面的文字\n  回退近黑、在 PPTX 中整块不可见（97 页标题实测对比度 1.22:1），而 golden 基线把这个结果\n  当作正确输出固化了四轮\n- 对比度检查的背景解析：`document.elementsFromPoint` 不命中 `<tr>` 元素，导致祖先链推导出的\n  行底色被画布色覆盖，产生误报（与 H12 同根）\n- `exemplar-checks.js` 缺 `formProfile` 键 → 结构色面检查在样张上从未触发\n\n### 已知未处置（有意登记）\n\n- `convert.js` 不硬性依赖 validate。改动会变更 CLI 契约（现有调用方可能依赖\"转换总能跑完\"），\n  属行为变更而非修复\n- `--text-*` 字号令牌零引用（语料/片段/原型库共 59 处硬编码 `font-size`）。迁移会**实际改变字号**\n  而非纯重构；替代保护是 `generation-checks.js` 的 A1/A2/A3\n- 语义门禁只堵企业黑话，**\"具体但编造\"的内容仍能通过**。具体性检测会漏专有名词与命名实体，\n  按具体性判负会误伤扎实内容，故不做\n- 深化层**产物质量**无自动判据。守卫能断言结构（计数/取值/依赖/字段/角色/阈值），\n  断言不了\"这条洞察是否深刻\"。丢弃率是委员会自体检指标，不是质量判据 —— 内容质量的最终闸\n  仍是 Q5 用户确认\n- `95-p2-master-media.html` 引用的 `demo.mp4` 在仓库中从未存在，媒体嵌入路径因此未被真正锚定\n\n### 回归状态\n\ngolden 三层 **107/107**（L1 提取 47 + L2 XML 41 + L3 截图 19）、样张门禁 20 页 0 ERROR / 0 WARN、\n阈值守卫通过、生成侧回归 94/94、锚点完整性 15/15、phase2/phase3 验收通过、\n色板预设一致性 16/16、validate 基线**零 diff**。\n\nv1.1.2 | 2026-08-05T07:23:28.083Z | user\n\nFix: wrong header text color in table rendering, missing partial inner‑tags upon rendering.\n\nv1.1.1 | 2026-08-05T05:56:21.882Z | user\n\n- Added 40 inline SVG icons and expanded asset/snippet library with new HTML diagram constructs (e.g., chevron, funnel, hub-spoke, icon grid).\n- Enhanced visual workflow: visual form (\"text\" vs. \"balanced\" vs. \"rich\") now required; deck-level form ratio and repeat checks enforced.\n- Updated slides.config.json to support formProfile and stricter visual design structure.\n- Expanded page archetypes and visual form checklists; improved guidance on using icons/visuals vs. pure text.\n- Major cleanup: removed legacy cache files and restructured test/fixture assets for better maintainability.\n\nv1.1.0 | 2026-08-03T08:43:08.927Z | user\n\nhtml-slides-to-pptx 1.1.0 is a major update expanding coverage,严控视觉质量,大幅强化规范文件与典型片段。\n\n- 访谈流程升级为6阶段16问,引入“内容深化”手册,支持多角色/决策委员会审大纲\n- 新增视觉自查(Step 3.5):逐页截屏辅助 scale-to-fill/字号/对齐/去AI味自查\n- 增加和细化页面原型库(page-archetypes.md)、设计总纲(design-principles.md)等规范文档\n- 丰富 assets/snippets/与 page-archetypes,主流页型直接复用骨架;色板预设扩增\n- 新增 slides.config.json,设计档自动生成,validate 工具升级支持设计 profile 检查\n- 规范页面写法/视觉合格线(装饰数/字号/填充率等),强化流程与质量守门员\n\nv1.0.0 | 2026-07-28T02:19:48.897Z | auto\n\nInitial release of html-slides-to-pptx.\n\n- Generate HTML slides that can be losslessly converted to PPTX, following a strict HTML/CSS subset for maximum compatibility.\n- Introduces a guided interview process to confirm requirements and style before slide creation.\n- Automatically sets up project structure, including assets, theme, individual slide files, playlist, and brief.\n- Enforces rigorous validation: slides must pass all checks with zero errors before conversion.\n- Supports advanced editable features: charts, shapes, tables, media, and creative layouts.\n- Provides a CLI-driven workflow for validation, conversion, and reporting.\n\nArchive index:\n\nArchive v2.1.0: 204 files, 644535 bytes\n\nFiles: assets/deck-brief.template.md (4270b), assets/deck-insights.template.md (3411b), assets/deck-pages.template.md (4744b), assets/icons.md (17828b), assets/playlist.template.json (277b), assets/presets/brand-airbnb.css (4857b), assets/presets/brand-apple.css (4980b), assets/presets/brand-claude.css (4950b), assets/presets/brand-ferrari.css (4882b), assets/presets/brand-figma.css (4889b), assets/presets/brand-linear.css (5003b), assets/presets/brand-notion.css (4993b), assets/presets/brand-nvidia.css (4843b), assets/presets/brand-spotify.css (4817b), assets/presets/brand-stripe.css (4870b), assets/presets/brand-vercel.css (4730b), assets/presets/business-blue.css (4485b), assets/presets/forest-green.css (4531b), assets/presets/graphite-mono.css (4584b), assets/presets/lenovo-default.css (8053b), assets/presets/warm-orange.css (4563b), assets/slide-template-flex.html (6105b), assets/slide-template-layout.html (5993b), assets/slide-template.html (4183b), assets/slides.config.template.json (261b), assets/snippets/agenda-list.html (1384b), assets/snippets/badge-center.html (1266b), assets/snippets/big-statement.html (1413b), assets/snippets/card-accent-top.html (2711b), assets/snippets/chevron-band.html (4735b), assets/snippets/code-block.html (2468b), assets/snippets/color-band.html (2089b), assets/snippets/compare-card.html (1506b), assets/snippets/cycle-loop.html (3689b), assets/snippets/data-table.html (2763b), assets/snippets/driver-node.html (2661b), assets/snippets/editorial-columns.html (1305b), assets/snippets/exec-summary.html (3949b), assets/snippets/flow-step.html (1203b), assets/snippets/funnel-stack.html (4804b), assets/snippets/gradient-bar.html (1518b), assets/snippets/harvey-row.html (2953b), assets/snippets/heatmap-table.html (5685b), assets/snippets/hero-gradient.html (2396b), assets/snippets/hub-spoke.html (4179b), assets/snippets/icon-grid-cell.html (1852b), assets/snippets/image-bleed.html (1852b), assets/snippets/INDEX.md (8178b), assets/snippets/issue-tree.html (6082b), assets/snippets/kpi-card.html (2241b), assets/snippets/layer-row.html (1708b), assets/snippets/page-header.html (2146b), assets/snippets/pyramid-tiers.html (2588b), assets/snippets/quote-block.html (1661b), assets/snippets/quote-hero.html (1491b), assets/snippets/scenario-col.html (2475b), assets/snippets/section-divider.html (1569b), assets/snippets/stat-number.html (1023b), assets/snippets/swimlane-row.html (2931b), assets/snippets/timeline-node.html (1960b), assets/snippets/vs-cards.html (2926b), assets/snippets/waterfall-bar.html (2306b), assets/theme.css (6152b), reference/behavior-baseline.md (4302b), reference/brand-styles.md (16601b), reference/content-deepening.md (21299b), reference/creative-layouts.md (25345b), reference/density-tiers.md (4110b), reference/design-principles.md (23878b), reference/html-spec.md (25380b), reference/interview-guide.md (18805b), reference/layout-recipes.md (8528b), reference/narrative-skeletons.md (11394b), reference/page-archetypes.md (128023b), reference/theme-presets.md (3774b), scripts/config/default.config.js (10886b), scripts/config/merge.js (2073b), scripts/convert.js (1669b), scripts/core/browser.js (1171b), scripts/core/capture-pass.js (3674b)\n\nFile v2.1.0:SKILL.md\n\n---\nname: html-slides-to-pptx\ndescription: >-\n  编写可无损还原为 PPTX 的 HTML 幻灯片。先经引导式访谈确认样式/形式/结构并落盘\n  deck-brief,再生成完整目录结构(assets/theme.css、slides/*.html、playlist.json),\n  每页严格遵循 html-spec.md 规范,经 validate.js 预检零 ERROR 后用 convert.js 转成\n  PowerPoint。TRIGGER when: 用户要求\"做PPT/幻灯片/slides/演示文稿\"、\"把内容做成\n  HTML幻灯片\"、\"生成可转PPTX的slides\",或调用 /html-slides-to-pptx。DO NOT TRIGGER when:\n  只需单页HTML网页、或要做的是 reveal.js/Marp 等其他幻灯片格式。\nversion: 2.1.0\nmetadata:\n  openclaw:\n    requires:\n      bins:\n        - node\n        - npm\n---\n\n# html-slides · 可无损转 PPTX 的 HTML 幻灯片生成器(引导式访谈版)\n\n## 核心原则\n\n转换器(`scripts/convert.js` + 浏览器端提取管线)只**无损支持 HTML/CSS 的一个子集**。\n每页 HTML 必须严格遵循 `reference/html-spec.md` —— 这是契约,不是建议。\n写页面之前必须先完成 Step 1 访谈并让用户确认 `slides/deck-brief.md`。\n\n## 首次使用:检查工具依赖\n\n> 以下命令中的 `SKILL_DIR` 指本技能的根目录(即 SKILL.md 所在目录)。\n> 技能加载时系统会显示 \"Base directory for this skill: <路径>\",用该路径替换 `SKILL_DIR`。\n\n```bash\nSKILL_DIR=\"<技能根目录,即 Base directory>\"\nls \"$SKILL_DIR/scripts/node_modules/playwright\" >/dev/null 2>&1 \\\n  && echo OK || (cd \"$SKILL_DIR/scripts\" && npm install && npx playwright install chromium)\n```\n若输出 OK 则跳过安装;否则等待安装完成再继续。\n\n## 工作流程(按顺序执行)\n\n### Step 1 · 引导式访谈 → 需求确认卡\n\n**读 `reference/interview-guide.md` 并严格执行**:5 阶段(定位→结构→视觉→版式→输出)+ 收尾确认卡,\n共 **16 问 + 1 个大纲确认环节**,每问有默认值与智能跳过规则。配套查询:\n- 叙事骨架:`reference/narrative-skeletons.md`(脚手架非模具;用户可选\"自由结构\")\n- 色板预设:`reference/theme-presets.md`(5 套预设 + 自定义 hex 推导)\n- 信息密度:`reference/density-tiers.md`(演讲/混合/阅读 三档参数)\n- **内容深化:`reference/content-deepening.md`**(**素材形态 × 深度档**二维矩阵定做什么:\n  四步追问审素材 → 多角色 → 委员会审大纲;裸主题改出**假设清单**不做追问;\n  所有档位都跑**大纲级形式门禁**;大纲 v2 才进 Q5 确认)\n\n**Step 1 执行顺序**:①读 interview-guide 的**推断总表**,从用户首句匹配 deck 族 → 一次定全轴推荐值\n②按**依赖图**决定哪些问可跳 ③选路径(快通道 2-3 轮 / 标准 4-6 轮 / 深度 + 深化层)\n④逐阶段抛问,置首项说明理由 ⑤深化层按矩阵执行 ⑥Q5 确认大纲 v2。\n**任何路径都不跳 Q6 色板 与 Q5 大纲确认**(返工最贵的两个决定)。\n\n访谈收尾:按 `assets/deck-brief.template.md` 生成确认卡展示给用户,\n**用户确认后落盘 `slides/deck-brief.md`** —— 此后它是唯一执行事实源;\n后续\"改第 N 页/换色板\"类迭代直接读它,不重访谈。\n\n### Step 2 · 搭目录结构\n在当前工作目录生成:\n```\nassets/theme.css          # 按 brief 色板:复制 assets/presets/<选定预设>.css(自定义色则按推导值生成)\nslides/NN-slug.html       # 每页一个文件,两位数字前缀排序\nslides/playlist.json      # 从 assets/playlist.template.json 实例化,playlist 按顺序列全页面\nslides/deck-brief.md      # Step 1 落盘的需求确认卡\nslides/deck-insights.md   # 深化层详档(非快速档才有;模板 assets/deck-insights.template.md)\nslides/deck-pages.md      # 页级内容卡(所有档位都有;模板 assets/deck-pages.template.md)\nslides/slides.config.json # 从 assets/slides.config.template.json 实例化(键见 scripts/config/default.config.js)\n```\n目录已存在时,保留用户已有文件,只补缺失项。\n\n**slides.config.json 按 brief 填**(实例化 `assets/slides.config.template.json`):\n```json\n{\n  \"design\": {\n    \"tier\": \"presentation | mixed | reading\",\n    \"minBodyPx\": 14,\n    \"fillThreshold\": 0.85,\n    \"airyPages\": [\"01-cover.html\", \"05-statement.html\"],\n    \"formProfile\": \"balanced\",\n    \"hedgePages\": [\"07-forecast.html\"]\n  }\n}\n```\n- 设计检查**默认就是开着的**(缺省 `presentation` + `balanced`);本文件的作用是按 brief\n  **校准**档位与豁免页,不是\"开启开关\"。整份文件缺失时按默认档跑,不会静默放行。\n- `design.tier` 由 brief 使用场景映射(演讲→presentation/混合→mixed/阅读→reading);\n  决定字号下限与单页信息量上限(见 `reference/density-tiers.md`)\n- `design.formProfile` 由 brief 视觉形式偏好映射(克制型→text/平衡型→balanced/丰富型→rich);\n  决定 deck 级形式检查口径(纯文字页占比/同形式连排,见 design-principles 第五章)\n- `airyPages` 填 brief 中的 airy 页文件名(封面/分隔/大字观点/引用/收尾)——\n  **这是唯一豁免填充检查的途径**,漏填会让这些页因\"底部留白\"被报 WARN\n- `hedgePages`(2026-08-06 第六轮)填 `deck-insights.md` 里**降级论断**所在页 →\n  validate 会检查这些页确实出现限定词(我们认为/有待验证/预估…),缺失报 WARN。\n  作用是把\"降级为观点\"从措辞变成可审计约束;**不判断内容真伪**(真伪归 Q5 用户判断)\n- 其余常用键:`applyFontMap`(brief 演示机字体决定)、`nativeGradient`(原生渐变)、`master`(页码页脚)\n\n### Step 3.0 · 逐页内容卡(写这一页 HTML 之前)\n\n**一页一卡,填完即写这一页**(不要先填完全部卡再统一写页)。载体 `slides/deck-pages.md`\n(实例化 `assets/deck-pages.template.md`);工序定义与判据出处见 `reference/content-deepening.md` **第四章**。\n\n七项:①Action title(结论句)②支撑 2-4 条,**每条必须挂一个可验证事实**(数字+单位/专有名词/\n时间范围/具体例子)**+ 一个已分类的出处**③口径行(有数字则时间范围+样本+测算方式,估算标注假设)\n④逻辑三问(支撑能否推出标题/最强反驳本页答不答/观众下一问下一页答不答)⑤限定词判定 ⑥数据不足退路 ⑦容量核算。\n\n- **② 的出处必须落到六类之一**:素材 §N / insights #N / 用户口述 / 公开可核验(机构+报告名+年份)\n  / **模型知识** / 待补。**本技能不联网、无检索** —— 内容只有用户素材、由素材推出的洞察、\n  模型自身知识三个来源。出处 = 模型知识时**必须带限定词 + 本页入 `hedgePages`**,或改标\"待补\"。\n  危险的不是用模型知识,是不标注的模型知识(纪律见 content-deepening 第四章\"出处纪律\")\n- **时效自查**(③ 内):本页有市场规模/竞品/政策/价格/排名这类时间敏感项吗?\n  有 → 出处不得为\"模型知识\"(模型知识有截止日),只能是素材/用户口述/公开可核验/待补\n\n- **填卡前先读 `slides/deck-insights.md` 里本页那一行**(行动方案表:核心断言/证据需求/风险旗标/\n  待补素材)+ 相关洞察编号 → 填进 ② 的\"出处\"列与 ⑤。这是深化层产物被真正消费的地方;\n  快速档没有 insights,② 出处填素材位置或\"待补\",⑤ 按本页断言自判\n- **② 填不出可验证事实 → 这页现在不该写**:回去补料、换页,或按 ⑥ 退回原型 8 + 待补数据清单\n- **⑦ 超标当场处置**(演讲/混合档拆页、阅读档精简措辞)——写完再截图发现就是改一屏\n- **⑤ 有降级论断** → 限定词写进页面 + 本页文件名入 `slides.config.json` 的 `hedgePages`\n- 快速档降级:只填 ①②③ + 三问第 1 问(⑦ 仍必填),并在 `deck-pages.md` 顶部标\"快速档:降级填卡\"。\n  本工序**不花 agent 调用**,与大纲级形式门禁同例——所有档位都跑\n\n### Step 3 · 逐页写 HTML\n1. **按 brief 的骨架页序与密度参数写**(要点数/行数/字号/填充率是硬约束;超标:演讲/混合档拆页,阅读档精简措辞)\n2. **写页前只需读两份契约**:`reference/design-principles.md`(设计)+ `reference/html-spec.md`(转换)。\n   其余文档**用到才查**,不要通读(读取分层见文末\"文件清单\")。\n   逐页流程:**先定形式**(brief 大纲表\"形式\"列:文字/图示/图表/图片/混合)\n   → **再选原型**(查 `reference/page-archetypes.md` 的索引跳到目标原型,别通读 1800+ 行;咨询分析页型见组 7(31-43))\n   → **起手必须用现成件,不从空白页手写**(2026-08-17 第九轮改为默认而非建议):\n     先复制 `assets/snippets/INDEX.md` 的片段,或 `assets/slide-template{,-flex,-layout}.html`\n     三套样板页(方式 A/B/C),**再改参数**。实测:同一份输入,逐页手搓内联样式的 deck\n     (1377/3225 处 `style=`、class 去重 1-2 个)在字号值域与用色纪律上都明显更散\n   → **参数一律填变量名,不填 hex**:片段的 `{{BG}}`/`{{ACCENT}}`/`{{GRAD_FROM}}` 等色参数\n     填 `var(--brand-dark)` 这种形态。色板外硬编码会被 validate R1/R2 报 WARN(判据见\n     `design-principles.md`\"用色纪律\");需要浅一档/深一档的色**先查梯级令牌**\n     (`--brand-primary-soft/-pale`、`--brand-dark-pale/-tint/-mid`、`--ink-soft/-faint`、\n     `--surface-sunken`、`--signal-*-soft`),别自己调一个近似值 —— 那正是色值逐页漂的来源\n   → 容器内部写法查 `reference/layout-recipes.md`;要图标查 `assets/icons.md`\n     (用 `style=\"stroke:var(--变量)\"`,**禁 currentColor**)\n2.5 **P2 高级特性**(按需使用,详见 html-spec.md §5;**用法克制,以 design-principles 为准**):\n   - `data-shape=\"chevron|star5|rightArrow|...\"` → 80+ 预设几何(流程图/箭头/星形)\n   - `data-chart='{\"type\":\"bar\",...}'` → 原生可编辑图表(bar/line/area/pie)\n   - `<img data-object=\"true\">` → 原生可编辑图片(object-fit 映射;图片政策见 brief)\n   - `<video poster src>` / `<audio src>` → 原生音视频嵌入\n   - 转场/母版:由 playlist.json / slides.config.json 配置,非页面内属性\n3. **布局选择**:骨架(页标题/页码)用方式 A;成组内容(条目/分栏/数字带)优先方式 C 或 B(brief 另有指定时从其指定)\n4. **不改结构规则**:\n   - 画布 `1920x1080`,`.slide-container` relative + overflow hidden\n   - 每个可见元素可归结到 `data-object=\"true\"`;嵌套标记 = ERROR\n   - 多行文字显式 `line-height`;字重只用 400/600/700/800/900\n   - 文字纯色(半透明先预算混合色);装饰预算每页 ≤3 件;默认左对齐\n   - **每个内容页至少一块结构色面**(色带/深色面板/卡片底/表头底纹,≥1.5 万 px²)——\n     纯白底+黑字+细线是\"素雅单调\"的根源,validate 在 balanced/rich 档会报 WARN\n   - **颜色只来自 theme.css 色板**(2026-08-17 第九轮):`background`/`color`/`border-color`\n     写 `var(--…)`,不写 hex。要浅一档/深一档先查**梯级令牌**(见上 2 的清单),\n     没有合适令牌才加进 theme.css + 16 套预设(`node scripts/tools/gen-ladder.js`),\n     **不要就地调一个近似值** —— validate R1/R2/R3 会报(判据见 design-principles\"用色纪律\")。\n     `<svg>` 图标豁免此条,但也应写 `style=\"stroke:var(--变量)\"`\n   - **正文默认 24-28px**(演讲档),22px 是破档红线而非默认值;深色底上的文字**必须**用\n     `--on-navy-text`/`--on-navy-sub`,否则回退近黑压深底、PPTX 里不可见(H13)\n   - 纯 `transform:rotate()` 已支持(scale/skew/translate 仍禁);方式 C 子级禁写 position/left/top/width/height\n5. 备注按 brief 的备注策略写 `<template data-slide-notes>`\n\n### Step 3.5 · 视觉自查(写完页先过自己这关)\n```bash\nnode \"$SKILL_DIR/scripts/preview.js\" slides/\n```\n把每页截成 PNG(slides/.preview/),**逐张看图**,按八条自查。\n第 7-8 条自 2026-08-10 第八轮起是**复核**(判断已在 Step 3.0 的内容卡里做过),\n查的是\"卡上承诺的东西有没有真的落到页面上\",不是重新判一遍:\n1. **填充率**:内容带是否撑满 320-940?判据不是\"底边够低\"而是**墨迹铺开** ——\n   有没有 ≥200px 的连续空白断层?内容是否一头沉?底部一根细线 + 脚注**不算**撑满。\n   不达标 → 回 Step 3 按 scale-to-fill 放大字号/行距/间距\n2. **字号**:正文是否明显偏小?演讲档正文默认 **24-28px**(22px 是破档红线,不是默认值);\n   页标题/正文比值 <1.6 或全页字号只有两档 → 层级不足,按字号阶拉开\n3. **对齐**:卡片/条目边缘是否齐;间距是否一致 → 修正坐标或改方式 B/C\n4. **去 AI 味**:对照 brief 的约束清单(kicker/结论条/渐变条是否超编;装饰 ≤3 件;高亮 ≤1 处)\n5. **视觉形式**(2026-08-05 起):这页除了文字还有什么?答案为\"只有细线\"→ 记入纯文字页;全 deck 纯文字内容页占比/同形式连排是否超 brief 的形式偏好档 → 超则换图示原型(23-30),不换内容\n6. **结构色面**(2026-08-06 起):这页是不是纯白底 + 黑字 + 细线?内容页至少要有**一块结构色面**\n   (色带/深色面板/卡片底/表头底纹)。深色底上的文字有没有用 `--on-navy-*`?\n   用错会在 PPTX 里近黑压深底、整块消失(H13)\n7. **内容卡兑付 · 支撑与限定词**(2026-08-06 第六轮起限定词;2026-08-10 第八轮改为复核):\n   对照本页内容卡 —— ② 每条支撑的**可验证事实**在页面上看得见吗(还是只剩空泛的一句)?\n   ⑤ 判定要带限定词的地方带了吗(我们认为/有待验证/预估…),该页在 `hedgePages` 里吗?\n   ① 的标题换个 deck 还能用吗(空标题)?**把假设写成结论是 AI PPT 最典型的病**\n8. **内容卡兑付 · 数据口径**(2026-08-09 起,数据页与分析论证页):这页有具体数字/百分比/排名吗?\n   有则页面上必须真的有那一行来源注(≥16px):**时间范围 + 样本/范围 + 测算方式**,估算标\"估算\"并给假设\n   —— 内容卡 ③ 填的三要素与页面逐项对上没有?适用原型 17-20、31-43。\n   卡上 ⑥ 已判\"数据不足\"的页,页面必须真的退回原型 8,不许中途又编回一个基准。\n   判据见 `design-principles.md`\"数据页的口径纪律\"\n发现问题**就地修复并重截**,直到八关全过,再进 Step 4。\n**卡与页不一致时改哪个**:页面为准就改卡(排版中发现更好的说法,合法),\n但 ②③ 的事实与口径**只能改页面去兑付卡**——不许为了过关把卡上的事实要求划掉。\n\n### Step 4 · 预检(必须零 ERROR)\n```bash\nnode \"$SKILL_DIR/scripts/validate.js\" slides/\n```\n- ❌ ERROR → 必须修复后重跑,直到 0 ERROR\n- ⚠️ WARN → 逐条判断是否可接受(见 html-spec.md 速查表),可接受就在汇报中说明\n- 设计 WARN(文字适配/字号下限/画布填充/对齐,由 slides.config.json 的 design 键启用)→ 优先按 scale-to-fill 修复,这正是视觉质量的自动守门员\n\n### Step 5 · 转换\n```bash\nnode \"$SKILL_DIR/scripts/convert.js\" ./slides ./slides/playlist.json output.pptx\n```\n\n### Step 6 · 汇报\n告知用户:PPTX 路径、页数、validate 结果(残留 WARN 及理由)、备注写入情况、deck-brief.md 位置。\n如用户装了 PowerPoint,可提示可直接打开 output.pptx 检查。\n\n## 转换机制简述(排查问题时读)\n\n- 管线:加载页面 → 等字体就绪+稳定 → 注入提取脚本 → data-layout 解析 → 提取基元 → 截图 pass → pptxgenjs 渲染\n- **原生可编辑**(PPT 中可修改):文字/纯色形状/图片/表格/图表/列表/上下标/字距/渐变(opt-in)/预设几何/旋转/虚线边框\n- **截图贴回**(不可编辑):渐变(默认)/background-image/SVG/视觉特效/mix-blend-mode/clip-path(2x DPI,截图前隐藏文字避免重影)\n- 文字 run 级样式:斜体/下划线/删除线/超链接/text-transform 原生还原;`<sup>`/`<sub>` 原生上下标\n- 配置:`config/default.config.js` 是唯一事实源;项目级 `slides/slides.config.json` 覆盖(如 `{\"nativeGradient\":true}` 开启原生渐变;`{\"master\":{\"pageNumbers\":true}}` 开启页码;`{\"incrementalCache\":false}` 关闭增量缓存)\n- 转场:playlist 项 `{\"file\":\"01.html\",\"transition\":\"fade\"}` → p:transition(fade/push/wipe/cover/split)\n- 音视频:`<video poster src>` / `<audio src>` → addMedia 原生嵌入\n- 增量缓存:HTML 未变时跳过提取/截图(11x 提速);缓存目录 slides/.cache/\n- 叠放 = DOM 深度优先顺序;z-index 只影响浏览器合成\n- `<template data-slide-notes>` → 写入该页备注\n- 特性速查:`reference/creative-layouts.md` 查渐变/几何/图表等写法(含使用限制);页面形态以 page-archetypes.md 为准\n- 回归:`node \"$SKILL_DIR/scripts/test/golden.js\" verify` 三层等价(L1 提取+L2 XML+L3 截图);行为契约见 `reference/behavior-baseline.md`\n\n## 文件清单\n\n> **2026-08-06 第五轮 P4 重组**:此前 12 份 reference 平铺,\"必读\"散在各处措辞里,\n> 写第一页前要读 13 份文档 + 8 类资产(合计 3700+ 行)—— 实测后果是规范写了不被执行\n> (`--text-*` 令牌零引用、正文长期钉在破档线 22px,四轮无人发现)。\n> 现按**读取时机**分三层:主干必读只有 3 份,其余按需查。\n\n### 第一层 · 主干必读(只有这三份,合计约 720 行)\n\n| 文件 | 何时读 | 作用 |\n|---|---|---|\n| `reference/interview-guide.md` | **Step 1 之前** | 5 阶段 16 问 + 1 确认的访谈脚本(含推断总表与依赖图) |\n| `reference/design-principles.md` | **写第一页之前** | 设计契约:版面分区/字号阶/满填四判据/12 反模式/结构色面下限/**版面达标≠内容达标** |\n| `reference/html-spec.md` | **写第一页之前** | 转换契约:什么写法能无损还原 |\n\n这三份决定输出质量的下限。**其余任何一份都不该在写页前通读。**\n\n### 第二层 · 按需查阅(用到才读,查完即走)\n\n| 文件 | 什么时候需要 |\n|---|---|\n| `reference/page-archetypes.md` | 选页面形态时 —— **查索引直接跳到目标原型,别通读**(1800+ 行;组 7 为咨询分析页型) |\n| `reference/density-tiers.md` | 定档位参数、算填充率与要点数上限 |\n| `reference/layout-recipes.md` | 写方式 B/C 的容器骨架 |\n| `reference/creative-layouts.md` | 用渐变/几何/图表/旋转等特性,查写法与限制 |\n| `reference/content-deepening.md` | 需要四步追问/多角色/委员会(素材×深度矩阵定做什么);**第四章页级内容卡在 Step 3.0 前查**(所有档位) |\n| `reference/narrative-skeletons.md` | 定全篇叙事结构 |\n| `reference/theme-presets.md` / `brand-styles.md` | 选色板或蒸馏品牌风 |\n| `assets/icons.md` | 要图标时复制(`style=\"stroke:var(--变量)\"`,**禁 currentColor**) |\n| `assets/snippets/INDEX.md` | 找现成片段(36 个,含参数表与使用限制) |\n\n### 第三层 · 改代码才读\n\n| 文件 | 场景 |\n|---|---|\n| `reference/behavior-baseline.md` | **改转换管线前必读**(怪癖 H1-H14) |\n| `scripts/test/FEATURE-COVERAGE.md` | 增删转换特性或夹具页(硬约束) |\n| `CLAUDE.md` | 管线架构、回归纪律、单一事实源规则 |\n\n### 资产与脚本\n\n- `assets/theme.css` — 默认色板(含 12 个梯级令牌)+版面变量;`assets/presets/` — 16 套色板预设\n- `scripts/tools/gen-ladder.js` — 按各文件基色重算梯级令牌(改主色/加令牌后跑一次;幂等)\n- `assets/deck-brief.template.md` — 需求确认卡模板;`assets/slides.config.template.json` — 项目配置模板\n- `assets/deck-insights.template.md` — 深化层详档模板(洞察/假设/委员会意见与裁决/形式门禁/行动方案)\n- `assets/deck-pages.template.md` — 页级内容卡模板(Step 3.0 逐页填;**写物不是读物**,不计入写页前阅读量)\n- `assets/slide-template{,-flex,-layout}.html` — 三套样板页(方式 A/B/C)\n- `assets/playlist.template.json` — playlist 模板\n- `scripts/validate.js` — 预检器(ERROR/WARN 分级;设计检查缺省开启)\n- `scripts/preview.js` — 视觉自查截图(Step 3.5)\n- `scripts/convert.js` — 转换 CLI\n- `scripts/test/` — golden 回归 + 样张门禁 + 阈值守卫 + 生成侧回归\n\nFile v2.1.0:_meta.json\n\n{\n  \"ownerId\": \"kn7af33xbszyq32pce2pa6f84n8bdfqy\",\n  \"slug\": \"html-slides-to-pptx\",\n  \"version\": \"2.1.0\",\n  \"publishedAt\": 1787015699551\n}\n\nFile v2.1.0:scripts/package-lock.json\n\n{\n  \"name\": \"html-slides-tools\",\n  \"version\": \"1.0.0\",\n  \"lockfileVersion\": 3,\n  \"requires\": true,\n  \"packages\": {\n    \"\": {\n      \"name\": \"html-slides-tools\",\n      \"version\": \"1.0.0\",\n      \"dependencies\": {\n        \"playwright\": \"^1.61.1\",\n        \"pptxgenjs\": \"^4.0.1\"\n      }\n    },\n    \"node_modules/@types/node\": {\n      \"version\": \"22.20.1\",\n      \"resolved\": \"https://registry.npmmirror.com/@types/node/-/node-22.20.1.tgz\",\n      \"integrity\": \"sha512-EANqOCF9QFyra+4pfxUcX9STKJpCLjMbObVzljIJomAWSnuSIEAvyzEU53GaajbXJEgdh0iEcPL+DGvpUd4k1Q==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"undici-types\": \"~6.21.0\"\n      }\n    },\n    \"node_modules/core-util-is\": {\n      \"version\": \"1.0.3\",\n      \"resolved\": \"https://registry.npmmirror.com/core-util-is/-/core-util-is-1.0.3.tgz\",\n      \"integrity\": \"sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/fsevents\": {\n      \"version\": \"2.3.2\",\n      \"resolved\": \"https://registry.npmmirror.com/fsevents/-/fsevents-2.3.2.tgz\",\n      \"integrity\": \"sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==\",\n      \"hasInstallScript\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"darwin\"\n      ],\n      \"engines\": {\n        \"node\": \"^8.16.0 || ^10.6.0 || >=11.0.0\"\n      }\n    },\n    \"node_modules/https\": {\n      \"version\": \"1.0.0\",\n      \"resolved\": \"https://registry.npmmirror.com/https/-/https-1.0.0.tgz\",\n      \"integrity\": \"sha512-4EC57ddXrkaF0x83Oj8sM6SLQHAWXw90Skqu2M4AEWENZ3F02dFJE/GARA8igO79tcgYqGrD7ae4f5L3um2lgg==\",\n      \"license\": \"ISC\"\n    },\n    \"node_modules/image-size\": {\n      \"version\": \"1.2.1\",\n      \"resolved\": \"https://registry.npmmirror.com/image-size/-/image-size-1.2.1.tgz\",\n      \"integrity\": \"sha512-rH+46sQJ2dlwfjfhCyNx5thzrv+dtmBIhPHk0zgRUukHzZ/kRueTJXoYYsclBaKcSMBWuGbOFXtioLpzTb5euw==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"queue\": \"6.0.2\"\n      },\n      \"bin\": {\n        \"image-size\": \"bin/image-size.js\"\n      },\n      \"engines\": {\n        \"node\": \">=16.x\"\n      }\n    },\n    \"node_modules/immediate\": {\n      \"version\": \"3.0.6\",\n      \"resolved\": \"https://registry.npmmirror.com/immediate/-/immediate-3.0.6.tgz\",\n      \"integrity\": \"sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/inherits\": {\n      \"version\": \"2.0.4\",\n      \"resolved\": \"https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz\",\n      \"integrity\": \"sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==\",\n      \"license\": \"ISC\"\n    },\n    \"node_modules/isarray\": {\n      \"version\": \"1.0.0\",\n      \"resolved\": \"https://registry.npmmirror.com/isarray/-/isarray-1.0.0.tgz\",\n      \"integrity\": \"sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/jszip\": {\n      \"version\": \"3.10.1\",\n      \"resolved\": \"https://registry.npmmirror.com/jszip/-/jszip-3.10.1.tgz\",\n      \"integrity\": \"sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==\",\n      \"license\": \"(MIT OR GPL-3.0-or-later)\",\n      \"dependencies\": {\n        \"lie\": \"~3.3.0\",\n        \"pako\": \"~1.0.2\",\n        \"readable-stream\": \"~2.3.6\",\n        \"setimmediate\": \"^1.0.5\"\n      }\n    },\n    \"node_modules/lie\": {\n      \"version\": \"3.3.0\",\n      \"resolved\": \"https://registry.npmmirror.com/lie/-/lie-3.3.0.tgz\",\n      \"integrity\": \"sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"immediate\": \"~3.0.5\"\n      }\n    },\n    \"node_modules/pako\": {\n      \"version\": \"1.0.11\",\n      \"resolved\": \"https://registry.npmmirror.com/pako/-/pako-1.0.11.tgz\",\n      \"integrity\": \"sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==\",\n      \"license\": \"(MIT AND Zlib)\"\n    },\n    \"node_modules/playwright\": {\n      \"version\": \"1.61.1\",\n      \"resolved\": \"https://registry.npmmirror.com/playwright/-/playwright-1.61.1.tgz\",\n      \"integrity\": \"sha512-DWnY5o3YbLWK4GovuAVwpqL+1VwGNdUGrRr++8j8PtQQzvAVZUIMjKQ90fY689sEJZJBbZVw1rXaOKSTitkzPQ==\",\n      \"license\": \"Apache-2.0\",\n      \"dependencies\": {\n        \"playwright-core\": \"1.61.1\"\n      },\n      \"bin\": {\n        \"playwright\": \"cli.js\"\n      },\n      \"engines\": {\n        \"node\": \">=18\"\n      },\n      \"optionalDependencies\": {\n        \"fsevents\": \"2.3.2\"\n      }\n    },\n    \"node_modules/playwright-core\": {\n      \"version\": \"1.61.1\",\n      \"resolved\": \"https://registry.npmmirror.com/playwright-core/-/playwright-core-1.61.1.tgz\",\n      \"integrity\": \"sha512-h7Qlt6m4REp25qvIdvbDtVmD4LqVXfpRxhORv9L0jzETM05p4fuPJ3dKyuSXQxDSbXnmS79HAgi9589lGSpLkg==\",\n      \"license\": \"Apache-2.0\",\n      \"bin\": {\n        \"playwright-core\": \"cli.js\"\n      },\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/pptxgenjs\": {\n      \"version\": \"4.0.1\",\n      \"resolved\": \"https://registry.npmmirror.com/pptxgenjs/-/pptxgenjs-4.0.1.tgz\",\n      \"integrity\": \"sha512-TeJISr8wouAuXw4C1F/mC33xbZs/FuEG6nH9FG1Zj+nuPcGMP5YRHl6X+j3HSUnS1f3at6k75ZZXPMZlA5Lj9A==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@types/node\": \"^22.8.1\",\n        \"https\": \"^1.0.0\",\n        \"image-size\": \"^1.2.1\",\n        \"jszip\": \"^3.10.1\"\n      }\n    },\n    \"node_modules/process-nextick-args\": {\n      \"version\": \"2.0.1\",\n      \"resolved\": \"https://registry.npmmirror.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz\",\n      \"integrity\": \"sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/queue\": {\n      \"version\": \"6.0.2\",\n      \"resolved\": \"https://registry.npmmirror.com/queue/-/queue-6.0.2.tgz\",\n      \"integrity\": \"sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"inherits\": \"~2.0.3\"\n      }\n    },\n    \"node_modules/readable-stream\": {\n      \"version\": \"2.3.8\",\n      \"resolved\": \"https://registry.npmmirror.com/readable-stream/-/readable-stream-2.3.8.tgz\",\n      \"integrity\": \"sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"core-util-is\": \"~1.0.0\",\n        \"inherits\": \"~2.0.3\",\n        \"isarray\": \"~1.0.0\",\n        \"process-nextick-args\": \"~2.0.0\",\n        \"safe-buffer\": \"~5.1.1\",\n        \"string_decoder\": \"~1.1.1\",\n        \"util-deprecate\": \"~1.0.1\"\n      }\n    },\n    \"node_modules/safe-buffer\": {\n      \"version\": \"5.1.2\",\n      \"resolved\": \"https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.1.2.tgz\",\n      \"integrity\": \"sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/setimmediate\": {\n      \"version\": \"1.0.5\",\n      \"resolved\": \"https://registry.npmmirror.com/setimmediate/-/setimmediate-1.0.5.tgz\",\n      \"integrity\": \"sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/string_decoder\": {\n      \"version\": \"1.1.1\",\n      \"resolved\": \"https://registry.npmmirror.com/string_decoder/-/string_decoder-1.1.1.tgz\",\n      \"integrity\": \"sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"safe-buffer\": \"~5.1.0\"\n      }\n    },\n    \"node_modules/undici-types\": {\n      \"version\": \"6.21.0\",\n      \"resolved\": \"https://registry.npmmirror.com/undici-types/-/undici-types-6.21.0.tgz\",\n      \"integrity\": \"sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/util-deprecate\": {\n      \"version\": \"1.0.2\",\n      \"resolved\": \"https://registry.npmmirror.com/util-deprecate/-/util-deprecate-1.0.2.tgz\",\n      \"integrity\": \"sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==\",\n      \"license\": \"MIT\"\n    }\n  }\n}\n\nFile v2.1.0:scripts/package.json\n\n{\n  \"name\": \"html-slides-tools\",\n  \"version\": \"3.0.0\",\n  \"description\": \"HTML slides -> PPTX converter + validator (bundled with the html-slides skill)\",\n  \"private\": true,\n  \"type\": \"commonjs\",\n  \"scripts\": {\n    \"test\": \"node test/golden.js verify\",\n    \"test:update\": \"node test/golden.js update\",\n    \"test:design\": \"node test/exemplar-checks.js && node test/threshold-parity.js && node test/generation-checks.js && node test/anchor-integrity.js\",\n    \"test:thresholds\": \"node test/threshold-parity.js\",\n    \"test:generation\": \"node test/generation-checks.js\",\n    \"test:anchors\": \"node test/anchor-integrity.js\",\n    \"validate\": \"node validate.js\",\n    \"convert\": \"node convert.js\"\n  },\n  \"dependencies\": {\n    \"playwright\": \"^1.61.1\",\n    \"pptxgenjs\": \"^4.0.1\"\n  }\n}\n\nFile v2.1.0:scripts/test/FEATURE-COVERAGE.md\n\n# 特性覆盖矩阵(FEATURE-COVERAGE)\n\n> golden fixtures 的\"特性 → 锚定页\"台账(2026-08-02 Phase G 建立)。\n> **登记规则(硬约束)**:\n> 1. 新增转换器特性(基元/样式/元素/配置)时,必须指定锚定页并更新本表;无锚定页的特性不得合并。\n> 2. 删除夹具页前,先查本表确认它不是某特性的唯一锚点。\n> 3. 样张页(96-107、110-117、118-130)同时受 `test/exemplar-checks.js` 设计门禁(0 ERROR/0 WARN)。\n> 4. **2026-08-06 第五轮 P5**:本表的锚点关系已由 `test/anchor-integrity.js` 变成**可执行断言**\n>    —— 改样张设计时若换掉了承载特性的元素,守卫会失败(唯一锚点失效 = 致命)。\n>    新增/换锚时**同步改该守卫的 ANCHORS 表**,否则台账与守卫脱节(守卫自身会警告)。\n\n### 样张双角色的已知张力(2026-08-06 定型)\n\n样张页身兼\"设计范本 + 转换锚点\"两职。曾考虑让样张退出 L2/L3 基线以解耦,**经查证不可行**:\n`99-archetype-chart` 是 `data-chart:line` 的唯一锚点,`107-dashboard` 是 pie/doughnut/area 的唯一锚点,\n`112-funnel` 是 `data-shape=\"trapezoid\"` 的唯一锚点 —— 退出即等于删除这些特性的转换覆盖。\n\n实测澄清了成本结构:这 9 页**本来就不在 L3**(2026-08-05 瘦身:L3 只截含 capture 基元的页),\n所以改设计的成本只有 L1+L2 重建,而那是\"输出确实变了\"的证据,不是冗余开销。\n真正的风险不是重建成本,而是**改设计会静默摧毁转换覆盖**:实测把 99 页的 `data-chart` 换成纯文本后,\n样张门禁 ✅、生成侧回归 ✅,只有 golden 报 diff —— 而\"我重排了这页\"的 diff 复核里重建基线是自然动作。\n故结论:**保留双角色,用 `anchor-integrity.js` 守住锚点**,而不是拆分角色。\n> 页面角色:fidelity 锚(01-21 精简页/游离页/特性页)= 转换保真;exemplar 样张(96-107、110-117、118-130)= 保真+设计纪律双锚。\n> 2026-08-05 第三轮重构(布局丰富度):零管线改动;新增样张 110-117 锚定组 6 图示原型(23-30)与内联 SVG 图标。\n> 2026-08-09 第七轮重构(咨询分析布局):零管线改动;新增样张 118-130 锚定组 7 分析论证原型(31-43)。\n> 新增四个唯一锚点:`data-chart:scatter`→123、`data-shape=\"pie\"`→120、`data-shape=\"diamond\"`→122、td 级底纹→125。\n\n## 一、文字类\n\n| 特性 | 锚定页 | 备注 |\n|---|---|---|\n| 斜体 `<i>/<em>` | 90-p0-features、49-four-layer、chip-market-share | 49-four/chip 是历史缺陷修复锚 |\n| 下划线 / 删除线 / 超链接 | 90-p0-features | run 级 |\n| run 级字体 fontFace | 90-p0-features、96-107(`.num`) | `.num` Inter 混排是真实场景锚 |\n| text-transform | 90-p0-features | uppercase/lowercase |\n| 上下标 `<sup>/<sub>` | 93-p2-sup-sub-geo | baseline 30000/-40000 |\n| run 级字距 charSpacing | 93-p2-sup-sub-geo | 与 box 级独立 |\n| 原生列表 `<ul>/<ol>` bullet | 91-p1-forms、01-cockpit 压测(临时) | LI 直接含文字挂 bullet;**2026-08-05 H11 修复**:旧写法 type+characterCode 永不产 buChar;现 UL 无 type、OL 用 style |\n| pre/code 空白保留 | 91-p1-forms | white-space:pre |\n| 竖排 writing-mode | 49-four-layer | 实验性 eaVert(基线 WARN) |\n| 混合字号行 | 98-statband、107-dashboard | 大数字+单位,行高按最大 run |\n| 500 字重退化 WARN | advice-for-newcomers、ai-trends-2026、four-revolutions | validate 基线锚 |\n\n## 二、形状/装饰类\n\n| 特性 | 锚定页 | 备注 |\n|---|---|---|\n| 纯色形状 / 圆角 / 正圆 | 全体 | 基础 |\n| 统一边框 | 02 等 | px→pt(0.5 倍) |\n| 非统一边框逐边细条 | 02、12 | 圆角共存 WARN 锚 |\n| 虚线/点线 dashType | 90-p0-features | dashed→dash,dotted→sysDot |\n| box-shadow 真实参数 | 07-journey-map、data-limit-boundary、90 | 历史缺陷修复锚(行为红线) |\n| 纯旋转 rotate | 90-p0-features、93-p2-sup-sub-geo | origin 居中约束 |\n| data-shape 预设几何 | 93-p2-sup-sub-geo、111(chevron/homePlate)、112(trapezoid+rotate)、116(triangle/trapezoid) | 15 种(白名单 80+) |\n| 不透明度 opacity 折算 | 全体(基础路径) | 形状填充折算 |\n| 内联 SVG 图标(截图) | 110/114/115/117(卡内嵌套)、113(环形箭头) | 2026-08-05;stroke 显式 hex;currentColor→空白(H7 怪癖) |\n| 组 6 图示原型 | 110 图标网格(23)/111 chevron 带(24)/112 漏斗(25)/113 循环(27)/114 辐射(28)/115 色带(30)/116 金字塔(26)/117 对比卡阵(29) | 2026-08-05 第三轮;exemplar 门禁 0/0 |\n| `data-shape=\"pie\"` 扇形(Harvey ball) | **120-harvey-matrix**(唯一锚点) | 2026-08-09;圆饼打分格,与 ellipse 描边配套表达五档 |\n| `data-shape=\"diamond\"` 菱形(里程碑) | **122-swimlane-gantt**(唯一锚点) | 2026-08-09;压网格线的里程碑标记 |\n| 组 7 分析论证原型 | 118 执行摘要(31)/119 议题树(32)/120 评估矩阵(33)/121 瀑布(34)/122 泳道甘特(35)/123 散点(36)/124 驱动树(37)/125 热力(38)/126 情景(39)/127 规模拆解(40)/128 成熟度(41)/129 价值链(42)/130 对标(43) | 2026-08-09 第七轮;零管线改动;exemplar 门禁 0/0 |\n| preview data-shape clip-path 近似 | 111/112/116(仅 preview 截图层) | H8;页面文件不动 |\n\n## 三、背景/媒体类\n\n| 特性 | 锚定页 | 备注 |\n|---|---|---|\n| 渐变(截图路径,默认) | 01、94-p2-gradient | 2x DPI |\n| 原生线性渐变 a:gradFill | **已知缺口(有意)** | `nativeGradient` 默认关;开启路径由 convert 冒烟覆盖,未入 golden(见\"五\") |\n| `<img>` 原生图片 | 91-p1-forms | object-fit 映射;file:// 路径(注意环境漂移) |\n| `<table>` 原生表格 | 91-p1-forms、106-table-focus | colspan/底纹/边框/右对齐;**2026-08-05 H12 修复**:tr 级底纹(background 不继承到 td)原丢失,现沿 td→tr→table 回溯 |\n| `<canvas>` 截图 | 92-p1-chart-visual | 可见化保底 |\n| data-chart:bar | 92-p1-chart-visual | 原生图表 |\n| data-chart:line | 99-archetype-chart | |\n| data-chart:pie / doughnut / area | 107-dashboard | 2026-08-02 Phase G 补锚 |\n| data-chart:scatter | **123-scatter-map**(唯一锚点) | 2026-08-09;`series[0]`=X 轴值,`lineSize:0` 去连线。**bubble 当前渲染器不支持**(数据装配不符,见\"已知缺口\") |\n| `<svg>` 截图 | data-limit-boundary | 整体截图含文字 |\n| `<video>` / `<audio>` | 95-p2-master-media | addMedia;poster 封面 |\n| 图标字体自动截图 | 92-p1-chart-visual | iconFonts 命中 |\n| mix-blend-mode / clip-path 转截图 | 92-p1-chart-visual | 视觉特效 |\n\n## 四、布局/页面级\n\n| 特性 | 锚定页 | 备注 |\n|---|---|---|\n| 方式 A 绝对定位 | 全体 | |\n| 方式 B flex/grid 流式 | 02、96-editorial、104-comparison | |\n| 方式 C data-layout(columns/grid) | 98-statband、103-split-7-5、107-dashboard | 解析器改写 |\n| 母版 pageNumbers + footer | **全体 L2 页**(fixtures/slides.config.json) | 2026-08-02 Phase G 开启 |\n| 转场 fade/push/wipe/cover/split | 96/97/98/99/100(playlist 项) | 2026-08-02 Phase G 开启,五档齐 |\n| 深底容器背景导出 | 97-archetype-divider、01 | |\n| 演讲者备注 template | 全体 | notesSlide XML |\n| 增量缓存 | L2 全 deck | hash 命中/失效 |\n| design.formProfile deck 级形式检查 | 开发期构造用例(5 页纯文字单调 deck → 2 WARN) | 2026-08-05;缺省/text 休眠,fixtures 无 profile 零影响 |\n\n## 五、行为锚点(回归红线活证据,删页红线)\n\n| 页 | 锚定的历史行为 |\n|---|---|\n| 49-four-layer-overview | 斜体提取修复(4 处)+ 竖排 eaVert |\n| chip-market-share | 斜体提取修复(1 处) |\n| 07-journey-map | box-shadow 真实值化(4 处) |\n| data-limit-boundary | box-shadow 真实值化(7 处)+ SVG 截图 |\n| advice-for-newcomers | 字体时序加固(L1 height 抖动 37→39px) |\n| ai-trends-2026 / four-revolutions | 500 字重 WARN 基线 |\n\n## 六、设计质量检查的锚定页(2026-08-06 第四轮 P3 建立)\n\n> 这些是 **validate 设计检查**(非转换器特性)的锚定页,由 `test/exemplar-checks.js` 断言 0 ERROR/0 WARN。\n> 与转换器特性同规则:新增设计规则必须在此登记锚定页;改这些页前先查本表。\n> 判据阈值与设计契约同源 —— 改阈值须同步 `reference/design-principles.md` 第一/二章。\n\n| 检查(规则号) | 正向锚定页(应通过) | 反向自证方式 | 标定实测值 |\n|---|---|---|---|\n| 文字对比度(layout-checks 5) | 97/103/117(深底页,用 `--on-navy-*`) | 把 `--on-navy-text` 改成 `#1F1F1F` → 97 页立即 2×ERROR(1.22:1) | 全 44 页命中 0;豁免 ≥120px 水印数字、≤2 字符纯符号 |\n| 墨迹行覆盖率(dom-checks 14a) | 96/104/105/106/107/111(P5 重排后 58-97%) | 105 重排前实测 29% | 阈值 55%;airy 页(97/101/102)整条豁免 |\n| 连续空白断层(dom-checks 14b) | 同上(重排后 20-110px) | 96 重排前 330px | 阈值 200px |\n| 上下分布偏斜(dom-checks 14c) | 全样张 | — | 阈值任一半 ≤88% |\n| 字号层级(dom-checks 15) | 全样张(比值 2.1-4.7) | 构造同字号页 → WARN | 页标题/正文 ≥1.6;字号档数 ≥3;正文样本限 top≥320 |\n| 结构色面下限(dom-checks 16) | 96/98/99/100/104/105/106/107/111(色面 13.9-45%) | 96-107 段重排前 10 页色面 **恰好 0%** | ≥1 块(≥1.5 万 px²)或 ≥8%;仅 balanced/rich 档 |\n| 企业黑话密度(dom-checks 17) | 全语料(一档命中最高 1 次 / 11.5‰) | 构造空话页 → WARN(5 次 / 32 字 = 156‰) | ≥40‰ 且 ≥3 次;二档词(对齐/协同/沉淀/闭环)不计 |\n| **限定词落地(layout-checks 6)** | 无常设锚定页(按设计:`hedgePages` 缺省 `[]`,旧夹具零命中) | 注入式自证:构造两页(同内容,一页含\"我们认为/有待验证\")→ 登记进 `hedgePages` → 未含限定词页 WARN、含限定词页静默;未登记页零命中 | 限定词表 7 词;只查内容区(top < footerZoneTop 980),`<template>` 备注不计 |\n| **色板外用色 R1 / R1b(palette-checks)** | 全 33 张样张(迁移后裸色仅剩 `<svg>` 内与 rgba 阴影,两者均豁免) | `generation-checks.js` C4a 构造式自证:整页写死另一套预设色值 → 逐色 WARN | 容差 ΔRGB ≤6 判\"近似重打\";同页色板外色 ≥3 种升级为\"整页脱离色板\" |\n| **var() 占比 R2(palette-checks)** | 全 33 张样张(迁移后色声明 var() 占比 100%) | C4b:零 var() 页 → WARN | 色声明 ≥4 处才判;占比下限 70%(实测样张中位 95%、坏 deck 0%) |\n| **整套色板未生效 R3(index.js deck 级)** | 全 33 张样张(交集充足) | C4c:4 页全用另一套预设色 → deck 级 WARN | 裸色种类 ≥5 种才判;前 8 高频色与色板交集 <3。**与 R2 互补**:用对色板但写死 hex 时 R3 沉默、R2 抓 |\n\n**exemplar-checks 的 DESIGN 档**:`presentation` + `balanced` + airyPages(97/101/102)。\n`formProfile` 是 2026-08-06 补的 —— 缺该键时规则 16 在样张上从不触发(样张自己得先过 balanced 档)。\n\n## 七、已知缺口(有意/待办)\n\n| 缺口 | 状态 | 说明 |\n|---|---|---|\n| 原生渐变(nativeGradient:true)渲染路径 | 有意未入 golden | D2 拍板默认关;建议后续建第二 playlist(独立 config)锚定 |\n| validate ERROR 触发路径 | 未系统锚定 | 目前以 0 ERROR 通过反向验证;ERROR 构造用例散见于开发期,低优先。例外:对比度 ERROR 已有注入式自证(见上表) |\n| 全出血大图页(原型 11)/ 图文页(原型 10) | 样张未含 | 图片型页面已有 91 img 锚定;后续按需要补样张 |\n| `95-p2-master-media.html` 引用的 `demo.mp4` | 仓库中从未存在 | 转换时报\"媒体文件不存在\"警告并跳过;媒体嵌入路径因此未被真正锚定(2026-08-06 发现,先登记不修) |\n| 深化层产物本身的质量 | **有意未测**(2026-08-06 第六轮 P6 决策) | D 组能断言深化层的**结构**(计数一致、总表取值合法、依赖图完备、字段对齐、角色覆盖、阈值同源),但无法断言\"这条洞察是否真的深刻\"\"这次委员会是否真的改进了大纲\"。丢弃率是委员会的自体检指标,不是质量判据。内容质量的最终闸仍是 Q5 用户确认 —— 机器不越位 |\n| `--text-*` 字号令牌零引用 | **已知未修**(2026-08-06 P4 决策) | 语料/片段/原型库共 59 处硬编码 font-size,`--text-*` 引用数为 **0** —— 字号阶仍只存在于文档。未迁移的原因:`--text-body: 24px` 与页面现用 26px 不等值,迁移会**实际改变字号**而非纯重构,且要重建一轮基线。替代保护:`generation-checks.js` 的 A1/A2/A3 已能拦住\"令牌缺失/下限当默认值/正文破档\"三类漂移,故迁移收益有限、可延后 |\n| `data-chart:bubble` 气泡图 | **不支持,有意未修**(2026-08-09) | 实测 `renderChart` 喂 bubble 的数据形状不符 pptxgenjs 预期,抛 `Cannot read properties of undefined`。原型 36 因此声明\"需要第三维时写进点标注\",不给气泡骨架。要支持需改 `render/chart-renderer.js` 的 bubble 数据装配(约 10 行)+ 补锚点页 + 重建 L2 基线 —— 本轮不做,以免把纯文档改动扩成管线改动 |\n| 数据页口径纪律的机器约束 | **有意不做 validate 规则**(2026-08-09) | 机器只能查\"页底有没有一行 ≥16px 小字\",查不了那行字是否诚实;做成外观检查会催生\"贴一行假来源过检\"(与 design-principles 记录的\"1px 细线+脚注凑底边\"同一类失败)。故落为写作纪律 + SKILL Step 3.5 第 8 条自查。若要机器化,正确形态是 `slides.config.json` 显式登记数据页与口径(声明式,像 `airyPages`/`hedgePages`) |\n\n## 八、corpus 账本(2026-08-02 Phase G 定稿;2026-08-05 第三轮更新 + 瘦身)\n\n- L1/L3:36 页 + 8 样张(110-117)+ 13 样张(118-130)+ 模板 3(extraPages)= **60**\n- L2 playlist:32 页 + 8 样张 + 13 样张 = **53**(10 精简 deck + 4 游离 + 6 特性 + 33 样张)\n- 退役:06/16/18(重复)+ 04/07/10/13/14/17/19/20(精简)= 11 页\n- **2026-08-05 瘦身(golden.js)**:L2 notesSlide 合并为单项锚定(53 文件 → 1 项,差异时明细列文件);L3 仅含 capture 基元页截图(19 页;41 纯原生页由 L1 完全锚定免截图);孤儿 PNG(退役 11 页)已清。比对项 174 → **107**(2026-08-05),磁盘 6.4MB → 2.7MB,保护范围不减\n- **2026-08-09 第七轮**:新增 13 页组 7 样张(118-130),比对项 107 → **133**(L1 60 + L2 54 + L3 19)。这 13 页**全为纯原生**(无 capture 基元),故 L3 截图数不变、免截图数 28 → 41 —— 新增成本只落在 L1/L2\n\nFile v2.1.0:scripts/test/fixtures.json\n\n{\n  \"_comment\": \"路径相对 scripts/test/ 解析(golden.js 统一 resolve);夹具已 vendored 进 fixtures/,技能目录自包含\",\n  \"slidesDir\": \"./fixtures/slides\",\n  \"playlistFile\": \"./fixtures/slides/playlist.json\",\n  \"playlistPages\": [\n    \"01.html\",\n    \"02.html\",\n    \"03.html\",\n    \"05.html\",\n    \"08.html\",\n    \"09.html\",\n    \"11.html\",\n    \"12.html\",\n    \"15.html\",\n    \"21.html\",\n    \"07-journey-map.html\",\n    \"49-four-layer-overview.html\",\n    \"advice-for-newcomers.html\",\n    \"data-limit-boundary.html\",\n    \"90-p0-features.html\",\n    \"91-p1-forms.html\",\n    \"92-p1-chart-visual.html\",\n    \"93-p2-sup-sub-geo.html\",\n    \"94-p2-gradient.html\",\n    \"95-p2-master-media.html\",\n    \"96-archetype-editorial.html\",\n    \"97-archetype-divider.html\",\n    \"98-archetype-statband.html\",\n    \"99-archetype-chart.html\",\n    \"100-agenda.html\",\n    \"101-big-statement.html\",\n    \"102-quote.html\",\n    \"103-split-7-5.html\",\n    \"104-comparison.html\",\n    \"105-timeline.html\",\n    \"106-table-focus.html\",\n    \"107-dashboard.html\",\n    \"110-icon-grid.html\",\n    \"111-chevron-flow.html\",\n    \"112-funnel.html\",\n    \"113-cycle.html\",\n    \"114-hub-spoke.html\",\n    \"115-color-band.html\",\n    \"116-pyramid.html\",\n    \"117-vs-cards.html\",\n    \"118-exec-summary.html\",\n    \"119-issue-tree.html\",\n    \"120-harvey-matrix.html\",\n    \"121-waterfall.html\",\n    \"122-swimlane-gantt.html\",\n    \"123-scatter-map.html\",\n    \"124-driver-tree.html\",\n    \"125-heatmap-matrix.html\",\n    \"126-scenario.html\",\n    \"127-market-sizing.html\",\n    \"128-maturity-ladder.html\",\n    \"129-value-chain.html\",\n    \"130-benchmark.html\"\n  ],\n  \"pages\": [\n    \"01.html\",\n    \"02.html\",\n    \"03.html\",\n    \"05.html\",\n    \"08.html\",\n    \"09.html\",\n    \"11.html\",\n    \"12.html\",\n    \"15.html\",\n    \"21.html\",\n    \"05-four-questions-ai-capabilities.html\",\n    \"07-journey-map.html\",\n    \"49-four-layer-overview.html\",\n    \"advice-for-newcomers.html\",\n    \"ai-trends-2026.html\",\n    \"chip-market-share.html\",\n    \"data-limit-boundary.html\",\n    \"four-revolutions.html\",\n    \"90-p0-features.html\",\n    \"91-p1-forms.html\",\n    \"92-p1-chart-visual.html\",\n    \"93-p2-sup-sub-geo.html\",\n    \"94-p2-gradient.html\",\n    \"95-p2-master-media.html\",\n    \"96-archetype-editorial.html\",\n    \"97-archetype-divider.html\",\n    \"98-archetype-statband.html\",\n    \"99-archetype-chart.html\",\n    \"100-agenda.html\",\n    \"101-big-statement.html\",\n    \"102-quote.html\",\n    \"103-split-7-5.html\",\n    \"104-comparison.html\",\n    \"105-timeline.html\",\n    \"106-table-focus.html\",\n    \"107-dashboard.html\",\n    \"110-icon-grid.html\",\n    \"111-chevron-flow.html\",\n    \"112-funnel.html\",\n    \"113-cycle.html\",\n    \"114-hub-spoke.html\",\n    \"115-color-band.html\",\n    \"116-pyramid.html\",\n    \"117-vs-cards.html\",\n    \"118-exec-summary.html\",\n    \"119-issue-tree.html\",\n    \"120-harvey-matrix.html\",\n    \"121-waterfall.html\",\n    \"122-swimlane-gantt.html\",\n    \"123-scatter-map.html\",\n    \"124-driver-tree.html\",\n    \"125-heatmap-matrix.html\",\n    \"126-scenario.html\",\n    \"127-market-sizing.html\",\n    \"128-maturity-ladder.html\",\n    \"129-value-chain.html\",\n    \"130-benchmark.html\"\n  ],\n  \"extraPages\": [\n    \"../../assets/slide-template.html\",\n    \"../../assets/slide-template-flex.html\",\n    \"../../assets/slide-template-layout.html\"\n  ]\n}\n\nFile v2.1.0:scripts/test/fixtures/slides/playlist.json\n\n{\n  \"schemaVersion\": \"1.0\",\n  \"format\": \"html\",\n  \"metadata\": {\n    \"title\": \"AI辅助ESG管理革新工作坊 · I.D.E.A.智能工作流一日精修\",\n    \"description\": \"讲师投屏PPT · 联想Lenovo视觉风格 · 微软雅黑 · 全天课程\",\n    \"author\": \"\"\n  },\n  \"canvas\": {\n    \"width\": 1920,\n    \"height\": 1080\n  },\n  \"playlist\": [\n    \"01.html\",\n    \"02.html\",\n    \"03.html\",\n    \"05.html\",\n    \"08.html\",\n    \"09.html\",\n    \"11.html\",\n    \"12.html\",\n    \"15.html\",\n    \"21.html\",\n    \"07-journey-map.html\",\n    \"49-four-layer-overview.html\",\n    \"advice-for-newcomers.html\",\n    \"data-limit-boundary.html\",\n    \"90-p0-features.html\",\n    \"91-p1-forms.html\",\n    \"92-p1-chart-visual.html\",\n    \"93-p2-sup-sub-geo.html\",\n    \"94-p2-gradient.html\",\n    \"95-p2-master-media.html\",\n    {\n      \"file\": \"96-archetype-editorial.html\",\n      \"transition\": \"fade\"\n    },\n    {\n      \"file\": \"97-archetype-divider.html\",\n      \"transition\": \"push\"\n    },\n    {\n      \"file\": \"98-archetype-statband.html\",\n      \"transition\": \"wipe\"\n    },\n    {\n      \"file\": \"99-archetype-chart.html\",\n      \"transition\": \"cover\"\n    },\n    {\n      \"file\": \"100-agenda.html\",\n      \"transition\": \"split\"\n    },\n    \"101-big-statement.html\",\n    \"102-quote.html\",\n    \"103-split-7-5.html\",\n    \"104-comparison.html\",\n    \"105-timeline.html\",\n    \"106-table-focus.html\",\n    \"107-dashboard.html\",\n    \"110-icon-grid.html\",\n    \"111-chevron-flow.html\",\n    \"112-funnel.html\",\n    \"113-cycle.html\",\n    \"114-hub-spoke.html\",\n    \"115-color-band.html\",\n    \"116-pyramid.html\",\n    \"117-vs-cards.html\",\n    \"118-exec-summary.html\",\n    \"119-issue-tree.html\",\n    \"120-harvey-matrix.html\",\n    \"121-waterfall.html\",\n    \"122-swimlane-gantt.html\",\n    \"123-scatter-map.html\",\n    \"124-driver-tree.html\",\n    \"125-heatmap-matrix.html\",\n    \"126-scenario.html\",\n    \"127-market-sizing.html\",\n    \"128-maturity-ladder.html\",\n    \"129-value-chain.html\",\n    \"130-benchmark.html\"\n  ]\n}\n\nFile v2.1.0:scripts/test/fixtures/slides/slides.config.json\n\n{\n  \"master\": {\n    \"pageNumbers\": true,\n    \"footer\": \"golden-fixture\",\n    \"footerColor\": \"999999\"\n  },\n  \"design\": {\n    \"tier\": \"\",\n    \"formProfile\": \"\"\n  }\n}\n\nFile v2.1.0:scripts/test/golden/validate-baseline.txt\n\n=== 01.html ===\n  ✅ 无违规\n\n=== 02.html ===\n  ⚠️  WARN 圆角卡片使用非统一边框(0px/0px/0px/5px),逐边细条不贴合圆角\n     → 修复: 圆角卡改用统一边框,或强调条用独立细长 shape\n  ⚠️  WARN 圆角卡片使用非统一边框(0px/0px/0px/5px),逐边细条不贴合圆角\n     → 修复: 圆角卡改用统一边框,或强调条用独立细长 shape\n  ⚠️  WARN 圆角卡片使用非统一边框(0px/0px/0px/5px),逐边细条不贴合圆角\n     → 修复: 圆角卡改用统一边框,或强调条用独立细长 shape\n  ⚠️  WARN 圆角卡片使用非统一边框(0px/0px/0px/5px),逐边细条不贴合圆角\n     → 修复: 圆角卡改用统一边框,或强调条用独立细长 shape\n\n=== 03.html ===\n  ✅ 无违规\n\n=== 05-four-questions-ai-capabilities.html ===\n  ✅ 无违规\n\n=== 05.html ===\n  ✅ 无违规\n\n=== 07-journey-map.html ===\n  ⚠️  WARN L41 box-shadow 只还原第一层非 inset 阴影(spread 与多层不还原)\n     → 修复: 如需精确阴影,改用渐变/多层形状模拟\n  ⚠️  WARN L57 box-shadow 只还原第一层非 inset 阴影(spread 与多层不还原)\n     → 修复: 如需精确阴影,改用渐变/多层形状模拟\n  ⚠️  WARN L73 box-shadow 只还原第一层非 inset 阴影(spread 与多层不还原)\n     → 修复: 如需精确阴影,改用渐变/多层形状模拟\n  ⚠️  WARN L89 box-shadow 只还原第一层非 inset 阴影(spread 与多层不还原)\n     → 修复: 如需精确阴影,改用渐变/多层形状模拟\n\n=== 08.html ===\n  ✅ 无违规\n\n=== 09.html ===\n  ✅ 无违规\n\n=== 100-agenda.html ===\n  ✅ 无违规\n\n=== 101-big-statement.html ===\n  ✅ 无违规\n\n=== 102-quote.html ===\n  ✅ 无违规\n\n=== 103-split-7-5.html ===\n  ✅ 无违规\n\n=== 104-comparison.html ===\n  ✅ 无违规\n\n=== 105-timeline.html ===\n  ✅ 无违规\n\n=== 106-table-focus.html ===\n  ✅ 无违规\n\n=== 107-dashboard.html ===\n  ✅ 无违规\n\n=== 11.html ===\n  ✅ 无违规\n\n=== 110-icon-grid.html ===\n  ✅ 无违规\n\n=== 111-chevron-flow.html ===\n  ✅ 无违规\n\n=== 112-funnel.html ===\n  ✅ 无违规\n\n=== 113-cycle.html ===\n  ✅ 无违规\n\n=== 114-hub-spoke.html ===\n  ✅ 无违规\n\n=== 115-color-band.html ===\n  ✅ 无违规\n\n=== 116-pyramid.html ===\n  ✅ 无违规\n\n=== 117-vs-cards.html ===\n  ✅ 无违规\n\n=== 118-exec-summary.html ===\n  ✅ 无违规\n\n=== 119-issue-tree.html ===\n  ✅ 无违规\n\n=== 12.html ===\n  ⚠️  WARN 圆角卡片使用非统一边框(4px/0px/0px/0px),逐边细条不贴合圆角\n     → 修复: 圆角卡改用统一边框,或强调条用独立细长 shape\n  ⚠️  WARN 圆角卡片使用非统一边框(4px/0px/0px/0px),逐边细条不贴合圆角\n     → 修复: 圆角卡改用统一边框,或强调条用独立细长 shape\n\n=== 120-harvey-matrix.html ===\n  ✅ 无违规\n\n=== 121-waterfall.html ===\n  ✅ 无违规\n\n=== 122-swimlane-gantt.html ===\n  ✅ 无违规\n\n=== 123-scatter-map.html ===\n  ✅ 无违规\n\n=== 124-driver-tree.html ===\n  ✅ 无违规\n\n=== 125-heatmap-matrix.html ===\n  ✅ 无违规\n\n=== 126-scenario.html ===\n  ✅ 无违规\n\n=== 127-market-sizing.html ===\n  ✅ 无违规\n\n=== 128-maturity-ladder.html ===\n  ✅ 无违规\n\n=== 129-value-chain.html ===\n  ✅ 无违规\n\n=== 130-benchmark.html ===\n  ✅ 无违规\n\n=== 15.html ===\n  ✅ 无违规\n\n=== 21.html ===\n  ✅ 无违规\n\n=== 49-four-layer-overview.html ===\n  ⚠️  WARN L88 竖排文字为实验性支持(eaVert)\n     → 修复: 逐字 <br> 换行是更稳的替代\n\n=== 90-p0-features.html ===\n  ⚠️  WARN L60 box-shadow 只还原第一层非 inset 阴影(spread 与多层不还原)\n     → 修复: 如需精确阴影,改用渐变/多层形状模拟\n\n=== 91-p1-forms.html ===\n  ✅ 无违规\n\n=== 92-p1-chart-visual.html ===\n  ⚠️  WARN mix-blend-mode:multiply 元素整体转截图(不可编辑)\n     → 修复: 文字放在特效元素之外的独立 textbox 叠加\n  ⚠️  WARN clip-path:polygon(0px 0px, 100% 0px, 100% 100%, 0px 100%, 0px 50%) 元素整体转截图(不可编辑)\n     → 修复: 裁剪形状内的文字改放独立 textbox\n\n=== 93-p2-sup-sub-geo.html ===\n  ⚠️  WARN 多行文字未设显式 line-height,行距将不可控: \"rtTriangle\"\n     → 修复: 给该文本加 line-height(如 1.5 或 31px)\n  ⚠️  WARN 多行文字未设显式 line-height,行距将不可控: \"chevron↓(rot 180)\"\n     → 修复: 给该文本加 line-height(如 1.5 或 31px)\n  ⚠️  WARN 多行文字未设显式 line-height,行距将不可控: \"diamond+shadow\"\n     → 修复: 给该文本加 line-height(如 1.5 或 31px)\n  ⚠️  WARN 多行文字未设显式 line-height,行距将不可控: \"triangle+dashed\"\n     → 修复: 给该文本加 line-height(如 1.5 或 31px)\n  ⚠️  WARN L131 box-shadow 只还原第一层非 inset 阴影(spread 与多层不还原)\n     → 修复: 如需精确阴影,改用渐变/多层形状模拟\n\n=== 94-p2-gradient.html ===\n  ⚠️  WARN 文字颜色带透明度,转换后变为纯色: \"智能工作流让协作更高效,让创意更自由,让\" (rgba(255, 255, 255, 0.85))\n     → 修复: 改用不透明的混合色值(手算与底色的混合结果)\n  ⚠️  WARN L74 box-shadow 只还原第一层非 inset 阴影(spread 与多层不还原)\n     → 修复: 如需精确阴影,改用渐变/多层形状模拟\n  ⚠️  WARN L79 box-shadow 只还原第一层非 inset 阴影(spread 与多层不还原)\n     → 修复: 如需精确阴影,改用渐变/多层形状模拟\n\n=== 95-p2-master-media.html ===\n  ⚠️  WARN 元素完全在画布外,不会显示: <audio> \"\"\n     → 修复: 移入 1920x1080 画布内,或删除\n  ⚠️  WARN <video> 未指定 src,将仅用封面图展示\n     → 修复: 加 src 属性指向本地视频文件\n  ⚠️  WARN <video> 未设 poster,将截取浏览器渲染帧做封面(可能黑屏)\n     → 修复: 加 poster 属性指向封面图\n\n=== 96-archetype-editorial.html ===\n  ✅ 无违规\n\n=== 97-archetype-divider.html ===\n  ✅ 无违规\n\n=== 98-archetype-statband.html ===\n  ✅ 无违规\n\n=== 99-archetype-chart.html ===\n  ✅ 无违规\n\n=== advice-for-newcomers.html ===\n  ⚠️  WARN font-weight:500 在 PPTX 中退化为常规体: \"员工工作满意度提升 · Gallup\"\n     → 修复: 改用 400(常规)或 600(粗体)\n  ⚠️  WARN font-weight:500 在 PPTX 中退化为常规体: \"全球增长最快的岗位 · LinkedIn\"\n     → 修复: 改用 400(常规)或 600(粗体)\n  ⚠️  WARN font-weight:500 在 PPTX 中退化为常规体: \"AI 增强团队生产力提升\"\n     → 修复: 改用 400(常规)或 600(粗体)\n  ⚠️  WARN font-weight:500 在 PPTX 中退化为常规体: \"人机协作的三条纪律\"\n     → 修复: 改用 400(常规)或 600(粗体)\n\n=== ai-trends-2026.html ===\n  ⚠️  WARN font-weight:500 在 PPTX 中退化为常规体: \"企业软件将内置 Agent · Gart\"\n     → 修复: 改用 400(常规)或 600(粗体)\n  ⚠️  WARN font-weight:500 在 PPTX 中退化为常规体: \"近两年多模态模型发布量增速\"\n     → 修复: 改用 400(常规)或 600(粗体)\n  ⚠️  WARN font-weight:500 在 PPTX 中退化为常规体: \"AI 原生团队人均产出差距\"\n     → 修复: 改用 400(常规)或 600(粗体)\n  ⚠️  WARN font-weight:500 在 PPTX 中退化为常规体: \"问答工具\"\n     → 修复: 改用 400(常规)或 600(粗体)\n  ⚠️  WARN font-weight:500 在 PPTX 中退化为常规体: \"副驾驶\"\n     → 修复: 改用 400(常规)或 600(粗体)\n\n=== chip-market-share.html ===\n  ✅ 无违规\n\n=== data-limit-boundary.html ===\n  ⚠️  WARN L47 box-shadow 只还原第一层非 inset 阴影(spread 与多层不还原)\n     → 修复: 如需精确阴影,改用渐变/多层形状模拟\n  ⚠️  WARN L48 box-shadow 只还原第一层非 inset 阴影(spread 与多层不还原)\n     → 修复: 如需精确阴影,改用渐变/多层形状模拟\n  ⚠️  WARN L49 box-shadow 只还原第一层非 inset 阴影(spread 与多层不还原)\n     → 修复: 如需精确阴影,改用渐变/多层形状模拟\n  ⚠️  WARN L50 box-shadow 只还原第一层非 inset 阴影(spread 与多层不还原)\n     → 修复: 如需精确阴影,改用渐变/多层形状模拟\n  ⚠️  WARN L51 box-shadow 只还原第一层非 inset 阴影(spread 与多层不还原)\n     → 修复: 如需精确阴影,改用渐变/多层形状模拟\n  ⚠️  WARN L65 box-shadow 只还原第一层非 inset 阴影(spread 与多层不还原)\n     → 修复: 如需精确阴影,改用渐变/多层形状模拟\n  ⚠️  WARN L71 box-shadow 只还原第一层非 inset 阴影(spread 与多层不还原)\n     → 修复: 如需精确阴影,改用渐变/多层形状模拟\n\n=== four-revolutions.html ===\n  ⚠️  WARN font-weight:500 在 PPTX 中退化为常规体: \"基础体力\"\n     → 修复: 改用 400(常规)或 600(粗体)\n  ⚠️  WARN font-weight:500 在 PPTX 中退化为常规体: \"多数体力\"\n     → 修复: 改用 400(常规)或 600(粗体)\n  ⚠️  WARN font-weight:500 在 PPTX 中退化为常规体: \"计算智力\"\n     → 修复: 改用 400(常规)或 600(粗体)\n\n──────────────────────────────\n共 57 个文件: 0 个 ERROR, 44 个 WARN\n\nFile v2.1.0:assets/deck-brief.template.md\n\n# Deck Brief · {主题}\n\n> 访谈轮次:{N} 丨 状态:{待确认/已确认} 丨 本文件是可迭代需求源,改需求 = 改对应行 + 重新确认\n> 写每页时只对照本文件(唯一执行事实源),不回查档位表与访谈记录。\n\n## 定位\n- 主题:{}\n- 受众:{}\n- 一句话目标:{讲完希望听众记住/做什么}\n- 使用场景:{演讲形式/混合形式/阅读形式}\n- 页数:{N} 页(骨架:{骨架名或\"自由结构\"})\n- 素材现状:{全文稿/大纲要点/裸主题} 丨 打磨深度:{深度打磨/标准/快速}\n\n## 内容深化记录(摘要;详档见 `slides/deck-insights.md`)\n\n> 2026-08-06 第六轮 P4:详档独立落盘。此前 6 列洞察表被压进本区一行,写页时无法查 ——\n> 花 13-15 次调用产出的东西 Q5 展示一次后就实际不可用。本区只留摘要 + 指针。\n\n- 素材形态:{全文稿/大纲要点/裸主题} 丨 执行:{四步全做/Step 1·2·4/假设清单(裸主题不做追问)}\n- 洞察:{N 条} 丨 **降级论断:{M} 条 → 第 {} 页(已写入 slides.config.json 的 `hedgePages`)**\n- 多角色:{角色名};执行方式 {并行 agents/主循环快评/串行扮演(非独立)}\n- 委员会:固定席(唱反调/执行者)+ 动态席 {3 个};实质冲突 {N} 处;**丢弃率 {X}%**\n- 大纲级形式门禁:{全过 / 不合规项及处置}\n- 详档:`slides/deck-insights.md`(洞察清单/假设清单/意见编号/裁决/被否方向/行动方案)\n\n## 结构(逐页大纲)\n| 页 | 类型 | 形式 | 内容一句话(核心断言) | 原型(编号+名) | 备注(证据需求/风险) |\n|---|---|---|---|---|---|\n| 01 | 封面 | 文字(airy) | {} | 1 封面·深底大字 | |\n\n**原型变化检查**:共 {} 种原型(≥6);同原型最长连排 {} 页(≤2);airy 页 = 第 {} 页;纯文字卡片矩阵页 = 第 {} 页(≤2;图标网格不受此限)\n**形式分布检查**(按视觉形式偏好档):纯文字内容页 {}/{} 页(克制型不限/平衡型 ≤50%/丰富型 ≤30%);同形式最长连排 {} 页(平衡型 ≤3/丰富型 ≤2);图示型页 = 第 {} 页\n\n## 视觉\n- 色板:{预设名(文件),如 business-blue.css} 或 {品牌风:brand-linear.css(Linear 风·深色精密)} 或 {自定义 #RRGGBB 推导(已经二次确认)}\n- 风格个性:{商务咨询/编辑杂志/科技极简/学术朴素/品牌风(档案自带)};风格红线:{如\"禁多彩、蓝是唯一彩色\"}\n- 图片政策:{纯文字图表/产品截图(contain)/照片素材(cover)/图标几何(→ icons.md + 原型 23-30)}\n- **视觉形式偏好:{文字克制型/平衡型/图示丰富型}**(Q8c;平衡型=纯文字内容页 ≤50%、每内容页 ≥1 非文字视觉元素)\n- 基调:{浅色为主·深底封面结尾/全浅色/深色为主}\n- 装饰强度:{简洁/适中/丰富}\n\n## 版式与密度参数(本 deck 的执行硬约束)\n- 布局方式:{自动/C 优先/B 优先/A 经典} 丨 版式节奏:{张弛变化/统一规整}\n- 页标题 {}px / 封面主标 {}px / 区块标题 {}px / 正文 {}px(破档下限 {}px)\n- 字号绝对下限 14px;注释/来源 ≥{}px\n- 每页要点 ≤{} / 每要点 ≤{} 字 / 单页正文 ≤{} 行 / 每页信息块 ≤{}\n- 表格 ≤{} 行(含表头)/ 图表 ≤{} 系列\n- **版面填充**:内容区 320-940,利用率 ≥85%(内容带顶 ≤360、底 ≥880);airy 页豁免 = 封面/分隔/大字观点/引用/收尾\n- **Scale-to-fill**:内容 <60% 上限 → 字号取档内上限、行距 1.6-1.8、条目间距 40px\n- 备注策略:{每页详尽/关键页写/不写}\n- 字体映射:{开(默认雅黑)/关(保留原字体)}\n\n## 去 AI 味约束(写页时逐条自检)\n- kicker+副标题三件套仅用于:第 {} 页(章节首页/封面)\n- 底部结论条仅用于:第 {} 页(章节收尾)\n- 渐变条/渐变英雄区仅用于:第 {} 页(封面/分隔/收尾)\n- 纯文字卡片矩阵页:第 {} 页(≤2 页;图标要点网格/图示卡片是结构形状,不受此限)\n- 每页装饰 ≤2 件(**结构形状不计件**:卡片/图标/流程/漏斗/图表/表格);每页高亮 ≤1 处;默认左对齐\n- 图标纪律:从 assets/icons.md 复制;stroke 显式 hex 禁 currentColor;全页同色系\n- 全部 12 条反模式与结构豁免总则见 reference/design-principles.md 第四节\n\n## 输出\n- 目录:{} 丨 输出:{}.pptx 丨 演示机字体:{默认雅黑映射/保留原字体}\n\nFile v2.1.0:assets/deck-insights.template.md\n\n# Deck Insights · {主题}\n\n> 内容深化层产物(2026-08-06 第六轮 P4 起独立落盘)。深度档:{深度打磨/标准/快速} 丨 素材形态:{全文稿/大纲要点/裸主题}\n> **与 brief 的分工**:brief 是执行事实源(参数与约束),本文件是**论据档案**(每条断言的来龙去脉)。\n> 写页时:brief 定怎么排,本文件定这页能说什么、哪句必须带限定词。\n\n## 一、洞察清单(四步追问产出)\n\n> 裸主题档跳过本节,直接看第二节假设清单。\n\n| # | 论断 | 依据强度 | 反向验证 | 限定词 | 待补数据 | 用于第 N 页 |\n|---|---|---|---|---|---|---|\n| 1 | {} | 强/中/弱 | 通过/降级 | {无 或 我们认为/有待验证/预估} | {} | {} |\n\n**降级论断汇总**(反向验证未通过的):第 {} 页 —— 这些页必须写入 `slides.config.json` 的 `design.hedgePages`,\n且页面内**确实出现限定词**,否则 validate 报 WARN。\n\n## 二、假设清单(裸主题档产出)\n\n> 本节内容**不进 deck 正文** —— 它是给用户的补料请求。\n\n| # | 我的假设 | 假设为真的依据 | 若为假会影响哪几页 | 需要你补什么 |\n|---|---|---|---|---|\n| 1 | {} | {} | {} | {} |\n\n用户处置:{已补料,按矩阵重走 Step 1/2/4} 或 {按假设写,相关页已入 hedgePages}\n\n## 三、多角色洞察\n\n执行方式:{3-5 并行 agents / 主循环 2 角色快评 / 串行扮演(非独立并行)}\n角色(取自推断总表\"委员会动态角色\"列):{}\n\n| 角色 | 策略 | 洞察 | 对第 N 页的影响 |\n|---|---|---|---|\n| {} | 反向追问/跨界连接/未来推演 | {} | {改哪页/加哪页/删哪页} |\n\n## 四、委员会决议\n\n固定席:唱反调者 · 执行者 丨 动态席(3):{}\n执行方式:{5 并行独立 / 串行扮演 / 标准档 checklist 自问}\n\n**独立评审意见**(每条编号,供变更说明引用):\n\n| 编号 | 角色 | 对第 N 页 | 具体修改 |\n|---|---|---|---|\n| 唱反调-1 | 唱反调者 | {} | {} |\n\n**冲突判定**:实质冲突 {N} 处(同页互斥){列出} → 交叉评审席位:{卷入的角色} 或 {无冲突,跳过交叉}\n\n**主席裁决**:\n\n| 冲突 | 类型 | 裁决 | 依据 |\n|---|---|---|---|\n| {} | 事实/判断/可行性 | {} | {回查素材/具体失败场景/执行者否决优先} |\n\n**变更说明**(每条必须引用意见编号,主席自己的想法标 `[主席]`):\n\n| # | v1→v2 变更 | 来源 |\n|---|---|---|\n| 1 | {} | `[唱反调-2]` |\n\n**被否方向表**(防迭代反复):\n\n| 被否的方向 | 提出者 | 否决理由 |\n|---|---|---|\n| {} | {} | {} |\n\n**丢弃率**:收到 {N} 条,采纳 {M} 条,丢弃 {N-M} 条({X}%)。\n> 超 60% 必须说明委员会为什么失效:{角色选错/大纲太粗/素材太薄/……}\n\n## 五、大纲级形式门禁(所有档位都跑)\n\n| 判据 | 上限(按形式档 {}) | 实测 | 结论 |\n|---|---|---|---|\n| 纯文字内容页占比 | {50%/30%/不限} | {}/{} | ✅/❌ |\n| 同形式连排 | {3/2/不限} | {} 页 | ✅/❌ |\n| 原型种数 | ≥6 | {} 种 | ✅/❌ |\n| 同原型连排 | ≤2 | {} 页 | ✅/❌ |\n| airy 页节奏 | 每 3-4 页 1 张 | 第 {} 页 | ✅/❌ |\n| 每内容页非文字视觉元素 | ≥1(丰富档 ≥2) | 最少 {} 个 | ✅/❌ |\n\n不合规项的处置:{换原型/换形式,不换内容}\n\n## 六、行动方案\n\n| 页 | 核心断言 | 证据需求 | 风险旗标 | 待补素材 |\n|---|---|---|---|---|\n| {} | {} | {} | {高/中/低:原因} | {} |\n\nFile v2.1.0:assets/deck-pages.template.md\n\n# Deck Pages · {主题}\n\n> 页级内容卡(第八轮新增)。**写物不是读物**:写每页 HTML 之前先填本页那一张卡,填完就写,不通读。\n> **与另两份的分工**:brief 定怎么排(参数与约束),insights 存论据来龙去脉,本文件定**这一页到底说什么**。\n> 判据不在本文件:标题看 `design-principles.md` 第七章,口径看同文件\"数据页的口径纪律\",密度看 brief。\n> 快速档降级:只填 ①②③ 与逻辑三问的第 1 问(本工序不花 agent 调用,与大纲级形式门禁同例)。\n\n## 填卡纪律\n\n- **一页一卡,写页前填**。填不出 ② 的可验证事实 → 这页现在还不该写,回去补料或换页。\n- ⑦ 超标当场拆页/精简,**不要写完再截图发现**(改一行 vs 改一屏)。\n- ④ 的三问答\"不答\"是合法的,但要写清\"留给第 N 页\"或\"本 deck 不覆盖\";空着不算答。\n- 本文件**不进 deck 正文**,也不需要用户确认(需求已在 Q5 冻结);它是执行草稿,可随页面迭代改。\n\n---\n\n## 第 {NN} 页 · {文件名} · 原型 {编号+名}\n\n① **Action title(结论句)**:{主谓宾完整句,≤30 字}\n- 自检:换个 deck 还能用吗?能 → 是空标题,重写\n\n② **支撑(2-4 条,每条必须挂一个可验证事实 + 一个已分类的出处)**\n\n| # | 要说的一句 | 挂的事实(数字+单位/专有名词/时间范围/具体例子) | 出处(六类之一) |\n|---|---|---|---|\n| 1 | {} | {} | {素材 §N} |\n\n**出处六类**(必须落到其中一类,不许写\"行业报告\"\"业内数据\"这种无主语的话):\n\n| 类别 | 写法 | 强制配套 |\n|---|---|---|\n| 素材 §N | 用户给的全文稿/资料包的具体位置 | 无 |\n| insights #N | `deck-insights.md` 洞察编号 | 无(该洞察自己已带依据强度) |\n| 用户口述 | 访谈里用户亲口说的 | 无 |\n| 公开可核验 | **机构 + 报告名 + 年份**三段齐全 | 缺任一段 → 降为「模型知识」 |\n| **模型知识** | 生成模型的参数化知识与推理 | **必须带限定词 + 本页入 `hedgePages`**,或改标「待补」 |\n| 待补 | 该条现在拿不出来 | 该条**不进页面**,进待补数据清单(见 ⑥) |\n\n- **危险的不是用模型知识,是不标注的模型知识**:数字+单位的形态很容易看着像实测值。\n  标了就落到既有的 hedgePages 机制上,成为可审计约束;不标就是\"说得很像真的,一查全无出处\"。\n- 挂不上事实的条目:{删掉 或 降级为限定词句(见 ⑤)};**不留\"跟不上事实\"的句子**\n\n③ **口径行**(本页有数字/百分比/排名时必填,否则写\"无数字\")\n- 时间范围 {} 丨 样本/范围 {} 丨 测算方式 {} 丨 估算标注 {有:假设是 …/无}\n- 落地:写成页脚区上沿(y≈990)一行 ≥16px 小字\n- **时效自查**:本页事实有时间敏感性吗(市场规模/竞品动态/政策口径/价格/排名/榜单)?\n  有 → ② 的出处**不得为「模型知识」**,只能是素材 / 用户口述 / 公开可核验 / 待补。\n  判定:{无时效敏感项} 或 {有:第 {} 条 → 出处已改为 {}}\n\n④ **逻辑三问**\n\n| 问 | 答 |\n|---|---|\n| 支撑能推出 ① 吗?还是同义反复? | {能,因为…/是反复 → 已重写 ②} |\n| 最强反驳是什么?本页答不答? | {反驳:…;本页答/留给第 N 页/本 deck 不覆盖} |\n| 观众看完下一问是什么?下一页答不答? | {问:…;第 N 页答/需补页} |\n\n⑤ **限定词判定**(对照 `deck-insights.md` 洞察清单;无深化层时按本页断言自判)\n- 本页有降级论断吗:{无} 或 {有 → 限定词「{我们认为/有待验证/预估/初步/假设}」用在第 {} 条}\n- 有 → 本页文件名已写入 `slides.config.json` 的 `design.hedgePages`:{是/否}\n\n⑥ **数据不足时的退路**(③ 填不全或算式链编不出时)\n- 处置:{不适用} 或 {退回原型 8 要点列表 + 本页缺口进待补数据清单}\n- **禁止**编基准、编样本、伪精确 —— 拿不到数就别画(见口径纪律硬纪律 2)\n\n⑦ **容量核算**(对 brief 密度参数,超标当场处置)\n- 要点 {}/{上限} 丨 每要点 {}字/{上限} 丨 正文 {}行/{上限} 丨 信息块 {}/{上限}\n- 超标处置:{未超} 或 {演讲/混合档拆为第 {} 页 / 阅读档精简措辞}\n\n---\n\n## 填卡完成度\n\n| 页 | ①标题 | ②支撑 | 出处已分类 | ③口径 | 时效自查 | ④三问 | ⑤限定词 | ⑦容量 | 可以写了 |\n|---|---|---|---|---|---|---|---|---|---|\n| 01 | ✅ | ✅ | 素材/insights | 无数字 | 无敏感项 | ✅ | 无 | 未超 | ✅ |\n\n> \"出处已分类\"列出现「模型知识」的页,必须同时在 ⑤ 列看到限定词、且该页在 `hedgePages` 里 ——\n> 两列对不上就是伪装成实测值的推理,回去改 ② 或 ⑤。\n\nArchive v2.0.1: 180 files, 524183 bytes\n\nFiles: assets/deck-brief.template.md (4270b), assets/deck-insights.template.md (3411b), assets/icons.md (16400b), assets/playlist.template.json (277b), assets/presets/brand-airbnb.css (3477b), assets/presets/brand-apple.css (3600b), assets/presets/brand-claude.css (3570b), assets/presets/brand-ferrari.css (3502b), assets/presets/brand-figma.css (3509b), assets/presets/brand-linear.css (3623b), assets/presets/brand-notion.css (3613b), assets/presets/brand-nvidia.css (3463b), assets/presets/brand-spotify.css (3437b), assets/presets/brand-stripe.css (3490b), assets/presets/brand-vercel.css (3350b), assets/presets/business-blue.css (3105b), assets/presets/forest-green.css (3151b), assets/presets/graphite-mono.css (3204b), assets/presets/lenovo-default.css (3979b), assets/presets/warm-orange.css (3183b), assets/slide-template-flex.html (6040b), assets/slide-template-layout.html (5928b), assets/slide-template.html (4183b), assets/slides.config.template.json (261b), assets/snippets/agenda-list.html (1384b), assets/snippets/badge-center.html (1251b), assets/snippets/big-statement.html (1413b), assets/snippets/card-accent-top.html (2711b), assets/snippets/chevron-band.html (4715b), assets/snippets/code-block.html (2375b), assets/snippets/color-band.html (2034b), assets/snippets/compare-card.html (1458b), assets/snippets/cycle-loop.html (3676b), assets/snippets/data-table.html (2644b), assets/snippets/editorial-columns.html (1305b), assets/snippets/flow-step.html (1165b), assets/snippets/funnel-stack.html (4784b), assets/snippets/gradient-bar.html (1518b), assets/snippets/hero-gradient.html (2348b), assets/snippets/hub-spoke.html (4174b), assets/snippets/icon-grid-cell.html (1843b), assets/snippets/image-bleed.html (1825b), assets/snippets/INDEX.md (5880b), assets/snippets/kpi-card.html (2174b), assets/snippets/layer-row.html (1703b), assets/snippets/page-header.html (2146b), assets/snippets/pyramid-tiers.html (2533b), assets/snippets/quote-block.html (1619b), assets/snippets/quote-hero.html (1491b), assets/snippets/section-divider.html (1569b), assets/snippets/stat-number.html (1023b), assets/snippets/timeline-node.html (1929b), assets/snippets/vs-cards.html (2888b), assets/theme.css (4772b), reference/behavior-baseline.md (31319b), reference/brand-styles.md (16601b), reference/content-deepening.md (14340b), reference/creative-layouts.md (24558b), reference/density-tiers.md (4110b), reference/design-principles.md (17547b), reference/html-spec.md (24052b), reference/interview-guide.md (18472b), reference/layout-recipes.md (8528b), reference/narrative-skeletons.md (8276b), reference/page-archetypes.md (62993b), reference/theme-presets.md (3774b), scripts/config/default.config.js (9428b), scripts/config/merge.js (2073b), scripts/convert.js (1669b), scripts/core/browser.js (1171b), scripts/core/capture-pass.js (3674b), scripts/core/inject.js (2253b), scripts/core/pipeline.js (11313b), scripts/core/post-process.js (5579b), scripts/extract/context.js (7930b), scripts/extract/index.js (1842b), scripts/extract/primitives/border-strips.js (2302b), scripts/extract/primitives/capture.js (647b), scripts/extract/primitives/chart.js (870b), scripts/extract/primitives/gradient.js (6408b)\n\nFile v2.0.1:SKILL.md\n\n---\nname: html-slides-to-pptx\ndescription: >-\n  编写可无损还原为 PPTX 的 HTML 幻灯片。先经引导式访谈确认样式/形式/结构并落盘\n  deck-brief,再生成完整目录结构(assets/theme.css、slides/*.html、playlist.json),\n  每页严格遵循 html-spec.md 规范,经 validate.js 预检零 ERROR 后用 convert.js 转成\n  PowerPoint。TRIGGER when: 用户要求\"做PPT/幻灯片/slides/演示文稿\"、\"把内容做成\n  HTML幻灯片\"、\"生成可转PPTX的slides\",或调用 /html-slides-to-pptx。DO NOT TRIGGER when:\n  只需单页HTML网页、或要做的是 reveal.js/Marp 等其他幻灯片格式。\nversion: 1.2.1\nmetadata:\n  openclaw:\n    requires:\n      bins:\n        - node\n        - npm\n---\n\n# html-slides · 可无损转 PPTX 的 HTML 幻灯片生成器(引导式访谈版)\n\n## 核心原则\n\n转换器(`scripts/convert.js` + 浏览器端提取管线)只**无损支持 HTML/CSS 的一个子集**。\n每页 HTML 必须严格遵循 `reference/html-spec.md` —— 这是契约,不是建议。\n写页面之前必须先完成 Step 1 访谈并让用户确认 `slides/deck-brief.md`。\n\n## 首次使用:检查工具依赖\n\n> 以下命令中的 `SKILL_DIR` 指本技能的根目录(即 SKILL.md 所在目录)。\n> 技能加载时系统会显示 \"Base directory for this skill: <路径>\",用该路径替换 `SKILL_DIR`。\n\n```bash\nSKILL_DIR=\"<技能根目录,即 Base directory>\"\nls \"$SKILL_DIR/scripts/node_modules/playwright\" >/dev/null 2>&1 \\\n  && echo OK || (cd \"$SKILL_DIR/scripts\" && npm install && npx playwright install chromium)\n```\n若输出 OK 则跳过安装;否则等待安装完成再继续。\n\n## 工作流程(按顺序执行)\n\n### Step 1 · 引导式访谈 → 需求确认卡\n\n**读 `reference/interview-guide.md` 并严格执行**:5 阶段(定位→结构→视觉→版式→输出)+ 收尾确认卡,\n共 **16 问 + 1 个大纲确认环节**,每问有默认值与智能跳过规则。配套查询:\n- 叙事骨架:`reference/narrative-skeletons.md`(脚手架非模具;用户可选\"自由结构\")\n- 色板预设:`reference/theme-presets.md`(5 套预设 + 自定义 hex 推导)\n- 信息密度:`reference/density-tiers.md`(演讲/混合/阅读 三档参数)\n- **内容深化:`reference/content-deepening.md`**(**素材形态 × 深度档**二维矩阵定做什么:\n  四步追问审素材 → 多角色 → 委员会审大纲;裸主题改出**假设清单**不做追问;\n  所有档位都跑**大纲级形式门禁**;大纲 v2 才进 Q5 确认)\n\n**Step 1 执行顺序**:①读 interview-guide 的**推断总表**,从用户首句匹配 deck 族 → 一次定全轴推荐值\n②按**依赖图**决定哪些问可跳 ③选路径(快通道 2-3 轮 / 标准 4-6 轮 / 深度 + 深化层)\n④逐阶段抛问,置首项说明理由 ⑤深化层按矩阵执行 ⑥Q5 确认大纲 v2。\n**任何路径都不跳 Q6 色板 与 Q5 大纲确认**(返工最贵的两个决定)。\n\n访谈收尾:按 `assets/deck-brief.template.md` 生成确认卡展示给用户,\n**用户确认后落盘 `slides/deck-brief.md`** —— 此后它是唯一执行事实源;\n后续\"改第 N 页/换色板\"类迭代直接读它,不重访谈。\n\n### Step 2 · 搭目录结构\n在当前工作目录生成:\n```\nassets/theme.css          # 按 brief 色板:复制 assets/presets/<选定预设>.css(自定义色则按推导值生成)\nslides/NN-slug.html       # 每页一个文件,两位数字前缀排序\nslides/playlist.json      # 从 assets/playlist.template.json 实例化,playlist 按顺序列全页面\nslides/deck-brief.md      # Step 1 落盘的需求确认卡\nslides/deck-insights.md   # 深化层详档(非快速档才有;模板 assets/deck-insights.template.md)\nslides/slides.config.json # 从 assets/slides.config.template.json 实例化(键见 scripts/config/default.config.js)\n```\n目录已存在时,保留用户已有文件,只补缺失项。\n\n**slides.config.json 按 brief 填**(实例化 `assets/slides.config.template.json`):\n```json\n{\n  \"design\": {\n    \"tier\": \"presentation | mixed | reading\",\n    \"minBodyPx\": 14,\n    \"fillThreshold\": 0.85,\n    \"airyPages\": [\"01-cover.html\", \"05-statement.html\"],\n    \"formProfile\": \"balanced\",\n    \"hedgePages\": [\"07-forecast.html\"]\n  }\n}\n```\n- 设计检查**默认就是开着的**(缺省 `presentation` + `balanced`);本文件的作用是按 brief\n  **校准**档位与豁免页,不是\"开启开关\"。整份文件缺失时按默认档跑,不会静默放行。\n- `design.tier` 由 brief 使用场景映射(演讲→presentation/混合→mixed/阅读→reading);\n  决定字号下限与单页信息量上限(见 `reference/density-tiers.md`)\n- `design.formProfile` 由 brief 视觉形式偏好映射(克制型→text/平衡型→balanced/丰富型→rich);\n  决定 deck 级形式检查口径(纯文字页占比/同形式连排,见 design-principles 第五章)\n- `airyPages` 填 brief 中的 airy 页文件名(封面/分隔/大字观点/引用/收尾)——\n  **这是唯一豁免填充检查的途径**,漏填会让这些页因\"底部留白\"被报 WARN\n- `hedgePages`(2026-08-06 第六轮)填 `deck-insights.md` 里**降级论断**所在页 →\n  validate 会检查这些页确实出现限定词(我们认为/有待验证/预估…),缺失报 WARN。\n  作用是把\"降级为观点\"从措辞变成可审计约束;**不判断内容真伪**(真伪归 Q5 用户判断)\n- 其余常用键:`applyFontMap`(brief 演示机字体决定)、`nativeGradient`(原生渐变)、`master`(页码页脚)\n\n### Step 3 · 逐页写 HTML\n1. **按 brief 的骨架页序与密度参数写**(要点数/行数/字号/填充率是硬约束;超标:演讲/混合档拆页,阅读档精简措辞)\n2. **写页前只需读两份契约**:`reference/design-principles.md`(设计)+ `reference/html-spec.md`(转换)。\n   其余文档**用到才查**,不要通读(读取分层见文末\"文件清单\")。\n   逐页流程:**先定形式**(brief 大纲表\"形式\"列:文字/图示/图表/图片/混合)\n   → **再选原型**(查 `reference/page-archetypes.md` 的索引跳到目标原型,别通读 1000+ 行)\n   → **起手用现成件**:`assets/snippets/INDEX.md` 找片段,或 `assets/slide-template{,-flex,-layout}.html` 三套样板页(方式 A/B/C)\n   → 容器内部写法查 `reference/layout-recipes.md`;要图标查 `assets/icons.md`(stroke 显式 hex,**禁 currentColor**)\n2.5 **P2 高级特性**(按需使用,详见 html-spec.md §5;**用法克制,以 design-principles 为准**):\n   - `data-shape=\"chevron|star5|rightArrow|...\"` → 80+ 预设几何(流程图/箭头/星形)\n   - `data-chart='{\"type\":\"bar\",...}'` → 原生可编辑图表(bar/line/area/pie)\n   - `<img data-object=\"true\">` → 原生可编辑图片(object-fit 映射;图片政策见 brief)\n   - `<video poster src>` / `<audio src>` → 原生音视频嵌入\n   - 转场/母版:由 playlist.json / slides.config.json 配置,非页面内属性\n3. **布局选择**:骨架(页标题/页码)用方式 A;成组内容(条目/分栏/数字带)优先方式 C 或 B(brief 另有指定时从其指定)\n4. **不改结构规则**:\n   - 画布 `1920x1080`,`.slide-container` relative + overflow hidden\n   - 每个可见元素可归结到 `data-object=\"true\"`;嵌套标记 = ERROR\n   - 多行文字显式 `line-height`;字重只用 400/600/700/800/900\n   - 文字纯色(半透明先预算混合色);装饰预算每页 ≤3 件;默认左对齐\n   - **每个内容页至少一块结构色面**(色带/深色面板/卡片底/表头底纹,≥1.5 万 px²)——\n     纯白底+黑字+细线是\"素雅单调\"的根源,validate 在 balanced/rich 档会报 WARN\n   - **正文默认 24-28px**(演讲档),22px 是破档红线而非默认值;深色底上的文字**必须**用\n     `--on-navy-text`/`--on-navy-sub`,否则回退近黑压深底、PPTX 里不可见(H13)\n   - 纯 `transform:rotate()` 已支持(scale/skew/translate 仍禁);方式 C 子级禁写 position/left/top/width/height\n5. 备注按 brief 的备注策略写 `<template data-slide-notes>`\n\n### Step 3.5 · 视觉自查(写完页先过自己这关)\n```bash\nnode \"$SKILL_DIR/scripts/preview.js\" slides/\n```\n把每页截成 PNG(slides/.preview/),**逐张看图**,按六条自查:\n1. **填充率**:内容带是否撑满 320-940?判据不是\"底边够低\"而是**墨迹铺开** ——\n   有没有 ≥200px 的连续空白断层?内容是否一头沉?底部一根细线 + 脚注**不算**撑满。\n   不达标 → 回 Step 3 按 scale-to-fill 放大字号/行距/间距\n2. **字号**:正文是否明显偏小?演讲档正文默认 **24-28px**(22px 是破档红线,不是默认值);\n   页标题/正文比值 <1.6 或全页字号只有两档 → 层级不足,按字号阶拉开\n3. **对齐**:卡片/条目边缘是否齐;间距是否一致 → 修正坐标或改方式 B/C\n4. **去 AI 味**:对照 brief 的约束清单(kicker/结论条/渐变条是否超编;装饰 ≤3 件;高亮 ≤1 处)\n5. **视觉形式**(2026-08-05 起):这页除了文字还有什么?答案为\"只有细线\"→ 记入纯文字页;全 deck 纯文字内容页占比/同形式连排是否超 brief 的形式偏好档 → 超则换图示原型(23-30),不换内容\n6. **结构色面**(2026-08-06 起):这页是不是纯白底 + 黑字 + 细线?内容页至少要有**一块结构色面**\n   (色带/深色面板/卡片底/表头底纹)。深色底上的文字有没有用 `--on-navy-*`?\n   用错会在 PPTX 里近黑压深底、整块消失(H13)\n7. **限定词**(2026-08-06 第六轮起,有深化层时):对照 `deck-insights.md` 的洞察清单 ——\n   本页有没有\"反向验证=降级\"的论断?有则必须带限定词(我们认为/有待验证/预估…),\n   并确认该页已在 `slides.config.json` 的 `hedgePages` 里。**把假设写成结论是 AI PPT 最典型的病**\n发现问题**就地修复并重截**,直到七关全过,再进 Step 4。\n\n### Step 4 · 预检(必须零 ERROR)\n```bash\nnode \"$SKILL_DIR/scripts/validate.js\" slides/\n```\n- ❌ ERROR → 必须修复后重跑,直到 0 ERROR\n- ⚠️ WARN → 逐条判断是否可接受(见 html-spec.md 速查表),可接受就在汇报中说明\n- 设计 WARN(文字适配/字号下限/画布填充/对齐,由 slides.config.json 的 design 键启用)→ 优先按 scale-to-fill 修复,这正是视觉质量的自动守门员\n\n### Step 5 · 转换\n```bash\nnode \"$SKILL_DIR/scripts/convert.js\" ./slides ./slides/playlist.json output.pptx\n```\n\n### Step 6 · 汇报\n告知用户:PPTX 路径、页数、validate 结果(残留 WARN 及理由)、备注写入情况、deck-brief.md 位置。\n如用户装了 PowerPoint,可提示可直接打开 output.pptx 检查。\n\n## 转换机制简述(排查问题时读)\n\n- 管线:加载页面 → 等字体就绪+稳定 → 注入提取脚本 → data-layout 解析 → 提取基元 → 截图 pass → pptxgenjs 渲染\n- **原生可编辑**(PPT 中可修改):文字/纯色形状/图片/表格/图表/列表/上下标/字距/渐变(opt-in)/预设几何/旋转/虚线边框\n- **截图贴回**(不可编辑):渐变(默认)/background-image/SVG/视觉特效/mix-blend-mode/clip-path(2x DPI,截图前隐藏文字避免重影)\n- 文字 run 级样式:斜体/下划线/删除线/超链接/text-transform 原生还原;`<sup>`/`<sub>` 原生上下标\n- 配置:`config/default.config.js` 是唯一事实源;项目级 `slides/slides.config.json` 覆盖(如 `{\"nativeGradient\":true}` 开启原生渐变;`{\"master\":{\"pageNumbers\":true}}` 开启页码;`{\"incrementalCache\":false}` 关闭增量缓存)\n- 转场:playlist 项 `{\"file\":\"01.html\",\"transition\":\"fade\"}` → p:transition(fade/push/wipe/cover/split)\n- 音视频:`<video poster src>` / `<audio src>` → addMedia 原生嵌入\n- 增量缓存:HTML 未变时跳过提取/截图(11x 提速);缓存目录 slides/.cache/\n- 叠放 = DOM 深度优先顺序;z-index 只影响浏览器合成\n- `<template data-slide-notes>` → 写入该页备注\n- 特性速查:`reference/creative-layouts.md` 查渐变/几何/图表等写法(含使用限制);页面形态以 page-archetypes.md 为准\n- 回归:`node \"$SKILL_DIR/scripts/test/golden.js\" verify` 三层等价(L1 提取+L2 XML+L3 截图);行为契约见 `reference/behavior-baseline.md`\n\n## 文件清单\n\n> **2026-08-06 第五轮 P4 重组**:此前 12 份 reference 平铺,\"必读\"散在各处措辞里,\n> 写第一页前要读 13 份文档 + 8 类资产(合计 3700+ 行)—— 实测后果是规范写了不被执行\n> (`--text-*` 令牌零引用、正文长期钉在破档线 22px,四轮无人发现)。\n> 现按**读取时机**分三层:主干必读只有 3 份,其余按需查。\n\n### 第一层 · 主干必读(只有这三份,合计约 720 行)\n\n| 文件 | 何时读 | 作用 |\n|---|---|---|\n| `reference/interview-guide.md` | **Step 1 之前** | 5 阶段 16 问 + 1 确认的访谈脚本(含推断总表与依赖图) |\n| `reference/design-principles.md` | **写第一页之前** | 设计契约:版面分区/字号阶/满填四判据/12 反模式/结构色面下限/**版面达标≠内容达标** |\n| `reference/html-spec.md` | **写第一页之前** | 转换契约:什么写法能无损还原 |\n\n这三份决定输出质量的下限。**其余任何一份都不该在写页前通读。**\n\n### 第二层 · 按需查阅(用到才读,查完即走)\n\n| 文件 | 什么时候需要 |\n|---|---|\n| `reference/page-archetypes.md` | 选页面形态时 —— **查索引直接跳到目标原型,别通读**(1000+ 行) |\n| `reference/density-tiers.md` | 定档位参数、算填充率与要点数上限 |\n| `reference/layout-recipes.md` | 写方式 B/C 的容器骨架 |\n| `reference/creative-layouts.md` | 用渐变/几何/图表/旋转等特性,查写法与限制 |\n| `reference/content-deepening.md` | 需要四步追问/多角色/委员会(素材×深度矩阵定做什么) |\n| `reference/narrative-skeletons.md` | 定全篇叙事结构 |\n| `reference/theme-presets.md` / `brand-styles.md` | 选色板或蒸馏品牌风 |\n| `assets/icons.md` | 要图标时复制(stroke 显式 hex,**禁 currentColor**) |\n| `assets/snippets/INDEX.md` | 找现成片段(28 个,含参数表与使用限制) |\n\n### 第三层 · 改代码才读\n\n| 文件 | 场景 |\n|---|---|\n| `reference/behavior-baseline.md` | **改转换管线前必读**(怪癖 H1-H14) |\n| `scripts/test/FEATURE-COVERAGE.md` | 增删转换特性或夹具页(硬约束) |\n| `CLAUDE.md` | 管线架构、回归纪律、单一事实源规则 |\n\n### 资产与脚本\n\n- `assets/theme.css` — 默认色板+版面变量;`assets/presets/` — 16 套色板预设\n- `assets/deck-brief.template.md` — 需求确认卡模板;`assets/slides.config.template.json` — 项目配置模板\n- `assets/deck-insights.template.md` — 深化层详档模板(洞察/假设/委员会意见与裁决/形式门禁/行动方案)\n- `assets/slide-template{,-flex,-layout}.html` — 三套样板页(方式 A/B/C)\n- `assets/playlist.template.json` — playlist 模板\n- `scripts/validate.js` — 预检器(ERROR/WARN 分级;设计检查缺省开启)\n- `scripts/preview.js` — 视觉自查截图(Step 3.5)\n- `scripts/convert.js` — 转换 CLI\n- `scripts/test/` — golden 回归 + 样张门禁 + 阈值守卫 + 生成侧回归\n\nFile v2.0.1:_meta.json\n\n{\n  \"ownerId\": \"kn7af33xbszyq32pce2pa6f84n8bdfqy\",\n  \"slug\": \"html-slides-to-pptx\",\n  \"version\": \"2.0.1\",\n  \"publishedAt\": 1786069723031\n}\n\nFile v2.0.1:scripts/package-lock.json\n\n{\n  \"name\": \"html-slides-tools\",\n  \"version\": \"1.0.0\",\n  \"lockfileVersion\": 3,\n  \"requires\": true,\n  \"packages\": {\n    \"\": {\n      \"name\": \"html-slides-tools\",\n      \"version\": \"1.0.0\",\n      \"dependencies\": {\n        \"playwright\": \"^1.61.1\",\n        \"pptxgenjs\": \"^4.0.1\"\n      }\n    },\n    \"node_modules/@types/node\": {\n      \"version\": \"22.20.1\",\n      \"resolved\": \"https://registry.npmmirror.com/@types/node/-/node-22.20.1.tgz\",\n      \"integrity\": \"sha512-EANqOCF9QFyra+4pfxUcX9STKJpCLjMbObVzljIJomAWSnuSIEAvyzEU53GaajbXJEgdh0iEcPL+DGvpUd4k1Q==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"undici-types\": \"~6.21.0\"\n      }\n    },\n    \"node_modules/core-util-is\": {\n      \"version\": \"1.0.3\",\n      \"resolved\": \"https://registry.npmmirror.com/core-util-is/-/core-util-is-1.0.3.tgz\",\n      \"integrity\": \"sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/fsevents\": {\n      \"version\": \"2.3.2\",\n      \"resolved\": \"https://registry.npmmirror.com/fsevents/-/fsevents-2.3.2.tgz\",\n      \"integrity\": \"sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==\",\n      \"hasInstallScript\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"darwin\"\n      ],\n      \"engines\": {\n        \"node\": \"^8.16.0 || ^10.6.0 || >=11.0.0\"\n      }\n    },\n    \"node_modules/https\": {\n      \"version\": \"1.0.0\",\n      \"resolved\": \"https://registry.npmmirror.com/https/-/https-1.0.0.tgz\",\n      \"integrity\": \"sha512-4EC57ddXrkaF0x83Oj8sM6SLQHAWXw90Skqu2M4AEWENZ3F02dFJE/GARA8igO79tcgYqGrD7ae4f5L3um2lgg==\",\n      \"license\": \"ISC\"\n    },\n    \"node_modules/image-size\": {\n      \"version\": \"1.2.1\",\n      \"resolved\": \"https://registry.npmmirror.com/image-size/-/image-size-1.2.1.tgz\",\n      \"integrity\": \"sha512-rH+46sQJ2dlwfjfhCyNx5thzrv+dtmBIhPHk0zgRUukHzZ/kRueTJXoYYsclBaKcSMBWuGbOFXtioLpzTb5euw==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"queue\": \"6.0.2\"\n      },\n      \"bin\": {\n        \"image-size\": \"bin/image-size.js\"\n      },\n      \"engines\": {\n        \"node\": \">=16.x\"\n      }\n    },\n    \"node_modules/immediate\": {\n      \"version\": \"3.0.6\",\n      \"resolved\": \"https://registry.npmmirror.com/immediate/-/immediate-3.0.6.tgz\",\n      \"integrity\": \"sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/inherits\": {\n      \"version\": \"2.0.4\",\n      \"resolved\": \"https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz\",\n      \"integrity\": \"sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==\",\n      \"license\": \"ISC\"\n    },\n    \"node_modules/isarray\": {\n      \"version\": \"1.0.0\",\n      \"resolved\": \"https://registry.npmmirror.com/isarray/-/isarray-1.0.0.tgz\",\n      \"integrity\": \"sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/jszip\": {\n      \"version\": \"3.10.1\",\n      \"resolved\": \"https://registry.npmmirror.com/jszip/-/jszip-3.10.1.tgz\",\n      \"integrity\": \"sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==\",\n      \"license\": \"(MIT OR GPL-3.0-or-later)\",\n      \"dependencies\": {\n        \"lie\": \"~3.3.0\",\n        \"pako\": \"~1.0.2\",\n        \"readable-stream\": \"~2.3.6\",\n        \"setimmediate\": \"^1.0.5\"\n      }\n    },\n    \"node_modules/lie\": {\n      \"version\": \"3.3.0\",\n      \"resolved\": \"https://registry.npmmirror.com/lie/-/lie-3.3.0.tgz\",\n      \"integrity\": \"sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"immediate\": \"~3.0.5\"\n      }\n    },\n    \"node_modules/pako\": {\n      \"version\": \"1.0.11\",\n      \"resolved\": \"https://registry.npmmirror.com/pako/-/pako-1.0.11.tgz\",\n      \"integrity\": \"sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==\",\n      \"license\": \"(MIT AND Zlib)\"\n    },\n    \"node_modules/playwright\": {\n      \"version\": \"1.61.1\",\n      \"resolved\": \"https://registry.npmmirror.com/playwright/-/playwright-1.61.1.tgz\",\n      \"integrity\": \"sha512-DWnY5o3YbLWK4GovuAVwpqL+1VwGNdUGrRr++8j8PtQQzvAVZUIMjKQ90fY689sEJZJBbZVw1rXaOKSTitkzPQ==\",\n      \"license\": \"Apache-2.0\",\n      \"dependencies\": {\n        \"playwright-core\": \"1.61.1\"\n      },\n      \"bin\": {\n        \"playwright\": \"cli.js\"\n      },\n      \"engines\": {\n        \"node\": \">=18\"\n      },\n      \"optionalDependencies\": {\n        \"fsevents\": \"2.3.2\"\n      }\n    },\n    \"node_modules/playwright-core\": {\n      \"version\": \"1.61.1\",\n      \"resolved\": \"https://registry.npmmirror.com/playwright-core/-/playwright-core-1.61.1.tgz\",\n      \"integrity\": \"sha512-h7Qlt6m4REp25qvIdvbDtVmD4LqVXfpRxhORv9L0jzETM05p4fuPJ3dKyuSXQxDSbXnmS79HAgi9589lGSpLkg==\",\n      \"license\": \"Apache-2.0\",\n      \"bin\": {\n        \"playwright-core\": \"cli.js\"\n      },\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/pptxgenjs\": {\n      \"version\": \"4.0.1\",\n      \"resolved\": \"https://registry.npmmirror.com/pptxgenjs/-/pptxgenjs-4.0.1.tgz\",\n      \"integrity\": \"sha512-TeJISr8wouAuXw4C1F/mC33xbZs/FuEG6nH9FG1Zj+nuPcGMP5YRHl6X+j3HSUnS1f3at6k75ZZXPMZlA5Lj9A==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@types/node\": \"^22.8.1\",\n        \"https\": \"^1.0.0\",\n        \"image-size\": \"^1.2.1\",\n        \"jszip\": \"^3.10.1\"\n      }\n    },\n    \"node_modules/process-nextick-args\": {\n      \"version\": \"2.0.1\",\n      \"resolved\": \"https://registry.npmmirror.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz\",\n      \"integrity\": \"sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/queue\": {\n      \"version\": \"6.0.2\",\n      \"resolved\": \"https://registry.npmmirror.com/queue/-/queue-6.0.2.tgz\",\n      \"integrity\": \"sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"inherits\": \"~2.0.3\"\n      }\n    },\n    \"node_modules/readable-stream\": {\n      \"version\": \"2.3.8\",\n      \"resolved\": \"https://registry.npmmirror.com/readable-stream/-/readable-stream-2.3.8.tgz\",\n      \"integrity\": \"sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"core-util-is\": \"~1.0.0\",\n        \"inherits\": \"~2.0.3\",\n        \"isarray\": \"~1.0.0\",\n        \"process-nextick-args\": \"~2.0.0\",\n        \"safe-buffer\": \"~5.1.1\",\n        \"string_decoder\": \"~1.1.1\",\n        \"util-deprecate\": \"~1.0.1\"\n      }\n    },\n    \"node_modules/safe-buffer\": {\n      \"version\": \"5.1.2\",\n      \"resolved\": \"https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.1.2.tgz\",\n      \"integrity\": \"sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/setimmediate\": {\n      \"version\": \"1.0.5\",\n      \"resolved\": \"https://registry.npmmirror.com/setimmediate/-/setimmediate-1.0.5.tgz\",\n      \"integrity\": \"sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/string_decoder\": {\n      \"version\": \"1.1.1\",\n      \"resolved\": \"https://registry.npmmirror.com/string_decoder/-/string_decoder-1.1.1.tgz\",\n      \"integrity\": \"sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"safe-buffer\": \"~5.1.0\"\n      }\n    },\n    \"node_modules/undici-types\": {\n      \"version\": \"6.21.0\",\n      \"resolved\": \"https://registry.npmmirror.com/undici-types/-/undici-types-6.21.0.tgz\",\n      \"integrity\": \"sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/util-deprecate\": {\n      \"version\": \"1.0.2\",\n      \"resolved\": \"https://registry.npmmirror.com/util-deprecate/-/util-deprecate-1.0.2.tgz\",\n      \"integrity\": \"sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==\",\n      \"license\": \"MIT\"\n    }\n  }\n}\n\nFile v2.0.1:scripts/package.json\n\n{\n  \"name\": \"html-slides-tools\",\n  \"version\": \"3.0.0\",\n  \"description\": \"HTML slides -> PPTX converter + validator (bundled with the html-slides skill)\",\n  \"private\": true,\n  \"type\": \"commonjs\",\n  \"scripts\": {\n    \"test\": \"node test/golden.js verify\",\n    \"test:update\": \"node test/golden.js update\",\n    \"test:design\": \"node test/exemplar-checks.js && node test/threshold-parity.js && node test/generation-checks.js && node test/anchor-integrity.js\",\n    \"test:thresholds\": \"node test/threshold-parity.js\",\n    \"test:generation\": \"node test/generation-checks.js\",\n    \"test:anchors\": \"node test/anchor-integrity.js\",\n    \"validate\": \"node validate.js\",\n    \"convert\": \"node convert.js\"\n  },\n  \"dependencies\": {\n    \"playwright\": \"^1.61.1\",\n    \"pptxgenjs\": \"^4.0.1\"\n  }\n}\n\nFile v2.0.1:scripts/test/FEATURE-COVERAGE.md\n\n# 特性覆盖矩阵(FEATURE-COVERAGE)\n\n> golden fixtures 的\"特性 → 锚定页\"台账(2026-08-02 Phase G 建立)。\n> **登记规则(硬约束)**:\n> 1. 新增转换器特性(基元/样式/元素/配置)时,必须指定锚定页并更新本表;无锚定页的特性不得合并。\n> 2. 删除夹具页前,先查本表确认它不是某特性的唯一锚点。\n> 3. 样张页(96-107、110-117)同时受 `test/exemplar-checks.js` 设计门禁(0 ERROR/0 WARN)。\n> 4. **2026-08-06 第五轮 P5**:本表的锚点关系已由 `test/anchor-integrity.js` 变成**可执行断言**\n>    —— 改样张设计时若换掉了承载特性的元素,守卫会失败(唯一锚点失效 = 致命)。\n>    新增/换锚时**同步改该守卫的 ANCHORS 表**,否则台账与守卫脱节(守卫自身会警告)。\n\n### 样张双角色的已知张力(2026-08-06 定型)\n\n样张页身兼\"设计范本 + 转换锚点\"两职。曾考虑让样张退出 L2/L3 基线以解耦,**经查证不可行**:\n`99-archetype-chart` 是 `data-chart:line` 的唯一锚点,`107-dashboard` 是 pie/doughnut/area 的唯一锚点,\n`112-funnel` 是 `data-shape=\"trapezoid\"` 的唯一锚点 —— 退出即等于删除这些特性的转换覆盖。\n\n实测澄清了成本结构:这 9 页**本来就不在 L3**(2026-08-05 瘦身:L3 只截含 capture 基元的页),\n所以改设计的成本只有 L1+L2 重建,而那是\"输出确实变了\"的证据,不是冗余开销。\n真正的风险不是重建成本,而是**改设计会静默摧毁转换覆盖**:实测把 99 页的 `data-chart` 换成纯文本后,\n样张门禁 ✅、生成侧回归 ✅,只有 golden 报 diff —— 而\"我重排了这页\"的 diff 复核里重建基线是自然动作。\n故结论:**保留双角色,用 `anchor-integrity.js` 守住锚点**,而不是拆分角色。\n> 页面角色:fidelity 锚(01-21 精简页/游离页/特性页)= 转换保真;exemplar 样张(96-107、110-117)= 保真+设计纪律双锚。\n> 2026-08-05 第三轮重构(布局丰富度):零管线改动;新增样张 110-117 锚定组 6 图示原型(23-30)与内联 SVG 图标。\n\n## 一、文字类\n\n| 特性 | 锚定页 | 备注 |\n|---|---|---|\n| 斜体 `<i>/<em>` | 90-p0-features、49-four-layer、chip-market-share | 49-four/chip 是历史缺陷修复锚 |\n| 下划线 / 删除线 / 超链接 | 90-p0-features | run 级 |\n| run 级字体 fontFace | 90-p0-features、96-107(`.num`) | `.num` Inter 混排是真实场景锚 |\n| text-transform | 90-p0-features | uppercase/lowercase |\n| 上下标 `<sup>/<sub>` | 93-p2-sup-sub-geo | baseline 30000/-40000 |\n| run 级字距 charSpacing | 93-p2-sup-sub-geo | 与 box 级独立 |\n| 原生列表 `<ul>/<ol>` bullet | 91-p1-forms、01-cockpit 压测(临时) | LI 直接含文字挂 bullet;**2026-08-05 H11 修复**:旧写法 type+characterCode 永不产 buChar;现 UL 无 type、OL 用 style |\n| pre/code 空白保留 | 91-p1-forms | white-space:pre |\n| 竖排 writing-mode | 49-four-layer | 实验性 eaVert(基线 WARN) |\n| 混合字号行 | 98-statband、107-dashboard | 大数字+单位,行高按最大 run |\n| 500 字重退化 WARN | advice-for-newcomers、ai-trends-2026、four-revolutions | validate 基线锚 |\n\n## 二、形状/装饰类\n\n| 特性 | 锚定页 | 备注 |\n|---|---|---|\n| 纯色形状 / 圆角 / 正圆 | 全体 | 基础 |\n| 统一边框 | 02 等 | px→pt(0.5 倍) |\n| 非统一边框逐边细条 | 02、12 | 圆角共存 WARN 锚 |\n| 虚线/点线 dashType | 90-p0-features | dashed→dash,dotted→sysDot |\n| box-shadow 真实参数 | 07-journey-map、data-limit-boundary、90 | 历史缺陷修复锚(行为红线) |\n| 纯旋转 rotate | 90-p0-features、93-p2-sup-sub-geo | origin 居中约束 |\n| data-shape 预设几何 | 93-p2-sup-sub-geo、111(chevron/homePlate)、112(trapezoid+rotate)、116(triangle/trapezoid) | 15 种(白名单 80+) |\n| 不透明度 opacity 折算 | 全体(基础路径) | 形状填充折算 |\n| 内联 SVG 图标(截图) | 110/114/115/117(卡内嵌套)、113(环形箭头) | 2026-08-05;stroke 显式 hex;currentColor→空白(H7 怪癖) |\n| 组 6 图示原型 | 110 图标网格(23)/111 chevron 带(24)/112 漏斗(25)/113 循环(27)/114 辐射(28)/115 色带(30)/116 金字塔(26)/117 对比卡阵(29) | 2026-08-05 第三轮;exemplar 门禁 0/0 |\n| preview data-shape clip-path 近似 | 111/112/116(仅 preview 截图层) | H8;页面文件不动 |\n\n## 三、背景/媒体类\n\n| 特性 | 锚定页 | 备注 |\n|---|---|---|\n| 渐变(截图路径,默认) | 01、94-p2-gradient | 2x DPI |\n| 原生线性渐变 a:gradFill | **已知缺口(有意)** | `nativeGradient` 默认关;开启路径由 convert 冒烟覆盖,未入 golden(见\"五\") |\n| `<img>` 原生图片 | 91-p1-forms | object-fit 映射;file:// 路径(注意环境漂移) |\n| `<table>` 原生表格 | 91-p1-forms、106-table-focus | colspan/底纹/边框/右对齐;**2026-08-05 H12 修复**:tr 级底纹(background 不继承到 td)原丢失,现沿 td→tr→table 回溯 |\n| `<canvas>` 截图 | 92-p1-chart-visual | 可见化保底 |\n| data-chart:bar | 92-p1-chart-visual | 原生图表 |\n| data-chart:line | 99-archetype-chart | |\n| data-chart:pie / doughnut / area | 107-dashboard | 2026-08-02 Phase G 补锚 |\n| `<svg>` 截图 | data-limit-boundary | 整体截图含文字 |\n| `<video>` / `<audio>` | 95-p2-master-media | addMedia;poster 封面 |\n| 图标字体自动截图 | 92-p1-chart-visual | iconFonts 命中 |\n| mix-blend-mode / clip-path 转截图 | 92-p1-chart-visual | 视觉特效 |\n\n## 四、布局/页面级\n\n| 特性 | 锚定页 | 备注 |\n|---|---|---|\n| 方式 A 绝对定位 | 全体 | |\n| 方式 B flex/grid 流式 | 02、96-editorial、104-comparison | |\n| 方式 C data-layout(columns/grid) | 98-statband、103-split-7-5、107-dashboard | 解析器改写 |\n| 母版 pageNumbers + footer | **全体 L2 页**(fixtures/slides.config.json) | 2026-08-02 Phase G 开启 |\n| 转场 fade/push/wipe/cover/split | 96/97/98/99/100(playlist 项) | 2026-08-02 Phase G 开启,五档齐 |\n| 深底容器背景导出 | 97-archetype-divider、01 | |\n| 演讲者备注 template | 全体 | notesSlide XML |\n| 增量缓存 | L2 全 deck | hash 命中/失效 |\n| design.formProfile deck 级形式检查 | 开发期构造用例(5 页纯文字单调 deck → 2 WARN) | 2026-08-05;缺省/text 休眠,fixtures 无 profile 零影响 |\n\n## 五、行为锚点(回归红线活证据,删页红线)\n\n| 页 | 锚定的历史行为 |\n|---|---|\n| 49-four-layer-overview | 斜体提取修复(4 处)+ 竖排 eaVert |\n| chip-market-share | 斜体提取修复(1 处) |\n| 07-journey-map | box-shadow 真实值化(4 处) |\n| data-limit-boundary | box-shadow 真实值化(7 处)+ SVG 截图 |\n| advice-for-newcomers | 字体时序加固(L1 height 抖动 37→39px) |\n| ai-trends-2026 / four-revolutions | 500 字重 WARN 基线 |\n\n## 六、设计质量检查的锚定页(2026-08-06 第四轮 P3 建立)\n\n> 这些是 **validate 设计检查**(非转换器特性)的锚定页,由 `test/exemplar-checks.js` 断言 0 ERROR/0 WARN。\n> 与转换器特性同规则:新增设计规则必须在此登记锚定页;改这些页前先查本表。\n> 判据阈值与设计契约同源 —— 改阈值须同步 `reference/design-principles.md` 第一/二章。\n\n| 检查(规则号) | 正向锚定页(应通过) | 反向自证方式 | 标定实测值 |\n|---|---|---|---|\n| 文字对比度(layout-checks 5) | 97/103/117(深底页,用 `--on-navy-*`) | 把 `--on-navy-text` 改成 `#1F1F1F` → 97 页立即 2×ERROR(1.22:1) | 全 44 页命中 0;豁免 ≥120px 水印数字、≤2 字符纯符号 |\n| 墨迹行覆盖率(dom-checks 14a) | 96/104/105/106/107/111(P5 重排后 58-97%) | 105 重排前实测 29% | 阈值 55%;airy 页(97/101/102)整条豁免 |\n| 连续空白断层(dom-checks 14b) | 同上(重排后 20-110px) | 96 重排前 330px | 阈值 200px |\n| 上下分布偏斜(dom-checks 14c) | 全样张 | — | 阈值任一半 ≤88% |\n| 字号层级(dom-checks 15) | 全样张(比值 2.1-4.7) | 构造同字号页 → WARN | 页标题/正文 ≥1.6;字号档数 ≥3;正文样本限 top≥320 |\n| 结构色面下限(dom-checks 16) | 96/98/99/100/104/105/106/107/111(色面 13.9-45%) | 96-107 段重排前 10 页色面 **恰好 0%** | ≥1 块(≥1.5 万 px²)或 ≥8%;仅 balanced/rich 档 |\n| 企业黑话密度(dom-checks 17) | 全语料(一档命中最高 1 次 / 11.5‰) | 构造空话页 → WARN(5 次 / 32 字 = 156‰) | ≥40‰ 且 ≥3 次;二档词(对齐/协同/沉淀/闭环)不计 |\n| **限定词落地(layout-checks 6)** | 无常设锚定页(按设计:`hedgePages` 缺省 `[]`,旧夹具零命中) | 注入式自证:构造两页(同内容,一页含\"我们认为/有待验证\")→ 登记进 `hedgePages` → 未含限定词页 WARN、含限定词页静默;未登记页零命中 | 限定词表 7 词;只查内容区(top < footerZoneTop 980),`<template>` 备注不计 |\n\n**exemplar-checks 的 DESIGN 档**:`presentation` + `balanced` + airyPages(97/101/102)。\n`formProfile` 是 2026-08-06 补的 —— 缺该键时规则 16 在样张上从不触发(样张自己得先过 balanced 档)。\n\n## 七、已知缺口(有意/待办)\n\n| 缺口 | 状态 | 说明 |\n|---|---|---|\n| 原生渐变(nativeGradient:true)渲染路径 | 有意未入 golden | D2 拍板默认关;建议后续建第二 playlist(独立 config)锚定 |\n| validate ERROR 触发路径 | 未系统锚定 | 目前以 0 ERROR 通过反向验证;ERROR 构造用例散见于开发期,低优先。例外:对比度 ERROR 已有注入式自证(见上表) |\n| 全出血大图页(原型 11)/ 图文页(原型 10) | 样张未含 | 图片型页面已有 91 img 锚定;后续按需要补样张 |\n| `95-p2-master-media.html` 引用的 `demo.mp4` | 仓库中从未存在 | 转换时报\"媒体文件不存在\"警告并跳过;媒体嵌入路径因此未被真正锚定(2026-08-06 发现,先登记不修) |\n| 深化层产物本身的质量 | **有意未测**(2026-08-06 第六轮 P6 决策) | D 组能断言深化层的**结构**(计数一致、总表取值合法、依赖图完备、字段对齐、角色覆盖、阈值同源),但无法断言\"这条洞察是否真的深刻\"\"这次委员会是否真的改进了大纲\"。丢弃率是委员会的自体检指标,不是质量判据。内容质量的最终闸仍是 Q5 用户确认 —— 机器不越位 |\n| `--text-*` 字号令牌零引用 | **已知未修**(2026-08-06 P4 决策) | 语料/片段/原型库共 59 处硬编码 font-size,`--text-*` 引用数为 **0** —— 字号阶仍只存在于文档。未迁移的原因:`--text-body: 24px` 与页面现用 26px 不等值,迁移会**实际改变字号**而非纯重构,且要重建一轮基线。替代保护:`generation-checks.js` 的 A1/A2/A3 已能拦住\"令牌缺失/下限当默认值/正文破档\"三类漂移,故迁移收益有限、可延后 |\n\n## 八、corpus 账本(2026-08-02 Phase G 定稿;2026-08-05 第三轮更新 + 瘦身)\n\n- L1/L3:36 页 + 8 样张(110-117)+ 模板 3(extraPages)= **47**\n- L2 playlist:32 页 + 8 样张 = **40**(10 精简 deck + 4 游离 + 6 特性 + 20 样张)\n- 退役:06/16/18(重复)+ 04/07/10/13/14/17/19/20(精简)= 11 页\n- **2026-08-05 瘦身(golden.js)**:L2 notesSlide 合并为单项锚定(40 文件 → 1 项,差异时明细列文件);L3 仅含 capture 基元页截图(19 页;28 纯原生页由 L1 完全锚定免截图);孤儿 PNG(退役 11 页)已清。比对项 174 → **107**(L1 47 + L2 41 + L3 19),磁盘 6.4MB → 2.7MB,保护范围不减\n\nFile v2.0.1:scripts/test/fixtures.json\n\n{\n  \"_comment\": \"路径相对 scripts/test/ 解析(golden.js 统一 resolve);夹具已 vendored 进 fixtures/,技能目录自包含\",\n  \"slidesDir\": \"./fixtures/slides\",\n  \"playlistFile\": \"./fixtures/slides/playlist.json\",\n  \"playlistPages\": [\n    \"01.html\",\n    \"02.html\",\n    \"03.html\",\n    \"05.html\",\n    \"08.html\",\n    \"09.html\",\n    \"11.html\",\n    \"12.html\",\n    \"15.html\",\n    \"21.html\",\n    \"07-journey-map.html\",\n    \"49-four-layer-overview.html\",\n    \"advice-for-newcomers.html\",\n    \"data-limit-boundary.html\",\n    \"90-p0-features.html\",\n    \"91-p1-forms.html\",\n    \"92-p1-chart-visual.html\",\n    \"93-p2-sup-sub-geo.html\",\n    \"94-p2-gradient.html\",\n    \"95-p2-master-media.html\",\n    \"96-archetype-editorial.html\",\n    \"97-archetype-divider.html\",\n    \"98-archetype-statband.html\",\n    \"99-archetype-chart.html\",\n    \"100-agenda.html\",\n    \"101-big-statement.html\",\n    \"102-quote.html\",\n    \"103-split-7-5.html\",\n    \"104-comparison.html\",\n    \"105-timeline.html\",\n    \"106-table-focus.html\",\n    \"107-dashboard.html\",\n    \"110-icon-grid.html\",\n    \"111-chevron-flow.html\",\n    \"112-funnel.html\",\n    \"113-cycle.html\",\n    \"114-hub-spoke.html\",\n    \"115-color-band.html\",\n    \"116-pyramid.html\",\n    \"117-vs-cards.html\"\n  ],\n  \"pages\": [\n    \"01.html\",\n    \"02.html\",\n    \"03.html\",\n    \"05.html\",\n    \"08.html\",\n    \"09.html\",\n    \"11.html\",\n    \"12.html\",\n    \"15.html\",\n    \"21.html\",\n    \"05-four-questions-ai-capabilities.html\",\n    \"07-journey-map.html\",\n    \"49-four-layer-overview.html\",\n    \"advice-for-newcomers.html\",\n    \"ai-trends-2026.html\",\n    \"chip-market-share.html\",\n    \"data-limit-boundary.html\",\n    \"four-revolutions.html\",\n    \"90-p0-features.html\",\n    \"91-p1-forms.html\",\n    \"92-p1-chart-visual.html\",\n    \"93-p2-sup-sub-geo.html\",\n    \"94-p2-gradient.html\",\n    \"95-p2-master-media.html\",\n    \"96-archetype-editorial.html\",\n    \"97-archetype-divider.html\",\n    \"98-archetype-statband.html\",\n    \"99-archetype-chart.html\",\n    \"100-agenda.html\",\n    \"101-big-statement.html\",\n    \"102-quote.html\",\n    \"103-split-7-5.html\",\n    \"104-comparison.html\",\n    \"105-timeline.html\",\n    \"106-table-focus.html\",\n    \"107-dashboard.html\",\n    \"110-icon-grid.html\",\n    \"111-chevron-flow.html\",\n    \"112-funnel.html\",\n    \"113-cycle.html\",\n    \"114-hub-spoke.html\",\n    \"115-color-band.html\",\n    \"116-pyramid.html\",\n    \"117-vs-cards.html\"\n  ],\n  \"extraPages\": [\n    \"../../assets/slide-template.html\",\n    \"../../assets/slide-template-flex.html\",\n    \"../../assets/slide-template-layout.html\"\n  ]\n}\n\nFile v2.0.1:scripts/test/fixtures/slides/playlist.json\n\n{\n  \"schemaVersion\": \"1.0\",\n  \"format\": \"html\",\n  \"metadata\": {\n    \"title\": \"AI辅助ESG管理革新工作坊 · I.D.E.A.智能工作流一日精修\",\n    \"description\": \"讲师投屏PPT · 联想Lenovo视觉风格 · 微软雅黑 · 全天课程\",\n    \"author\": \"\"\n  },\n  \"canvas\": {\n    \"width\": 1920,\n    \"height\": 1080\n  },\n  \"playlist\": [\n    \"01.html\",\n    \"02.html\",\n    \"03.html\",\n    \"05.html\",\n    \"08.html\",\n    \"09.html\",\n    \"11.html\",\n    \"12.html\",\n    \"15.html\",\n    \"21.html\",\n    \"07-journey-map.html\",\n    \"49-four-layer-overview.html\",\n    \"advice-for-newcomers.html\",\n    \"data-limit-boundary.html\",\n    \"90-p0-features.html\",\n    \"91-p1-forms.html\",\n    \"92-p1-chart-visual.html\",\n    \"93-p2-sup-sub-geo.html\",\n    \"94-p2-gradient.html\",\n    \"95-p2-master-media.html\",\n    {\n      \"file\": \"96-archetype-editorial.html\",\n      \"transition\": \"fade\"\n    },\n    {\n      \"file\": \"97-archetype-divider.html\",\n      \"transition\": \"push\"\n    },\n    {\n      \"file\": \"98-archetype-statband.html\",\n      \"transition\": \"wipe\"\n    },\n    {\n      \"file\": \"99-archetype-chart.html\",\n      \"transition\": \"cover\"\n    },\n    {\n      \"file\": \"100-agenda.html\",\n      \"transition\": \"split\"\n    },\n    \"101-big-statement.html\",\n    \"102-quote.html\",\n    \"103-split-7-5.html\",\n    \"104-comparison.html\",\n    \"105-timeline.html\",\n    \"106-table-focus.html\",\n    \"107-dashboard.html\",\n    \"110-icon-grid.html\",\n    \"111-chevron-flow.html\",\n    \"112-funnel.html\",\n    \"113-cycle.html\",\n    \"114-hub-spoke.html\",\n    \"115-color-band.html\",\n    \"116-pyramid.html\",\n    \"117-vs-cards.html\"\n  ]\n}\n\nFile v2.0.1:scripts/test/fixtures/slides/slides.config.json\n\n{\n  \"master\": {\n    \"pageNumbers\": true,\n    \"footer\": \"golden-fixture\",\n    \"footerColor\": \"999999\"\n  },\n  \"design\": {\n    \"tier\": \"\",\n    \"formProfile\": \"\"\n  }\n}\n\nFile v2.0.1:scripts/test/golden/validate-baseline.txt\n\n=== 01.html ===\n  ✅ 无违规\n\n=== 02.html ===\n  ⚠️  WARN 圆角卡片使用非统一边框(0px/0px/0px/5px),逐边细条不贴合圆角\n     → 修复: 圆角卡改用统一边框,或强调条用独立细长 shape\n  ⚠️  WARN 圆角卡片使用非统一边框(0px/0px/0px/5px),逐边细条不贴合圆角\n     → 修复: 圆角卡改用统一边框,或强调条用独立细长 shape\n  ⚠️  WARN 圆角卡片使用非统一边框(0px/0px/0px/5px),逐边细条不贴合圆角\n     → 修复: 圆角卡改用统一边框,或强调条用独立细长 shape\n  ⚠️  WARN 圆角卡片使用非统一边框(0px/0px/0px/5px),逐边细条不贴合圆角\n     → 修复: 圆角卡改用统一边框,或强调条用独立细长 shape\n\n=== 03.html ===\n  ✅ 无违规\n\n=== 05-four-questions-ai-capabilities.html ===\n  ✅ 无违规\n\n=== 05.html ===\n  ✅ 无违规\n\n=== 07-journey-map.html ===\n  ⚠️  WARN L41 box-shadow 只还原第一层非 inset 阴影(spread 与多层不还原)\n     → 修复: 如需精确阴影,改用渐变/多层形状模拟\n  ⚠️  WARN L57 box-shadow 只还原第一层非 inset 阴影(spread 与多层不还原)\n     → 修复: 如需精确阴影,改用渐变/多层形状模拟\n  ⚠️  WARN L73 box-shadow 只还原第一层非 inset 阴影(spread 与多层不还原)\n     → 修复: 如需精确阴影,改用渐变/多层形状模拟\n  ⚠️  WARN L89 box-shadow 只还原第一层非 inset 阴影(spread 与多层不还原)\n     → 修复: 如需精确阴影,改用渐变/多层形状模拟\n\n=== 08.html ===\n  ✅ 无违规\n\n=== 09.html ===\n  ✅ 无违规\n\n=== 100-agenda.html ===\n  ✅ 无违规\n\n=== 101-big-statement.html ===\n  ✅ 无违规\n\n=== 102-quote.html ===\n  ✅ 无违规\n\n=== 103-split-7-5.html ===\n  ✅ 无违规\n\n=== 104-comparison.html ===\n  ✅ 无违规\n\n=== 105-timeline.html ===\n  ✅ 无违规\n\n=== 106-table-focus.html ===\n  ✅ 无违规\n\n=== 107-dashboard.html ===\n  ✅ 无违规\n\n=== 11.html ===\n  ✅ 无违规\n\n=== 110-icon-grid.html ===\n  ✅ 无违规\n\n=== 111-chevron-flow.html ===\n  ✅ 无违规\n\n=== 112-funnel.html ===\n  ✅ 无违规\n\n=== 113-cycle.html ===\n  ✅ 无违规\n\n=== 114-hub-spoke.html ===\n  ✅ 无违规\n\n=== 115-color-band.html ===\n  ✅ 无违规\n\n=== 116-pyramid.html ===\n  ✅ 无违规\n\n=== 117-vs-cards.html ===\n  ✅ 无违规\n\n=== 12.html ===\n  ⚠️  WARN 圆角卡片使用非统一边框(4px/0px/0px/0px),逐边细条不贴合圆角\n     → 修复: 圆角卡改用统一边框,或强调条用独立细长 shape\n  ⚠️  WARN 圆角卡片使用非统一边框(4px/0px/0px/0px),逐边细条不贴合圆角\n     → 修复: 圆角卡改用统一边框,或强调条用独立细长 shape\n\n=== 15.html ===\n  ✅ 无违规\n\n=== 21.html ===\n  ✅ 无违规\n\n=== 49-four-layer-overview.html ===\n  ⚠️  WARN L88 竖排文字为实验性支持(eaVert)\n     → 修复: 逐字 <br> 换行是更稳的替代\n\n=== 90-p0-features.html ===\n  ⚠️  WARN L60 box-shadow 只还原第一层非 inset 阴影(spread 与多层不还原)\n     → 修复: 如需精确阴影,改用渐变/多层形状模拟\n\n=== 91-p1-forms.html ===\n  ✅ 无违规\n\n=== 92-p1-chart-visual.html ===\n  ⚠️  WARN mix-blend-mode:multiply 元素整体转截图(不可编辑)\n     → 修复: 文字放在特效元素之外的独立 textbox 叠加\n  ⚠️  WARN clip-path:polygon(0px 0px, 100% 0px, 100% 100%, 0px 100%, 0px 50%) 元素整体转截图(不可编辑)\n     → 修复: 裁剪形状内的文字改放独立 textbox\n\n=== 93-p2-sup-sub-geo.html ===\n  ⚠️  WARN 多行文字未设显式 line-height,行距将不可控: \"rtTriangle\"\n     → 修复: 给该文本加 line-height(如 1.5 或 31px)\n  ⚠️  WARN 多行文字未设显式 line-height,行距将不可控: \"chevron↓(rot 180)\"\n     → 修复: 给该文本加 line-height(如 1.5 或 31px)\n  ⚠️  WARN 多行文字未设显式 line-height,行距将不可控: \"diamond+shadow\"\n     → 修复: 给该文本加 line-height(如 1.5 或 31px)\n  ⚠️  WARN 多行文字未设显式 line-height,行距将不可控: \"triangle+dashed\"\n     → 修复: 给该文本加 line-height(如 1.5 或 31px)\n  ⚠️  WARN L131 box-shadow 只还原第一层非 inset 阴影(spread 与多层不还原)\n     → 修复: 如需精确阴影,改用渐变/多层形状模拟\n\n=== 94-p2-gradient.html ===\n  ⚠️  WARN 文字颜色带透明度,转换后变为纯色: \"智能工作流让协作更高效,让创意更自由,让\" (rgba(255, 255, 255, 0.85))\n     → 修复: 改用不透明的混合色值(手算与底色的混合结果)\n  ⚠️  WARN L74 box-shadow 只还原第一层非 inset 阴影(spread 与多层不还原)\n     → 修复: 如需精确阴影,改用渐变/多层形状模拟\n  ⚠️  WARN L79 box-shadow 只还原第一层非 inset 阴影(spread 与多层不还原)\n     → 修复: 如需精确阴影,改用渐变/多层形状模拟\n\n=== 95-p2-master-media.html ===\n  ⚠️  WARN 元素完全在画布外,不会显示: <audio> \"\"\n     → 修复: 移入 1920x1080 画布内,或删除\n  ⚠️  WARN <video> 未指定 src,将仅用封面图展示\n     → 修复: 加 src 属性指向本地视频文件\n  ⚠️  WARN <video> 未设 poster,将截取浏览器渲染帧做封面(可能黑屏)\n     → 修复: 加 poster 属性指向封面图\n\n=== 96-archetype-editorial.html ===\n  ✅ 无违规\n\n=== 97-archetype-divider.html ===\n  ✅ 无违规\n\n=== 98-archetype-statband.html ===\n  ✅ 无违规\n\n=== 99-archetype-chart.html ===\n  ✅ 无违规\n\n=== advice-for-newcomers.html ===\n  ⚠️  WARN font-weight:500 在 PPTX 中退化为常规体: \"员工工作满意度提升 · Gallup\"\n     → 修复: 改用 400(常规)或 600(粗体)\n  ⚠️  WARN font-weight:500 在 PPTX 中退化为常规体: \"全球增长最快的岗位 · LinkedIn\"\n     → 修复: 改用 400(常规)或 600(粗体)\n  ⚠️  WARN font-weight:500 在 PPTX 中退化为常规体: \"AI 增强团队生产力提升\"\n     → 修复: 改用 400(常规)或 600(粗体)\n  ⚠️  WARN font-weight:500 在 PPTX 中退化为常规体: \"人机协作的三条纪律\"\n     → 修复: 改用 400(常规)或 600(粗体)\n\n=== ai-trends-2026.html ===\n  ⚠️  WARN font-weight:500 在 PPTX 中退化为常规体: \"企业软件将内置 Agent · Gart\"\n     → 修复: 改用 400(常规)或 600(粗体)\n  ⚠️  WARN font-weight:500 在 PPTX 中退化为常规体: \"近两年多模态模型发布量增速\"\n     → 修复: 改用 400(常规)或 600(粗体)\n  ⚠️  WARN font-weight:500 在 PPTX 中退化为常规体: \"AI 原生团队人均产出差距\"\n     → 修复: 改用 400(常规)或 600(粗体)\n  ⚠️  WARN font-weight:500 在 PPTX 中退化为常规体: \"问答工具\"\n     → 修复: 改用 400(常规)或 600(粗体)\n  ⚠️  WARN font-weight:500 在 PPTX 中退化为常规体: \"副驾驶\"\n     → 修复: 改用 400(常规)或 600(粗体)\n\n=== chip-market-share.html ===\n  ✅ 无违规\n\n=== data-limit-boundary.html ===\n  ⚠️  WARN L47 box-shadow 只还原第一层非 inset 阴影(spread 与多层不还原)\n     → 修复: 如需精确阴影,改用渐变/多层形状模拟\n  ⚠️  WARN L48 box-shadow 只还原第一层非 inset 阴影(spread 与多层不还原)\n     → 修复: 如需精确阴影,改用渐变/多层形状模拟\n  ⚠️  WARN L49 box-shadow 只还原第一层非 inset 阴影(spread 与多层不还原)\n     → 修复: 如需精确阴影,改用渐变/多层形状模拟\n  ⚠️  WARN L50 box-shadow 只还原第一层非 inset 阴影(spread 与多层不还原)\n     → 修复: 如需精确阴影,改用渐变/多层形状模拟\n  ⚠️  WARN L51 box-shadow 只还原第一层非 inset 阴影(spread 与多层不还原)\n     → 修复: 如需精确阴影,改用渐变/多层形状模拟\n  ⚠️  WARN L65 box-shadow 只还原第一层非 inset 阴影(spread 与多层不还原)\n     → 修复: 如需精确阴影,改用渐变/多层形状模拟\n  ⚠️  WARN L71 box-shadow 只还原第一层非 inset 阴影(spread 与多层不还原)\n     → 修复: 如需精确阴影,改用渐变/多层形状模拟\n\n=== four-revolutions.html ===\n  ⚠️  WARN font-weight:500 在 PPTX 中退化为常规体: \"基础体力\"\n     → 修复: 改用 400(常规)或 600(粗体)\n  ⚠️  WARN font-weight:500 在 PPTX 中退化为常规体: \"多数体力\"\n     → 修复: 改用 400(常规)或 600(粗体)\n  ⚠️  WARN font-weight:500 在 PPTX 中退化为常规体: \"计算智力\"\n     → 修复: 改用 400(常规)或 600(粗体)\n\n──────────────────────────────\n共 44 个文件: 0 个 ERROR, 44 个 WARN\n\nFile v2.0.1:assets/deck-brief.template.md\n\n# Deck Brief · {主题}\n\n> 访谈轮次:{N} 丨 状态:{待确认/已确认} 丨 本文件是可迭代需求源,改需求 = 改对应行 + 重新确认\n> 写每页时只对照本文件(唯一执行事实源),不回查档位表与访谈记录。\n\n## 定位\n- 主题:{}\n- 受众:{}\n- 一句话目标:{讲完希望听众记住/做什么}\n- 使用场景:{演讲形式/混合形式/阅读形式}\n- 页数:{N} 页(骨架:{骨架名或\"自由结构\"})\n- 素材现状:{全文稿/大纲要点/裸主题} 丨 打磨深度:{深度打磨/标准/快速}\n\n## 内容深化记录(摘要;详档见 `slides/deck-insights.md`)\n\n> 2026-08-06 第六轮 P4:详档独立落盘。此前 6 列洞察表被压进本区一行,写页时无法查 ——\n> 花 13-15 次调用产出的东西 Q5 展示一次后就实际不可用。本区只留摘要 + 指针。\n\n- 素材形态:{全文稿/大纲要点/裸主题} 丨 执行:{四步全做/Step 1·2·4/假设清单(裸主题不做追问)}\n- 洞察:{N 条} 丨 **降级论断:{M} 条 → 第 {} 页(已写入 slides.config.json 的 `hedgePages`)**\n- 多角色:{角色名};执行方式 {并行 agents/主循环快评/串行扮演(非独立)}\n- 委员会:固定席(唱反调/执行者)+ 动态席 {3 个};实质冲突 {N} 处;**丢弃率 {X}%**\n- 大纲级形式门禁:{全过 / 不合规项及处置}\n- 详档:`slides/deck-insights.md`(洞察清单/假设清单/意见编号/裁决/被否方向/行动方案)\n\n## 结构(逐页大纲)\n| 页 | 类型 | 形式 | 内容一句话(核心断言) | 原型(编号+名) | 备注(证据需求/风险) |\n|---|---|---|---|---|---|\n| 01 | 封面 | 文字(airy) | {} | 1 封面·深底大字 | |\n\n**原型变化检查**:共 {} 种原型(≥6);同原型最长连排 {} 页(≤2);airy 页 = 第 {} 页;纯文字卡片矩阵页 = 第 {} 页(≤2;图标网格不受此限)\n**形式分布检查**(按视觉形式偏好档):纯文字内容页 {}/{} 页(克制型不限/平衡型 ≤50%/丰富型 ≤30%);同形式最长连排 {} 页(平衡型 ≤3/丰富型 ≤2);图示型页 = 第 {} 页\n\n## 视觉\n- 色板:{预设名(文件),如 business-blue.css} 或 {品牌风:brand-linear.css(Linear 风·深色精密)} 或 {自定义 #RRGGBB 推导(已经二次确认)}\n- 风格个性:{商务咨询/编辑杂志/科技极简/学术朴素/品牌风(档案自带)};风格红线:{如\"禁多彩、蓝是唯一彩色\"}\n- 图片政策:{纯文字图表/产品截图(contain)/照片素材(cover)/图标几何(→ icons.md + 原型 23-30)}\n- **视觉形式偏好:{文字克制型/平衡型/图示丰富型}**(Q8c;平衡型=纯文字内容页 ≤50%、每内容页 ≥1 非文字视觉元素)\n- 基调:{浅色为主·深底封面结尾/全浅色/深色为主}\n- 装饰强度:{简洁/适中/丰富}\n\n## 版式与密度参数(本 deck 的执行硬约束)\n- 布局方式:{自动/C 优先/B 优先/A 经典} 丨 版式节奏:{张弛变化/统一规整}\n- 页标题 {}px / 封面主标 {}px / 区块标题 {}px / 正文 {}px(破档下限 {}px)\n- 字号绝对下限 14px;注释/来源 ≥{}px\n- 每页要点 ≤{} / 每要点 ≤{} 字 / 单页正文 ≤{} 行 / 每页信息块 ≤{}\n- 表格 ≤{} 行(含表头)/ 图表 ≤{} 系列\n- **版面填充**:内容区 320-940,利用率 ≥85%(内容带顶 ≤360、底 ≥880);airy 页豁免 = 封面/分隔/大字观点/引用/收尾\n- **Scale-to-fill**:内容 <60% 上限 → 字号取档内上限、行距 1.6-1.8、条目间距 40px\n- 备注策略:{每页详尽/关键页写/不写}\n- 字体映射:{开(默认雅黑)/关(保留原字体)}\n\n## 去 AI 味约束(写页时逐条自检)\n- kicker+副标题三件套仅用于:第 {} 页(章节首页/封面)\n- 底部结论条仅用于:第 {} 页(章节收尾)\n- 渐变条/渐变英雄区仅用于:第 {} 页(封面/分隔/收尾)\n- 纯文字卡片矩阵页:第 {} 页(≤2 页;图标要点网格/图示卡片是结构形状,不受此限)\n- 每页装饰 ≤2 件(**结构形状不计件**:卡片/图标/流程/漏斗/图表/表格);每页高亮 ≤1 处;默认左对齐\n- 图标纪律:从 assets/icons.md 复制;stroke 显式 hex 禁 currentColor;全页同色系\n- 全部 12 条反模式与结构豁免总则见 reference/design-principles.md 第四节\n\n## 输出\n- 目录:{} 丨 输出:{}.pptx 丨 演示机字体:{默认雅黑映射/保留原字体}\n\nFile v2.0.1:assets/deck-insights.template.md\n\n# Deck Insights · {主题}\n\n> 内容深化层产物(2026-08-06 第六轮 P4 起独立落盘)。深度档:{深度打磨/标准/快速} 丨 素材形态:{全文稿/大纲要点/裸主题}\n> **与 brief 的分工**:brief 是执行事实源(参数与约束),本文件是**论据档案**(每条断言的来龙去脉)。\n> 写页时:brief 定怎么排,本文件定这页能说什么、哪句必须带限定词。\n\n## 一、洞察清单(四步追问产出)\n\n> 裸主题档跳过本节,直接看第二节假设清单。\n\n| # | 论断 | 依据强度 | 反向验证 | 限定词 | 待补数据 | 用于第 N 页 |\n|---|---|---|---|---|---|---|\n| 1 | {} | 强/中/弱 | 通过/降级 | {无 或 我们认为/有待验证/预估} | {} | {} |\n\n**降级论断汇总**(反向验证未通过的):第 {} 页 —— 这些页必须写入 `slides.config.json` 的 `design.hedgePages`,\n且页面内**确实出现限定词**,否则 validate 报 WARN。\n\n## 二、假设清单(裸主题档产出)\n\n> 本节内容**不进 deck 正文** —— 它是给用户的补料请求。\n\n| # | 我的假设 | 假设为真的依据 | 若为假会影响哪几页 | 需要你补什么 |\n|---|---|---|---|---|\n| 1 | {} | {} | {} | {} |\n\n用户处置:{已补料,按矩阵重走 Step 1/2/4} 或 {按假设写,相关页已入 hedgePages}\n\n## 三、多角色洞察\n\n执行方式:{3-5 并行 agents / 主循环 2 角色快评 / 串行扮演(非独立并行)}\n角色(取自推断总表\"委员会动态角色\"列):{}\n\n| 角色 | 策略 | 洞察 | 对第 N 页的影响 |\n|---|---|---|---|\n| {} | 反向追问/跨界连接/未来推演 | {} | {改哪页/加哪页/删哪页} |\n\n## 四、委员会决议\n\n固定席:唱反调者 · 执行者 丨 动态席(3):{}\n执行方式:{5 并行独立 / 串行扮演 / 标准档 checklist 自问}\n\n**独立评审意见**(每条编号,供变更说明引用):\n\n| 编号 | 角色 | 对第 N 页 | 具体修改 |\n|---|---|---|---|\n| 唱反调-1 | 唱反调者 | {} | {} |\n\n**冲突判定**:实质冲突 {N} 处(同页互斥){列出} → 交叉评审席位:{卷入的角色} 或 {无冲突,跳过交叉}\n\n**主席裁决**:\n\n| 冲突 | 类型 | 裁决 | 依据 |\n|---|---|---|---|\n| {} | 事实/判断/可行性 | {} | {回查素材/具体失败场景/执行者否决优先} |\n\n**变更说明**(每条必须引用意见编号,主席自己的想法标 `[主席]`):\n\n| # | v1→v2 变更 | 来源 |\n|---|---|---|\n| 1 | {} | `[唱反调-2]` |\n\n**被否方向表**(防迭代反复):\n\n| 被否的方向 | 提出者 | 否决理由 |\n|---|---|---|\n| {} | {} | {} |\n\n**丢弃率**:收到 {N} 条,采纳 {M} 条,丢弃 {N-M} 条({X}%)。\n> 超 60% 必须说明委员会为什么失效:{角色选错/大纲太粗/素材太薄/……}\n\n## 五、大纲级形式门禁(所有档位都跑)\n\n| 判据 | 上限(按形式档 {}) | 实测 | 结论 |\n|---|---|---|---|\n| 纯文字内容页占比 | {50%/30%/不限} | {}/{} | ✅/❌ |\n| 同形式连排 | {3/2/不限} | {} 页 | ✅/❌ |\n| 原型种数 | ≥6 | {} 种 | ✅/❌ |\n| 同原型连排 | ≤2 | {} 页 | ✅/❌ |\n| airy 页节奏 | 每 3-4 页 1 张 | 第 {} 页 | ✅/❌ |\n| 每内容页非文字视觉元素 | ≥1(丰富档 ≥2) | 最少 {} 个 | ✅/❌ |\n\n不合规项的处置:{换原型/换形式,不换内容}\n\n## 六、行动方案\n\n| 页 | 核心断言 | 证据需求 | 风险旗标 | 待补素材 |\n|---|---|---|---|---|\n| {} | {} | {} | {高/中/低:原因} | {} |\n\nFile v2.0.1:assets/icons.md\n\n# 图标库(icons · 40 枚内联 SVG,线性几何风)\n\n> **用法**:整行复制进页面 → 改两处:`width/height`(尺寸)与 `stroke` 的 hex(颜色)。\n> 图标是**结构件**(承载语义),不计装饰预算;但**无语义不摆图标**。\n\n## 铁律(2026-08-05 B0 实测)\n\n1. **禁 `currentColor`**(stroke/fill 都是)——转换截图前页面文字会被 `*{color:transparent}` 隐藏,currentColor 随之变透明 → 图标在 PPTX 里空白(浏览器预览正常,极隐蔽)。validate 已配静态 WARN。\n2. **stroke 写显式 hex**;也可用 `style=\"stroke:var(--主色变量)\"`(CSS 属性写法不受 color 隐藏影响)。\n3. **全页图标同一色系**(主色或炭灰 `#4A4F55`);深底卡上换亮色(白/浅主色)。\n4. 实心小点/小三角用 `fill=\"#同色\" stroke=\"none\"`(每枚代码里已写好,改色时 stroke/fill 两处都改)。\n5. 尺寸惯例:网格卡 44-48px / 色带 44px / 特征行 20-22px / 节点 36px;每页 ≤8 枚。\n\n技术说明:内联 `<svg>` 由转换器整体截图为 2x PNG 原位贴回(同页文字仍原生可编辑);\n`<use href=\"外部.svg\">` 外链在 file:// 下不渲染(B0.3 已否),**必须整段内联**。\n\n## 语义速查\n\n| 想表达 | 用 | 想表达 | 用 |\n|---|---|---|---|\n| 目标/聚焦/定位 | i-target / i-compass | 增长/趋势 | i-growth |\n| 里程碑/上市 | i-flag / i-rocket | 方向/下一步 | i-arrow |\n| 数据/指标 | i-chart-bar / i-database | 分层/集成 | i-layers |\n| 循环/迭代 | i-refresh | 用户/客户 | i-person |\n| 团队/生态 | i-people | 沟通/反馈 | i-chat |\n| 设置/机制 | i-gear / i-sliders | 搜索/发现 | i-search |\n| 关键/密钥 | i-key | 连接/集成 | i-link |\n| 想法/创新 | i-bulb | 亮点/优势 | i-star |\n| 速度/能量 | i-bolt | 洞察/可见 | i-eye |\n| 安全/合规 | i-shield / i-lock | 完成/达成 | i-check |\n| 风险/排除 | i-warning / i-x | 时间/周期 | i-clock |\n| 计划/日程 | i-calendar | 收藏/保留 | i-bookmark |\n| 成本/支付 | i-wallet | 文档/报告 | i-doc |\n| 邮件/触达 | i-mail | 电话/联络 | i-phone |\n| 首页/门户 | i-home | 全球化 | i-globe |\n| 福利/权益 | i-gift / i-heart | 播放/演示 | i-play |\n| 云/基建 | i-cloud | 发布/加速 | i-rocket |\n\n---\n\n## 方向与目标\n\n**i-target** · 目标/聚焦/定位\n```html\n<svg width=\"44\" height=\"44\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#E2231A\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"9\"/><circle cx=\"12\" cy=\"12\" r=\"5\"/><circle cx=\"12\" cy=\"12\" r=\"1.2\" fill=\"#E2231A\" stroke=\"none\"/></svg>\n```\n\n**i-growth** · 增长/趋势向上\n```html\n<svg width=\"44\" height=\"44\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#E2231A\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"3 17 9 11 13 15 21 7\"/><polyline points=\"15 7 21 7 21 13\"/></svg>\n```\n\n**i-flag** · 里程碑/目标达成\n```html\n<svg width=\"44\" height=\"44\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#E2231A\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><line x1=\"6\" y1=\"3\" x2=\"6\" y2=\"21\"/><path d=\"M6 4 H18 L15 8 L18 12 H6\"/></svg>\n```\n\n**i-compass** · 方向/战略\n```html\n<svg width=\"44\" height=\"44\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#E2231A\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"9\"/><polygon points=\"15.5 8.5 13.5 13.5 8.5 15.5 10.5 10.5\"/></svg>\n```\n\n**i-arrow** · 方向/推进\n```html\n<svg width=\"44\" height=\"44\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#E2231A\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><line x1=\"4\" y1=\"12\" x2=\"20\" y2=\"12\"/><polyline points=\"14 6 20 12 14 18\"/></svg>\n```\n\n## 数据与系统\n\n**i-chart-bar** · 数据/指标\n```html\n<svg width=\"44\" height=\"44\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#E2231A\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"4 4 4 20 20 20\"/><line x1=\"8\" y1=\"20\" x2=\"8\" y2=\"13\" stroke-width=\"3\"/><line x1=\"12\" y1=\"20\" x2=\"12\" y2=\"9\" stroke-width=\"3\"/><line x1=\"16\" y1=\"20\" x2=\"16\" y2=\"15\" stroke-width=\"3\"/></svg>\n```\n\n**i-database** · 数据库/数据资产\n```html\n<svg width=\"44\" height=\"44\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#E2231A\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><ellipse cx=\"12\" cy=\"6\" rx=\"7\" ry=\"3\"/><path d=\"M5 6 V18 C5 19.66 8.13 21 12 21 C15.87 21 19 19.66 19 18 V6\"/><path d=\"M5 12 C5 13.66 8.13 15 12 15 C15.87 15 19 13.66 19 12\"/></svg>\n```\n\n**i-layers** · 分层/集成\n```html\n<svg width=\"44\" height=\"44\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#E2231A\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polygon points=\"12 3 21 8 12 13 3 8\"/><polyline points=\"3 12.5 12 17.5 21 12.5\"/><polyline points=\"3 17 12 22 21 17\"/></svg>\n```\n\n**i-refresh** · 循环/迭代\n```html\n<svg width=\"44\" height=\"44\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#E2231A\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M21 12 a9 9 0 1 1 -9 -9 c2.52 0 4.93 1 6.74 2.74 L21 8\"/><polyline points=\"21 3 21 8 16 8\"/></svg>\n```\n\n**i-cloud** · 云/基础设施\n```html\n<svg width=\"44\" height=\"44\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#E2231A\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M17.5 19 H9 a7 7 0 1 1 6.71 -9 h1.79 a4.5 4.5 0 1 1 0 9 Z\"/></svg>\n```\n\n## 人与组织\n\n**i-person** · 用户/客户\n```html\n<svg width=\"44\" height=\"44\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#E2231A\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"8\" r=\"3.5\"/><path d=\"M5 20 C5 15.5 8 13.5 12 13.5 C16 13.5 19 15.5 19 20\"/></svg>\n```\n\n**i-people** · 团队/生态\n```html\n<svg width=\"44\" height=\"44\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#E2231A\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"9\" cy=\"8.5\" r=\"3\"/><path d=\"M3.5 19.5 C3.5 15.8 6 14 9 14 C12 14 14.5 15.8 14.5 19.5\"/><circle cx=\"16.8\" cy=\"9.5\" r=\"2.4\"/><path d=\"M15.8 14.2 C18.4 13.8 20.8 15.5 20.8 19\"/></svg>\n```\n\n**i-chat** · 沟通/反馈\n```html\n<svg width=\"44\" height=\"44\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#E2231A\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M21 11.5 a8.38 8.38 0 0 1 -0.9 3.8 8.5 8.5 0 0 1 -7.6 4.7 8.38 8.38 0 0 1 -3.8 -0.9 L3 21 l1.9 -5.7 a8.38 8.38 0 0 1 -0.9 -3.8 8.5 8.5 0 0 1 4.7 -7.6 8.38 8.38 0 0 1 3.8 -0.9 h0.5 a8.48 8.48 0 0 1 8 8 v0.5 Z\"/></svg>\n```\n\n## 工具与机制\n\n**i-gear** · 设置/机制/引擎\n```html\n<svg width=\"44\" height=\"44\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#E2231A\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"3.2\"/><line x1=\"18.2\" y1=\"12\" x2=\"21\" y2=\"12\"/><line x1=\"16.38\" y1=\"16.38\" x2=\"18.36\" y2=\"18.36\"/><line x1=\"12\" y1=\"18.2\" x2=\"12\" y2=\"21\"/><line x1=\"7.62\" y1=\"16.38\" x2=\"5.64\" y2=\"18.36\"/><line x1=\"5.8\" y1=\"12\" x2=\"3\" y2=\"12\"/><line x1=\"7.62\" y1=\"7.62\" x2=\"5.64\" y2=\"5.64\"/><line x1=\"12\" y1=\"5.8\" x2=\"12\" y2=\"3\"/><line x1=\"16.38\" y1=\"7.62\" x2=\"18.36\" y2=\"5.64\"/></svg>\n```\n\n**i-sliders** · 调控/配置\n```html\n<svg width=\"44\" height=\"44\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#E2231A\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><line x1=\"5\" y1=\"7\" x2=\"19\" y2=\"7\"/><line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"/><line x1=\"5\" y1=\"17\" x2=\"19\" y2=\"17\"/><circle cx=\"9\" cy=\"7\" r=\"2\"/><circle cx=\"15\" cy=\"12\" r=\"2\"/><circle cx=\"8\" cy=\"17\" r=\"2\"/></svg>\n```\n\n**i-search** · 搜索/发现\n```html\n<svg width=\"44\" height=\"44\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#E2231A\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"11\" cy=\"11\" r=\"6.5\"/><line x1=\"16\" y1=\"16\" x2=\"21\" y2=\"21\"/></svg>\n```\n\n**i-key** · 关键/密钥/破局点\n```html\n<svg width=\"44\" height=\"44\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#E2231A\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"7.5\" cy=\"15.5\" r=\"4.5\"/><line x1=\"10.7\" y1=\"12.3\" x2=\"20\" y2=\"3\"/><line x1=\"15\" y1=\"8\" x2=\"18\" y2=\"11\"/><line x1=\"17.5\" y1=\"5.5\" x2=\"20\" y2=\"8\"/></svg>\n```\n\n**i-link** · 连接/打通\n```html\n<svg width=\"44\" height=\"44\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#E2231A\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M10 13 a5 5 0 0 0 7.54 0.54 l3 -3 a5 5 0 0 0 -7.07 -7.07 l-1.72 1.71\"/><path d=\"M14 11 a5 5 0 0 0 -7.54 -0.54 l-3 3 a5 5 0 0 0 7.07 7.07 l1.71 -1.71\"/></svg>\n```\n\n## 想法与亮点\n\n**i-bulb** · 想法/创新\n```html\n<svg width=\"44\" height=\"44\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#E2231A\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M15 14 c0.2 -1 0.7 -1.7 1.4 -2.4 C17.4 10.1 18 8.6 18 7 A6 6 0 1 0 6 7 c0 1.6 0.6 3.1 1.6 4.6 C8.3 12.3 8.8 13 9 14\"/><line x1=\"9\" y1=\"18\" x2=\"15\" y2=\"18\"/><line x1=\"10\" y1=\"21\" x2=\"14\" y2=\"21\"/></svg>\n```\n\n**i-star** · 亮点/优势/评分\n```html\n<svg width=\"44\" height=\"44\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#E2231A\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M12 3 L14.7 8.6 L20.9 9.4 L16.4 13.7 L17.5 19.8 L12 16.9 L6.5 19.8 L7.6 13.7 L3.1 9.4 L9.3 8.6 Z\"/></svg>\n```\n\n**i-bolt** · 速度/能量\n```html\n<svg width=\"44\" height=\"44\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#E2231A\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M13 2 L4 14 H11 L10 22 L20 9 H13 Z\"/></svg>\n```\n\n**i-eye** · 洞察/可见性\n```html\n<svg width=\"44\" height=\"44\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#E2231A\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M2.5 12 C5 7.5 8.5 5 12 5 C15.5 5 19 7.5 21.5 12 C19 16.5 15.5 19 12 19 C8.5 19 5 16.5 2.5 12 Z\"/><circle cx=\"12\" cy=\"12\" r=\"2.8\"/></svg>\n```\n\n**i-rocket** · 发布/加速/增长\n```html\n<svg width=\"44\" height=\"44\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#E2231A\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M4.5 16.5 c-1.5 1.26 -2 5 -2 5 s3.74 -0.5 5 -2 c0.71 -0.84 0.7 -2.13 -0.09 -2.91 a2.18 2.18 0 0 0 -2.91 -0.09 Z\"/><path d=\"M12 15 l-3 -3 a22 22 0 0 1 2 -3.95 A12.88 12.88 0 0 1 22 2 c0 2.72 -0.78 7.5 -6 11 a22.35 22.35 0 0 1 -4 2 Z\"/><path d=\"M9 12 H4 s0.55 -3.03 2 -4 c1.62 -1.08 5 0 5 0\"/><path d=\"M12 15 v5 s3.03 0.55 4 2 c1.08 1.62 0 5 0 5\"/></svg>\n```\n\n## 安全与状态\n\n**i-shield** · 安全/合规/保障\n```html\n<svg width=\"44\" height=\"44\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#E2231A\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M12 3 L19 6 V11 C19 15.5 15.7 18.8 12 20 C8.3 18.8 5 15.5 5 11 V6 Z\"/><polyline points=\"9 11.5 11.2 13.7 15.5 9.4\"/></svg>\n```\n\n**i-lock** · 安全/权限\n```html\n<svg width=\"44\" height=\"44\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#E2231A\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"6\" y=\"11\" width=\"12\" height=\"9\" rx=\"2\"/><path d=\"M9 11 V8 a3 3 0 0 1 6 0 v3\"/></svg>\n```\n\n**i-check** · 完成/达成/通过\n```html\n<svg width=\"44\" height=\"44\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#E2231A\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"9\"/><polyline points=\"8 12.5 11 15.5 16.5 9\"/></svg>\n```\n\n**i-x** · 排除/错误/不做\n```html\n<svg width=\"44\" height=\"44\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#E2231A\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"9\"/><line x1=\"9\" y1=\"9\" x2=\"15\" y2=\"15\"/><line x1=\"15\" y1=\"9\" x2=\"9\" y2=\"15\"/></svg>\n```\n\n**i-warning** · 风险/注意\n```html\n<svg width=\"44\" height=\"44\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#E2231A\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M10.3 4.1 L2.9 17.5 A2 2 0 0 0 4.6 20.5 H19.4 A2 2 0 0 0 21.1 17.5 L13.7 4.1 A2 2 0 0 0 10.3 4.1 Z\"/><line x1=\"12\" y1=\"9.5\" x2=\"12\" y2=\"14\"/><circle cx=\"12\" cy=\"17\" r=\"1\" fill=\"#E2231A\" stroke=\"none\"/></svg>\n```\n\n## 时间与计划\n\n**i-clock** · 时间/时效\n```html\n<svg width=\"44\" height=\"44\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#E2231A\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"9\"/><polyline points=\"12 7 12 12 15.5 14\"/></svg>\n```\n\n**i-calendar** · 计划/日程\n```html\n<svg width=\"44\" height=\"44\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#E2231A\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"4\" y=\"5\" width=\"16\" height=\"16\" rx=\"2\"/><line x1=\"4\" y1=\"10\" x2=\"20\" y2=\"10\"/><line x1=\"8\" y1=\"3\" x2=\"8\" y2=\"7\"/><line x1=\"16\" y1=\"3\" x2=\"16\" y2=\"7\"/></svg>\n```\n\n**i-bookmark** · 收藏/保留/重点\n```html\n<svg width=\"44\" height=\"44\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#E2231A\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M7 3 H17 V21 L12 16.5 L7 21 Z\"/></svg>\n```\n\n## 业务与资产\n\n**i-wallet** · 成本/支付/预算\n```html\n<svg width=\"44\" height=\"44\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#E2231A\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"3\" y=\"6\" width=\"18\" height=\"13\" rx=\"2\"/><line x1=\"3\" y1=\"10\" x2=\"21\" y2=\"10\"/><circle cx=\"16.5\" cy=\"14.5\" r=\"1.2\" fill=\"#E2231A\" stroke=\"none\"/></svg>\n```\n\n**i-doc** · 文档/报告\n```html\n<svg width=\"44\" height=\"44\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#E2231A\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M7 3 H14 L18 7 V21 H7 Z\"/><polyline points=\"14 3 14 7 18 7\"/><line x1=\"9.5\" y1=\"13\" x2=\"14.5\" y2=\"13\"/><line x1=\"9.5\" y1=\"16.5\" x2=\"14.5\" y2=\"16.5\"/></svg>\n```\n\n**i-mail** · 邮件/触达\n```html\n<svg width=\"44\" height=\"44\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#E2231A\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"3\" y=\"5\" width=\"18\" height=\"14\" rx=\"2\"/><polyline points=\"3.5 7 12 13 20.5 7\"/></svg>\n```\n\n**i-phone** · 电话/联络\n```html\n<svg width=\"44\" height=\"44\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#E2231A\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M22 16.92 v3 a2 2 0 0 1 -2.18 2 19.79 19.79 0 0 1 -8.63 -3.07 19.5 19.5 0 0 1 -6 -6 19.79 19.79 0 0 1 -3.07 -8.67 A2 2 0 0 1 4.11 2 h3 a2 2 0 0 1 2 1.72 c0.13 0.96 0.36 1.9 0.7 2.81 a2 2 0 0 1 -0.45 2.11 L8.09 9.91 a16 16 0 0 0 6 6 l1.27 -1.27 a2 2 0 0 1 2.11 -0.45 c0.91 0.34 1.85 0.57 2.81 0.7 A2 2 0 0 1 22 16.92 Z\"/></svg>\n```\n\n**i-home** · 首页/门户/总部\n```html\n<svg width=\"44\" height=\"44\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#E2231A\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M3 11 L12 3 L21 11\"/><path d=\"M6 9.5 V21 H18 V9.5\"/><polyline points=\"10 21 10 15 14 15 14 21\"/></svg>\n```\n\n**i-globe** · 全球化/市场\n```html\n<svg width=\"44\" height=\"44\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#E2231A\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"9\"/><ellipse cx=\"12\" cy=\"12\" rx=\"4\" ry=\"9\"/><line x1=\"3\" y1=\"12\" x2=\"21\" y2=\"12\"/></svg>\n```\n\n**i-gift** · 福利/权益\n```html\n<svg width=\"44\" height=\"44\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#E2231A\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"3\" y=\"8\" width=\"18\" height=\"4\" rx=\"1\"/><path d=\"M12 8 v13\"/><path d=\"M19 12 v7 a2 2 0 0 1 -2 2 H7 a2 2 0 0 1 -2 -2 v-7\"/><path d=\"M7.5 8 a2.5 2.5 0 0 1 0 -5 C11 3 12 8 12 8\"/><path d=\"M16.5 8 a2.5 2.5 0 0 0 0 -5 C13 3 12 8 12 8\"/></svg>\n```\n\n**i-heart** · 喜爱/口碑\n```html\n<svg width=\"44\" height=\"44\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#E2231A\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M12 20.5 C6 16 3 12.8 3 9.3 C3 6.4 5.2 4.5 7.7 4.5 C9.5 4.5 11.1 5.5 12 7 C12.9 5.5 14.5 4.5 16.3 4.5 C18.8 4.5 21 6.4 21 9.3 C21 12.8 18 16 12 20.5 Z\"/></svg>\n```\n\n**i-play** · 播放/演示\n```html\n<svg width=\"44\" height=\"44\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#E2231A\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"9\"/><polygon points=\"10 8.5 16.5 12 10 15.5\" fill=\"#E2231A\" stroke=\"none\"/></svg>\n```\n\n---\n\n## 组合惯例\n\n- **图标+标题同行**:`<div style=\"display:flex;align-items:center;gap:20px;\">svg + 标题div</div>`(原型 23/30 骨架自带)\n- **特征行小图标**(20-22px):`display:flex;align-items:center;gap:14px;`(原型 29 骨架自带)\n- **改色**:全文替换该 svg 行内的 `#E2231A` → 目标 hex;深底卡上用 `#FFFFFF` 或浅主色\n- **改尺寸**:等比改 `width/height`(viewBox 不动);常用 20/36/44/48\n\nArchive v2.0.0: 180 files, 520999 bytes\n\nFiles: assets/deck-brief.template.md (4270b), assets/deck-insights.template.md (3411b), assets/icons.md (16400b), assets/playlist.template.json (277b), assets/presets/brand-airbnb.css (3477b), assets/presets/brand-apple.css (3600b), assets/presets/brand-claude.css (3570b), assets/presets/brand-ferrari.css (3502b), assets/presets/brand-figma.css (3509b), assets/presets/brand-linear.css (3623b), assets/presets/brand-notion.css (3613b), assets/presets/brand-nvidia.css (3463b), assets/presets/brand-spotify.css (3437b), assets/presets/brand-stripe.css (3490b), assets/presets/brand-vercel.css (3350b), assets/presets/business-blue.css (3105b), assets/presets/forest-green.css (3151b), assets/presets/graphite-mono.css (3204b), assets/presets/lenovo-default.css (3979b), assets/presets/warm-orange.css (3183b), assets/slide-template-flex.html (6040b), assets/slide-template-layout.html (5928b), assets/slide-template.html (4183b), assets/slides.config.template.json (261b), assets/snippets/agenda-list.html (1384b), assets/snippets/badge-center.html (1251b), assets/snippets/big-statement.html (1413b), assets/snippets/card-accent-top.html (2711b), assets/snippets/chevron-band.html (4715b), assets/snippets/code-block.html (2375b), assets/snippets/color-band.html (2034b), assets/snippets/compare-card.html (1458b), assets/snippets/cycle-loop.html (3676b), assets/snippets/data-table.html (2644b), assets/snippets/editorial-columns.html (1305b), assets/snippets/flow-step.html (1165b), assets/snippets/funnel-stack.html (4784b), assets/snippets/gradient-bar.html (1518b), assets/snippets/hero-gradient.html (2348b), assets/snippets/hub-spoke.html (4174b), assets/snippets/icon-grid-cell.html (1843b), assets/snippets/image-bleed.html (1825b), assets/snippets/INDEX.md (5880b), assets/snippets/kpi-card.html (2174b), assets/snippets/layer-row.html (1703b), assets/snippets/page-header.html (2146b), assets/snippets/pyramid-tiers.html (2533b), assets/snippets/quote-block.html (1619b), assets/snippets/quote-hero.html (1491b), assets/snippets/section-divider.html (1569b), assets/snippets/stat-number.html (1023b), assets/snippets/timeline-node.html (1929b), assets/snippets/vs-cards.html (2888b), assets/theme.css (4772b), reference/behavior-baseline.md (28896b), reference/brand-styles.md (16601b), reference/content-deepening.md (14340b), reference/creative-layouts.md (24558b), reference/density-tiers.md (4110b), reference/design-principles.md (17547b), reference/html-spec.md (24052b), reference/interview-guide.md (18472b), reference/layout-recipes.md (8528b), reference/narrative-skeletons.md (8276b), reference/page-archetypes.md (62993b), reference/theme-presets.md (3774b), scripts/config/default.config.js (9428b), scripts/config/merge.js (2073b), scripts/convert.js (1669b), scripts/core/browser.js (1171b), scripts/core/capture-pass.js (3674b), scripts/core/inject.js (2253b), scripts/core/pipeline.js (11313b), scripts/core/post-process.js (5579b), scripts/extract/context.js (7930b), scripts/extract/index.js (1842b), scripts/extract/primitives/border-strips.js (2302b), scripts/extract/primitives/capture.js (647b), scripts/extract/primitives/chart.js (870b), scripts/extract/primitives/gradient.js (6408b)\n\nFile v2.0.0:SKILL.md\n\n---\nname: html-slides-to-pptx\ndescription: >-\n  编写可无损还原为 PPTX 的 HTML 幻灯片。先经引导式访谈确认样式/形式/结构并落盘\n  deck-brief,再生成完整目录结构(assets/theme.css、slides/*.html、playlist.json),\n  每页严格遵循 html-spec.md 规范,经 validate.js 预检零 ERROR 后用 convert.js 转成\n  PowerPoint。TRIGGER when: 用户要求\"做PPT/幻灯片/slides/演示文稿\"、\"把内容做成\n  HTML幻灯片\"、\"生成可转PPTX的slides\",或调用 /html-slides-to-pptx。DO NOT TRIGGER when:\n  只需单页HTML网页、或要做的是 reveal.js/Marp 等其他幻灯片格式。\nversion: 2.0.0\nmetadata:\n  openclaw:\n    requires:\n      bins:\n        - node\n        - npm\n---\n\n# html-slides · 可无损转 PPTX 的 HTML 幻灯片生成器(引导式访谈版)\n\n## 核心原则\n\n转换器(`scripts/convert.js` + 浏览器端提取管线)只**无损支持 HTML/CSS 的一个子集**。\n每页 HTML 必须严格遵循 `reference/html-spec.md` —— 这是契约,不是建议。\n写页面之前必须先完成 Step 1 访谈并让用户确认 `slides/deck-brief.md`。\n\n## 首次使用:检查工具依赖\n\n> 以下命令中的 `SKILL_DIR` 指本技能的根目录(即 SKILL.md 所在目录)。\n> 技能加载时系统会显示 \"Base directory for this skill: <路径>\",用该路径替换 `SKILL_DIR`。\n\n```bash\nSKILL_DIR=\"<技能根目录,即 Base directory>\"\nls \"$SKILL_DIR/scripts/node_modules/playwright\" >/dev/null 2>&1 \\\n  && echo OK || (cd \"$SKILL_DIR/scripts\" && npm install && npx playwright install chromium)\n```\n若输出 OK 则跳过安装;否则等待安装完成再继续。\n\n## 工作流程(按顺序执行)\n\n### Step 1 · 引导式访谈 → 需求确认卡\n\n**读 `reference/interview-guide.md` 并严格执行**:5 阶段(定位→结构→视觉→版式→输出)+ 收尾确认卡,\n共 **16 问 + 1 个大纲确认环节**,每问有默认值与智能跳过规则。配套查询:\n- 叙事骨架:`reference/narrative-skeletons.md`(脚手架非模具;用户可选\"自由结构\")\n- 色板预设:`reference/theme-presets.md`(5 套预设 + 自定义 hex 推导)\n- 信息密度:`reference/density-tiers.md`(演讲/混合/阅读 三档参数)\n- **内容深化:`reference/content-deepening.md`**(**素材形态 × 深度档**二维矩阵定做什么:\n  四步追问审素材 → 多角色 → 委员会审大纲;裸主题改出**假设清单**不做追问;\n  所有档位都跑**大纲级形式门禁**;大纲 v2 才进 Q5 确认)\n\n**Step 1 执行顺序**:①读 interview-guide 的**推断总表**,从用户首句匹配 deck 族 → 一次定全轴推荐值\n②按**依赖图**决定哪些问可跳 ③选路径(快通道 2-3 轮 / 标准 4-6 轮 / 深度 + 深化层)\n④逐阶段抛问,置首项说明理由 ⑤深化层按矩阵执行 ⑥Q5 确认大纲 v2。\n**任何路径都不跳 Q6 色板 与 Q5 大纲确认**(返工最贵的两个决定)。\n\n访谈收尾:按 `assets/deck-brief.template.md` 生成确认卡展示给用户,\n**用户确认后落盘 `slides/deck-brief.md`** —— 此后它是唯一执行事实源;\n后续\"改第 N 页/换色板\"类迭代直接读它,不重访谈。\n\n### Step 2 · 搭目录结构\n在当前工作目录生成:\n```\nassets/theme.css          # 按 brief 色板:复制 assets/presets/<选定预设>.css(自定义色则按推导值生成)\nslides/NN-slug.html       # 每页一个文件,两位数字前缀排序\nslides/playlist.json      # 从 assets/playlist.template.json 实例化,playlist 按顺序列全页面\nslides/deck-brief.md      # Step 1 落盘的需求确认卡\nslides/deck-insights.md   # 深化层详档(非快速档才有;模板 assets/deck-insights.template.md)\nslides/slides.config.json # 从 assets/slides.config.template.json 实例化(键见 scripts/config/default.config.js)\n```\n目录已存在时,保留用户已有文件,只补缺失项。\n\n**slides.config.json 按 brief 填**(实例化 `assets/slides.config.template.json`):\n```json\n{\n  \"design\": {\n    \"tier\": \"presentation | mixed | reading\",\n    \"minBodyPx\": 14,\n    \"fillThreshold\": 0.85,\n    \"airyPages\": [\"01-cover.html\", \"05-statement.html\"],\n    \"formProfile\": \"balanced\",\n    \"hedgePages\": [\"07-forecast.html\"]\n  }\n}\n```\n- 设计检查**默认就是开着的**(缺省 `presentation` + `balanced`);本文件的作用是按 brief\n  **校准**档位与豁免页,不是\"开启开关\"。整份文件缺失时按默认档跑,不会静默放行。\n- `design.tier` 由 brief 使用场景映射(演讲→presentation/混合→mixed/阅读→reading);\n  决定字号下限与单页信息量上限(见 `reference/density-tiers.md`)\n- `design.formProfile` 由 brief 视觉形式偏好映射(克制型→text/平衡型→balanced/丰富型→rich);\n  决定 deck 级形式检查口径(纯文字页占比/同形式连排,见 design-principles 第五章)\n- `airyPages` 填 brief 中的 airy 页文件名(封面/分隔/大字观点/引用/收尾)——\n  **这是唯一豁免填充检查的途径**,漏填会让这些页因\"底部留白\"被报 WARN\n- `hedgePages`(2026-08-06 第六轮)填 `deck-insights.md` 里**降级论断**所在页 →\n  validate 会检查这些页确实出现限定词(我们认为/有待验证/预估…),缺失报 WARN。\n  作用是把\"降级为观点\"从措辞变成可审计约束;**不判断内容真伪**(真伪归 Q5 用户判断)\n- 其余常用键:`applyFontMap`(brief 演示机字体决定)、`nativeGradient`(原生渐变)、`master`(页码页脚)\n\n### Step 3 · 逐页写 HTML\n1. **按 brief 的骨架页序与密度参数写**(要点数/行数/字号/填充率是硬约束;超标:演讲/混合档拆页,阅读档精简措辞)\n2. **写页前只需读两份契约**:`reference/design-principles.md`(设计)+ `reference/html-spec.md`(转换)。\n   其余文档**用到才查**,不要通读(读取分层见文末\"文件清单\")。\n   逐页流程:**先定形式**(brief 大纲表\"形式\"列:文字/图示/图表/图片/混合)\n   → **再选原型**(查 `reference/page-archetypes.md` 的索引跳到目标原型,别通读 1000+ 行)\n   → **起手用现成件**:`assets/snippets/INDEX.md` 找片段,或 `assets/slide-template{,-flex,-layout}.html` 三套样板页(方式 A/B/C)\n   → 容器内部写法查 `reference/layout-recipes.md`;要图标查 `assets/icons.md`(stroke 显式 hex,**禁 currentColor**)\n2.5 **P2 高级特性**(按需使用,详见 html-spec.md §5;**用法克制,以 design-principles 为准**):\n   - `data-shape=\"chevron|star5|rightArrow|...\"` → 80+ 预设几何(流程图/箭头/星形)\n   - `data-chart='{\"type\":\"bar\",...}'` → 原生可编辑图表(bar/line/area/pie)\n   - `<img data-object=\"true\">` → 原生可编辑图片(object-fit 映射;图片政策见 brief)\n   - `<video poster src>` / `<audio src>` → 原生音视频嵌入\n   - 转场/母版:由 playlist.json / slides.config.json 配置,非页面内属性\n3. **布局选择**:骨架(页标题/页码)用方式 A;成组内容(条目/分栏/数字带)优先方式 C 或 B(brief 另有指定时从其指定)\n4. **不改结构规则**:\n   - 画布 `1920x1080`,`.slide-container` relative + overflow hidden\n   - 每个可见元素可归结到 `data-object=\"true\"`;嵌套标记 = ERROR\n   - 多行文字显式 `line-height`;字重只用 400/600/700/800/900\n   - 文字纯色(半透明先预算混合色);装饰预算每页 ≤3 件;默认左对齐\n   - **每个内容页至少一块结构色面**(色带/深色面板/卡片底/表头底纹,≥1.5 万 px²)——\n     纯白底+黑字+细线是\"素雅单调\"的根源,validate 在 balanced/rich 档会报 WARN\n   - **正文默认 24-28px**(演讲档),22px 是破档红线而非默认值;深色底上的文字**必须**用\n     `--on-navy-text`/`--on-navy-sub`,否则回退近黑压深底、PPTX 里不可见(H13)\n   - 纯 `transform:rotate()` 已支持(scale/skew/translate 仍禁);方式 C 子级禁写 position/left/top/width/height\n5. 备注按 brief 的备注策略写 `<template data-slide-notes>`\n\n### Step 3.5 · 视觉自查(写完页先过自己这关)\n```bash\nnode \"$SKILL_DIR/scripts/preview.js\" slides/\n```\n把每页截成 PNG(slides/.preview/),**逐张看图**,按六条自查:\n1. **填充率**:内容带是否撑满 320-940?判据不是\"底边够低\"而是**墨迹铺开** ——\n   有没有 ≥200px 的连续空白断层?内容是否一头沉?底部一根细线 + 脚注**不算**撑满。\n   不达标 → 回 Step 3 按 scale-to-fill 放大字号/行距/间距\n2. **字号**:正文是否明显偏小?演讲档正文默认 **24-28px**(22px 是破档红线,不是默认值);\n   页标题/正文比值 <1.6 或全页字号只有两档 → 层级不足,按字号阶拉开\n3. **对齐**:卡片/条目边缘是否齐;间距是否一致 → 修正坐标或改方式 B/C\n4. **去 AI 味**:对照 brief 的约束清单(kicker/结论条/渐变条是否超编;装饰 ≤3 件;高亮 ≤1 处)\n5. **视觉形式**(2026-08-05 起):这页除了文字还有什么?答案为\"只有细线\"→ 记入纯文字页;全 deck 纯文字内容页占比/同形式连排是否超 brief 的形式偏好档 → 超则换图示原型(23-30),不换内容\n6. **结构色面**(2026-08-06 起):这页是不是纯白底 + 黑字 + 细线?内容页至少要有**一块结构色面**\n   (色带/深色面板/卡片底/表头底纹)。深色底上的文字有没有用 `--on-navy-*`?\n   用错会在 PPTX 里近黑压深底、整块消失(H13)\n7. **限定词**(2026-08-06 第六轮起,有深化层时):对照 `deck-insights.md` 的洞察清单 ——\n   本页有没有\"反向验证=降级\"的论断?有则必须带限定词(我们认为/有待验证/预估…),\n   并确认该页已在 `slides.config.json` 的 `hedgePages` 里。**把假设写成结论是 AI PPT 最典型的病**\n发现问题**就地修复并重截**,直到七关全过,再进 Step 4。\n\n### Step 4 · 预检(必须零 ERROR)\n```bash\nnode \"$SKILL_DIR/scripts/validate.js\" slides/\n```\n- ❌ ERROR → 必须修复后重跑,直到 0 ERROR\n- ⚠️ WARN → 逐条判断是否可接受(见 html-spec.md 速查表),可接受就在汇报中说明\n- 设计 WARN(文字适配/字号下限/画布填充/对齐,由 slides.config.json 的 design 键启用)→ 优先按 scale-to-fill 修复,这正是视觉质量的自动守门员\n\n### Step 5 · 转换\n```bash\nnode \"$SKILL_DIR/scripts/convert.js\" ./slides ./slides/playlist.json output.pptx\n```\n\n### Step 6 · 汇报\n告知用户:PPTX 路径、页数、validate 结果(残留 WARN 及理由)、备注写入情况、deck-brief.md 位置。\n如用户装了 PowerPoint,可提示可直接打开 output.pptx 检查。\n\n## 转换机制简述(排查问题时读)\n\n- 管线:加载页面 → 等字体就绪+稳定 → 注入提取脚本 → data-layout 解析 → 提取基元 → 截图 pass → pptxgenjs 渲染\n- **原生可编辑**(PPT 中可修改):文字/纯色形状/图片/表格/图表/列表/上下标/字距/渐变(opt-in)/预设几何/旋转/虚线边框\n- **截图贴回**(不可编辑):渐变(默认)/background-image/SVG/视觉特效/mix-blend-mode/clip-path(2x DPI,截图前隐藏文字避免重影)\n- 文字 run 级样式:斜体/下划线/删除线/超链接/text-transform 原生还原;`<sup>`/`<sub>` 原生上下标\n- 配置:`config/default.config.js` 是唯一事实源;项目级 `slides/slides.config.json` 覆盖(如 `{\"nativeGradient\":true}` 开启原生渐变;`{\"master\":{\"pageNumbers\":true}}` 开启页码;`{\"incrementalCache\":false}` 关闭增量缓存)\n- 转场:playlist 项 `{\"file\":\"01.html\",\"transition\":\"fade\"}` → p:transition(fade/push/wipe/cover/split)\n- 音视频:`<video poster src>` / `<audio src>` → addMedia 原生嵌入\n- 增量缓存:HTML 未变时跳过提取/截图(11x 提速);缓存目录 slides/.cache/\n- 叠放 = DOM 深度优先顺序;z-index 只影响浏览器合成\n- `<template data-slide-notes>` → 写入该页备注\n- 特性速查:`reference/creative-layouts.md` 查渐变/几何/图表等写法(含使用限制);页面形态以 page-archetypes.md 为准\n- 回归:`node \"$SKILL_DIR/scripts/test/golden.js\" verify` 三层等价(L1 提取+L2 XML+L3 截图);行为契约见 `reference/behavior-baseline.md`\n\n## 文件清单\n\n> **2026-08-06 第五轮 P4 重组**:此前 12 份 reference 平铺,\"必读\"散在各处措辞里,\n> 写第一页前要读 13 份文档 + 8 类资产(合计 3700+ 行)—— 实测后果是规范写了不被执行\n> (`--text-*` 令牌零引用、正文长期钉在破档线 22px,四轮无人发现)。\n> 现按**读取时机**分三层:主干必读只有 3 份,其余按需查。\n\n### 第一层 · 主干必读(只有这三份,合计约 720 行)\n\n| 文件 | 何时读 | 作用 |\n|---|---|---|\n| `reference/interview-guide.md` | **Step 1 之前** | 5 阶段 16 问 + 1 确认的访谈脚本(含推断总表与依赖图) |\n| `reference/design-principles.md` | **写第一页之前** | 设计契约:版面分区/字号阶/满填四判据/12 反模式/结构色面下限/**版面达标≠内容达标** |\n| `reference/html-spec.md` | **写第一页之前** | 转换契约:什么写法能无损还原 |\n\n这三份决定输出质量的下限。**其余任何一份都不该在写页前通读。**\n\n### 第二层 · 按需查阅(用到才读,查完即走)\n\n| 文件 | 什么时候需要 |\n|---|---|\n| `reference/page-archetypes.md` | 选页面形态时 —— **查索引直接跳到目标原型,别通读**(1000+ 行) |\n| `reference/density-tiers.md` | 定档位参数、算填充率与要点数上限 |\n| `reference/layout-recipes.md` | 写方式 B/C 的容器骨架 |\n| `reference/creative-layouts.md` | 用渐变/几何/图表/旋转等特性,查写法与限制 |\n| `reference/content-deepening.md` | 需要四步追问/多角色/委员会(素材×深度矩阵定做什么) |\n| `reference/narrative-skeletons.md` | 定全篇叙事结构 |\n| `reference/theme-presets.md` / `brand-styles.md` | 选色板或蒸馏品牌风 |\n| `assets/icons.md` | 要图标时复制(stroke 显式 hex,**禁 currentColor**) |\n| `assets/snippets/INDEX.md` | 找现成片段(28 个,含参数表与使用限制) |\n\n### 第三层 · 改代码才读\n\n| 文件 | 场景 |\n|---|---|\n| `reference/behavior-baseline.md` | **改转换管线前必读**(怪癖 H1-H14) |\n| `scripts/test/FEATURE-COVERAGE.md` | 增删转换特性或夹具页(硬约束) |\n| `CLAUDE.md` | 管线架构、回归纪律、单一事实源规则 |\n\n### 资产与脚本\n\n- `assets/theme.css` — 默认色板+版面变量;`assets/presets/` — 16 套色板预设\n- `assets/deck-brief.template.md` — 需求确认卡模板;`assets/slides.config.template.json` — 项目配置模板\n- `assets/deck-insights.template.md` — 深化层详档模板(洞察/假设/委员会意见与裁决/形式门禁/行动方案)\n- `assets/slide-template{,-flex,-layout}.html` — 三套样板页(方式 A/B/C)\n- `assets/playlist.template.json` — playlist 模板\n- `scripts/validate.js` — 预检器(ERROR/WARN 分级;设计检查缺省开启)\n- `scripts/preview.js` — 视觉自查截图(Step 3.5)\n- `scripts/convert.js` — 转换 CLI\n- `scripts/test/` — golden 回归 + 样张门禁 + 阈值守卫 + 生成侧回归\n\nFile v2.0.0:_meta.json\n\n{\n  \"ownerId\": \"kn7af33xbszyq32pce2pa6f84n8bdfqy\",\n  \"slug\": \"html-slides-to-pptx\",\n  \"version\": \"2.0.0\",\n  \"publishedAt\": 1786008055299\n}\n\nFile v2.0.0:scripts/package-lock.json\n\n{\n  \"name\": \"html-slides-tools\",\n  \"version\": \"1.0.0\",\n  \"lockfileVersion\": 3,\n  \"requires\": true,\n  \"packages\": {\n    \"\": {\n      \"name\": \"html-slides-tools\",\n      \"version\": \"1.0.0\",\n      \"dependencies\": {\n        \"playwright\": \"^1.61.1\",\n        \"pptxgenjs\": \"^4.0.1\"\n      }\n    },\n    \"node_modules/@types/node\": {\n      \"version\": \"22.20.1\",\n      \"resolved\": \"https://registry.npmmirror.com/@types/node/-/node-22.20.1.tgz\",\n      \"integrity\": \"sha512-EANqOCF9QFyra+4pfxUcX9STKJpCLjMbObVzljIJomAWSnuSIEAvyzEU53GaajbXJEgdh0iEcPL+DGvpUd4k1Q==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"undici-types\": \"~6.21.0\"\n      }\n    },\n    \"node_modules/core-util-is\": {\n      \"version\": \"1.0.3\",\n      \"resolved\": \"https://registry.npmmirror.com/core-util-is/-/core-util-is-1.0.3.tgz\",\n      \"integrity\": \"sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/fsevents\": {\n      \"version\": \"2.3.2\",\n      \"resolved\": \"https://registry.npmmirror.com/fsevents/-/fsevents-2.3.2.tgz\",\n      \"integrity\": \"sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==\",\n      \"hasInstallScript\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"darwin\"\n      ],\n      \"engines\": {\n        \"node\": \"^8.16.0 || ^10.6.0 || >=11.0.0\"\n      }\n    },\n    \"node_modules/https\": {\n      \"version\": \"1.0.0\",\n      \"resolved\": \"https://registry.npmmirror.com/https/-/https-1.0.0.tgz\",\n      \"integrity\": \"sha512-4EC57ddXrkaF0x83Oj8sM6SLQHAWXw90Skqu2M4AEWENZ3F02dFJE/GARA8igO79tcgYqGrD7ae4f5L3um2lgg==\",\n      \"license\": \"ISC\"\n    },\n    \"node_modules/image-size\": {\n      \"version\": \"1.2.1\",\n      \"resolved\": \"https://registry.npmmirror.com/image-size/-/image-size-1.2.1.tgz\",\n      \"integrity\": \"sha512-rH+46sQJ2dlwfjfhCyNx5thzrv+dtmBIhPHk0zgRUukHzZ/kRueTJXoYYsclBaKcSMBWuGbOFXtioLpzTb5euw==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"queue\": \"6.0.2\"\n      },\n      \"bin\": {\n        \"image-size\": \"bin/image-size.js\"\n      },\n      \"engines\": {\n        \"node\": \">=16.x\"\n      }\n    },\n    \"node_modules/immediate\": {\n      \"version\": \"3.0.6\",\n      \"resolved\": \"https://registry.npmmirror.com/immediate/-/immediate-3.0.6.tgz\",\n      \"integrity\": \"sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/inherits\": {\n      \"version\": \"2.0.4\",\n      \"resolved\": \"https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz\",\n      \"integrity\": \"sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==\",\n      \"license\": \"ISC\"\n    },\n    \"node_modules/isarray\": {\n      \"version\": \"1.0.0\",\n      \"resolved\": \"https://registry.npmmirror.com/isarray/-/isarray-1.0.0.tgz\",\n      \"integrity\": \"sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/jszip\": {\n      \"version\": \"3.10.1\",\n      \"resolved\": \"https://registry.npmmirror.com/jszip/-/jszip-3.10.1.tgz\",\n      \"integrity\": \"sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==\",\n      \"license\": \"(MIT OR GPL-3.0-or-later)\",\n      \"dependencies\": {\n        \"lie\": \"~3.3.0\",\n        \"pako\": \"~1.0.2\",\n        \"readable-stream\": \"~2.3.6\",\n        \"setimmediate\": \"^1.0.5\"\n      }\n    },\n    \"node_modules/lie\": {\n      \"version\": \"3.3.0\",\n      \"resolved\": \"https://registry.npmmirror.com/lie/-/lie-3.3.0.tgz\",\n      \"integrity\": \"sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"immediate\": \"~3.0.5\"\n      }\n    },\n    \"node_modules/pako\": {\n      \"version\": \"1.0.11\",\n      \"resolved\": \"https://registry.npmmirror.com/pako/-/pako-1.0.11.tgz\",\n      \"integrity\": \"sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==\",\n      \"license\": \"(MIT AND Zlib)\"\n    },\n    \"node_modules/playwright\": {\n      \"version\": \"1.61.1\",\n      \"resolved\": \"https://registry.npmmirror.com/playwright/-/playwright-1.61.1.tgz\",\n      \"integrity\": \"sha512-DWnY5o3YbLWK4GovuAVwpqL+1VwGNdUGrRr++8j8PtQQzvAVZUIMjKQ90fY689sEJZJBbZVw1rXaOKSTitkzPQ==\",\n      \"license\": \"Apache-2.0\",\n      \"dependencies\": {\n        \"playwright-core\": \"1.61.1\"\n      },\n      \"bin\": {\n        \"playwright\": \"cli.js\"\n      },\n      \"engines\": {\n        \"node\": \">=18\"\n      },\n      \"optionalDependencies\": {\n        \"fsevents\": \"2.3.2\"\n      }\n    },\n    \"node_modules/playwright-core\": {\n      \"version\": \"1.61.1\",\n      \"resolved\": \"https://registry.npmmirror.com/playwright-core/-/playwright-core-1.61.1.tgz\",\n      \"integrity\": \"sha512-h7Qlt6m4REp25qvIdvbDtVmD4LqVXfpRxhORv9L0jzETM05p4fuPJ3dKyuSXQxDSbXnmS79HAgi9589lGSpLkg==\",\n      \"license\": \"Apache-2.0\",\n      \"bin\": {\n        \"playwright-core\": \"cli.js\"\n      },\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/pptxgenjs\": {\n      \"version\": \"4.0.1\",\n      \"resolved\": \"https://registry.npmmirror.com/pptxgenjs/-/pptxgenjs-4.0.1.tgz\",\n      \"integrity\": \"sha512-TeJISr8wouAuXw4C1F/mC33xbZs/FuEG6nH9FG1Zj+nuPcGMP5YRHl6X+j3HSUnS1f3at6k75ZZXPMZlA5Lj9A==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@types/node\": \"^22.8.1\",\n        \"https\": \"^1.0.0\",\n        \"image-size\": \"^1.2.1\",\n        \"jszip\": \"^3.10.1\"\n      }\n    },\n    \"node_modules/process-nextick-args\": {\n      \"version\": \"2.0.1\",\n      \"resolved\": \"https://registry.npmmirror.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz\",\n      \"integrity\": \"sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/queue\": {\n      \"version\": \"6.0.2\",\n      \"resolved\": \"https://registry.npmmirror.com/queue/-/queue-6.0.2.tgz\",\n      \"integrity\": \"sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"inherits\": \"~2.0.3\"\n      }\n    },\n    \"node_modules/readable-stream\": {\n      \"version\": \"2.3.8\",\n      \"resolved\": \"https://registry.npmmirror.com/readable-stream/-/readable-stream-2.3.8.tgz\",\n      \"integrity\": \"sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"core-util-is\": \"~1.0.0\",\n        \"inherits\": \"~2.0.3\",\n        \"isarray\": \"~1.0.0\",\n        \"process-nextick-args\": \"~2.0.0\",\n        \"safe-buffer\": \"~5.1.1\",\n        \"string_decoder\": \"~1.1.1\",\n        \"util-deprecate\": \"~1.0.1\"\n      }\n    },\n    \"node_modules/safe-buffer\": {\n      \"version\": \"5.1.2\",\n      \"resolved\": \"https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.1.2.tgz\",\n      \"integrity\": \"sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/setimmediate\": {\n      \"version\": \"1.0.5\",\n      \"resolved\": \"https://registry.npmmirror.com/setimmediate/-/setimmediate-1.0.5.tgz\",\n      \"integrity\": \"sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/string_decoder\": {\n      \"version\": \"1.1.1\",\n      \"resolved\": \"https://registry.npmmirror.com/string_decoder/-/string_decoder-1.1.1.tgz\",\n      \"integrity\": \"sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"safe-buffer\": \"~5.1.0\"\n      }\n    },\n    \"node_modules/undici-types\": {\n      \"version\": \"6.21.0\",\n      \"resolved\": \"https://registry.npmmirror.com/undici-types/-/undici-types-6.21.0.tgz\",\n      \"integrity\": \"sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/util-deprecate\": {\n      \"version\": \"1.0.2\",\n      \"resolved\": \"https://registry.npmmirror.com/util-deprecate/-/util-deprecate-1.0.2.tgz\",\n      \"integrity\": \"sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==\",\n      \"license\": \"MIT\"\n    }\n  }\n}\n\nFile v2.0.0:scripts/package.json\n\n{\n  \"name\": \"html-slides-tools\",\n  \"version\": \"2.0.0\",\n  \"description\": \"HTML slides -> PPTX converter + validator (bundled with the html-slides skill)\",\n  \"private\": true,\n  \"type\": \"commonjs\",\n  \"scripts\": {\n    \"test\": \"node test/golden.js verify\",\n    \"test:update\": \"node test/golden.js update\",\n    \"test:design\": \"node test/exemplar-checks.js && node test/threshold-parity.js && node test/generation-checks.js && node test/anchor-integrity.js\",\n    \"test:thresholds\": \"node test/threshold-parity.js\",\n    \"test:generation\": \"node test/generation-checks.js\",\n    \"test:anchors\": \"node test/anchor-integrity.js\",\n    \"validate\": \"node validate.js\",\n    \"convert\": \"node convert.js\"\n  },\n  \"dependencies\": {\n    \"playwright\": \"^1.61.1\",\n    \"pptxgenjs\": \"^4.0.1\"\n  }\n}\n\nFile v2.0.0:scripts/test/FEATURE-COVERAGE.md\n\n# 特性覆盖矩阵(FEATURE-COVERAGE)\n\n> golden fixtures 的\"特性 → 锚定页\"台账(2026-08-02 Phase G 建立)。\n> **登记规则(硬约束)**:\n> 1. 新增转换器特性(基元/样式/元素/配置)时,必须指定锚定页并更新本表;无锚定页的特性不得合并。\n> 2. 删除夹具页前,先查本表确认它不是某特性的唯一锚点。\n> 3. 样张页(96-107、110-117)同时受 `test/exemplar-checks.js` 设计门禁(0 ERROR/0 WARN)。\n> 4. **2026-08-06 第五轮 P5**:本表的锚点关系已由 `test/anchor-integrity.js` 变成**可执行断言**\n>    —— 改样张设计时若换掉了承载特性的元素,守卫会失败(唯一锚点失效 = 致命)。\n>    新增/换锚时**同步改该守卫的 ANCHORS 表**,否则台账与守卫脱节(守卫自身会警告)。\n\n### 样张双角色的已知张力(2026-08-06 定型)\n\n样张页身兼\"设计范本 + 转换锚点\"两职。曾考虑让样张退出 L2/L3 基线以解耦,**经查证不可行**:\n`99-archetype-chart` 是 `data-chart:line` 的唯一锚点,`107-dashboard` 是 pie/doughnut/area 的唯一锚点,\n`112-funnel` 是 `data-shape=\"trapezoid\"` 的唯一锚点 —— 退出即等于删除这些特性的转换覆盖。\n\n实测澄清了成本结构:这 9 页**本来就不在 L3**(2026-08-05 瘦身:L3 只截含 capture 基元的页),\n所以改设计的成本只有 L1+L2 重建,而那是\"输出确实变了\"的证据,不是冗余开销。\n真正的风险不是重建成本,而是**改设计会静默摧毁转换覆盖**:实测把 99 页的 `data-chart` 换成纯文本后,\n样张门禁 ✅、生成侧回归 ✅,只有 golden 报 diff —— 而\"我重排了这页\"的 diff 复核里重建基线是自然动作。\n故结论:**保留双角色,用 `anchor-integrity.js` 守住锚点**,而不是拆分角色。\n> 页面角色:fidelity 锚(01-21 精简页/游离页/特性页)= 转换保真;exemplar 样张(96-107、110-117)= 保真+设计纪律双锚。\n> 2026-08-05 第三轮重构(布局丰富度):零管线改动;新增样张 110-117 锚定组 6 图示原型(23-30)与内联 SVG 图标。\n\n## 一、文字类\n\n| 特性 | 锚定页 | 备注 |\n|---|---|---|\n| 斜体 `<i>/<em>` | 90-p0-features、49-four-layer、chip-market-share | 49-four/chip 是历史缺陷修复锚 |\n| 下划线 / 删除线 / 超链接 | 90-p0-features | run 级 |\n| run 级字体 fontFace | 90-p0-features、96-107(`.num`) | `.num` Inter 混排是真实场景锚 |\n| text-transform | 90-p0-features | uppercase/lowercase |\n| 上下标 `<sup>/<sub>` | 93-p2-sup-sub-geo | baseline 30000/-40000 |\n| run 级字距 charSpacing | 93-p2-sup-sub-geo | 与 box 级独立 |\n| 原生列表 `<ul>/<ol>` bullet | 91-p1-forms、01-cockpit 压测(临时) | LI 直接含文字挂 bullet;**2026-08-05 H11 修复**:旧写法 type+characterCode 永不产 buChar;现 UL 无 type、OL 用 style |\n| pre/code 空白保留 | 91-p1-forms | white-space:pre |\n| 竖排 writing-mode | 49-four-layer | 实验性 eaVert(基线 WARN) |\n| 混合字号行 | 98-statband、107-dashboard | 大数字+单位,行高按最大 run |\n| 500 字重退化 WARN | advice-for-newcomers、ai-trends-2026、four-revolutions | validate 基线锚 |\n\n## 二、形状/装饰类\n\n| 特性 | 锚定页 | 备注 |\n|---|---|---|\n| 纯色形状 / 圆角 / 正圆 | 全体 | 基础 |\n| 统一边框 | 02 等 | px→pt(0.5 倍) |\n| 非统一边框逐边细条 | 02、12 | 圆角共存 WARN 锚 |\n| 虚线/点线 dashType | 90-p0-features | dashed→dash,dotted→sysDot |\n| box-shadow 真实参数 | 07-journey-map、data-limit-boundary、90 | 历史缺陷修复锚(行为红线) |\n| 纯旋转 rotate | 90-p0-features、93-p2-sup-sub-geo | origin 居中约束 |\n| data-shape 预设几何 | 93-p2-sup-sub-geo、111(chevron/homePlate)、112(trapezoid+rotate)、116(triangle/trapezoid) | 15 种(白名单 80+) |\n| 不透明度 opacity 折算 | 全体(基础路径) | 形状填充折算 |\n| 内联 SVG 图标(截图) | 110/114/115/117(卡内嵌套)、113(环形箭头) | 2026-08-05;stroke 显式 hex;currentColor→空白(H7 怪癖) |\n| 组 6 图示原型 | 110 图标网格(23)/111 chevron 带(24)/112 漏斗(25)/113 循环(27)/114 辐射(28)/115 色带(30)/116 金字塔(26)/117 对比卡阵(29) | 2026-08-05 第三轮;exemplar 门禁 0/0 |\n| preview data-shape clip-path 近似 | 111/112/116(仅 preview 截图层) | H8;页面文件不动 |\n\n## 三、背景/媒体类\n\n| 特性 | 锚定页 | 备注 |\n|---|---|---|\n| 渐变(截图路径,默认) | 01、94-p2-gradient | 2x DPI |\n| 原生线性渐变 a:gradFill | **已知缺口(有意)** | `nativeGradient` 默认关;开启路径由 convert 冒烟覆盖,未入 golden(见\"五\") |\n| `<img>` 原生图片 | 91-p1-forms | object-fit 映射;file:// 路径(注意环境漂移) |\n| `<table>` 原生表格 | 91-p1-forms、106-table-focus | colspan/底纹/边框/右对齐;**2026-08-05 H12 修复**:tr 级底纹(background 不继承到 td)原丢失,现沿 td→tr→table 回溯 |\n| `<canvas>` 截图 | 92-p1-chart-visual | 可见化保底 |\n| data-chart:bar | 92-p1-chart-visual | 原生图表 |\n| data-chart:line | 99-archetype-chart | |\n| data-chart:pie / doughnut / area | 107-dashboard | 2026-08-02 Phase G 补锚 |\n| `<svg>` 截图 | data-limit-boundary | 整体截图含文字 |\n| `<video>` / `<audio>` | 95-p2-master-media | addMedia;poster 封面 |\n| 图标字体自动截图 | 92-p1-chart-visual | iconFonts 命中 |\n| mix-blend-mode / clip-path 转截图 | 92-p1-chart-visual | 视觉特效 |\n\n## 四、布局/页面级\n\n| 特性 | 锚定页 | 备注 |\n|---|---|---|\n| 方式 A 绝对定位 | 全体 | |\n| 方式 B flex/grid 流式 | 02、96-editorial、104-comparison | |\n| 方式 C data-layout(columns/grid) | 98-statband、103-split-7-5、107-dashboard | 解析器改写 |\n| 母版 pageNumbers + footer | **全体 L2 页**(fixtures/slides.config.json) | 2026-08-02 Phase G 开启 |\n| 转场 fade/push/wipe/cover/split | 96/97/98/99/100(playlist 项) | 2026-08-02 Phase G 开启,五档齐 |\n| 深底容器背景导出 | 97-archetype-divider、01 | |\n| 演讲者备注 template | 全体 | notesSlide XML |\n| 增量缓存 | L2 全 deck | hash 命中/失效 |\n| design.formProfile deck 级形式检查 | 开发期构造用例(5 页纯文字单调 deck → 2 WARN) | 2026-08-05;缺省/text 休眠,fixtures 无 profile 零影响 |\n\n## 五、行为锚点(回归红线活证据,删页红线)\n\n| 页 | 锚定的历史行为 |\n|---|---|\n| 49-four-layer-overview | 斜体提取修复(4 处)+ 竖排 eaVert |\n| chip-market-share | 斜体提取修复(1 处) |\n| 07-journey-map | box-shadow 真实值化(4 处) |\n| data-limit-boundary | box-shadow 真实值化(7 处)+ SVG 截图 |\n| advice-for-newcomers | 字体时序加固(L1 height 抖动 37→39px) |\n| ai-trends-2026 / four-revolutions | 500 字重 WARN 基线 |\n\n## 六、设计质量检查的锚定页(2026-08-06 第四轮 P3 建立)\n\n> 这些是 **validate 设计检查**(非转换器特性)的锚定页,由 `test/exemplar-checks.js` 断言 0 ERROR/0 WARN。\n> 与转换器特性同规则:新增设计规则必须在此登记锚定页;改这些页前先查本表。\n> 判据阈值与设计契约同源 —— 改阈值须同步 `reference/design-principles.md` 第一/二章。\n\n| 检查(规则号) | 正向锚定页(应通过) | 反向自证方式 | 标定实测值 |\n|---|---|---|---|\n| 文字对比度(layout-checks 5) | 97/103/117(深底页,用 `--on-navy-*`) | 把 `--on-navy-text` 改成 `#1F1F1F` → 97 页立即 2×ERROR(1.22:1) | 全 44 页命中 0;豁免 ≥120px 水印数字、≤2 字符纯符号 |\n| 墨迹行覆盖率(dom-checks 14a) | 96/104/105/106/107/111(P5 重排后 58-97%) | 105 重排前实测 29% | 阈值 55%;airy 页(97/101/102)整条豁免 |\n| 连续空白断层(dom-checks 14b) | 同上(重排后 20-110px) | 96 重排前 330px | 阈值 200px |\n| 上下分布偏斜(dom-checks 14c) | 全样张 | — | 阈值任一半 ≤88% |\n| 字号层级(dom-checks 15) | 全样张(比值 2.1-4.7) | 构造同字号页 → WARN | 页标题/正文 ≥1.6;字号档数 ≥3;正文样本限 top≥320 |\n| 结构色面下限(dom-checks 16) | 96/98/99/100/104/105/106/107/111(色面 13.9-45%) | 96-107 段重排前 10 页色面 **恰好 0%** | ≥1 块(≥1.5 万 px²)或 ≥8%;仅 balanced/rich 档 |\n| 企业黑话密度(dom-checks 17) | 全语料(一档命中最高 1 次 / 11.5‰) | 构造空话页 → WARN(5 次 / 32 字 = 156‰) | ≥40‰ 且 ≥3 次;二档词(对齐/协同/沉淀/闭环)不计 |\n| **限定词落地(layout-checks 6)** | 无常设锚定页(按设计:`hedgePages` 缺省 `[]`,旧夹具零命中) | 注入式自证:构造两页(同内容,一页含\"我们认为/有待验证\")→ 登记进 `hedgePages` → 未含限定词页 WARN、含限定词页静默;未登记页零命中 | 限定词表 7 词;只查内容区(top < footerZoneTop 980),`<template>` 备注不计 |\n\n**exemplar-checks 的 DESIGN 档**:`presentation` + `balanced` + airyPages(97/101/102)。\n`formProfile` 是 2026-08-06 补的 —— 缺该键时规则 16 在样张上从不触发(样张自己得先过 balanced 档)。\n\n## 七、已知缺口(有意/待办)\n\n| 缺口 | 状态 | 说明 |\n|---|---|---|\n| 原生渐变(nativeGradient:true)渲染路径 | 有意未入 golden | D2 拍板默认关;建议后续建第二 playlist(独立 config)锚定 |\n| validate ERROR 触发路径 | 未系统锚定 | 目前以 0 ERROR 通过反向验证;ERROR 构造用例散见于开发期,低优先。例外:对比度 ERROR 已有注入式自证(见上表) |\n| 全出血大图页(原型 11)/ 图文页(原型 10) | 样张未含 | 图片型页面已有 91 img 锚定;后续按需要补样张 |\n| `95-p2-master-media.html` 引用的 `demo.mp4` | 仓库中从未存在 | 转换时报\"媒体文件不存在\"警告并跳过;媒体嵌入路径因此未被真正锚定(2026-08-06 发现,先登记不修) |\n| 深化层产物本身的质量 | **有意未测**(2026-08-06 第六轮 P6 决策) | D 组能断言深化层的**结构**(计数一致、总表取值合法、依赖图完备、字段对齐、角色覆盖、阈值同源),但无法断言\"这条洞察是否真的深刻\"\"这次委员会是否真的改进了大纲\"。丢弃率是委员会的自体检指标,不是质量判据。内容质量的最终闸仍是 Q5 用户确认 —— 机器不越位 |\n| `--text-*` 字号令牌零引用 | **已知未修**(2026-08-06 P4 决策) | 语料/片段/原型库共 59 处硬编码 font-size,`--text-*` 引用数为 **0** —— 字号阶仍只存在于文档。未迁移的原因:`--text-body: 24px` 与页面现用 26px 不等值,迁移会**实际改变字号**而非纯重构,且要重建一轮基线。替代保护:`generation-checks.js` 的 A1/A2/A3 已能拦住\"令牌缺失/下限当默认值/正文破档\"三类漂移,故迁移收益有限、可延后 |\n\n## 八、corpus 账本(2026-08-02 Phase G 定稿;2026-08-05 第三轮更新 + 瘦身)\n\n- L1/L3:36 页 + 8 样张(110-117)+ 模板 3(extraPages)= **47**\n- L2 playlist:32 页 + 8 样张 = **40**(10 精简 deck + 4 游离 + 6 特性 + 20 样张)\n- 退役:06/16/18(重复)+ 04/07/10/13/14/17/19/20(精简)= 11 页\n- **2026-08-05 瘦身(golden.js)**:L2 notesSlide 合并为单项锚定(40 文件 → 1 项,差异时明细列文件);L3 仅含 capture 基元页截图(19 页;28 纯原生页由 L1 完全锚定免截图);孤儿 PNG(退役 11 页)已清。比对项 174 → **107**(L1 47 + L2 41 + L3 19),磁盘 6.4MB → 2.7MB,保护范围不减\n\nFile v2.0.0:scripts/test/fixtures.json\n\n{\n  \"_comment\": \"路径相对 scripts/test/ 解析(golden.js 统一 resolve);夹具已 vendored 进 fixtures/,技能目录自包含\",\n  \"slidesDir\": \"./fixtures/slides\",\n  \"playlistFile\": \"./fixtures/slides/playlist.json\",\n  \"playlistPages\": [\n    \"01.html\",\n    \"02.html\",\n    \"03.html\",\n    \"05.html\",\n    \"08.html\",\n    \"09.html\",\n    \"11.html\",\n    \"12.html\",\n    \"15.html\",\n    \"21.html\",\n    \"07-journey-map.html\",\n    \"49-four-layer-overview.html\",\n    \"advice-for-newcomers.html\",\n    \"data-limit-boundary.html\",\n    \"90-p0-features.html\",\n    \"91-p1-forms.html\",\n    \"92-p1-chart-visual.html\",\n    \"93-p2-sup-sub-geo.html\",\n    \"94-p2-gradient.html\",\n    \"95-p2-master-media.html\",\n    \"96-archetype-editorial.html\",\n    \"97-archetype-divider.html\",\n    \"98-archetype-statband.html\",\n    \"99-archetype-chart.html\",\n    \"100-agenda.html\",\n    \"101-big-statement.html\",\n    \"102-quote.html\",\n    \"103-split-7-5.html\",\n    \"104-comparison.html\",\n    \"105-timeline.html\",\n    \"106-table-focus.html\",\n    \"107-dashboard.html\",\n    \"110-icon-grid.html\",\n    \"111-chevron-flow.html\",\n    \"112-funnel.html\",\n    \"113-cycle.html\",\n    \"114-hub-spoke.html\",\n    \"115-color-band.html\",\n    \"116-pyramid.html\",\n    \"117-vs-cards.html\"\n  ],\n  \"pages\": [\n    \"01.html\",\n    \"02.html\",\n    \"03.html\",\n    \"05.html\",\n    \"08.html\",\n    \"09.html\",\n    \"11.html\",\n    \"12.html\",\n    \"15.html\",\n    \"21.html\",\n    \"05-four-questions-ai-capabilities.html\",\n    \"07-journey-map.html\",\n    \"49-four-layer-overview.html\",\n    \"advice-for-newcomers.html\",\n    \"ai-trends-2026.html\",\n    \"chip-market-share.html\",\n    \"data-limit-boundary.html\",\n    \"four-revolutions.html\",\n    \"90-p0-features.html\",\n    \"91-p1-forms.html\",\n    \"92-p1-chart-visual.html\",\n    \"93-p2-sup-sub-geo.html\",\n    \"94-p2-gradient.html\",\n    \"95-p2-master-media.html\",\n    \"96-archetype-editorial.html\",\n    \"97-archetype-divider.html\",\n    \"98-archetype-statband.html\",\n    \"99-archetype-chart.html\",\n    \"100-agenda.html\",\n    \"101-big-statement.html\",\n    \"102-quote.html\",\n    \"103-split-7-5.html\",\n    \"104-comparison.html\",\n    \"105-timeline.html\",\n    \"106-table-focus.html\",\n    \"107-dashboard.html\",\n    \"110-icon-grid.html\",\n    \"111-chevron-flow.html\",\n    \"112-funnel.html\",\n    \"113-cycle.html\",\n    \"114-hub-spoke.html\",\n    \"115-color-band.html\",\n    \"116-pyramid.html\",\n    \"117-vs-cards.html\"\n  ],\n  \"extraPages\": [\n    \"../../assets/slide-template.html\",\n    \"../../assets/slide-template-flex.html\",\n    \"../../assets/slide-template-layout.html\"\n  ]\n}\n\nFile v2.0.0:scripts/test/fixtures/slides/playlist.json\n\n{\n  \"schemaVersion\": \"1.0\",\n  \"format\": \"html\",\n  \"metadata\": {\n    \"title\": \"AI辅助ESG管理革新工作坊 · I.D.E.A.智能工作流一日精修\",\n    \"description\": \"讲师投屏PPT · 联想Lenovo视觉风格 · 微软雅黑 · 全天课程\",\n    \"author\": \"\"\n  },\n  \"canvas\": {\n    \"width\": 1920,\n    \"height\": 1080\n  },\n  \"playlist\": [\n    \"01.html\",\n    \"02.html\",\n    \"03.html\",\n    \"05.html\",\n    \"08.html\",\n    \"09.html\",\n    \"11.html\",\n    \"12.html\",\n    \"15.html\",\n    \"21.html\",\n    \"07-journey-map.html\",\n    \"49-four-layer-overview.html\",\n    \"advice-for-newcomers.html\",\n    \"data-limit-boundary.html\",\n    \"90-p0-features.html\",\n    \"91-p1-forms.html\",\n    \"92-p1-chart-visual.html\",\n    \"93-p2-sup-sub-geo.html\",\n    \"94-p2-gradient.html\",\n    \"95-p2-master-media.html\",\n    {\n      \"file\": \"96-archetype-editorial.html\",\n      \"transition\": \"fade\"\n    },\n    {\n      \"file\": \"97-archetype-divider.html\",\n      \"transition\": \"push\"\n    },\n    {\n      \"file\": \"98-archetype-statband.html\",\n      \"transition\": \"wipe\"\n    },\n    {\n      \"file\": \"99-archetype-chart.html\",\n      \"transition\": \"cover\"\n    },\n    {\n      \"file\": \"100-agenda.html\",\n      \"transition\": \"split\"\n    },\n    \"101-big-statement.html\",\n    \"102-quote.html\",\n    \"103-split-7-5.html\",\n    \"104-comparison.html\",\n    \"105-timeline.html\",\n    \"106-table-focus.html\",\n    \"107-dashboard.html\",\n    \"110-icon-grid.html\",\n    \"111-chevron-flow.html\",\n    \"112-funnel.html\",\n    \"113-cycle.html\",\n    \"114-hub-spoke.html\",\n    \"115-color-band.html\",\n    \"116-pyramid.html\",\n    \"117-vs-cards.html\"\n  ]\n}\n\nFile v2.0.0:scripts/test/fixtures/slides/slides.config.json\n\n{\n  \"master\": {\n    \"pageNumbers\": true,\n    \"footer\": \"golden-fixture\",\n    \"footerColor\": \"999999\"\n  },\n  \"design\": {\n    \"tier\": \"\",\n    \"formProfile\": \"\"\n  }\n}\n\nFile v2.0.0:scripts/test/golden/validate-baseline.txt\n\n=== 01.html ===\n  ✅ 无违规\n\n=== 02.html ===\n  ⚠️  WARN 圆角卡片使用非统一边框(0px/0px/0px/5px),逐边细条不贴合圆角\n     → 修复: 圆角卡改用统一边框,或强调条用独立细长 shape\n  ⚠️  WARN 圆角卡片使用非统一边框(0px/0px/0px/5px),逐边细条不贴合圆角\n     → 修复: 圆角卡改用统一边框,或强调条用独立细长 shape\n  ⚠️  WARN 圆角卡片使用非统一边框(0px/0px/0px/5px),逐边细条不贴合圆角\n     → 修复: 圆角卡改用统一边框,或强调条用独立细长 shape\n  ⚠️  WARN 圆角卡片使用非统一边框(0px/0px/0px/5px),逐边细条不贴合圆角\n     → 修复: 圆角卡改用统一边框,或强调条用独立细长 shape\n\n=== 03.html ===\n  ✅ 无违规\n\n=== 05-four-questions-ai-capabilities.html ===\n  ✅ 无违规\n\n=== 05.html ===\n  ✅ 无违规\n\n=== 07-journey-map.html ===\n  ⚠️  WARN L41 box-shadow 只还原第一层非 inset 阴影(spread 与多层不还原)\n     → 修复: 如需精确阴影,改用渐变/多层形状模拟\n  ⚠️  WARN L57 box-shadow 只还原第一层非 inset 阴影(spread 与多层不还原)\n     → 修复: 如需精确阴影,改用渐变/多层形状模拟\n  ⚠️  WARN L73 box-shadow 只还原第一层非 inset 阴影(spread 与多层不还原)\n     → 修复: 如需精确阴影,改用渐变/多层形状模拟\n  ⚠️  WARN L89 box-shadow 只还原第一层非 inset 阴影(spread 与多层不还原)\n     → 修复: 如需精确阴影,改用渐变/多层形状模拟\n\n=== 08.html ===\n  ✅ 无违规\n\n=== 09.html ===\n  ✅ 无违规\n\n=== 100-agenda.html ===\n  ✅ 无违规\n\n=== 101-big-statement.html ===\n  ✅ 无违规\n\n=== 102-quote.html ===\n  ✅ 无违规\n\n=== 103-split-7-5.html ===\n  ✅ 无违规\n\n=== 104-comparison.html ===\n  ✅ 无违规\n\n=== 105-timeline.html ===\n  ✅ 无违规\n\n=== 106-table-focus.html ===\n  ✅ 无违规\n\n=== 107-dashboard.html ===\n  ✅ 无违规\n\n=== 11.html ===\n  ✅ 无违规\n\n=== 110-icon-grid.html ===\n  ✅ 无违规\n\n=== 111-chevron-flow.html ===\n  ✅ 无违规\n\n=== 112-funnel.html ===\n  ✅ 无违规\n\n=== 113-cycle.html ===\n  ✅ 无违规\n\n=== 114-hub-spoke.html ===\n  ✅ 无违规\n\n=== 115-color-band.html ===\n  ✅ 无违规\n\n=== 116-pyramid.html ===\n  ✅ 无违规\n\n=== 117-vs-cards.html ===\n  ✅ 无违规\n\n=== 12.html ===\n  ⚠️  WARN 圆角卡片使用非统一边框(4px/0px/0px/0px),逐边细条不贴合圆角\n     → 修复: 圆角卡改用统一边框,或强调条用独立细长 shape\n  ⚠️  WARN 圆角卡片使用非统一边框(4px/0px/0px/0px),逐边细条不贴合圆角\n     → 修复: 圆角卡改用统一边框,或强调条用独立细长 shape\n\n=== 15.html ===\n  ✅ 无违规\n\n=== 21.html ===\n  ✅ 无违规\n\n=== 49-four-layer-overview.html ===\n  ⚠️  WARN L88 竖排文字为实验性支持(eaVert)\n     → 修复: 逐字 <br> 换行是更稳的替代\n\n=== 90-p0-features.html ===\n  ⚠️  WARN L60 box-shadow 只还原第一层非 inset 阴影(spread 与多层不还原)\n     → 修复: 如需精确阴影,改用渐变/多层形状模拟\n\n=== 91-p1-forms.html ===\n  ✅ 无违规\n\n=== 92-p1-chart-visual.html ===\n  ⚠️  WARN mix-blend-mode:multiply 元素整体转截图(不可编辑)\n     → 修复: 文字放在特效元素之外的独立 textbox 叠加\n  ⚠️  WARN clip-path:polygon(0px 0px, 100% 0px, 100% 100%, 0px 100%, 0px 50%) 元素整体转截图(不可编辑)\n     → 修复: 裁剪形状内的文字改放独立 textbox\n\n=== 93-p2-sup-sub-geo.html ===\n  ⚠️  WARN 多行文字未设显式 line-height,行距将不可控: \"rtTriangle\"\n     → 修复: 给该文本加 line-height(如 1.5 或 31px)\n  ⚠️  WARN 多行文字未设显式 line-height,行距将不可控: \"chevron↓(rot 180)\"\n     → 修复: 给该文本加 line-height(如 1.5 或 31px)\n  ⚠️  WARN 多行文字未设显式 line-height,行距将不可控: \"diamond+shadow\"\n     → 修复: 给该文本加 line-height(如 1.5 或 31px)\n  ⚠️  WARN 多行文字未设显式 line-height,行距将不可控: \"triangle+dashed\"\n     → 修复: 给该文本加 line-height(如 1.5 或 31px)\n  ⚠️  WARN L131 box-shadow 只还原第一层非 inset 阴影(spread 与多层不还原)\n     → 修复: 如需精确阴影,改用渐变/多层形状模拟\n\n=== 94-p2-gradient.html ===\n  ⚠️  WARN 文字颜色带透明度,转换后变为纯色: \"智能工作流让协作更高效,让创意更自由,让\" (rgba(255, 255, 255, 0.85))\n     → 修复: 改用不透明的混合色值(手算与底色的混合结果)\n  ⚠️  WARN L74 box-shadow 只还原第一层非 inset 阴影(spread 与多层不还原)\n     → 修复: 如需精确阴影,改用渐变/多层形状模拟\n  ⚠️  WARN L79 box-shadow 只还原第一层非 inset 阴影(spread 与多层不还原)\n     → 修复: 如需精确阴影,改用渐变/多层形状模拟\n\n=== 95-p2-master-media.html ===\n  ⚠️  WARN 元素完全在画布外,不会显示: <audio> \"\"\n     → 修复: 移入 1920x1080 画布内,或删除\n  ⚠️  WARN <video> 未指定 src,将仅用封面图展示\n     → 修复: 加 src 属性指向本地视频文件\n  ⚠️  WARN <video> 未设 poster,将截取浏览器渲染帧做封面(可能黑屏)\n     → 修复: 加 poster 属性指向封面图\n\n=== 96-archetype-editorial.html ===\n  ✅ 无违规\n\n=== 97-archetype-divider.html ===\n  ✅ 无违规\n\n=== 98-archetype-statband.html ===\n  ✅ 无违规\n\n=== 99-archetype-chart.html ===\n  ✅ 无违规\n\n=== advice-for-newcomers.html ===\n  ⚠️  WARN font-weight:500 在 PPTX 中退化为常规体: \"员工工作满意度提升 · Gallup\"\n     → 修复: 改用 400(常规)或 600(粗体)\n  ⚠️  WARN font-weight:500 在 PPTX 中退化为常规体: \"全球增长最快的岗位 · LinkedIn\"\n     → 修复: 改用 400(常规)或 600(粗体)\n  ⚠️  WARN font-weight:500 在 PPTX 中退化为常规体: \"AI 增强团队生产力提升\"\n     → 修复: 改用 400(常规)或 600(粗体)\n  ⚠️  WARN font-weight:500 在 PPTX 中退化为常规体: \"人机协作的三条纪律\"\n     → 修复: 改用 400(常规)或 600(粗体)\n\n=== ai-trends-2026.html ===\n  ⚠️  WARN font-weight:500 在 PPTX 中退化为常规体: \"企业软件将内置 Agent · Gart\"\n     → 修复: 改用 400(常规)或 600(粗体)\n  ⚠️  WARN font-weight:500 在 PPTX 中退化为常规体: \"近两年多模态模型发布量增速\"\n     → 修复: 改用 400(常规)或 600(粗体)\n  ⚠️  WARN font-weight:500 在 PPTX 中退化为常规体: \"AI 原生团队人均产出差距\"\n     → 修复: 改用 400(常规)或 600(粗体)\n  ⚠️  WARN font-weight:500 在 PPTX 中退化为常规体: \"问答工具\"\n     → 修复: 改用 400(常规)或 600(粗体)\n  ⚠️  WARN font-weight:500 在 PPTX 中退化为常规体: \"副驾驶\"\n     → 修复: 改用 400(常规)或 600(粗体)\n\n=== chip-market-share.html ===\n  ✅ 无违规\n\n=== data-limit-boundary.html ===\n  ⚠️  WARN L47 box-shadow 只还原第一层非 inset 阴影(spread 与多层不还原)\n     → 修复: 如需精确阴影,改用渐变/多层形状模拟\n  ⚠️  WARN L48 box-shadow 只还原第一层非 inset 阴影(spread 与多层不还原)\n     → 修复: 如需精确阴影,改用渐变/多层形状模拟\n  ⚠️  WARN L49 box-shadow 只还原第一层非 inset 阴影(spread 与多层不还原)\n     → 修复: 如需精确阴影,改用渐变/多层形状模拟\n  ⚠️  WARN L50 box-shadow 只还原第一层非 inset 阴影(spread 与多层不还原)\n     → 修复: 如需精确阴影,改用渐变/多层形状模拟\n  ⚠️  WARN L51 box-shadow 只还原第一层非 inset 阴影(spread 与多层不还原)\n     → 修复: 如需精确阴影,改用渐变/多层形状模拟\n  ⚠️  WARN L65 box-shadow 只还原第一层非 inset 阴影(spread 与多层不还原)\n     → 修复: 如需精确阴影,改用渐变/多层形状模拟\n  ⚠️  WARN L71 box-shadow 只还原第一层非 inset 阴影(spread 与多层不还原)\n     → 修复: 如需精确阴影,改用渐变/多层形状模拟\n\n=== four-revolutions.html ===\n  ⚠️  WARN font-weight:500 在 PPTX 中退化为常规体: \"基础体力\"\n     → 修复: 改用 400(常规)或 600(粗体)\n  ⚠️  WARN font-weight:500 在 PPTX 中退化为常规体: \"多数体力\"\n     → 修复: 改用 400(常规)或 600(粗体)\n  ⚠️  WARN font-weight:500 在 PPTX 中退化为常规体: \"计算智力\"\n     → 修复: 改用 400(常规)或 600(粗体)\n\n──────────────────────────────\n共 44 个文件: 0 个 ERROR, 44 个 WARN\n\nFile v2.0.0:assets/deck-brief.template.md\n\n# Deck Brief · {主题}\n\n> 访谈轮次:{N} 丨 状态:{待确认/已确认} 丨 本文件是可迭代需求源,改需求 = 改对应行 + 重新确认\n> 写每页时只对照本文件(唯一执行事实源),不回查档位表与访谈记录。\n\n## 定位\n- 主题:{}\n- 受众:{}\n- 一句话目标:{讲完希望听众记住/做什么}\n- 使用场景:{演讲形式/混合形式/阅读形式}\n- 页数:{N} 页(骨架:{骨架名或\"自由结构\"})\n- 素材现状:{全文稿/大纲要点/裸主题} 丨 打磨深度:{深度打磨/标准/快速}\n\n## 内容深化记录(摘要;详档见 `slides/deck-insights.md`)\n\n> 2026-08-06 第六轮 P4:详档独立落盘。此前 6 列洞察表被压进本区一行,写页时无法查 ——\n> 花 13-15 次调用产出的东西 Q5 展示一次后就实际不可用。本区只留摘要 + 指针。\n\n- 素材形态:{全文稿/大纲要点/裸主题} 丨 执行:{四步全做/Step 1·2·4/假设清单(裸主题不做追问)}\n- 洞察:{N 条} 丨 **降级论断:{M} 条 → 第 {} 页(已写入 slides.config.json 的 `hedgePages`)**\n- 多角色:{角色名};执行方式 {并行 agents/主循环快评/串行扮演(非独立)}\n- 委员会:固定席(唱反调/执行者)+ 动态席 {3 个};实质冲突 {N} 处;**丢弃率 {X}%**\n- 大纲级形式门禁:{全过 / 不合规项及处置}\n- 详档:`slides/deck-insights.md`(洞察清单/假设清单/意见编号/裁决/被否方向/行动方案)\n\n## 结构(逐页大纲)\n| 页 | 类型 | 形式 | 内容一句话(核心断言) | 原型(编号+名) | 备注(证据需求/风险) |\n|---|---|---|---|---|---|\n| 01 | 封面 | 文字(airy) | {} | 1 封面·深底大字 | |\n\n**原型变化检查**:共 {} 种原型(≥6);同原型最长连排 {} 页(≤2);airy 页 = 第 {} 页;纯文字卡片矩阵页 = 第 {} 页(≤2;图标网格不受此限)\n**形式分布检查**(按视觉形式偏好档):纯文字内容页 {}/{} 页(克制型不限/平衡型 ≤50%/丰富型 ≤30%);同形式最长连排 {} 页(平衡型 ≤3/丰富型 ≤2);图示型页 = 第 {} 页\n\n## 视觉\n- 色板:{预设名(文件),如 business-blue.css} 或 {品牌风:brand-linear.css(Linear 风·深色精密)} 或 {自定义 #RRGGBB 推导(已经二次确认)}\n- 风格个性:{商务咨询/编辑杂志/科技极简/学术朴素/品牌风(档案自带)};风格红线:{如\"禁多彩、蓝是唯一彩色\"}\n- 图片政策:{纯文字图表/产品截图(contain)/照片素材(cover)/图标几何(→ icons.md + 原型 23-30)}\n- **视觉形式偏好:{文字克制型/平衡型/图示丰富型}**(Q8c;平衡型=纯文字内容页 ≤50%、每内容页 ≥1 非文字视觉元素)\n- 基调:{浅色为主·深底封面结尾/全浅色/深色为主}\n- 装饰强度:{简洁/适中/丰富}\n\n## 版式与密度参数(本 deck 的执行硬约束)\n- 布局方式:{自动/C 优先/B 优先/A 经典} 丨 版式节奏:{张弛变化/统一规整}\n- 页标题 {}px / 封面主标 {}px / 区块标题 {}px / 正文 {}px(破档下限 {}px)\n- 字号绝对下限 14px;注释/来源 ≥{}px\n- 每页要点 ≤{} / 每要点 ≤{} 字 / 单页正文 ≤{} \n\nArchive v1.1.2: 174 files, 463253 bytes\n\nFiles: assets/deck-brief.template.md (3775b), assets/icons.md (16400b), assets/playlist.template.json (277b), assets/presets/brand-airbnb.css (3109b), assets/presets/brand-apple.css (3232b), assets/presets/brand-claude.css (3202b), assets/presets/brand-ferrari.css (3134b), assets/presets/brand-figma.css (3141b), assets/presets/brand-linear.css (3255b), assets/presets/brand-notion.css (3245b), assets/presets/brand-nvidia.css (3095b), assets/presets/brand-spotify.css (3069b), assets/presets/brand-stripe.css (3122b), assets/presets/brand-vercel.css (2982b), assets/presets/business-blue.css (2737b), assets/presets/forest-green.css (2783b), assets/presets/graphite-mono.css (2836b), assets/presets/lenovo-default.css (3611b), assets/presets/warm-orange.css (2815b), assets/slide-template-flex.html (6040b), assets/slide-template-layout.html (5928b), assets/slide-template.html (4183b), assets/snippets/agenda-list.html (1384b), assets/snippets/badge-center.html (1251b), assets/snippets/big-statement.html (1413b), assets/snippets/card-accent-top.html (2711b), assets/snippets/chevron-band.html (4715b), assets/snippets/code-block.html (2375b), assets/snippets/color-band.html (2034b), assets/snippets/compare-card.html (1458b), assets/snippets/cycle-loop.html (3676b), assets/snippets/data-table.html (2644b), assets/snippets/editorial-columns.html (1305b), assets/snippets/flow-step.html (1165b), assets/snippets/funnel-stack.html (4784b), assets/snippets/gradient-bar.html (1518b), assets/snippets/hero-gradient.html (2348b), assets/snippets/hub-...","readmeExcerpt":"Skill: Html Slides To PPTX Owner: cqcmj74 Summary: 编写可无损还原为 PPTX 的 HTML 幻灯片。先经引导式访谈确认样式/形式/结构并落盘 deck-brief,再生成完整目录结构(assets/theme.css、slides/*.html、playlist.json), 每页严格遵循 html-spec.md 规范,经 validate.js 预检零 ERROR 后用 convert.js 转成 PowerPoint。TRIGGER when: 用户要求\"做PPT/幻灯片/slides/演示文稿\"、\"把内容做成 HTML幻灯片\"、\"生成可转PPTX的slides\",或调用 /html-slides-to-pptx。DO NOT TRIG Tags: latest:2.1.0 Version history: v2.1.0 | 2026-08-18T01:14:59.551","codeSnippets":[],"executableExamples":[{"language":"bash","snippet":"SKILL_DIR=\"<技能根目录,即 Base directory>\"\nls \"$SKILL_DIR/scripts/node_modules/playwright\" >/dev/null 2>&1 \\\n  && echo OK || (cd \"$SKILL_DIR/scripts\" && npm install && npx playwright install chromium)"},{"language":"text","snippet":"assets/theme.css          # 按 brief 色板:复制 assets/presets/<选定预设>.css(自定义色则按推导值生成)\nslides/NN-slug.html       # 每页一个文件,两位数字前缀排序\nslides/playlist.json      # 从 assets/playlist.template.json 实例化,playlist 按顺序列全页面\nslides/deck-brief.md      # Step 1 落盘的需求确认卡\nslides/deck-insights.md   # 深化层详档(非快速档才有;模板 assets/deck-insights.template.md)\nslides/deck-pages.md      # 页级内容卡(所有档位都有;模板 assets/deck-pages.template.md)\nslides/slides.config.json # 从 assets/slides.config.template.json 实例化(键见 scripts/config/default.config.js)"},{"language":"json","snippet":"{\n  \"design\": {\n    \"tier\": \"presentation | mixed | reading\",\n    \"minBodyPx\": 14,\n    \"fillThreshold\": 0.85,\n    \"airyPages\": [\"01-cover.html\", \"05-statement.html\"],\n    \"formProfile\": \"balanced\",\n    \"hedgePages\": [\"07-forecast.html\"]\n  }\n}"},{"language":"bash","snippet":"node \"$SKILL_DIR/scripts/preview.js\" slides/"},{"language":"bash","snippet":"node \"$SKILL_DIR/scripts/validate.js\" slides/"},{"language":"bash","snippet":"node \"$SKILL_DIR/scripts/convert.js\" ./slides ./slides/playlist.json output.pptx"}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"SKILL.md","content":"---\nname: html-slides-to-pptx\ndescription: >-\n  编写可无损还原为 PPTX 的 HTML 幻灯片。先经引导式访谈确认样式/形式/结构并落盘\n  deck-brief,再生成完整目录结构(assets/theme.css、slides/*.html、playlist.json),\n  每页严格遵循 html-spec.md 规范,经 validate.js 预检零 ERROR 后用 convert.js 转成\n  PowerPoint。TRIGGER when: 用户要求\"做PPT/幻灯片/slides/演示文稿\"、\"把内容做成\n  HTML幻灯片\"、\"生成可转PPTX的slides\",或调用 /html-slides-to-pptx。DO NOT TRIGGER when:\n  只需单页HTML网页、或要做的是 reveal.js/Marp 等其他幻灯片格式。\nversion: 2.1.0\nmetadata:\n  openclaw:\n    requires:\n      bins:\n        - node\n        - npm\n---\n\n# html-slides · 可无损转 PPTX 的 HTML 幻灯片生成器(引导式访谈版)\n\n## 核心原则\n\n转换器(`scripts/convert.js` + 浏览器端提取管线)只**无损支持 HTML/CSS 的一个子集**。\n每页 HTML 必须严格遵循 `reference/html-spec.md` —— 这是契约,不是建议。\n写页面之前必须先完成 Step 1 访谈并让用户确认 `slides/deck-brief.md`。\n\n## 首次使用:检查工具依赖\n\n> 以下命令中的 `SKILL_DIR` 指本技能的根目录(即 SKILL.md 所在目录)。\n> 技能加载时系统会显示 \"Base directory for this skill: <路径>\",用该路径替换 `SKILL_DIR`。\n\n```bash\nSKILL_DIR=\"<技能根目录,即 Base directory>\"\nls \"$SKILL_DIR/scripts/node_modules/playwright\" >/dev/null 2>&1 \\\n  && echo OK || (cd \"$SKILL_DIR/scripts\" && npm install && npx playwright install chromium)\n```\n若输出 OK 则跳过安装;否则等待安装完成再继续。\n\n## 工作流程(按顺序执行)\n\n### Step 1 · 引导式访谈 → 需求确认卡\n\n**读 `reference/interview-guide.md` 并严格执行**:5 阶段(定位→结构→视觉→版式→输出)+ 收尾确认卡,\n共 **16 问 + 1 个大纲确认环节**,每问有默认值与智能跳过规则。配套查询:\n- 叙事骨架:`reference/narrative-skeletons.md`(脚手架非模具;用户可选\"自由结构\")\n- 色板预设:`reference/theme-presets.md`(5 套预设 + 自定义 hex 推导)\n- 信息密度:`reference/density-tiers.md`(演讲/混合/阅读 三档参数)\n- **内容深化:`reference/content-deepening.md`**(**素材形态 × 深度档**二维矩阵定做什么:\n  四步追问审素材 → 多角色 → 委员会审大纲;裸主题改出**假设清单**不做追问;\n  所有档位都跑**大纲级形式门禁**;大纲 v2 才进 Q5 确认)\n\n**Step 1 执行顺序**:①读 interview-guide 的**推断总表**,从用户首句匹配 deck 族 → 一次定全轴推荐值\n②按**依赖图**决定哪些问可跳 ③选路径(快通道 2-3 轮 / 标准 4-6 轮 / 深度 + 深化层)\n④逐阶段抛问,置首项说明理由 ⑤深化层按矩阵执行 ⑥Q5 确认大纲 v2。\n**任何路径都不跳 Q6 色板 与 Q5 大纲确认**(返工最贵的两个决定)。\n\n访谈收尾:按 `assets/deck-brief.template.md` 生成确认卡展示给用户,\n**用户确认后落盘 `slides/deck-brief.md`** —— 此后它是唯一执行事实源;\n后续\"改第 N 页/换色板\"类迭代直接读它,不重访谈。\n\n### Step 2 · 搭目录结构\n在当前工作目录生成:\n```\nassets/theme.css          # 按 brief 色板:复制 assets/presets/<选定预设>.css(自定义色则按推导值生成)\nslides/NN-slug.html       # 每页一个文件,两位数字前缀排序\nslides/playlist.json      # 从 assets/playlist.template.json 实例化,playlist 按顺序列全页面\nslides/deck-brief.md      # Step 1 落盘的需求确认卡\nslides/deck-insights.md   # 深化层详档(非快速档才有;模板 assets/deck-insights.template.md)\nslides/deck-pages.md      # 页级内容卡(所有档位都有;模板 assets/deck-pages.template.md)\nslides/slides.config.json # 从 assets/slides.config.template.json 实例化(键见 scripts/config/default.config.js)\n```\n目录已存在时,保留用户已有文件,只补缺失项。\n\n**slides.config.json 按 brief 填**(实例化 `assets/slides.config.template.json`):\n```json\n{\n  \"design\": {\n    \"tier\": \"presentation | mixed | reading\",\n    \"minBodyPx\": 14,\n    \"fillThreshold\": 0.85,\n    \"airyPages\": [\"01-cover.html\", \"05-statement.html\"],\n    \"formProfile\": \"balanced\",\n    \"hedgePages\": [\"07-forecast.html\"]\n  }\n}\n```\n- 设计检查**默认就是开着的**(缺省 `presentation` + `balanced`);本文件的作用是按 brief\n  **校准**档位与豁免页,不是\"开启开关\"。整份文件缺失时按默认档跑,不会静默放行。\n- `design.tier` 由 brief 使用场景映射(演讲→presentation/混合→mixed/阅读→reading);\n  决定"},{"path":"_meta.json","content":"{\n  \"ownerId\": \"kn7af33xbszyq32pce2pa6f84n8bdfqy\",\n  \"slug\": \"html-slides-to-pptx\",\n  \"version\": \"2.1.0\",\n  \"publishedAt\": 1787015699551\n}"},{"path":"scripts/package-lock.json","content":"{\n  \"name\": \"html-slides-tools\",\n  \"version\": \"1.0.0\",\n  \"lockfileVersion\": 3,\n  \"requires\": true,\n  \"packages\": {\n    \"\": {\n      \"name\": \"html-slides-tools\",\n      \"version\": \"1.0.0\",\n      \"dependencies\": {\n        \"playwright\": \"^1.61.1\",\n        \"pptxgenjs\": \"^4.0.1\"\n      }\n    },\n    \"node_modules/@types/node\": {\n      \"version\": \"22.20.1\",\n      \"resolved\": \"https://registry.npmmirror.com/@types/node/-/node-22.20.1.tgz\",\n      \"integrity\": \"sha512-EANqOCF9QFyra+4pfxUcX9STKJpCLjMbObVzljIJomAWSnuSIEAvyzEU53GaajbXJEgdh0iEcPL+DGvpUd4k1Q==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"undici-types\": \"~6.21.0\"\n      }\n    },\n    \"node_modules/core-util-is\": {\n      \"version\": \"1.0.3\",\n      \"resolved\": \"https://registry.npmmirror.com/core-util-is/-/core-util-is-1.0.3.tgz\",\n      \"integrity\": \"sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/fsevents\": {\n      \"version\": \"2.3.2\",\n      \"resolved\": \"https://registry.npmmirror.com/fsevents/-/fsevents-2.3.2.tgz\",\n      \"integrity\": \"sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==\",\n      \"hasInstallScript\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"darwin\"\n      ],\n      \"engines\": {\n        \"node\": \"^8.16.0 || ^10.6.0 || >=11.0.0\"\n      }\n    },\n    \"node_modules/https\": {\n      \"version\": \"1.0.0\",\n      \"resolved\": \"https://registry.npmmirror.com/https/-/https-1.0.0.tgz\",\n      \"integrity\": \"sha512-4EC57ddXrkaF0x83Oj8sM6SLQHAWXw90Skqu2M4AEWENZ3F02dFJE/GARA8igO79tcgYqGrD7ae4f5L3um2lgg==\",\n      \"license\": \"ISC\"\n    },\n    \"node_modules/image-size\": {\n      \"version\": \"1.2.1\",\n      \"resolved\": \"https://registry.npmmirror.com/image-size/-/image-size-1.2.1.tgz\",\n      \"integrity\": \"sha512-rH+46sQJ2dlwfjfhCyNx5thzrv+dtmBIhPHk0zgRUukHzZ/kRueTJXoYYsclBaKcSMBWuGbOFXtioLpzTb5euw==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"queue\": \"6.0.2\"\n      },\n      \"bin\": {\n        \"image-size\": \"bin/image-size.js\"\n      },\n      \"engines\": {\n        \"node\": \">=16.x\"\n      }\n    },\n    \"node_modules/immediate\": {\n      \"version\": \"3.0.6\",\n      \"resolved\": \"https://registry.npmmirror.com/immediate/-/immediate-3.0.6.tgz\",\n      \"integrity\": \"sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/inherits\": {\n      \"version\": \"2.0.4\",\n      \"resolved\": \"https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz\",\n      \"integrity\": \"sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==\",\n      \"license\": \"ISC\"\n    },\n    \"node_modules/isarray\": {\n      \"version\": \"1.0.0\",\n      \"resolved\": \"https://registry.npmmirror.com/isarray/-/isarray-1.0.0.tgz\",\n      \"integrity\": \"sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==\",\n      \"license"},{"path":"scripts/package.json","content":"{\n  \"name\": \"html-slides-tools\",\n  \"version\": \"3.0.0\",\n  \"description\": \"HTML slides -> PPTX converter + validator (bundled with the html-slides skill)\",\n  \"private\": true,\n  \"type\": \"commonjs\",\n  \"scripts\": {\n    \"test\": \"node test/golden.js verify\",\n    \"test:update\": \"node test/golden.js update\",\n    \"test:design\": \"node test/exemplar-checks.js && node test/threshold-parity.js && node test/generation-checks.js && node test/anchor-integrity.js\",\n    \"test:thresholds\": \"node test/threshold-parity.js\",\n    \"test:generation\": \"node test/generation-checks.js\",\n    \"test:anchors\": \"node test/anchor-integrity.js\",\n    \"validate\": \"node validate.js\",\n    \"convert\": \"node convert.js\"\n  },\n  \"dependencies\": {\n    \"playwright\": \"^1.61.1\",\n    \"pptxgenjs\": \"^4.0.1\"\n  }\n}"},{"path":"scripts/test/FEATURE-COVERAGE.md","content":"# 特性覆盖矩阵(FEATURE-COVERAGE)\n\n> golden fixtures 的\"特性 → 锚定页\"台账(2026-08-02 Phase G 建立)。\n> **登记规则(硬约束)**:\n> 1. 新增转换器特性(基元/样式/元素/配置)时,必须指定锚定页并更新本表;无锚定页的特性不得合并。\n> 2. 删除夹具页前,先查本表确认它不是某特性的唯一锚点。\n> 3. 样张页(96-107、110-117、118-130)同时受 `test/exemplar-checks.js` 设计门禁(0 ERROR/0 WARN)。\n> 4. **2026-08-06 第五轮 P5**:本表的锚点关系已由 `test/anchor-integrity.js` 变成**可执行断言**\n>    —— 改样张设计时若换掉了承载特性的元素,守卫会失败(唯一锚点失效 = 致命)。\n>    新增/换锚时**同步改该守卫的 ANCHORS 表**,否则台账与守卫脱节(守卫自身会警告)。\n\n### 样张双角色的已知张力(2026-08-06 定型)\n\n样张页身兼\"设计范本 + 转换锚点\"两职。曾考虑让样张退出 L2/L3 基线以解耦,**经查证不可行**:\n`99-archetype-chart` 是 `data-chart:line` 的唯一锚点,`107-dashboard` 是 pie/doughnut/area 的唯一锚点,\n`112-funnel` 是 `data-shape=\"trapezoid\"` 的唯一锚点 —— 退出即等于删除这些特性的转换覆盖。\n\n实测澄清了成本结构:这 9 页**本来就不在 L3**(2026-08-05 瘦身:L3 只截含 capture 基元的页),\n所以改设计的成本只有 L1+L2 重建,而那是\"输出确实变了\"的证据,不是冗余开销。\n真正的风险不是重建成本,而是**改设计会静默摧毁转换覆盖**:实测把 99 页的 `data-chart` 换成纯文本后,\n样张门禁 ✅、生成侧回归 ✅,只有 golden 报 diff —— 而\"我重排了这页\"的 diff 复核里重建基线是自然动作。\n故结论:**保留双角色,用 `anchor-integrity.js` 守住锚点**,而不是拆分角色。\n> 页面角色:fidelity 锚(01-21 精简页/游离页/特性页)= 转换保真;exemplar 样张(96-107、110-117、118-130)= 保真+设计纪律双锚。\n> 2026-08-05 第三轮重构(布局丰富度):零管线改动;新增样张 110-117 锚定组 6 图示原型(23-30)与内联 SVG 图标。\n> 2026-08-09 第七轮重构(咨询分析布局):零管线改动;新增样张 118-130 锚定组 7 分析论证原型(31-43)。\n> 新增四个唯一锚点:`data-chart:scatter`→123、`data-shape=\"pie\"`→120、`data-shape=\"diamond\"`→122、td 级底纹→125。\n\n## 一、文字类\n\n| 特性 | 锚定页 | 备注 |\n|---|---|---|\n| 斜体 `<i>/<em>` | 90-p0-features、49-four-layer、chip-market-share | 49-four/chip 是历史缺陷修复锚 |\n| 下划线 / 删除线 / 超链接 | 90-p0-features | run 级 |\n| run 级字体 fontFace | 90-p0-features、96-107(`.num`) | `.num` Inter 混排是真实场景锚 |\n| text-transform | 90-p0-features | uppercase/lowercase |\n| 上下标 `<sup>/<sub>` | 93-p2-sup-sub-geo | baseline 30000/-40000 |\n| run 级字距 charSpacing | 93-p2-sup-sub-geo | 与 box 级独立 |\n| 原生列表 `<ul>/<ol>` bullet | 91-p1-forms、01-cockpit 压测(临时) | LI 直接含文字挂 bullet;**2026-08-05 H11 修复**:旧写法 type+characterCode 永不产 buChar;现 UL 无 type、OL 用 style |\n| pre/code 空白保留 | 91-p1-forms | white-space:pre |\n| 竖排 writing-mode | 49-four-layer | 实验性 eaVert(基线 WARN) |\n| 混合字号行 | 98-statband、107-dashboard | 大数字+单位,行高按最大 run |\n| 500 字重退化 WARN | advice-for-newcomers、ai-trends-2026、four-revolutions | validate 基线锚 |\n\n## 二、形状/装饰类\n\n| 特性 | 锚定页 | 备注 |\n|---|---|---|\n| 纯色形状 / 圆角 / 正圆 | 全体 | 基础 |\n| 统一边框 | 02 等 | px→pt(0.5 倍) |\n| 非统一边框逐边细条 | 02、12 | 圆角共存 WARN 锚 |\n| 虚线/点线 dashType | 90-p0-features | dashed→dash,dotted→sysDot |\n| box-shadow 真实参数 | 07-journey-map、data-limit-boundary、90 | 历史缺陷修复锚(行为红线) |\n| 纯旋转 rotate | 90-p0-features、93-p2-sup-sub-geo | origin 居中约束 |\n| data-shape 预设几何 | 93-p2-sup-sub-geo、111(chevron/homePlate)、112(trapezoid+rotate)、116(triangle/trapezoid) | 15 种(白名单 80+) |\n| 不透明度 opacity 折算 | 全体(基础路径) | 形状填充折算 |\n| 内联 SVG 图标(截图) | 110/114/115/117(卡内嵌套)、113(环形箭头) | 2026-08-05;stroke 显式 hex;currentColor→空白(H7 怪癖) |\n| 组 6 图示原型 | 110 图标网格(23)/111 chevron 带(24)/112 漏斗(25)/113 循环(27)/114 辐射(28)/115 色带(30)/116 金字塔(26)/117 对比卡阵(29) | 2026-08-05 第三轮;exemplar 门禁 0/0 |\n| `data-shape=\"pie\"` 扇形(Harvey ball) | **120-harvey-matrix**(唯一锚点) | 2026-08-09;圆饼打分格,与 "}],"languages":[],"docsSourceLabel":"CLAWHUB","editorialOverview":"编写可无损还原为 PPTX 的 HTML 幻灯片。先经引导式访谈确认样式/形式/结构并落盘 deck-brief,再生成完整目录结构(assets/theme.css、slides/*.html、playlist.json), 每页严格遵循 html-spec.md 规范,经 validate.js 预检零 ERROR 后用 convert.js 转成 PowerPoint。TRIGGER when: 用户要求\"做PPT/幻灯片/slides/演示文稿\"、\"把内容做成 HTML幻灯片\"、\"生成可转PPTX的slides\",或调用 /html-slides-to-pptx。DO NOT TRIG Skill: Html Slides To PPTX Owner: cqcmj74 Summary: 编写可无损还原为 PPTX 的 HTML 幻灯片。先经引导式访谈确认样式/形式/结构并落盘 deck-brief,再生成完整目录结构(assets/theme.css、slides/*.html、playlist.json), 每页严格遵循 html-spec.md 规范,经 validate.js 预检零 ERROR 后用 convert.js 转成 PowerPoint。TRIGGER when: 用户要求\"做PPT/幻灯片/slides/演示文稿\"、\"把内容做成 HTML幻灯片\"、\"生成可转PPTX的slides\",或调用 /html-slides-to-pptx。DO NOT TRIG Tags: latest:2.1.0 Version history: v2.1.0 | 2026-08-18T01:14:59.551","editorialQuality":{"score":100,"threshold":65,"status":"ready","wordCount":1698,"uniquenessScore":47,"reasons":[]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-10-11T20:44:41.235Z","emptyReason":"No screenshots, media assets, or demo links are available."},"primaryImageUrl":null,"mediaAssetCount":0,"assets":[],"demoUrl":null},"ownerResources":{"evidence":{"source":"unclaimed","verified":false,"confidence":"low","updatedAt":"2026-10-11T20:44:41.235Z","emptyReason":"This page has not been claimed by the agent owner."},"hasCustomPage":false,"customPageUpdatedAt":null,"customLinks":[],"structuredLinks":{"docsUrl":null,"demoUrl":null,"supportUrl":null,"pricingUrl":null,"statusUrl":null},"customPage":null},"relatedAgents":{"evidence":{"source":"protocol-neighbors","verified":false,"confidence":"medium","updatedAt":"2026-10-12T02:09:41.597Z","emptyReason":null},"items":[{"id":"8ebccd8e-3863-4187-8355-c3f14e1f9edf","entityType":"agent","canonicalPath":"/agent/iofficeai-aionui","slug":"iofficeai-aionui","name":"AionUi","description":"Free, local, open-source 24/7 Cowork app and OpenClaw for Gemini CLI, Claude Code, Codex, OpenCode, Qwen Code, Goose CLI, Auggie, and more | 🌟 Star if you like it!","url":"https://github.com/iOfficeAI/AionUi","homepage":"https://www.aionui.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-10-09T19:11:12.944Z","createdAt":"2026-02-25T03:38:16.584Z","downloads":null},{"id":"b917f68a-ebff-438e-84f8-3f4b2494c0bc","entityType":"agent","canonicalPath":"/agent/activepieces-activepieces","slug":"activepieces-activepieces","name":"activepieces","description":"AI Agents & MCPs & AI Workflow Automation • (~400 MCP servers for AI agents) • AI Automation / AI Agent with MCPs • AI Workflows & AI Agents • MCPs for AI Agents","url":"https://github.com/activepieces/activepieces","homepage":"https://www.activepieces.com","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-15T02:22:12.426Z","createdAt":"2026-02-25T03:38:12.412Z","downloads":null},{"id":"5cb26759-3a39-483f-94cf-276a98c13bb8","entityType":"agent","canonicalPath":"/agent/cherryhq-cherry-studio","slug":"cherryhq-cherry-studio","name":"cherry-studio","description":"AI productivity studio with smart chat, autonomous agents, and 300+ assistants. Unified access to frontier LLMs","url":"https://github.com/CherryHQ/cherry-studio","homepage":"https://cherry-ai.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-11T14:38:40.986Z","createdAt":"2026-02-25T03:38:19.379Z","downloads":null},{"id":"6f6582d0-5d76-4f0f-b81d-86520247950b","entityType":"agent","canonicalPath":"/agent/copilotkit-copilotkit","slug":"copilotkit-copilotkit","name":"CopilotKit","description":"The Frontend for Agents & Generative UI. React + Angular","url":"https://github.com/CopilotKit/CopilotKit","homepage":"https://docs.copilotkit.ai","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-03-25T09:50:57.846Z","createdAt":"2026-02-25T03:39:14.617Z","downloads":null}],"links":{"hub":"/agent","source":"/agent/source/clawhub","protocols":[{"label":"OpenClaw","href":"/agent/protocol/openclew"}]}}}