@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,547 +1,547 @@
1
- {
2
- "$comment": "TopPPT HTML · REPORT_MODEL DSL schema 单源。双端同源:scripts/sync_runtime.py 把本文件注入 assets/pptx-export.js 的 __TOPPPT_SCHEMA__ 标记块(浏览器端 validateModel);scripts/extract_model.py 直接读本文件做本地校验。禁止在两端手写副本。字段路径约定:'a.b:c' 中 ':array' 要求非空数组,':str' 要求非空字符串,无后缀仅做真值检查;'anyof:a|b:c' 表示「任一满足即通过」(用于素材图片页:src / items / placeholder 三选一)。pageTypes[].modes = 该页型允许的模式(越界仅告警,不阻断)。commonSectionFields 为任意页型可选的通用字段(flags = 待核实标注清单,image = 素材图片/配图占位)。chartTypes = 图表类型白名单(起含原生与形状两条通道,通道归属见 scripts/layout-constants.json 的 charts.registry)。图片规格与占位约定见同文件 imageSpec。",
3
- "version": "9.1",
4
- "modes": [
5
- "presentation",
6
- "research",
7
- "architecture"
8
- ],
9
- "model": {
10
- "required": [
11
- "title",
12
- "sections:array",
13
- "closing.title",
14
- "closing.points:array"
15
- ],
16
- "optional": [
17
- "mode",
18
- "style",
19
- "theme",
20
- "subtitle",
21
- "meta",
22
- "agenda:array"
23
- ],
24
- "agendaMin": {
25
- "presentation": 3,
26
- "research": 3,
27
- "architecture": 0
28
- },
29
- "sectionsMin": 1,
30
- "sectionsRecommended": 3,
31
- "agendaComfortMax": 16
32
- },
33
- "commonSectionFields": [
34
- "eyebrow",
35
- "title",
36
- "lead",
37
- "soWhat",
38
- "footnote",
39
- "flags",
40
- "image",
41
- "exhibitNo",
42
- "layoutPreset"
43
- ],
44
- "flagsHint": "flags = 待核实/待二次修改条目字符串数组(如 '2027 增速 xx%(口径未定)');渲染为 accent 强调色标注行,提示用户核对。",
45
- "imageHint": "image = 素材图片/配图占位对象。三选一必填:src(用户图,data: 内联或相对路径,零外链铁律禁 http(s))|items(多图版式:grid/compare/wall,元素 {src?, alt?, caption?, placeholder?})|placeholder:true(无图时出配图占位,原生形状渲染、pictures 不增)。其余可选:layout(full/half/bleed/grid/compare/wall,见 layout-constants.json imageSpec.layouts)、fit(cover 默认 / contain)、caption、alt、hint、ratio。",
46
- "imageLayoutHint": "layout 与 HTML 版式对应:full=版心全宽图|half=左图右注(points 为右栏注解)|bleed=通栏出血|grid=多图网格(items 2/3/4/6 张)|compare=双图 A/B 对比(items 2 张)|wall=Logo 墙(items 3–12 张小图)。占位符标签文本由双引擎按 imageSpec 拼同一串,保证 A/B 通道逐页文本一致。",
47
- "chartTypes": [
48
- "bar",
49
- "hbar",
50
- "stack",
51
- "stackline",
52
- "line",
53
- "dualline",
54
- "area",
55
- "donut",
56
- "multidonut",
57
- "pie",
58
- "radar",
59
- "scatter",
60
- "bubble",
61
- "waterfall",
62
- "gauge",
63
- "pareto",
64
- "funnel",
65
- "gantt",
66
- "vsbar",
67
- "progress",
68
- "sparkline",
69
- "slope",
70
- "dumbbell",
71
- "lollipop",
72
- "dotplot",
73
- "bulletchart",
74
- "waffle",
75
- "radialbar",
76
- "rose",
77
- "candlestick"
78
- ],
79
- "chartTypesHint": "chart.type 可取值 = 本表(30 类:16 原生 + 14 形状还原)。其余 6 类复杂信息图(sankey/treemap/boxplot/network/marimekko/streamgraph)是**专属页型**而非 chart.type——它们要按列/段/节点等结构化载荷表达,故走 sections[].type。不变量:charts.registry.types == chartTypes ∪ 上述 6 类页型(sync_runtime.py 校验)。",
80
- "chartDataTable": {
81
- "$comment": "数据表策略:图表页的数据可追溯开关。notes = 数据写入演讲者备注(默认,零版面占用);inline = 页内附原生小字号表格;appendix = 自动生成附录数据页(原生表格);off = 不附(仅 sparkline 这类纯装饰微图允许)。pptx=shape 的非原生图表至少 notes。",
82
- "enum": [
83
- "notes",
84
- "inline",
85
- "appendix",
86
- "off"
87
- ],
88
- "default": "notes",
89
- "rule": "非原生图表(registry.pptx=shape)的 dataTable 不得为 off;缺失时按 registry 默认值补齐。"
90
- },
91
- "pageTypes": {
92
- "points": {
93
- "label": "要点列表页",
94
- "modes": [
95
- "presentation",
96
- "research",
97
- "architecture"
98
- ],
99
- "required": [
100
- "points:array"
101
- ],
102
- "optional": [
103
- "metrics:array"
104
- ]
105
- },
106
- "metrics": {
107
- "label": "指标带页(4–6 个核心数字)",
108
- "modes": [
109
- "presentation",
110
- "research"
111
- ],
112
- "required": [
113
- "metrics:array"
114
- ]
115
- },
116
- "kpi": {
117
- "label": "大数指标页(hero 大数字 + 支撑指标行)",
118
- "modes": [
119
- "presentation",
120
- "research"
121
- ],
122
- "required": [
123
- "hero:array"
124
- ],
125
- "optional": [
126
- "metrics:array"
127
- ]
128
- },
129
- "table": {
130
- "label": "对比表页",
131
- "modes": [
132
- "presentation",
133
- "research",
134
- "architecture"
135
- ],
136
- "required": [
137
- "table.head:array",
138
- "table.rows:array"
139
- ],
140
- "optional": [
141
- "table.colW:array"
142
- ]
143
- },
144
- "timeline": {
145
- "label": "时间线 / 路线页",
146
- "modes": [
147
- "presentation",
148
- "research"
149
- ],
150
- "required": [
151
- "phases:array"
152
- ]
153
- },
154
- "steps": {
155
- "label": "步骤条页(N 步横排 + 箭头,可分组)",
156
- "modes": [
157
- "presentation",
158
- "research",
159
- "architecture"
160
- ],
161
- "required": [
162
- "steps:array"
163
- ],
164
- "optional": [
165
- "groups:array",
166
- "note"
167
- ]
168
- },
169
- "bar": {
170
- "label": "图表页(chart.type 见 chartTypes;native 通道走原生数据图表,shape 通道走高保真形状还原 + 数据表)",
171
- "modes": [
172
- "presentation",
173
- "research"
174
- ],
175
- "required": [
176
- "chart.labels:array",
177
- "chart.values:array"
178
- ],
179
- "optional": [
180
- "chart.type",
181
- "chart.series:array",
182
- "chart.points:array",
183
- "chart.max",
184
- "chart.unit",
185
- "chart.colors:array",
186
- "chart.start:array",
187
- "chart.target:array",
188
- "chart.dataTable",
189
- "note"
190
- ]
191
- },
192
- "donut": {
193
- "label": "环形图页(原生 pie 楔形 + 图例)",
194
- "modes": [
195
- "presentation",
196
- "research"
197
- ],
198
- "required": [
199
- "chart.labels:array",
200
- "chart.values:array"
201
- ],
202
- "optional": [
203
- "chart.unit",
204
- "chart.centerLabel",
205
- "chart.colors:array",
206
- "chart.dataTable",
207
- "note"
208
- ]
209
- },
210
- "heatmap": {
211
- "label": "热力矩阵页(行 × 列 + 强度色阶)",
212
- "modes": [
213
- "presentation",
214
- "research"
215
- ],
216
- "required": [
217
- "rowHeads:array",
218
- "colHeads:array",
219
- "cells:array"
220
- ],
221
- "optional": [
222
- "unit",
223
- "scaleLabel:array",
224
- "note"
225
- ]
226
- },
227
- "bullet": {
228
- "label": "达成对比页(实际 vs 目标条)",
229
- "modes": [
230
- "presentation",
231
- "research"
232
- ],
233
- "required": [
234
- "items:array"
235
- ],
236
- "optional": [
237
- "unit",
238
- "max",
239
- "note"
240
- ]
241
- },
242
- "pyramid": {
243
- "label": "金字塔页(层级递进,顶层最窄)",
244
- "modes": [
245
- "presentation",
246
- "research",
247
- "architecture"
248
- ],
249
- "required": [
250
- "levels:array"
251
- ],
252
- "optional": [
253
- "note"
254
- ]
255
- },
256
- "image": {
257
- "label": "素材图片页(full/half/bleed/grid/compare/wall,效果与位置锁定;支持配图占位)",
258
- "modes": [
259
- "presentation",
260
- "research",
261
- "architecture"
262
- ],
263
- "required": [
264
- "anyof:image.src:str|image.items:array|image.placeholder"
265
- ],
266
- "optional": [
267
- "image.caption",
268
- "image.alt",
269
- "image.layout",
270
- "image.fit",
271
- "image.ratio",
272
- "image.hint",
273
- "points:array",
274
- "note"
275
- ]
276
- },
277
- "cards": {
278
- "label": "卡片网格页(cards 元素须为 {title, points:[[k,v]…]},不接受元组)",
279
- "modes": [
280
- "presentation",
281
- "research"
282
- ],
283
- "required": [
284
- "cards:array"
285
- ],
286
- "optional": [
287
- "columns"
288
- ]
289
- },
290
- "split": {
291
- "label": "双区组合页(left / right 各可为 要点|图表|表格|图片:type = points(默认)| table | image | 图表类型名;图表/表格字段直接挂在对应侧)",
292
- "modes": [
293
- "presentation",
294
- "research"
295
- ],
296
- "required": [
297
- "anyof:left.points:array|left.type:str"
298
- ],
299
- "optional": [
300
- "left.cap",
301
- "left.image",
302
- "left.labels:array",
303
- "left.values:array",
304
- "left.series:array",
305
- "left.points:array",
306
- "left.max",
307
- "left.unit",
308
- "left.colors:array",
309
- "left.dataTable",
310
- "left.head:array",
311
- "left.rows:array",
312
- "left.colW:array",
313
- "right.type",
314
- "right.cap",
315
- "right.image",
316
- "right.labels:array",
317
- "right.values:array",
318
- "right.series:array",
319
- "right.points:array",
320
- "right.max",
321
- "right.unit",
322
- "right.colors:array",
323
- "right.dataTable",
324
- "right.head:array",
325
- "right.rows:array",
326
- "right.colW:array"
327
- ]
328
- },
329
- "comparison": {
330
- "label": "对比页(左右双栏 + 可选结论条)",
331
- "modes": [
332
- "presentation",
333
- "research"
334
- ],
335
- "required": [
336
- "left.title",
337
- "left.points:array",
338
- "right.title",
339
- "right.points:array"
340
- ],
341
- "optional": [
342
- "verdict"
343
- ]
344
- },
345
- "quote": {
346
- "label": "引用 / 金句页(深色全幅)",
347
- "modes": [
348
- "presentation",
349
- "research"
350
- ],
351
- "required": [
352
- "quote",
353
- "author"
354
- ],
355
- "optional": [
356
- "context"
357
- ]
358
- },
359
- "diagram": {
360
- "label": "分层架构页(architecture 模式走全幅几何)",
361
- "modes": [
362
- "presentation",
363
- "research",
364
- "architecture"
365
- ],
366
- "required": [
367
- "layers:array"
368
- ],
369
- "optional": [
370
- "legend:array"
371
- ]
372
- },
373
- "exhibit": {
374
- "label": "Exhibit 编号图表页(research R2)",
375
- "modes": [
376
- "research"
377
- ],
378
- "required": [
379
- "chart.labels:array",
380
- "chart.values:array"
381
- ],
382
- "optional": [
383
- "exhibitNo",
384
- "chart.type",
385
- "chart.series:array",
386
- "chart.points:array",
387
- "chart.max",
388
- "chart.unit",
389
- "chart.colors:array",
390
- "chart.dataTable",
391
- "note"
392
- ]
393
- },
394
- "twocol": {
395
- "label": "双栏论证页(research R1)",
396
- "modes": [
397
- "research"
398
- ],
399
- "required": [
400
- "paragraphs:array"
401
- ]
402
- },
403
- "threecol": {
404
- "label": "三栏证据页(research R6)",
405
- "modes": [
406
- "research"
407
- ],
408
- "required": [
409
- "paragraphs:array"
410
- ]
411
- },
412
- "halftable": {
413
- "label": "半表半图页(research R7)",
414
- "modes": [
415
- "research"
416
- ],
417
- "required": [
418
- "table.head:array",
419
- "table.rows:array",
420
- "chart.labels:array",
421
- "chart.values:array"
422
- ],
423
- "optional": [
424
- "table.colW:array",
425
- "chart.type",
426
- "chart.series:array",
427
- "chart.points:array",
428
- "chart.max",
429
- "chart.unit",
430
- "chart.colors:array",
431
- "chart.dataTable",
432
- "note"
433
- ]
434
- },
435
- "matrix": {
436
- "label": "矩阵图页(research R8)",
437
- "modes": [
438
- "research"
439
- ],
440
- "required": [
441
- "rowHeads:array",
442
- "colHeads:array",
443
- "cells:array"
444
- ]
445
- },
446
- "lane": {
447
- "label": "泳道页(architecture A2)",
448
- "modes": [
449
- "architecture"
450
- ],
451
- "required": [
452
- "lanes:array"
453
- ]
454
- },
455
- "sankey": {
456
- "label": "桑基图页(节点-流带,流向与流量)",
457
- "modes": [
458
- "research",
459
- "architecture"
460
- ],
461
- "required": [
462
- "flows:array"
463
- ],
464
- "optional": [
465
- "unit",
466
- "chart.dataTable",
467
- "note"
468
- ]
469
- },
470
- "treemap": {
471
- "label": "树图页(面积编码的层级构成)",
472
- "modes": [
473
- "research",
474
- "architecture"
475
- ],
476
- "required": [
477
- "items:array"
478
- ],
479
- "optional": [
480
- "unit",
481
- "chart.dataTable",
482
- "note"
483
- ]
484
- },
485
- "boxplot": {
486
- "label": "箱线图页(分布对比:min/q1/median/q3/max)",
487
- "modes": [
488
- "research",
489
- "architecture"
490
- ],
491
- "required": [
492
- "groups:array"
493
- ],
494
- "optional": [
495
- "unit",
496
- "chart.dataTable",
497
- "note"
498
- ]
499
- },
500
- "network": {
501
- "label": "关系网络页(节点-边拓扑)",
502
- "modes": [
503
- "research",
504
- "architecture"
505
- ],
506
- "required": [
507
- "nodes:array",
508
- "edges:array"
509
- ],
510
- "optional": [
511
- "chart.dataTable",
512
- "note"
513
- ]
514
- },
515
- "marimekko": {
516
- "label": "马赛克图页(列宽 × 列高双重编码)",
517
- "modes": [
518
- "research",
519
- "architecture"
520
- ],
521
- "required": [
522
- "cols:array",
523
- "cells:array"
524
- ],
525
- "optional": [
526
- "unit",
527
- "chart.dataTable",
528
- "note"
529
- ]
530
- },
531
- "streamgraph": {
532
- "label": "流带图页(时间上的构成演变)",
533
- "modes": [
534
- "research",
535
- "architecture"
536
- ],
537
- "required": [
538
- "series:array"
539
- ],
540
- "optional": [
541
- "labels:array",
542
- "chart.dataTable",
543
- "note"
544
- ]
545
- }
546
- }
547
- }
1
+ {
2
+ "$comment": "TopPPT HTML · REPORT_MODEL DSL schema 单源。双端同源:scripts/sync_runtime.py 把本文件注入 assets/pptx-export.js 的 __TOPPPT_SCHEMA__ 标记块(浏览器端 validateModel);scripts/extract_model.py 直接读本文件做本地校验。禁止在两端手写副本。字段路径约定:'a.b:c' 中 ':array' 要求非空数组,':str' 要求非空字符串,无后缀仅做真值检查;'anyof:a|b:c' 表示「任一满足即通过」(用于素材图片页:src / items / placeholder 三选一)。pageTypes[].modes = 该页型允许的模式(越界仅告警,不阻断)。commonSectionFields 为任意页型可选的通用字段(flags = 待核实标注清单,image = 素材图片/配图占位)。chartTypes = 图表类型白名单(起含原生与形状两条通道,通道归属见 scripts/layout-constants.json 的 charts.registry)。图片规格与占位约定见同文件 imageSpec。",
3
+ "version": "9.0",
4
+ "modes": [
5
+ "presentation",
6
+ "research",
7
+ "architecture"
8
+ ],
9
+ "model": {
10
+ "required": [
11
+ "title",
12
+ "sections:array",
13
+ "closing.title",
14
+ "closing.points:array"
15
+ ],
16
+ "optional": [
17
+ "mode",
18
+ "style",
19
+ "theme",
20
+ "subtitle",
21
+ "meta",
22
+ "agenda:array"
23
+ ],
24
+ "agendaMin": {
25
+ "presentation": 3,
26
+ "research": 3,
27
+ "architecture": 0
28
+ },
29
+ "sectionsMin": 1,
30
+ "sectionsRecommended": 3,
31
+ "agendaComfortMax": 16
32
+ },
33
+ "commonSectionFields": [
34
+ "eyebrow",
35
+ "title",
36
+ "lead",
37
+ "soWhat",
38
+ "footnote",
39
+ "flags",
40
+ "image",
41
+ "exhibitNo",
42
+ "layoutPreset"
43
+ ],
44
+ "flagsHint": "flags = 待核实/待二次修改条目字符串数组(如 '2027 增速 xx%(口径未定)');渲染为 accent 强调色标注行,提示用户核对。",
45
+ "imageHint": "image = 素材图片/配图占位对象。三选一必填:src(用户图,data: 内联或相对路径,零外链铁律禁 http(s))|items(多图版式:grid/compare/wall,元素 {src?, alt?, caption?, placeholder?})|placeholder:true(无图时出配图占位,原生形状渲染、pictures 不增)。其余可选:layout(full/half/bleed/grid/compare/wall,见 layout-constants.json imageSpec.layouts)、fit(cover 默认 / contain)、caption、alt、hint、ratio。",
46
+ "imageLayoutHint": "layout 与 HTML 版式对应:full=版心全宽图|half=左图右注(points 为右栏注解)|bleed=通栏出血|grid=多图网格(items 2/3/4/6 张)|compare=双图 A/B 对比(items 2 张)|wall=Logo 墙(items 3–12 张小图)。占位符标签文本由双引擎按 imageSpec 拼同一串,保证 A/B 通道逐页文本一致。",
47
+ "chartTypes": [
48
+ "bar",
49
+ "hbar",
50
+ "stack",
51
+ "stackline",
52
+ "line",
53
+ "dualline",
54
+ "area",
55
+ "donut",
56
+ "multidonut",
57
+ "pie",
58
+ "radar",
59
+ "scatter",
60
+ "bubble",
61
+ "waterfall",
62
+ "gauge",
63
+ "pareto",
64
+ "funnel",
65
+ "gantt",
66
+ "vsbar",
67
+ "progress",
68
+ "sparkline",
69
+ "slope",
70
+ "dumbbell",
71
+ "lollipop",
72
+ "dotplot",
73
+ "bulletchart",
74
+ "waffle",
75
+ "radialbar",
76
+ "rose",
77
+ "candlestick"
78
+ ],
79
+ "chartTypesHint": "chart.type 可取值 = 本表(30 类:16 原生 + 14 形状还原)。其余 6 类复杂信息图(sankey/treemap/boxplot/network/marimekko/streamgraph)是**专属页型**而非 chart.type——它们要按列/段/节点等结构化载荷表达,故走 sections[].type。不变量:charts.registry.types == chartTypes ∪ 上述 6 类页型(sync_runtime.py 校验)。",
80
+ "chartDataTable": {
81
+ "$comment": "数据表策略:图表页的数据可追溯开关。notes = 数据写入演讲者备注(默认,零版面占用);inline = 页内附原生小字号表格;appendix = 自动生成附录数据页(原生表格);off = 不附(仅 sparkline 这类纯装饰微图允许)。pptx=shape 的非原生图表至少 notes。",
82
+ "enum": [
83
+ "notes",
84
+ "inline",
85
+ "appendix",
86
+ "off"
87
+ ],
88
+ "default": "notes",
89
+ "rule": "非原生图表(registry.pptx=shape)的 dataTable 不得为 off;缺失时按 registry 默认值补齐。"
90
+ },
91
+ "pageTypes": {
92
+ "points": {
93
+ "label": "要点列表页",
94
+ "modes": [
95
+ "presentation",
96
+ "research",
97
+ "architecture"
98
+ ],
99
+ "required": [
100
+ "points:array"
101
+ ],
102
+ "optional": [
103
+ "metrics:array"
104
+ ]
105
+ },
106
+ "metrics": {
107
+ "label": "指标带页(4–6 个核心数字)",
108
+ "modes": [
109
+ "presentation",
110
+ "research"
111
+ ],
112
+ "required": [
113
+ "metrics:array"
114
+ ]
115
+ },
116
+ "kpi": {
117
+ "label": "大数指标页(hero 大数字 + 支撑指标行)",
118
+ "modes": [
119
+ "presentation",
120
+ "research"
121
+ ],
122
+ "required": [
123
+ "hero:array"
124
+ ],
125
+ "optional": [
126
+ "metrics:array"
127
+ ]
128
+ },
129
+ "table": {
130
+ "label": "对比表页",
131
+ "modes": [
132
+ "presentation",
133
+ "research",
134
+ "architecture"
135
+ ],
136
+ "required": [
137
+ "table.head:array",
138
+ "table.rows:array"
139
+ ],
140
+ "optional": [
141
+ "table.colW:array"
142
+ ]
143
+ },
144
+ "timeline": {
145
+ "label": "时间线 / 路线页",
146
+ "modes": [
147
+ "presentation",
148
+ "research"
149
+ ],
150
+ "required": [
151
+ "phases:array"
152
+ ]
153
+ },
154
+ "steps": {
155
+ "label": "步骤条页(N 步横排 + 箭头,可分组)",
156
+ "modes": [
157
+ "presentation",
158
+ "research",
159
+ "architecture"
160
+ ],
161
+ "required": [
162
+ "steps:array"
163
+ ],
164
+ "optional": [
165
+ "groups:array",
166
+ "note"
167
+ ]
168
+ },
169
+ "bar": {
170
+ "label": "图表页(chart.type 见 chartTypes;native 通道走原生数据图表,shape 通道走高保真形状还原 + 数据表)",
171
+ "modes": [
172
+ "presentation",
173
+ "research"
174
+ ],
175
+ "required": [
176
+ "chart.labels:array",
177
+ "chart.values:array"
178
+ ],
179
+ "optional": [
180
+ "chart.type",
181
+ "chart.series:array",
182
+ "chart.points:array",
183
+ "chart.max",
184
+ "chart.unit",
185
+ "chart.colors:array",
186
+ "chart.start:array",
187
+ "chart.target:array",
188
+ "chart.dataTable",
189
+ "note"
190
+ ]
191
+ },
192
+ "donut": {
193
+ "label": "环形图页(原生 pie 楔形 + 图例)",
194
+ "modes": [
195
+ "presentation",
196
+ "research"
197
+ ],
198
+ "required": [
199
+ "chart.labels:array",
200
+ "chart.values:array"
201
+ ],
202
+ "optional": [
203
+ "chart.unit",
204
+ "chart.centerLabel",
205
+ "chart.colors:array",
206
+ "chart.dataTable",
207
+ "note"
208
+ ]
209
+ },
210
+ "heatmap": {
211
+ "label": "热力矩阵页(行 × 列 + 强度色阶)",
212
+ "modes": [
213
+ "presentation",
214
+ "research"
215
+ ],
216
+ "required": [
217
+ "rowHeads:array",
218
+ "colHeads:array",
219
+ "cells:array"
220
+ ],
221
+ "optional": [
222
+ "unit",
223
+ "scaleLabel:array",
224
+ "note"
225
+ ]
226
+ },
227
+ "bullet": {
228
+ "label": "达成对比页(实际 vs 目标条)",
229
+ "modes": [
230
+ "presentation",
231
+ "research"
232
+ ],
233
+ "required": [
234
+ "items:array"
235
+ ],
236
+ "optional": [
237
+ "unit",
238
+ "max",
239
+ "note"
240
+ ]
241
+ },
242
+ "pyramid": {
243
+ "label": "金字塔页(层级递进,顶层最窄)",
244
+ "modes": [
245
+ "presentation",
246
+ "research",
247
+ "architecture"
248
+ ],
249
+ "required": [
250
+ "levels:array"
251
+ ],
252
+ "optional": [
253
+ "note"
254
+ ]
255
+ },
256
+ "image": {
257
+ "label": "素材图片页(full/half/bleed/grid/compare/wall,效果与位置锁定;支持配图占位)",
258
+ "modes": [
259
+ "presentation",
260
+ "research",
261
+ "architecture"
262
+ ],
263
+ "required": [
264
+ "anyof:image.src:str|image.items:array|image.placeholder"
265
+ ],
266
+ "optional": [
267
+ "image.caption",
268
+ "image.alt",
269
+ "image.layout",
270
+ "image.fit",
271
+ "image.ratio",
272
+ "image.hint",
273
+ "points:array",
274
+ "note"
275
+ ]
276
+ },
277
+ "cards": {
278
+ "label": "卡片网格页(cards 元素须为 {title, points:[[k,v]…]},不接受元组)",
279
+ "modes": [
280
+ "presentation",
281
+ "research"
282
+ ],
283
+ "required": [
284
+ "cards:array"
285
+ ],
286
+ "optional": [
287
+ "columns"
288
+ ]
289
+ },
290
+ "split": {
291
+ "label": "双区组合页(left / right 各可为 要点|图表|表格|图片:type = points(默认)| table | image | 图表类型名;图表/表格字段直接挂在对应侧)",
292
+ "modes": [
293
+ "presentation",
294
+ "research"
295
+ ],
296
+ "required": [
297
+ "anyof:left.points:array|left.type:str"
298
+ ],
299
+ "optional": [
300
+ "left.cap",
301
+ "left.image",
302
+ "left.labels:array",
303
+ "left.values:array",
304
+ "left.series:array",
305
+ "left.points:array",
306
+ "left.max",
307
+ "left.unit",
308
+ "left.colors:array",
309
+ "left.dataTable",
310
+ "left.head:array",
311
+ "left.rows:array",
312
+ "left.colW:array",
313
+ "right.type",
314
+ "right.cap",
315
+ "right.image",
316
+ "right.labels:array",
317
+ "right.values:array",
318
+ "right.series:array",
319
+ "right.points:array",
320
+ "right.max",
321
+ "right.unit",
322
+ "right.colors:array",
323
+ "right.dataTable",
324
+ "right.head:array",
325
+ "right.rows:array",
326
+ "right.colW:array"
327
+ ]
328
+ },
329
+ "comparison": {
330
+ "label": "对比页(左右双栏 + 可选结论条)",
331
+ "modes": [
332
+ "presentation",
333
+ "research"
334
+ ],
335
+ "required": [
336
+ "left.title",
337
+ "left.points:array",
338
+ "right.title",
339
+ "right.points:array"
340
+ ],
341
+ "optional": [
342
+ "verdict"
343
+ ]
344
+ },
345
+ "quote": {
346
+ "label": "引用 / 金句页(深色全幅)",
347
+ "modes": [
348
+ "presentation",
349
+ "research"
350
+ ],
351
+ "required": [
352
+ "quote",
353
+ "author"
354
+ ],
355
+ "optional": [
356
+ "context"
357
+ ]
358
+ },
359
+ "diagram": {
360
+ "label": "分层架构页(architecture 模式走全幅几何)",
361
+ "modes": [
362
+ "presentation",
363
+ "research",
364
+ "architecture"
365
+ ],
366
+ "required": [
367
+ "layers:array"
368
+ ],
369
+ "optional": [
370
+ "legend:array"
371
+ ]
372
+ },
373
+ "exhibit": {
374
+ "label": "Exhibit 编号图表页(research R2)",
375
+ "modes": [
376
+ "research"
377
+ ],
378
+ "required": [
379
+ "chart.labels:array",
380
+ "chart.values:array"
381
+ ],
382
+ "optional": [
383
+ "exhibitNo",
384
+ "chart.type",
385
+ "chart.series:array",
386
+ "chart.points:array",
387
+ "chart.max",
388
+ "chart.unit",
389
+ "chart.colors:array",
390
+ "chart.dataTable",
391
+ "note"
392
+ ]
393
+ },
394
+ "twocol": {
395
+ "label": "双栏论证页(research R1)",
396
+ "modes": [
397
+ "research"
398
+ ],
399
+ "required": [
400
+ "paragraphs:array"
401
+ ]
402
+ },
403
+ "threecol": {
404
+ "label": "三栏证据页(research R6)",
405
+ "modes": [
406
+ "research"
407
+ ],
408
+ "required": [
409
+ "paragraphs:array"
410
+ ]
411
+ },
412
+ "halftable": {
413
+ "label": "半表半图页(research R7)",
414
+ "modes": [
415
+ "research"
416
+ ],
417
+ "required": [
418
+ "table.head:array",
419
+ "table.rows:array",
420
+ "chart.labels:array",
421
+ "chart.values:array"
422
+ ],
423
+ "optional": [
424
+ "table.colW:array",
425
+ "chart.type",
426
+ "chart.series:array",
427
+ "chart.points:array",
428
+ "chart.max",
429
+ "chart.unit",
430
+ "chart.colors:array",
431
+ "chart.dataTable",
432
+ "note"
433
+ ]
434
+ },
435
+ "matrix": {
436
+ "label": "矩阵图页(research R8)",
437
+ "modes": [
438
+ "research"
439
+ ],
440
+ "required": [
441
+ "rowHeads:array",
442
+ "colHeads:array",
443
+ "cells:array"
444
+ ]
445
+ },
446
+ "lane": {
447
+ "label": "泳道页(architecture A2)",
448
+ "modes": [
449
+ "architecture"
450
+ ],
451
+ "required": [
452
+ "lanes:array"
453
+ ]
454
+ },
455
+ "sankey": {
456
+ "label": "桑基图页(节点-流带,流向与流量)",
457
+ "modes": [
458
+ "research",
459
+ "architecture"
460
+ ],
461
+ "required": [
462
+ "flows:array"
463
+ ],
464
+ "optional": [
465
+ "unit",
466
+ "chart.dataTable",
467
+ "note"
468
+ ]
469
+ },
470
+ "treemap": {
471
+ "label": "树图页(面积编码的层级构成)",
472
+ "modes": [
473
+ "research",
474
+ "architecture"
475
+ ],
476
+ "required": [
477
+ "items:array"
478
+ ],
479
+ "optional": [
480
+ "unit",
481
+ "chart.dataTable",
482
+ "note"
483
+ ]
484
+ },
485
+ "boxplot": {
486
+ "label": "箱线图页(分布对比:min/q1/median/q3/max)",
487
+ "modes": [
488
+ "research",
489
+ "architecture"
490
+ ],
491
+ "required": [
492
+ "groups:array"
493
+ ],
494
+ "optional": [
495
+ "unit",
496
+ "chart.dataTable",
497
+ "note"
498
+ ]
499
+ },
500
+ "network": {
501
+ "label": "关系网络页(节点-边拓扑)",
502
+ "modes": [
503
+ "research",
504
+ "architecture"
505
+ ],
506
+ "required": [
507
+ "nodes:array",
508
+ "edges:array"
509
+ ],
510
+ "optional": [
511
+ "chart.dataTable",
512
+ "note"
513
+ ]
514
+ },
515
+ "marimekko": {
516
+ "label": "马赛克图页(列宽 × 列高双重编码)",
517
+ "modes": [
518
+ "research",
519
+ "architecture"
520
+ ],
521
+ "required": [
522
+ "cols:array",
523
+ "cells:array"
524
+ ],
525
+ "optional": [
526
+ "unit",
527
+ "chart.dataTable",
528
+ "note"
529
+ ]
530
+ },
531
+ "streamgraph": {
532
+ "label": "流带图页(时间上的构成演变)",
533
+ "modes": [
534
+ "research",
535
+ "architecture"
536
+ ],
537
+ "required": [
538
+ "series:array"
539
+ ],
540
+ "optional": [
541
+ "labels:array",
542
+ "chart.dataTable",
543
+ "note"
544
+ ]
545
+ }
546
+ }
547
+ }