@topmindspace/tms-skills 2.0.1 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (95) hide show
  1. package/CHANGELOG.md +145 -134
  2. package/README.md +1 -1
  3. package/bin/tms-skills.js +160 -160
  4. package/package.json +48 -48
  5. package/top-ppt-html/README.md +254 -254
  6. package/top-ppt-html/SKILL.md +111 -111
  7. package/top-ppt-html/assets/examples/2026-09-09-architecture-graphite-dark.html +3926 -3926
  8. package/top-ppt-html/assets/examples/2026-09-09-architecture-graphite-dark.model.json +167 -167
  9. package/top-ppt-html/assets/examples/2026-09-09-architecture-spectrum.html +3926 -3926
  10. package/top-ppt-html/assets/examples/2026-09-09-architecture-spectrum.model.json +167 -167
  11. package/top-ppt-html/assets/examples/2026-09-09-presentation-apple-mono.html +4325 -4325
  12. package/top-ppt-html/assets/examples/2026-09-09-presentation-apple-mono.model.json +320 -320
  13. package/top-ppt-html/assets/examples/2026-09-09-presentation-brand-red.html +4325 -4325
  14. package/top-ppt-html/assets/examples/2026-09-09-presentation-brand-red.model.json +320 -320
  15. package/top-ppt-html/assets/examples/2026-09-09-presentation-business-blue.html +4325 -4325
  16. package/top-ppt-html/assets/examples/2026-09-09-presentation-business-blue.model.json +320 -320
  17. package/top-ppt-html/assets/examples/2026-09-09-research-deep-teal.html +5527 -5527
  18. package/top-ppt-html/assets/examples/2026-09-09-research-deep-teal.model.json +913 -913
  19. package/top-ppt-html/assets/examples/2026-09-09-research-indigo-violet.html +5527 -5527
  20. package/top-ppt-html/assets/examples/2026-09-09-research-indigo-violet.model.json +913 -913
  21. package/top-ppt-html/assets/examples/2026-09-09-research-mckinsey.html +5527 -5527
  22. package/top-ppt-html/assets/examples/2026-09-09-research-mckinsey.model.json +913 -913
  23. package/top-ppt-html/assets/examples/2026-09-09-research-warm-sand.html +5527 -5527
  24. package/top-ppt-html/assets/examples/2026-09-09-research-warm-sand.model.json +913 -913
  25. package/top-ppt-html/assets/pptx-export.js +1944 -1944
  26. package/top-ppt-html/assets/style-gallery.html +589 -589
  27. package/top-ppt-html/assets/templates/architecture.html +3728 -3728
  28. package/top-ppt-html/assets/templates/engine.css +840 -840
  29. package/top-ppt-html/assets/templates/presentation.html +3738 -3738
  30. package/top-ppt-html/assets/templates/research.html +4017 -4017
  31. package/top-ppt-html/assets/templates/ui.js +520 -520
  32. package/top-ppt-html/evals/prompts.csv +15 -15
  33. package/top-ppt-html/evals/rubric.schema.json +25 -25
  34. package/top-ppt-html/evals/run_evals.py +220 -220
  35. package/top-ppt-html/evals/trace.example.json +16 -16
  36. package/top-ppt-html/package-lock.json +207 -0
  37. package/top-ppt-html/package.json +35 -35
  38. package/top-ppt-html/references/charts-basic.md +624 -624
  39. package/top-ppt-html/references/charts-discipline.md +108 -108
  40. package/top-ppt-html/references/charts-extended.md +482 -482
  41. package/top-ppt-html/references/charts.md +28 -28
  42. package/top-ppt-html/references/components-atoms.md +624 -624
  43. package/top-ppt-html/references/components.md +30 -30
  44. package/top-ppt-html/references/content-rules.md +490 -490
  45. package/top-ppt-html/references/design-system-engine.md +235 -235
  46. package/top-ppt-html/references/design-system.md +478 -478
  47. package/top-ppt-html/references/failure-modes.md +214 -214
  48. package/top-ppt-html/references/high-fidelity.md +127 -127
  49. package/top-ppt-html/references/icons.md +397 -397
  50. package/top-ppt-html/references/industry-benchmark.md +105 -105
  51. package/top-ppt-html/references/infographics-stats.md +308 -308
  52. package/top-ppt-html/references/infographics-structure.md +226 -226
  53. package/top-ppt-html/references/infographics.md +43 -43
  54. package/top-ppt-html/references/layout-grammar.md +315 -315
  55. package/top-ppt-html/references/layouts-architecture.md +108 -108
  56. package/top-ppt-html/references/layouts-combo.md +600 -600
  57. package/top-ppt-html/references/layouts-research.md +160 -160
  58. package/top-ppt-html/references/modes.md +254 -254
  59. package/top-ppt-html/references/outline-design.md +275 -275
  60. package/top-ppt-html/references/playbook.md +266 -266
  61. package/top-ppt-html/references/pptx-export.md +209 -209
  62. package/top-ppt-html/references/reform-plan.md +252 -252
  63. package/top-ppt-html/references/styles.md +370 -370
  64. package/top-ppt-html/references/tech-design.md +138 -138
  65. package/top-ppt-html/scripts/audit_css.py +109 -109
  66. package/top-ppt-html/scripts/audit_docs.py +176 -176
  67. package/top-ppt-html/scripts/audit_skill.py +220 -220
  68. package/top-ppt-html/scripts/audit_styles.py +351 -351
  69. package/top-ppt-html/scripts/build_examples.py +2276 -2276
  70. package/top-ppt-html/scripts/build_pptx.js +2380 -2380
  71. package/top-ppt-html/scripts/capture_theme_overview.js +78 -78
  72. package/top-ppt-html/scripts/checks_html.py +127 -127
  73. package/top-ppt-html/scripts/cross_verify.py +294 -294
  74. package/top-ppt-html/scripts/env_probe.py +158 -158
  75. package/top-ppt-html/scripts/extract_model.py +210 -210
  76. package/top-ppt-html/scripts/extract_snippet.py +374 -374
  77. package/top-ppt-html/scripts/gen_channel_a.js +214 -214
  78. package/top-ppt-html/scripts/layout-constants.json +3377 -3377
  79. package/top-ppt-html/scripts/layout_slots.json +830 -830
  80. package/top-ppt-html/scripts/lib_layout_regions.js +412 -412
  81. package/top-ppt-html/scripts/measure_height.py +178 -178
  82. package/top-ppt-html/scripts/model-schema.json +547 -547
  83. package/top-ppt-html/scripts/negative_tests.py +307 -307
  84. package/top-ppt-html/scripts/package_skill.py +291 -291
  85. package/top-ppt-html/scripts/prepare_images.py +341 -341
  86. package/top-ppt-html/scripts/probe_image_export.py +188 -188
  87. package/top-ppt-html/scripts/quality_gate.py +301 -301
  88. package/top-ppt-html/scripts/regression.py +308 -308
  89. package/top-ppt-html/scripts/render_compare.py +275 -275
  90. package/top-ppt-html/scripts/render_from_model.py +698 -698
  91. package/top-ppt-html/scripts/scaffold_report.py +1054 -1054
  92. package/top-ppt-html/scripts/section-file-map.json +104 -104
  93. package/top-ppt-html/scripts/sync_runtime.py +662 -662
  94. package/top-ppt-html/scripts/validate_pptx.py +1510 -1510
  95. package/top-ppt-html/scripts/validate_report.py +1456 -1456
@@ -1,127 +1,127 @@
1
- # 按需深度模式(高保真交付规范)
2
-
3
- > **何时读本文**:用户提出「高保真 / 1:1 / 精确还原 / 按图还原 / 正式交付 / 不能偏移 / 像素级 / 严格对照 / 逐页验收」,
4
- > 或页面含**复杂信息图**(桑基 / 流带 / 树图 / 马赛克 / 箱线 / 网络 / 玫瑰 / 径向条 / K 线 / 漏斗)时。
5
- >
6
- > **定位**:默认流程保持轻量(一次问询 + 自动生成 + 校验闭环)。深度模式是**自动升级**的加强档——
7
- > 多跑三道检查(容器级溢出已默认开启,深度模式再加**连续文本流**与**空间锚点**)、产出 manifest、并准备渲染对照材料。
8
- > **不引入** SHA-256 冻结签名与逐页人工验收确认(会显著拖慢生成,与本技能"一次问询 + 自动生成"的定位冲突)。
9
-
10
- ---
11
-
12
- ## 一、触发条件
13
-
14
- | 触发 | 判据 |
15
- |------|------|
16
- | **用户明示** | 命中 `layout-constants.json` `deepMode.triggers`:高保真 / 1:1 / 一比一 / 精确还原 / 按图还原 / 正式交付 / 不能偏移 / 像素级 / 严格对照 / 逐页验收 |
17
- | **内容含复杂信息图** | 页面用到 `deepMode.complexCharts` 中的图表类型(sankey / streamgraph / treemap / marimekko / boxplot / network / rose / radialbar / candlestick / funnel) |
18
-
19
- 命中任一 → 交付时按 §四 跑深度模式校验链。**不命中则不要跑**(保持轻量,避免无谓开销)。
20
-
21
- ---
22
-
23
- ## 二、深度模式多做的三件事
24
-
25
- 1. **连续文本流检查**(`CONTINUOUS_TEXT_FLOW`):语义连续句不得拆成多个独立文本框。
26
- 2. **空间锚点注册**(`ANCHOR_TITLE_MISALIGNED`):页头标题左边距必须对齐版心左边界。
27
- 3. **manifest + 渲染对照材料**:把可复现的事实登记下来,并准备人眼对照的产物。
28
-
29
- > 容器级溢出(`CONTAINER_OVERFLOW`)、表格语义字号(`TABLE_SEMANTIC_TYPE`)、表格密度(`TABLE_DENSITY`)
30
- > **默认就开启**(属交付基线,不属于深度模式)。
31
-
32
- ---
33
-
34
- ## 三、锚点容差(`layout-constants.json` `anchorTolerance`)
35
-
36
- | 项 | 值 | 含义 |
37
- |----|----|------|
38
- | `centerPct` | 2.0 | 中心点偏差上限(占参考框局部宽高比例)——用于人眼对照时的判据 |
39
- | `keyPx` | 6 | 关键锚点(图标 / 标签 / 箭头端点 / **页头标题左边距**)偏差上限(px @96dpi ≈ 0.0625in) |
40
- | `exactPx` | 3 | 用户要求 1:1 时的上限 |
41
-
42
- **优先级与容差**(人眼对照时按此判级):
43
-
44
- | 级别 | 元素 | 容差 | 超差等级 |
45
- |------|------|------|---------|
46
- | **P0** | 标题 / 主图 / so-what / 页脚 / 关键数字 / 核心面板 | 3px(最大 6px) | Critical |
47
- | **P1** | 普通卡片 / 图标 / 标签 / 箭头 / 表格 / 分隔线 | 4px(最大 8px) | High(正式交付不得存在) |
48
- | **P2** | 装饰线 / 点阵 / 纹理 / 重复刻度 / 背景纹样 | 6px(最大 12px) | Medium |
49
-
50
- **自动化部分**:`validate_pptx.py --deep` 自动核对**页头标题锚点**(`ANCHOR_TITLE_MISALIGNED`)——
51
- 这是"相对位置还原"的确定性代理,不需要参考图即可复现;其余 P0/P1/P2 元素在渲染对照页上人眼核对。
52
-
53
- ---
54
-
55
- ## 四、深度模式校验链
56
-
57
- ```bash
58
- # 1. 生成(同默认流程)
59
- python scripts/extract_model.py "<输出目录>/YYYY-MM-DD-主题.html"
60
- NODE_PATH=<pptxgenjs 所在 node_modules> <node> scripts/build_pptx.js "报告.pptx" --model="报告.model.json"
61
-
62
- # 2. 深度校验(--deep 把连续文本流与空间锚点纳入 strict 门禁;--emit-manifest 产出登记)
63
- python scripts/validate_pptx.py "报告.pptx" --strict --deep \
64
- --model="报告.model.json" --emit-manifest="报告.manifest.json"
65
-
66
- # 3. 渲染对照(可选,缺 LibreOffice 自动跳过)
67
- python scripts/render_compare.py "报告.pptx" --html "报告.html" --out "render-compare"
68
- ```
69
-
70
- ---
71
-
72
- ## 五、manifest 字段(`报告.manifest.json`)
73
-
74
- | 字段 | 内容 | 用途 |
75
- |------|------|------|
76
- | `chartChannels` | `expectedNative` / `expectedShape` / `actualChartParts` / `nativeOk` | 原生通道图表是否真的落成 chart part(可编辑数据) |
77
- | `dataTables` | 模型侧每个图表的 `pageType` / `chart` / `channel` / `dataTable` 策略 + PPTX 侧每页表格数 | 数据可追溯(非原生图表至少 `notes`) |
78
- | `images` | `declared`(模型声明的真实图片数)/ `actual`(PPTX 实际图片数)/ `placeholders`(配图占位数)/ `layouts`(每页版式 / `fit` / 图数 / 是否占位) | 默认零图片、声明式放行;占位符走原生形状不计入图片数 |
79
- | `anchors` | 每页 `title` / `left_in` / `expected_left_in` / `delta_in` / `tolerance_in` / `status` | 空间锚点注册(passed / failed / no-title-anchor) |
80
- | `containers` | 每页 `text_shapes` + `min_pad_in` | 容器清单(配合 `CONTAINER_OVERFLOW` 判定) |
81
- | `counts` | `errors` / `warnings` | 门禁结果摘要 |
82
-
83
- > manifest 只登记**可复现的事实**,不做签名冻结——需要复核时重跑即可得到同样结果。
84
-
85
- ---
86
-
87
- ## 六、渲染对照(`scripts/render_compare.py`)
88
-
89
- **产物**(默认输出到 `<pptx 同目录>/render-compare/`):
90
-
91
- | 文件 | 内容 |
92
- |------|------|
93
- | `deck.pdf` | LibreOffice 渲染的 PPTX PDF(`soffice --headless --convert-to pdf`) |
94
- | `page-01.png …` | PDF 逐页位图(需 `pdftoppm` / `mutool` / `magick` 之一) |
95
- | `compare.html` | **并排对照页**:左栏 HTML 报告(iframe)、右栏 PPTX(PDF 内嵌或位图)、上方自动偏差登记表 |
96
- | `deviations.json` | 自动可算偏差(页数区间 / 页数差 / 图表通道) |
97
-
98
- **依赖与降级**:
99
-
100
- - 无 LibreOffice → 跳过渲染,打印安装指引(可用 `SOFFICE` 环境变量指定可执行文件),**不阻断交付**。
101
- - 无 PDF 位图工具 → 保留 PDF,对照页右栏内嵌 PDF。
102
- - **视觉语义(底色系统 / 图表形态 / 留白节奏 / 曲线几何)仍需人眼在对照页上逐页确认**——脚本负责准备材料与算可量化偏差,不假装能自动判断"好不好看"。
103
-
104
- ---
105
-
106
- ## 七、人眼对照清单(渲染对照页上逐页过)
107
-
108
- - [ ] **底色系统**:页面底色 / 面板底色 / 结论条底色 / 页脚底色是否与 HTML 一致?有没有把内容区默认变成大面积纯白卡片?
109
- - [ ] **主图形态**:图表类型是否与 HTML 一致(柱是柱、环是环、流带是流带)?有没有被矩形化?
110
- - [ ] **曲线几何**:桑基流带 / 流带图的弯曲幅度与上下边界是否贴合?双边界是否都在(不是只画中心线)?
111
- - [ ] **标签避让**:标签有没有压住图标 / 节点 / 箭头 / 曲线 / 圆环?
112
- - [ ] **锚点位置**:页头标题、主图区、so-what、页脚是否落在与 HTML 相同的位置(P0 ≤3px、P1 ≤4px)?
113
- - [ ] **容器边界**:文字有没有越过卡片 / 单元格 / 结论条(不是只看页面边)?
114
- - [ ] **密度节奏**:整篇有没有连续 3 页同密度 / 同版式?
115
- - [ ] **可编辑性**:双击原生图表能"编辑数据";非原生图表的数据表在备注或页内表格里。
116
-
117
- ---
118
-
119
- ## 八、明确不采纳(及原因)
120
-
121
- | 业界做法 | 不采纳原因 |
122
- |---------|-----------|
123
- | ImageGen 逐页蓝图(生成 16:9 位图再逐页还原) | 环境依赖重;且与"单文件零外链 + pictures=0 默认"冲突。本技能以「锁定版式 + 常量单源 + 形状还原规则」达成同等的版式可复现性。 |
124
- | PowerPoint COM 渲染回归作为**硬门禁** | 需本机 PowerPoint;降级为可选路径(本文 §六),日常由 A 通道预览 + python-pptx 双裁判覆盖。 |
125
- | SHA-256 冻结签名 + 逐页人工验收确认 | 交互轮次与耗时显著增加,与「一次问询 + 自动生成 + 校验闭环」定位冲突;改为 manifest 登记(可复现、无需冻结)。 |
126
- | 禁止 `python-pptx`(必须只用 pptxgenjs) | 本技能用 pptxgenjs 做**生成**,用 python-pptx 做**第三方裁判**(`cross_verify.py`)——职责分离比"单一引擎"更能暴露问题(实测抓出两处 OOXML 规范缺陷)。 |
127
- | 联网检索素材(web_search 脚本) | 越出"报告生成"边界;外部数据由用户提供或由 AI 在对话中检索,来源须可追溯(`[n]` + 参考资料)。 |
1
+ # 按需深度模式(高保真交付规范)
2
+
3
+ > **何时读本文**:用户提出「高保真 / 1:1 / 精确还原 / 按图还原 / 正式交付 / 不能偏移 / 像素级 / 严格对照 / 逐页验收」,
4
+ > 或页面含**复杂信息图**(桑基 / 流带 / 树图 / 马赛克 / 箱线 / 网络 / 玫瑰 / 径向条 / K 线 / 漏斗)时。
5
+ >
6
+ > **定位**:默认流程保持轻量(一次问询 + 自动生成 + 校验闭环)。深度模式是**自动升级**的加强档——
7
+ > 多跑三道检查(容器级溢出已默认开启,深度模式再加**连续文本流**与**空间锚点**)、产出 manifest、并准备渲染对照材料。
8
+ > **不引入** SHA-256 冻结签名与逐页人工验收确认(会显著拖慢生成,与本技能"一次问询 + 自动生成"的定位冲突)。
9
+
10
+ ---
11
+
12
+ ## 一、触发条件
13
+
14
+ | 触发 | 判据 |
15
+ |------|------|
16
+ | **用户明示** | 命中 `layout-constants.json` `deepMode.triggers`:高保真 / 1:1 / 一比一 / 精确还原 / 按图还原 / 正式交付 / 不能偏移 / 像素级 / 严格对照 / 逐页验收 |
17
+ | **内容含复杂信息图** | 页面用到 `deepMode.complexCharts` 中的图表类型(sankey / streamgraph / treemap / marimekko / boxplot / network / rose / radialbar / candlestick / funnel) |
18
+
19
+ 命中任一 → 交付时按 §四 跑深度模式校验链。**不命中则不要跑**(保持轻量,避免无谓开销)。
20
+
21
+ ---
22
+
23
+ ## 二、深度模式多做的三件事
24
+
25
+ 1. **连续文本流检查**(`CONTINUOUS_TEXT_FLOW`):语义连续句不得拆成多个独立文本框。
26
+ 2. **空间锚点注册**(`ANCHOR_TITLE_MISALIGNED`):页头标题左边距必须对齐版心左边界。
27
+ 3. **manifest + 渲染对照材料**:把可复现的事实登记下来,并准备人眼对照的产物。
28
+
29
+ > 容器级溢出(`CONTAINER_OVERFLOW`)、表格语义字号(`TABLE_SEMANTIC_TYPE`)、表格密度(`TABLE_DENSITY`)
30
+ > **默认就开启**(属交付基线,不属于深度模式)。
31
+
32
+ ---
33
+
34
+ ## 三、锚点容差(`layout-constants.json` `anchorTolerance`)
35
+
36
+ | 项 | 值 | 含义 |
37
+ |----|----|------|
38
+ | `centerPct` | 2.0 | 中心点偏差上限(占参考框局部宽高比例)——用于人眼对照时的判据 |
39
+ | `keyPx` | 6 | 关键锚点(图标 / 标签 / 箭头端点 / **页头标题左边距**)偏差上限(px @96dpi ≈ 0.0625in) |
40
+ | `exactPx` | 3 | 用户要求 1:1 时的上限 |
41
+
42
+ **优先级与容差**(人眼对照时按此判级):
43
+
44
+ | 级别 | 元素 | 容差 | 超差等级 |
45
+ |------|------|------|---------|
46
+ | **P0** | 标题 / 主图 / so-what / 页脚 / 关键数字 / 核心面板 | 3px(最大 6px) | Critical |
47
+ | **P1** | 普通卡片 / 图标 / 标签 / 箭头 / 表格 / 分隔线 | 4px(最大 8px) | High(正式交付不得存在) |
48
+ | **P2** | 装饰线 / 点阵 / 纹理 / 重复刻度 / 背景纹样 | 6px(最大 12px) | Medium |
49
+
50
+ **自动化部分**:`validate_pptx.py --deep` 自动核对**页头标题锚点**(`ANCHOR_TITLE_MISALIGNED`)——
51
+ 这是"相对位置还原"的确定性代理,不需要参考图即可复现;其余 P0/P1/P2 元素在渲染对照页上人眼核对。
52
+
53
+ ---
54
+
55
+ ## 四、深度模式校验链
56
+
57
+ ```bash
58
+ # 1. 生成(同默认流程)
59
+ python scripts/extract_model.py "<输出目录>/YYYY-MM-DD-主题.html"
60
+ NODE_PATH=<pptxgenjs 所在 node_modules> <node> scripts/build_pptx.js "报告.pptx" --model="报告.model.json"
61
+
62
+ # 2. 深度校验(--deep 把连续文本流与空间锚点纳入 strict 门禁;--emit-manifest 产出登记)
63
+ python scripts/validate_pptx.py "报告.pptx" --strict --deep \
64
+ --model="报告.model.json" --emit-manifest="报告.manifest.json"
65
+
66
+ # 3. 渲染对照(可选,缺 LibreOffice 自动跳过)
67
+ python scripts/render_compare.py "报告.pptx" --html "报告.html" --out "render-compare"
68
+ ```
69
+
70
+ ---
71
+
72
+ ## 五、manifest 字段(`报告.manifest.json`)
73
+
74
+ | 字段 | 内容 | 用途 |
75
+ |------|------|------|
76
+ | `chartChannels` | `expectedNative` / `expectedShape` / `actualChartParts` / `nativeOk` | 原生通道图表是否真的落成 chart part(可编辑数据) |
77
+ | `dataTables` | 模型侧每个图表的 `pageType` / `chart` / `channel` / `dataTable` 策略 + PPTX 侧每页表格数 | 数据可追溯(非原生图表至少 `notes`) |
78
+ | `images` | `declared`(模型声明的真实图片数)/ `actual`(PPTX 实际图片数)/ `placeholders`(配图占位数)/ `layouts`(每页版式 / `fit` / 图数 / 是否占位) | 默认零图片、声明式放行;占位符走原生形状不计入图片数 |
79
+ | `anchors` | 每页 `title` / `left_in` / `expected_left_in` / `delta_in` / `tolerance_in` / `status` | 空间锚点注册(passed / failed / no-title-anchor) |
80
+ | `containers` | 每页 `text_shapes` + `min_pad_in` | 容器清单(配合 `CONTAINER_OVERFLOW` 判定) |
81
+ | `counts` | `errors` / `warnings` | 门禁结果摘要 |
82
+
83
+ > manifest 只登记**可复现的事实**,不做签名冻结——需要复核时重跑即可得到同样结果。
84
+
85
+ ---
86
+
87
+ ## 六、渲染对照(`scripts/render_compare.py`)
88
+
89
+ **产物**(默认输出到 `<pptx 同目录>/render-compare/`):
90
+
91
+ | 文件 | 内容 |
92
+ |------|------|
93
+ | `deck.pdf` | LibreOffice 渲染的 PPTX PDF(`soffice --headless --convert-to pdf`) |
94
+ | `page-01.png …` | PDF 逐页位图(需 `pdftoppm` / `mutool` / `magick` 之一) |
95
+ | `compare.html` | **并排对照页**:左栏 HTML 报告(iframe)、右栏 PPTX(PDF 内嵌或位图)、上方自动偏差登记表 |
96
+ | `deviations.json` | 自动可算偏差(页数区间 / 页数差 / 图表通道) |
97
+
98
+ **依赖与降级**:
99
+
100
+ - 无 LibreOffice → 跳过渲染,打印安装指引(可用 `SOFFICE` 环境变量指定可执行文件),**不阻断交付**。
101
+ - 无 PDF 位图工具 → 保留 PDF,对照页右栏内嵌 PDF。
102
+ - **视觉语义(底色系统 / 图表形态 / 留白节奏 / 曲线几何)仍需人眼在对照页上逐页确认**——脚本负责准备材料与算可量化偏差,不假装能自动判断"好不好看"。
103
+
104
+ ---
105
+
106
+ ## 七、人眼对照清单(渲染对照页上逐页过)
107
+
108
+ - [ ] **底色系统**:页面底色 / 面板底色 / 结论条底色 / 页脚底色是否与 HTML 一致?有没有把内容区默认变成大面积纯白卡片?
109
+ - [ ] **主图形态**:图表类型是否与 HTML 一致(柱是柱、环是环、流带是流带)?有没有被矩形化?
110
+ - [ ] **曲线几何**:桑基流带 / 流带图的弯曲幅度与上下边界是否贴合?双边界是否都在(不是只画中心线)?
111
+ - [ ] **标签避让**:标签有没有压住图标 / 节点 / 箭头 / 曲线 / 圆环?
112
+ - [ ] **锚点位置**:页头标题、主图区、so-what、页脚是否落在与 HTML 相同的位置(P0 ≤3px、P1 ≤4px)?
113
+ - [ ] **容器边界**:文字有没有越过卡片 / 单元格 / 结论条(不是只看页面边)?
114
+ - [ ] **密度节奏**:整篇有没有连续 3 页同密度 / 同版式?
115
+ - [ ] **可编辑性**:双击原生图表能"编辑数据";非原生图表的数据表在备注或页内表格里。
116
+
117
+ ---
118
+
119
+ ## 八、明确不采纳(及原因)
120
+
121
+ | 业界做法 | 不采纳原因 |
122
+ |---------|-----------|
123
+ | ImageGen 逐页蓝图(生成 16:9 位图再逐页还原) | 环境依赖重;且与"单文件零外链 + pictures=0 默认"冲突。本技能以「锁定版式 + 常量单源 + 形状还原规则」达成同等的版式可复现性。 |
124
+ | PowerPoint COM 渲染回归作为**硬门禁** | 需本机 PowerPoint;降级为可选路径(本文 §六),日常由 A 通道预览 + python-pptx 双裁判覆盖。 |
125
+ | SHA-256 冻结签名 + 逐页人工验收确认 | 交互轮次与耗时显著增加,与「一次问询 + 自动生成 + 校验闭环」定位冲突;改为 manifest 登记(可复现、无需冻结)。 |
126
+ | 禁止 `python-pptx`(必须只用 pptxgenjs) | 本技能用 pptxgenjs 做**生成**,用 python-pptx 做**第三方裁判**(`cross_verify.py`)——职责分离比"单一引擎"更能暴露问题(实测抓出两处 OOXML 规范缺陷)。 |
127
+ | 联网检索素材(web_search 脚本) | 越出"报告生成"边界;外部数据由用户提供或由 AI 在对话中检索,来源须可追溯(`[n]` + 参考资料)。 |