@topmindspace/tms-skills 2.0.0 → 2.0.2

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 (99) hide show
  1. package/CHANGELOG.md +139 -123
  2. package/README.md +126 -103
  3. package/bin/tms-skills.js +160 -160
  4. package/package.json +48 -48
  5. package/top-ppt-html/README.md +254 -253
  6. package/top-ppt-html/SKILL.md +111 -111
  7. package/top-ppt-html/assets/examples/2026-09-09-architecture-graphite-dark.html +3873 -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 +3873 -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 +4272 -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 +4272 -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 +4272 -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 +5474 -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 +5474 -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 +5474 -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 +5474 -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 +559 -589
  27. package/top-ppt-html/assets/templates/architecture.html +3675 -3728
  28. package/top-ppt-html/assets/templates/engine.css +787 -840
  29. package/top-ppt-html/assets/templates/presentation.html +3685 -3738
  30. package/top-ppt-html/assets/templates/research.html +3964 -4017
  31. package/top-ppt-html/assets/templates/ui.js +520 -520
  32. package/top-ppt-html/assets/theme-overview-architecture.png +0 -0
  33. package/top-ppt-html/assets/theme-overview-presentation.png +0 -0
  34. package/top-ppt-html/assets/theme-overview-research.png +0 -0
  35. package/top-ppt-html/assets/theme-overview.png +0 -0
  36. package/top-ppt-html/evals/prompts.csv +15 -15
  37. package/top-ppt-html/evals/rubric.schema.json +25 -25
  38. package/top-ppt-html/evals/run_evals.py +220 -220
  39. package/top-ppt-html/evals/trace.example.json +16 -16
  40. package/top-ppt-html/package-lock.json +175 -0
  41. package/top-ppt-html/package.json +30 -35
  42. package/top-ppt-html/references/charts-basic.md +624 -624
  43. package/top-ppt-html/references/charts-discipline.md +108 -108
  44. package/top-ppt-html/references/charts-extended.md +482 -482
  45. package/top-ppt-html/references/charts.md +28 -28
  46. package/top-ppt-html/references/components-atoms.md +624 -624
  47. package/top-ppt-html/references/components.md +30 -30
  48. package/top-ppt-html/references/content-rules.md +490 -490
  49. package/top-ppt-html/references/design-system-engine.md +235 -235
  50. package/top-ppt-html/references/design-system.md +471 -478
  51. package/top-ppt-html/references/failure-modes.md +214 -214
  52. package/top-ppt-html/references/high-fidelity.md +127 -127
  53. package/top-ppt-html/references/icons.md +397 -397
  54. package/top-ppt-html/references/industry-benchmark.md +105 -105
  55. package/top-ppt-html/references/infographics-stats.md +308 -308
  56. package/top-ppt-html/references/infographics-structure.md +226 -226
  57. package/top-ppt-html/references/infographics.md +43 -43
  58. package/top-ppt-html/references/layout-grammar.md +315 -315
  59. package/top-ppt-html/references/layouts-architecture.md +108 -108
  60. package/top-ppt-html/references/layouts-combo.md +600 -600
  61. package/top-ppt-html/references/layouts-research.md +160 -160
  62. package/top-ppt-html/references/modes.md +254 -254
  63. package/top-ppt-html/references/outline-design.md +275 -275
  64. package/top-ppt-html/references/playbook.md +266 -266
  65. package/top-ppt-html/references/pptx-export.md +209 -209
  66. package/top-ppt-html/references/reform-plan.md +252 -252
  67. package/top-ppt-html/references/styles.md +336 -370
  68. package/top-ppt-html/references/tech-design.md +138 -138
  69. package/top-ppt-html/scripts/audit_css.py +109 -109
  70. package/top-ppt-html/scripts/audit_docs.py +176 -176
  71. package/top-ppt-html/scripts/audit_skill.py +220 -220
  72. package/top-ppt-html/scripts/audit_styles.py +293 -351
  73. package/top-ppt-html/scripts/build_examples.py +2276 -2276
  74. package/top-ppt-html/scripts/build_pptx.js +2380 -2380
  75. package/top-ppt-html/scripts/capture_theme_overview.js +78 -78
  76. package/top-ppt-html/scripts/checks_html.py +127 -127
  77. package/top-ppt-html/scripts/cross_verify.py +294 -294
  78. package/top-ppt-html/scripts/env_probe.py +158 -158
  79. package/top-ppt-html/scripts/extract_model.py +210 -210
  80. package/top-ppt-html/scripts/extract_snippet.py +374 -374
  81. package/top-ppt-html/scripts/gen_channel_a.js +214 -214
  82. package/top-ppt-html/scripts/layout-constants.json +3309 -3377
  83. package/top-ppt-html/scripts/layout_slots.json +830 -830
  84. package/top-ppt-html/scripts/lib_layout_regions.js +412 -412
  85. package/top-ppt-html/scripts/measure_height.py +178 -178
  86. package/top-ppt-html/scripts/model-schema.json +547 -547
  87. package/top-ppt-html/scripts/negative_tests.py +307 -307
  88. package/top-ppt-html/scripts/package_skill.py +291 -291
  89. package/top-ppt-html/scripts/prepare_images.py +341 -341
  90. package/top-ppt-html/scripts/probe_image_export.py +188 -188
  91. package/top-ppt-html/scripts/quality_gate.py +301 -301
  92. package/top-ppt-html/scripts/regression.py +307 -308
  93. package/top-ppt-html/scripts/render_compare.py +275 -275
  94. package/top-ppt-html/scripts/render_from_model.py +698 -698
  95. package/top-ppt-html/scripts/scaffold_report.py +1054 -1054
  96. package/top-ppt-html/scripts/section-file-map.json +104 -104
  97. package/top-ppt-html/scripts/sync_runtime.py +662 -662
  98. package/top-ppt-html/scripts/validate_pptx.py +1510 -1510
  99. package/top-ppt-html/scripts/validate_report.py +1456 -1456
@@ -1,252 +1,252 @@
1
- # 整体整改方案 v9(质量 · 性能 · 可靠)
2
-
3
- > **何时读**:改技能架构、门禁、图表选型、图文版式、导出链路前必读。
4
- > **定位**:v9 质量整改方案——诊断根因、收敛复杂度、重建门禁、布局语法、演讲向图文模式、模型单写。
5
- > **状态**:P0/P1 已落地并随 **v9.0** 发布;P2 见文末。
6
- > **原则**:先保决策信息,再谈美观;门禁抓真缺陷,不为过检堆规则;单源可验证,双写可收敛。
7
-
8
- ---
9
-
10
- ## 〇、问题现象 ↔ 根因对照
11
-
12
- | 现象(用户截图) | 直接原因 | 系统根因 |
13
- |-----------------|---------|---------|
14
- | 正文出现 `<a class="cite">…</a>` 字面量 | 填内容时把 HTML 源码当纯文本写入 | **双写无净化**:HTML 正文与 `REPORT_MODEL` 各自维护,模型字段未禁止标签;校验只匹配「正确 markup」,不拦「标签泄漏」 |
15
- | 除标题外大面积空白 | 页高模型强制 `min-height:100vh` + 内容不足 | **过空页仅 WARN**;`empty` 阈值 80–120 字过松;组合版式只强制 research |
16
- | 文字输出不全 / 截断 | `fitFont` 触底后仍裁切;模型-正文只对标题 | **保真阈值 50%**(`hits*2 < probes`)放行半页缺失;正文长度不校验 |
17
- | 环图标签叠字(0.5 / 0%) | 手写 SVG 标签框过窄换行;或 0.5% 与百分比串叠放 | **绕过锁定组件**:自由 SVG 无标签盒/避让规则;极小扇区仍用 donut |
18
- | 简单图占一整页「大图」 | presentation 契约写「1 张大图」;`minSize` 只有下限 | **设定错误**:无「信息复杂度 ↔ 面积」上限;`imageAdmission` 是死配置 |
19
- | 架构/流程图难看 | PPTX `diagram` 只有等高层带 + 小矩形连接件 | **结构图退化**:无真边/正交路由/菱形判断;A3 管线被压成单泳道 |
20
- | HTML 略好但仍有问题 | 同一套填内容习惯 + 同一套门禁假过 | 双通道同源缺陷,HTML 只是 CSS 稍好掩盖了结构问题 |
21
-
22
- **一句话诊断**:**基本设定过宽 + 双写失控 + 门禁假过 + 过度工程化导致填内容时绕过组件**。不是「再加几条校验」能了事,需要收敛复杂度并重建质量底线。
23
-
24
- ---
25
-
26
- ## 一、基本设定哪里不对
27
-
28
- ### 1.1 演示模式「1 张大图」是错误默认
29
-
30
- | 原设定 | 问题 | 新设定 |
31
- |--------|------|--------|
32
- | presentation 每页 1 张大图 | 简单 2 类占比也被做成整页 donut | **按信息复杂度定面积**:≤2 类且极偏 → KPI 大数;3–5 类中等 → 图 + 注解带;复杂结构才全幅 |
33
- | `charts.minSize` 只有下限 | 图可以无限大,与内容量脱钩 | 增加 **`charts.sizeByComplexity`**:数据点/类别数决定推荐区间,超出上/下限 WARN→FAIL |
34
- | 全幅图页 `fig--full` 随手可用 | 「简单图放大」合法化 | 全幅仅允许:架构总览 / ≥8 节点结构 / ≥8 系列趋势 / 用户指定素材大图 |
35
-
36
- ### 1.2 图文模式缺「演讲构图」契约
37
-
38
- 现有 `image` 页型只有六版式(full/half/bleed/grid/compare/wall),**没有演讲向的「主视觉 + 口头注解」节奏**。新增 **图文演讲版式(V1–V4)**,见 §四。
39
-
40
- ### 1.3 内容双写没有唯一事实源
41
-
42
- - HTML 正文手写 + `REPORT_MODEL` 手写 → 必然漂移(标签泄漏、空页、截断的温床)。
43
- - **v9 方向**:`REPORT_MODEL` 为内容唯一源;HTML 由「锁定组件 + 模型字段」填充,禁止把 HTML 标签写进模型字符串字段。
44
- - **过渡(本版立即执行)**:模型字段净化 + 标签泄漏硬门禁 + 一致性按段落覆盖率(≥80%)而非 50%。
45
-
46
- ---
47
-
48
- ## 二、是否过度工程化?——是,且在制造缺陷
49
-
50
- ### 2.1 复杂度清单(现状)
51
-
52
- | 层 | 规模 | 缺陷贡献 |
53
- |----|------|---------|
54
- | 页型 | 29 种 | scaffold/引擎/schema 三方易漂(已抓到 **cards 契约错**:scaffold 出 `[[k,v]]`,引擎要 `{title,points}`) |
55
- | 图表 | 36 登记 / 30 chart.type | 形状通道 20 类是缺陷农场;A/B 双引擎近 4k 行重复 |
56
- | 单源 JSON | 5 份 | `sync_runtime` 注入链一断就静默不一致 |
57
- | 门禁码 | 40+ | 关键码不在 `STRICT_FAILURE_CODES`,**假过** |
58
- | 文档 L2 | 20+ 文件 | 生成时读不完 → 绕过锁定组件自由发挥 |
59
-
60
- ### 2.2 收敛原则(v9)
61
-
62
- 1. **默认生成面收窄**:演示/研究默认 **12 页型 + 12 图表**;其余标「高级/按需」,不进默认选型表。
63
- 2. **双引擎职责砍半**:B 通道(`build_pptx.js`)是唯一交付;A 通道只做缩略预览,**不再要求逐页文本全等**(改为「标题 + 主文本 ≥80%」)。
64
- 3. **单源合并**:`layout_slots.json` 并入 `layout-constants.json`;`regionOf` 只保留 `lib_layout_regions.js` 一份。
65
- 4. **门禁只保留会改变交付决策的**:装饰性/节奏类降为报告;见 §三。
66
- 5. **文档**:L1 playbook 含「演讲图文构图 + 图表面积规则」;失败模式从 16 类压到 **10 类硬缺陷**。
67
-
68
- ### 2.3 明确不砍
69
-
70
- - 原生可编辑 PPTX(`pictures=0`)——产品差异点。
71
- - 亮暗双主题 + 9 风格——皮肤层,不制造内容缺陷。
72
- - 双单源常量(几何/字阶)——版式可复现的基础。
73
- - 负向测试(`negative_tests.py`)——防止门禁退化。
74
-
75
- ---
76
-
77
- ## 三、质量门禁重建(抓截图级真缺陷)
78
-
79
- ### 3.1 新硬门禁(strict 必拦)
80
-
81
- | 码 | 判据 | 对应现象 |
82
- |----|------|---------|
83
- | `HTML_TAG_IN_TEXT` | 可见文本剥离后仍含 `<a ` / `</a>` / `class="cite"` / `href=` / `<strong` 等 | 标签泄漏 |
84
- | `TITLE_ONLY_PAGE` | 去掉页头后正文 < 40 字且承载组件 = 0 | 空白内容页 |
85
- | `UNDERFILL_PAGE` | 承载 < 2 且非金句/章节幕/收尾 | 半空页 |
86
- | `TEXT_INCOMPLETE` | 模型字段与 PPTX/HTML 文本长度比 < 0.8,或句末无标点且长度截断 | 文字不全 |
87
- | `CHART_SKEW_INVALID` | donut/pie 最小扇区 < 5% 或类别 = 2 且 max/min > 20 | 环图叠字/不可读 |
88
- | `CHART_OVERSIZE` | 简单图(≤3 点或 ≤2 类)占内容区 > 55% | 简单大图 |
89
- | `IMAGE_SIMPLE_CONTENT` | `imageAdmission.forbidden` 语义被图片化(简单流程/柱状/表格截图) | 简单图当大图 |
90
- | `STRUCTURE_DEGRADED` | 含分支/判断语义却只有 `→` 文本箭头或空 `.arch` | 架构图难看 |
91
-
92
- ### 3.2 升级为 strict(原 WARN)
93
-
94
- - `LOW_TEXT_DENSITY` / `LOW_CONTENT_DENSITY` / `EMPTY_OR_UNMEASURABLE_SLIDE`
95
- - `UNBALANCED_EMPTY_SPACE`(**任一轴**留白 > 0.28,不再要求右+下同时)
96
- - `UNJUSTIFIED_LARGE_IMAGE`(面积 ≥ 40% 且不在 allowed)
97
- - `TEXT_OVERFLOW_ESTIMATE`
98
- - `MODEL_ROUNDTRIP_CONTENT_MISSING`(阈值 50% → **80%**)
99
-
100
- ### 3.3 降级为报告(不挡交付)
101
-
102
- - 图表多样性类型数下限、相邻同型、版式节奏连用、research 标题判断词正则
103
- - rubric 启发式 tone 维
104
- - CSS 死类、风格 WCAG 微调
105
-
106
- > **理由**:截图里没有一例是「图表不够多样」造成的;全是空白、泄漏、截断、失衡、错误选型。门禁预算应砸在后者。
107
-
108
- ### 3.4 负向测试新增(`negative_tests.py`)
109
-
110
- N15 标签泄漏 · N16 标题空页 · N17 极偏 donut · N18 简单图超大 · N19 正文截断 50% · N20 cards 元组契约
111
-
112
- ---
113
-
114
- ## 四、图文演讲模式(美观 · 合理 · 可讲)
115
-
116
- > 目标:**3 秒看清主张,30 秒讲完证据**。不是「配图好看的报告」,是「台上能指着讲的材料」。
117
-
118
- ### 4.1 构图契约(V1–V4)
119
-
120
- | 版式 | 结构 | 适用 | 面积比(视觉 : 注解) |
121
- |------|------|------|----------------------|
122
- | **V1 主视觉 + 右侧注解** | 图/照片 55–60% · 3–4 条要点 + 1 句 so-what | 产品、场景、对比图 | 6:4 |
123
- | **V2 上图下带** | 通栏图 50–55% · 下方指标带/三卡 | 总览 → 分解 | 55:45 |
124
- | **V3 大数 + 佐证图** | KPI 40% · 小图/迷你表 35% · 口径 25% | 极偏占比、单点结论 | 不用 donut |
125
- | **V4 双图对照** | A/B 各 40% · 中缝结论条 20% | 前后、方案、竞品 | 8:2 |
126
-
127
- ### 4.2 硬规则
128
-
129
- 1. **简单数据禁止全幅图**:≤2 类占比、单指标进度 → **V3**;全幅留给结构/全景/素材。
130
- 2. **图旁必须有口头注解**:3–4 条,每条 ≤2 行;禁止「一张图 + 标题」独页(金句/章节幕除外)。
131
- 3. **标签不进扇区内部**:环图/饼图数值放**图例行**或**引出线**,禁止叠在弧上(治叠字)。
132
- 4. **极偏数据换形态**:min/max ≥ 20 或 min 扇区 < 5% → KPI / 进度条 / 对比条,**禁 donut/pie**。
133
- 5. **图注与来源沉底**:`caption` 一行 + `footnote` 口径;不进主视觉。
134
- 6. **照片 vs 图表**:情绪/场景用照片(`media`);比较/趋势/构成用内联 SVG;**简单图表永不截图**。
135
- 7. **演讲节奏页**:每 4–6 页插 V3/金句/指标带,避免连续密排。
136
-
137
- ### 4.3 与三模式关系
138
-
139
- - **A presentation**:默认走 V1–V4;「1 张大图」废除。
140
- - **B research**:保留密排,但证据页主图仍受 `CHART_SKEW_INVALID` / `CHART_OVERSIZE` 约束。
141
- - **C architecture**:图为王不变,但必须真结构(边/分支/泳道),禁止文字箭头退化。
142
-
143
- ---
144
-
145
- ## 四-b、布局语法(核心:每页整齐优雅)
146
-
147
- > 详规见 **`references/layout-grammar.md`**。本节是方案层摘要。
148
-
149
- ### 4.b.1 为什么要预设网格/骨架
150
-
151
- 自由排版是「不整齐」的根因:左缘漂移、间距游离、双视觉重心、半空页。v9 规定:
152
-
153
- 1. **12 列网格强制**(PPTX `grid.x[]` ↔ HTML 栅格类同源)。
154
- 2. **预设骨架 P1–P12**:内容先选骨架再填,禁止临场发明栅格。
155
- 3. **三层槽位**:Chrome / Primary / Secondary / Annotation,面积比 22/55/20/18 量级。
156
- 4. **间距只准 token**(`--sp-*` / `--gap` / `containers.pad`)。
157
-
158
- ### 4.b.2 骨架一览(与 V1–V4 对齐)
159
-
160
- | 演讲图文 | 骨架 | 列比 | 权重 |
161
- |----------|------|------|------|
162
- | V1 主视觉+注解 | P1 | 7:5 | 60:40 |
163
- | V2 上图下带 | P2 | 12+4/4/4 | 55:45 |
164
- | V3 大数佐证 | P3 | 5:7 | 45:55 |
165
- | V4 双图对照 | P4 | 6:6 | 50:50 |
166
- | 三栏/四象限/拼贴/全幅 | P5/P6/P10/P9 | … | 见 grammar |
167
-
168
- ### 4.b.3 元素级优雅标准(摘要)
169
-
170
- | 元素 | 整齐关键 |
171
- |------|----------|
172
- | 图标 | 仅 16/20/24;光学对齐 x-height;图文距 8px |
173
- | 列表 | 项 ≤2 行;项距 12;加粗结论同一文本框 |
174
- | 卡片 | 等高 stretch;内边距一致;禁空卡 |
175
- | 指标 | 数字基线对齐;单位 45% 字号 |
176
- | 图表 | 标签不叠弧;标签盒防换行;环径 ≤ 内容高 45% |
177
- | 图文 | 比例锁;顶边对齐;图注在下 |
178
- | 结构图 | 正交边+箭头;同层等高;禁裸 `→` |
179
-
180
- ### 4.b.4 留白与填充率
181
-
182
- - presentation Body 填充 **62–78%**;research 70–85%;architecture 图 75–90%。
183
- - 合法空页仅:章节幕 / 金句 / 收尾。
184
- - 门禁:`LAYOUT_FILL_*` / `LAYOUT_MULTI_FOCUS` / `LAYOUT_ALIGN_DRIFT` / `LAYOUT_SPACING_OFF_TOKEN`。
185
-
186
- ### 4.b.5 排版总序
187
-
188
- **角色 → 骨架 P__ → 元素落位 → 间距 token → 对齐/留白 → LAYOUT_* 门禁**。禁止跳步直接堆组件。
189
-
190
- ---
191
-
192
- ## 五、可靠性与性能
193
-
194
- | 项 | 现状 | v9 |
195
- |----|------|-----|
196
- | 生成失败 | 缺字段只 console.warn | `extract_model` 缺关键字段 → 非 0;`build_pptx` 空页计入 strict |
197
- | 校验耗时 | 多脚本手跑 | **`quality_gate.py` 一键** = validate_report + validate_pptx + 新硬门禁 + deliver |
198
- | 预览 | A 通道全页 OOXML | 缩略级即可;交付只认 B |
199
- | 回归 | `regression.py` 全量 | 保留;示例矩阵覆盖新硬门禁负例 |
200
- | 文档体积 | L2 易爆 | 默认只读 SKILL + playbook;新规则进 playbook §六 |
201
-
202
- ---
203
-
204
- ## 六、分阶段落地
205
-
206
- ### P0(本迭代 · 必须)——已落地
207
-
208
- 1. 门禁:`HTML_TAG_IN_TEXT` / `TITLE_ONLY_PAGE` / 极偏 donut / 简单图超大 / 正文保真 ≥80%
209
- 2. 升级 empty / unbalanced / large-image / overflow 为 strict
210
- 3. 修复 **scaffold cards** 契约 → `{title, points}`
211
- 4. `extract_model` 模型字段 **strip HTML 标签**(cite 只允许模型侧 `[n]` 纯文本)
212
- 5. playbook + content-rules 写入 **V1–V4 图文演讲契约** 与 **图表面积/极偏规则**
213
- 6. `layout-constants` 增加 `qualityGates` / `charts.sizeByComplexity` / **`layoutSystem`(P1–P12)**
214
- 7. **`layout-grammar.md` + `LAYOUT_*` 门禁**(骨架/单重心/对齐/间距/填充率)
215
- 8. 负向测试 N15–N17
216
-
217
- ### P1(下一迭代)——大部分落地
218
-
219
- 1. **骨架 P1–P12 进 scaffold**(`data-skel` + `layoutPreset` + 打印骨架序列)
220
- 2. **默认图表收敛 8 核心**(`layoutSystem.defaultCharts`);高级图型标 advanced
221
- 3. **A/B 文本保真 80%**(`cross_verify` 覆盖率,不再要求逐字全等)
222
- 4. **泳道/层间正交箭头**(HTML `.lane__arr`/`.arch__conn` + PPTX line+triangle)
223
- 5. **布局 IR 单源**:`layoutSlots` 并入 `layout-constants`(`lib_layout_regions` 优先读 LC)
224
- 6. **模型驱动生成**:`render_from_model.py`(只填 REPORT_MODEL → 回填 HTML);图/exhibit scaffold 强制 P8 主从
225
-
226
- ### P2(后续增强)
227
-
228
- 1. 渲染对照纳入 quality_gate(有 LibreOffice 时)
229
- 2. 视觉基线(示例截图 diff)
230
- 3. ~~发布 v9.0 + CHANGELOG~~ **已完成**
231
-
232
- ---
233
-
234
- ## 七、验收标准(Definition of Done)
235
-
236
- - [x] 截图四类问题(标签泄漏 / 空白 / 截断 / 简单大图)在负向测试中 **全部被 FAIL 抓住**
237
- - [x] 示例矩阵 9 份 `validate_report` 全绿(0 FAIL)
238
- - [x] 模型单写样张:`render_from_model` 产出 0 硬缺陷
239
- - [ ] PPTX 全链:`regression.py`(含 Node 环境时)`validate_pptx --strict` 0/0
240
- - [x] 文档:playbook/layout-grammar 含新契约;failure-modes 与错误码对齐
241
-
242
- ---
243
-
244
- ## 八、决策摘要(给评审)
245
-
246
- 1. **设定要改**:废除「演示 = 1 张大图」;图表面积跟信息复杂度走;极偏数据禁环图。
247
- 2. **复杂度要砍**:默认 12 页型 + 12 图表;双引擎砍半;门禁从 40+ 装饰项收敛到 **8 个真缺陷硬门禁**。
248
- 3. **双写要收**:模型字段禁 HTML;一致性 80%;中期模型驱动生成。
249
- 4. **图文要有演讲构图**:V1–V4,主视觉 + 口头注解,简单数据用大数不用整页图。
250
- 5. **质量靠门禁不靠自觉**:截图级缺陷必须 FAIL,负向测试锁死。
251
-
252
- > 整改顺序永远是:**补证据含义 → 改承载形态 → 调容器网格 → 有限缩字号 → 拆页**。禁止用装饰、放大图、砍口径过检。
1
+ # 整体整改方案 v9(质量 · 性能 · 可靠)
2
+
3
+ > **何时读**:改技能架构、门禁、图表选型、图文版式、导出链路前必读。
4
+ > **定位**:v9 质量整改方案——诊断根因、收敛复杂度、重建门禁、布局语法、演讲向图文模式、模型单写。
5
+ > **状态**:P0/P1 已落地并随 **v9.0** 发布;P2 见文末。
6
+ > **原则**:先保决策信息,再谈美观;门禁抓真缺陷,不为过检堆规则;单源可验证,双写可收敛。
7
+
8
+ ---
9
+
10
+ ## 〇、问题现象 ↔ 根因对照
11
+
12
+ | 现象(用户截图) | 直接原因 | 系统根因 |
13
+ |-----------------|---------|---------|
14
+ | 正文出现 `<a class="cite">…</a>` 字面量 | 填内容时把 HTML 源码当纯文本写入 | **双写无净化**:HTML 正文与 `REPORT_MODEL` 各自维护,模型字段未禁止标签;校验只匹配「正确 markup」,不拦「标签泄漏」 |
15
+ | 除标题外大面积空白 | 页高模型强制 `min-height:100vh` + 内容不足 | **过空页仅 WARN**;`empty` 阈值 80–120 字过松;组合版式只强制 research |
16
+ | 文字输出不全 / 截断 | `fitFont` 触底后仍裁切;模型-正文只对标题 | **保真阈值 50%**(`hits*2 < probes`)放行半页缺失;正文长度不校验 |
17
+ | 环图标签叠字(0.5 / 0%) | 手写 SVG 标签框过窄换行;或 0.5% 与百分比串叠放 | **绕过锁定组件**:自由 SVG 无标签盒/避让规则;极小扇区仍用 donut |
18
+ | 简单图占一整页「大图」 | presentation 契约写「1 张大图」;`minSize` 只有下限 | **设定错误**:无「信息复杂度 ↔ 面积」上限;`imageAdmission` 是死配置 |
19
+ | 架构/流程图难看 | PPTX `diagram` 只有等高层带 + 小矩形连接件 | **结构图退化**:无真边/正交路由/菱形判断;A3 管线被压成单泳道 |
20
+ | HTML 略好但仍有问题 | 同一套填内容习惯 + 同一套门禁假过 | 双通道同源缺陷,HTML 只是 CSS 稍好掩盖了结构问题 |
21
+
22
+ **一句话诊断**:**基本设定过宽 + 双写失控 + 门禁假过 + 过度工程化导致填内容时绕过组件**。不是「再加几条校验」能了事,需要收敛复杂度并重建质量底线。
23
+
24
+ ---
25
+
26
+ ## 一、基本设定哪里不对
27
+
28
+ ### 1.1 演示模式「1 张大图」是错误默认
29
+
30
+ | 原设定 | 问题 | 新设定 |
31
+ |--------|------|--------|
32
+ | presentation 每页 1 张大图 | 简单 2 类占比也被做成整页 donut | **按信息复杂度定面积**:≤2 类且极偏 → KPI 大数;3–5 类中等 → 图 + 注解带;复杂结构才全幅 |
33
+ | `charts.minSize` 只有下限 | 图可以无限大,与内容量脱钩 | 增加 **`charts.sizeByComplexity`**:数据点/类别数决定推荐区间,超出上/下限 WARN→FAIL |
34
+ | 全幅图页 `fig--full` 随手可用 | 「简单图放大」合法化 | 全幅仅允许:架构总览 / ≥8 节点结构 / ≥8 系列趋势 / 用户指定素材大图 |
35
+
36
+ ### 1.2 图文模式缺「演讲构图」契约
37
+
38
+ 现有 `image` 页型只有六版式(full/half/bleed/grid/compare/wall),**没有演讲向的「主视觉 + 口头注解」节奏**。新增 **图文演讲版式(V1–V4)**,见 §四。
39
+
40
+ ### 1.3 内容双写没有唯一事实源
41
+
42
+ - HTML 正文手写 + `REPORT_MODEL` 手写 → 必然漂移(标签泄漏、空页、截断的温床)。
43
+ - **v9 方向**:`REPORT_MODEL` 为内容唯一源;HTML 由「锁定组件 + 模型字段」填充,禁止把 HTML 标签写进模型字符串字段。
44
+ - **过渡(本版立即执行)**:模型字段净化 + 标签泄漏硬门禁 + 一致性按段落覆盖率(≥80%)而非 50%。
45
+
46
+ ---
47
+
48
+ ## 二、是否过度工程化?——是,且在制造缺陷
49
+
50
+ ### 2.1 复杂度清单(现状)
51
+
52
+ | 层 | 规模 | 缺陷贡献 |
53
+ |----|------|---------|
54
+ | 页型 | 29 种 | scaffold/引擎/schema 三方易漂(已抓到 **cards 契约错**:scaffold 出 `[[k,v]]`,引擎要 `{title,points}`) |
55
+ | 图表 | 36 登记 / 30 chart.type | 形状通道 20 类是缺陷农场;A/B 双引擎近 4k 行重复 |
56
+ | 单源 JSON | 5 份 | `sync_runtime` 注入链一断就静默不一致 |
57
+ | 门禁码 | 40+ | 关键码不在 `STRICT_FAILURE_CODES`,**假过** |
58
+ | 文档 L2 | 20+ 文件 | 生成时读不完 → 绕过锁定组件自由发挥 |
59
+
60
+ ### 2.2 收敛原则(v9)
61
+
62
+ 1. **默认生成面收窄**:演示/研究默认 **12 页型 + 12 图表**;其余标「高级/按需」,不进默认选型表。
63
+ 2. **双引擎职责砍半**:B 通道(`build_pptx.js`)是唯一交付;A 通道只做缩略预览,**不再要求逐页文本全等**(改为「标题 + 主文本 ≥80%」)。
64
+ 3. **单源合并**:`layout_slots.json` 并入 `layout-constants.json`;`regionOf` 只保留 `lib_layout_regions.js` 一份。
65
+ 4. **门禁只保留会改变交付决策的**:装饰性/节奏类降为报告;见 §三。
66
+ 5. **文档**:L1 playbook 含「演讲图文构图 + 图表面积规则」;失败模式从 16 类压到 **10 类硬缺陷**。
67
+
68
+ ### 2.3 明确不砍
69
+
70
+ - 原生可编辑 PPTX(`pictures=0`)——产品差异点。
71
+ - 亮暗双主题 + 9 风格——皮肤层,不制造内容缺陷。
72
+ - 双单源常量(几何/字阶)——版式可复现的基础。
73
+ - 负向测试(`negative_tests.py`)——防止门禁退化。
74
+
75
+ ---
76
+
77
+ ## 三、质量门禁重建(抓截图级真缺陷)
78
+
79
+ ### 3.1 新硬门禁(strict 必拦)
80
+
81
+ | 码 | 判据 | 对应现象 |
82
+ |----|------|---------|
83
+ | `HTML_TAG_IN_TEXT` | 可见文本剥离后仍含 `<a ` / `</a>` / `class="cite"` / `href=` / `<strong` 等 | 标签泄漏 |
84
+ | `TITLE_ONLY_PAGE` | 去掉页头后正文 < 40 字且承载组件 = 0 | 空白内容页 |
85
+ | `UNDERFILL_PAGE` | 承载 < 2 且非金句/章节幕/收尾 | 半空页 |
86
+ | `TEXT_INCOMPLETE` | 模型字段与 PPTX/HTML 文本长度比 < 0.8,或句末无标点且长度截断 | 文字不全 |
87
+ | `CHART_SKEW_INVALID` | donut/pie 最小扇区 < 5% 或类别 = 2 且 max/min > 20 | 环图叠字/不可读 |
88
+ | `CHART_OVERSIZE` | 简单图(≤3 点或 ≤2 类)占内容区 > 55% | 简单大图 |
89
+ | `IMAGE_SIMPLE_CONTENT` | `imageAdmission.forbidden` 语义被图片化(简单流程/柱状/表格截图) | 简单图当大图 |
90
+ | `STRUCTURE_DEGRADED` | 含分支/判断语义却只有 `→` 文本箭头或空 `.arch` | 架构图难看 |
91
+
92
+ ### 3.2 升级为 strict(原 WARN)
93
+
94
+ - `LOW_TEXT_DENSITY` / `LOW_CONTENT_DENSITY` / `EMPTY_OR_UNMEASURABLE_SLIDE`
95
+ - `UNBALANCED_EMPTY_SPACE`(**任一轴**留白 > 0.28,不再要求右+下同时)
96
+ - `UNJUSTIFIED_LARGE_IMAGE`(面积 ≥ 40% 且不在 allowed)
97
+ - `TEXT_OVERFLOW_ESTIMATE`
98
+ - `MODEL_ROUNDTRIP_CONTENT_MISSING`(阈值 50% → **80%**)
99
+
100
+ ### 3.3 降级为报告(不挡交付)
101
+
102
+ - 图表多样性类型数下限、相邻同型、版式节奏连用、research 标题判断词正则
103
+ - rubric 启发式 tone 维
104
+ - CSS 死类、风格 WCAG 微调
105
+
106
+ > **理由**:截图里没有一例是「图表不够多样」造成的;全是空白、泄漏、截断、失衡、错误选型。门禁预算应砸在后者。
107
+
108
+ ### 3.4 负向测试新增(`negative_tests.py`)
109
+
110
+ N15 标签泄漏 · N16 标题空页 · N17 极偏 donut · N18 简单图超大 · N19 正文截断 50% · N20 cards 元组契约
111
+
112
+ ---
113
+
114
+ ## 四、图文演讲模式(美观 · 合理 · 可讲)
115
+
116
+ > 目标:**3 秒看清主张,30 秒讲完证据**。不是「配图好看的报告」,是「台上能指着讲的材料」。
117
+
118
+ ### 4.1 构图契约(V1–V4)
119
+
120
+ | 版式 | 结构 | 适用 | 面积比(视觉 : 注解) |
121
+ |------|------|------|----------------------|
122
+ | **V1 主视觉 + 右侧注解** | 图/照片 55–60% · 3–4 条要点 + 1 句 so-what | 产品、场景、对比图 | 6:4 |
123
+ | **V2 上图下带** | 通栏图 50–55% · 下方指标带/三卡 | 总览 → 分解 | 55:45 |
124
+ | **V3 大数 + 佐证图** | KPI 40% · 小图/迷你表 35% · 口径 25% | 极偏占比、单点结论 | 不用 donut |
125
+ | **V4 双图对照** | A/B 各 40% · 中缝结论条 20% | 前后、方案、竞品 | 8:2 |
126
+
127
+ ### 4.2 硬规则
128
+
129
+ 1. **简单数据禁止全幅图**:≤2 类占比、单指标进度 → **V3**;全幅留给结构/全景/素材。
130
+ 2. **图旁必须有口头注解**:3–4 条,每条 ≤2 行;禁止「一张图 + 标题」独页(金句/章节幕除外)。
131
+ 3. **标签不进扇区内部**:环图/饼图数值放**图例行**或**引出线**,禁止叠在弧上(治叠字)。
132
+ 4. **极偏数据换形态**:min/max ≥ 20 或 min 扇区 < 5% → KPI / 进度条 / 对比条,**禁 donut/pie**。
133
+ 5. **图注与来源沉底**:`caption` 一行 + `footnote` 口径;不进主视觉。
134
+ 6. **照片 vs 图表**:情绪/场景用照片(`media`);比较/趋势/构成用内联 SVG;**简单图表永不截图**。
135
+ 7. **演讲节奏页**:每 4–6 页插 V3/金句/指标带,避免连续密排。
136
+
137
+ ### 4.3 与三模式关系
138
+
139
+ - **A presentation**:默认走 V1–V4;「1 张大图」废除。
140
+ - **B research**:保留密排,但证据页主图仍受 `CHART_SKEW_INVALID` / `CHART_OVERSIZE` 约束。
141
+ - **C architecture**:图为王不变,但必须真结构(边/分支/泳道),禁止文字箭头退化。
142
+
143
+ ---
144
+
145
+ ## 四-b、布局语法(核心:每页整齐优雅)
146
+
147
+ > 详规见 **`references/layout-grammar.md`**。本节是方案层摘要。
148
+
149
+ ### 4.b.1 为什么要预设网格/骨架
150
+
151
+ 自由排版是「不整齐」的根因:左缘漂移、间距游离、双视觉重心、半空页。v9 规定:
152
+
153
+ 1. **12 列网格强制**(PPTX `grid.x[]` ↔ HTML 栅格类同源)。
154
+ 2. **预设骨架 P1–P12**:内容先选骨架再填,禁止临场发明栅格。
155
+ 3. **三层槽位**:Chrome / Primary / Secondary / Annotation,面积比 22/55/20/18 量级。
156
+ 4. **间距只准 token**(`--sp-*` / `--gap` / `containers.pad`)。
157
+
158
+ ### 4.b.2 骨架一览(与 V1–V4 对齐)
159
+
160
+ | 演讲图文 | 骨架 | 列比 | 权重 |
161
+ |----------|------|------|------|
162
+ | V1 主视觉+注解 | P1 | 7:5 | 60:40 |
163
+ | V2 上图下带 | P2 | 12+4/4/4 | 55:45 |
164
+ | V3 大数佐证 | P3 | 5:7 | 45:55 |
165
+ | V4 双图对照 | P4 | 6:6 | 50:50 |
166
+ | 三栏/四象限/拼贴/全幅 | P5/P6/P10/P9 | … | 见 grammar |
167
+
168
+ ### 4.b.3 元素级优雅标准(摘要)
169
+
170
+ | 元素 | 整齐关键 |
171
+ |------|----------|
172
+ | 图标 | 仅 16/20/24;光学对齐 x-height;图文距 8px |
173
+ | 列表 | 项 ≤2 行;项距 12;加粗结论同一文本框 |
174
+ | 卡片 | 等高 stretch;内边距一致;禁空卡 |
175
+ | 指标 | 数字基线对齐;单位 45% 字号 |
176
+ | 图表 | 标签不叠弧;标签盒防换行;环径 ≤ 内容高 45% |
177
+ | 图文 | 比例锁;顶边对齐;图注在下 |
178
+ | 结构图 | 正交边+箭头;同层等高;禁裸 `→` |
179
+
180
+ ### 4.b.4 留白与填充率
181
+
182
+ - presentation Body 填充 **62–78%**;research 70–85%;architecture 图 75–90%。
183
+ - 合法空页仅:章节幕 / 金句 / 收尾。
184
+ - 门禁:`LAYOUT_FILL_*` / `LAYOUT_MULTI_FOCUS` / `LAYOUT_ALIGN_DRIFT` / `LAYOUT_SPACING_OFF_TOKEN`。
185
+
186
+ ### 4.b.5 排版总序
187
+
188
+ **角色 → 骨架 P__ → 元素落位 → 间距 token → 对齐/留白 → LAYOUT_* 门禁**。禁止跳步直接堆组件。
189
+
190
+ ---
191
+
192
+ ## 五、可靠性与性能
193
+
194
+ | 项 | 现状 | v9 |
195
+ |----|------|-----|
196
+ | 生成失败 | 缺字段只 console.warn | `extract_model` 缺关键字段 → 非 0;`build_pptx` 空页计入 strict |
197
+ | 校验耗时 | 多脚本手跑 | **`quality_gate.py` 一键** = validate_report + validate_pptx + 新硬门禁 + deliver |
198
+ | 预览 | A 通道全页 OOXML | 缩略级即可;交付只认 B |
199
+ | 回归 | `regression.py` 全量 | 保留;示例矩阵覆盖新硬门禁负例 |
200
+ | 文档体积 | L2 易爆 | 默认只读 SKILL + playbook;新规则进 playbook §六 |
201
+
202
+ ---
203
+
204
+ ## 六、分阶段落地
205
+
206
+ ### P0(本迭代 · 必须)——已落地
207
+
208
+ 1. 门禁:`HTML_TAG_IN_TEXT` / `TITLE_ONLY_PAGE` / 极偏 donut / 简单图超大 / 正文保真 ≥80%
209
+ 2. 升级 empty / unbalanced / large-image / overflow 为 strict
210
+ 3. 修复 **scaffold cards** 契约 → `{title, points}`
211
+ 4. `extract_model` 模型字段 **strip HTML 标签**(cite 只允许模型侧 `[n]` 纯文本)
212
+ 5. playbook + content-rules 写入 **V1–V4 图文演讲契约** 与 **图表面积/极偏规则**
213
+ 6. `layout-constants` 增加 `qualityGates` / `charts.sizeByComplexity` / **`layoutSystem`(P1–P12)**
214
+ 7. **`layout-grammar.md` + `LAYOUT_*` 门禁**(骨架/单重心/对齐/间距/填充率)
215
+ 8. 负向测试 N15–N17
216
+
217
+ ### P1(下一迭代)——大部分落地
218
+
219
+ 1. **骨架 P1–P12 进 scaffold**(`data-skel` + `layoutPreset` + 打印骨架序列)
220
+ 2. **默认图表收敛 8 核心**(`layoutSystem.defaultCharts`);高级图型标 advanced
221
+ 3. **A/B 文本保真 80%**(`cross_verify` 覆盖率,不再要求逐字全等)
222
+ 4. **泳道/层间正交箭头**(HTML `.lane__arr`/`.arch__conn` + PPTX line+triangle)
223
+ 5. **布局 IR 单源**:`layoutSlots` 并入 `layout-constants`(`lib_layout_regions` 优先读 LC)
224
+ 6. **模型驱动生成**:`render_from_model.py`(只填 REPORT_MODEL → 回填 HTML);图/exhibit scaffold 强制 P8 主从
225
+
226
+ ### P2(后续增强)
227
+
228
+ 1. 渲染对照纳入 quality_gate(有 LibreOffice 时)
229
+ 2. 视觉基线(示例截图 diff)
230
+ 3. ~~发布 v9.0 + CHANGELOG~~ **已完成**
231
+
232
+ ---
233
+
234
+ ## 七、验收标准(Definition of Done)
235
+
236
+ - [x] 截图四类问题(标签泄漏 / 空白 / 截断 / 简单大图)在负向测试中 **全部被 FAIL 抓住**
237
+ - [x] 示例矩阵 9 份 `validate_report` 全绿(0 FAIL)
238
+ - [x] 模型单写样张:`render_from_model` 产出 0 硬缺陷
239
+ - [ ] PPTX 全链:`regression.py`(含 Node 环境时)`validate_pptx --strict` 0/0
240
+ - [x] 文档:playbook/layout-grammar 含新契约;failure-modes 与错误码对齐
241
+
242
+ ---
243
+
244
+ ## 八、决策摘要(给评审)
245
+
246
+ 1. **设定要改**:废除「演示 = 1 张大图」;图表面积跟信息复杂度走;极偏数据禁环图。
247
+ 2. **复杂度要砍**:默认 12 页型 + 12 图表;双引擎砍半;门禁从 40+ 装饰项收敛到 **8 个真缺陷硬门禁**。
248
+ 3. **双写要收**:模型字段禁 HTML;一致性 80%;中期模型驱动生成。
249
+ 4. **图文要有演讲构图**:V1–V4,主视觉 + 口头注解,简单数据用大数不用整页图。
250
+ 5. **质量靠门禁不靠自觉**:截图级缺陷必须 FAIL,负向测试锁死。
251
+
252
+ > 整改顺序永远是:**补证据含义 → 改承载形态 → 调容器网格 → 有限缩字号 → 拆页**。禁止用装饰、放大图、砍口径过检。