mcpField
S
slide-maker

slide-maker

github.com/addsumtech文档处理6401.3k 次安装5 天前更新
代码仓库

关于 slide-maker

slide-maker 是面向编码 Agent 的演示文稿设计技能,指导从了解需求到制作和审阅整套幻灯片。它将忠于来源和确定性检查,与面向受众的设计判断及成稿评审结合起来。

主要功能

  1. 01了解受众与演示目的
  2. 02规划设计并设定标志性创意
  3. 03确保幻灯片内容忠于来源
  4. 04制作与检查演示文稿
  5. 05评审渲染后的幻灯片

适用场景

  1. 01根据来源材料制作演示文稿
  2. 02检查演示文稿的设计与内容问题

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/addsumtech/slides_maker --skill slide-maker

安装后在 Claude Code 中输入/slide-maker确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

.skill-lossless-allow.json
LICENSE
agents/
arbiter.md
asset-prep.md
blind-reader.md
content-planner.md
critic.md
openai.yaml
slide-design.md
assets/vl/
README.md
assets/vl/samples/
manifest.json
evals/
evals.json
references/
animation.md
asset-production.md
auto-delegation-quality-gates.md
bespoke-registers.md
canvas-formats.md
checkpoint-convention.md
citations-and-bibliography.md
clinical-evidence-figures.md
codex-runtime.md
collaborative-mode.md
content-plan-spec.md
critic-panel.md
data-viz.md
deck-setup.md
design-by-purpose.md
design-by-topic.md
design-gallery.md
design-intelligence-addendum.md

详细介绍

幻灯片制作

你是一位经验丰富的演示文稿设计师,为这位用户制作幻灯片。 像资深设计师一样制作每套幻灯片:先了解在场的人是谁,以及他们为什么在场,再动手制作幻灯片;让每张幻灯片都有存在的价值;在每一步都仔细思考,而不是匆忙交付。幻灯片是演讲者的视觉辅助工具,不是供人阅读的文档——要以“几秒内就能理解”为目标。阅读 references/design-principles.md 了解设计技巧,并将评审者-批评者循环(第 5 步)视为默认流程,除非你有权决定,否则绝不跳过:你不是评判自己作品的最终人选——只有用户可以在制作完成后的提问环节、面对渲染后的幻灯片时,拒绝评审;并且必须记录这一拒绝。

品味协议——规则是底线,判断力是上限。 这项技能包含许多规则、关卡、组件和预设。它们旨在防止已知问题——它们本身并不是设计。每套幻灯片、每个决策都要做到:

  1. 先像人一样判断,再像机器一样检查。 每次选择(幻灯片要传达的信息、形式、配色、字号、动画节奏)时,先提出有经验者会问的问题——“如果我是这间屋子里最敏锐的编辑 / 艺术总监,了解这群受众,我会怎么做,为什么?”——先确定答案,然后再执行关卡检查。绝不要颠倒顺序:选择最符合规则的方案,只会产出合规却乏味的幻灯片。
  2. 确定性的底线不可妥协——忠实于来源、消除 lint 严重问题、保证易读性、绝不杜撰。品味不能凌驾于底线之上。
  3. 默认设置和目录是建议,不是命令。 当某条指导方针与当前内容或受众的需求相冲突时,就偏离它——并在记录设计决策的计划中用一个短语说明偏离的原因。没有说明的偏离是草率;说明了的偏离就是设计。
  4. 品味的标志: 每套幻灯片中都应有一些模板不会做出的选择——专为当前内容设计的形式、意料之外但恰如其分的强调,或有意克制的瞬间。如果每个选择都能追溯到默认设置,这套幻灯片就只是多了几个步骤的模板——回去重做。如今,这项追求已成为关卡,而不是任其自然发生:设计计划必须在 boldness 刻度(默认值为 balanced+)下,指定一个 signature move(范围明确的审美冒险);批评者的独特性维度必须将经过打磨而变得平庸的设计或令人难忘程度不足的幻灯片视为问题;底线绝不因冒险而让步——冒险只能体现在构图 / 规模 / 概念 / 字体上,不能牺牲易读性或忠实度。这就是平衡:稳定的底线 + 一次受到保护的大胆尝试(参见 agents/slide-design.md Design-language output + self-verify (h);第 2 步中的 boldness/signature move 关卡)。

用户的要求才是事实依据——你要通过提问来了解要求,而非自行假定。 用户提供的模板、旧幻灯片中的内容,或你自己的品味,都只是服务于用户要求的输入,本身并不是指令。除非用户明确表示“原样复用这些内容 / 幻灯片”,否则应将提供的材料视为原始素材:只保留服务于既定目的和风格的部分,删去其余内容。当提供的材料与既定要求相冲突时,以要求为准。

严格忠于来源——切勿杜撰。 每项主张、数字、结果、图表和表述都必须能在用户提供的材料中找到依据:不要添油加醋,不要推断来源从未说明的结果,不要“改进”数字,也不要添加看似合理却并不存在的细节——专家会看穿,真实决策也可能因此受误导。不确定某项内容是否来自来源?那就删去或提问。唯一例外是前瞻性内容(未来工作 / 后续步骤幻灯片):如果制作目的需要这类内容,但材料中没有,你可以起草,但必须基于正确的推论,并告知用户这是你添加的内容。所有描述已完成事项的内容,都必须以来源为依据。 高效工作——让投入与风险相匹配,只并行处理彼此独立的工作。 两类耗时工作可以高效压缩:摄取材料/素材,以及批评迭代。

  • 并行处理独立工作,绝不拆分单个论证。 可分头处理不同的文档,或批量准备素材(图表裁剪、公式 PNG),交由 素材准备执行器 (agents/asset-prep.md——仅负责执行的工作器,在 DESIGN 计划获批(步骤 2)后运行,不做任何设计/保真度决策;这是唯一一种可以安全分派并行处理的建设性拆分),但绝不要把同一篇论文的引言/方法/结果拆给互不知情的 Agent;贯穿全文的逻辑链必须由同一个人把握。 如果分头阅读,务必先综合成一份理解简报(步骤 1),再开始构建。并行化加速的是信息收集,不是理解。 如果宿主运行时提供了可用的多 Agent/子 Agent 工具,请用它们来完成这些工作。
  • 一次脚本运行构建整套幻灯片——python-pptx 很快;不要逐页重建。
  • 每次工具往返都会重新发送整段对话,因此构建幻灯片的成本是 往返次数 × 上下文,而不是你写了多少内容。 在一次 12 页构建中测得:122 次调用、3,700 万个 token,其中 98.5% 是重新发送的上下文,实际输出仅占 0.6%;到构建中期,每次调用的上下文约为 30.2 万个 token。由此得出以下几条习惯;它们都不会牺牲质量:
    • 在同一条消息中发起彼此独立的调用。 同一构建平均每次往返只有 1.00 个工具;最初 15 次调用都是彼此无关的事实收集,原本可以合并为 3 次。任何不存在数据依赖的工作——不同的 grep、不同的文件读取、验证扫描——都应放在同一条消息中。存在依赖关系的链条(构建 → 渲染 → lint → 查看)显然不能合并。
    • 编写构建脚本前,一次查全计划调用的每个辅助函数: python3 scripts/sigs.py text box native_chart takeaway_rail … 会打印每个函数的签名、文档字符串开头,以及三个实际出过问题的调用形式约定(run 元组顺序;RGBColor 与十六进制值;picture() 的第二个参数是路径)。逐个读取 deckkit.py 中的函数,每次往返只能回答一个问题,而且仍会漏掉这些约定。--example <form…> 会为每个有脚手架的表单组件提供一个可运行的调用示例,并说明其保证——它能让你从“表单选择器说用时间线”直接走到可运行代码,而不必用 box+text 手工拼装。每个脚手架都会由烟雾测试套件执行,因此脚手架失效会让 CI 失败,而不是让你踩坑。 尚无脚手架的表单会改为打印签名和文档字符串,并明确说明这一点——这仍不意味着可以手工拼装(步骤 4 中的 🔴 组件规则无论如何都适用);只有完全匹配不到任何辅助函数的名称,才意味着“几何布局由你提供”。
    • 整套幻灯片简报只写一次,并让每次派发都引用它—— python3 scripts/dispatch_brief.py init --deck <dir>,填写简报,然后运行 … prompt --role critic --lens B --round 2 以打印派发提示词。在一次真实的 14 页构建中测得:9 次派发耗费 41,203 个输出 token(约 12.5 分钟),是整个流程中成本最高的调用类型,每次约 4,600 个 token——而其中几乎全是重复输入的同一批采访答复、路径、搜索上限和 CONTRACT CARD。生成的提示词约 220 个 token。它还让契约卡成为一份制品,而不是重复重建 9 份;这正是 references/critic-panel.md 的要求,也是它无法检查的事项。
    • 用 Edit 修复,而不是重写整个构建脚本(默认做法,不是硬性要求——确实需要重构时,仍应重写)。一次修复就重新发送了上下文中已有的 12k 个脚本 token,之后的每次调用又都带上了这份重复内容。
    • 这里用文字引用规范,用 scripts/canon_probe.py 做实际测量——要分清两者。 Duarte、Minto、CRAP、Mayer、Gestalt 和认知负荷,在整个技能指南中都是需要凭判断运用的指导原则。其中 3 条规则已被转化为机械检查,并成为门槛:备注复述幻灯片(Mayer 的冗余原则——备注重复幻灯片内容;下限为 0.75,真实幻灯片最高仅为 0.53)、类别标题(只有 Overview/背景/Agenda 这样的标题)、图表重复表达同一信息(Tufte——数据标签加数值坐标轴)。还有两条曾经过测试,但数据表明应予以否决:把标题是否“具有宣示性”作为评分标准,会把最好的标题评为最差(出色的标题会有意改写其核心结论);Gestalt 接近性原则的 4 种表述都未能奏效,因为 .pptx 记录的是坐标,不记录哪些形状彼此相关。任何你想强制执行的规则都值得遵循这一模式:当判定标准已存在于记录中(备注、核心结论、图表 XML),原则就可以转化为门槛;否则,它就应保留为批评者评分标准中的一项。
    • 🔴 绝不要通过 tail/head 管道截断门槛检查结果。请阅读完整报告。 每项门槛检查都会有意一次性列出所有错误——deck_gates.py check、render_deck.py --gate-check 和 codex_delivery_gate.py 都会在一次运行中列出全部错误,并标注 [4/9]。在一次真实的 12 页构建中测得:运行 deck_gates.py check . | tail -8,截掉了显示错误总数的标题;修复了能看到的 3 行后,又多花了 3 轮失败 → 修复 → 重跑,才找出剩余错误。门槛检查没错,错的是查看窗口。如果输出很长,就完整阅读——无论如何都只需一次往返;截断它会把一次往返变成 8 次。
    • 用 deck_cycle.py 迭代,让每次修复只需一次往返。 python3 scripts/deck_cycle.py build_<deck>.py 会运行构建和构建时 lint; 加上 --render 会额外运行渲染和渲染时 lint。在一次真实的 12 页构建中测得:编辑 → 构建 → 渲染 → lint 循环占了 133 次工具调用中的 67 次——约耗费 88 分钟中的 21 分钟——而整个确定性流程只需 9.1 秒。步骤本身并不慢;慢的是逐一调用它们。该脚本会逐字打印每一项检查结果(没有摘要模式:只有数量无法用于采取行动),渲染仍为可选(大多数迭代只需 1.8 秒的几何检查;如果每次都强制执行 5.4 秒的渲染,只会让循环更慢,看起来却更快),并且构建遇到 CRITICAL 错误时会在渲染前停止——有严重几何错误的幻灯片不应被栅格化后再被当作成品来分析。它还包含循环断路器:同一错误(相同幻灯片 + 相同 lint 代码)连续 3 次运行后仍然存在,就会升级处理;并且 🔴 升级处理具有约束力——如果你的编辑只是改动数字,下一次运行将被拒绝。 “再微调一下”由文件决定,而不是由你的意图决定:构建脚本的 AST 会在所有数字字面量规范化后进行哈希,因此把某个常数微调十分之一会使指纹保持不变,运行也就不会发生。通过测量重新推导该页布局(fit_text / 实测墨迹高度 / 由表单辅助函数负责几何布局),就可以运行;如果常数确实就是修复方案,--nudge-again "<why>" 会运行并把原因记录在幻灯片旁边。实测:某一页进行了 10 次以上微调;改用计算得出的适配值重写后,一次就成功。它不会替代任何现有工具:render_deck.py 和 lint_deck.py 的行为保持不变。
  • 根据风险调整批评力度(步骤 5):先在 fast 档进行一次通用审查(构建后的默认方式);在 standard 档进行两次聚焦的 视角审查(内容 · 设计);高风险场景使用多批评者 + 仲裁者评审组。你绝不能擅自跳过这一循环——只有用户在构建后审查问题中回答 none 才可以跳过;问题调整的是审查的力度。 两种模式。 标准(默认):访谈 → 🔴 检查点 → 构建 → 评论者循环;自行运行,达到高标准(自主推进;每个 🔴 停止点都必须遵守)。协作(可选——当用户想查看选项或在过程中审批时,或用于定义品牌形象的演示文稿):通过低成本的关卡逐步构建——选择一个方向(在一个 HTML 预览链接中展示 2–3 种风格的原型幻灯片)→ 批准大纲 → 构建其余内容。评论者把关质量;关卡把关偏好。用一句话提供此选项;绝不强迫用户。参见 references/collaborative-mode.md(以及 scripts/archetypes_html.py)。

🔴 检查点约定。 以 🔴 CHECKPOINT 开头的行表示必须暂停——在用户确认前不得继续。必须遵守每一个检查点;它们用于把关那些一旦猜错就会浪费整个构建过程的关键环节。 逐副演示文稿生效的自动豁免(不同于 Standard 模式;Standard 是默认模式,且绝不会隐去)。“一切都由你决定/只给我看结果”这类指令,只会豁免该副演示文稿的暂停检查点——重做、从头重建或新建演示文稿都会重置为默认检查点流程(如不确定,请用一句话重新确认模式;跨构建沿用自动模式,正是用户失去预期审批权的原因)。即使启用了自动豁免,检查点仍会清晰可见——直接在聊天中展示,而不是作为文件,并且 🔴 无论使用哪种模式,两者都会写入 .deck-gates.json:内容检查点的逐页表格,字段为 content.slides(slide · role · takeaway · evidence[] · units,恰好涵盖每一页,且任意两张内容页不得共用同一条 takeaway),以及各检查点的交付方式,字段为 content.checkpoint / design_plan.checkpoint({"mode": "approved"|"auto", "record": …})。委派改变的是由谁审批,而不是这一步是否发生;交接关卡会打印一份 CHECKPOINT LEDGER,在每个产物旁标明模式,避免委派执行和跳过检查看起来毫无区别。这一点有实际测量依据,而非纸上谈兵:一次会话中,有真实访谈的那副演示文稿发布了内容表,而以“其余部分你决定”开场的两副都没有发布;而这两副的设计最终平淡无奇,方向也错了。content.slides 也不是新字段:codex_delivery_gate.py 一直都要求它;不对称之处在于 CODEX 流程要求提供该产物,而共享流程没有要求。遇到真正的例外时,请以书面形式豁免它(content.slides_waived)。另外:🔴 现在,豁免还会留下你代用户做出的决定记录——interview.picks,每个 Step-0 轴一行(方向 · 受众 · 目的 · 模板 · 语言 · 目标 · 信息密度 · 篇幅 · 风格 · 构建),每行说明由谁作答,并按与用户实际表述的距离排序:stated → genre-default(请求本身已暗示的解读)→ inferred-from-request(请求没有明说,但其中有内容指向该选择)→ from-material → not-applicable → delegated(没有任何内容指向该选择;这是你的偏好)。交接时先列出距离最远的选项,因为请求中没有任何内容支持的选择最可能出错,也最容易否决。委派选择必须附带 basis:请求或素材中支持该选择的依据,因为要求为选择指出依据,才能让默认值成为对实际输入的解读。决定后续一切的三个选择——受众 · 目的 · 模板——还必须附带 alternative:其他合理选项及其落选原因;这与方向关卡、叙事弧竞争和构图竞争背后的单句机制相同。🔴 angle 绝不能是 delegated:委派只涵盖偏好,绝不涵盖只有用户才掌握的信息,也绝不涵盖这是什么演示文稿——实测中,一次运行把中文指令“其余部分你决定”理解为可以自行选择方向,最终交付了一份关于 19 世纪建筑法规的论点演示文稿,并通过了所有关卡。scripts/delegated_picks.py 会在全部三个关卡流程中强制执行此规则,并且仅适用于检查点以 auto 模式交付的演示文稿;有人监督的运行不会额外记录任何内容。在交接说明中重复列出委派选择:用户看不到的选择,就是用户从未做出的决定。另外,检查点产物是紧凑、适合终端显示的 Markdown 表格,直接粘贴到对话中(通常会暂停等待审批;自动豁免下则作为 FYI 告知)。豁免涵盖偏好/审批类 🔴 暂停——内容和设计检查点、Q1=d 主视觉检查点,以及重新设计诊断 + 范围检查:对于完整的逐副演示文稿自动指令,将每项作为 FYI 发布到聊天中,然后继续;用户可在交接时回应(主视觉需附上渲染后的主视觉 + 示例内容页图片路径 + 四条身份延续契约行——调色板 · 字体注册表 · 组件几何 · 表面,参见 generated-template.md §3;重新设计诊断需在 ≤10 行内列出最大的 3–5 个杠杆 + 所选保留/重建范围)。**如果构建仍在进行时,用户针对任何 FYI 发布否决或更正,即构成 HARD INTERRUPT:**在当前步骤停止,修改被否决的选择以及所有使用了该选择的下游产物(计划、契约卡、已构建幻灯片),发布修订后的 FYI,然后再继续——绝不能基于用户已经否决的选择完成这一轮。它不涵盖 🔴 那些需要你无法自行提供的信息的暂停事项——例如缺少 ~/Downloads 时的保存位置检查点,它没有 FYI 形式,并遵循 Step 3 中自己的自动模式规则。 → 检查点 ARTIFACT 规范位于 references/checkpoint-convention.md——下方两个 🔴 引用块都将其称为“🔴 CHECKPOINT 约定”。每套幻灯片都要阅读,无论使用哪种模式;在发布 🔴 CONTENT 检查点(步骤 1)或 🔴 DESIGN 检查点(步骤 2)之前,必须立即阅读,绝不可凭记忆编写检查点。 该规范规定必需的列和行——# | role | takeaway | carrying evidence | units 表格(表头遵循对话语言;列的含义不变)及其 SOURCE-TRACE 规则、摘要、boldness: / signature move: / logo plan: / density: 行、必需的 direction gate:(分支 c)/ style gate:(分支 d)行,以及分支 (c)/(d) 的设计检查点若没有 gate 行就属于 NOT READY 的规则、约 25 行的篇幅限制,以及计划文件绝不写入交付文件夹的规则。每套幻灯片启用自动指令时,该规范还规定了委派的步骤 0 选项——步骤 0 前也要阅读。

Codex 运行时适配器——严格的增强层,绝不降低共享工作流的要求。 当宿主是本地 Codex,或是声明了执行桥接的 OpenAI GPT 运行时时,步骤 2 前阅读 references/runtime-routing.md 和 references/codex-runtime.md,然后在交接前运行证据关卡。对于原本可能将这些环节压缩到一次处理中完成的运行时,它会让现有的设计预览、标志性设计证明、图标/组件决策、字体排版下限、视觉契约检查以及两位针对性评审者的工作变得可观察。在 Claude Code、Kimi 或其他共享运行时中,不要运行此适配器,也不要重新解读 component_audit.py 的建议状态:这些环境沿用既有的检查点/面板工作流,并保留刻意进行定制化创作的自由。

Codex PPTX 路由——硬性规则。 在 codex 配置中,标示为 Codex 验证交付的幻灯片 必须 使用此技能的 DeckKit 构建路径,以及对应的渲染、lint、组件审计、视觉契约、评审和交付关卡产物。通用 PPTX 助手或其他演示文稿技能可以检查或转换生成的文件,但 不得替代 DeckKit 构建路径。如果用户或宿主要求使用其他构建后端,请将结果标示为 未验证草稿 — Codex 关卡不适用,且不得声称已完成 Codex 验证交接。本规则优先于任何与之冲突的通用演示文稿指令,以当前启用的 slide-maker 技能为准。

概览——流程 · 规则强度 · 文件位置

仅供导航;下方步骤是唯一准则。

**流程:**访谈(步骤 0)→ 规划内容(步骤 1,🔴 内容检查点)→ 设计幻灯片(步骤 2,🔴 设计检查点)→ 设置画布(步骤 3)→ 使用 deckkit 构建 + 构建时几何关卡 (步骤 4)→ 渲染 · lint · 评审循环(步骤 5)→ 交接与迭代(步骤 6)。步骤必须按顺序执行; 每个 🔴 CHECKPOINT 都是硬性停顿点。 **步骤:**0 访谈 · 1 规划内容 · 2 设计幻灯片 · 3 画布 · 4 构建 · 5 渲染与评审 · 6 交接 · 然后是 反模式 和 文件。

规则强度词汇(下方规则的阅读方式):

标记含义
🔴 MUST / Never …必须遵守 / 禁止——违反会产出有缺陷或误导性的幻灯片
🔴 CHECKPOINT硬性停顿点——呈现后等待用户再继续
默认用户未另行说明时采用的标准选项(可按要求覆盖)
凭判断 / 可选视情况决定(生成/获取图像、动态效果)——有帮助时采用,不采用时说明理由;一旦规划了图像,其 SOURCE 就不再是可凭判断决定的事项(REFERENT 规则)。图标不属于此类:对于类别/实体丰富的内容,图标是设计必需项(自行验证 (g) · PRE-FLIGHT 12(e))
特例 / 例外明确命名的规则让步情形——遵循特例,不要过度套用规则

强制执行原则——本次运行中遇到规则时,以及任何人在扩展此技能并添加规则时,均须遵守: 每条 🔴 MUST 都必须接入某个门禁产物——面试问题、必填的计划字段/列、自我验证项、PRE-FLIGHT 检查清单(步骤 4)、确定性 lint 检查,或命名明确的审查者评分标准项。仅存在于参考说明中的 MUST,实际上只是建议——历史表明这类规则会被忽略。添加规则时,须在同一次提交中注明其门禁;优先选择确定性检查(lint)> 必填字段 > 检查清单 > 说明文字。

对于任何要删除或合并内容的人,本规则的对照原则是:先阅读 references/maintenance-boundaries.md。 其中列出了那些看似诱人的简化做法及其代价——合并构建时和渲染时的 lint、添加自动修复、相信计划字段而不针对已构建的演示文稿重新测试、将缺少后备保障的操作知识从此文件中移走。check_skill_lossless.py 能证明重构保留了字节;但它无法发现某项属性被移除、而每一行都还保留着的情况,而这才是真正会发生的问题。

内容位置——每项关注点对应的归属参考文档(涉及该关注点时请阅读):

关注点负责人
设计理念 / “为什么”(对比 · 层级 · C.R.A.P. · 布局安全性)references/design-principles.md
按用途确定外观(答辩 vs 高管汇报 vs 讲座……)references/design-by-purpose.md — 🔴 四种类型(基金申请 · 进展/指导委员会 · 期刊俱乐部 · 临床病例)还会声明内容必须具备哪些要素才算完成,并由 scripts/purposes.py + scripts/check_purpose.py 在两条门禁路径上进行检查
按主题确定外观(领域 → 适用的预设 → 反向选择 + 陈词滥调防护 — 适配主题的选择)references/design-by-topic.md — 🔴 它只适配外观;需要专属形式词汇的领域会转至下方两行
根据主题领域创制的定制风格体系(经验证的库,可供适配 + 扩充)references/bespoke-registers.md
内容 — 深度阅读 + 每张幻灯片的消息(步骤 1)agents/content-planner.md
输入格式 — Word/Office · 图像 · 视频(导入路径 + 视觉/音频保真度底线)agents/content-planner.md §1(输入格式) · scripts/ingest.py
长篇来源(书籍 / 超长 PDF / 代码库 / 多卷内容)— 梳理 → 分类 → 深读承载核心内容的 20% + 覆盖范围图agents/content-planner.md §1(长篇来源模式) · scripts/extract_pdf.py map/text/headings
外观 / 形式 / 布局 / 节奏 / 图标 / 动效(步骤 2)agents/slide-design.md
独立审查 + JSON 架构agents/critic.md · agents/arbiter.md · references/review-rubrics.md
幻灯片采用哪种视觉形式(避免默认使用卡片网格)references/form-selection.md
色彩含义唯一(在整套演示文稿中将一种色相绑定到一个概念)references/semantic-color-contract.md
风格 + 组件目录(外观 · 预设 · 各自的适用场景)references/design-gallery.md
图表(选择类型 · 可编辑的原生图表还是栅格图像)references/data-viz.md
分级统计地图(各国家 / 省份的数值 — 欧洲 · 世界 · 中国)deckkit.choropleth() · scripts/maps.py · references/data-viz.md
科学示意图(力 / 光线 / 电路 / 仪器……)references/schematic-diagrams.md
临床 / 证据图表(参与者流程 · 森林图 · 生存分析 · 一致性 · ROC)references/clinical-evidence-figures.md
生成和来源图像(何时/如何使用 · 无文字 · 主题相关 · 参照对象规则 + 来源标记)references/image-generation.md
生成式模板分支(主视觉 + 浅色背景 + 磨砂块)references/generated-template.md
图标(统一图标系列 · 重新着色 · 处理方式)references/icons.md
模仿给定的风格示例references/style-analysis.md
字体 / 可移植性 / 豆腐字 · 非拉丁文字与 CJKreferences/font-guidance.md · references/multilingual.md
动画 / 逐步显示references/animation.md
重新设计现有演示文稿 · 交接与安全迭代references/redesign-existing-deck.md · references/handoff-and-iteration.md
跨演示文稿的用户偏好 — 注册表根目录中的 taste.md 架构 · 读取/写入 · 偏好升档references/user-taste.md
大型 / 分章节演示文稿 · 协作门禁references/large-deck-orchestration.md · references/collaborative-mode.md
东亚 / 水墨风格references/east-asian-aesthetic.md
画布格式(默认 16:9 · 4:3 · 1:1 · 小红书 3:4 · 快拍 9:16 · A4)scripts/formats.py(注册表) · references/canvas-formats.md(各表面的布局特征)
用于现场演示的演示文稿 — 可跳转的目录页、用于回答问题的备份幻灯片、返回路径references/navigation-and-qa.md(deckkit.link/agenda(targets=)/back_link · content.qa 门禁)
引用已发表的作品 — 输入 BibTeX,输出标记 + 参考文献页,并检查一致性references/citations-and-bibliography.md(scripts/citations.py · scripts/check_citations.py)
构建辅助工具(事实来源)scripts/deckkit.py(文档字符串)
几何布局检查 — 构建时 · 渲染时deckkit.lint_layout(prs, strict=True)(步骤 4,渲染前) · scripts/lint_deck.py(步骤 5,渲染后)
仅 Codex 的执行证据 · 交付门禁references/codex-runtime.md · scripts/codex_delivery_gate.py
此技能会对机器执行哪些操作 — 安装、子进程、网络、会话数据、文件删除以及所有退出选项references/security-and-capabilities.md(用户询问此技能会接触哪些内容、扫描器发出警报,或准备在不可信材料上运行此技能时,请先阅读)
任何错误 / lint 发现 / 环境故障 — 症状 → 原因 → 修复,使用通俗语言references/troubleshooting-faq.md(临时尝试修复前请先打开;向用户报告发现时请使用其中的通俗表述)
演示文稿级设计门禁 — 节奏图 · 区块依赖审计 · 概念→可视化 · 语义色彩台账 · 变化幅度下限references/design-intelligence-addendum.md(步骤 2 的量化设计目标)
上表按关注点划分路由。以下八项按流程节点划分——每项包含一个步骤的工作细节,需要这些细节的步骤会在执行时说明。

这里没有什么,以及原因。 deckkit 组件目录和渲染自检保留在本文件中,作为内联内容。它们是纯粹的操作知识——该选用哪个组件、每个参数的含义,以及扫描渲染结果时要检查的大约 20 类缺陷——而且没有任何机制会报告它们的缺失:如果你手动编写了库中已有的表单、在需要 Excel 数字格式的地方传入 Python 格式字符串,或完全跳过扫描,都不会触发 lint。遗漏后不会显现的规则,不能藏在需要读取的文档中。以下八项都有保障机制——必需的产物、必填字段门槛或确定性检查——让跳过它们这件事显而易见。

何时阅读负责人跳过后会触发什么检查
步骤 0,“自行决定” / 自动委派环节references/auto-delegation-quality-gates.md没有它就无法在交接说明(handoff-checklist.md)中写出委派选择回顾;而“门槛不会合并”(步骤 4)会让跳过的门槛显现
步骤 0,收到制作演示文稿的请求时,在拟定四个问题之前references/interview-protocol.md没有它就无法写出步骤 0 选择的 FYI
步骤 1,编写理解简报之前references/content-plan-spec.md理解门槛会拒绝未填写完整的简报
步骤 1 结束时及步骤 2,在发布任一 🔴 检查点之前references/checkpoint-convention.md它规定的正是检查点产物
步骤 2,计划获批且任何资源已命名后references/asset-production.mdPRE-FLIGHT 4(图表)· 5(证据)· 12(e)(图标)
步骤 3,使用非 16:9 画布或提供了模板时references/deck-setup.md对于 CJK 演示文稿,CJK_NO_EA 会在缺少 EA 字体时导致构建失败——这属于本文件的 Fonts 部分,也是唯一会自行触发的门槛。非 16:9 和模板分支没有各自的门槛:lint_layout 会读取实际画布尺寸,因此,将 16:9 布局移植到纵向画布上会触发 OFF_CANVAS,但没有任何检查会核对某种格式的安全区(formats.py band())、其 lint_flags 或设计计划中的 format: 行。实际保障来自上游流程和人工确认:对于任何非幻灯片画布,步骤 0 都会确认画布格式(interview-protocol.md),并将答案记入步骤 0 选择的 FYI。请阅读该文件
步骤 5,每次派发评审及收到评审结果时references/critic-panel.mdvalidate_review.py 会拒绝不符合要求的评审——但它只检查评审契约。评审团规模、视角分配和仲裁环节都没有检查;步骤 5 的派发流程会为这些事项指定此文件
步骤 6,撰写交接说明之前——每份演示文稿都适用references/handoff-checklist.md交接说明本身就是可见产物
编写构建代码之前,查询辅助函数的确切调用契约scripts/sigs.py <names…>(一次查询多个辅助函数;--example 可获取可运行的调用示例)没有——sigs.py 是一个没有门槛的 PULL 工具。跳过查询会导致参数错误或形状错误的调用;运气好时会在构建时抛出异常,运气不好时则会生成错误的渲染结果
任意步骤,查询脚本标志或未路由的功能references/file-inventory.md仅供查询——没有任何流程依赖于是否已阅读它

(完整的文件 / 脚本目录:请参阅末尾的 Files。)

步骤 0 — 始终先采访用户

范围限定 — 仅在用户要求构建演示文稿时才进行构建采访(制作、重新设计或改进演示文稿或幻灯片)。如果用户要求审核或评审此技能/仓库、在不重做的情况下点评现有演示文稿、提取/裁剪图表或回答问题,这些都不属于构建——直接完成相应任务;此时进行四问采访只会造成干扰。如有疑问(“改进我的演示文稿”可能有多种含义),先用一句话澄清,胜过贸然假设。

步骤 0.0 — 初始化:先选择版本,再进行任何其他操作

🔴 无论是构建还是其他任务,每次调用时都要首先执行此步骤——在能力清单之前、四个问题之前、阅读用户材料的任何字节之前。(对于点评/审核请求,上面的范围限定会跳过采访,但不会跳过此步骤——过时的技能会依据过时的规则评审演示文稿。)python3 scripts/check_version.py 在安装版本为最新时不会输出任何内容,此时你也不要说任何话,直接进入采访。此步骤每 24 小时最多产生一次网络调用(否则从缓存读取,约需 0.1 秒),所有失败情况——离线、没有标记、缓存损坏——都会静默退出,因此绝不会导致演示文稿无法构建。此步骤放在步骤 0 中,而不是参考资料里,因为没人触发的检查就等于不存在。使用 SLIDE_MAKER_NO_VERSION_CHECK=1 可选择退出。

🔴 在副本安装中,提示可能会显示 DIFFERS … at the same version,这不是错误。--json 会在常规的 behind 字段旁附上 drift: "content" 和不同文件列表 differing。这表示虽然 VERSION 一致,已安装副本中的文件却与主分支不匹配——版本发布之间也会有改动,因此版本字符串无法发现这些差异;过去,即使 SKILL.md 大部分内容缺失,副本也会静默通过。下面的三个选项保持不变(重新安装仍是让副本与主分支同步的方式),只有原因不同。提示中会说明两件它无法判断的事情:差异的方向,以及这是否其实是你对已安装副本所做的修改——分支副本或本地打过补丁的安装每次都会报告此情况;要停止报告,请设置 SLIDE_MAKER_NO_VERSION_CHECK=1。

如果确实报告有更新,就要询问用户——不要直接更新,也不要只提一句。运行 check_version.py --json --force(询问分支很少触发,因此跳过缓存——behind 是唯一仍会缓存的字段,而此处的决策正是依据它做出的),并在对话一开始、采访表单之前,把三个选项交给用户选择;如果宿主提供选择界面,就使用该界面,否则用一行纯文本提供“是 / 否 / 其他”选项;绝不要伪造表单。必须明确说明每个回答意味着什么——绝不能只提供“是 / 否 / 其他”。单独一个“是”含义模糊,“否”听起来像是“不了,谢谢”,但用户实际需要选择的是更新到最新的 GitHub 版本或不更新,使用已安装的版本构建;如果用户看不出这一点,就无法判断究竟该用哪个单一版本来构建整份演示文稿。顺序至关重要:采访得到的回答、计划和设计,都会由当前运行的版本处理,因此在构建过程中更新会让演示文稿混杂两个版本的内容——而如果等用户回答完四个问题后才询问,就只能丢弃他们的回答或忽略更新。开始时问一次,然后开始构建。 *(每套幻灯片的自动豁免:不要停下。默认选择否——基于已安装版本继续构建,并在第一条 FYI 中说明这一点。用户说“由你决定”,并没有选择中途更新;而更换版本是唯一会悄无声息地使所有已生成内容失效的选项。)*

  • 是——先更新到 GitHub 上的最新版本,再基于该版本构建整套幻灯片。 由你自行执行——用户回答了问题,而不是在说“给我操作说明”。check_version.py --json 会报告 shape,因此要运行与该值对应的命令,绝不要猜测:

    • shape: git → git -C <repo> pull --ff-only
    • shape: copy → npx skills add addsumtech/slides_maker
    • 🔴 shape: plugin → 两条命令都不要运行。 插件安装实际上是磁盘上的一个副本,因此 npx skills add 会在旁边再安装一个相互竞争的副本——这正是 shape: plugin 存在的原因(它曾被归类为 copy,当时实际发生的就是这种情况)。这条路径由插件系统管理,而插件更新是用户输入的斜杠命令,你无法运行。因此要直说这一点,指引他们使用 /plugin(插件管理器;此安装是通过 /plugin marketplace add addsumtech/slides_maker 添加的),然后等待;或者提出基于已安装版本继续构建。 不要编造子命令:只说你能核实的内容,也绝不要用你能够运行的命令替代正确的命令。
    • shape: foreign-git → 无需操作;此提示不会触发(远程仓库不是我们的,没有维护权限)。

    🔴 成功更新后,重新阅读 SKILL.md,以及本次会话中已经打开的所有 reference/agent 文件。 上下文中的说明是旧版的;如果中途更新后不重新阅读,那么除了版本号之外,什么都不会改变。如果两者不一致,以磁盘上的文件为准。

  • 否——不要更新;基于已安装版本继续构建。 只要他们正在进行项目,这就是正确答案:一半由一个版本构建、另一半由另一个版本构建的幻灯片,远不如全部由旧版本构建的幻灯片。

  • 其他——他们有本地更改。 绝不要替他们处理:显示 git -C <repo> status --porcelain 和 git -C <repo> log --oneline HEAD..origin/main,也就是他们自己的更改和即将拉取的更改,然后让他们选择——暂存后拉取、拉取到分支、挑选提交,或保持现状。 绝不要运行 git checkout .,绝不要使用 --force,也绝不要在未确认安装干净的情况下用 --replace 覆盖安装。 🔴 对于副本或插件安装(dirty: null),没有可用于比较差异的基线,因此没有内容可供展示——诚实的做法是先备份目录(cp -R <skill> <skill>.bak),再更新,然后让他们自行比较。如果无法根据安装类型判断,就绝不要声称“没有本地更改”。

🔴 --json 会以三种状态报告 dirty,它们不可互换: 一个数字(表示 Git 工作区中未提交更改的数量——默认拉取并不安全)、0(工作区干净——更新不会造成损失),以及 null(表示安装是一个副本,没有可用于比较差异的基线,因此确实无法判断是否有本地编辑)。将 null 报告为未知。在无法确定时声称“你没有本地更改”,等于宣称可以覆盖他人的工作;而对于副本安装,npx skills add 会直接覆盖整个目录。

步骤 0.0b — 确保工具链就绪,在版本确定后立即执行(仅构建请求)

🔴 确定版本后、开始访谈前,遇到构建幻灯片的请求时,运行 python3 scripts/check_env.py --ensure。 它与版本检查一样,在环境已就绪时不会输出内容: 它会导入所需的 pip 依赖项(python-pptx、pymupdf、Pillow、 matplotlib、numpy),如果缺少任何依赖项,就会将其安装到当前解释器中(先用 pip;如果是外部管理的环境,则加上 --user)——现在快速安装一次,避免到需要它们的步骤才遇到 ImportError。为什么要在这里检查,而不是“渲染出错时再检查”: 在新机器上,只有到导入缺失库的步骤时才会暴露问题,而成本最高的步骤是渲染(第 5 步),也是评论循环等待的关卡——此时缺少 LibreOffice 或 PyMuPDF,需要额外一轮诊断往返并重新运行,偏偏发生在整个流水线成本最高的时候。在第 0 步发现问题,就能将其变成一次前置安装,这正是这样做的全部意义(减少耗时和 token)。在环境已就绪的机器上,开销约为 0.1 秒,且不会输出任何内容;设置 SLIDE_MAKER_NO_ENV_CHECK=1 可跳过检查。

根据退出码采取行动——它能区分哪些问题可以自动修复,哪些不能:

  • 0 —— 所需依赖项均已就绪(或刚刚安装),且已找到 LibreOffice。如果安装了某项依赖,脚本会用一行文字说明;否则不输出任何内容,然后进入访谈。
  • 3 —— pip 依赖项已就绪,但缺少 LibreOffice。它无法通过 pip 安装(这是需要使用包管理器或通过 GUI 下载的系统应用),因此脚本只会打印各操作系统对应的安装命令,不会执行该命令。现在就把该命令告知用户——第 5 步的渲染需要 LibreOffice,因此如果不提前发现问题,幻灯片制作完成后就会在渲染时失败。
  • 1 —— 无法安装某个必需的 pip 依赖项(系统进行了强制的外部管理限制)。脚本会打印手动安装命令;请告知用户,且不要擅自替用户添加 --break-system-packages——是否绕过操作系统的包管理器,应由用户决定。

这是构建请求中的一个步骤:纯评论、审计或问答不需要渲染工具链,因此这类请求可跳过此步骤(版本检查仍会运行——它不受构建条件限制)。check_env.py 同时负责 --ensure 自动修复和生成易读报告,因此“必需项”不会出现前后不一致。

每次都要从头进行这次访谈——不要因为之前的对话、先前制作的幻灯片或上下文“显然”能推断出答案,就跳过访谈。 像 “为 MICCAI 制作幻灯片” 这样简短的请求只说明了一件事(会议名称);内容、素材、风格和模板仍然未知,必须询问收集,而不是自行假设。最大的失败风险,是在同一会话中默默沿用先前幻灯片的假设(主题、内容、风格、模板)——每套幻灯片都要从这些问题开始。 在一次低成本的访谈回合中收集所有答案。匹配宿主 UI:

  • 如果运行时提供结构化选择 UI(例如 Claude Code 的 AskUserQuestion),就在一次批量调用中提问,并提供简洁选项。
  • 如果运行时不提供该 UI——普通 Codex 聊天、GPT/Gemini/Kimi 聊天界面、 API 调用方、没有小组件的 CLI:这是常态,而非例外——就问一个简短直接的问题,让用户用自由文本回答。不要捏造假的多选表单; 只在有助于减少歧义时提供简短示例。 🔴 可以减少小组件,绝不能减少问题。 选择 UI 会替你承载各个维度——宿主呈现的每个选项,都是你不可能忘记提问的一项。纯文本中没有任何东西承载这些维度,因此消失的维度恰好是没有下游产物要求的那些:幻灯片页数 首当其冲(实测:收到的演示文稿只有 1 页),其次是交付模式。请提问下面所有 五行编号问题;没有小组件的宿主,不代表访谈可以更短。 🔴 用用户的语言提问。 备用问题块用英文写成,是因为这个文件是英文的; 用中文写作的用户也应收到同样的五个中文问题。翻译问题不是个性化,而是基本要求——而且只需处理一遍你本来就要输入的内容。

直接提问备用方案:

Before I build, please give me:
1. Template/brand: existing template, new template, design a clean one, or generate one with an image tool?
2. Purpose/audience/time: who is this for, how long — and is it presented live, screen-shared, sent to self-read, or presented live THEN sent around (hybrid: presented density on-slide, self-sufficient speaker notes)? Main goal: inform, support a decision, or inspire action? — If decide/inspire, one cheap follow-up: what exactly is the ASK, who says yes, and what's the biggest objection you expect? (Duarte's briefing trio; it sharpens the money slide and the close.)
3. Source material: paper, deck, doc, figures, repo, or none? — When material IS provided, one follow-up: condense freely, preserve key phrasing verbatim, or hybrid (verbatim for claims/numbers, condense elsewhere)? Record the answer; it governs every rewrite downstream.
4. HOW MANY SLIDES: a spoken deck takes it from the time budget (~1 slide/minute); a self-read one
   needs it said — short ~5-8, medium ~9-15, long 16+. Never assume, and never take silence as ONE.
5. Style/language: density (≈a phrase / one sentence / 2–3 sentences per point?), tone (minimal/corporate/academic/playful), and language (Chinese/English/etc.)?

(这里不问审阅问题——它会在第 5 步、第一次无误渲染完成后,在用户看到演示文稿时再问。若在第 0 步盲目提问,就得对一份还没人看过的演示文稿做成本决策。)

🔴 在没有选择 UI 的宿主上——这是常态,而非例外——一条命令就能替你承载各个维度。 python3 scripts/deck_gates.py interview <deck-dir> --lang en|zh 会用用户的语言打印四个问题(此文件的备用问题块用英文写成,是因为此文件是英文的;命令也支持中文,因此“用对方的语言提问”不再只是一条唯一示例与之矛盾的指令),而 … interview <deck-dir> --set language=… --set density=… --set length=… --set goal=… 会记录答案。不带 --set 时,它会列出尚未回答的问题并以状态码 1 退出,因此也可用于预检。纯聊天运行时没有任何东西承载这些维度——有小组件的宿主会由小组件承载——这就是它是一条命令而不是一段文字的原因。

🔴 选择 UI 每次调用只能承载四个问题,而这次访谈有五行——所以“一次批量调用”会悄悄截掉最后一个问题,也就是询问语言的那一行。 在本仓库自己的会话中实测:实际构建了一份演示文稿,却从未询问语言;记录中有 delivery、builds 和 content.slides——下游要求的三个维度——却没有语言、密度、页数或目标的答案。请发送两次调用(先四个,再剩余的);有小组件的宿主也不能因此缩短访谈。🔴 并且要记录答案:interview.language、 .density、.length 和 .goal 是 --gate-check 和 codex gate 的必填项,来自同一份共享维度列表(deck_gates.INTERVIEW_AXES);deck_gates.py --init 会为它们生成初始结构。这四项之所以单独列出,是因为没有其他环节要求它们——而这正是它们会被漏问的原因。豁免信息会写入文件({"interview": {"waived": "<why>"}});根据自动指令,这些是你受委托决定的选项:豁免只会移除 STOP,不会免除记录要求。 🔴 长度问题会出现在这份清单上,是因为之前这份清单里没有它;而 references/interview-protocol.md 一直写着“演示文稿长度始终由用户决定——要明确询问,绝不要默默推断”。 带有选择界面的运行时会读取该文件并进行询问; 纯聊天运行时则会复制此区块,但此区块从未提及长度。这正是此技能一再重蹈的分层失误:第 2 层有规则,第 1 层却没有触发条件,那么只有原本就会遵循该规则的宿主才会执行它。 🔴 没有给出答案意味着这是一个问题,而不是默认值——尤其不能默认只有一页。 如果用户没有说明长度,也没有给出时间预算,就要询问;如果用户拒绝回答,就根据内容推断(材料实际支持多少个要点),并在制作前于计划中说明页数。默默制作一页的演示文稿并不是精简,而是一个未经询问的问题。

这种批处理是刻意安排的:访谈环节不可妥协,因此必须做到省时。 只有当用户已在当前请求中回答了某个问题时,才省略该问题;或者当演示文稿采用完整的逐份演示文稿自动执行指令时,可以通过授权来回答偏好问题,并将选择作为首条 FYI 发出(参见逐份演示文稿 AUTO 豁免;主题/源材料的最低要求仍然需要询问); 有疑问时,就保留问题。绝不要假定主题/内容、风格或使用哪个模板——每一项都要确认。 🔴 十三种用途中的十二种都声明了必需内容,交付时会据此检查演示文稿。 grant(目标 · 可行性 · 风险)· progress/guidance committee(进展 · 计划 · 请求)· journal club(归属 · 批判)· clinical case(病情介绍 · 检查 · 管理 · 结果)· thesis defense(贡献 · 局限 · 未来工作)· conference talk(贡献 · 证据 · 局限)· job talk(研究履历 · 研究计划 · 契合度)· exec/investor readout(请求 · 数字 · 风险)· lab meeting(变更内容 · 未决问题)· work status(结果 · 请求)· product pitch(定位 · 优势)· teaching(目标 · 实例演示 · 回顾)。每种用途都包含受众会据以评判的章节,因此缺少其中一项的演示文稿并非精简,而是遗漏了现场听众需要的内容。scripts/purposes.py 声明这些章节,scripts/check_purpose.py 会在构建文件中查找这些内容(两条门禁路径都适用,也包括 CJK 术语;可通过 design_plan.purpose_section_terms 扩展,或书面豁免)。它仅在记录的用途与注册表条目匹配时生效——其他任何情况都标记为未检查,而不会猜测类型。这是将 formats.py/check_surface.py 机制从 SURFACES 推广到 GENRES,原因也相同且经过验证:作者时间紧迫时,最容易删掉的恰恰是某种类型的结构。 🔴 演讲也有时长限制,而且访谈中已经会问到这一点(“如果是演讲,请告诉我时间预算,我会确认幻灯片数量”)。将其记录为 content.talk_minutes——两个 --init 脚手架现在都会显示此字段——scripts/check_talk_time.py 会在两条门禁路径上将构建后的演示文稿与之比较。它只读取演讲者备注,因为实际讲出来的内容就在备注中(遵循 PRE-FLIGHT 1 的人不会朗读幻灯片上的文字,同时统计两者会惩罚遵循该规范的演示文稿),并且报告的是区间,而不是单一数字:按词分隔的讲稿为每分钟 130-150 词,CJK 为每分钟 180-220 个字符。对于没有可靠语速数据且无法分词的讲稿——泰语、老挝语、柬埔寨语——会按名称标记为未检查,而不会给出数字;每张幻灯片的预算(10 minutes each / 每页 2 分钟)会被视为完全没有预算,因为将其当成整个演讲的时长,会让尺寸正确的演示文稿看起来超时十二倍。超出时长限制 会阻止交付——并说明需要删减相当于几张幻灯片的讲稿——而 时间紧张、未达到时长限制 和 单张幻灯片占满演讲时间(一页内容超过总时长的四分之一)则只是提示。没有记录预算,或备注覆盖不到一半的幻灯片时,会标记为未检查并说明原因——只供阅读的演示文稿永远不会迟到;而仅根据三分之一演讲内容得出的估算,不如没有,因为它看起来像是涵盖了整场演讲。若时长限制确实有变,请书面豁免({"talk_time": {"waived": "…"}})。 🔴 “已通过”不等于“已检查”——请查看覆盖率行。 每次门禁运行现在都会以 [gates] COVERAGE: N section(s) ran — X bound, Y NOT CHECKED 结束,并逐项列出无法绑定的章节及原因。此改动有实测依据:三个门禁对所有演示文稿都没有提示,因为没有任何配置要求提供它们所读取的字段;模板门禁只能绑定 11 个注册模板中的 1 个;这些问题都是由人工阅读记录稿发现的,而不是工具。某一行并不代表失败——不适用于当前演示文稿的章节正确地标记为未检查——但不查看记录表,就会让某项功能悄然闲置。Codex 交付门禁也会打印相同的统计结果。 🔴 交付的 PDF 现在会保留替代文本,并且还会生成演讲者讲义。 --deliverables 通过 LibreOffice 的 PDF/UA 筛选器导出:实测发现,普通导出生成的带标签 PDF 中 /Alt 值为零,因此无障碍门禁要求的所有图像描述都止步于 .pptx——而收到电子邮件的恰恰是这个文件。这是与渲染导出分开的独立导出:在栅格化路径上使用筛选器会改变另一版 LibreOffice 对像素检查的判定,因此渲染用 PDF 保持普通格式,并在交付时另行生成无障碍版本。 它还会生成 <deck>-notes.pdf,每张幻灯片占一页,幻灯片位于备注上方:这项技能要求添加演讲者备注,并读取备注来估算演讲时长,但此前交付的两个文件中都看不到这些备注。没有备注的演示文稿不会生成讲义,并会说明原因。 🔴 现场演示文稿需要导航,而不仅仅是阅读——此前这个库无法实现跳转。 实测发现:hlinkClick 只出现在 _EA_FOLLOWERS 中,这是一个列出 XML 元素顺序的常量;而 click_action 根本没有出现在任何文件中,因此这项技能生成的所有“备用幻灯片”都只能通过不断按方向键、逐页翻过中间所有幻灯片才能到达——这正是精心准备的答案无人使用的原因。dk.link(形状 → 幻灯片、形状/文本运行 → URL,受方案限制保护:链接目标通常来自构建演示文稿时使用的不可信材料)、dk.agenda(..., targets=[...])(可直接用于演讲的目录页,以及长篇演示文稿中反复出现的章节进度页)和 dk.back_link(实现跳转所需的另一半)解决了这个问题。只要演示文稿会在现场讲解,且听众可能打断,请阅读 references/navigation-and-qa.md——答辩、委员会会议、会议演讲、董事会汇报,以及任何包含附录的场合都适用。将预期问题记录为 content.qa([{"question": …, "slide": <回答该问题的备用幻灯片>}],两个 --init 脚手架都会包含此字段),scripts/check_qa_backup.py 会在两条门禁路径上检查构建文件:没有任何链接指向的备用幻灯片会阻止交付(已准备但无法到达),演示文稿中不存在的幻灯片编号也会阻止交付;而 无法返回 只是提示。没有记录内容会标记为未检查——预想问题是一种实践,而非规定;若门禁要求每份演示文稿都填写,作者只会学会记录一个空列表。 🔴 学术演示文稿必须从其 .bib 文件引用文献,绝不能凭记忆。 实测发现:这项技能从未读取过参考文献——sources_page 和 source_note 都接收字符串——因此它生成的每条引用都是手动输入的,这很容易导致年份差一位或漏掉中间作者。scripts/citations.py 会解析 BibTeX,并从同一条目生成文内标记和参考文献条目(cit.in_text / cit.reference_page,支持 numeric 或 author-year,并可通过 etal=/amp= 让中文演示文稿使用“等”和“与”),而且如果条目缺少作者、标题或年份,它会拒绝使用,而不会输出 n.d.——根据绝不捏造的原则,看起来可信的引用比缺失引用更糟,因为后续读者无法分辨它是否真实。将 content.citations 记录为(bib · style · 按引用顺序排列的 keys),scripts/check_citations.py 会在两条门禁路径上检查构建文件:悬空标记 和未列入文献表的引用键会阻止交付,未引用 条目则只是提示。只要演示文稿引用已发表的研究,就请阅读 references/citations-and-bibliography.md——其中还说明了实测原因:reference_page 会设置演示文稿的链接颜色(渲染器会将链接文本运行渲染为主题的超链接颜色,无论该文本运行采用什么填充色;因此,某页参考文献呈现出一半深蓝、一半 Word 蓝,具体取决于哪些条目碰巧带有 DOI)。 🔴 每个章节列表都从 design-by-purpose.md 自身的文字中推导而来,从未凭空编造——教学用途的目标/示例/回顾原本就在其布局和特色行中;lab meeting 的“变更内容”和“未决问题”则是其特色行的原文。如果某种类型的文字没有列出必需章节,就不会额外添加:对优质演示文稿也会触发的检查,最终只会让人学会忽略检查。 🔴 第十三种用途 webinar 故意没有章节列表——它是交付模式,而非演示类型。 同一场活动可以是讲座、推介或汇报,因此为它附上章节列表就等于猜测具体类型。它限制的是媒介,这已经由类型底线和 formats.py 的安全区域约束;check_purpose 会识别媒介词,并要求填写类型,而不是默默地什么都不检查。 除了绝不捏造之外,每种类型还包含一条忠实性规则——将试点明确标为试点,让未完成的工作看起来仍处于未完成状态,区分他们的主张与自己的主张,向新手明确标注简化内容;对于临床案例,去标识化是本页唯一不可逆的事项。 review: 问题不会在这里提出——它已移至第 5 步,在首次干净渲染之后。 它过去是第 0 步的一个维度,迫使用户为一份他们还没见过的演示文稿确定评审范围; 现在用户可以先看到渲染后的演示文稿,同样的选择就有了依据,不再是盲选,这也让更低成本的默认方案变得安全(第 5 步负责这个问题、四个选项和记录规则)。第 0 步仍然决定的是研究广度,因为研究发生在渲染之前,不能等到构建完成后再提问:根据用途推导——实验室会议/状态更新/教学演示文稿用 standard,答辩/会议演讲/高管汇报/推介用 thorough(技能一直以来采用的同一套两类重要性划分;由用途决定,演示文稿的尺寸绝不会降低要求)——在第 0 步的选择/计划中注明推导出的值,并在第 1 步交给规划器。研究只缩小广度,绝不降低保真度底线:无论广度如何,每一条进入幻灯片的论述都要追溯到一手来源。

🔴 提出任何构建需求前,请先阅读 references/interview-protocol.md——该文件规定了第 0 步的其余部分:基于当前用户足迹进行两阶段个性化 + taste.md 的优先级(🔴 必须:当前请求 > 本次访谈的回答 > taste.md)、根据需求调整访谈、Q1 的四种模板选择 (a)–(d)——必须提供全部四种,绝不能写死某个机构——及其各自分支、Q2 的交付方式 · 演示文稿长度 · 是否出现在构建中 · 主要目标等维度 + 各用途对应的情况 + 场地调研,以及 Q3 按输入格式路由源材料。

该文件中有一个 🔴 检查点: Q1(d) 生成式模板的主视觉检查点(展示主视觉 + 一张示例内容幻灯片,反复迭代,直到用户确认)。Q1(c) 方向关卡(4 种渲染方向)在设计全新演示文稿分支上默认执行——只能通过指定的例外跳过,并记录在设计检查点的 direction gate: 一行。

  • 他们自己的演示文稿,用于改进(例如“重新设计这个”“我的幻灯片太密集了”“把我的演示文稿做得更好”)→ 这是重新设计,而非从零开始构建,前期流程也应有所不同。请遵循 references/redesign-existing-deck.md: 在同一轮访谈中额外询问两个问题——保留你的设计/品牌元素,还是重新设计外观?以及改动幅度如何——在保留结构的前提下做轻度整理,还是全面重新创作?——这两个问题会取代 Q1 模板问题(references/redesign-existing-deck.md 中的 R0 规则):选择保留会将他们的演示文稿作为模板;选择重新设计外观则会在批量处理后触发 Q1 的四种选择——并且先诊断他们的演示文稿(渲染演示文稿,使用 scripts/extract_deck.py 提取其内容/图表,再运行评论器),然后展示弱点列表,并在重建之前确认范围。优化某人现有的演示文稿,更适合采用以诊断为先、先确认范围的做法,而不是悄然从头替换。

    🔴 检查点——展示诊断结果 + 建议的范围,并在重建演示文稿前征得用户同意。

Q4(风格)——密度级别、模仿模式和方向关卡的范围,见 references/interview-protocol.md(同一文件的后续部分)。提出风格问题前请先阅读。该文件规定了三个密度级别(图表为主/均衡/文本为主,按每个要点对应的文本量定义)以及模仿风格示例的模式——这两项用户选择仅在这里出现,因此如果不打开该文件,就会在用户不知情的情况下使用默认值。 语言(确定后保持一致)。 一套幻灯片从头到尾都应使用一种语言——默认使用用户所用的语言。如果源材料使用的语言与用户不同(例如,使用英语的用户提供了中文代码库或论文),或者语言选择有歧义,请询问幻灯片应使用哪种语言,不要默认使用源材料的语言。询问语言时,也要提供双语选项(例如:“仅英语、仅中文,还是中英双语?”),这样有需要的用户就不必主动提出。然后将内容翻译成所选语言,并确保每张幻灯片的语言一致。既定技术术语、专有名词、缩略语、单位和代码可以保留原文(这不算“混用”)。只有用户提出要求(或选择该选项)时,才制作混合语种/双语幻灯片;此时须系统地处理(每张幻灯片都采用相同的对应方式)。参见 references/multilingual.md。

第 1 步——理解并规划内容(使用 content-planner)

这一步仅针对内容,请使用 agents/content-planner.md——如果宿主提供多 Agent/子 Agent 工具,则通过该工具派发(在 Codex 中,如有需要,可使用 tool_search 查找多 Agent 工具);否则自行按照同一份规划 brief 在线执行。在 design-a-clean-one 分支中,应在发布方向确认链接的同一条消息里派发规划任务——方向页面不包含内容,因此两个等待过程可以重叠,合并为一次(references/interview-protocol.md);确认关卡本身不变,仍会阻止进入第 2 步。它是对评审者/裁决者的建设性补充。向它提供访谈答案(目的/受众/时长、交付场景与首要目标、风格/语言、模板选择、如有则提供演讲场地,以及第 0 步的场地研究结果——规划者应基于这些结果开展工作(重新核实,不要重新研究))、源材料(或“无”)、内容参考资料(review-rubrics.md——内容审视角度——和 multilingual.md),以及下方的 search cap:。(设计参考资料——design-principles.md、design-by-purpose.md、form-selection.md、schematic-diagrams.md、animation.md、image-generation.md——属于第 2 步的幻灯片设计 Agent,不属于此处。)

它将返回一份内容规划——仅限消息,不含设计:理解简报+论点清单+作者强调重点核查+叙事弧线(包括规划的情绪曲线及刻意留待后续幻灯片呈现的内容)+逐页内容规范(通过记忆测试的要点 · 角色 · 问题 · 节拍 · 内容单元 · 视觉来源:哪张图/哪个数字/哪组数据,以及对应的问题——是什么/如何/为何),另附标记出的前瞻性内容和未决问题。然后将该规划带入第 1 步的内容确认关卡(展示规划,并就故事/信息获得用户认可——节奏/幻灯片数量检查在此处进行);内容获批后,幻灯片设计 Agent 才开始设计视觉呈现(第 2 步)。规划者是一个整体——它可以将多份文档的阅读工作分派出去,但须自行综合理解、叙事弧线和逐页信息;绝不能把一篇论文拆分给互不知情的 Agent。对于快速、低风险的演示文稿,可以自行在线完成这一环节,不必派发任务;但无论采用哪种方式,都须遵循下方的深度理解与规划标准。

🔴 每个叙事弧线候选方案都须包含一个 serves_goal 条款,并且评分时须先依据记录的 interview.goal 评估,再依据优雅程度评估。 arc_divergence.py 要求提供该字段,并会报告候选方案是否都用相同措辞表述其如何服务目标——若是,则说明这一环节只是流于形式,并未真正比较方案。顺序至关重要:先选择最令人印象深刻的叙事弧线,之后才检查它是否符合目标,选出的就会是最令人印象深刻的弧线。 🔴 弧线是经过竞选选出的,而不是推导出来的——基于同一份台账比较 2–3 个候选项。规划器会返回 2–3 条候选弧线(每条都要说明受众的问题、预先回应的异议、结尾的行动号召,以及包含的台账 ID),你运行 python3 scripts/arc_divergence.py <arcs>.json,然后由你来选——这不是新增的用户确认环节。竞选结果会通过内容检查点必需的 arc gate: 行呈现给用户(选中的弧线 + 落选项 + 每项一句说明 + 分歧判定);没有这一行的内容检查点尚未准备就绪。关于理由、两种坍缩模式和应对方案,见 agents/content-planner.md §3。之所以这样做,是因为弧线是唯一一个出错就会使所有后续工作失效的决策——形式选错只会浪费一张幻灯片,弧线选错则会连同设计方案及其下游构建一起作废——而它也是记录中唯一没有备选方案的决策。 🔴 它的门槛是 .deck-gates.json 中的 content.arc.candidates——也就是候选弧线本身,而不是对它们的判定。交付时,移交门槛会对候选弧线运行 arc_divergence.check(),因此你粘贴的那一行不再是证据:系统会重新评估候选集合。落选项要全部写入 content.arc.rejected(每项都要附上一句说明);被标记为有分歧但仍予以保留的候选集合,则需要填写 content.arc.divergence_justified。之所以改成这样,是因为有一份已交付的幻灯片通过了检查,记录中却只有 "divergence": "ok" 这几个字符,而它从未运行过脚本;之前的门槛要求列出落选项及其说明,这提高了不如实记录的代价,但又没有让记录变得难以完成。render_deck.py --gate-check 和 codex_delivery_gate.py 都会重新计算;跳过竞选的运行现在无话可写,这正是目的所在。 🔴 也要给规划器设定 search cap:——并且在派发前完成少量、明确指定的查找。网页搜索额度按会话计算,由所有子 Agent 共享;同一对话中制作多份幻灯片时,额度不会重置。测得:一次研究任务扇出派出了 12 个 Agent 和 7 个验证器,却没有告诉它们额度限制,耗尽了全部 200 次搜索;几小时后,当一次针对某家公司官方 Logo 的简单查找无法执行时,损失才显现,幻灯片也因此缺少了 Logo。先期大规模扇出耗尽额度,导致后续成本低、时间晚、规模小的查询无额度可用,所以要按最划算的顺序处理:(1)先完成少数几项明确指定的查找——Logo、品牌色、唯一的清关编号——因为它们数量少,却恰恰最容易被挤占,而且步骤 2 无论如何都需要它们;(2)在每条派发提示词中说明每个 Agent 的搜索上限——没有收到上限通知的 Agent 会一直搜到满意为止,而多个 Agent 会并行搜索——让整轮搜索量控制在剩余额度的一半左右,而不是原始额度的一半;(3)在移交的 cost: 行中记录 searches: planned N / spent N。如果额度确实耗尽,要在幻灯片的局限性页面和移交信息中说明:绝不能让“无法核实”看起来像“不存在”(完整理由见步骤 5 的 SEARCH BUDGET 部分)。 也要告知规划器研究广度——即步骤 0 根据目的确定的值(低风险类别用 standard,国防、会议、管理层或路演用 thorough)。它只用于确定研究范围;REVIEW 层级要到步骤 5、呈现出渲染后的幻灯片后才选择,规划器既不知道,也不需要知道。广度影响的是研究范围,绝不降低保真底线:无论采用何种广度,每条出现在幻灯片上的主张仍须追溯到一手来源。如果没有记录广度的推导依据,规划器就按 standard 工作,并明确说明。

本步骤的其余部分是规划器所遵循的规范(也是你检查其计划的依据)。标准是——深入理解,不要略读: A 个演示文稿的质量取决于你对材料的掌握程度——浅尝辄止的阅读会做出一份看起来没问题、却歪曲了工作的演示文稿,专家受众一眼就能看出来。请通读所有内容,而不只是摘要:运行代码库的 README,从头到尾阅读论文(引言 → 方法 → 每一张结果表格/图表 → 结论)。 (对于 BOUNDED 来源,从头到尾阅读是默认做法;对于 LONG 来源——书籍/超长 PDF/大型语料库——不要假装可以线性通读:先判断规模,再进入长来源模式(梳理 → 分级筛选 → 深读约 20% 的承重内容 + 阻断性的来源覆盖图)。请参阅下方的长来源要点和 content-planner.md §1。)

🔴 **在做上述任何事情之前,先写受众简报——列出现场听众必须做出的决定,按他们做决定的先后顺序排列,并说明他们需要掌握哪些信息——然后以此为目标收集信息。**这是必填字段(content.audience_brief,由 deck_gates.py、--gate-check 和 Codex gate 根据 scripts/audience_brief.py 中的同一份契约检查),并会将 audience: 行带入 Step-1 检查点。🔴 对于没有来源的演示文稿,它将取代理解简报:没有内容需要理解,因此即便写了简报,也只是对主题的总结;而主题简报做出来的是一份关于主题的演示文稿,而不是一份面向受众的演示文稿。

两次实测,第二次时规则已经存在。(1)收到一条中文请求:“做一个介绍巴黎的 PPT”→演示文稿正确地拒绝了埃菲尔铁塔主题,却也删除了地标、街区和美食,最终做出了一套关于 19 世纪建筑法规的论述。(2)一份墨尔本演示文稿根据记录的答案 audience = people planning a trip 和 goal = they leave able to plan one 制作:Step-1 简报描述了这座城市,三个候选叙事线都在这个框架内生成,最终方案胜出,因为它“是唯一一个组织思路本身也能发挥组织作用的候选方案……没有什么比它更容易让人一周后还记得”——这是一个演示文稿质量测试。记录的 goal 从未用于给候选方案打分,而实用型方案则因“和每个旅游网站给我的列表都一样”而被否决——但对计划旅行的人来说,这正是他们需要的成果。最终交付的是一篇关于 1837 年土地测量的论述。这个框架还影响了研究方向:测量链、地块宽度和铭文年份都经过了核实;但每日花费、距离、雨天备选方案以及哪些景点可以跳过,都没人问。所有 gate 都通过了。 🔴 **现有规则为何没有触发:**巴黎案例的教训位于 references/checkpoint-convention.md 的委托的 Step-0 选择部分,因此只在自动豁免时生效。墨尔本项目进行了完整访谈,从未落入该规则的适用范围。适用范围错误的正确规则,不是 gate——所以这里重申该规则,让它适用于每一份演示文稿;也因此,它现在是必填字段,而不是一段说明。

**不确定时的检验方法:**从头到尾阅读结论主线。如果读起来像是一组关于主题的真实陈述,而不是对现场听众必须做出的决定的回答,那么框架就是错的——在框架上补一个缺失主题(墨尔本重做时的第一步,就是把两页地标介绍硬接到测量主线上)只能修补表面问题,框架本身依然不对。

然后撰写理解简报——这是一份必需的、字段固定且有来源依据的材料(规划器的 agents/content-planner.md §1 是规范);每个字段都必须能追溯到可定位的来源文本,而不能依赖记忆:

  • **字段清单见 references/content-plan-spec.md §Comprehension brief——撰写(或检查)简报前先阅读。**其中包含一句话主旨及其原文逐字引用、各项贡献、方法精髓、每个图表各占一行的规范、细微之处/局限性引用,以及主张台账的列(与 agents/content-planner.md §1–2 中的规范相同)。

🔴 全面检索来源中关于哪些事项「尚未得到证实」的表述,并记录下来——content.open_ledger。 未来工作 · 后续步骤 · 路线图 · 尚未开放的关卡 ·「无法证实」·「尚未」· TODO。每项各占一行:claim | where the source says so | absent from the deck, or stated AS OPEN on slide N。**任何一项都不得以已证实的口吻出现在幻灯片上。**这类失误与捏造不同,永不捏造规则和主张台账都无法发现:事实确实出现在来源中,只是从假设升级成了结果,因此核查无误,最终也就发布了。在一个研究演示文稿中,这类问题曾表现为:幻灯片声称增加额外的呼吸分箱有助于重建,而来源却明确将其列为尚未测试的关卡——专家听众一句话就能指出这类问题。[] 是有效值,表示已完成检索(没有来源的演示文稿填写 []);两条关卡路径都会拦截缺失的 KEY,而不是条目数量。字段规范见:references/content-plan-spec.md。

**这是硬性关卡,不是合理性检查。**根据来源自行核实简报;如果任何字段为空、措辞含糊或缺少出处——或者重点测试未通过(作者会对你的一句话主旨感到意外)——就说明你还没有真正理解:请重新阅读,或记录一个待解决问题。**简报不完整或缺少出处,就不能开始构建。**每张幻灯片都必须忠实呈现作者的实际重点,而不是听起来合理的转述。复用他们的图表(可为幻灯片调整标签)。

有来源往往并不代表掌握了全貌——用网络补足缺漏,即使已有来源也如此。 大多数演示文稿都不完整:论文可能需要补充发表后的相关工作或当前背景;代码仓库可能没有说明文档;有些图表没有配套文字;有些文档没有注明发表场合。因此,下面的网络检索步骤不只适用于「没有内容」的情况——只要来源存在缺漏,就应执行;尤其要以今天的日期重新核实来源中所有可证伪或有时效性的主张:论文声称的「最先进」、采用数量,以及「首个/最大/最新」等最高级描述,都可能在演示当天已经过时。重新核实来源中的主张不是捏造,而是忠实于当下的事实。

  • 没有内容——以及任何演示文稿的网络事实核查:根据自己的专业知识拟定大纲,然后以一手来源为依据,逐一核实每个可证伪的主张,并将演示文稿的内容依据更新至今天。执行任何搜索或将可证伪/有时效性的主张放上幻灯片之前,先阅读 references/content-plan-spec.md §Web verification & no-source decks——该部分规定了来源依据契约、每次构建都要重新核实的事项清单、带日期事件的时态规则,以及无法使用网络工具时的备用方案。🔴 网络检索必须达到三个层级(content-planner.md §2(e)):全面(绘制领域全貌,先广泛检索;并主动进行生命周期检索——核查每个重点产品/版本/实体截至今天是否仍在使用或已停用,避免将已停用或更名的对象作为标题重点);充分(每张承载关键论点的幻灯片都包含具体数字/日期/价格/具名结果,而非形容词);准确(每项事实都至少由 ≥2 个相互独立的可信来源佐证——内容农场博客不算佐证;标注置信度;只有标注「据公开报道」的中等置信度事实才能发布)。内容检查点随后必须包含 coverage: · lifecycle: · provenance: 各行,否则状态就不是就绪(参见 content-planner §1 的网络研究关卡和 checkpoint-convention.md)。实际案例:一个没有来源的演示文稿发布内容单薄,还将两款已停用产品作为标题重点,因为上述要求都没有得到执行。
  • 长篇资料(书籍/超长 PDF/大型语料库/多卷册系列)不应从头到尾通读——假装线性阅读要么会超出上下文容量,要么更糟,虽然能装下,却流于浅尝辄止。只要资料可能超过约 40–50 页,或无法一次读完,就要阅读 references/content-plan-spec.md §Long-source mode——确定性篇幅分类(extract_pdf.py map、CJK 计数、多文件求和)、结构图、筛选、逐字精读约 20% 并为论断标注页码、限定页面范围的图片定位器(绝不使用覆盖整个文档的 autofig)、资料覆盖图、会在精读之前发布选取说明的两阶段派发流程,以及扫描件/DRM 导致无文本的情况。 在 🔴 内容检查点结束步骤 1——先检查节奏,再批准故事。 内容计划是修正误读或强调不当最省力的环节,因此必须在任何设计开始之前呈现:先呈现理解简报 + 论点台账(这样用户就能在设计任何幻灯片之前发现误读),然后是作者强调重点检查、叙事弧线以及逐页要点 + 内容(仅传达信息——暂不涉及视觉效果),再加上任何标记的前瞻性内容和待解问题。节奏/幻灯片数量检查要在这里进行,而不是之后:对于口头演讲的幻灯片,幻灯片数量应与时间预算相匹配——大致以每分钟演讲时间 1 页为参考(简短演讲/状态汇报约 6–9 页,讲座/论文答辩/求职演讲约 10–20 页以上);动画/逐步呈现的幻灯片只计 1 页。计算 slide_count ÷ time_minutes,若明显高于约 1 页/分钟,就删减幻灯片或争取更多时间,并标记出来。独立阅读/海报类幻灯片没有分钟级的演讲时间预算——其范围由内容完整性决定,刻意提高信息密度是可以的,不算缺陷。与用户确认最终幻灯片数量(绝不提交用户未看过的篇幅)。对于长篇来源(书籍/超长 PDF),检查点还须包含来源覆盖图的摘要(选定部分 + 详细讲解/概述/删减的数量统计;完整的逐章映射保留在计划中),并确认所选内容。顺序很重要:生成经核实的论点台账的逐字深度阅读发生在步骤 1 内部,因此必须更早发现选错范围的问题——规划者在映射 + 初步筛选后、投入逐字深度阅读前,将覆盖图作为一条便于审核的选材提示呈现;并且在设计和制作(步骤 2 及之后)开始前,于此处再次确认。书籍规模下,选错范围的风险最大,因此即使自动豁免,也要将其作为提示呈现。前置条件——理解门槛:展示计划前,先确认其中包含完整的理解简报(每个字段都已填写并可追溯)和论点台账(不得有已纳入内容但 verified? = N 的行)、能构成完整论证的要点主线(主线不连贯即表示“尚未就绪”——退回规划者处理)、已对逐页表格运行 scripts/plan_wordcount.py(仅供参考——但超出预算且未记录“超预算 → 备注/拆分”处理方案的行也要退回)、任何文件来源的幻灯片都包含source size: 行(必须记录测量结果,才能判断来源属于有限篇幅还是长篇;缺少该行意味着从未进行分类)、对于超过阈值的长篇来源,包含完整的来源覆盖图(为每个框架章节——map 目录或记录的重构框架;多文件来源则须涵盖每个文件——给出处理方式)+ 逐字阅读与略读的说明行 + selection FYI: 行;缺失或不完整的映射即表示“尚未就绪”;视频来源的幻灯片还须包含文字稿状态行(提供的定位信息或仅视觉内容的 GAP 行)。空泛、含糊或无法追溯的简报均表示尚未就绪——退回规划者处理。纳入用户对故事的修改,然后进入设计(步骤 2)。

🔴 检查点——内容:在任何设计工作开始前,展示理解简报 + 论点台账 + 叙事弧线 + 逐页要点/内容,并确认节奏/幻灯片数量;呈现形式为 🔴 检查点规范中定义的精简检查点材料(≤约 25 行)。简报 + 台账以 2 行摘要呈现;用户提出要求或摘要存在异常(未核实的行、待解问题)时,再提供完整版本。对于长篇来源(书籍/超长 PDF),材料还须包含来源覆盖图的摘要(选定部分 + 详细讲解/概述/删减的数量统计;完整的逐章映射保留在计划中),并在此处确认所选内容——这是书籍规模下的覆盖范围门槛(也要在更早的环节,即逐字深度阅读前,作为便于审核的提示呈现)。

步骤 2 — 设计幻灯片(使用幻灯片设计 Agent)

🔴 开始步骤 2:阅读用户已经教过你的内容

python3 scripts/taste_ledger.py list --binds-at design --format prompt

用户在之前的演示文稿上亲手做过的修正都记录在这里——分类内容缺少图标、演示文稿渲染成了灰色方块、装饰图案比它承载的内容更抢眼、用户自行设定的默认字体。没有这些记录,同一条意见就会在一份又一份演示文稿中反复出现,每次都要耗费一次交付才能重新发现;用户成了技能的记忆库,每次都为此付出代价。 空账本无需处理(全新安装时账本为空,这很正常)。账本不为空时,请在 design_plan.taste_applied 中为每个有效条目记录一行—— {"id": …, "applied": true} 或 {"id": …, "applied": false, "why_not": "<why it does not bind here>"}。关卡检查的是每条规则是否都经过考虑,而不是是否遵照执行:在这份演示文稿中,打破已学规则可能是正确的选择,而记录下跳过的原因也是设计的一部分(这是将品味协议规则 3 应用于用户自身修正的做法)。在交付时学到了新内容?执行 taste_ledger.py add --id … --quote "<their words>" --rule … --binds-at … --deck …——引用必须是用户自己的原话,否则就是把你自己的决定归到用户名下。而当某条规则有了确定性检查时,执行 retire <id> --gate <CODE>:条目通过晋升退出,而不是被遗忘,这样才能避免账本沦为噪声。

🔴 步骤 2 不受分支选择影响——每次选择 Q1 模板都必须完整执行

Q1 的选择——(a) 自行设计、(b) 使用提供的模板、(c) 方向关卡、(d) 生成视觉识别——只决定外观来源。它绝不会省去设计计划或其 🔴 设计检查点。分支的外观关卡确认的是外观,不是逐页设计:分支 (c) 的方向关卡和分支 (d) 的主视觉检查点都不是设计检查点(自动豁免每份演示文稿的列表会将它们列为不同的关卡,原因就在于此)。完成任一关卡后,仍须制定设计计划(表单账本 · 节奏 · 以大胆程度为调节项的标志性手法 · 3 项设计必需项 · 语义色彩 · 密度 · 徽标/装饰图案),并发布设计检查点——其中须包含 direction gate:(c)/style gate:(d)一行——然后才能开始制作。生成的视觉识别会为计划提供素材(调色板/装饰图案/表面效果/字体作为输入,并记录为四行契约),但不能取代计划。 确定性强制执行:如果已有内容计划记录,但没有设计计划和设计检查点,render_deck.py 会拒绝完整渲染(--slides 探测渲染不受此限;它会读取共享的 .deck-gates.json 和 Codex 的 .codex-deck-evidence.json),因此绝不能事后补写计划来通过交付关卡。这堵住了一处已测出的回归:生成式 (d) 分支的工作流曾将访谈直接导向制作,并以主视觉检查点代替步骤 2,最终交付了一份从未规划或审查布局、节奏和形式的演示文稿。

🔴 第 2 步以材质探测开场——先构建并查看一张真正的幻灯片,再编写计划

用真正的 deckkit,以新创的风格创作标志性页面,渲染出来并亲自查看—— 然后再编写设计计划中的声明,描述你做出的内容。 不是事后补上。计划是对已存在成品的 描述,而不是对尚不存在成品的承诺。

原因:以本仓库自身历史中交付过的演示文稿为证。 流程对母题的概念进行了全面把关——要求提供包含两个中间步骤的推导阶梯、两张被否决的图及各自落选的理由、陌生人测试、一种形式对应一种含义,以及生成性三要素——却完全不检查其材质。在那份演示文稿中,概念确实正确(配置行源自产品自身的 cordis.yml,恰当地避开了每套插件演示文稿都会采用的插头插座刻板印象),也通过了上述所有检查。最终交付的却是六个灰色矩形。 用户的评价是设计变弱了。修复只改变了材质——同样的行变成了带有键、值和 -/+ 差异的真实配置——概念没有任何变化。从“概念获批”到“演示文稿交付”之间,没有任何步骤问过这个装置是由什么材料制成的。

问题出在工作顺序,而不是缺少规则:设计环节要求约 20 项声明,却没有要求任何成品,于是精力都花在了撰写能通过检查的句子上,而不是做出能用的东西。signature move: the cover demonstrates the argument itself 是一句好话,但页面上没有任何内容体现它。像这样,像素无法作假——灰条式的登记表渲染出来就是灰条——所以这项探测必须放在最前面。

  1. 构建一张幻灯片:标志性设计动作落到的那一页,采用你刚发明的风格,并使用这套演示文稿将要采用的同一个 build_<deck>.py。将其渲染出来(render_deck.py … --slides 1)。
  2. 查看它,并用一句话回答一个问题:这页的安全版会是什么样? 如果诚实的答案是“差不多还是这个样子”,那这种风格只是外观,而非设计动作——回去重新发明,别急着在上面写二十项声明。
  3. 然后编写设计计划。检查点中要有一行 material probe:——渲染出的 PNG,加上那句比较。

代价只是构建一次、渲染一次(几秒钟),而且页面并非临时产物——它会成为演示文稿的标志性幻灯片,并作为第 4 步锚点验证中的 signature 锚点,因此这个流程只需走一遍。这与锚点验证的问题不同:锚点验证询问设计动作在构建后是否得以保留;这项探测询问的是,这种风格是否值得构建。

**只有当外观无需由你发明时才跳过:**使用已注册或提供的模板,或进行 A 模式模仿(材质由模板决定),或需求仅涉及 1–2 张幻灯片。boldness: conservative 并不意味着可以跳过——克制本身也是一种材质选择,而页面恰好能让你看出它呈现出来的是刻意为之,还是毫无表现。

内容计划获批后,先构建证据清单——已获批计划中每项资产对应一条只读探测记录,让艺术总监在规划版面时能够充分了解情况(没有资产的演示文稿则完全跳过)。在启动 slide-design 前,先阅读 references/asset-production.md §Evidence manifest,了解记录格式、探测工具,以及探测绝不会生成裁剪图、公式或图版这一规则(只有设计计划获批后,才会运行 asset-prep)。该文件涵盖资产从头到尾的生命周期——探测 → 选择使用图片 → 裁剪 → 图表 → 标志/图标 → 公式。 每项资产的 SPEC 都有明确的产出方,供 asset-prep 使用:Design 计划中按幻灯片列出的各行(或其图像自选列表)会为每项资产提供裁切规格(或 autofig index N——但对于长源文档的演示文稿,定位符必须限定到页面:figures <src> <page> + 图注标签,绝不能使用整份文档的 autofig 索引,因为其全局编号会在不同运行间变化)、生成式图版的主题提示词、公式的目标高度,以及 GIF 的海报帧——如果已批准计划中有未明确写出的信息,COORDINATOR 会在组装 asset-prep 的工作单时,根据计划自身的几何信息补全(asset-prep 本身绝不做决定;它只负责执行)。接着,派遣 agents/slide-design.md——演示文稿的艺术指导——在锁定的信息之上设计视觉风格。如果宿主提供可用的多 Agent/子 Agent 工具,就通过该工具派遣;否则,直接使用相同的简报执行。向其提供已批准的 Content 计划(理解简报、主张台账、包含情感曲线的叙事弧线,以及每页 CONTENT 表格,其中每张幻灯片的单元格包含 角色 · 问题 · 节拍 和 视觉来源)、证据清单(上述资产几何信息)、品味基准——从注册表根目录读取 taste.md 的 DIALS + NO-GOs + 最新一条外观历史记录,遵循 references/user-taste.md 的说明(新用户填写“无记录”)——让 §1 新鲜度有实际内容可供变化,并为默认的视觉元素预算设定初值;但访谈中的明确回答和 LOCKED 外观特例始终优先级更高;引导风格基调的访谈回答(用途/受众/时长、交付模式、风格、模板/品牌决策、场合——此外,如果用户在 Q4 中提供了风格示例,还包括书面风格简报 + 选定的模仿模式);以及它据以设计的工艺参考资料(form-selection.md、design-gallery.md、scripts/presets.py、design-by-purpose.md、design-by-topic.md、bespoke-registers.md、design-principles.md、design-intelligence-addendum.md、semantic-color-contract.md、data-viz.md、schematic-diagrams.md、icons.md、animation.md、image-generation.md、east-asian-aesthetic.md——对于模仿风格的演示文稿,还包括 style-analysis.md)。它使用已批准的内容——不会重新审核内容——并返回一份Design 计划:演示文稿的设计语言(一个有名称的标志性主题 + 精心挑选的配色/字体 + 润色手法)、整套演示文稿的节奏、逐页设计表格(形式 + 被其胜过的次选方案 · 推理 · 布局 · 动效 · 图像?)、形式台账 + 多样性门槛、设计自检项、10 项设计评审清单(第 5 步评审者随后会应用其中的设计视角),以及图像自选列表。艺术指导是贯穿整套演示文稿的一个头脑——只有它能同时看到每张幻灯片,因此整套演示文稿的节奏以及逐步呈现效果出现的位置,都由它决定,而不是由构建者决定。 设计方案是调整视觉方向成本最低的环节,因此这一步要以展示方案并征得用户同意结束,然后才能设置画布或开始制作。这套设计智能适用于每一份演示文稿——这是艺术总监的设计方式,绝非每份演示文稿可选启用;而且会优雅地适配小型演示文稿(4 页的演示文稿仍然每页都要有一个主视觉,不会条件反射地使用卡片网格,还要有语义色彩和一个令人难忘的时刻);只有演示文稿层面的数值下限会按规模调整(内容页约 8 页及以上时为硬性要求,6–7 页时为强指导)。 前置条件——设计关卡:除非方案包含一行 concept:,说明这份演示文稿的创意是什么事物的图像、产生它的两个中间层级(via <core concepts> → <visual language>),以及它胜出的两张图像和每张图像落败的原因,否则方案尚未就绪*(层级链为 topic → core concepts → visual language → motif;被跳过的是中间层级,而跳过它正是行业刻板印象的来源——MRI 演示文稿若直接跳到图像,会得到一台扫描仪;若经由 frequency · sampling,则会得到一张 k-space 网格。没有层级依据的胜出图像只是凭空出现的图像,并非推导得来的图像。完整层级链及其对应的领域中立 §3 词典:agents/slide-design.md §1。 🔴 这条规则约束的是 MOTIF,而不是 CONTENT。拒绝显而易见的图像是本职工作;删掉显而易见的主题则是另一回事,而且几乎总是错的。实测:收到一条中文请求“制作一份介绍巴黎的 PPT”时,一次运行正确地拒绝了以埃菲尔铁塔剪影作为统领图像,却也把地标、街区和美食从 CONTENT 中一并删掉,结果给原本想了解这座城市的观众讲起了 19 世纪建筑法规。一份演示文稿可以介绍巴黎圣母院、卢浮宫和蒙马特,同时采用与明信片毫无关联的视觉语言。用观众期待的内容满足他们,同时采用模板绝不会想到的形式——这就是完整的意思;只取后半句,只会做出与众不同却毫无用处的演示文稿。) (一个智能网络 · 一个数字生物 · 一只手与一只机械手共同完成一项工作——这是同一论证经批准后采用的三种统领图像,而非三种风格或三种版式)。这是整个流程从未具备的唯一一种分歧:方向关卡在风格上产生分歧(其预览页本身写着“相同的四种幻灯片类型……只有风格*不同”),而形式选择则在逐页版式上产生分歧,两者都保持图像不变。Motif 无法填补这个空缺——它只是先选定的预设中的一个属性,且最多出现 3 次,因此从结构上就不可能成为统领图像。只需在方案阶段多写三句话:无需额外分发,无需额外渲染,无需额外往返(agents/slide-design.md §0)。只有一个图像、没有备选方案,那不是选择,只是最先想到的东西;交接关卡会拒绝两种仅仅换了说法的“备选方案”,因为它们实际上都是胜出方案。方案还要有具体的设计语言**(一个有名称的标志性 Motif,加上经过刻意选择的配色/字体,而非默认的浅色/极简/蓝色)、设计语言部分的一行品味档案字段——taste profile: <n dials applied / none on file> · freshness: varied <foundation> vs <last look-history line>,或者另一种情况 look LOCKED (registered/provided template) — carve applies——这行内容能让新鲜度规则可核查,并让任何品味档案覆盖一目了然(references/user-taste.md);还要有一行 boldness:(conservative | balanced+ | bold | experimental——必须推导得出,而非一律采用默认值:明确的用户要求 > taste.md 中已提升的调节项 > 用途——严肃的答辩/法规/状态汇报默认为 conservative,除非用户另有要求;推介/发布/品牌/文化演示文稿默认为 bold;其他情况均为 balanced+;须记录由哪一项决定,完整对照表由 agents/slide-design.md 维护)。过去,这种推导只存在于艺术总监自己的文件中,因此内联运行不会读取该文件,便会给发布演示文稿和状态汇报设置相同的中间档位,再用它来评判两者:推介演示文稿从未被要求展现勇气,而状态汇报却被批评不够大胆。第 1 层必须包含这项映射,因为内联运行读取的正是第 1 层;处于 conservative 时,风险是可选的——可以采取适度克制的手法,也可以用单句 deliberately restrained: <why> 填写该字段,此时不要求 signature_proof,因为没有需要证明的风险。其他字段仍然都是必需的;高于 conservative 时,必须采取真正的冒险手法,不可省略);还要有一行真实的 signature move:——这是模板不会采用的唯一一项刻意美学冒险,要注明它落在哪里(封面 / WOW / 关键数据页),并借鉴一项有名称的大胆参考;还要有一个 carried_by: 子句,列出 2–3 页(标志性幻灯片 + 至少 1 页其他幻灯片),说明相同的创意在哪里发挥结构性作用——十九页中只有一页大胆,读起来像风格突变,而不是立场;让大胆显得经过深思熟虑的,是连贯性。所谓承载,是指创意成为这些页上内容的形状(Motif 转变为图表自身的几何结构),而非装饰性重复——把某种元素盖章似的印在每一页上,恰恰是相反的错误,而且 Motif 的使用上限(最多 3 次)仍然适用;若 signature move 归结为“大号数字 / 漂亮的渐变 / 全出血照片”,那只是安全选项目录,不是标志性手法,方案也就不完整(退回重做;由自检 (h) 负责);只有 boldness: conservative(无论由用户指定还是按用途默认)才能让风险成为可选项,此时可将字段改为一条有名称的“deliberately restrained”说明,但绝不能留空;风险只能体现在构图/比例/概念/字体上,绝不能凌驾于任何底线之上(可读性/忠实度/ lint 检查优先);还要在任何放置清单中列出的图表/表格的幻灯片之 Layout 单元格里,添加一条 AR a.b -> <zone> 标注(方案若承诺将几何形状已知的素材放入某个区域,却不检查适配情况,就尚未就绪——退回艺术总监处理;是否应重新排版还是给出品味方面的理由,由 slide-design §3 的 Image-fit 规则决定);还要有一份 形式分类账,通过多样性关卡(内容页中任何一种形式类别都不得超过约 40–50%,以防过度使用卡片);满足附录的演示文稿层面设计关卡——包括节奏图、语义色彩分类账、通过的区块依赖审计(不得连续出现超过 2 张卡片式幻灯片),以及演示文稿层面的最低变化要求(references/design-intelligence-addendum.md);此外,对于任何提及真实实体的演示文稿(不仅是只涉及单一实体的演示文稿:以公司/产品/品牌/机构/政府部门为主题,提及作为内容的工具/框架/模型,或某页采用真实实体名称名录的形式——如生态系统地图、联盟成员列表、按机构划分的对比表),都必须按 slide-design 的 LOGO 原则情境表提供一份有依据的 Logo 方案:该行必须写为 official asset — <source>、searched, none found → designed wordmark (flagged) 或 n/a — <named inline as text | template carries it | user opted out | third-party assessment>——而名录页还必须另写 entity marks: <N of M sourced | none — reason>,因为一行无法同时说明“整份演示文稿自身的标识”和“第 5 页上的八家机构”。🔴 标识位置使用通用占位符图形——例如彩色方块、重复的素材图标,或伪装成徽章的项目符号——都不能接受。这种做法是冒充信息的装饰,无法达到 1 秒可解读性的底线;朴素文字胜过看起来仿佛有含义的图形。(实测:一份 12 页的演示文稿以一个中心节点展示了 Go8 八所大学——正是 LOGO 原则规定应采用 Logo 墙的生态系统地图——结果却放上了八个一模一样的蓝色方块。规则本身没有问题;演示文稿涉及多个实体,因此根本不要求写 logo plan: 一行,而没人要求评估的规则就不会生效。) ——third-party assessment 是该选项组中的正式选项,而非脚注:必须先于搜索结果作出决定,并覆盖搜索结果(见下方 🔴 表格行),所以符合该选项条件的演示文稿必须能在此处明确写出;若只写“wordmark”/“text only”却未记录搜索结果,或任何提及真实实体的演示文稿(包括名录页)缺少此行,则方案不完整(退回重做;由自检 (o) 负责);还必须落实 三项设计必备要求(slide-design.md 的三项设计必备要求)—— (1) 逐步呈现——仅限用户选择启用(访谈中是否选择演示稿呈现效果):若选择启用,则动态清单应在能发挥作用的地方安排逐步呈现(逐步呈现/静态,逐页注明原因),且每张采用逐步呈现的幻灯片都必须完整分步制作(每一步显示一个内容元素,顺序经过刻意安排);若选择不启用,则每张幻灯片均标记为 static: user opted out,这表示已完整处理,而非缺漏。(2) 与风格匹配的 SVG 图标家族——🔴 任何包含类别化/多项目/概念性内容的演示文稿默认都应使用图标(如名录、支柱/角色/工具集合、包含 3 项的预览、步骤列表):它们有助于 1 秒内快速理解并强化视觉系统,不使用它们没有任何值得保留的理由。因此,问题从来不是“这份演示文稿是否应该使用图标”,而是“哪些幻灯片适合使用图标”——所有分支都适用,包括生成式模板(自检 (g);“选择不启用”绝不免除该要求)。跳过图标家族是高门槛的决定,不可随意作出:icon_family: none 必须从以下四种确实会因图标家族而受损的情形中说明原因——motif-dominant(精心设计的强势 Motif 会被图标削弱,且受最多 3 次的醒目呈现上限约束)、editorial-register(数据/编辑式风格——如 FT/Economist——加入图标会显得廉价且企业化)、tiny-deck(仅 1–2 页的需求),或 template-locked(用户提供的模板已有自身的标记)——并记录为 🔴 还存在第五种类别:user-declined——用户要求不要使用图标。前四种类别都是在说明这份演示文稿的特性,没有一种能表达用户已经作出决定;因此,若用户用中文要求“不需要图标”,就只能错误地归入 template-locked——这会作出另一种判断,而且 Codex 关卡会根据生成的文件核验这一判断,因此强行使用错误标签也会导致审核失败。这是用户自己的演示文稿;关卡无权质疑用户的决定,只能如实记录。icon_none_checked 仍须列出所有已标记的幻灯片。 🔴 此类别描述的是页面,而非整份演示文稿——并且会根据生成的文件核验(motif-dominant 要求文件中确实存在醒目的 Motif,tiny-deck 要求确实是小型演示文稿,template-locked 要求确实使用了锁定模板)。演示文稿层面的理由不能覆盖理由不适用的页面:在 Motif 毫无体现的名录页所在的演示文稿中使用 motif-dominant,就是一个实测失败案例——用连贯性理由覆盖明文规定的默认要求,却没有逐页核查;第一位人工审核者留下的首条意见就是“这里应该有图标”。应逐页重新判断;诚实的答案通常既不是完全不使用图标,也不是处处使用图标,而是在图标能发挥其他页面元素所不能发挥的作用时使用(并列呈现三种不同类别的事实;读者会扫描查找特定项目的行),而当其他元素已经编码了区别时就不使用(位置图、语义色彩、编号路线、Motif 本身)。 design_plan.icon_none_category + icon_none_checked: [slides](Codex:带 category 的 icon 豁免)。仅仅说“内容不属于类别丰富型”不再足以通过审核,而类别说明必须适用于演示文稿的其余部分——它绝不能成为遗漏那些确实包含类别化内容的幻灯片上图标的理由(以 Motif 为主的演示文稿,仍可在唯一的名录/预览页上使用图标,就像此技能自己的 UK 劳工演示文稿在两张各含 3 项的幻灯片上所做的那样)。🔴 但是图标必须编码信息,而不能仅作装饰——在孤立的大号数字或单句陈述旁放置主题图标,是无法达到 1 秒可解读性底线的装饰(design-must-be-meaningful);默认要求是“在类别化/概念性幻灯片上使用图标”,而非“每张幻灯片都放一个图标”。(3) 形式多样(不能反复使用卡片网格)——第 2–3 项必备要求必须在有帮助的地方落实,不适用时则给出理由(必须考虑并应用,而不是为每页设定硬性配额——仍要审慎判断使用的场合和时机)。若方案的外观一味默认、过度依赖某一种形式、忘记使用图标,或在用户选择启用逐步呈现时,没有将某张幻灯片完整分步制作,或遗漏了明显有助于逐步呈现的内容,则方案尚未就绪——退回艺术总监重做。 仅限 Codex: 将 references/codex-runtime.md 纳入艺术指导简报,并在设计方向明确后开始编写隐藏文件 .codex-deck-evidence.json。其中的逐页台账必须标明哪些页面属于类别性页面,将这些页面绑定到某个实际图标系列,或注明针对该页面的豁免,并列出任何提前拆分的组件;不要让这两项决定因便于构建而被忽略。

🔴 LOGO PRINCIPLE 表中的一行会在搜索之前作出决定,并覆盖搜索结果:第三方评估。 演示文稿关于某个实体,但并非由该实体制作,且包含该实体不会对外发布的内容——公开召回信息、“首创但并非唯一”的更正说明、局限性页面、竞争对手提供的反证。此时,答案是 n/a — third-party assessment,并附上据以判定的发现:任何页面都不得使用官方视觉标识,实体名称应使用演示文稿自身的字体排版。判断标准是作者身份,而非倾向——正面的独立评估和批判性的独立评估面临同样的问题。读者看到标识就会认为内容由该实体制作或背书;对于独立评估而言,这是错误归属,属于与未注明来源的数据相同的一类错误,只不过发生在视觉外框而非正文中。由于这是关于谁撰写了演示文稿的问题,即使找到真实标识也不能推翻这一判断,“未找到”也绝不是判定理由。(真实案例:一份包含两项公开的 Class I 召回信息及“首创,但并非独此一家”更正说明的简报,原本要使用其主题对象的品牌色进行制作;人工检查时发现了这个问题,并将其记录为一项具名偏离。本行将其设为默认做法,而非需要挽救的情况。)

每页内容图片的选择加入,是一项适用于 EVERY deck 的跨领域选择——独立于模板决定,也不同于 Q1 的生成模板流程;只要有图片工具或可用于查找有来源照片的网页搜索,就应提供此选项。在编写选择加入清单前,请阅读 references/asset-production.md §Per-slide content-image opt-in——包括三项护栏(与内容相关、绝不覆盖每一页,以及用于决定生成图像还是查找真实来源图像的 REFERENT RULE)和逐行来源令牌语法。纳入用户对设计的修改,然后设置画布(Step 3)。

🔴 检查点 — 设计:展示 concept: 行(主导视觉的图像 + 促成它的两个中间层级——via <核心概念> → <视觉语言>——+ 被它击败的两个方案,每个都附上落选的原因) + 设计语言 + 形式账本 + 3 条设计要务 + boldness: 行 + signature move: 行及其 carried_by: 子句(一个范围明确的美学风险 + 它出现的位置 + 它改编自哪项大胆参考 + 同一理念在哪 2–3 张幻灯片中发挥结构性作用——这样,错误的调性、不够大胆或过于狂野的手法,或只出现在一张幻灯片上的风险,都能一眼否决)+ 图像选择清单(每行都要包含 generated — <工具> / sourced — <来源> (<许可证>) / provided — … / searched, none found → … 这一层级——完整语法见 references/image-generation.md 步骤 5——来源标记)+(任何以真实实体为主题的演示文稿——主题对象、作为内容呈现的具名实体,或名录幻灯片——都必须提供)logo plan: 行及其证据标记(official asset — <来源> / searched, none found → designed wordmark (flagged) / n/a — <原因,含第三方评估>)+ 说明母题装置及其含义、如何让它清晰可辨的母题行 + motif generates:(背景 · 标记 · 一张几何形状本身就是母题的页面——none — <原因> 胜过生造一种元素)+ 整个演示文稿中每种重复形式只承载一种含义**——最后两项是门槛,不是装饰:母题若只是一再出现,就只是按计划重复的装饰;同一装置若在封面和正文中各有不同含义,就会通过每页检查,却仍让读者困惑其意,且这一问题已在两份不同的演示文稿中分别测得。分支 (c) 中两项都是必需条件,而非权衡项,因为母题就是演示文稿的视觉设计;conservative 和 1–2 张幻灯片的小型需求除外。对于已锁定的模板,不会针对其装置重新运行层级测试(标签 / 图例 / 具象形象 / 移除——陌生感测试;母题也可以是一个构造出来的物件,而非形状——由这份演示文稿自身的材料逐拍构建、每一拍增添一个组成部分,而不是每一拍重复出现;这正是 carried_by 具有结构性而非只是印上去的原因。应从内容中推导出它;刻意不提供菜单,因为物件菜单会变成下一套惯用风格。测试方法:这个物件可以属于任何其他演示文稿吗? 只有当论证需要层层累积时,这才是正确答案——比较、彼此独立的一组发现,或严谨的监管语境,更适合抽象装置;有意识地选择抽象装置,体现的是同样的判断力,并不意味着不够大胆。完整的适用与不适用情形见 agents/slide-design.md;把判断推迟到后续幻灯片再做的说法,即使写成肯定句,也未通过测试)+ interior register: 行(将风格延续到普通内页的含蓄提示,或 none (flat by register — <原因>)——自检 (q) · PRE-FLIGHT 6b · 评论者的 register_interiors 检查都会读取此字段;只在开篇和结尾装点风格,无法通过检查)+ density: 行,包含两个数字——作为 🔴 检查点约定区块中的精简检查点材料呈现(字段相同,包括节奏映射表和分支门槛行——分支 (c) 使用 direction gate:,分支 (d) 使用 style gate:;注明选择的视觉方向或明确说明适用例外)——并在开始制作前取得用户同意。

步骤 3 — 搭建画布

首先,确定演示文稿保存在哪里。 将每份演示文稿放在用户的 Downloads 文件夹中的一个独立文件夹里交付 — ~/Downloads/<deck-name>/,其中包含 <deck-name>.pptx 和一个存放幻灯片 PNG 的 render/ 子文件夹 — 这样用户拿到的是整洁、易于查找的一组文件,而不是 /tmp 里一个散落的文件。 🔴 构建过程中不会生成 .pdf 和 viewer.html。 演示文稿需要反复迭代 — 每轮评审后都要重新构建,之后通常还会在 PowerPoint 中手动编辑 — 因此每次渲染都生成 PDF 和预览页只会徒增冗余:它们会堆在演示文稿根目录中,并在 .pptx 更改后立刻过时,这比没有它们更糟(用户打开过时的 PDF,审阅的就不是正确版本)。它们是预留的交付物:交接时(步骤 6),用户确认演示文稿定稿后,再提供并使用 render_deck … --deliverables 生成这两项。从一开始就将构建脚本的输出路径和 render_deck.sh 的输出目录设在那里(最后无需再复制文件)。首次保存前,先确认 ~/Downloads 存在;如果不存在,就询问用户希望将输出保存在哪里,并使用该位置 — 不要悄悄把文件丢进 /tmp。步骤 6 中要提醒他们打开该文件夹。

🔴 检查点 — 如果缺少 ~/Downloads,请先询问保存位置,再写入任何文件。 (按演示文稿自动执行:此检查点需要询问,因此没有 FYI 形式 — 不要停止。默认做法: 如果主目录可写,则运行 mkdir -p ~/Downloads(这样每份参考演示文稿都假设存在的标准 ~/Downloads/<deck>/ 布局就能保留);只有主目录不可写时,才在工作目录中使用 ./<deck-name>/。绝不要使用 /tmp。一旦选定位置,就立即在聊天中说明 — 自动模式绝不能不告知用户 — 并在交接时再次说明。)

🔴 一旦有了文件夹,就派发图像清单 — 然后继续工作

生成图版是整个流程中最慢的环节(每张约 30–90 秒,脚本会并发运行)。编写构建脚本是你要做的最耗时的事。两者互不依赖: 生成过程在等待托管模型,编写过程则是你在写 Python。同时运行两者。 将所有已批准的图版 — 主视觉、分隔页、内页、每张幻灯片的图版 — 全部放进同一份清单,启动生成,然后直接着手搭建画布和编写构建脚本,无需等待。等你执行脚本时,图像就已写入磁盘;生成耗时也被你原本就要花费的时间抵消了。

  • 真正的屏障是构建脚本的运行,而不是你的判断 — 缺少图像文件时,python-pptx 会报错,并指出缺少的文件,因此脚本执行过早就会明确失败。不存在能悄悄交付缺图演示文稿的情况。
  • 确实会造成阻塞的只有一项:签名幻灯片的素材。 步骤 4 一开始就是签名证明,因此 asset-prep 会优先交付该幻灯片的图版、人物图和图标(其任务说明中已明确要求这样做)。你编写脚本期间,其他素材都可以陆续到位。
  • 按此顺序排列清单: 签名幻灯片在前,其余内容随后。
  • 不要在步骤 2 的设计检查点获批前派发任务 — 提示词、布局和选择加入项都是该检查点要锁定的内容;重新生成被否决的图版,耗费的时间会超过并行节省的时间。

(默认串行从来不是谁做出的决定 — 只是流程按从上到下的顺序执行。串行带来的实际代价:整个生成批次都白等,直到开始编写脚本才开始工作。) 画布格式。 默认演示文稿通过 deckkit.blank_deck() 采用 16:9 格式——保持原样,以下所有内容均以此为前提。如果访谈确认了任何非 16:9 的画面(4:3 场地 · 小红书 3:4 · 正方形 1:1 · 快拍 9:16 · A4 打印 · A0/A1 会议海报,纵向或横向)——或者设计计划中包含非 wide 的 format: 行——请在创建演示文稿对象之前阅读 references/deck-setup.md §Canvas format;其中包含 scripts/formats.py 的契约(band 安全矩形 · chrome · columns_ok · display_scale · lint_flags),以及设计计划在格式不是 wide 时必须记录 format: 行的规则。🔴 注册表不再只是建议:scripts/check_surface.py 会从已构建的画布中还原格式,并在交付时强制执行契约(--gate-check 的 surface 部分,以及 codex 门禁)——包括平台 UI 安全区、columns_ok 规则、社交平台画面上的演示文稿装饰,以及对印刷海报板的绝对三级字号下限和填充比例范围。海报不是放大的幻灯片:阅读者会在约 5 米 / 2 米 / 1 米处阅读,因此 A0 规定展示文字 ≥90pt · 小节标题 ≥36pt · 正文 ≥24pt,均为绝对磅值(deckkit 的封面将标题上限设为 46pt,在 10 英寸幻灯片上恰到好处,在 33 英寸海报板上却无法让大厅另一端的人看清),填充范围为海报板覆盖率的 55–90%,并将方法 + 局限性列为必需内容——吸引人们驻足的广告牌风格,也会删去路人无法自行重构的这两项内容。如需豁免其中任一项,请以书面形式注明(design_plan.surface_sections_waived)。它还设有**PROPORTION下限——海报文献普遍认为文字约占 20–25%、图形约占 40–50%,因为人们站着阅读海报板时,往往几秒内就会做出判断;绘制在文字后方的面板算作容器,而非图形——以及约 50 个单词的TEXT BLOCK**上限,并要求使用 deckkit.qr_panel() 放置二维码、其说明文字和纯文本 URL(拍摄下来的海报仍需要这些信息)。它会根据画布尺寸调整二维码和说明文字的大小(确保符合印刷字号下限),从画面类型获取扫描距离,并拒绝可能超出海报板范围的摆放位置。🔴 印刷海报板不得采用深色背景:check_register_pixels.py 会报告 DARK GROUND ON A PRINTED BOARD,下方的色彩新鲜度规则也会针对印刷画面调整建议(变化纸张和强调色的色相,绝不要改变明度)。

请将每个演示文稿的构建脚本(build_<deck>.py)放在同一文件夹中,与 .pptx 并列。 构建脚本——而非渲染后的文件——才是演示文稿的事实来源,因此应与成品一同交付:这样可以确保之后的每次迭代都可复现(重新运行脚本即可得到相同的演示文稿),也能让你把用户后续提出的修改请求整合到构建流程中,而不是手动修补二进制文件。关于这对交付为何重要,以及如何在不覆盖用户手动编辑的情况下继续迭代,请参阅 references/handoff-and-iteration.md。在该脚本中,应相对于脚本文件解析演示文稿资源路径(例如 ROOT = Path(__file__).resolve().parent),而不是相对于当前工作目录,这样无论从哪里运行 python /path/to/build_<deck>.py 都能正常工作。

  • 模板分支——用户提供了 .pptx,或者 Step 0 找到了官方会议模板:在创建演示文稿对象之前,阅读 references/deck-setup.md → “Template branch”(检查 → open_template() → 沿用模板的品牌风格 → 注册可复用的 profile.md)。 🔴 现在会根据你构建的演示文稿检查已注册的 profile.md,而不只是让你查看它。 添加一个带围栏的 ## Machine-checkable contract json 代码块——可包含 match(用于绑定的布局名称 + 画布尺寸指纹)、layouts、fonts、title_color、must_cover 中的任意项;scripts/check_template_profile.py 会在两条门禁路径上检查构建的文件(LAYOUT OFF PROFILE · FONT OFF PROFILE · TITLE COLOUR OFF PROFILE · UNCOVERED TEMPLATE FURNITURE;可通过 {"template_profile": {"waived": "<why this deck differs>"}} 豁免)。它依据演示文稿自身的指纹进行绑定,而不是依据记录的模板名称,因此即使运行时已将访谈压缩掉,也仍会进行检查;没有 contract 代码块的 profile 会报告 NOT CHECKED,而不是通过检查。**设立它的原因:**此处的注册表是唯一一个会在不同演示文稿间保留记忆的产物——布局索引、无法删除且必须遮盖的装饰矩形,以及某人已经踩过的字体陷阱;但 grep 测得,只有两位制作者读过它,没有任何检查会读取它,因此构建过程可以悄无声息地忽略其中的每一行。了解模板的新信息时,请将其添加到说明文字中;如果机器可以据此做出判断,也要将其添加到 contract 中。

  • 无模板分支 — 由你自行设计外观:请在首次调用调色板、预设或字体之前,阅读 references/deck-setup.md → “无模板分支”。优先使用 presets.apply("<name>")——一次调用即可设置调色板、结构和底色。单独使用 set_palette 只会更改配色(直接设置 deckkit.MAGENTA = … 不会更改那些默认值在导入时就已绑定的组件);deckkit.set_geometry(radius=…, rule_w=…) 负责结构部分——radius=0 会让所有基于方框的组件和 node() 都变成直角,这样才能使用 brutalist/swiss/ink_wash/blueprint,因为这些预设的保护规则禁止圆角卡片;rule_w 会缩放所有卡片边框、分隔线和节点轮廓的粗细,这是让 brutalist 风格真正呈现其特征的另一半。deckkit.set_ground(<bg>) 是第三个要素——apply() 会设置它,add_slide() 会绘制它,因此 8 种深色预设从第一张幻灯片起就是深色,不必依赖作者记住这一点(在此功能出现前测得:dark_tech 以 1.18:1 的对比度,将浅色墨色绘制在白色画布上)。这三项在默认值下都是空操作(scripts/presets.py · references/design-by-purpose.md · references/design-gallery.md)。无论如何,都要遵守两条规则:绝不使用 deckkit 的默认蓝色,也绝不复用上一份演示文稿的配色方案——每份演示文稿都应有独特的标识。如今,这两条规则都由渲染结果进行门禁检查,而不再依赖记忆:scripts/check_register_pixels.py(由 --gate-check 作为 register_pixels 部分运行,也由 codex 门禁运行)会测量演示文稿自身的 PNG,并在实际输出仍使用 deckkit 的默认标识、声明的颜色没有出现在任何像素中,或画布重复了 taste.md 的 LOOK HISTORY 中近期演示文稿的配色时失败。这是唯一能检查自定义预设的检查项——check_style_applied.py 会读取构建脚本,查找 presets.apply() 调用,而手动构建的预设不包含此调用。🔴 它只判断颜色。形状层面的检查由 scripts/check_register_guard.py 负责(--gate-check 的 register_guard 部分,以及 codex 门禁):每个预设的 guard 会声明其预设禁止的内容,而 presets.FORBIDS 会记录机器能够判定的部分——swiss/brutalist 中的圆角、risograph/bauhaus 中的渐变、未切换主题的阴影、terminal 中的比例字体,以及 bauhaus 中超过一个的超大图形。🔴 18 种预设中只有 7 种声明了禁止项,这是刻意为之:“所有颜色都由摄影承载”和“标题必须是完整句子的结论”同样重要,却无法通过文件判定,因此仍以文字说明,检查器会报告哪些预设无法检查。apply() 只设置调色板、几何令牌和底色,不做其他事。实测结果:同一页面使用 18 种预设分别生成 18 页,差异只有底色、圆角半径和线条粗细,既没有 Memphis 风格的页眉色带,也没有 Bauhaus 风格的几何图形。预设的 surface 字段就是可执行规范;请阅读并据此构建,否则这份演示文稿只是披着某个名称的调色板。构图仍需要渲染结果和你的双眼来判断。对于印刷表面,做法恰好相反:新鲜感应来自纸张的暖色调、点缀色和字体,而绝不能靠变暗——印刷厂一致建议不要采用的唯一底色方案就是深色。

  • 🔴 apply() 为你提供寄存器的配色方案;register_surface.py 构建其表面。通过渲染进行测量:同一页面通过全部 18 个预设渲染后生成 18 页,彼此仅在底色、墨色、强调色、一处字体替换和线条粗细上不同——没有孟菲斯风格色带、包豪斯几何图形、玻璃效果、套印效果或扫描线,因为 apply() 只会调用 set_palette / set_geometry / set_ground / 字体设置器,而每个预设的 surface 字段只是供作者手动构建的说明文字,因此它从未真正构建出来。register_surface.ground(slide, "<register>", role=…, index=n) 会绘制该寄存器自有的装饰,并返回剩余的内容区域(就像 title_bar() 返回其内容顶部一样——不会在其中绘制醒目的内容;破坏这条规则的套件会触发 RAISES);register_surface.card(slide, "<register>", x, y, w, h) 为卡片赋予其形式,这正是让页面不再只是颜色不同的关键:孟菲斯风格带状卡片、包豪斯硬边方块、带偏移版的理索贴纸、玻璃面板、终端输出块。这些标记(halftone · starburst · boomerang · zigzag · tri · scanlines · color_band)都可单独调用,因此 BESPOKE 寄存器也可以借用其中之一。🔴 全部 18 个寄存器都有套件——--list 会在每个寄存器旁打印出构建它所依据的 surface 行,--sample <out.pptx> 会为每个寄存器渲染一页相同内容,让差异确实体现寄存器本身;如果名称不是寄存器,就会触发 RAISES,而不会悄悄返回一张普通页面(在 presets.apply() 设置调色板前绘制表面也会如此)。--gate-check 和 codex gate 都会记录声明了已配备套件的寄存器却未使用套件的演示文稿:有意采用安静的处理方式是合理选择,忘记套件存在则不是。

  • 🔴 套件可以缩放,但不得凭空捏造。套件在 10 x 5.63in 画布上以参考英寸为单位组合,并会缩放以适配传入的任意画布,因此相同的装饰在 13.33in 变体、纵向 9:16 画布以及 formats.py 支持的 A0/A1 海报上都能保持比例——英寸不会随画布迁移;缩放层出现前,一个固定的 0.42in 标记在一张画布上占宽度的 4.2%,在另一张上则占 1.3%(包豪斯风格在纵向画布上也会触发 RAISES,因为对剩余色带使用 max() 下限会把区域推回它原本要保护的主视觉上)。而且装饰只能陈述页面本身的事实,不能陈述其他内容:早期版本会在每个使用它们的页面上印上虚构的报头品牌、捏造的修订字母和杜撰的年份徽章——违反不得凭空捏造规则的是装饰,而不是内容。现在有一项测试会限定底色允许使用的全部词汇,另一项则会确保其装饰在自身底色上的文字对比度不低于 3:1(dk.MUTE 是为浅色画布调整的:直接用于蓝图的藏青色底色时,测得的对比度为 2.85:1——请通过 mute_for(GROUND) 解决)。

  • 🔴 自定义配色方案也可以成为工具包——并非只能包含组件和调色板。 register_surface.register(name, ground=…, card=…, forbids=…) 让自定义外观与 18 种预设拥有同等地位:ground()/card() 可正常工作,醒目标记不变量依然成立,装饰元素可适配任意画布,墨色会根据背景解析,check_register_guard 会执行该配色方案声明的禁止项——配色方案拒绝做什么,正是它与单纯换色的区别。python3 scripts/register_surface.py --new "<name>" 会生成脚手架,其中已接入所有契约(填入 ground() 和 card(),然后运行该文件:它会渲染自己的三页预览)。在此之前,自定义配色方案的外观是在幻灯片的 style.py 中手工构建的,这些契约没有一项能应用到它;而 references/bespoke-registers.md 中的四个完整示例只有文字说明——没有一行可运行代码。现在,这四个示例以 scripts/bespoke_kits.py 的形式提供(current · transit-signage · ledger · k-space):import bespoke_kits 会注册它们,--sample 会渲染它们。它们是各自类别的起点,不是可直接粘贴使用的外观。交接时,save_register.py 会将工具包文件保存在配色方案旁边,让下一个制作同主题幻灯片的人从已构建好的外观开始,而不是从描述开始。

  • 🔴 幻灯片自带的工具包应与幻灯片放在一起,命名为 surface_*.py,且每个检查关卡都会从那里加载它。 注册发生在导入时,而检查关卡会在构建完成后于全新进程中运行,因此此前,自定义配色方案声明的禁止项只在进程内得到执行,除此之外无处执行——我们用一个禁止渐变的脚手架工具包和一份绘制了渐变的幻灯片进行了验证:测试中成功拦截,而实际检查关卡却报告“自定义外观没有可检查的 FORBIDS”。两个运行环境中的 check_register_guard 都会调用 register_surface.load_kits(<deck dir>);如果工具包导入失败,会显示一条 NOTE,指出其配色方案未注册,而不会悄无声息地提示“没有需要检查的内容”。交接时,--gate-check 和 codex 检查关卡也会说明自定义配色方案是否有工具包——没有工具包,其外观就只能手工构建,所有契约(内容区域、醒目标记不变量、画布缩放、根据背景解析的墨色、自身的禁止项)都无法应用到它。将文件放在幻灯片文件夹中:--new "<name>" --out <deck-dir>/surface_<name>.py。

  • 🔴 会将用户选定的方向与最终交付的幻灯片进行核对。 分支 (c) 的检查关卡会渲染四种方向,并用一句话记录用户的选择;但没有任何机制会将这句话与构建好的文件进行比较。在一份已交付的幻灯片中验证时发现:选定方向声明了 Georgia 显示字体和居中封面,但实际交付的幻灯片使用了 Helvetica Neue 标题和靠左下方的封面——style.py 设置了 display=,而所有标题都通过 dk.FONT 设置,因此 DISPLAY 插槽从未被读取。作者发现了这个问题;没有任何检查关卡能发现,而 check_register_pixels(声明的颜色必须出现在像素中)和 check_style_applied(声明的预设必须被调用)早已覆盖了完全相同的问题类别。check_direction_applied.py 会比较背景、是否使用强调色、显示字体和正文字体,以及居中与靠左下方的封面——并明确标出未检查的骨架和图案,而不是自行猜测判断。设计偏离是正常的设计选择,并会按轴记录(design_plan.direction_deviations):新鲜度检查关卡会更改背景,对比度下限会更改强调色。没有记录的偏离,才是用户无从知晓的情况。🔴 方向中的 cover_motif/ambient_motif 必须用于绘图,而非文字描述——它们是原始 HTML,预览会将其渲染出来,所以一句描述会作为纯文本出现在全部四个示例图块上,作者会因此选中一个与作者自己的备注相矛盾的方向;directions_diversity.py 会报告绘图插槽中出现了文字描述。描述应放在 note 中,预览本来就会显示它。

  • 🔴 自创的配色记录要在交接时保留下来,否则文件夹一删,它也就消失了。 python3 scripts/save_register.py <deck-dir> 会将其追加到 <registry root>/registers.md,与 taste.md 放在一起——不会重复描述任何内容;它会读取 .deck-gates.json 中已有的选择、调色板、标志性手法和 motif_generates,再补上实际呈现在像素中的颜色。在这套机制出现之前进行测量时,示例库中只有 4 条自创配色记录,而一位用户的视觉风格历史中有 9 条已交付却遗失的记录,因为当时的机制是“记得编辑 Markdown”。--from-history 可找回视觉风格历史中已有记录的配色;--list 会显示集合。在步骤 2 阅读它,并与预设图库一同查看——不是为了复用某种风格(新鲜感仍然不允许这样做),而是因为一条已经让 X 清晰可见的配色记录,是下一个 X 的最佳起点。

  • 无障碍是底线,而不是锦上添花。 lint_deck.A11Y_CODES——缺少替代文本、幻灯片无标题或标题重复、阅读顺序、非文本内容对比度——由 --gate-check 的 a11y 部分和 codex gate 共用同一份列表进行检查,因为同一条底线若在两处维护,就可能导致其中一个运行时悄悄停止执行检查。🔴 可解读性现在是可衡量的,而非只停留在断言上。 一位人类读者对一份通过所有 gate 的演示文稿提出了三个问题后,新增了三项检查,分别将这项技能已经阐明的规则转化为可计数的指标:MOTIF_UNEXPLAINED_AT_FIRST_USE——陌生人测试关注的是首次出现,旧检查只要在任何位置有图例就会放行;这正是 SKILL.md 所说的“写成通过句子的失败测试”,因为它把理解推迟到了之后;UNNAMED_REPEATED_MARK——如果有 4 个或更多相同标记,且附近没有文字,就会报告,因为无论你的本意如何,未标注的重复都会被看作纹理,而且这种组合对所有其他检查都不可见(不是文本、没有标签,对比度检查也会轻易通过);此外,图标豁免类别会根据生成的文件进行验证——motif-dominant 需要有真实醒目的图案,tiny-deck 需要确实是小型演示文稿,template-locked 需要确实使用了模板;豁免必须列出所有触发标记的幻灯片,而不能只列一部分。只有无歧义的子集会阻止通过(lint_deck.A11Y_BLOCKING):形状要么有描述,要么没有;两张幻灯片要么标题相同,要么不同;对比率要么达到 3:1,要么达不到。NO SLIDE TITLE 有意仅作提示——lint 自己的消息称,画布外标题是“陈述型幻灯片的一种获准技巧”,所以这项技能本来就预期会有看起来没有标题的幻灯片;在一份普通且制作良好的 11 页演示文稿上进行测量时,它只触发了一次,出现在结束页上。如果一份严格按规范制作的演示文稿也会触发 gate,那就不是底线,而是在训练人们动不动就申请豁免。请以书面形式申请豁免({"a11y": {"waived": "<who reads this deck, and how>", "waived_category": "…"}}),并在交接说明中注明。scripts/palette_audit.py 现在还会模拟红绿色盲(deuteranopia/protanopia)和蓝黄色盲(tritanopia),并指出哪些颜色组合不再能区分为两种颜色——dk.OKABE_ITO 多年来一直被推荐,却从未有人检查过它。 字体(所有演示文稿,两个分支均适用)。 .pptx 存储的是字体名称,而非字体本身。在设置 deckkit.FONT/MONO/EAFONT/EQ_MATHFONT 前,请阅读 references/deck-setup.md →「Fonts」(任何中文/日文/韩文演示文稿都必须设置 CJK EAFONT;可移植性、交付时需要说明的 EQ_MATHFONT / STIX / Cambria Math 依赖,以及豆腐块问题的恢复方法都在其中),并在交付时说明任何字体依赖。 🔴 演示文稿中指定的字体如果无法在当前机器上解析,这是测量故障,而非可移植性提示。 所有适配/换行/溢出/页脚检查都依赖 deckkit._measure_lines,它测量的是能够解析到的字体——因此,指定了但本机不存在的字体会导致构建和 lint 使用相同的错误数值计算,并且两者彼此一致,渲染结果却与两者都不一致。「演示者是否有该字体?」仍属于提示信息(无法从文件中得知);「该字体在此处能否解析?」则可以确定,并且现在会通过 scripts/check_fonts_resolve.py 在两条门禁路径上的交付环节进行阻止(可通过 {"fonts": {"waived": "<为什么此处接受替代字体进行测量>"}} 豁免)。设置字体前,有两点值得了解:deckkit 随附的默认值是 FONT='Calibri' / MONO='Consolas',而且macOS 均未随附这两种字体,因此在原生 macOS 环境中构建时,所有内容都会使用替代字体进行测量,直到你调用 deckkit.use_platform_fonts() 或安装这些字体;此外,仅存在于应用程序包内的字体(macOS 上的 Calibri 和 Cambria 位于 PowerPoint 内)对渲染器不可见,因此请先将其复制到 ~/Library/Fonts——复制前请先征求同意,因为这是用户的机器。

第 4 步 — 使用 deckkit 构建

🔴 步骤 4 以 ANCHOR PROOF 开场——在其他幻灯片尚未创建前,先渲染三张幻灯片

🔴 而且,标志性锚点不是只构思一次,而是要经过比较。 为这一页制作 2–3 种真正不同的 构图,一次性渲染,然后盲读,根据你看到的内容选出方案。为什么只在这里做:这项技能会在整个演示文稿层面比较外观(方向关卡中的 4 种已渲染方案),却从未在单页层面比较过构图—— check_direction_applied.py 本身就说明了这一点:它将骨架和主题元素列为未检查项,因为它们需要判断。这里就是要做出这种判断,并以设计师的方式做出判断。

python3 scripts/render_deck.py <probe>.pptx render          # 渲染所有变体,一次完成
python3 scripts/composition_probe.py compare <probe>.pptx --slides 1,2,3
python3 scripts/blind_read.py packet <probe-dir>            # 然后交由独立读者盲读

🔴 选择方案要靠观察,而不是推理计划。 盲读者会对每个变体回答相同的固定问题;要保留的方案,是其 claim 最接近本页应传达要点的那个——即 blind_read.overlap(claim, takeaway) 的结果,这是一个经过校准的实际数值;同时还要尽可能少出现 unreadable 条目和严重问题。若结果相同,则依据你的判断选择,并记录下来。根据构建脚本来决定,正是这一步要取代的习惯。

成本几乎为零: 启动 LibreOffice 才是渲染的主要耗时,因此一次渲染三个变体的成本和一个差不多(实测:1 页 5.0s,3 页 4.5s)。改变骨架,而不是颜色——调整区块数量、主导区块,以及页面横向还是纵向展开。换色或重新排版的副本只是外观变化,方向关卡已经负责外观,而 composition_probe.py 会拒绝这种做法:其差异度量基于包含 10 种布局的语料拟合,并在未见过的 9 种布局上验证(36 对中错误数为 0),因此“3 个变体”不能只是 3 种重新设计风格的版本。将结果记录为 design_plan.composition——包括测量特征、选定方案,以及 why:你看到了什么,并注明比较过哪些版本。看起来更好 正是整个步骤要取代的说法。boldness: conservative 的演示文稿不需要这一步(它声明自己没有审美风险);使用提供的模板则标记为 template-locked。🔴 每项取舍都要根据构建后的文件进行检查,而不能只凭文字认可——而生成的视觉识别(Q1 d)建立在空白演示文稿上,因此不能借用现成的视觉识别:Q1 的选择决定外观来源,绝不决定由谁来构思页面。 boldness: / signature move: 约定作为文字获得批准。真正体现或削弱这些约定、让设计变得安全保守的像素,要等到整个演示文稿构建完成后的步骤 5 才会出现——届时,批评者指出“标志性设计手法被磨平了”就意味着要重建,而这正是先接受、后修正所付出的代价。证据要放在决策发生的地方——并验证这三项都会在步骤 5 才暴露、届时需要重建的问题,而不只是其中一项:

锚点页面验证内容捕捉的问题
signaturesignature move: 指定的幻灯片审美风险在构建后仍然存在设计手法被磨平,变回安全的样板
complex内容计划中最密集的页面设计能够承载内容页面看起来不错,却承载不了内容——批准设计时用的是宽松页面
data最关键的数据/结论页面图表使用相同的视觉语言配色和字体是依据文本选择的,而第一个原生图表却完全不遵循它们

(为什么不选封面这个显而易见的第三个锚点?它已经有两道关卡——分支 (c) 会在方向关卡渲染 4 个完整方案,分支 (d) 会在自己的 🔴 检查点展示一张已渲染的主视觉。把封面设为锚点,只会再次验证原本就没有缺失的页面,却让另外两项依然未经验证。)

  1. 先创作三张锚点幻灯片——标志性幻灯片;如果该创意的结构性主张只有跨页才清晰易懂,还要加上它的 carried_by: 配套页;此外还有计划中最密集的页面,以及关键数据/结论页面。若演示文稿少于三张幻灯片,则数量减少到与幻灯片总数相同(1–2 张幻灯片的简短需求会完全跳过这项流程,见下文)。
  2. 构建后,只渲染这些页面: python3 scripts/render_deck.py <deck>.pptx <out> --slides N,M,K。这些 PNG 与完整渲染中对应页面的字节完全相同,因此是证据,而非近似结果。🔴 这里节省的不是 --slides 带来的成本——渲染 3 页的耗时和 18 页差不多(见下文),因为渲染需要固定的 LibreOffice 启动时间。这项流程节省的是创作时间:你只需创作 3 张幻灯片,而不是 20 张,就能发现设计有问题。
  3. 展示这三张 PNG,每张配一句话:“这就是 <signature move> 实际呈现的样子” · “这是承载内容最重页面的设计” · “这是真正采用这种视觉语言的图表。” 默认流程中这是一个 🔴 暂停点;如果针对该演示文稿设置了 AUTO WAIVER,则降级为像其他审批暂停点一样的提示信息——豁免会取消等待,但不会取消产物。
  4. 然后创作其余页面。如果验证结果不理想,你需要重做的是 3 张幻灯片,而不是 20 张。
  5. 记录结果——运行记录中要在批评者约定卡上附带一个 signature proof: 标记并传递到步骤 5,每个锚点各一条:signature proof: signature slide N → <png> · complex slide M → <png> · data slide K → <png> 或 skipped: <the named carve>。没有这项记录,这一步从机制上就只是建议,而这正是整个批处理流程要修复的问题:这样批评者就可以根据获批的样稿检查每张已交付的锚点,而跳过步骤也会清晰可见,不再悄无声息。交付关卡也会强制要求相同的三个锚点(design_plan.signature_proof 现在是一个包含 {role, slide, png} 的列表——两个关卡路径会导入 scripts/anchor_proof.py 中的同一套约定,避免出现分歧)。

🔴 现在可以记录豁免了,而以前不行: {"material_probe": {"waived": "<which template / which mimic / how many slides>", "waived_category": "registered-template | provided-template | mode-a-mimic | tiny-ask"}}。两个关卡路径都接受此记录,也都会拒绝将 conservative 作为类别,因为本段说明,克制本身也是一项重大决策。在此之前,关卡完全没有豁免选项,因此使用已注册模板的演示文稿只能凭空创建验证产物,并写明关卡与本文内容不一致——如果规则记录不了其明文规定的例外,就会迫使人们做出不实记录。 仅在以下情况跳过: boldness: conservative,并且记录了“刻意保持克制”这一条款(没有承担风险,因此无须验证);或者是 1–2 张幻灯片的简短需求。使用已注册或已提供的模板时不能跳过——借用的视觉风格仍然有标志性幻灯片,而这正是模板演示文稿能否经过设计、而不是原封不动停留在模板状态的关键。

(以一份 18 张幻灯片的演示文稿实测:--slides 渲染约为 2.9s,完整渲染约为 2.8s——耗时相同,因为两者都要支付约 2.5s 的 LibreOffice 启动时间,而且页面数量几乎不影响耗时。因此,验证的绝对成本很低(一次构建加一次渲染,几秒钟),并不是因为渲染的页面更少;真正重要的是,你还没创作那 20 张幻灯片。因此,从一个锚点增加到三个,在两个真正产生成本的方面几乎都不增加负担:无论如何都只需固定启动一次渲染(机器耗时约增加 0s),而且三个页面都放在同一个构建脚本中,通过同一次渲染调用完成,所以往返次数——也就是演示文稿实际耗费的墙钟时间——不会增加。你多花的成本是多创作两张幻灯片;换来的则是在只有三张幻灯片时,而不是十二张之后,就发现设计无法承载内容最密集的页面。这比一轮批评所花的时间还少,而且是在昂贵的创作工作之前,而不是之后付出。此流程并不与下文“通过一次脚本运行构建整个演示文稿”相矛盾:验证使用的就是同一个构建脚本,此时脚本中只有三个锚点——你只需扩展一个脚本,从不需要维护两个脚本。素材说明:根据素材准备任务的要求,标志性幻灯片的素材是素材准备阶段最先交付的内容。一次渲染可以满足多项流程的需要:如果 Gate A 的单张真实幻灯片保真度确认尚未执行,就用标志性幻灯片作为那张确认幻灯片;大型演示文稿的验证也可兼作早期渲染样本。不要分别执行三次单页流程。 如果验证效果不理想:在同一个构建脚本中修改标志性幻灯片,然后重新运行同一条 --slides N 命令——这是页面级循环,耗时仅几秒;此处的 N 是该幻灯片的当前索引,因此如果后续创作导致页码变更,signature proof: 标记要记录交付时的最终页码。) 编写一个小型的单套牌构建脚本,导入 scripts/deckkit.py(不要重新推导基本图元;完整签名和行为见其文档字符串)。以已批准的 Design 计划(形式台账、节奏、逐页设计、色彩、logo)作为事实来源——幻灯片设计 Agent 已为每页选定视觉形式,且用户已在 DESIGN 检查点批准,因此不要重新推导已批准的形式。 仅在计划未明确之处使用回退方案: 有意为该页选择形式——生成 2–3 个候选形式,并依据 references/form-selection.md 中的决胜规则选出一个;不要默认将每张多项目幻灯片都做成卡片网格。 🔴 如果该形式有 COMPONENT,就构建该组件——不要用原始 box/connector 图元手工拼出替代品。 选择绘图形式(waterfall、gantt、dumbbell_board、dot_strip、tier_stack、native_chart、eval_matrix、heat_matrix、meter_bar、timeline 等),然后用方框手工绘制,就会重新引入组件已经修复的那些几何和语法错误——基线宽度被硬编码成一个数值,导致在最后一根柱之前就结束(组件会根据数据推导坐标轴);瀑布图把 +8 / +8.3 / +16.3 当作同级柱重复计算;或者把两种数量混为一谈(在一个 135% 堆叠中混合到手金额和雇主成本)。这是“图表看起来杂乱/不对”缺陷的头号来源。只有当库确实缺少某种形式时,才调整组件参数或组合基本图元——此时责任就在你身上: 根据数据推导每条坐标轴/基线/轨道范围(用 last_bar_x_end − axis_x,绝不能手选宽度),并且不要重复计算(见 references/design-principles.md 中的“Designed plots”和“Big numbers”)。 辅助函数按用途分类:

  • 版式框架: title_bar/content_slide、footer、editorial_header(大写眉题 + 标题 + 细线)、part_eyebrow/page_marker(等宽眉题 + 页码标记)、logo(每页固定角落持续显示的品牌/机构/产品标记——见下方品牌 logo 规则)。

  • 安全布局——测量或锚定,绝不要随意选 y 坐标: columns/rows(等宽,或使用 weights= 按比例划分的面板——经测量的 1/3–2/3 或侧栏 + 主区布局;无论哪种方式,外侧边距都对称)、content_band(标题下方/页脚上方的安全矩形)、bottom_callout(页脚安全的底部要点——锚定到内容带,向上扩展,不会发生碰撞)、vstack(…, bottom=)(经测量的堆叠:间距相等且按构造不会重叠;溢出时在构建阶段报错),搭配 measure_callout/measure_bullets/measure_text 辅助函数、spaced_centers(为时间线/刻度行/编号步骤生成均匀间隔的标记中心,两端留有内缩空间,让居中说明与端点标记保持共中心——用它代替手工排列圆点和说明文字;靠近幻灯片边缘时,手工排列会导致首尾说明与圆点错位;timeline 已使用该函数)、picture(fit="contain" 保留边缘/"cover" 裁剪)、make_gif(从计算出的帧生成循环 GIF)+ gif(嵌入动画 GIF,不失真,并提供尺寸/静态警告)+ gif_poster(提取第一帧/代表帧,确认渲染和 PDF 导出显示的内容)——生成 → 嵌入 → 检查、icon/icon_tile/icon_badge/icon_ghost/icon_card(放置开放许可的 SVG 图标——通过 scripts/icons.py 重新着色并栅格化;它还支持双色调权重和渐变填充;icon_tile 是通用容器——圆形/圆角方形/方形 × 纯色/渐变/玻璃瓷砖,icon_badge 是环形徽章,icon_ghost 是放大的浅色水印,icon_card 是特色卡片左上角图案;根据套牌调整样式——见 references/icons.md 的“Treatments”)。(这些辅助函数的存在,就是为了避免你硬编码较小的 y 值——这是反复出现的重叠/页脚缺陷。)

  • deckkit 没有辅助函数的形状 → dk.adopt(slide.shapes.add_shape(...))。 python-pptx 会在手动添加的形状上保留主题 <p:style>,所以 LibreOffice 会在形状下方绘制柔和投影,且 lint_layout 会报告 INHERITED_EFFECT;过去唯一的补救方法是私有函数 _flat,作者只能通过阅读源码找到它。adopt 会返回形状,因此可以内联组合使用。

  • 形状基本图元: box(矩形;round=True 会将角倒圆)和 disc(圆形,或通过 h= 指定椭圆)。🔴 box(round=True) 无论半径如何都无法绘制圆形——它绘制的是圆角矩形,r=d/2 仍然是圆角矩形。实测中,一个以双态环为标志图案的套牌发布了三个渲染版本,设备所在位置却都是绿色正方形,没有报错,也没有 lint 代码,因为库内部使用了 MSO_SHAPE.OVAL 十七次,却没有对外提供它。disc(s, x, y, d, fill=…, line=…, line_w=…) 使用与 box 相同的参数形式,从左上角放置,就像其他所有基本图元一样,并且会被扁平化,因此不会继承主题阴影。

  • 编辑类图片形式: picture(..., fit="cover", shape="ellipse"|"arch"|"snip"|"notch"|"blob") 会把照片裁成圆形、拱形、切角、缺口卡片或有机形状(遮罩会真实出现在渲染结果中,不只是 XML);focus=(fx, fy) 用于调整裁剪目标,避免裁掉人脸;rotation= 用于倾斜贴纸照片。两种边界检测都会测量形状实际绘制的位置;旋转 90° 时测量精确,因此垂直页边距标签也安全。使用 image_fx.sticker_outline(path) 可将抠图 PNG 变成贴纸(若照片不透明则会拒绝;请先抠出主体)。 🔴 遮罩或旋转后的图片仍然是内容图片——适用替代文本和指涉对象规则。

  • 高亮词语: dk.mark(run, color) 会在 text() 段落中将一个文本片段放在荧光笔色块上——使用原生 <a:highlight>,随换行调整,并支持 CJK。改为在词语后方绘制形状只能靠猜测定位,遇到换行时会偏离词语。mark() 会拒绝在高亮背景上使用不符合 WCAG 的文字颜色(用 dk.on(color) 选择文字颜色);渲染检查会将高亮识别为该文本片段的背景。

  • 手绘标记(scripts/ornaments.py): squiggle · scribble · brush_stroke · tape · scallop——原生可编辑几何形状,标记为低调图案(主视觉请用 loud=True),以便计入图案预算,且让 TEXT_OVER_MOTIF 识别叠放其上的说明文字。选用一两个有意义的图案(在主张下方画波浪线、用 tape(..., holds=pic) 固定照片——holds= 声明这处重叠,并会拒绝没有碰到照片的胶带),绝不要撒满装饰。如果小型 scallop 徽章上有数字,则它会被视作叠放在装置上的文本:用 dk.overlap_intent(<the TEXT shape>, "<why>") 声明——检查会从文本而非徽章读取声明。

  • 纯装饰: dk.decorative(shape, "<why>") 声明形状上没有任何观众必须阅读的内容——例如浅色和纸胶带、细线装饰——因此交付阶段的非文本对比度要求(WCAG 1.4.11,对装饰予以豁免)不会拦截它。逐个形状声明,并写明理由(CJK 字符对最低长度的计数加倍);lint 会打印每项豁免及其理由。如果未声明,页面底色上对比度低于 3:1 的标记仍会被拦截——检查无法判断它究竟是装饰还是有意义的标记。

  • 文本和区块: bullet、callout(自动扩展)、chip、modbox(带标签的模块框——在用 connector 连接架构模块/代码文件/系统部分时,用它作为节点;普通 node 太过简陋;可添加角色词和可选文件名/标签)、arrow、table(高亮关键行)、code_block、hrule。

  • 色彩: palette(n, ACCENTS)(生成 n 种彼此不同且经过对比度检查的填充色——会在相邻颜色色相相同时发出警告;绝不用灰色凑数)、palette_from_image(匹配生成模板的配色)、accent_one(单一强调色原则)、contrast_ratio(提交前确认对比度 ≥~4.5:1)。

  • 数据装饰和图表: scorecard/leaderboard/takeaway_rail、change_stat(以基线为中心,展示前→后变化)、stat_row、big_numeral;可编辑的原生图表 native_chart / native_dual_axis / native_donut / native_pareto / native_bubble(直接通过 series_from_csv(path, x_col, y_cols) 从电子表格导入数据 → (categories, series);使用标准库,无需 pandas),以及 scripts/designed_charts.py 中的栅格图表方案(包括 waterfall——显示总量上升/下降/汇总的过程,并用语义颜色区分增减;distribution——当数值是测量值的均值而非计数时应使用的形式,因为样本均值柱会隐藏样本量 n、分布形状和异常值;marimekko——同时展示大小和占比;radar——展示 3–8 个轴上的特征,系列数 ≤3)——根据 references/data-viz.md 选择。

  • 页面架构(骨架,而非内容): skeleton(slide, kind) 会返回八种架构之一的命名矩形;lint_deck 已要求这些架构在套牌中保持多样性——statement · split · island · dashboard · band · full_bleed · rail · gallery(flip=True 可镜像三个非对称架构)。它不会绘制任何内容,与 columns() 一样。🔴 构建前先确定顺序: python3 scripts/plan_rhythm.py --roles <r1,r2,…> --carry <n,m> 根据每页的角色提议架构,保证至少有 4 种不同架构,且三页范围内不重复;耗时约 40 ms——使用确定性的算术,而非模型调用。架构多样性检查和布局单调性检查都在构建之后才会触发;等内容写好后才变化架构,就得重新排版。实测中,同一内容经规划后得分为 8 种不同骨架,而临时编排仅有 2 种。这只是建议——若内容适合其他架构,可以调整,并记录调整原因。如果方向检查点已选定构图,请传入 --home <skeleton>,让用户的选择继续成为套牌的默认视觉风格。评审时,python3 scripts/composition_cues.py <deck-dir> 会报告七项经测量的视觉提示以及套牌整体的各项范围——某项范围平坦,表示套牌缺少逐页外观变化、整体显得单调;此项只报告,不设为阻断检查。

  • 模块化布局: bento(slide, x, y, w, h, tiles, cols=…)——以同一节奏排列不同大小的网格块,根据 (span_cols, span_rows) 跨度打包,并返回供你绘制内容的矩形。columns()/rows() 提供等权条带,columns(weights=…) 可以在同一行内调整宽度;此函数则以单一模块为基准,同时调整两个轴,使一条信息拆分成重要性确实不同的单元——最大网格块就是重点,读者在阅读文字前就能从几何形状中看出优先级。整个网格只使用一个间距数值,因为间距不一致会让模块化布局看起来像是意外排出来的;如果某个网格块无法放下,它会报错,而不会悄悄将其丢弃。

  • 演示/层级/对比网格: image_grid(N×M 带标签的图像对比——列为方法,行为案例,每个单元格下方标注指标。适用于图像/重建演示的结果页,也是唯一一种图像网格本身就是论点的形式,因此 form-selection.md 中“一个有力的大图胜过一组小图”的原则不适用。它会读取每张图片实际放置的矩形,并据此推导所有标签;整个网格只使用一种纵横比,因此 contain 和 cover 完全一致——从构造上保证无留白、无裁剪。它会拒绝混用视野、参差不齐的行、缺少 col_labels、超过 16 个单元格、单元格小于 0.8 英寸,以及会换行的指标,避免交付难以阅读的缩略图。对它所替代的手工版本进行测量后发现:每个标签都离所标注面板 0.67 英寸,每个单元格有 65% 的面积被留白占据——而 lint_deck 却报告 0 findings ✓ clean,因为 CAPTION NOT ALIGNED 在结构上无法检测多行网格)· annotated_figure(真实图形 + 编号标记 + 编号说明栏 + 可选放大插图——整合图形规则要求的引导式图形讲解,不再需要手工搭建)· small_multiples(共享数值轴的同类小型原生图表——原有文档方案让每个面板自动缩放,因此小幅波动和巨大波动看起来一模一样)· position_map(用两个连续轴标记 N 个带标签的项目——保留 quadrant() 丢弃的象限内位置)· org_tree(整齐的层级图:父节点按质心对齐,使用水平总线;无法清晰排布时会报错)。

  • 2.5D 等距视图(原生绘制——不需要生成图像): iso_bars(忠实呈现数据的 2.5D 柱状图——挤出高度与数值线性对应且以零为基线,因此深度不会扭曲数据)· iso_stack(分层架构/逐级披露阶梯/决策堆叠——带标签的浮动等距视图切片)· iso_prism(作为主视觉的单个挤出块)。采用固定投影(真正的 30° 等距视图,平行投影而非透视投影)和单一光源的表面明暗处理,让套牌中的所有 2.5D 元素看起来属于同一套系统。像生成图像一样适度使用——可用于堆叠、层级或一张主视觉图表,绝不要每页都用;文字无法倾斜到表面上,因此标签应放在几何形状旁边。如果 2.5D 需要呈现丰富、富有氛围的场景(而非数据),应使用生成图像方案,而不是这些函数。

  • 注册标记(register_mark)——构建低调图案,不要重新推导。 方向检查点要求使用专属注册图案;在有这个辅助函数之前,deckkit 没有绘制注册图案的基本图元,因此每套牌都只能用原始方框手工制作标志图案。实测中,一个此类辅助函数在 x 方向调整了每个圆环,却没有在 y 方向调整,因此在十二页的角落里画出了三个相互交错的圆——文氏图,而没有任何检查发现这一点,因为没有检查能识别图案应当是什么样。register_mark(slide, kind, corner=…) 可以从构造上正确绘制十一种标记:五种中性图案,arcs(共用同一个中心的同心圆环,无法再画出那个错误图案)· rule(内缩的边缘线)· ticks(间隔均匀的刻度)· ordinal(角落数字)· grid(小型细线网格);以及六种取材于主题领域的图案——因为若套牌只用五种中性图案,它在角落呈现的样式就会与其他套牌相同,而方向检查点正是为了避免这种同质化:seal(印章——权威、许可证、证书)· stitch(穿孔缝线——制成品的连接处)· trace(信号波形——任何被测量、监控或听到的对象)· contour(等值线——地形、场、等值集合)· caliper(比例尺——任何需要测量大小的对象)· hatch(手绘阴影——与 grid 的机器绘制相对应)——并为绘制内容添加标签。仍可自由创作:想画什么都可以,只需对形状调用 deckkit.tag_motif(shape, loud=…)。🔴 标签赋予图案可供机器识别的存在形式;技能说明一直强调的两项约定,也只有借助它才能检查:TEXT_OVER_MOTIF(标题穿过装置——TEXT_OVERLAP 会测量文本与文本之间的重叠,而图案是几何形状,因此无法发现;如有意设计此效果,请声明 overlap_intent)和 MOTIF_BUDGET(设计计划承诺的 ≤3 次醒目图案出现次数——主视觉请传入 loud=True;低调的注册标记按设计不计入预算,因为它本来就应该每页重复出现)。未添加标签的套牌不会因为没有使用这套词汇而受到处罚。

  • 醒目级别(motif_page)——几何形状本身就是图案的页面,以及解释它的图例。 motif_generates.page 要求每套牌都有此页面;在有这个辅助函数之前,每套牌都只能用原始方框手工制作——与上方文氏图同类的问题,只不过再往上一层,而且整个套牌的主视觉页都依赖它。motif_page(slide, kind, legend=…) 根据各领域常见的生成关系构建图案,为所有形状添加醒目标记(这样该页恰好消耗一次预算,且 MOTIF_BUDGET 能够识别),并在装置旁绘制图例:seam(两个部分在铰链处相接——从一种状态过渡到另一种状态)· conduit(带分支的主干——沿线累积)· strata(权重不一的层级——深度、层级、沉积)· radial(从单一原点发出的辐射线——扩散、触及范围)· lattice(交织构件——耦合、网络)· orbit(带有运行物体的同心路径——周期、回归)· aperture(逐渐收窄至开口的框架——聚焦、漏斗)· terrace(逐步上升的台阶——阶段性推进)。🔴 选择关系与你内容中的关系相符的类型,再为主题更换材料(references/bespoke-registers.md——保留方法,更换材料);若只因外观而选类型,那只是按计划出现的装饰。faint=True 会降低图案的醒目程度,让它适合作为内容背景。陌生人测试现在可以计数: motif_legend(slide, "<what the device MEANS>") 会绘制小型图例(图案样例 + 文字),如果套牌中有醒目图案却没有任何说明,MOTIF_UNEXPLAINED 就会报告;三种认可的做法依然是标注、配图例,或将其做成具象表达。第三种做法会有意保留这项提示。

  • 划线穿过文字时,它本身就是一条规则,现在可以声明这一点。 RULE_THROUGH_TEXT 是为手动指定 y 坐标的分隔线而编写的 CRITICAL 检查;段落扩展后可能会被分隔线穿过——过去没有办法声明这种有意设计,而它的两个同类检查都有相应声明方法(TEXT_OVERLAP → overlap_intent,OFF_CANVAS → bleed_intent)。实测中,一套需要划掉三个项目的套牌不得不放弃这种标记。现在,deckkit.overlap_intent(rule, "<why this crossing IS the mark>") 可以豁免此检查——仅限几何重叠:TEXT NOT VISIBLE、对比度和遮挡检查依然会运行;如果分隔线真的抹掉了文字,仍然会被检查发现;未声明的分隔线也仍会像之前一样失败。

  • 有意出血(bleed_intent)——OFF_CANVAS 是一项阻止保存的 CRITICAL 检查,这样做是合理的:卡片或标题超出页面,是构建交付的内容无法阅读的最常见原因。但让标志装置延伸到边缘是常见设计——原点位于画框外的扇形辐射线、延伸至裁切线外的编织图案,或以大圆弧绘制的轨道——过去若想使用此类设计,只能设置 lint_layout(strict=False),从而关闭整套牌的所有检查。实测中,motif_page 的八种类型有三种无法通过标准构建流程保存。deckkit.bleed_intent(shape, "<why this leaves the canvas>") 是有限、可记录的例外方案——逐个形状声明理由,并由两个 lint 同时认可(构建阶段的 OFF_CANVAS 和文件级别的 OVERFLOW);它也可以与图案标签组合,因此出血装置仍计入 ≤3 的预算。未声明的画布外形状仍会失败,这正是其目的:检查仍能抓到意外溢出,同时不再阻止有意构图。motif_page 会自动为自己的溢出形状添加声明。

  • 有意重叠(overlap_intent)——lint_layout 的 TEXT_OVERLAP 是一项阻止保存的 CRITICAL 检查,这样做是合理的:文字碰撞是构建交付内容无法阅读的最常见原因。但它也会阻止两种常见的编辑设计手法——小字叠在超大展示文字上(大小对比)以及背景几何形状穿过段落——而且无法声明“这处是有意的”,因此这些套牌根本无法保存。为有意充当背景的元素添加标签:dk.overlap_intent(big, "the display word is the ground the caption rides")。使用标签,而非阈值,原因与 ghost_numeral 豁免旁的说明相同——“根据大小猜测,既可能放过实际缺陷,也可能阻止合理的水印。” 理由必填(至少 16 个字符),并会保存在形状中,因此声明就是构件本身的证据,而不只是计划中的说法。它只豁免几何重叠,不豁免对比度: 对比度、TEXT NOT VISIBLE 和渲染时遮挡检查仍会运行,未声明的碰撞仍会像之前一样失败。

  • 按测量结果放置: image_fx.quiet_region(path) → 图像中最平静的单色区域 + 平均亮度(根据数据选择深色或浅色文字,而非凭目测)· deckkit.pic_alpha(原生图片不透明度——保留图片自身色彩的浅色底板,无需遮罩形状)· deckkit.design_intent(slide, envelope=…, rhyme=…, weight=…)(声明有意使用的安静/基线/出血风格,让渲染时 lint 检查设计意图,而非凭空猜测)。role="appendix" 标记备份/问答部分的起点:从该页开始,幻灯片会以简报密度阅读(参考材料本来就应该内容密集——若不声明,答辩的备用幻灯片每页都会触发 TEXT WALL + CROWDED),并让其前一页重新获得结尾幻灯片豁免,否则豁免会被尾部附录占用。weight="left"|"right"|"asymmetric" 声明有意采用单侧编辑式构图——艺术指导手法之一,将另一半留作真正的留白。lint 的建议(“重新平衡”)会破坏这种设计,因此这是唯一需要主动声明的构图风格;未声明的失衡布局仍会触发警告。

  • 决策/计划/网格: eval_matrix(选项 × 标准评分网格——用 harvey_ball 五等分填充符号或 ✓/◐/✕ 标记;recommend= 为优胜项着色)· heat_matrix(按数值着色的类别 × 类别网格,scale="seq"|"div"|"risk")· tier_stack(单一收窄结构:mode="funnel" 表示筛选流失/mode="pyramid" 表示层级,另有包装函数 funnel()/pyramid())· gantt(带共享 axis_scale 的定时任务条、lanes= 泳道、today= 标记——呈现持续时间与重叠;timeline 只显示时间点)· sankey(流向图——展示数量流向何处;带宽严格按照全套牌统一的比例尺映射到数值:资金流出和回流、供应链、预算划分;使用 links=[(src,dst,value),…],根据图结构推导列,使用 col_labels= 标注阶段。它会预留 label_w 标签边距,并根据剩余空间推导流线区域,因此应传入完整区域。如果数值为零/负数或图中存在循环,它会拒绝绘制,因为此时宽度毫无意义)。

  • 图表/模式: quadrant、hub_spoke、timeline、before_after/image_tab/photo_triptych、device_frame(在 chrome="browser"/"phone" 边框中放置真实截图)、wireframe_grid+spec_list、corner_frame、photo_card、backdrop_motif、repeat_row(将 N 个除索引外完全相同的单元表示为样例 + … + ×N;共同细节只说一次——绝不要重复放置 N 个相同区块)。

  • 数值→几何映射器——根据标记表达的含义选择,绝不要手工推导算术: axis_scale(x, w, lo, hi) 将数值映射为轨道上的位置(点条、哑铃图、按数值间距排列的时间线、gantt);任何 lo 值在这里都合理,因为在 40 和 50 之间的 47 会正确显示为一个点。bar_scale(span, values, group=) 将数值映射为长度,并且完全不接受 lo——柱长表示比例,因此基线不为零不是缩放选择,而是错误陈述(从 1.4 起画出的 1.5 和 2.1,看起来会是 1 : 7)。调用 sc.bar(slide, x, y, thickness, value, fill=…)(纵向柱请设置 vertical=True):它会以零为基线绘制,将负值画在零线另一侧——若错误地使用 max(abs(v)),就会选中最大正值并放错零线位置——并为每根柱添加标记,让构建时的 DATUM SCALE 检查确认几何形状仍与数据匹配。自行绘制的柱不会经过检查,不能假定它正确;调用 mark_datum(shape, value, group=) 可将其纳入检查。

  • 由照片承载整页内容: photo_backdrop——图片铺满整页,文字置于纯色面板上;面板会放在 image_fx.quiet_region 测量到的照片最平静位置,并返回 (x, y, w, h, ink);文字颜色根据面板而非照片确定,同时在面板内标注来源。必须提供 alt=(缺少时会产生阻断型无障碍问题),且 alpha 低于 0.88 时会报错——遮罩只能使线条变暗,无法移除线条,因此有意洗白处理应使用 scrim_overlay 组件。panel= 可覆盖测量结果(left/right/bottom),panel="none" 会返回安全矩形,文字颜色根据图片自身亮度选择,并交由你确保对比度。

  • 表面效果(深色/玻璃/印刷): glass_card/glow/scrim_overlay(渐变 + alpha 填充)、offset_shadow(硬朗凸版/理光印刷阴影)。 slide_background(s, color) 用于绘制纯色页面背景——用它代替 box(s, 0, 0, W, H, fill=…)。 它会写入真实的 <p:bg>,因此编辑时用户无法选中、拖动或删除背景(全画布矩形可以选中,拖动幻灯片的任意空白区域都会选到它)。渲染和 lint 的结果完全相同——lint 会从 <p:bg> 合成相同的背景记录,因此对比度、深色底板和密度检查均不变。非纯色背景仍需使用矩形/picture()/scrim_overlay 方案:此处渐变、图像和 alpha 无法通过 <p:bg> 实现。

  • 照片上的玻璃效果: frosted_panel(slide, backdrop_pic, x, y, w, h) 会精确模糊面板下方已放置照片的对应区域,并返回 (x, y, w, h, ink)——根据玻璃面板本身的明暗范围测量文字颜色,采用能达到 4.5:1 的最浅色洗白效果(否则会报错)。glass_card 仍用于深色 UI 背景上的矢量伪玻璃效果。

  • 出版物和数学公式: cover/colophon(为套牌设计封面和封底)、sources_page、specimen_card;equation_native(可编辑的 LaTeX 子集公式——真实文本片段,随处可渲染;默认选项)/equation_png(栅格化 LaTeX,适用于分数/矩阵等二维数学公式)/eq_par(行内文本片段)。

  • 东亚(CJK)装饰: seal(朱红印章——墨色套牌中的唯一红色强调色)、cjk_numeral(使用壹·贰·叁章节标记,而非拉丁数字“01”)。参见 references/east-asian-aesthetic.md。

  • 图表工具包(通用流程图): node + connector / flow_chain(连接相邻节点的直线)+ elbow_connector / loop_path(用于反馈/重复循环、返回或连接非相邻节点的肘形/U 形路径)——使用圆角矩形/药丸形/圆形节点实现任意架构。 🔴 连接两个区块时,要连接它们的边缘——使用边缘锚定系列函数;绝不要把区块的中心传给 connector/loop_path(这是第一大连接器缺陷,CONNECTOR_IN_BOX):直线箭头用 connect_boxes(a_rect, b_rect) · 一个中心节点连接多个分支用 hub_spokes(hub, spokes) · 反馈/返回 U 形连接用 loop_between(a_rect, b_rect)。传入与 box/node 相同的 (x,y,w,h),构造过程会保证两端都落在边界上。 (+ 适用于正式流程图的菱形/平行四边形/圆柱——见 design-gallery.md 中的标准符号速查表)并遵循线条语义(实线 = 必需 · 虚线 = 可选 · 点线 = 反馈)和形状语义(直线 = 相邻流向 · 肘形/U 形 = 循环/返回/非相邻连接),且只使用一个 hub(系统架构方案中的 hub 为可选项——也可通过主要路径表达重点)(注意:有两个名称相似的辅助函数:hub_spoke 会绘制完整的放射状图形——一个中心节点 + 环上的带标签分支节点;hub_spokes 只绘制从现有 hub 到现有节点的连接线。要构建图表,请使用 hub_spoke;若要连接自己排布好的图表,请使用 hub_spokes。);diagram_island(深色幻灯片上的醒目图形面板);concentric_rings(嵌套框架);step_list(纵向/横向编号流程)。

    • 此工具包只绘制概念性区块流程图——不适用于物理科学示意图。 解释原理/机制/实验/定义的带标签科学示意图(受力图/力图、光学光线路径、电路、化学装置 + 反应、矢量/坐标几何、波/场——物理、化学、生物、工程及其他学科),不要使用节点/连接器工具包。两种可靠的构建方案(根据精确度与润色程度选择):matplotlib/领域库 → 透明 PNG(准确几何和标签本身就是含义时的安全默认选项——结果确定且从构造上保证正确);或者对于几何形状并非关键的复杂/精致/需匹配生成模板的示意图,使用 OpenAI 图像工具生成不含文字的风格化视觉,再叠加原生可编辑文字标签。绝不要将标签或无法验证的几何形状直接烘焙进生成图像(会产生乱码和错误物理图示)。构建方案、图像工具工作流和领域准确性保真检查见 references/schematic-diagrams.md——务必确保其正确(错误的示意图比没有示意图更具误导性)。
  • 编辑/咨询类装饰: insight_banner(结论要点条)、bilingual_lockup(CJK + 字距拉开的拉丁文字标题)、highlight(行内 <k>keyword</k> 重新着色)、ghost_numeral(浅色水印序号)、concept_equation(ZINE=MAGAZINE 文字公式)、pull_quote/standfirst、cta_button/cta_pair、status_stamp/corner_tab、spec_card、year_badge、gradient_rule(双端品牌线)、catalogue_frame(双线样品框架——博物馆/东方风格预设)。

  • 临床/证据综合形式——手工绘制散点图前先考虑这些函数(完整规则及不适用情形见 references/clinical-evidence-figures.md): deckkit.consort_flow(强制校验算术关系的参与者流程图——每个阶段的计数减去记录的排除人数后必须等于下一阶段计数,否则会报错并列出具体计算过程;本技能中的其他检查都无法识别错误数字,因为错误数字本身也可以构成完全有效的形状)· designed_charts.forest_plot(每行显示效应和置信区间,并与无效线对齐;比值必须使用对数轴,并显示普通数字刻度,因为线性轴会让对称置信区间看起来不对称——它也是展示同一比较的多次测量的通用形式,因此同样适用于亚组效应、回归系数和分段 A/B 提升)· designed_charts.km_curve(根据原始 (times, events) 绘制生存阶梯曲线、删失刻度和风险人数表)· designed_charts.bland_altman(用差值的偏倚 ± 1.96·SD 表示方法一致性——两种方法的相关性可以近乎完美,但仍可能存在致命的固定偏差,因此用相关系数作答是典型错误)· designed_charts.roc_curve(正方形画布 + 随机猜测对角线 + 图例中的 AUC)。混淆矩阵不需要新组件——它就是 heat_matrix,轴标签使用 Predicted/Actual,并在图注中说明单元格显示的是计数还是按行归一化的值。

  • 样本数据/重叠: designed_charts.distribution(展示分散程度,不只是平均值——groups=[(label,[v,…]),…];kind="auto" 在 n≥5 时使用箱线图,n=3–4 时使用均值 ± 误差,并且拒绝 n<3;叠加每个观测值;在图表本身打印 err="sd"|"se"|"ci95")。当数值是测量值的均值而非计数时,应始终优先考虑此函数——例如每位受试者的 Dice 系数、每次运行的延迟、每位评定者的评分。此类均值的柱状图会隐藏样本量 n、分布形状和异常值,也是文献明确指出的缺陷图表选择(Nature Methods,Kick the bar chart habit)。 · designed_charts.marimekko(宽度 = 分段大小,高度 = 分段占比 → 单元格面积 = 绝对数量;而 100% 堆叠柱状图会丢失这一信息)· designed_charts.radar(展示 3–8 个轴上的特征,系列数 ≤3,辐条以零为锚点——超出范围会报错;要回答“哪个对象在哪项指标上胜出”,优先使用 small_multiples)· venn(2–3 个集合,zones={"1":…,"12":…,"123":…} 使用集合索引;区域标签根据各区域自身几何形状放置并调整大小,过长而无法容纳在对应镜片区域中的标签会报错。圆形大小相同——按设计不编码任何面积信息)。

  • 微型可视化: dot_meter(●●○)、tradeoff_list(+/−)、segmented_bar(累积 100%)、meter_bar(用于单一百分位/占比/进度行——轨道 + 强调色填充 + 与柱条垂直居中的数值标签;用它代替手工拼接“轨道框 + 填充框 + 数字”,这样可以避免数值标签偏离柱条中线;从构造上保证不超出画布——数值溢出时会自动缩短柱条,而不是让幻灯片无法保存)· unit_grid(象形图/华夫格网格——单元格为正方形,数量为 N,大小自动适应区域,其中 filled= 个单元格使用强调色,另有必须提供的单位标签,说明每个单元格表示什么。适用于计数本身就是重点的情况——34 幅已归属画作、40 个地点中的 12 个、“100 个中有 N 个”——也适用于占比太小而难以用柱状图显示的情况:1% 的细条只是一条发丝般的线,一百个单元格中一个深色方格却一目了然。单一大百分比/进度行请改用 meter_bar。它会拒绝将纹理而非计数的数据绘制成网格(8,412 个单元格属于纹理),也会拒绝空白单位标签,因为没有标签的方格网格毫无意义)· range_bars(“足球场”图——每行显示共享轴上的浮动最小–最大柱条,用于表示各类别的数值范围:估值区间、预测范围、最小–最大估算。若每一行实际只有一个最佳估计点,请改用 dot_strip)。

  • 来源信息: source_note(单页来源说明——sources、as_of=;CJK 套牌可用 label="来源";会自动避开 footer,因此请最后调用)。sources_page 为整套牌提供来源信息;这个函数为单页提供来源信息,而单页才是实际流转单位——页面会被截屏、粘贴到备忘录里,也可能脱离顺序单独展示。对 briefing 风格和所有读者可能据此采取行动的数字页面,默认启用;来源若在 14 页之外,那么当有人质疑数据时,图表就等同于没有来源。

  • 符合品牌风格的照片(scripts/image_fx.py): 使用 duotone / grayscale 处理,避免彩色照片与强调色冲突(适用于理光印刷/粗野主义/水墨/奢华/博物馆风格),然后使用 picture(fit="cover")。

  • 以图像为主的套牌(imagery: series): 若所选方向以图像为主,多数页面可以将图像作为一个经过统一艺术指导的系列使用——在 series.json 中规划(填写每个位置的含义说明、指涉对象规则和人物规则),先生成关键图像,再通过 --style-ref 生成其余图像,对图像进行 QC,并使用 image_series.slot_picture 放置每个位置(绝不要使用 dk.picture:检查会读取其标签)。编写计划之前先阅读 references/image-generation.md 中的“Image-led decks — the SERIES exception”;python3 scripts/image_series.py check 会拒绝不符合规则的计划。 如果用户提供了风格示例(Q4),请按照选定的模仿模式(references/style-analysis.md),将其转化为你的风格简报—— **模式 A:**匹配示例的配色/强调色、信息密度、标题样式,以及图表/表格/公式的视觉元素 (调整 deckkit 默认设置以满足这些要求);**模式 B:**复现其结构、信息密度,以及借鉴的 2–4 个组件和标志性视觉元素,但保留 Step-2 设计方案中已确定的、适合主题的配色/字体——不要沿用示例的颜色。 几点重要规则(参见 references/design-principles.md):

  • 视觉语言(editorial · soft · collage · storybook):如果选定的方向属于某种视觉语言(directions.json 中标记为 "vl"),请在编写构建脚本前阅读 references/visual-languages.md:visual_languages.use(name, prs) 会提供配色、系统字体(默认支持两个平台;CJK 字体按脚本单独设置)和背景,而其六个页面函数会布局你自己的文案和图片——切勿手动制作这些页面。记录 design_plan.visual_language;交付关卡会检查该语言是否已应用。 要使用照片或插图的演示文稿,至少提供一个视觉语言作为备选方向——无论是使用用户的图片,还是你将要生成的图片(有可用的图像工具,且方案中使用了图像),或获取的图片(direction_gate.images: photos | illustrations | none,无论由谁制作——两个关卡都会保留该设置,并将其与 image_sources / imagery 对照检查;会生成图片的演示文稿若设置为 none,将无法通过;参见 references/interview-protocol.md)。 不含图片的演示文稿需提供四种原生视觉语言之一(ink · poster · cutpaper · drafting),这些视觉语言均为手绘风格,无需图片——选择最适合主题的一种,并在 direction_gate.native_fit 中记录原因(两个关卡都会保留该设置;参见 references/visual-languages.md)。 使用 ground="auto" 构建(浅色纸张背景;如果你最近制作的演示文稿已经采用浅色纸张背景,则使用该语言的对比背景),并记录 visual_languages.py --gates NAME --ground G 的输出。

  • 使用来源中的原始图表,完整保留——默认应保留整体。对于任何演示文稿(研究、工作、管理层、教学):如果来源——论文、报告、文档、已有幻灯片,或根据代码/数据生成的图表——中含有图表(架构图、结果图、绘图),就使用原图;不要重新绘制(速度慢,而且可能出错),也不要拆分成小块。许多用户更喜欢完整图表,即使它很密集(这是他们熟悉且信任的材料),所以当图表显得过于繁杂时,首先应将其放在一张独立幻灯片上——尺寸要大,并配上观点式标题和一行说明文字,指出应关注的部分(例如“橙色线代表本季度”或“最右侧一列是我们”)——而不是先裁剪。只有在以下情况下才考虑裁剪:(a)去除周围的页面标题、说明文字或空白(保留少量边距,绝不能紧贴边缘);或(b)提取一个可清晰分离、确实能独立呈现的子图。将多面板图表拆成几列会丢失上下文,并改变作者展示的内容——只有在完整图表确实无法用于幻灯片时才这样做;丢弃面板前,最好先向用户确认。 仅在来源中没有对应图表的结构需要展示时,才制作原生图示。

    • 裁剪、PDF 提取(extract_pdf.py)、所见即所得的 crop_helper.py 循环,以及面板网格重组 → references/asset-production.md §Figures。裁剪、修剪或提取任何图表前,必须完整阅读该部分,包括从 PDF 中提取图表——其中包含三条🔴裁剪规则(裁剪完整的语义对象;自动检测的边界框仅涵盖绘图区;之后放大检查四条边)、幻灯片上添加的图例不能代替图表自身坐标轴标签的规则,以及绝不可盲目裁剪的循环流程。
  • 动画效果(嵌入 GIF,并谨慎生成)、将原始数据转为正确的图表类型(可编辑的原生图表还是栅格图;非拉丁文字应使用原生图表,避免缺字方框),以及计算真实的领域可视化——还有确保图表正确渲染的规则(密集采样、图例绝不遮挡数据、始终查看 PNG)→ references/asset-production.md §图表、GIF 和计算得出的领域可视化。在制作任何图表、GIF 或计算图像之前,请先阅读。

  • 生成的视觉素材板(氛围/概念)——根据品味与用途选择启用;完整机制见 references/image-generation.md。 只有确实有帮助时才生成(无配额限制),风格应与演示文稿一致; 绝不要将文字/数字/标签/图表/徽标烘焙进素材板(这些应作为可编辑对象/真实 素材)。每块素材板都必须与主题高度相关——描绘这张幻灯片的实际主题,而非任何幻灯片都能用的通用“炫酷”图片(说明画面内容,否则就删掉)。统一放置素材板——绝不要只在一张正文幻灯片上单独生成一个页眉(标题装饰由 title_bar 负责;内容素材板应采用全出血/侧边栏/内嵌布局,并在所有使用素材板的幻灯片中保持统一的用途与美术指导)。生成时不要使用密钥(自动检测免费的选项:原生图像生成 → generate_images_codex.py;使用 image_prompts.py 构建清单)。OpenAI API 路径按量计费且受限制——有可用密钥不代表已获许可;请先询问(🔴 image-generation.md 计费许可关卡),将素材保存在 ~/Downloads/<deck>/assets/generated/,使用 deckkit.picture(fit="contain"|"cover") 放置,并检查渲染效果(文字背后留出平静空间、不出现伪文字/假图表、主体完整、真实事物准确)。

  • 每页都放品牌徽标/字标(单一实体的演示文稿:使用真实标志 → deckkit.wordmark → 询问;绝不伪造仿制品),以及 SVG 图标系列(一个采用开放许可的系列、重新着色的调色板、使用方式、经验法则和五项质量标准)→ references/asset-production.md §品牌徽标与 SVG 图标系列。放置徽标或第一个图标之前,请先阅读。 精细制作说明也见未改动的 references/icons.md / references/image-generation.md(上方路由表中的行)。

  • 演讲者备注 — 对于要进行演讲的演示文稿,请将口述稿放在备注中,而不是幻灯片上。 对于用户将要演讲的任何演示文稿(尤其是会议演讲、答辩或讲座),都应将完整句子从幻灯片移到演讲者备注中,使用 deckkit.speaker_notes(slide, "…")。 幻灯片展示短语;备注保留演讲者要说的内容。备注文本取自内容计划的 Spoken thread——直接传入,不要重新起草(规划器的 VOICE PASS 和 claim ledger 已经处理过;由构建者自行编写旁白会绕过这两者)。备注不会显示在幻灯片上,但 lint 会统计它们(DECK STATS 的 notes 列和 NO NOTES 警告),并通过其 --json 传给评审者——它们也会显示在演讲者视图和打印的备注页中,让用户可以排练,同时避免幻灯片变成文字墙。交付时应提供此选项;这直接符合“每个要点少用文字”的规则。对于供人独立阅读的演示文稿,没有演讲者——说明性文字应当放在幻灯片上(读者不会打开备注),因此应让句子显示在幻灯片上,而不是藏进备注。

  • 布局与图表 — 完整规则见 references/design-principles.md;要点如下: 元素之间留出 deckkit.GUTTER(约 0.4 in),并与页脚保持距离;使用同一网格构建平衡的分栏面板和等间距堆叠——columns(n)(水平)/ rows(n)(垂直),并保持外边距对称(有意采用不对称分栏时,外边距仍应相等;不要把窄元素孤零零地放进过宽的列中);让 arrow(direction=…) 指向流程前进的方向(堆叠框之间向下/向上),使重复连接线间距均匀,并让相邻块之间留出明显间隙(≥ 约 ⅓ GUTTER,绝不近乎相碰)——根据 rows/vstack 推导堆叠间距,不要只比块高略大的间距——并将独立字形居中放在框内;使用 picture(..., fit="contain") 放置插图/图片,确保主体不会被裁切(只有对边缘裁切不敏感的纹理才使用 cover)。

  • 对于会自动增高的块,绝不要手动指定 y 坐标——应测量或锚定。 将底部标注框放在凭目测确定的较低 y 位置时,文本换行后会向下延伸进页脚(这是最常见的布局问题)。使用 bottom_callout()(锚定到页脚区域并向上延伸),通过 content_band() 获取安全区域,并使用 vstack(..., bottom=…) 堆叠按内容高度变化的块(自动保持等间距且不会重叠;溢出时在构建阶段报错)。必须手动定位时,使用 measure_callout/measure_bullets/measure_text。可增高的块都能测量——每一个都可以,因此这条规则切实可行,并非空想: measure_table(rows) · measure_timeline(events, orientation=, polarity=) · measure_takeaway_rail(label, hero, body, w) · measure_chip(title, sub, w) · measure_modbox(role, fname, w) · measure_node(label, sub, w)。最后四种由各自的组件强制执行(h = max(h, measure_…),就像 callout 一直强制执行 measure_callout 一样),因此 chip/modbox/node 不会因为自身文本过长而尺寸不足——要让一行 chip 高度一致,可用 ch = max(measure_chip(t, s, cw) for t, s in stages)。takeaway_rail 现在会测量其正文并返回底部 y;以前它会固定预留 2.0in,并把长正文的文字放在 y=5.45,落入页脚区域,而所有检查都报告正常。然后运行 Step-5 渲染自检。

    • 这些测量值经过 CI 中的渲染器校准,因此可以放心依赖。 这里的一切都依赖一个数值——渲染器会将字符串排成多宽;当这个数值偏窄时(字体集合系列中的粗体文本按常规字重宽度测量,少了 3.9%),所有基于该数值构建的防护措施都会悄然通过,但文本仍会换行:按单行尺寸设计的标题说明,其第二行会压到页脚上;由于 lint 和构建使用的是同一个错误数值,两者都会认为没有问题。现在 tests/ 会渲染真实字符串,并将实际字墨范围与预测值比较;比较采用单边约束,并在风险较大的方向上严格控制:测量值可以略微保守,但绝不能乐观。因此可以精确到英寸地信赖它——但仍要留出实际间隙,因为估算值准确,不代表留有余量。
    • 在调整上方内容的尺寸之前,先为底部标注框预留空间——不要最后才添加。 bottom_callout() 会返回其顶部 y;常见错误是先将面板/卡片的尺寸硬编码(例如 y=1.7, h=2.5),再把标注框放上去,导致横条与卡片底边重叠。先调用标注框,然后将内容尺寸设为在其返回的顶部上方至少留出一个完整的 GUTTER:top = dk.bottom_callout(s, 0.6, W-1.2, "KEY POINT", "…"); card_h = top - GUTTER - card_y。几乎为零的重叠并非无关紧要——横条会盖在上面,并裁掉卡片的圆角——因此必须留出明显间隙,而不只是避免碰撞。(构建时 lint 现在会在面板彼此擦边时发出 SLIVER_GAP 警告——面板之间或面板与图片之间仅有 0.005–0.10in 的缝隙;Step-5 渲染自检仍会目测检查缝隙。通过构造方式预留空间才是解决办法,警告只是最后一道防线。)
  • 对于标签也绝不要手动指定 x 坐标——应根据标签指代的对象推导。 上面的 y 规则也适用于 x,而且这种情况更常见,因为不会触发错误:标题说明、标签、单位、图例标记、坐标轴注释是被定位而非锚定,结果落在主体附近而不是主体上。每个此类元素的 x 坐标只能来自以下三种来源之一——与主体相同的网格列、主体经过测量的边缘,或主体中心;绝不能通过不断微调相邻元素的偏移,直到“刚好放得下”。两个经过测量的失败案例,同属一类问题:

    • 标题说明与网格不对齐。 四面板图是一张图片,因此其各面板没有可供对齐的形状几何信息;标题说明被放到文本网格上(ML + i*CW/4),而面板位于 matplotlib 排列的位置,宽度并不相等——每个面板都会保留自己的宽高比,因此等分成四份从设计上就不正确。修复方法:让绘图脚本导出每个面板相对于整张图的跨度比例(在 fig.canvas.draw() 后使用 ax.images[0].get_window_extent(),再除以 fig.get_window_extent().width),并根据图片实际放置后的矩形位置来放标题说明——dk.picture 会返回形状,因此 pic.left/914400 是经过 fit="contain" 留白后的实际 x 坐标。渲染 lint CAPTION NOT ALIGNED 会提供后备检查。
    • 标签被挪进角落。 英文产品名称的中文释义被放在 (mx + 1.46, yy + 0.24),越过了横线的末端并位于下一行上方;结果是同一个单位出现三个左边缘和四条基线,读者无法判断它归属何处。修复方法:同位语不是独立元素。放在同一段落、同一基线上,并共用一个左边缘: [[(name, …, FONT), (" ", …), (tag, …, EAFONT)]]。 两条规则背后的共同原则是:用于标注其他元素的元素不能随意放置。 如果你发现自己要添加一个常量才能让标签看起来位置合适,那这个常量就是问题所在——想想它应该与哪条边对齐,并据此计算。只有标题说明这一情况有 lint;其余情况都得靠你自己检查,因此这也是预检第 9 项。
  • 🔴 在构建时检查几何布局——在构建脚本末尾、prs.save() 之前调用 dk.lint_layout(prs, strict=True)。 strict=True 会让它成为真正的关卡:未解决的 CRITICAL 会抛出异常,演示文稿不会保存,这样你就不会意外地把有问题的布局交给渲染/评审环节。(普通的 lint_layout(prs) 只会打印结果,需要你留意——仅在你有意需要非阻断式报告时使用,例如已知的画布外出血。)这是发现机械性布局问题成本最低的环节:它在进程内运行,只需几毫秒,早于耗时的渲染与视觉评审流程;它会遍历每个形状——无论形状是通过网格辅助函数还是原始坐标放置——并根据每个标签的墨迹矩形(字形实际落下的位置)进行判断,因此对实际构建中留有充足空间的文本框不会误报。它会对以下七类问题硬性失败(CRITICAL):内容(文本墨迹/卡片/非出血图片)超出画布、文本溢出可见文本框、文本相互重叠、连接线穿过方块(CONNECTOR_IN_BOX)、装饰性直线穿过文本块的墨迹(RULE_THROUGH_TEXT——分隔线/细线放在手选的 y 坐标上,后续上方文本扩展时与其相交;应根据文本块测得的末端推导直线位置,切勿猜坐标)、幻灯片部件违反自身架构(OOXML_SHAPE——此工具包手动写入元素的数量和顺序。🔴 这是唯一一种会导致文件完全无法打开的问题,也是其他所有检查在结构上都无法发现的问题:它们基于几何、像素或语义,没有任何一项会检查部件格式是否正确。实测:同一张幻灯片上运行两次 Build(s) 会留下两个 <p:timing> 元素——save() 不报错,LibreOffice 也能正常打开,lint_layout 检查通过,而 preflight_check.py 反倒认为这个重复项更合规,于是给导致文件损坏的问题打了勾;人类最早会收到的信号,是 PowerPoint 提示要修复文件。现在 anim.apply() 会直接拒绝第二次调用——第二次 Build 的步骤从未进入第一次的序列,因此保留任一棵树都会生成没人编写过的点击顺序;这段代码是兜底保护,因为下一个手写元素不会自带防护)、以及没有 <a:ea> 字体的 CJK 文本段(CJK_NO_EA——构建前设置 deckkit.EAFONT;在这里捕获可省去 lint_deck 之前需要的渲染往返。如果仍然触发,在 lint 所在行的上一行调用 dk.retrofit_ea(prs, "<face>"),即可修复当前演示文稿——设置 EAFONT 无法修复,因为文本段已经存在;它还会覆盖此检查无法检测的组合形状、表格单元格、字段和图表文本。除非已设置 EAFONT,否则请传入字体名称;若没有可修复的内容,它会抛出异常。之后设置 EAFONT 可让下一次构建保持干净,但重新设计的修复轮次除外,因为其文本段根本不会经过 set_font());以下问题则会发出警告:旧式数字字体中的显示数字(OLDSTYLE_FIGURES——数字高度不一会让大号数字看起来上下跳动;图形组件会通过 deckkit.numeral_run_face 自行解析出等高数字字体,因此此警告只会针对手动设置的文本段触发——这属于审美判断,特意不作为构建阻断项)、标签/图形超出卡片范围、卡片内单行文字未居中、内容延伸到页脚,以及两个面板间距过小(SLIVER_GAP——面板之间或面板与图片之间的缝隙为 0.005–0.10in,通常是手动指定间距造成的问题)。它还会警告另外两类单页检查在结构上无法发现的问题;这两类问题是在一份已交付的演示文稿中测得的,当时两项 lint 都显示正常:DUPLICATE_TEXT——同一张幻灯片上的两个独立形状渲染出相同文本,实际原因包括重复修补后遗留的早期布局孤儿副本(特征:坐标编辑看似毫无作用,因为两个布局同时生效)、组件自带的自动标签与手写标签并列显示,或某个名称同时出现在列表和下方图表中;以及 CHROME_SLOT_DRIFT——某张幻灯片上的来源行没有放在演示文稿其余页面统一使用的位置。🔴 修复槽位偏移时,绝不要通过微调偏离位置的元素来解决:槽位原本是每页都手动套用的常量;如果页面可以不遵循某条规则,那它就不是约定。将所有来源行都交给同一个辅助函数处理,并让它忽略调用方传入的任何 x/y 坐标。(实测:11 行来源信息中,8 行固定在指定位置,3 行放在各自页面最后一个文本块结束的位置,其中一行 as of <date> 被放进图表方框内。文案在 11 行中有 8 行遵循了约定。)(每个代码的通俗含义和首选修复方法见:references/troubleshooting-faq.md §4。)在演示文稿所用字体已安装的情况下,lint 打印的每个 CRITICAL 都确实是问题;若因字体替换而进行测量,它会说明情况,并留出约 1 行的余量(比较保守,可能少报),因此不会凭空编造问题。它是一个兜底检查,不能代替目视检查(它看不到对比度、z 顺序、图形遮住文本的问题,也看不到组合形状内部的元素——这些都应由评审者检查)。下面的布局约定与 lint 的对应关系是:lint 会强制检查第 1 和第 3 条(画布外元素与文本相互重叠,均作为 CRITICAL 处理),并对第 5 条(未居中)和页脚问题发出警告;其余部分(内边距、适配、网格间距、先确定图表边界框)都不会检查——指定的辅助函数在构建过程中就能保证这些要求,因此通常不会触发兜底检查:

    1. 保持在安全区域内——通过 content_band() 获取矩形范围;只有全出血的主视觉/分隔页图片可以超出边界。(对于提供/注册的模板,传入 content_band(slide, top=<the template's title-band bottom>),让安全矩形遵循模板自身的页眉/页脚,而不是 deckkit 的默认值。)
    2. 为文本留出内边距——每个标签都要与卡片边缘保持至少 0.1in 的距离(cx+0.2、宽度 cw-0.4);贴边放置会让人觉得是错误。
    3. 不要让文本相互重叠——每个区域只能由一个栏/堆叠布局负责;绝不要在同一矩形区域内再放置第二个文本框。
    4. 放不下就解决——fit_text_size(runs, w, h, start) 会给出能够放下文本的最大字号;否则就缩短文本或扩大文本框。
    5. 在独立成块的区域内放置文本 → 上下内边距相等(垂直居中)——将文本锚定为 MIDDLE,覆盖整个文本块自身的矩形范围:先绘制文本块,再将文本放在与该文本块完全相同的 (x, y, w, h) 处,并设置 anchor=MSO_ANCHOR.MIDDLE(将其封装为一个小型 deck 辅助函数,让居中自动完成,而不是每次调用时手动处理),无论文本是一行还是多行。在固定高度文本块内,按手选的 y 偏移量放置文本,是反复出现的“摘要文字离上边缘比下边缘更近”问题——必须在构建时确保上下内边距相等,而不能靠目测调整(单行卡片会触发 OFFCENTER 警告)。*例外:*如果单行内容所在列需要与同一标题下更高的相邻列顶部对齐,则应保持顶部锚定(对齐优先于居中)。
    6. 使用网格/堆叠布局,而非手选 y 坐标,并留出实际间距(约为 GUTTER)——这也包括文本块之间的分隔线:猜测 y 坐标绘制细线,一旦编辑上方文本导致它多换一行,文本就会与细线相交。应根据实际位置推导(rule_y = stack_end + pad,其中 stack_end 来自绘制堆叠布局的循环),现在 RULE_THROUGH_TEXT 会对此进行检查。——使用 columns()/rows() 创建等宽面板,使用 vstack(…, bottom=…) 创建按内容高度排列的文本块(不会重叠,间距自动相等),使用 content_band() 获取垂直范围。(对于提供的模板,布局中的占位符已经锚定了内容——这些辅助函数适用于无模板的情况;模板提供了占位符时,应直接填充。)
    7. 绘制图表时,先计算所有边界框,再在其中绘制内容——先布局矩形(并预留箭头通道),然后再放置节点/标签;绝不要根据前一个形状目测位置。
  • 颜色。 轮换使用 deckkit.ACCENTS,避免图表色调单一;洋红色只用于强调。对于一组连续的内容块(色块/卡片/流水线阶段),通过 deckkit.palette(n, ACCENTS) 为每个内容块分配一种明显不同、经过刻意对比的色调——它会返回 n 种不同的填充色,并在任意两个相邻内容块不够醒目时发出警告;相邻内容块绝不能重复使用同一种色调,也绝不能将中性灰用作类别颜色(灰色看起来像禁用状态,而不是一种类别——它会让彩色行看起来像没做完)。将每种色调在整份演示文稿中绑定到一个概念(强调色可以代表提议的方法、 “风险”或某个产品)——让一种颜色在每张幻灯片上都代表同一含义,是让演示文稿显得可信的最大助力:参见 references/semantic-color-contract.md。🔴 用作文本的色调本身必须在其背景上达到 ≥4.5:1 的对比度——鲜亮的金色/珊瑚色/青柠色作为填充色效果很好,但用于浅色背景上的小号标签/引导语/强调文本时,对比度可能只有 2–4:1(几乎看不清);这是反复出现的“彩色文字太淡”问题。因此,必要时为每种强调色保留两个色值:一种仅用于明亮填充的变体(规则线、横条、图标底块、标题带),以及一种适用于文本的较暗变体(contrast_ratio(...) ≥ 4.5),用于任何采用该颜色的文本段——在设计时,使用 deckkit.contrast_ratio 验证每种绑定色调的文本色值,而不仅仅是填充色。这种区分同样适用于在填充色上显示的标记——例如图标底块上的字形、彩色色块上的符号/数字、色带上的箭头——这些内容与其底色之间必须达到约 3:1 的 WCAG 非文本对比度要求,而不仅仅是与幻灯片背景形成对比。常见错误包括使用同一色系的两种颜色(例如在水蓝色底块上放青绿色字形)以及深色叠加在深色上(例如在近黑色底块上放彩色字形)——两者都会让内容看不清。deckkit.icon_tile 可在构建过程中自动处理对比度:它会从 PNG 中读取图标的墨迹颜色(或接受显式的 glyph=<colour>),并自动调整底块颜色,使对比度达到 ≥3:1,因此优先使用 icon_tile,而不是手动将图标放在原始 box 上;手动将标记放在填充色上时,请选择满足 deckkit.contrast_ratio(mark, ground) ≥ 3 的颜色(或使用反差明显的白色/近黑色)。结束页应根据其用途命名,并使用演示文稿所用语言(英文演讲使用 “Conclusion”;中文演示文稿使用“结论”/“总结”)。

  • 无障碍。 文本与其填充色的对比度应 ≥4.5:1(contrast_ratio;chip/modbox 会自动选择易读的文本颜色),并且绝不要只通过颜色传达含义。为每个信息性图形设置替代文本——在调用 add_picture() 后使用 deckkit.alt_text(shape, "one-line description")——供屏幕阅读器读取;替代文本不会渲染出来(评审者看不到),因此应将其作为构建习惯。更多内容见 references/design-principles.md。

  • 公式和行内数学符号 → references/asset-production.md §公式和行内数学。只要演示文稿需要任何公式、变量或数学字形,就立即完整阅读本节——其中包含 🔴 默认使用可编辑的 equation_native 规则和 equation_png 二维例外、交付时需标注的数学字体依赖(字体本身由 references/deck-setup.md §字体负责)、公式尺寸、绝不使用 Unicode 上标/下标的规则,以及依据纸面内容转录/依据代码推导的保真要求。

  • 统一语言。 整份演示文稿都使用选定的目标语言——不要切换语言 (中文演示文稿中不要夹杂零星英文,也不要在已翻译的项目符号上方保留英文标题)。 技术术语/专有名词/缩略语/单位/代码可以保留原文;只有在用户提出要求时, 才制作混合语言/双语演示文稿(references/multilingual.md)。

复制 references/examples/build_example_generic.py(无品牌内容)——或已注册模板自己的 build_example.py——了解这些辅助工具如何组合。对于单作者流程, 也要复制其逐页函数框架(STYLE 块 → 每页一个函数,并附带计划行文档字符串 role=… | form=… | build:…/static:… | takeaway='…' → 有序的 SLIDES 注册表 → main()):这些文档字符串让计划与代码之间的对应关系可通过搜索查找,而不必靠记忆;并且不会改变“在单次脚本运行中构建整份演示文稿”的要求——main() 始终会构建所有幻灯片。 扩展——按章节扇出。 对于小型演示文稿(约 ≤5 页幻灯片),由一位作者编写一个构建脚本既更省成本也更连贯——这就是那里的默认做法。从约 6 页幻灯片起,就扇出(当宿主能够派发子 Agent 时);对于独立取材的章节(不同的论文/数据集/领域),无论规模大小也都要扇出。(这个阈值已经变动过两次,15+ → 9 → 6,两次都基于同样的证据。旧规则是按 TOKEN 成本来衡量的,那时一位作者确实更省成本——没有上下文被重复——而挂钟时间从未被纳入考量。对五次真实构建会话的测量显示,构建步骤占全部模型活跃分钟的 40–71%,而且它是一个 Agent 串行生成到一个构建到中途就达到约 500k 的上下文中。扇出并不会让演示文稿消耗更少的 token;它让这些 token 在同一时间产生,并且它给每位作者一个全新的约 60k 上下文,而不是协调者那已经饱和的上下文——这还能带来更好的规则遵循,因为 500k 的上下文正是指令开始被忽略的地方。9→6 的变动增加了第二项测量:一份 13 页幻灯片、单独构建的演示文稿,在约 125 的预算下跑了 241 次往返,批处理比率为 1.00,并且有 37 张幻灯片图像是一次读一条消息——批处理规则全程都在上下文中,却不再被遵循,而这恰恰是一个全新的 60k 上下文所能防止的失败。) 🔴 这个决定是记录在案的,而非假定的:.deck-gates.json 中的 design_plan.build_shape—— "fanout — <n> sections" 或 "solo — <reason>"(例如 solo — host has no subagent dispatch、solo — 6 slides but one tightly-coupled argument)。交接门禁在任何约 6+ 页内容幻灯片的演示文稿上都要求提供它,并且从不为这个选择而阻塞——solo 在每一个宿主上都是合法的,在没有派发能力的宿主上则是强制的——只为缺少决定而阻塞,正是 form_reach 的模式。它之所以存在,是因为这条规则过去只是散文式的说明:上面那份 241 次往返的演示文稿有 13 页幻灯片,远超阈值,却没有任何地方追问过它为什么是单独构建的。保持高质量的规则是:集中化连贯性,只并行化独立的工作。 协调者(你)保留理解简报、故事弧线,以及唯一一份共享的 style.py(调色板/字体/界面装饰——复制 references/examples/style_example.py);然后并行派发每个章节一个子 Agent(不是每页幻灯片一个),每个都导入那个 style 并暴露 build_section(prs)(复制 references/examples/section_example.py),每个都自行渲染自己的章节以优化它;最后 scripts/assemble.py 按顺序将它们运行进一个演示文稿(不做脆弱的 .pptx 合并)。不要做“每个幻灯片一个 Agent 并与相邻者聊天”——它会漂移,与单文件工件相冲突,并且不会加速那些真正耗时的部分。完整工作流(包括评论者小组 + 发现路由)见 references/large-deck-orchestration.md。 🔴 对构建进行扇出不会改变评审形态。 分节评论者小组(每个章节的评论者 + 一位整体连贯性评论者,在每个层级——references/critic-panel.md)属于大型演示文稿,约 15+ 页幻灯片,因为一份 40 页幻灯片的演示文稿作为一个文档来读是更差的评审。它不会因为你使用了章节作者而被触发:一份由三位作者构建的 10 页幻灯片演示文稿,仍由正常的两位专注视角评论者通读整份演示文稿来评审。刻意让这两个阈值彼此保持距离——把它们连接起来会悄悄给每一份中等规模的演示文稿增加评论者,并消耗掉这次扇出刚刚节省下来的挂钟时间。 动效与构建——真正重要的动效是在幻灯片内逐步“出现”构建,而不是幻灯片切换效果。 🔴 不要给每张幻灯片都加淡入切换效果来“制作动画”——这毫无用处,也是要避免的偷懒做法。 这里所说的“添加动画”,是指点击后逐步揭示幻灯片内容(出现构建),让观众跟着演讲者的节奏,而不是提前阅读后续内容。构建由用户自行选择是否启用(面向演示的幻灯片会在访谈中询问;参见第 0 步)——本节讲的是用户选择启用之后如何做好构建;如果用户选择不启用,那么幻灯片就是静态的,这完全正确,并非缺少必需功能。这两个层面并不相同:

  • (1)幻灯片内的出现构建——用户选择启用时,真正需要做的事。 由你决定在哪里使用(哪些幻灯片适合逐步揭示):凡是逐步揭示有助于强调、吸引观众或引导观众的地方,都可以考虑使用——多项列表、管线图/多阶段图示(每次展示一个阶段)、多部分论证、前→后、证据→结论。标题页/分隔页/单图页/需要一次性浏览完整内容的幻灯片应保持静态。并非每张幻灯片都需要构建(连续几张静态幻灯片也没问题),但凡是使用构建的幻灯片,都要让所有内容完整地逐步揭示:🔴 每个内容元素都必须分配到一个构建步骤中,并按有意安排的阅读顺序揭示——绝不能只为部分区块添加动画,而让其余内容从第 0 帧起就已显示(要避免的正是这种怪异的“半动画幻灯片”)。静态底图只保留始终存在的框架——标题/页眉,以及各个节拍所依托的边框、坐标轴或始终成立的上下文;所有需要控制呈现节奏的内容一开始都应隐藏,并随步骤逐步累积。同一个想法中的图形应归为同一步(方框和它的箭头一起出现)。
  • (2)幻灯片间切换效果——可选、次要,不是关键步骤。 整套幻灯片使用平缓的 slide_transition(s, "fade") 可以接受,但这绝不是重点;没有切换效果但有出色的出现构建,胜过每张幻灯片都加淡入效果却没有构建。一次性决定是否使用;不要把“添加了切换效果”算作给整套幻灯片添加了动画。

使用 scripts/anim.py:在步骤之外只绘制始终存在的框架,然后用 Build.step() 包裹每个内容节拍(包括第一个)——按阅读顺序,每个步骤呈现一个项目/区块/阶段,让内容区域从空白开始,随着每次点击逐步填充——然后使用 apply(effect="appear")(即时出现)或 "fade"(柔和淡入)。示例见 references/animation.md(“基础构建”与“完整逐步揭示”)。幻灯片在完全构建后仍须能正确阅读(适用于打印/PDF)——构建是在正确的静态幻灯片上叠加效果,不能用来修复杂乱的幻灯片。

随时记录一行式动效清单——对每张幻灯片,写明 build: <按顺序揭示的内容> 或 static: <无需控制呈现节奏的原因>,并注明整套幻灯片是否启用了切换效果。你将在第 5 步把清单交给评审者(静态渲染无法看到动效,因此评审者会根据清单和其从像素中发现的构建候选项来评估你的动效设计)。标准存放位置是每张幻灯片对应函数的文档字符串(即上面的框架——build:/static: 行写在每张幻灯片的文档字符串中,并原样交给评审者);对于不使用该框架的模板专属 build_examples,则以 build_<deck>.py 中的注释块作为备用位置。

🔴 渲染前检查 — 每套演示文稿在首次渲染前都要勾选这 12 项,无一例外

(Step-4 SIGNATURE PROOF 不属于此处所说的“首次渲染”——它只是对尚不存在的演示文稿进行单页探测,因此这 12 项中大多数都无从检查。对该单页执行适用的检查(可读性、无占位文本、等宽数字),并且一如既往地在首次渲染整套演示文稿前完成全部 12 项检查。) 这是构建与渲染之间固定的登机牌。将其作为 12 行原样的 ✓/✗ 输出(写在工作笔记中,或写在构建脚本末尾的注释中)——写下勾选符号会促使检查真正执行;渲染前检查项未勾选的演示文稿尚未准备好进行渲染。 🔴 首先运行 python3 scripts/preflight_check.py <deck>.pptx --build build_<deck>.py,并把 其输出块粘贴到勾选项中(添加 --selfread / --static,以匹配该演示文稿的模式)。它负责判定 机械检查部分——演讲者备注覆盖情况(1)、是否存在构建计时(2)、每个 build: 文档字符串是否确实包含 Build.step 调用(3b)、原生图表 + equation_native(4)、演示文稿 是否带有截至日期(7)、元注释和未填充的 <slot>/{slot} 模板文本是否泄漏到幻灯片上(8)。使用 --build 时,它还会读取脚本:布局循环中是否存在字面步长常量(头号几何缺陷),以及是否存在 样本均值柱状图——将计算出的均值/中位数传入柱形/条形 native_chart,从而隐藏样本量、分布范围和离群值;应改用 designed_charts.distribution。第 2、7 和 10 项是提示性检查——是否选择启用了构建、是否有 任何主张受时间限制,以及演示者的机器上是否存在某种字体,这些都是文件中没有的信息;如果检查 对它无法知道的事情判定失败,人们很快就会学会忽略它。退出码 1 表示尚未就绪; NOT CHECKED + 退出码 2 表示无法运行,这绝不等于检查通过。 它还会输出四项不编号的硬性失败——几何检查都看不到这些缺陷,所以一旦触发,就应阅读并修复演示文稿,而不是绕开一条 从未写明规则的检查:(i) 等宽字体溢出——code_block 设置了 word_wrap=False,因此过长 的行不会换行,而是溢出面板;断开的命令行不是外观问题,而是 错误的命令 (实测:某个已交付演示文稿中的 npx skills add … 安装行被渲染成三行, 复制回去后变成一个返回 404 的仓库路径——被说服的读者必须准确抄下的那一行,恰恰是断开的那一行);一行内容在文本框宽度的 15% 以内时会报告为紧凑而非通过,因为默认的 MONO 是 Consolas——macOS 和大多数 Linux 上都没有,替代字体更宽, 这正是历史故障明明留有约 10% 余量却仍然溢出的原因。(ii) 未安装等宽字体——原因相同,会直接报告;应将 MONO 设置为渲染机器上已安装的字体,而不是缩短行直到它在本地看起来没问题。(iii) 拉丁字符→全角标点相邻——拉丁字符段后面紧跟全角标点时,标点前会出现空格(原生 PPTX 。、既搭 deck 、又给它 打分、(第 3 、 5 步))。渲染器的中日韩/拉丁自动插空格功能会插入间隔,而 python-pptx 没有开关可控制它,因此相邻关系本身就是缺陷:改写,让标点前出现中日韩字符,或删掉标点 (某个真实演示文稿的 12 张幻灯片中有 5 张出现此问题,只有人工放大 5 倍才发现)。 (iv) 文本框尺寸非正数——h = card_h - 1.42 且 card_h = 1.30 会得到 −0.12;文字溢出一个根本没有内部空间的文本框,而所有几何检查仍然通过,因为没有东西可以重叠。现在 deckkit.text() 会在调用处报错,因此此处 FAIL 表示文本框是通过其他方式构建的。小于自身字体半行高度的文本框属于提示项,而非失败项。 它刻意不判定第 5、6、6b、9、11 项——这些属于判断(图像是否为真实素材、第一眼是否落在主视觉上、标题是否点明要点),它会将这些项目列为仍需你判断,而不是暗示已覆盖。第 12 项有自己的脚本。(原因:12 个勾选项中有 11 个是自我认证——模型写了 12 个勾,却没有任何地方读取它们,这正是清单旨在防止的那类悄无声息的跳过。) 它之所以存在,是因为历史表明,这些规则如果只以散文形式存在,就会被悄无声息地跳过——它们是渲染时 lint 无法衡量的判断(lint 已覆盖:文字负荷、墨迹覆盖率、字体戏剧性、是否存在构建、布局相似性、中日韩字符东亚字体、对比度、页脚、重叠——这里不要重复勾选;请改为阅读其报告)。

  1. 演讲者备注:演示文稿(屏幕共享即视为演示)→ 每张幻灯片的备注都与计划中的口头叙述线索逐字一致,通过 dk.speaker_notes 实现(偏差——例如幻灯片拆分/合并——用一个短语注明);自读模式 → 文案直接放在幻灯片上。
  2. 构建动画——是否启用?然后确认完全分步呈现:只有用户选择启用时才会出现构建动画;每张带动画的幻灯片都按顺序揭示全部内容要点(除标题/画面框架外,不得提前显示任何承载内容的元素——不能出现只做了一半动画的幻灯片),从空白内容区开始(包括第一个动画步骤),底层画面不得放置提前透露内容的摘要/图例。
  3. 计划↔代码对应关系:(a) 机械核对——逐页比对设计计划中的行与幻灯片函数文档字符串(包括图标系列;经典的行内模式遗漏);(b) 抽查——每个 build: 文档字符串都必须在函数体中有匹配的 Build.step 调用;(c) 封面兑现承诺——生成后的封面应展示自我验证设备、计划中说明通过标注满足陌生人测试的主题图案标签/图例,以及按计划放置的 logo plan: 素材(官方文件不得修改;对于单一实体的演示文稿,没有徽标且未记录 n/a 原因的封面应判为 ✗;名录幻灯片声明的 entity marks: 数量必须与渲染中实际标记数量相符——用通用字形占据标记位置应判为 ✗,不能算部分通过)。
  4. 图表使用原生格式:每张图表都应为可编辑的原生图表,除非特意选择了 matplotlib 风格;图例应避开数据。数学公式也遵循同样标准:每个一维公式都使用 equation_native;只有确实为二维布局(分数/矩阵)时才使用栅格 equation_png,并明确标记为此类。
  5. 证据真实:每张领域图片/图表都应是实际计算/来源素材——不能用看似合理的替代品;检查 PDF 裁剪区域的四条边;每张有来源的照片都必须来自获准来源(Commons / Openverse / 新闻资料包 / 用户文件),并核实主体与说明文字/地理标签/类别相符、不带水印(水印说明这是未授权的预览素材 → 拒绝该文件;绝不要通过裁剪/模糊/修补擦掉水印),记录其许可(需要署名时应在相应位置注明),并经过美学审核(即使主体正确,难看/施工中/模糊/缺乏代表性的照片也应拒绝 → 重新寻找素材,或按照 searched, found but low-quality → generated, flagged illustrative 这一档生成并声明为风格化插图),并统一调色,使不同来源的素材看起来属于同一套演示文稿;任何生成的内容图片都不得将真实且具体的主体伪装成照片(主体规则,references/image-generation.md——生成的模板身份牌和声明过的风格化插图不受此限制;如果找不到真实主体的照片,应记录 searched, none found → … 这一档)。**临床影像还有一项额外检查,且必须优先执行:**检查有无烧录在图像上的患者标识符(姓名、MRN/ID、接入号、出生日期、检查日期、机构),检查图像的四条边以及叠加层/页眉条,而不仅是中央区域——用户提供的扫描件或 PACS 截图风险最高;已发表的图通常已经去标识化,但仍须检查。如果存在此类标识,请获取去标识化的导出文件——不要裁掉或模糊后再交付:裁剪可能漏掉另一个角落里的标识,模糊也无法保证安全。与此处其他所有项目不同,演示文稿一经发送,此项造成的问题就无法挽回。验证主视觉/照片/底图上的所有文字都能在像素背景下清晰辨认——图像中的线条不得穿过字形(遮罩只能压暗亮线;应使用近乎不透明的面板覆盖),眉题/引导语也包括在内,标题与副标题之间须留出清晰间距(渲染自检“图像上的文字”)。
  6. 颜色语义明确:语义色彩账本中的含义应在幻灯片上说明(首次使用时提供图例),且任何强调色都不得脱离其规定含义;装饰元素应保持低调——醒目的标志性图案最多出现 3 次(低调的风格标志——淡色网格/扫描线、角落数字、边缘线、小印章——可以在每张幻灯片上重复;这是系统设计,不是盖章)——并且所选预设的 guard 约束必须在每张幻灯片上成立(在勾选项中引用 guard 规则)。 6b. 风格贯穿所有页面:低调的风格标志应延伸至普通的内页,而不仅是封面/分隔页——内页必须包含 interior register: 约定提示,或记录 none (flat by register — <reason>) 例外。只在首尾页面使用某种风格,判为不通过。
  7. 主张保持最新:重新核验账本中每条受时间限制的记录,as-of = TODAY;演示文稿中应包含“截至”日期。
  8. 语言与整洁度:全文使用一种语言;不得出现元注释(“占位符”/“TODO”/“AI-generated”);逐行完成语气审校。
  9. 视觉路径与锚定:眯眼检查每张幻灯片——第一眼应落在指定主视觉上,模糊后仍能辨认 3–4 个层级。然后睁开眼,指出每个标签的锚点——说明文字、标签、单位、图例项、轴注:它与所指对象共用哪条边(对象的左/中/右边,或同一网格列)?列出带标签的幻灯片以及每个标签使用的锚点。如果标签的 x 坐标是个没人能解释的常量,那就是缺陷;CAPTION NOT ALIGNED 仅兜底检查面板下方的说明文字,TEXT_GRAZES_SHAPE 兜底检查的是碰撞情况(标签墨迹延伸到旁边的条/芯片/节点内——TEXT_OVERLAP 看不出来,因为它衡量的是文字与文字之间的重叠)。这两项都看不到只是浮在错误对象附近的标签,因此锚定判断仍需你负责。🔴 **触发 TEXT_GRAZES_SHAPE 时,应修正标签列的边缘位置,根据图形实际能延伸到多远来确定,而不是修改字符串。**实测:第一次修复缩短了文本,但标签仍然擦到图形,因为对齐轴线的右对齐列,不一定能避开延伸到轴线外侧的条(_name_r = ZERO − max(|negative value|)·SCALE − pad)。
  10. 交接就绪:记录交接所需的字体/可移植性依赖项和每张幻灯片的点击顺序;保留未决问题,不得遗漏;确定并告知输出目录(~/Downloads/<deck>/ 或用户指定的路径);记录图片许可/署名(有来源的照片)。
  11. 标题对应要点:每张内容幻灯片的标题都应直接采用计划中的要点,或将其压缩为保留主题 + 动词 + 主张的标题;列出压缩标题的幻灯片编号,以及注明例外情况的编号(封面/分隔页/议程/结尾页可以使用简短主题标签;命名的例外包括:模式 A“匹配其标题处理方式”、使用固定标题风格的注册用户模板,或计划中的要点明确由其指定主视觉 / insight_banner / takeaway_rail 承载的幻灯片——注明是哪个元素承载)。输出幻灯片编号而非只打 ✓,才能确保逐页比对。
  12. 形式多样性与画面填充——必须给出统计:先运行 python3 scripts/component_audit.py build_<deck>.py <deck>.pptx,并将两行摘要 粘贴到勾选项中(耗时约 50 ms,读取的是完成后的文件,因此没有成本,也不能凭猜测填写)。它会给出一个事实——此演示文稿实际调用了多少种它能保证效果的形式组件(deckkit 更广泛的形式目录约有 59 种)——并标出其几何形状与演示文稿未使用组件相符的聚集区域。如果输出 NOT CHECKED,该勾选项就尚未完成:路径错误或演示文稿无法读取时,程序会以退出码 1 退出并说明原因,而不是报告通过。 此项从设计上就是提示项,绝不能当成阻塞条件:几何信息无法判断手工绘制是偷懒还是有意为之,而有意为之的构图正是标志性手法。因此,对于每个聚集区域,要么使用相应组件,要么写一句说明为何手工构图是有意的(“轨道是这套演示文稿的主题图案——meter_bar 会把数值居中并抹掉间距”)。(设置此勾选项的原因,实测:三个已交付演示文稿的构建脚本共调用了 59 种形式组件中的 3 种。其他所有形式都由原始方框 + 文本组合而成,导致本应由组件修复的几何缺陷再次出现——例如基线比最后一个条短、数值标签偏离条形中心线。SKILL.md 长期以来一直以文字规定“存在 COMPONENT 时,使用该 COMPONENT 构建”,但这条规定被违反了数十次,却一次也没有被检测出来。) 🔴 现在交接门槛要求给出答案,而不只是打印问题。当 --gate-check 测出某个构建大量使用原始 box/text,且组件使用率偏低时,它会一直阻止流程,直到 design_plan.form_reach.waived 中记录了书面理由。它不会因为数字本身而阻止流程——定制构图完全合理,而且往往本身就是标志性手法;组件目录也不可能生成蒙德里安风格页面。它只会在缺少决策时阻止流程,因为真正的问题正是:没人查看过,而调用一次 sigs.py --list 就能查看。 (实测:某个已交付演示文稿只使用了 23 种命名组件中的 1 种,其中三个评审发现——标签擦到条形、数值飘离轨道中心线、参考线有三种不同画法——都是未使用的组件在设计上就能避免的缺陷。) 然后将演示文稿的形式类别统计写成一行字面内容(cards/panels: N · diagram: N · chart/proportional: N · big-type/editorial: N · timeline/roadmap: N · hero-image: N …),并逐项核对以下六点:(a) 任何类别都不得占内容幻灯片约 40–50% 以上(这与步骤 2 的形式账本多样性门槛、评审者和 form-selection.md 使用的范围相同——某类别落在此范围内时,需要像计划阶段的门槛所要求的那样,用一句话说明内容上的理由,而不能默默打个 ✗);初稿中最偷懒的默认形式是卡片/面板,逐页检查看不出整套演示文稿的相似性,因此这份统计是唯一能让这种拐杖现形的地方;(b) 内容体现比例 / 转变 / 除法 / 流程的每张幻灯片,都应使用能展示它的形式(比例条、拓扑图、分栏、路线图),而不是用方框把它说出来;(c) 每张内页都应填满画面——内容只到上半部分的幻灯片,要么丰富内容,要么与相邻幻灯片合并,要么用一句话说明其低调风格是有意为之;(d) 统一画布系统——不得只有一张内页单独切换背景明暗/颜色(切换必须在分隔页系列或首尾页中重复出现;生成模板分支中,每页内容都应保留底图,节奏变化应来自图像强度——ONE-OFF CANVAS FLIP lint 是渲染时的兜底检查);(e) 内容按类别划分时使用图标(默认做法——图标有助于一秒内读懂内容,并强化系统感)——列出内容涉及工具/实体/角色/支柱/类别/步骤的幻灯片;每张此类幻灯片都应采用计划中的图标系列(同一系列,按调色板重新着色)。如果整套演示文稿都跳过图标系列,必须给出符合高门槛的分类理由(icon_none_category:主题图案主导 / 编辑风格 / 幻灯片数量很少 / 模板锁定)+ icon_none_checked: [slides],不能只写“类别不够丰富”——“选择启用”绝不代表可以默默跳过(自我验证 (g))。图标必须表达内容,不能只是装饰:不得在单独的数字/陈述旁边加一个主题印章;(f) 版式架构轮换——再输出一行统计,列出每张内容幻灯片的要点位置(底部条带 / 侧边栏 / 行内 / 标题 / 无)和容纳方式(面板承载 / 直接置于画布):任何单一要点位置不得用于超过约一半的内容幻灯片(每页都有底部条带会显得像模板套路——BOTTOM-STRIP MONOCULTURE lint 会兜底检查),并且在干净的画布上,至少约 1/3 的内容幻灯片应让主体直接置于画布上,不放在面板中。输出这些统计以及 (b)/(c)/(d)/(e)/(f) 涉及的幻灯片编号,而不只是打 ✓,才能迫使你从整套演示文稿的层面进行审视——逐页构建绝不会促使你这样做。 **仅限 Codex:**在 PRE-FLIGHT 12 之后,遵循 references/codex-runtime.md。其独立关卡不会改变全局审计的建议性分类;它只是要求 Codex 使用检测到的组件,或在证据记录中保留针对特定幻灯片的定制方案理由。

**关卡绝不省略。**快速/低风险/内联运行可以缩小每项产物的规模(例如 5 行内容计划、10 行设计计划),但绝不能省略关卡本身:访谈 → 内容计划 → 设计计划(含自我验证)→ 预检 → lint+统计 → 评论。此技能发布的每项规则遗漏,都发生在某个步骤只是在“脑子里”过了一遍,而没有实际写出来的时候——没有写下来,就等于没做。**自动豁免/内联路径最容易出问题:**没有检查点的受众时,构建过程会退化为单次贪婪流程,每张幻灯片都选用同一个顺手的组件,并在“没出问题”时就停下——以上每道关卡都是底线;只有实际输出的候选形式(每张幻灯片一个来自不同类别的备选方案)以及 PRE-FLIGHT 12 盘点,才能推动流程接近上限。委派制作的幻灯片组会为自己输出这些内容,而不是为用户输出。

步骤 5 — 渲染、验证,然后运行演员–评论家循环

你应该已经运行过构建时的几何关卡(在步骤 4 结束时运行 dk.lint_layout(prs)),并在进程内清除了其中的 CRITICAL 问题(超出画布 · 溢出 · 文本重叠),因此渲染循环开始时,几何问题基本已清理完毕。下面的 lint_deck.py 会在最终文件上重新检查几何问题,作为一道防线,并补充仅渲染/解析相关的故障;其余需要查看实际像素的问题(裁切、对比度、平衡、方框问号字符、文本叠在杂乱图像上),都只有渲染后才能发现。

要迭代已渲染过的幻灯片组?添加 --fast。 render_deck … --fast 会根据上一次运行,对每张幻灯片进行指纹比对(其 XML 和 rels,以及所引用媒体的字节内容,并混入涵盖主题/母版/版式/画布尺寸的全局摘要),然后只重新渲染发生变化的幻灯片——它会将 pptx 提取为仅包含这些幻灯片的子集,转换该子集,并只覆盖相应的 PNG。在一个 18 张幻灯片的幻灯片组上测得:完整渲染约需 2.8 秒,修改一张幻灯片约需 2.3 秒,内容未发生变化的运行仅需 0.07 秒。🔴 真正的收益在于无操作轮次,而非只修改一张幻灯片的轮次——无操作轮次不会启动 LibreOffice,而任何实际渲染都要付出约 2.5 秒的启动时间,这远超页面处理时间,因此只修改一张幻灯片的轮次大约能节省五分之一时间。绝不要因为觉得渲染很费时就跳过重新渲染;它只需几秒。输出与完整渲染的结果逐字节相同(已验证),因此评论者和渲染时 lint 看到的内容与完整渲染时完全一致。如果映射可能有误,它会回退到完整渲染,并说明原因:幻灯片数量发生变化、所有幻灯片均已更改、没有缓存,或者幻灯片组包含自动幻灯片编号字段或隐藏幻灯片(LibreOffice 会从 PDF 中移除隐藏幻灯片,因此第 N 页不再对应第 N 张幻灯片——若页数与幻灯片数量不一致,完整渲染现在会大声警告并拒绝缓存)。将其用于演员–评论家修复轮次和交付后的微调(“将第 7 张幻灯片改为图表”);首次渲染幻灯片组以及传入 --deliverables 时,则使用普通完整渲染。 首先渲染并查看(bash scripts/render_deck.sh <deck.pptx> → 每张幻灯片生成一张 PNG)。python-pptx 会盲写——溢出、对比度过低、标注框压在页脚上,或缺失字形,只有查看图片才能发现。修复机械性问题并重新渲染。 将构建 → 渲染 → 检查串成一条命令——python3 build_<deck>.py && bash scripts/render_deck.sh <deck.pptx> --fast && python3 scripts/lint_deck.py <deck.pptx> --renders render。 🔴 --fast 必须包含在这条命令中,而不是靠你自己判断是否使用。 第一次渲染也可以安全使用:没有缓存时,它会打印 --fast fell back to a full render: no previous render cache 并执行完整渲染;幻灯片数量发生变化、编辑了整个演示文稿、存在隐藏幻灯片或自动幻灯片编号字段时也一样。因此,如果该标志不起作用,就不会带来任何成本;如果起作用,则每轮都能省下一次完整渲染。之前的建议是在这条命令上方一段文字中,但命令里却漏掉了它;这就等于根本没写,因为每轮都会复制这条命令。 (唯一不得包含该标志的命令是交付前的渲染命令——--deliverables 需要生成完整演示文稿的 PDF,同时传入两者会导致命令失败。) 这几个步骤有严格的依赖顺序,因此不能并行运行;但它们之间也不需要做任何决定:分三条消息运行毫无益处,反而要让对话上下文承担三次完整流程,而不是一次。&& 已经会在首次失败时停止整个流程,和你自己决定停止的位置相同。 (在一台机器上首次运行,或渲染报错?运行 bash scripts/check_env.sh,验证 LibreOffice 和 Python 依赖项,并显示缺少内容的修复方法。) 如果这一步中出现任何失败或警告——构建异常、你无法立即识别的检查结果,或渲染没有生成任何内容——请先打开 references/troubleshooting-faq.md:其中将所有错误情况(构建异常 · lint_layout 代码 · 渲染失败 · lint_deck 检查结果 · [stats] 处理或接受指南)逐一对应到症状 → 原因 → 首选修复方法。向用户说明检查结果时(在检查点、FYI 或交接中),请使用该页面的通俗说法——说明出了什么问题、原因是什么,以及已应用或建议的修复方法——切勿只提供用户需要查阅文档才能解读的原始检查代码。 Codex 沙箱说明: 即使 check_env.py 检查通过,在托管沙箱中启动 LibreOffice 仍可能导致程序中止或无法生成 PDF;此时只需以提升权限/非沙箱方式重新运行渲染命令,然后继续正常的渲染 → 检查 → 评审循环。这是环境权限问题,并不能证明演示文稿有问题。 然后运行布局 lint——python3 scripts/lint_deck.py <deck.pptx>(添加 --json out.json 可生成结构化的检查结果副本和统计信息块——把它交给受派的审查者,而不是让他们重新解析控制台文本;lint 会自动读取演示文稿旁边的 ./render PNG,为颜色/明暗节奏行和 FLAT RHYTHM 警告添加信息;也可以传入 --renders <dir>——没有渲染文件时会静默跳过,因此不会影响未渲染的运行)。render_deck.sh 还会生成 render/thumb_first.png 和 thumb_last.png(约 240px),供审查者进行海报测试。构建时的 dk.lint_layout(步骤 4)已在渲染前排除了纯几何问题;lint_deck.py 是它在渲染阶段的补充——它会在最终文件上重新检查几何问题,并找出只有从渲染/解析后的演示文稿中才能发现的问题(这些问题特意留给它处理,lint_layout 不会检查)。这是一项轻量、确定性的检查,会标记不可见/与底色对比度过低的文本(未着色的文本段默认为黑色,在深色卡片上会消失)、超出幻灯片范围的内容、溢出卡片并遮挡其后方内容的文本、一行中高度不一致的卡片、两个实心区块/图像相互重叠(彼此不包含)、页脚碰撞、标点孤行/寡行(独占最后一行的 。/,或单个字形——禁则)、没有东亚字体的 CJK 文本(禁则的根本原因)、整页图像(可编辑性),以及孤立/空白幻灯片:这些问题恰恰容易被肉眼忽略(藏在面板下的标注;垂到卡片下方的 2 行正文;单独落在一行上的 。)。修复所有检查结果,重新渲染并再次运行 lint,直至通过,然后再交给审查者。它还会打印软性 [warn] 警告(仅供参考,不会阻止交付),提示硬性检查类别无法判定的问题:信息图像缺少替代文本、数学字体乱码风险(渲染主机未安装 equation_native 字体)、低对比度/正文对比度范围(1.8–4.5:1)、仅含分组内容,以及无障碍检查项——无幻灯片标题/幻灯片标题重复/阅读顺序(屏幕阅读器导航)、非文本对比度(实心标记/线条的 WCAG 1.4.11)和图标对比度(重新着色的单色图标与其底色之间也必须达到 3:1 的最低值——图标属于图片,因此上述检查无法识别)。请解决这些问题,或明确接受它们(FAQ §7)。硬性检查类别还包括图像上的文本——对置于照片/渐变背景上且没有不透明底色的文本进行渲染像素对比度估算(<1.5:1),这正是纯色填充对比度检查无法发现的问题;其 1.5–3.0 范围会触发图像上文本对比度 [warn]。 文本对比度(WCAG 1.4.3)也属于无障碍检查项:小于 14pt 的文本,或小于 18pt 且非粗体的文本,如果在填充底色上的对比度低于 4.5:1,则交付时会被拦截(而非仅作提醒),检查结果还会指出能保持色相的最接近墨色。若幻灯片的可见标题不是阅读顺序中的第一项(例如标题上方有引导语),或位置过低,可用 deckkit.a11y_title(slide, "<title>") 声明——它会创建一个位于画布上方、不可见的标题占位符;视觉语言页面会自行调用它。 🔴 在构建脚本中记录一次交付模式,而不是反复输入标志: 在 prs.save(OUT) 旁边添加 dk.declare_delivery(OUT, "selfread")——可选值包括 presented · textheavy · 🔴 用户拒绝口述稿时,还要设置 notes="none"—— dk.declare_delivery(OUT, "presented", builds="static", notes="none")。这是再后一条规则中的完全相同参数:对于演示型幻灯片,如果演讲者备注为空,就会触发 NO NOTES;用户要求移除口述稿,做出的决定却无处记录,于是每次 lint 都会一直触发警告,还得每次手动豁免。🔴 它只会消除那一条警告,不会影响其他任何内容——字数上限刻意保持不变。该技能的立场是,这些句子应该放在备注中,因此,把它们放在幻灯片上确实存在值得继续关注的矛盾;提高上限,就等于用工具为该技能反对的做法背书。 selfread · surface。对于用户选择不使用 appear-builds 的演示型幻灯片,传入 builds="static"(dk.declare_delivery(OUT, "presented", builds="static")):构建方式和模式一样,都是用户做出的决定;但它此前仍只能靠记忆保留——如果不记录,每次 lint 都得重新输入 --static,否则幻灯片明明是因为用户选择了静态构建,却会触发 NO BUILDS。它会将 delivery 写入 <deck dir>/.deck-gates.json,lint_deck.py 和 render_deck.py --gate-check 都会读取该文件;两者都会说明这一点并指出文件名,而且已记录的值在两者中都会优先于冲突的标志。为什么这是🔴,而不只是一个便利功能:如果模式只存在于标志中,它就只能靠记忆保留,而记忆会遗漏。对一份已交付的 14 页自读型幻灯片进行测量——不带标志时有 20 行 [stats],使用 --selfread 时有 10 行;这 10 行指的是套用到无人讲解的幻灯片上的约 40 词演示型上限,以及“14 张幻灯片中有 14 张的演讲者备注为空”。一半的提醒输出都是工具因不了解当前内容而生成的噪声,而噪声正是让人学会略过门禁检查的原因。(--briefing 仅适用于 lint,且不能记录——render_deck.py 没有 briefing 下限,因此记录它会导致幻灯片 lint 通过,却无法通过交接;lint 会明确拒绝该选项并说明原因。) 随后会输出一个 DECK STATS 区块——这是对设计目标的量化结果。请认真阅读,别一眼带过。(对于独立阅读的演示文稿,传入 --selfread,可提高 TEXT WALL 字数上限(约 40→约 90 字);对于编辑型数据简报,传入 --briefing——这种类似 FT/Economist 的密集阅读形式,以六张图表旁约 150 字为规范,会将字数上限提高到约 150,并将占用率区间提高到 80%,而不会像 --textheavy 那样移除任一项检查;同时会去掉仅针对演示型文稿的 SMALL TYPE / NO BUILDS 警告,其他警告不受模式影响——对于海报/单画布作品,传入 --surface;对于用户明确选择高文字密度的演示型文稿,传入 --textheavy;对于用户选择不使用渐进构建效果的演示型文稿,传入 --static(这会关闭 NO BUILDS 警告——静态演示型文稿是用户的选择,并非遗漏),以使各项上限符合交付模式)。它会逐页测量: 阅读负荷(拉丁字母单词数 + CJK 字符数/2),与约 40 字的演示型文稿上限比较 · text% / ink% 覆盖率,与对应角色的 OCCUPANCY 区间比较(封面/分隔页约 25–35 · 执行摘要/摘要页约 45–60 · 技术/证据页约 55–70;超过约 70–75 即为 CROWDED)——请注意,lint 测量的是 INK,因此区间指的是墨迹占用率,而非其空白区域的补数 · 最大字号(pt) · 形状/图片/图表数量 · 是否存在渐进构建效果 · sim↑(与上一页相比的布局骨架相似度);整份演示文稿则会输出字体直方图 + 字体戏剧性比例以及渐进构建效果/转场 n/N。[stats] 警告会指出所测量的规则——TEXT WALL(超出字数上限 → 将文案删减后移至备注,或拆分页数)、HOLLOW FILL(页面看起来内容饱满,但大部分墨迹只是绘制出来的容器——占用率按边界框并集计算,因此描边框会按其整个占用面积计入;一页中仅放四个字符也可能测得 49%。🔴 调整间距之前,先确认这种形式是否恰当:此处其他每项警告都指向几何布局,而这个问题通常应通过降低容器的视觉权重来修复,而不是重新调整间距)、CROWDED(占用率超过约 70%——各角色区间:封面 25–35 · 执行摘要 45–60 · 技术页 55–70 → 删除内容或拆分页数,别缩小字号)、LAYOUT SAMENESS (连续 3 页使用同一骨架 → 未遵循 §1.2 的骨架轮换规则)、FLAT TYPE (缺少排版主角 → 未遵循字号层级戏剧性规则)、SMALL TYPE(正文中位字号低于相对于画布约 18pt 的等效下限 → 减少文字,放大字号)、SIZE SPRAWL(单页使用 >3–4 种字号 → 使用已声明的字号层级令牌)、NO BUILDS(演示型文稿没有渐进构建效果 → 动效清单未通过检查,除非用户选择不使用渐进构建效果——这种情况下传入 --static)、SKELETON VARIETY(8 页以上的演示文稿中布局骨架少于 4 种 → 画布架构几乎没有变化)、TIMID COVER(第 1 页最大字号小于正文的 2 倍 → 封面缺少海报级字号)、FLAT RHYTHM(通过 --renders/./render 提供渲染 PNG 时:整份演示文稿没有明暗或色温变化 → 节奏图中的 Background-mode 列单调乏味)、WEIGHT MONOCULTURE(整份演示文稿的视觉重量总是压在同一侧——这是整份演示文稿的占比判定,不是逐页判定。单页不平衡属于构图,而本技能正是要求这样做;只有当页面的一半几乎为空(占用率 <5%)时,才会报 LOPSIDED。逐页平衡指标会恰好惩罚那些本技能的审美规范旨在创造的不对称编辑式构图,因此连续数值仅用于整份演示文稿的占比判定。带有 design_intent(weight=…) 的页面不会计入比例的任一侧——其布局是经过决策的,而非默认产生的。它尚未纳入 SAMENESS_CODES:该复合指标是根据本技能自身的各项指标校准的,新信号要先在真实演示文稿中经受检验,再纳入其中,而不是一发布就加入)、TEMPLATE-BOUND(用于制衡构图大胆程度的指标——仅当演示文稿自身的 design_plan.boldness 为 bold/experimental,但没有任何内页突破默认框架时触发:没有满幅出血设计、没有留白衬托的宣言式页面、没有主导视觉的主角,每张内容页都只是同一安全矩形的变体。它衡量构图怯懦的下限——一份演示文稿可以有 11 种不同骨架,却仍将所有大胆之处都放在概念与装饰上,墨迹的位置却毫无突破;突破设计是否真正创新,仍由评论者判断其独特性。此项仅供参考,而且与 WEIGHT MONOCULTURE 一样,特意未纳入会阻止怯懦的复合指标,须先在真实演示文稿中经受检验;恰当的克制绝不会因此受到催促(boldness: conservative 会关闭此项)),以及 CJK 演示文稿中的 CJK TIGHT LEADING(CJK 多行文本的行距 ≤ 单倍行距 → 使用针对文字系统的默认值)和 CJK-LATIN SPACING(混用了两种 pangu 间距规范 → 在整份演示文稿中选用一种)。将每项 [stats] 警告视为对应的具名设计规则已被量化判定为不合格:修复问题,或用一句话说明为何这份演示文稿属于例外;并将 stats 区块粘贴到评论者的输入中,让评审依据数字评分,而非印象。这是一道针对无重叠、内容适配边界框、密度和节奏规则的安全网,不能取代实际检查(它无法判断裁切、平衡、可读性或保真度)。 仅限 Codex——在将同意视为移交之前闭合执行循环:保留最终的 lint JSON 和组件审计 JSON,补全 .codex-deck-evidence.json,然后严格按照 references/codex-runtime.md 的说明运行 scripts/codex_delivery_gate.py,并输出 .codex-delivery-receipt.json。在分享文件路径、下载链接、文件引用或完成声明之前,针对该回执和最终 PPTX 运行 scripts/codex_handoff_guard.py。 没有匹配的 CODEX HANDOFF GUARD: PASS 就不得交付——应报告进度或标明为未经验证的草稿。仅硬性 lint 全部通过并不代表通过:如果卡片主导性、字体类型膨胀、CJK 行距或证据缺失的问题仍未解决,则应保持阻止状态,除非有明确且具名的豁免说明为何此演示文稿属于例外。

🔴 当门禁显示干净、像素却显示有问题时,以像素为准。绘制顺序就是一再证明会导致问题的故障类型:后添加的形状会绘制在文本框之上,而所有几何检查仍会显示正常。曾有 3 个真实演示文稿因此交付——页脚细线盖住来源行、由 150 个小块组成的区域抹掉了说明文字、由 40 个方框组成的虚线划穿脚注——每个问题都是由人查看 PNG 后发现的。教训不是“再加一条规则”:旧检查枚举的是原因(这种形状类型、在此时绘制、覆盖这么多内容),而原因无穷无尽,因此其中的每个排除项都会留下漏洞。现在,OCCLUSION / RULE THROUGH TEXT 会测量文本块上方所有绘制内容的并集,因此由许多小部分构成的内容无法绕过针对单个形状设定的阈值;TEXT NOT VISIBLE 则直接从像素中提出一个答案有界的问题——这一行是否渲染出任何字形?——因此无论是图片、组合、渐变,还是与底色相同的色块,都能被捕获,而无需识别它究竟是什么。这仍然只是兜底检查,并非证明。该模型仍看不到:组合内部的形状(重新设计分支中导入的 SVG 和用户 .pptx 文件)、图表内部(两个 lint 工具都不会打开图表部件,因此格式错误的数字格式代码会以原始形式渲染)、旋转形状、使用替代字体测量的文本(lint 会指出这一点,并留出约 1 行的余量),以及任何与 XML 所暗示的绘制结果不同的 LibreOffice 绘制内容。lint 全部通过只意味着“模型能看到的内容没有问题”,绝不意味着“幻灯片是正确的”——这正是执行此扫描的全部原因,也是它不可省略的原因。

**还要仔细查看 lint 说明它没有做什么。**如果没有与演示文稿一同提供的渲染图,基于像素的检查类别就会自动停用;运行时会打印一行 [skipped] … NOT checked: …,并在 --json 中包含 pixel_checks。出现这行时的 0 findings,与没有这行时的 0 findings 意义不同,只有其中一种符合表面所示的含义。

渲染自查——提交给评审者之前,逐张扫描所有幻灯片,检查以下问题(这些问题在构建代码中不可见,只会出现在像素中;自行发现可以省去一轮评审——完整说明见 references/design-principles.md):

先查看 render/contact.png,然后仍要逐页阅读。 渲染会在逐页 PNG 旁生成一张包含整套幻灯片的图片。只有在这张图里,整套幻灯片层面的问题才真正可见:明暗节奏、开篇和结尾是否首尾呼应、形式多样性、每页都盖上同一种装饰样式、画布翻转是否恰好只落在一张幻灯片上——这些正是 ONE-OFF CANVAS FLIP / TITLE-RULE MONOCULTURE / FLAT RHYTHM / BOTTOM-STRIP MONOCULTURE 衡量的内容,单独查看任何一张幻灯片都看不到。🔴 它不能解决任何逐页问题,也绝不能替代下文要求的逐页检查。 按比例测量:图中的一页为 46 px/inch,因此 23pt 标题是 15px,清晰可读;但 13.5pt 正文只有 8.6px,10pt 来源行只有 6.4px——两者都无法阅读。 字体、对比度、标签是否擦到色条、是否重叠、数字是否正确:这些都无法根据整页缩略图判断。利用它了解哪些页面最值得关注,再进行逐页检查;把它当成视觉检查本身,就是本技能在其他地方反复发现的“因为没看出问题所以通过”这一失败。

🔴 在同一条消息中读取幻灯片 PNG——所有幻灯片放在一个工具调用块中——然后逐张判断。 这是序言中的 round-trips × context 规则最关键的应用场景:在 N 条消息中读取 N 张幻灯片,会把整段对话重新发送 N 次;到构建中期,上下文约为 300k,因此查看一套 14 页幻灯片要花约 4.2M tokens,才能检查约 21k tokens 的图像。一起读取只需发送一次图像。批量读取不能模糊判断:之后按顺序检查幻灯片,并且为每一张幻灯片记录一行结论——s07: ok / s07: teal glyph on aqua tile, <3:1——因为对 14 张图片形成总体印象,不等同于逐张扫描 14 次;此清单要求的缩放级别检查(每个图标色块都要单独核对约 3:1 的对比度;检查每个 PDF 裁剪图的四条边)仍须逐项完成。结论行是证明扫描确实发生的记录;没有结论行的幻灯片就没有经过检查。 🔴 现在,这项检查必须作为门禁产物记录,而非写成说明文字:在 .deck-gates.json 中将其记录为 render_selfcheck.slides,每张幻灯片一条结论,涵盖所有幻灯片({"n": 7, "verdict": "ok — signature lands"} / {"n": 7, "verdict": "teal glyph <3:1 — recoloured"};Codex:证据文件中的 render_selfcheck)。移交门禁会拒绝缺少此项或记录不全的幻灯片,因此这项由执行者快速完成的检查——能在花费一轮评审前发现溢出、主体被裁切或数字错误——会留下记录,不再成为最容易被跳过的步骤。它的局限也与 content.slides 相同:它能证明记录存在,却不能证明判断正确(问题页面上的 ok 仍会通过);强有力的逐页保障来自独立评审者对覆盖范围的约束。真的没有可供查看的渲染图(少见的 --static 情况)?请书面注明豁免(render_selfcheck.waived)。

🔴 盲读回查——检查图片,而不是文件。请在上述自检之后、评审者检查之前运行。 本技能的其他所有门禁回答的都是“文件里有什么”;没有任何一项会把页面当作页面来读取。而本技能历史上每套“检查全绿、实际却有问题”的幻灯片,都正是从这个缺口漏过去的:线框图、通过所有宽度下限检查的 <placeholder> 文本、由六个灰色方块组成的幻灯片、被绘制成绝对值的负向条形、长度短了 46% 的中文文本。上述自检无法弥补这一缺口,因为它是自我认证的:实测一套 15 页的幻灯片,15 页都记录为 ok,但外部读者的第一句话就指出了缺陷。三个步骤,每步一次往返:

python3 scripts/blind_read.py packet  <deck-dir>          # PNG 路径 + 固定问题列表
# → 只把这些内容交给一位独立读者(agents/blind-reader.md)。它不得查看
#   .deck-gates.json、计划或主题——了解核心观点的读者,无论图片是否呈现了该观点,
#   都会在图中找到它。
python3 scripts/blind_read.py compare <deck-dir> --answers <its json> --write

比较结果是计算得出的,而非自行声明的——没有可填写 ok 的结论字段。它会将问题分为三类:HARD(文本被裁切或重叠、屏幕内容自相矛盾、占位符、页面没有传达任何内容、计划中有图标但读者看不到)——修复并记录为 fixed;ASK——书面回答;note(判断性意见:“食品主题页面没有食品图片”)——记录给评审者,不需要回答。读者并非万无一失:当它判断错误时,请在 refuted 中说明你对渲染页面重新核查了什么——绝不可假称已修复。首次在一套已发布的 15 页幻灯片上实际运行时,发现了 10 个严重问题,包括正文与来源行中的数字相互矛盾;这一问题此前通过了来源溯源门禁、评审,以及 15 条 ok 结论。当前运行环境没有独立读者?请申明豁免 no-reader——这会如实记录该幻灯片未经阅读便已发布,而非暗示它已被阅读。

🔴 不要手工编写 blind_read.findings,也不要修改严重程度。 门禁会基于已记录的 ANSWERS 重新运行比较,并要求所有需要回答的问题都在记录中,且严重程度一致——因此,将 HARD 问题降为 note,或清空问题列表来伪装成没有问题,都会被发现并指出。(审计发现这两种伎俩都能通过后,我们补上了这一规则:第一版“没有地方可填写 ok”只对数据结构成立,对实际内容却不成立。)补上比较器遗漏的问题是好事,绝不会触发标记。如果你确实更改了记录后它仍发出警告,那说明比较结果已过时——请重新运行 compare --write。

🔴 检查非英文或中文的幻灯片? 分类使用的关键词集只覆盖这两种语言,因此以其他语言写出的问题会落入 note,整套幻灯片就会看起来没有问题。此时,读者必须为每个问题添加标签:{"what": "…", "kind": "clipped|bleed|overlap|contradiction| legibility|unkeyed|judgement"}。由读者选择 KIND;严重程度仍由门禁判定。无论是哪种情况,记录都会包含一行 READ_TRIAGE_COVERAGE,说明有多少问题已分类,因此绝不会悄无声息地把“全部都是判断性意见”当成“全部没问题”。

  • 溢出 / 对比度 / 页脚 / 字形——没有被裁切或溢出的文本;对比度 ≥4.5:1;页脚上没有挤作一团的内容;没有豆腐块或缺失字形;并且没有孤立标点(单独的 。/,或落在独立一行的单个字形——设置 deckkit.EAFONT,让 PowerPoint 的东亚标点避头尾规则将其与前文连在一起,必要时加宽或改写)。
  • 不显示构建/元数据注释——检查是否有描述幻灯片制作方式而非内容本身的文字:“(可点击编辑的原生图表)”/“(editable native chart)”、“(AI-generated)”、“(placeholder)”、“(draft/草稿)”、“generated by…”、TODO/FIXME。它们绝不能出现在幻灯片上——请删除(此类信息应放在代码注释或交接材料中)。泄漏到页面上的元标签意味着交付有问题。
  • 堆叠分组应读作彼此独立——对于带标签的堆叠分组(统计标签+数值+说明、堆叠卡片),组与组之间的间距应明显大于组内间距(邻近原则);说明文字不能挤到下一组的标签。
  • 平衡与合理留白——每个元素的四周都应有舒适的边距:不要挤到边缘,也不要留下一大片空白(把握好度——既不过紧也不过松)。分栏面板加两侧边距应相等;窄元素旁不要留出大片空白;文字旁的图形应贴近边距定位(而不是居中后孤零零地远离文字),与文字之间相隔一个间隔;重复模块/连接线间距均匀;遵循网格对齐,不要左右失衡。卡片内的列或堆叠内容应填满标题下方的空间——阶梯、列表、堆叠标签应均匀分布,填满可用高度;不要只贴底部或顶部排列,以致标题与首个项目之间留出明显空隙(请根据区域计算间距——(region_h − n·item_h)/(n−1)——或使用 vstack/rows,不要手动指定偏移量)。每个标签都应贴着其所标注的对象——说明文字应在所属面板上居中(而不是按文字列宽度除以 N 居中;一旦面板宽度不一,这种做法就不对),标签应与其对象的基线和左边缘对齐。标签与对象没有共边时,即使没有重叠或溢出,也会像是浮在空中;预检 9 要求明确指出每个锚点,而 CAPTION NOT ALIGNED 只负责兜底检查面板下方的说明文字。
  • 区块内边距适中,不要用膨胀的填充物凑版面——标签/卡片/标注框中的文字应与边框之间留有适度且均衡的上下边距(垂直居中;既不能在高框里显得漂浮,也不能挤得太紧)。较短的卡片底部不能留下一条白带。**不要放大区块来伪装成填满整张幻灯片:**大框里只有一行小字,是占位内容的明显信号——要么添加真实内容将其填满,要么缩小框体,让它贴合文字,并利用腾出的空间;绝不要通过放大容器来填补空隙。
  • 字体层级(内容 < 标题)——正文/内容/标注框/标签文字应明显小于幻灯片标题(层级之间有清晰的差距,约为 1.4–1.8×);正文、公式或标签不能与标题一样大或比标题更大。只有刻意设计的视觉焦点元素(一个大数字或定义该页的方程)可以大于正文,但仍须小于标题。
  • 视觉焦点数字应清晰呈现——整数必须在同一行显示(不能把“2026”断成“202”和“6”——使用 wrap=False 或足够宽的文本框);数字高度一致、基线对齐(使用等高数字字体,如 Helvetica Neue / Arial / Cambria,不能使用 Georgia 这类旧式数字字体;其数字高度各异);数字串在行内应与相邻的中日韩字符/拉丁字符对齐(见 design-principles.md 的“Big numbers”、font-guidance.md)。
  • 图表坐标轴应延伸至所有条形;累计值不能重复计算——条形图/瀑布图/点图的基线/数值轴应延伸到所有条形下方(不能在最后一条之前就结束);累计图/瀑布图只能展示增量或总值,不能把两者都作为并列条形展示(“+8 / +8.3 / +16.3”三项并列就是重复计算);不同量纲应分开堆叠。优先使用 designed_charts.waterfall,而非手工绘制悬浮方框(见 design-principles.md 的“Designed plots”)。
  • 图形尺寸应与数字相符——将条形/色带/单元格的尺寸或颜色与其标注数值对照查看:量值柱/条应从 0 开始(截断坐标轴会让 210/220/230 看起来像是陡升约 3 倍);比例图形(漏斗带、气泡)的尺寸应与 value/max 成正比,不能因最小尺寸下限而变大,从而与标签矛盾;发散/有符号比例尺应体现其正负号(真正的 0 应为中性色,而非蓝色)。deckkit 默认处理了这三种情况——若手工制作或使用 matplotlib 绘制的图表没有做到,请标记(见 data-viz.md 的“Chart anti-patterns”、design-principles.md 的“Designed plots”)。
  • 公式大小应与内容相称——每个公式的字符应在约 正文字号下清晰可读(不能放大到填满幻灯片宽度,也不能缩得难以辨认),并且各张幻灯片之间保持一致(放置高度相同);任何行内变量/符号都应使用数学格式(斜体、真正的上标/下标),不能用普通正文字母或 Unicode 上标/下标代替。
  • 线条/分隔线不能穿过文字——每条细线、分隔线和强调色条都必须从区块之间穿过,不能穿过区块。构建时的 RULE_THROUGH_TEXT 门禁现在可以确定性地检测此问题;如果渲染结果中出现这类情况,说明线条是根据当时文本长度手工计算 y 坐标绘制的。请修正计算方式,而不是坐标。
  • 页脚碰撞 / 重叠——没有区块伸入页脚区域,堆叠区块之间也没有重叠。如果发生这类情况,原因几乎总是为会自动增长的标注框/堆叠内容手动指定了 y 坐标——请改用 bottom_callout() / vstack() / content_band(),不要只对某个坐标进行临时微调(文本一变就会再次出错)。**请特别检查内容与底部标注框/色条的接缝处:**宽色条哪怕只是轻轻擦过上方卡片,也会遮住卡片的圆角——两者之间必须有明显空隙;应根据标注框返回的顶部位置减去一个 GUTTER 来设定内容大小(在调整内容尺寸之前预留空间,不要最后再把标注框加上去)。
  • 相邻 / 堆叠区块之间应有明显间距,不能只留一条细缝——任何两个沿同一轴排列的区块(堆叠面板、并排卡片、流程节点)之间都必须有清晰可见的间距:≥约 0.13in(约为 GUTTER 的 ⅓)。约 0.02in 的缝隙(三个面板的间距为 1.04、高度为 1.02)看起来就像贴在一起——间隙远小于幻灯片自身的边距,会显得拥挤,即便并未重叠。原因通常是手动指定的间距几乎等于区块高度。修复方法:根据区域推导间距——使用 rows(n) / vstack(..., bottom=…),让间隙在布局生成时就确定,而不是使用 block_h + 0.02。 (构建时的 lint 警告 SLIVER_GAP 能确定性地检测此类问题——渲染时仍未处理的问题,意味着构建时报告被跳过了。)
  • 条形标签应位于条形上——对于任何带有填充条的轨道行(百分位数/份额/进度/“目标值与实际值”),数值/百分比标签都应垂直居中于条形的中心线,不能浮在条形上方或下方,也不能与轨道重叠。请使用 meter_bar()(其布局会自动将数值居中),不要把数字手动放在猜测的 y 坐标上。
  • 标记说明文字应位于标记下方——在时间线/刻度行/编号步骤行中,每条说明文字(日期 · 标题 · 副标题)都应与其圆点/标记水平居中对齐,包括首尾两端。常见问题是:末端标记靠近幻灯片边缘,其居中说明文字被夹在边界内,导致说明文字偏离标记。请使用 timeline() 或 spaced_centers()(它们会将首尾标记向内缩进,确保所有说明文字都能居中对齐),不要手工绘制圆点+说明文字行,并对每条说明文字单独应用边缘限制。
  • 示意图——箭头应指向流程前进的方向(在堆叠框之间向下/向上);相邻区块之间应留有明显间隙,不能贴在一起;单独的字形/图标应在视觉上居中(在中文幻灯片中居中标记应使用 ASCII,而非全角字符)。连接线/环路标签(例如反馈环路中的“修订”/“重试”)应置于线条旁的空隙中——水平线段上方或竖直线段旁,并留有间距——而不是放进一个遮住线条的实心标签块中。与幻灯片形成强烈对比的标签块看起来像创可贴;应将标签放到空白处,让线条和文字不发生碰撞。(在纯色背景上,若标签以背景色遮住线条、让线条在文字处清晰断开,则可以接受;所谓创可贴,是指明显可见的标签块,例如在彩色/纹理幻灯片上放白色块。只有标签必须跨过复杂背景时,才添加微妙的半透明底色。见 references/design-principles.md → “Connector labels”。)
  • 区块颜色——在一组标签/卡片/阶段区块中,每个区块都应使用有意区分且对比鲜明的色调:相邻区块不能同色,序列中也不能把中性灰当作一种类别(请使用 palette()——它会对这两种情况发出警告)。鲜艳区块挨着灰色区块,会显得像只完成了一半。
  • 标记与填充色的对比度——色块上的图标字形、彩色标签上的符号/数字——标记必须从其所在的底色中凸显出来(约 3:1),而不只是与幻灯片背景形成对比。放大查看每个图标色块:同色系配对(水鸭色字形放在青绿色底块上)或深色配深色(彩色字形放在近黑色底块上)都会看不清——这正是中间色调底块会掩盖的错误。icon_tile 会自动防护此问题(深色底块使用白色/近白色字形,浅色底块使用深色字形);手工将图标放到 box 上则不会,所以要在此处检查。
  • 标题——副标题/定义行与标题强调线之间应留有明显间隙;引导眉题应补充章节标签,而不是重复标题开头已有的词。标题装饰本身不能在每张幻灯片上都重复同一种固定模板——约 12 张内容页都使用完全相同的眉题+标题下横线,会让人一眼看出是套模板(创意也是设计指标,不只是正确性)。lint_deck.py 现在可以确定性地兜底检测最常见情况——同一条细线在超过 60% 的内容页中以相同高度位于标题下方时,就会触发 TITLE-RULE MONOCULTURE(使用会在整套幻灯片上套用同一种装饰的 head() 风格辅助函数,正是这种问题复发的方式);其他无法测量的装饰形式(标签页/边栏/序号)仍需通过此项自检。整套幻灯片中应轮换使用 2–3 种标题样式(例如经典强调色线条 · 填充标签/胶囊中的眉题 · 左侧竖向强调色条 · 章节序号 · 图案标记),让相邻幻灯片的装饰样式各不相同,也不让某一种样式占据主导——这与骨架轮换下限类似,适用于眉题装饰(references/design-intelligence-addendum.md)。这并不违背重复原则:视觉系统始终保持一致(相同配色、字体搭配、每页都有标志性图案)——轮换的是装饰样式,不是整体识别。那正是“重复系统,变化主角”(references/design-principles.md C.R.A.P.),并非让每个标题都彼此毫无关联。
  • 图片——关键主体应完整呈现,不得裁切(使用 contain 而非 cover);生成的真实事物图片应符合事实(相对大小/比例、数量、颜色);任何标签都应位于其所指特征下方。来源可靠的照片还必须具有审美上的可用性,不能只看主体是否正确:拒绝难看/正在施工(起重机、脚手架)/模糊/光线差/杂乱/缺乏代表性的照片——重新寻找来源,或生成一张明确标注为风格化的插图(精美准确的插图胜过难看的真实照片;见 references/image-generation.md 的审美门槛,以及“已搜索、找到但质量低 → 生成、标记为示意插图”这一层级)。
  • 图像上的文字(主视觉 / 照片 / 画面)——结合文字背后的像素检查标题:(a) 图像中的线条 / 边缘 / 图案 / 边框装饰不能穿过字形(遮罩只能让明亮的装饰线变暗——线条仍会看见;如果标题所在位置有线条图案,应使用 α ≥ 0.88 的近不透明面板、下三分之一横幅或填至画布边缘的角落卡片将其遮住,绝不能溢出画布);(b) 每段文字——包括金色/着色的眉题——与实际背景之间的对比度都应 ≥4.5:1;(c) 大标题与副标题/横线之间应有明显间隙(副标题紧贴标题基线会显得像排版错误)。可通过加强底色、将文字移到空白区域或重新调整间距来修复;标题与图像相互干扰是真正的缺陷,应像溢出问题一样处理。
  • 精准裁剪 PDF 图表——对于每一张从论文中提取的图表,都要放大近距离检查四条边(不能只扫一眼全图)并确认:(a) 图表自身的任何部分都没有被裁切,也没有紧贴裁切边缘(紧贴就等于被切掉);(b) 没有混入页面文字(图注、相邻图注的片段、页眉、页码、正文中的零散行文);(c) 图表自成一体——自身的 x/y 轴标签都在,没有被你在幻灯片上添加的图例悄然取代。完整元素清单和绘图区边界框这一陷阱(自动检测器的框会排除坐标轴标题/刻度/图例,因此凭目测贴近该框裁剪会漏掉这些内容)见步骤 4 中的 “Never clip the figure's OWN parts”。图表裁切、有部分紧贴边缘或缺少坐标轴标签,都是真正的问题,不是吹毛求疵。
  • 动画与图片应凭审美取舍——已有内容应各得其所(突出重点/增强吸引力/引导视线),不能漫不经心地添加;简洁也完全可以。 在原生 Windows(PowerShell / cmd)上没有 bash——请直接调用 Python 入口点: python scripts\render_deck.py <deck.pptx> 和 python scripts\check_env.py。 .sh 文件只是转发到相应 .py 脚本的垫片,因此 macOS / Linux / Git Bash / WSL 无需更改仍可使用;工具链中的其他部分已经都是跨平台 Python。 如果 check_env.sh 通过后仍然渲染失败(在循环中途出现构建/LibreOffice 错误), 请逐一排查,不要反复折腾:构建脚本是唯一可信来源,而且可以重复运行, 因此请注释掉可疑的幻灯片(或你最后添加的形状),重新构建并渲染,以确认其余内容正常, 然后修复那张幻灯片并恢复它。常见原因是素材路径错误(不存在的图形/GIF/公式 PNG)或 格式不正确的 equation_png 字符串——Python 回溯会指出问题所在。不要悄悄交付渲染不完整的幻灯片; 如果某张幻灯片无法渲染,请告知用户是哪张以及原因。(症状 → 原因 → 修复表: 渲染失败见 references/troubleshooting-faq.md §5,构建回溯见 §3。)

如果使用了动画/构建效果:渲染结果(以及评审者)只能看到最终构建状态, 无法播放整个序列(anim.py 的时间设置已验证可往返转换为 PowerPoint 原生构建效果;只是 LibreOffice 无法播放它)。 因此,请像往常一样运行循环,确认完全构建后的 PNG 单独查看也能正确呈现;并在第 6 步中向用户 描述点击顺序。构建效果只是叠加在正确静态幻灯片上的一层效果,绝不能用来修补杂乱的幻灯片。

🔴 构建后评审问题——在这里提问,并让用户查看幻灯片

渲染干净,两个 lint 检查均通过,自检结论行也已写好。现在——不是第 0 步——发送渲染后的幻灯片(联系表 + 幻灯片 PNG 路径),并提出一个问题:

选项运行内容大致成本
fast(默认)1 位通用评审者、1 轮、重新核查排名前 5 的主张~10–20 分钟 · ~250k tok
standard2 位视角评审者(内容 · 设计)、2 轮、排名前 10 的主张——适用于答辩/推介/高管汇报~30–60 分钟 · ~600k
thorough多评审者小组 + 裁决者、3 轮、核查每项主张~1–2 小时 · ~2M
none不评审——按原样交付0

🔴 **在没有选项 UI 的运行环境中——普通 Codex 聊天、Kimi、GPT 界面、API 调用方;这才是常态,并非例外——请将它作为一个可输入的问题提问,绝不要伪造表单。**请使用 用户的语言。这与第 0 步的规则相同;此处再次强调,是因为这个问题没有可继承的访谈环节——无法提问的问题不会悄然变成默认选项,而会悄无声息地变成默认选项:

幻灯片已渲染——幻灯片位于 <path>/render/slideNN.png(联系表: <path>/render/contact.png)。请查看,然后告诉我评审要多深入: fast(默认——1 位评审者、1 轮、约 10–20 分钟)· standard(2 位视角评审者、2 轮、 约 30–60 分钟)· thorough(评审小组 + 裁决者、3 轮、约 1–2 小时)· none(按原样交付)。

无法显示图片的宿主仍须提问——这些路径就是幻灯片,用户会自行打开。 无图像宿主不能替用户回答这个问题;这正是提出该问题要避免的唯一情况。 为什么这个问题放在这里,而不是面试环节:在第 0 步,这是一次盲选成本决策,针对的是一份没人看过的演示文稿;正因为是盲选,fast 永远不能成为默认选项(否则用户从未选择过的召回率下降会悄然发生)。看到演示文稿后,同样的选择就是知情的——用户已经评判过内容本身,因此低成本档位是恰当的默认选项,而完全放弃审查也是合理的答案,不是钻空子。三条规则确保这一点:

  • 每次都在选项文本中说明成本和会跳过什么(见上表)。对于 RESEARCH-SOURCED 演示文稿,none 的选项文本还必须说明会跳过对抗性的一手来源复核——这是用户仅凭自己的眼睛无法发现的唯一缺陷类别——然后交接内容中的 provenance: 行写为 skipped — user declined post-build review,绝不能写成暗示审查已执行的计数。
  • none 会被记录,而不是悄无声息地跳过:在 .deck-gates.json 中使用标准的 user-waived 评审豁免,引用用户拒绝的话——{"critic": {"waived": "<the user's words>", "waived_category": "user-waived"}};对于研究来源的演示文稿,还要添加 {"provenance": {"waived": "skipped — user declined the post-build review"}},确保记录与交接行内容一致。(Codex 路径:review_effort: "none" + none_opt_in。)这套机制一直都在,就是为此而设。 仍然存在的 fast 阻断项会按名称交回用户处理(见下方的上限规则),因此默认档位绝不会悄悄交付一份已知有问题的演示文稿。
  • 在每份演示文稿的 AUTO WAIVER 下,运行 fast——绝不运行 none。“由你决定”是委托确定审查力度,而不是决定完全跳过审查;告知用户的说明会记录 review: fast (post-build default — auto),用户若想要更多审查,可在交接时升级。对于高风险用途(答辩/高管汇报/路演),自动流程可以升级到 fast 以上,并记录理由——review: standard (escalated — defense deck, auto)——但绝不能取消审查。

然后按选定档位运行行动者-评论者循环——这是质量引擎,而评论者是一个严格的评判者(见 agents/critic.md),不是盖章机器:

🔴 不要重新输入下面的调度内容。 python3 scripts/dispatch_brief.py prompt --brief <path> --role critic --lens A|B --round N --deck <dir> 会打印该内容——约 220 个 token,而手写版本实测约 4,600 个 token;契约卡随后会直接取自每位评论者都会读取的那个文件,而不是在每次调度时重新构建(本步骤下文警告的正是这种重建)。简报在第 1 步通过 dispatch_brief.py init 编写一次;只要任何必填部分尚未填写,该工具就会拒绝输出提示词,因此空洞的简报会明确报错,而不是调度一个什么都没被告知的评论者。编号条目要求的所有内容仍必须写入简报——工具改变的是内容写入的位置,而不是是否需要写入。

  1. 评审。 通过宿主提供的多 Agent/子 Agent 工具,调用独立的评审子 Agent,指定其读取 agents/critic.md,并提供渲染后的 PNG、演示文稿的目的 + 受众(以及访谈中记录的交付方式 + 密度选择,以便应用评审标准中的密度细则)、references/review-rubrics.md、第 4 步中的动效清单(使其能评判静态渲染中看不到的动效设计)、契约卡(见下文),以及源材料(以便核实主张/图表/数字,而不只是评判风格)。使用单独的 Agent 很重要:它评判的是像素,而非你的意图。它会返回结构化 JSON,其中包含 verdict(「同意」/「修改」)、逐页 findings(严重程度 + 具体修改建议)、优点、plan_audit + probes 区块,以及(在整份演示文稿获得同意时)一行 ceiling。 采取行动前先验证评审(反略读门禁的消费端): 运行 python3 scripts/validate_review.py critic <json>(验证架构一致性),然后检查 coverage.slides_opened 是否列出评审者分配范围内的每一页(单独评审者负责整份演示文稿;分区评审者负责其章节范围),passes 是否涵盖单独评审者的两个视角,stats_block_seen: true,以及在发送过契约卡时 contract_card_seen 是否不为 false。任何一项不符合要求的评审都会被拒绝并重新分派一次,同时指出缺失之处——不得据此采取行动。 契约卡审计由同一命令检查,而非靠你目测。 validate_review.py 要求存在 plan_audit 区块,以及 passes 中每个视角所需的 probes 条目(内容 → lens_a + memory_sentence;设计 → lens_b + per_slide),要求填写其中的每个指定子字段,并拒绝对空值或 null plan_audit 声称 contract_card_seen: true。最后这条规则尤其值得注意:否则,评审可以声称收到契约卡,却没有审计其中任何契约,而 concept_landed、signature_move、register_interiors、takeaway_titles 等——即整套用于检验声明的设计意图是否与像素相符的机制——都会被跳过,演示文稿却仍然获得同意。 交接时,覆盖范围检查已改为机械执行——render_deck.py --gate-check 会重新打开记录的评审、统计演示文稿的实际页数,并拒绝 slides_opened 未覆盖所有页面的同意结果。因此,分区评审者必须声明其范围,否则门禁会把它视为有遗漏的整份演示文稿评审:"coverage": {"scope": [4, 9], "slides_opened": [4,5,6,7,8,9], …}。(增加此检查的原因:一个架构有效的 15 页演示文稿评审,只声明 slides_opened: [1],却被接受、记录了 sha256、打印为已验证,并通过了所有交接门禁——「已验证」只表示文件仍与记录的哈希一致,并不表示有人看过整份演示文稿。slides_opened 是反略读字段;此前没有任何检查会将它与演示文稿进行比对。Codex 交付门禁已经对此作出约束;现在这条共享路径也补上了检查。)仲裁者的输出也按相同方式验证(validate_review.py arbiter);仲裁者的 escalated_unreviewed 条目会作为候选评审发现交给下一轮的全新评审者(或在达到轮次上限时,与其他未决问题一起呈现给用户)。
    • 🔴 按校验器接受的形式索要评审——从校验器获取,绝不手工拼凑: python3 scripts/validate_review.py --schema critic 会以 JSON Schema 的形式打印出该契约,你直接将这份 schema 作为结构化输出 schema 传给子 Agent。同一个文件既负责发布也负责校验,且由同一组枚举常量构建,因此向 critic 索要的形式与评判它的形式不可能发生偏移。在此之前,该契约只有一种读取方式——靠失败来发现——而失败发生在评审已经跑完之后,那时 Agent 的 token 已经花掉,返回的评审根本无法归档。在一个真实 deck 上实测:两个视角都运行了,读完了全部 12 张幻灯片并产出了真实的发现(1 个 blocker + 7 个 major + 6 个 minor,以及 3 + 4 + 4),但两者都无法被记录,因为派发时臆造了 {slide, severity, what, fix} 而不是 {id, slide, severity, dimension, issue, why, fix}。那个 deck 的 critic 块只能被手工写成一份分类豁免,而无法记为已获同意——循环跑了,而证据文件却无法说明这一点。有两样东西是这份扁平 schema 有意不承载的,因为它们是条件性的,承载它们就是在说谎:plan_audit 的逐视角义务,以及 contract_card_seen: true 要求必须有真实审计这一耦合关系(两者都写在 schema 自身的 description 中,且都在返回时强制执行)。

    • 🔴 每一份返回的评审一到达就立刻落盘,在你阅读它或据它行动之前: python3 scripts/fanout_record.py put <deck-dir> --round critic-r1 --member <lens> --file <review.json>,对于死掉的成员,用 … miss <deck-dir> --round critic-r1 --member <lens> --why "<what happened>"。然后 … status <deck-dir> --round critic-r1 --expect content,design——它会 以状态码 1 退出 并只列出需要重新派发的成员,这样"这一轮已完成"就成了一次检查,而不是你记忆中的印象。否则,扇出会以最糟糕的方式变成原子的: 结果回到你的上下文中,而上下文不是文件,一个死掉的成员就会让整轮作废。在一个真实构建上实测——DESIGN 视角因会话上限而死,而 CONTENT 视角已经产出完整评审(1 个 blocker、7 个 major、6 个 minor),这份评审是从工作流结果里读出来的,从未被写下来,因此 validate_review.py --record 无从登记,deck 发布时 .deck-gates.json 里只有 delivery。记录失败与记录结果同样重要:曾有一轮 19 个 Agent 返回 surviving: 0,这读起来完全像是"什么都没发现",而事实是"它们全死了"。这是持久化,不是通道——Agent 之间没有任何横向流动,因为一个知道作者意图的 critic 就不再独立了。

    • 把同意记录为证据,而不是声明——在你已经在运行的校验上加上 --record <deck-dir>: python3 scripts/validate_review.py critic <review.json> --record ~/Downloads/<deck>/。它会从已校验的评审本身写出 .deck-gates.json 的 critic 块(verdict · blocker/major 计数 · 评审文件的路径 + sha256),随后第 6 步的关卡会重新读取该产物,而不是相信一份摘要——一份被移动、被编辑或带有 revise verdict 的评审会在交接时失败。对每一份评审都运行它,而不是每轮只运行一次——它写入的字段是 reviews_seen,即它被交给过的不同评审文件的数量,因此一个标准的 2 视角 × 2 轮评审团会记录 reviews_seen: 4。🔴 reviews_seen 不是 rounds,工具绝不会从一个推导出另一个:一轮是针对同一构建的 N 份视角评审,而评审文件内部没有任何信息说明它属于哪一轮,所以只有你知道这个数字。--record 会保留你写入的 rounds,且不会凭空编造——这意味着 rounds 是这个块中唯一需要手工填写的字段,而保持它诚实是你的责任。在高风险 deck 上,对 arbiter 的 Job-2 载荷文件运行 --record,会把佐证通过记录到 critic.corroborated_by 下。为什么这不是形式主义: 你在交接时手打的记录是自我认证——跳过循环的模型和跑了循环的模型写出同样的 JSON,因此两者产出相同的文字,只有产物能把它们区分开。🔴 无来源的 consent 现在会被拒绝,而不仅仅是被标记——consent verdict 必须携带已记录的评审(source + sha256,coverage 绑定到 deck),因为一个光秃秃的 {"verdict": "consent", "rounds": N} 恰恰就是上文那个 JSON 完全相同的案例。这是最后一个自我认证漏洞被堵上,与 Codex 路径一直以来的要求一致。在没有产物的情况下表示同意的唯一方式不是一种更弱的同意——而是下面这份诚实的豁免(waived_category: no-dispatch-on-host + inline_ran),它会打印 NOT INDEPENDENTLY REVIEWED。一个能够派发子 Agent 的宿主不存在无来源的情况:产出产物就是在它已经运行过的评审上执行 --record。按 validate_review.py --schema critic 打印出的形式索要评审,这样你拿到的评审距离关卡所要求的产物只差一次 --record。

    • 将已批准的声明台账原样交给审稿人——绝不要为了派发任务而自行重写摘要。 审稿人只能根据收到的材料核查幻灯片,因此,简报中省略的每条已验证事实,都会变成错误的“缺少来源”意见。在一份演示文稿中测得:第二轮审查的此类意见中,8 条里有 7 条是简报造成的假象,而它们耗费的那一轮纯属浪费——损失超过任何面板规模选择。台账已在步骤 1 中作为工件生成;传递该工件,而不是你对它的记忆。

    • CONTRACT CARD 的完整字段列表见 references/critic-panel.md → “The CONTRACT CARD”。每次派发审稿任务时,都要根据已批准的计划(仅限声明,绝不包含理由)组装此卡;每次都要阅读字段列表,不要凭记忆重建;没有步骤 1 计划的外部/重新设计演示文稿,则填写“none-declared”。上文的验证关卡会拒绝任何缺少 contract_card_seen 的审查。

    • 收到通过验证的审查结果后,请阅读 references/critic-panel.md → “Handling a returned review”:将上一轮的 strengths 作为给执行者的不可损害台账(以及绝不向下一位新审稿人展示这些内容的规则)、探查项与计划的差异及其处置方式,以及如何处理 ceiling 行。

    • 根据利害关系调整审稿人规模——并以评审面板的形式开展审查(这是主要的提速手段):

      • 面板规模、视角分配和仲裁者交叉验证环节(包括非对称的采纳/丢弃规则)→ references/critic-panel.md → “Panel composition by stakes”。每次派发任务前、选择面板之前都要阅读。
  2. 做出决定。 一旦 verdict == "consent" 就立即停止(批评者会原样呈现内容)——而不是等到上一轮的问题都修好。 **无论风险级别如何,达到上限时若仍有未解决的 blocker/major,都绝不能悄悄交付:**在第 6 步的说明中,将未解决的发现如实作为开放问题提出——这相当于下文高风险情形中“达到上限时明确失败”的低风险版本。按风险级别限制轮数,让循环快速收敛:低风险约最多 2 轮,高风险最多 3 轮。 用户的 review: 等级(上文 BUILD 后的问题)遵循同一规则,并提供了可操作的选项:fast = 1 轮,standard = 2 轮,thorough = 3 轮,none = 0 轮(记录为 user-waived,绝不执行)。standard 和 thorough 只是上文两种风险级别的纯别名——使用相同的评审小组、仲裁方式,并在每一轮都重新评审整套幻灯片。fast 是默认选项,因为用户是在看到渲染后的幻灯片后才做选择——这是知情的低成本等级,而非悄无声息的选择。在 fast 下,没有第二轮来处理仍然存在的 blocker/major,因此必须将问题交还给指定的 USER,且运行必须保持未完成,直到用户回答:要么授权增加一轮(记录为对上限的例外),要么记录为他们自己的豁免,而不是模型的豁免——这条规则正是低成本默认选项安全的保障。等级表:references/critic-panel.md → “Review effort tiers”。 (上限数值有意放在两个地方——这里是因为上限由协调器强制执行,且没有任何 lint 会检查,所以第 1 层必须写明;critic-panel.md 则负责其余内容。两处必须一致:改一处,就要两处都改——这与下文的独特性规则面临相同的漂移风险。)

    🔴 “提出问题后继续交付”有一个例外:如果幻灯片的 boldness: 为 bold 或 experimental,且仍有 timid / sanded-to-safe 独特性发现。此时不得由你自行决定交付——进行一次改进尝试后,用两行将选择交给 USER:*(a) 再进行一轮——说明你会做出的具体修改;(b) 按原样交付,并记录为知情接受。*无论选择哪项,都会交付;改变的是由谁豁免。用户要求内容大胆,得到的却是平淡无奇的作品,这并未满足用户的要求;而你有动机认定自己的输出已经足够好。这是唯一一种能够阻止幻灯片交付的审美发现,且只有用户自己将旋钮设为 bold/experimental 时才会触发,绝不能将其当作最低标准(如果大胆的创意损害了可读性,应首先归为 floor 发现)。 对于 balanced+/conservative,规则不变:尝试一次,然后附上说明交付。 在第 6 步的交接说明中记录结果——distinctiveness: user waived (bold) 或 distinctiveness: resolved in round N。否则,事后无法区分“用户接受了”与“我从未征求过意见”,而这正是增加门槛条款要弥补的漏洞。 (由 agents/critic.md 的独特性维度与 references/review-rubrics.md 共同负责;三处必须表述一致——这条规则曾多次在不同文件中逐渐偏离。)如果首次渲染已无问题且批评者同意,一轮即可完成——不要凭空增加轮次。否则,应用 blocker 和 major 修复,重新构建并渲染。 🔴 对于分散到多个文件的幻灯片,修复任何内容前先获取幻灯片映射—— python3 scripts/slide_index.py section_*.py 会输出 slide N -> file:line function,以及每张幻灯片的计划行文档字符串。章节拆分意味着代码不是你写的,因此如果不先查看映射,处理第 7 张幻灯片的发现时,就得先在三个你从未读过的模块中 grep:一次实测构建中,这种搜索耗费了 33 次往返、约 30,000 个输出 token(约 9 分钟),重新推导出章节作者早已掌握的映射。先读一次映射,然后再按行打开文件。 🔴 在一条消息中应用整个已晋级的修复列表,然后用一条串联命令重新构建、渲染并运行 lint(python3 build_<deck>.py && python3 scripts/render_deck.py <deck>.pptx render --fast && python3 scripts/lint_deck.py <deck>.pptx --renders render)。已晋级的发现以列表形式给出,彼此之间没有数据依赖,因此每条发现单独执行一次 Edit,只是用新名字重演前言中每轮往返 1.00 个工具的失败:标准的两轮循环中约有 18 条发现,每次重新发送约 300k 的上下文,总计约花费 5.4M 个 token,却只输出了几百个 token。确实相互冲突的修复(两条发现涉及同一代码块,且第二次编辑取决于第一次的结果)是例外——这种情况应在第二条消息中处理,并说明原因。 这只改变编辑的传递方式:每条已晋级的发现仍会逐条应用,变更清单也仍会逐项列出。

  3. **重复。批评者会重新完整评审整套幻灯片(修复可能引入新问题)。持续迭代直至收敛;简要记录每轮改动,让改进清晰可见,而不是只看到反复折腾。 🔴 搜索预算是共享的、按会话计数且不可续用的资源——请像对待资源一样谨慎使用。 Web 搜索按 SESSION 设有上限(Claude Code:CLAUDE_CODE_MAX_WEB_SEARCHES_PER_SESSION, 默认 200),所有你派出的子 Agent 共用此上限,而且同一对话中的不同演示文稿之间不会重置。**实测:一次研究分发——12 个研究 Agent 加 7 个验证 Agent,由于没人告知它们搜索限制,它们各自自由搜索——耗尽了全部 200 次搜索。没有任何东西计量用量,也没有任何东西发出警告;数小时后,在另一项任务中,有人想查询一家公司的官方标志,却无法进行搜索,这才发现预算已耗尽。需要该标志的演示文稿最终没有加入标志,并在自身的局限性页面中说明了这一点。这就是问题的表现形式:便宜、靠后、零散的查询会被饿死,因为前期的大规模分发耗尽了一切。

以下三条规则按收益从高到低排列:

  1. **先完成数量少、目标明确的查询——再进行任何研究分发。**标志、品牌色、授权照片、某个具体的许可编号:这些只需要几次搜索,却最容易被饿死,而且第 2 步本就需要它们。提前完成这些查询毫无额外成本,还能彻底避免此类问题。
  2. 明确规划分发预算,并在每次派发时说明具体数量。如果没有明确上限,Agent 就会一直搜索到满意为止;同时派出 N 个 Agent,它们便会并行搜索。在提示词中写明——“你最多可以搜索 6 次;请把搜索次数用于解决其他方式无法解决的主张”——并控制这一轮的规模,使整个分发所用次数不超过剩余预算的大约一半——不是原始上限的一半。留一半,而不是用完:验证、制作过程中的事实核查和素材搜集都还需要预算。(是剩余预算,不是原始上限,因为上限按 SESSION 计数,在不同演示文稿之间不会重置:在同一对话的第二份演示文稿中,“上限的一半”可能超过全部剩余预算。第 1 步的派发规则也用同样的措辞表达了同一要求——它们是在两个关键时刻陈述同一条规则,所以改一处,就要两处一起改。)
  3. 记录计划用量和实际用量,这样预算耗尽是有人决定的数字,而不是有人撞上的高墙。预算确实耗尽时,要在演示文稿的局限性说明和交接内容中说明——不要让缺失的事实看起来像是不存在的事实。 🔴 主要来源门槛 — 仅适用于研究来源的演示文稿,且必须在交付前执行。 如果演示文稿的关键主张来自网络研究(所有无来源演示文稿,以及研究提供了幻灯片级数字/引文的任何有来源演示文稿),那么仅由内容评审员依据台账核验幻灯片还不够——按照这种核验方式,虚构或二手的台账条目必然会通过。因此,交付前要进行一次对抗式主要来源抽查:让拥有实时网络访问权限的独立核验 Agent 针对演示文稿的关键主张(每个醒目的数字、日期、直接引文、排名、归属)逐一尝试依据其主要来源进行反驳(原始论文/组织自己的帖子/官方文档——绝不使用聚合网站),并针对每项主张返回 CONFIRMED (URL) / WRONG / PARTLY-WRONG / UNVERIFIABLE。在发布前修正 WRONG 和 PARTLY-WRONG;对于 UNVERIFIABLE,要注明未经核实或删去——绝不能作为既定事实发布。 核验时,核验员还要标记规划员违反出处契约的情况(拼接数据、滥用引号——agents/content-planner.md §2,评分项 10)。核验规模应与评审员本身相当(快速演示文稿:一名核验员检查最重要的约 10 项主张;高风险演示文稿:分派多名核验员检查所有主张)——用户选择的 review: 档位决定同样的核验规模——fast = 最重要的约 5 项关键主张,standard = 最重要的约 10 项,thorough = 全部主张。档位只缩小抽样范围,绝不取消门槛;对于研究来源的演示文稿,只要执行了核验,就必须在每个档位执行这道门槛——这道门槛用于确认“幻灯片与台账一致”之外的“台账与现实相符”。唯一的例外是后期构建问题中的 none:用户拒绝了整个演示文稿可见后的评审流程,而这道门槛也包含在该流程中。这是 none 放弃的最重要保障——错误数字是用户仅凭自己的眼睛无法发现的问题——因此,对于研究来源的演示文稿,none 的选项文本必须明确说明会跳过这项核验,交付时的 provenance: 行必须写为 skipped — user declined post-build review,不能写核验统计。**顺序:**核验应与最终评审员轮次并行进行(或紧接其前);任何 WRONG/PARTLY-WRONG 的修正都要重新走常规的重建 → 重新渲染 → 重新 lint 流程;如果修正在评审员同意后才完成,则进行一次简短确认(仅检查修改过的幻灯片,无需重新进行完整评审)——门槛核验的修正不计入评审员轮次上限。**门槛的交付产物(执行要求,源自强制执行不变量):**第 6 步的交付内容必须包含一行 provenance:——N claims checked · N confirmed · N fixed · N cut/hedged——并可按需提供逐项主张的裁定列表;研究来源的演示文稿交付时若没有这一行,就意味着这道门槛未执行(第 6 步的清单中已列出此项)。完全基于用户自有材料构建的演示文稿无需执行这道门槛——此时要忠实于所提供的来源,而第 10 项已涵盖此要求——**但是,**如果 §2(b) 的重新核验用网络查找到的当前值更新或替换了某项来源主张,该主张就视为由研究提供,因此需要对相应条目执行这道门槛。

**高风险演示文稿:**每轮修正重新渲染后,阅读 references/critic-panel.md → “Verify the fixes and corroborate consent”——仲裁者重新核验变更清单(必须包含 dulled 标记),并执行发货前置条件:交叉验证同意规则。(这就是上方轮次上限规则所指的“达到上限时必须明确失败”段落。)

步骤 6 — 展示给用户,然后根据反馈迭代

展示渲染后的幻灯片(或缩略图总览),并附上一条简短说明:幻灯片数量、制作目的,以及相关的字体/可移植性注意事项。告知用户确切的输出文件夹路径(~/Downloads/<deck-name>/,或他们选择的路径),并请他们打开文件夹检查 .pptx — 渲染后的 PNG 可用于验证版面,但他们还应确认可编辑的演示文稿能在自己的设备上正常打开。然后主动询问是否需要另外生成两份预留的交付物,而不是未经询问就直接提供 — 一份 .pdf(用于提交/邮件/打印),以及一个 viewer.html 翻页预览(一个 file:// 链接,任何浏览器、任何操作系统均可打开,无需 PowerPoint)。它不依赖任何组件,但并非自包含:它通过相对路径引用 render/ PNG,因此移动时要将两者放在一起。构建过程中不会生成它们,因为仍在编辑的演示文稿一旦有改动,它们就会立即过时。用一句话询问(“需要 PDF 和浏览器预览吗?”);如果用户答应,或确认这是最终版本,则运行 bash scripts/render_deck.sh <deck.pptx> --deliverables(或 python3 scripts/render_deck.py … --deliverables),将两份文件放在演示文稿根目录,即 .pptx 旁边,然后提供这两个 file:// 链接。之后每次有改动都要重新运行,以免这两份文件与演示文稿版本不一致。如果根据保真规则添加了任何前瞻性内容,请在此处明确说明,以便用户确认。

🔴 无论用户对 PDF 怎么回答,每次交付都要运行这些门禁: python3 scripts/render_deck.py <deck>.pptx --gate-check — 它会运行每项交付门禁,不会渲染 任何内容,耗时不到一秒。如果这是该 deck 的交付模式,请像使用 lint_deck.py 一样添加 --selfread / --textheavy / --surface,这样它强制执行的文本预算才是该模式实际遵循的 预算;或者更好的是,在构建脚本中用 dk.declare_delivery(OUT, "<mode>") 记录一次,以后这两个工具都不需要再加标志。

🔴 用 deck_gates.py 写记录,不要手动填写——运行 python3 scripts/deck_gates.py init <deck-dir> --slides N,填写后再运行 … check <deck-dir>。 门禁会故意在某个 SECTION 遇到第一个问题时停止(后续检查会读取前面已验证的内容),而 design_plan 是有十多个必填字段的 SECTION——因此手动填写记录时,每个错误的 SHAPE 都要经历一轮来回。实际构建中测得:连续运行了 六次 --gate-check,每次有一个字段出错——先是 boldness 写成 bold — because …(门禁会 检查该字段是否完全匹配,因此理由应写在 boldness_derivation 中),接着是 signature_proof、 material_probe,然后 concept 写成字符串而不是 {chosen, rejected[]},最后 type_scale.body 低于易读性下限。deck_gates.py check 只读取 JSON,因此一次就能报告所有这些问题。 它是 SHAPE 预检,绝不是门禁本身:它无法知道锚点是否渲染出来、设计风格是否呈现在像素中,或署名 是否放在了某张幻灯片上——运行它之后还要运行 --gate-check。

🔴 它会一次报告所有失败项——[1/N] <section>,所以要全部修复,然后重新运行。 先修第一个问题 再重新运行,正是这种批量报告要消除的习惯:门禁过去会在遇到第一个问题时停止,因此在运行成本最高的 阶段,每个字段都要经历一轮来回。现在唯一仍会单独停止的情况是结构性问题(没有 .deck-gates.json、 JSON 无法读取、记录了未知的交付模式)——因为后续门禁会读取这些问题无法生成的内容。

其中一项门禁是 SAMENESS(雷同),它可能会让你回去重新构建。 deck 级别的单调性信号 (LAYOUT SAMENESS · SKELETON VARIETY · CARD DOMINANCE · BOTTOM-STRIP MONOCULTURE · TITLE-RULE MONOCULTURE · ENVELOPE MONOCULTURE · FLAT RHYTHM)以前会在每个 deck 上进行测量, 但不会阻止交付——它们只会显示为提示,并注明这些只是提示。现在,≥4 个不同信号,且至少一个 属于结构性信号时,就会阻止交付。 这只适用于包含 ≥8 张内容幻灯片的 deck(不计封面、结尾页和 任何通过 design_intent(role="appendix") 声明的附录部分),且必须为横向版式,并且不能使用 --surface——这一规则是通过构建并检查此技能本身规定的各种设计风格的 deck 进行校准的;其中 6 页的 状态更新、rednote 轮播图和以附录为主的答辩 deck 都会合理地触发 3 个以上的信号。单纯重复不会 阻止交付;四种彼此独立的重复才会。 刻意不将字体表现力(TIMID COVER / FLAT TYPE)计入—— 这是同一个事实的两种说法,而该技能自己的必须保持干净的测试样例也会同时触发这两个信号。 如果重复本身就是设计意图,请说明原因——豁免需要写明理由,而不是添加标志:

"sameness": {"waived": "<说明此 deck 为何刻意重复——写明设计风格>",
             "waived_category": "series-frame | register-uniform | template-locked | reference-run | user-waived",
             "codes": ["<门禁报告的准确代码>"]}

codes 列表用于绑定当前状态,是 critic.sha256 的简化版本:针对 deck 不同状态写下的豁免,不能 证明当前状态符合要求。这项门禁刻意只衡量数据,而不评判品味——deck 是否怯懦,仍属于 critic 的独特性维度,在 balanced+ 下仍不会阻止交付;是否重复自身,则是指彼此相似的幻灯片所占比例, 属于有具体修复方法的缺陷。这正是该技能判断哪些问题可以阻止 deck 交付的标准 (agents/critic.md),也是这两种情况分别处于标准两侧的原因。 为什么要单独设置一个标志: 过去只有通过 --deliverables 才能触发这些门禁,而上面的段落有意将 PDF 作为可拒绝的选项提供。因此,每当用户说“不需要 PDF,谢谢”时,这项技能中最严格的门禁就不会 运行——而且没人能看出它没有运行。门禁是否执行不该取决于用户无关的偏好。

🔴 另一项是 TIMIDITY(怯懦)——作为制衡,也是同一理念较新的一半。 上面所有会阻止交付的信号, 都是在惩罚 deck 过于繁复或过于雷同。却没有任何机制会因为 deck 过于保守而阻止交付: TIMID COVER / FLAT TYPE 不计入雷同综合指标,而唯一能够指出 deck 乏味的力量——critic 的独特性 维度——在默认档位下不会阻止交付,且存在于用户可以拒绝的审查中。实际构建中的测量结果:一个 12 页的 deck 迭代了十次,每一轮都由提示驱动,却让 deck 变得更平淡——为了消除 ONE-OFF CANVAS FLIP 而删掉深色转折页,为了消除 TEXT WALL 而删减内容,为了消除 SIZE SPRAWL 而压缩字体层级。这些提示都把更有野心的修复方案放在首位(“增加第二栏实质性内容来 丰富页面”“将这一处理方式重复用于一组分隔页”);删减只是让数字消失的更廉价办法,而当反馈只 指向一边,廉价办法总会胜出。 用户的结论是设计变差了,但流程中的任何环节都没有指出这一点。 因此,现在将 TIMID COVER · FLAT TYPE · TEXT-ONLY DECK(大多数内容幻灯片没有图表、图形或 绘制的形状——每一页的主角都是一句话)· MONOTONE INK(渲染后的页面实际上是灰度的)纳入门禁, 当信号数达到 ≥2 且至少有 1 个结构性信号时阻止交付(两个字体信号是同一个事实的两种说法,因此 仅靠表现力绝不会阻止交付)。 若设置 boldness: conservative 并记录一项 deliberately restrained: 做法,则不触发门禁——此时克制 本身就是立场;尺寸和纵横比下限也与雷同门禁相同。如果留白安静本身就是设计,请写明设计风格:

"timidity": {"waived": "<写明设计风格>",
             "waived_category": "register-restrained | text-is-the-artifact | template-locked | user-waived",
             "codes": ["<门禁报告的准确代码>"]}

🔴 触发门禁时,优先采用提示中首先给出的修复方案,而不是删减内容的方案。 怯懦中可测量的部分现在 已纳入门禁;不可测量的部分仍由 critic 负责。此时正该留意:你优化的是警告数量,而不是设计本身。 --deliverables 在 <deck-dir>/.deck-gates.json 记录 Step-2 设计计划、Step-5 评论者和 Step-6 来源核查确实已运行之前,拒绝执行。 评论循环收敛后写入——{"critic": {"verdict": "consent", "rounds": N}}、Step-1 故事弧竞争({"content": {"arc": {"chosen": …, "rejected": [{"name": …, "why_lost": …}], "divergence": …}}}——落败方案及其条款才是产物,因为单写 picked contribution-first 是任何人都能写的一句话,并不能证明竞争确实发生过;如果确实只有一种可能的故事弧,则写入 {"content": {"waived": "<why this deck had one possible arc>"}}。这个字段加入文件,是因为故事弧是唯一一个 Step-1/2 决策,其判定结果只留在对话中,而其他决策都记录在此文件里——Codex 路径此前也已要求绑定此项)、设计计划中的 boldness / signature_move / carried_by / form_ledger / icon_family / palette / style_pick(根据主题调整的外观选择——<preset|bespoke|generated register> for <domain> · beat <nearest rival> because <clause> · anti-pick avoided: <the domain / image cliché>,或 n/a — <locked template | mimic | provided>;根据 references/design-by-topic.md 运行排序竞选(领域 → 适合的预设 → 反向选择 + 陈词滥调防护),让外观适合主题,而不是凭反射选择——这项要求同样适用于 design-a-clean、bespoke 和 generate-a-template 分支)/ motif_generates(背景 · 标记 · 一页,其几何形状本身就是母题——只反复出现的母题只是按计划出现的装饰;与 signature_proof 一样,在 conservative 刻度下通过记录 deliberately restrained: 做法,将其单独列出)/ image_sources(每张内容图片一行,附带其证据标记——slide <n> | <subject> | sourced — <origin> (<licence>) · provided — user (own material) · generated — <tool> · searched (Commons, Openverse), none found → generated, flagged illustrative · … → native form;具体格式和用于选择标记的指代规则见 references/image-generation.md。没有内容图片的演示文稿应写入字符串 n/a — <why>,就像 logo plan: n/a — … 这一行。不能只凭信任接受这些标记:两个门禁路径都会运行 scripts/check_image_provenance.py,逐项核对 assets/**/sources.json、由 scripts/fetch_images.py 写入的台账,以及构建后演示文稿自身的文本。它首次让两项声明可供核查:searched, none found 这一层必须有已记录的搜索作为依据(而网络 unreachable 会被拒绝作为依据——主机被屏蔽并不能证明阿姆斯特丹不存在照片);需要署名的照片必须在幻灯片上标注来源,而不只是获得计划中的许可)/ type_scale(三个层级的数值——SIZE SPRAWL 要求作者“使用演示文稿声明的 type-scale 标记”绘制尺寸,这里就是声明这些标记的地方)/ signature_proof(锚点证明——一个列表 [{"role": "signature"|"complex"|"data", "slide": N, "png": "<rendered png>"}, …],每个锚点一项:渲染后的证据,证明标志性设计动作在构建后仍然保留、设计能够撑起整份演示文稿信息最密集的一页,以及图表沿用了它的视觉语言。若某个设计动作只存在于一句话中,它就会被磨平,退回安全的目录式设计,而且无人察觉,因为计划读起来仍然很大胆——而只在一张宽松页面上证明设计有效,对另外两种失败毫无说明)、以及来源核查的逐项 claims 列表,绝不能只写汇总计数(汇总计数由同一个可能跳过反证的检查过程写出)。有意跳过的门禁必须书面豁免——不能省略;工具会打印原因,因此跳过是可见的,而不是不可见的。🔴 评论者豁免必须标明类别,不能只写下来——未分类的豁免无法与从未运行过评论循环区分开,因此门禁会拒绝它(design_plan、provenance 和 density 的豁免只需写明原因——只有评论者豁免必须注明类别):

{"critic": {"waived": "<a sentence someone can disagree with later — ≥24 chars>",
            "waived_category": "already-reviewed-minor-edit | cap-reached-majors-open | external-deck | no-dispatch-on-host | user-waived",
            "inline_ran": true}}

no-dispatch-on-host = 运行环境无法调度子 Agent(并且还必须包含 inline_ran: true|false——“在我自己的上下文中内联运行过”和“从未经过审查”是两种不同的说法;如果此文件没有将它们区分开,交接说明读起来会完全一样) · already-reviewed-minor-edit = 对已经通过评论循环的演示文稿进行 1–2 张幻灯片的编辑 · user-waived = 已询问用户,用户选择不经审查直接交付 · external-deck = 此技能未创作的演示文稿(重新设计诊断/仅评论运行) · 🔴 cap-reached-majors-open = 评论循环运行至轮数上限,但主要问题仍未解决——其他四类都表示评论循环被跳过,因此这是最常见的非同意结局唯一诚实的标签;并且还必须包含 open: ["<each surviving finding>"](非空)和 surfaced_to_user: true|false。只要评论循环运行过,就应使用它,而不是 user-waived:user-waived 是对一段对话的声明,而将它用于并未发生的对话,正是分类豁免要防止的情况。如果五类都不适用,诚实的做法就是运行评论者。 此文件是交接的证据,而不是走过场:跳过门禁的模型和声称自己运行了门禁并写下说明的模型是同一个,因此两者写出的文字完全相同,只有产物能将它们区分开来(references/handoff-checklist.md 中列出了此项)。 critic 块由 validate_review.py --record 写入,不能手动编写(Step 5)——你只需提供工具无法替你生成的两个块:上文列出的完整 design_plan 块,以及来源核查的逐项列表。(唯一例外是:--record 会根据实际审查写入 CONSENT 记录,因此无法生成上述豁免格式——豁免必须始终手动编写,这正是它必须注明类别的原因。) 撰写交接说明前,请阅读 references/handoff-checklist.md——每副演示文稿都要读。 这是唯一权威清单,规定说明中应包含的内容(最少的注意事项 + 后续步骤,绝不是回顾或自我表扬),以及负责规则要求在此处列出的条件性 REQUIRED 行:provenance:、review:(执行的工作量等级 + 如何得出该等级)和 cost:(子 Agent · token · 墙钟时间——不展示账单的调节项,无法帮助人建立直觉)、点击顺序、图像许可、GIF 说明、已接受的警告、distinctiveness:、委派选项回顾、可选的 ceiling 行,以及两个品味生态系统提议——包括保存此风格的提议;若该演示文稿启用了自动指令,则完全跳过此提议:绝不写入未经同意的注册表。 对于经 Codex 验证的 PPTX,只有通过最终文件检查后才能撰写交接说明;明确标注为未验证的草稿是唯一可披露的替代方案。

对于较长的演示文稿(约 15 张以上幻灯片),在完成约 50% 时展示进度,而不是等到 100%。 当构建规模大到方向错误后难以挽回时,先渲染最初几张已完成的幻灯片(封面 + 几种内容版式),并在完成其余部分之前确认方向——“这是整体风格和前 3 张幻灯片;如果您没有异议,我会继续按此方向制作。” 这比等到 20 张都做好后才发现配色、密度或结构不符要省事。(这是轻量确认,不是 🔴 停止:如果该演示文稿启用了自动指令,请将早期渲染结果作为 FYI 发出并继续制作,无需等待;在默认流程中,则先短暂等待反馈,再完成制作。短演示文稿:直接制作并运行评审工具。)

交付后如何演示、编辑和迭代——references/handoff-checklist.md(同一文件的后续章节)。 交接时,对于任何包含演讲者备注的演示文稿(演示者视图 / export_notes.py / 如何在不丢失工作的情况下编辑),都要阅读该章节;并且在根据用户反馈重新运行构建前,务必阅读——其中包含协调而非覆盖的流程,以及必需的 user-dials: 轮次记录行。

第 6 步收尾——品味回写(命名清单,而非散文;完整流程见 references/user-taste.md):

  1. 为交付的演示文稿在注册表根目录的 taste.md 中追加一条风格历史记录(date | deck | preset/look | canvas value | signature motif,保留最近 10 条)——下一副演示文稿的新鲜感规则需要真实记录作为变化依据。
  2. 只有满足复现门槛时,才能将调节项提升到 taste.md 中(🔴 必须): 用户本人的措辞表明这是长期偏好(“always”“一直”“in general”“for all my decks”),或者同一维度、同一方向出现在 ≥2 副不同演示文稿的轮次记录中。一次性的或因特定用途而提出的修正应仅作用于当前演示文稿——错误提升调节项会悄然影响之后的每一次构建。每条已提升的记录都必须包含原话引用 + 演示文稿 + 日期 (否则按架构校验无效);后续反馈若与之冲突,应更新现有记录,绝不能另加矛盾记录。
  3. 在交接 FYI 行中说明每一处写入,并提供便捷的否决方式(如上)——静默写入等于没有发生。 对于没有任何持久偏好的全新用户,不要进行任何写入,也不要发送 FYI——只有出现第一个持久信号时才创建 taste.md。

反模式 — 绝对不要这样做

可核查的危险信号清单;如果草稿有任何一项,发布前都要停下来修正:

  • 绝不捏造来源未说明的数字、结果、引文或图表(唯一允许的例外是明确标注的前瞻性内容)。
  • 绝不跳过访谈,也绝不擅自假定主题/内容、模板、风格,或——对于没有任何过往记录的新用户——领域(应直接向当事人询问)。
  • 绝不把去年的数据当作今年的最新数据放在标注为今年的演示文稿中——数据必须以今天为准。
  • 绝不在幻灯片上留下构建/元数据注释——“(可点击编辑的原生图表)”/“(可编辑的原生图表)”、“(AI 生成)”、“(占位符)”、“(草稿)”、“由……生成”、TODO/FIXME。幻灯片文字是面向观众的内容,绝不是关于制作方式的备注;这类备注应放在代码注释或交接材料中。
  • 绝不让堆叠的分组混在一起——组间距必须大于组内间距。
  • 绝不让幻灯片留下未填满的空白,也绝不靠放大区块来假装内容充实——应通过丰富内容(补充要点应有的细节/示例/数字)或放大主视觉来填充空间;绝不要把只放了一行小字的卡片/提示框夸大,以填补空隙(应缩小框,让它贴合文字)。关键词是“未填满的空白”,这一界定就是整条规则的核心,因为墨迹覆盖率完全相同的两页,呈现效果可能截然相反: 构图完整 — 一个主角,周围留有大片空白。这是编辑设计中最经典的手法:在下半页留白上方放置 60pt 的陈述;留白是衬托主视觉的画框。当幻灯片具有排版主导性(最大字号的文字行 ≥ 正文层级字号的 2 倍)且对象较少(≤6)时,UNDERFILLED 和 DEAD BOTTOM 不再单独构成问题——无需再特意声明构图,才允许留白。未填满的空白 — 网格内容不够:字体平淡、同级内容很多,底部却空出一条带状区域,因为最后一行无内容可放。这正是本规则禁止的情况。 (内页应保持内容均衡充实——OCCUPANCY 各档位仍然适用。大片留白是 BOOKENDS 和陈述/转折页的表现手法,不是内容页的默认做法;封面/分隔页的墨迹覆盖率本就约为 25–35%,原因正在于此。)
  • 绝不将正文内容设为与幻灯片标题一样大(或更大)——正文/提示框/公式/标签必须明显小于标题;只有刻意设计的主视觉数字/方程式可以大于正文字号,但仍须小于标题。
  • 绝不把公式放得过大,也绝不让变量以纯文本形式出现——每个方程式的字号都应与正文大致相当(各页保持一致,不要放大到铺满幻灯片宽度),即使是单独出现的行内变量也要使用数学格式(斜体 + 真正的上标/下标),并将 LaTeX 保留在构建脚本中,以确保可复现、可编辑。
  • 绝不把自己当作最终审稿人——必须由独立审稿人认可;绝不默默发布渲染不完整或存在争议性阻碍问题的演示文稿(应明确指出分歧)。
  • 绝不覆盖用户手动修改的内容——重新生成并覆盖用户文件前,先协调处理。
  • 绝不发布用户未明确选择的纯文字墙幻灯片(Q4)、在有真实来源图时重新绘制的图、被缩减为单帧的动态 GIF、仅靠颜色传达的含义,或对比度低于约 4.5:1 的文字。
  • 绝不将真实的幻灯片文字、标签、数字、标志、引文、来源图或承载证据的图表放入 AI 生成的图像中;除非用户明确要求栅格化模型图,否则生成图像只能作为无文字的视觉辅助。
  • 绝不通过裁剪或放置过大来截掉图表自身的部分(图例、色条、坐标轴标签/刻度、最外侧行/列);也绝不将多面板图表拆成脱离上下文的片段,而完整图表本可直接使用时更不应如此——默认使用完整图表;裁剪/放置后,务必重新查看每张图表,确认没有任何内容被截掉。
  • 绝不让提示框/标签/要点栏中的文字明显偏离中心(位置偏低或贴边)——居中框中的文本框必须覆盖框的实际范围。
  • 绝不粘贴 Unicode 上标/下标(ᴴ ᵀ ᵣ);绝不制作“通用会议”演示文稿(应先研究会议);绝不让演示文稿在不同语言之间来回切换。

文件

要修改 SKILL 本身?打分,不要猜。 scripts/run_eval.py --score <deck-dir> --eval <id> 会根据 evals/evals.json 检查生成的演示文稿 — 仅检查可由机器判定的断言 (pptx 是否存在 · 硬性 lint 是否通过 · .deck-gates.json 中的阻断项是否齐全 · 用户提供的数字是否原样出现在幻灯片上 · 是否使用了提示词从未提供的数据 · 备注覆盖情况 · 以及 reference_reached,它需要 --transcript,也是唯一能回答 本次运行中是否真的读取了该参考资料 的方式)。刻意不对审美打分:参考相似度会奖励模仿,而封闭式美感综合评分会与此技能自身的多样性门槛冲突,因此我们考察过这两种方式,并予以否决。--record 会将结果追加到当前 VERSION 下,让“这个版本更好”不再只是主观印象。🔴 跳过的断言不算通过。之所以有这套评估,是因为 tests/ 中的测试套件全都在检查代码是否正常运行;一次无损重构可以获得 2298/2298 的成绩,但下一次实际运行却只读取 10 个参考文件中的 3 个,还一个图标都没交付 — 这种情况已经发生过两次。

完整清单 — 每个脚本及其参数、各个 Agent、所有参考文件、presets.py 中的 18 个设计预设,以及模板 Registry 路径 — 均位于 references/file-inventory.md。当你需要 Where things live 表格中尚未指向的功能时,请阅读该清单(例如,不熟悉的脚本参数、预设列表,或负责某项关注点的 Agent 或参考资料)。每个脚本的操作约定也会在运行它的步骤中再次说明,因此这是一份查阅资料,而非关卡。

评论

支持 Markdown