dsh-ppt-studio 1.1.5 → 1.2.1
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.
- package/README.md +4 -1
- package/docs/00-/350/256/276/350/256/241/346/272/220.md +4 -0
- package/docs/02-/346/212/200/346/234/257/346/212/245/345/221/212.md +114 -1
- package/docs/03-/346/233/264/346/226/260/346/227/245/345/277/227.md +159 -0
- package/docs/05-/350/277/255/344/273/243/346/265/201/347/250/213.md +23 -0
- package/docs/06-/350/257/204/345/256/241/344/270/216/346/265/213/350/257/225.md +2 -1
- package/docs/07-/345/244/215/346/235/202/345/233/276/350/203/275/345/212/233/347/253/213/351/241/271/344/270/216/351/243/216/351/231/251/347/231/273/350/256/260.md +319 -0
- package/docs/08-/351/230/266/346/256/265A/350/256/276/350/256/241/350/257/264/346/230/216-/347/273/223/346/236/204/345/205/263/347/263/273/344/270/216/345/233/276/344/270/223/345/261/236/346/240/241/351/252/214.md +306 -0
- package/docs/09-/344/273/243/347/240/201/345/234/260/345/233/276/344/270/216/346/250/241/345/235/227/350/201/214/350/264/243.md +148 -0
- package/docs/10-/345/256/277/344/270/273/350/200/246/345/220/210/347/202/271/346/270/205/345/215/225.md +49 -0
- package/docs/11-/346/234/257/350/257/255/350/241/250.md +42 -0
- package/docs/12-/345/244/215/346/235/202/345/233/276/351/200/232/350/267/257/347/232/204/351/200/211/346/213/251/344/270/216/351/252/214/346/224/266.md +65 -0
- package/docs/13-/345/217/221/347/211/210/345/207/206/345/244/207/350/256/241/345/210/222.md +79 -0
- package/docs/14-/345/217/221/345/270/203/346/270/205/345/215/225/357/274/210/350/215/211/347/250/277/357/274/211.md +57 -0
- package/docs/15-1.2.0 /345/217/221/345/270/203/346/212/245/345/221/212.md" +46 -0
- package/docs/17-/346/211/213/347/224/27313/351/241/265/350/255/246/345/221/212/351/200/220/346/235/241/345/244/204/347/275/256.md +102 -0
- package/examples/fx/fx-pro/preview/layout.json +12 -0
- package/examples/fx/fx-pro/preview/measured.json +1 -1
- package/examples/fx/fx-pro.pptx +0 -0
- package/examples/fx/seed.pptx +0 -0
- package/examples/fx/single.pptx +0 -0
- package/examples/fx/spliced.pptx +0 -0
- package/examples/smoke/imported/preview-rt/layout.json +3 -0
- package/examples/smoke/imported/source.pptx +0 -0
- package/examples/smoke/out-smoke.pptx +0 -0
- package/examples/smoke/preview/layout.json +3 -0
- package/lib/group-render.js +177 -0
- package/lib/msrender.js +27 -12
- package/lib/pptd/blocks.js +52 -0
- package/lib/pptd/export-pptx.js +266 -11
- package/lib/pptd/layout.js +54 -3
- package/lib/pptd/line-rules.js +259 -0
- package/lib/pptd/line-text-rule.js +90 -0
- package/lib/pptd/relations.js +615 -0
- package/lib/pptd/render-html.js +19 -1
- package/lib/pptd/route-geometry.js +120 -0
- package/lib/pptd/schema.js +146 -11
- package/lib/pptd/style-profile.js +133 -0
- package/lib/scaffold.js +54 -1
- package/lib/tools.js +20 -2
- package/lib/verify.js +69 -1
- package/package.json +20 -3
- package/scripts/audit-manual-facts.mjs +15 -3
- package/scripts/bench-diagram-scale.mjs +165 -0
- package/scripts/check-generators.mjs +22 -0
- package/scripts/check-lib-sync.mjs +33 -0
- package/scripts/check-line-text.mjs +30 -0
- package/scripts/check-package.mjs +60 -0
- package/scripts/check-removed-traces.mjs +37 -0
- package/scripts/check-syntax.mjs +44 -0
- package/scripts/check-unknown-keys.mjs +114 -0
- package/scripts/fixtures/handdrawn-baseline.json +177 -0
- package/scripts/fixtures/prompt-cost-baseline.json +178 -0
- package/scripts/handdrawn-option-probe.mjs +78 -0
- package/scripts/probe-prompt-cost.mjs +127 -0
- package/scripts/red-probe.mjs +75 -0
- package/scripts/render-group.mjs +72 -0
- package/scripts/smoke.mjs +191 -20
- package/scripts/test-fast.mjs +108 -0
- package/scripts/test-map.mjs +162 -0
- package/scripts/test-release.mjs +64 -0
- package/scripts/verify-diagram-relations.mjs +405 -0
- package/scripts/verify-handdrawn.mjs +115 -0
- package/scripts/verify-handwritten.mjs +203 -0
- package/scripts/verify-preset-scope.mjs +1 -1
- package/scripts/verify-primitives.mjs +714 -0
- package/scripts/verify-products.mjs +37 -0
- package/scripts/verify-shape.mjs +84 -0
- package/scripts/visual-pair-batch.mjs +77 -0
- package/skills/ppt-studio-diagram/SKILL.md +30 -0
- package/skills/ppt-studio-diagram/capability-matrix.md +22 -0
- package/skills/ppt-studio-diagram/composition.md +22 -0
- package/skills/ppt-studio-diagram/mechanisms.md +141 -0
- package/skills/ppt-studio-diagram/pitfalls.md +97 -0
- package/skills/ppt-studio-diagram/routing.md +17 -0
- package/skills/ppt-studio-diagram/text-and-spacing.md +16 -0
- package/skills/ppt-studio-diagram/verify.md +50 -0
- package/skills/ppt-studio-diagram-compare/SKILL.md +38 -0
- package/skills/ppt-studio-diagram-flow/SKILL.md +38 -0
- package/skills/ppt-studio-diagram-funnel/SKILL.md +39 -0
- package/skills/ppt-studio-diagram-layers/SKILL.md +32 -0
- package/skills/ppt-studio-diagram-loop/SKILL.md +39 -0
- package/skills/ppt-studio-diagram-matrix/SKILL.md +37 -0
- package/skills/ppt-studio-diagram-sequence/SKILL.md +31 -0
- package/skills/ppt-studio-diagram-state/SKILL.md +48 -0
- package/skills/ppt-studio-diagram-steps-ring/SKILL.md +38 -0
- package/skills/ppt-studio-diagram-swimlane/SKILL.md +37 -0
- package/skills/ppt-studio-diagram-timeline/SKILL.md +38 -0
- package/skills/ppt-studio-diagram-tree/SKILL.md +38 -0
- package/skills/ppt-studio-manual/SKILL.md +2 -2
- package/templates/academic-white/preview.png +0 -0
- package/templates/business-blue/preview.png +0 -0
- package/templates/pitch-bold/preview.png +0 -0
- package/templates/tech-dark/preview.png +0 -0
|
@@ -0,0 +1,319 @@
|
|
|
1
|
+
# 07 · 复杂图能力:立项说明与风险登记(讨论稿)
|
|
2
|
+
|
|
3
|
+
> 状态:**立项讨论稿,未开工**。决策人:用户;执行:Lead。
|
|
4
|
+
> 目标一句话:**大幅提高「用 PowerPoint 原生形状拼出复杂结构图」的能力上限;同时不得降低任何既有能力。**
|
|
5
|
+
> 本文件是用户与 Lead 于 2026-09-27 讨论的产物,后续每阶段的验收与风险核对都以本文件为准。
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 0. 背景:瓶颈在哪
|
|
10
|
+
|
|
11
|
+
用户的真实工作(例:某比赛稿第 9–16 页)需要**由几十到上百个原生形状拼出的复杂图**:单页实测 **59 / 77 / 102 / 98 / 91 / 112 / 148** 个形状节点,构成是
|
|
12
|
+
`rect`/`roundRect` 盒 + `straightConnector1`/`bentConnector3`(肘形)+ 箭头(含两端)+ `chevron`/`notchedRightArrow`/`parallelogram` 流程符号 + `custGeom`/`FREEFORM` 手绘 + 容器/嵌套 + 旋转 + 阴影。
|
|
13
|
+
|
|
14
|
+
核对现状(代码依据):形状词汇、旋转、箭头、custGeom、导入的组合拍平**都已具备**;真正缺的是
|
|
15
|
+
① **没有「结构→几何」的编译层**(模型必须手算上百个坐标,这是能力上限的真实瓶颈);
|
|
16
|
+
② 连线不能"挂到形状边"、没有正交路由;
|
|
17
|
+
③ 没有容器的首类概念(组合);
|
|
18
|
+
④ 图专属校验缺失(箭头未落边、线穿盒、元素重复/共位、文本压文本)。
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
## 1. 目标与非目标
|
|
23
|
+
|
|
24
|
+
**目标**
|
|
25
|
+
1. 有结构的图(流程、层叠架构、层级树、时间轴、对比、矩阵/象限、闭环反馈、步骤环…)**由结构描述生成几何**,而不是手算坐标。
|
|
26
|
+
2. 产物必须是**原生形状**(可编辑、可手术、可被 `ppt_patch`/`ppt_splice` 处理),不是图片。
|
|
27
|
+
3. **机械校验 + 独立视觉审阅**双把关:机械能判的写死在代码里;机械判不了的(箭头方向、依赖一致性、层级语义、遮挡、强调一致性)交给**带固定清单的独立审阅**。
|
|
28
|
+
|
|
29
|
+
**非目标**
|
|
30
|
+
- **不改变风格主导权**:风格一律来自 ① 用户指令 ② `$theme` ③ 用户给的参考稿;引擎不引入自有审美。
|
|
31
|
+
- **不为特定场景设定"好坏标准"或"领域惯例"**:PPT 适用面太广,执着于某一场景的"好"会损害泛用性(见 §9.1)。
|
|
32
|
+
- 不用位图/图片模拟结构图(图片素材仍走既有 image 通道)。
|
|
33
|
+
- 本立项内**不新增运行时依赖**。
|
|
34
|
+
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
## 2. 北极星场景与验收
|
|
38
|
+
|
|
39
|
+
**场景**:用户给一份已有复杂图的 pptx,要求"**再加一页同风格的复杂图**"。
|
|
40
|
+
链路:`ppt_import`(参考层 + 样式档案)→ 图 IR → 布局引擎 → `ppt_splice` 插回原稿(**其余页逐字节不变**)。
|
|
41
|
+
|
|
42
|
+
**验收三关(全过才算达标)**
|
|
43
|
+
1. **机器关**:门禁 0 错误 + `parity.ok`(含图的新判据)+ 官方 `check_office.py` 通过 + 图专属校验 0 错误。
|
|
44
|
+
2. **视觉关**:真渲染(PowerPoint COM)逐页出图 + **独立子代理按固定清单审阅**(结构化结论、写进交付说明)。
|
|
45
|
+
3. **对照关**:与"今天手写坐标"的同一页对照,**重叠 / 箭头脱靶 / 对齐错误**的下降必须显著。
|
|
46
|
+
|
|
47
|
+
> 说明:用户抽看渲染图是**开发期验收行为**,不写进插件工作流。插件内的"视觉审阅"仍指模型用真渲染 + 读图自查成品(既有 P1 铁律)。
|
|
48
|
+
|
|
49
|
+
---
|
|
50
|
+
|
|
51
|
+
## 3. 设计决定(D1–D9)
|
|
52
|
+
|
|
53
|
+
| # | 决定 | 理由 / 影响面 |
|
|
54
|
+
|---|---|---|
|
|
55
|
+
| **D1** | 图能力做成**「IR 编译器」**:声明式图 IR → 布局引擎算几何 → 落成**现有元素** | 新能力不碰导出/预览主链;既有 measure/verify/preview/shot/patch/export 全部复用;生成后仍可手改 |
|
|
56
|
+
| **D2** | 风格**只**来自用户指令 / `$theme` / 参考稿样式档案;引擎无自有审美。**裁决优先级:用户口头要求 > 参考稿 > 其他(主题/引擎默认)**(细则见 §9.3) | 用户优先是铁律;"加一页同类图"要看起来本来就是那份稿子的一部分 |
|
|
57
|
+
| **D3** | 声明词汇升级:`contains` / `attach` / `badge` / `group` 类型化结构声明 + **脚本推导** + **几何反验证** | 复用既有 `role` 三值、`decoration` 全豁免、声明的传递闭包、同源 id 前缀豁免、超页面不可声明;把"逐对手写"换成"结构推导" |
|
|
58
|
+
| **D4** | **组合两步都做**:① 逻辑分组(校验/审阅/命名/声明/剪枝);② **`grpSp` 真导出**(前提:用户可在 PowerPoint 里手动"取消组合",拆开后仍是可编辑原生元素) | 第一步不动导出主链、风险极低;第二步才去啃组坐标空间(`off/ext` vs `chOff/chExt`)、嵌套、组内旋转;用户裁定要真组合(见 §9.4) |
|
|
59
|
+
| **D5** | 审阅:机械检查 + **独立子代理按固定清单视觉审阅**(作者不参与自审;审阅者只看渲染图 + 需求原文) | 自审偏弱(确认意图而非发现缺陷);清单化 + 结构化输出才可核验、可入交付说明 |
|
|
60
|
+
| **D6** | **确定性**:同一 IR 两次 ⇒ 几何逐字节一致 | 我们大量断言依赖逐字节可复现;禁止不可复现随机,必要时固定种子并记录 |
|
|
61
|
+
| **D7** | **度量**:优先"布局 → 实测 → 重算"回流(HTML 在真浏览器里量),可选接 Pillow 真字体度量;配安全余量 | 现在用估算(CJK 1em/latin 0.55em),"留白怪异"是已知问题;实测回流最省 |
|
|
62
|
+
| **D8** | **回归守门**:无图任务 prompt 增幅 ≤5%;无图页产物**逐字节不变**;门禁语义变化必须在报告里显式说明 | 这是用户那条硬约束(不影响既有能力)的可测形式 |
|
|
63
|
+
| **D11** | **审阅锚点分工**:可机械反查 → 既有门禁;可证据核验的判断 → 抽样复核;纯审美 → 用户 | 审阅者只负责把"纯审美之外"筛掉,不代替用户下判断(见 §9.8) |
|
|
64
|
+
|
|
65
|
+
---
|
|
66
|
+
|
|
67
|
+
## 4. 「组合」的多层语义(用户真实工作流的工程化)
|
|
68
|
+
|
|
69
|
+
用户的真实做法(第 15 页为例):
|
|
70
|
+
1. 先把小件(背景图案 + 图片 + 文本框)合成**第一层组合**,确认**组内**无意外冲突;
|
|
71
|
+
2. 把该组合放上更大的背景、与其它文本框构成**第二层组合**,此时**把第一层当成一个整体**,只确认它与第二层其它元素无意外冲突;
|
|
72
|
+
3. 再把第二层当作整体去画整页流程图;
|
|
73
|
+
4. 审阅同样逐层做:**每层都能独立做「计算审阅(坐标/IR)+ 视觉审阅(这个组合本身画得怎么样)」**。
|
|
74
|
+
|
|
75
|
+
**工程含义(五条)**
|
|
76
|
+
| # | 含义 | 说明 |
|
|
77
|
+
|---|---|---|
|
|
78
|
+
| G1 | 组是**剪枝单元**(broad phase),但**剪枝 ≠ 豁免** | 组间包围盒相交的仍要落到元素级真实判断;只有包围盒确定不相交才排除候选。否则就是假阴性 |
|
|
79
|
+
| G2 | 组级**裁剪渲染**:孤立视图 + 上下文视图 | 审阅时两视图都要看:孤立图看清"这块本身画得如何",上下文图看清"放到页面里是否压迫/失焦" |
|
|
80
|
+
| G3 | **几何指纹 + 审阅失效** | 组的几何/内容/样式一变,之前的"已审阅"必须作废(否则"上次审过"变成假绿);指纹相同才可跳过重审 ⇒ 支撑**增量重审** |
|
|
81
|
+
| G4 | 组 = **可复用块**(局部坐标 + 参数),默认 **copy 语义** | 跨页复用需显式操作,不做隐式联动(可预测优先);这是"块库"的天然入口,也带来块库治理问题(见风险 R23) |
|
|
82
|
+
| G5 | 嵌套深度建议 **≤3 层**,超限提示拆页 | 层数过多人/模型都会对"这一层是什么"失焦;组必须**语义化命名**(id 可读) |
|
|
83
|
+
| G6 | 组合**复用既有的同源 id 前缀豁免** | 组内元素共享前缀 ⇒ 天然按结构豁免,不新造机制 |
|
|
84
|
+
|
|
85
|
+
---
|
|
86
|
+
|
|
87
|
+
## 5. 阶段与交付(A–D)
|
|
88
|
+
|
|
89
|
+
| 阶段 | 内容 | 目的 / 验收要点 |
|
|
90
|
+
|---|---|---|
|
|
91
|
+
| **A. 地基(不含新能力)** | ① 结构声明 `contains/attach/badge/group` + 推导脚本 + **几何反验证** + 报告聚合;② 元素重复/共位、文本压文本(永不声明)、线穿盒、箭头未落边检查;③ prst 白名单补齐(如 `notchedRightArrow`)、>2 点折线、head+tail 箭头、虚线样式;④ 150 元素**性能与报告体量**基线;⑤ `role` 覆盖可见性(覆盖必须带 reason、进报告与交付说明) | 钉死**确定性、性能、判据严格性、图进 parity**;单独就能提升现有上限(箭头落边、双向、正交) |
|
|
92
|
+
| **D. 北极星 + 块复用** | 参考稿样式档案 → 同构换内容;组合作为可复用块跨页/跨稿复用 | 命中用户真实需求;结构抽取结果必须**可视化回放**给人确认 |
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
---
|
|
96
|
+
|
|
97
|
+
## 6. 风险登记册
|
|
98
|
+
|
|
99
|
+
> 状态:**已缓解**(已有对策且成本可控)|**待观察**(对策明确,需实测)|**用户已表态**(用户已给出处理方式)。
|
|
100
|
+
> "早期信号"是我们要主动去测的,不是等它发生。
|
|
101
|
+
|
|
102
|
+
### A. 能力本质类
|
|
103
|
+
|
|
104
|
+
| ID | 风险 | 早期信号 | 对策 | 阶段 | 状态 |
|
|
105
|
+
|---|---|---|---|---|---|
|
|
106
|
+
| R1 | **几何正确 ≠ 逻辑正确**:箭头方向、依赖关系、层级语义机械检查验不出来,可能"更快地画出更多错的图" | 出现"几何全绿但一眼不对" | 独立子代理按清单审阅(方向/依赖/层级/遮挡/强调一致性);IR **回读成一句自然语言结构描述**供核对;业务真值仍需用户或源材料 | B/C | 待观察 |
|
|
107
|
+
| R2 | **视觉自洽 ≠ 业务正确**:模型不知道"A 是否真的先于 B" | 审阅说"没问题"但内容错了 | 明确边界:机械+审阅只保证"图自身自洽";业务正确性由用户/源材料负责,交付说明写明 | 全程 | 用户已表态(接受) |
|
|
108
|
+
| R3 | **观感退化**(几何全绿但不好看) | 用户说"不如我手工那张" | 独立子代理按清单审阅 + 与上一版权威渲染**逐页对照**;固定义夹具 | B/C | 用户已表态(用子代理审阅) |
|
|
109
|
+
| R4 | **信息密度失控**:能力变强诱导"堆满一页" | 单页元素数持续上升、可读性下降 | 审阅清单加"投影可读性/必要元素"项;skill 给密度建议;必要时提示拆页 | C | 待观察 |
|
|
110
|
+
| R5 | **自然语言→IR 的语义映射错误**(漏环节/合并概念)比坐标错更致命 | 结构描述与需求对不上 | IR 可读 → 渲染前先核对结构描述;审阅清单首项即"与需求是否一致" | B | 待观察 |
|
|
111
|
+
|
|
112
|
+
### B. 工程与架构类
|
|
113
|
+
|
|
114
|
+
| ID | 风险 | 早期信号 | 对策 | 阶段 | 状态 |
|
|
115
|
+
|---|---|---|---|---|---|
|
|
116
|
+
| R6 | **确定性被破坏**(迭代式布局/不稳定排序/并行) | 同输入两次几何不同 | 只用确定性算法 + 稳定排序 + 显式破环;必要时固定种子并记录;加"两次几何逐字节一致"断言 | A | 待观察(**必须先钉**) |
|
|
117
|
+
| R7 | **度量误差累积**(容器包裹/留白怪异) | 中英混排留白不匀 | 布局→实测→重算回流(限 1–2 轮);可选 Pillow 真字体度量;安全余量规则 | A/B | 待观察(已有既有现象) |
|
|
118
|
+
| R8 | **性能与预览体量**(150 元素:O(n²) 校验 + 路由 + HTML 体积) | 单页处理从秒级升到十几秒 | 组/空间网格做宽相剪枝;路由用通道预留;布局算一次多处复用;A 阶段先立性能基线 | A | 待观察(**必须先钉**) |
|
|
119
|
+
| R9 | **抽象泄漏**:IR 表达不了的细节 → 半自动半手工的"缝合页" | 页内间距/命名风格不一致 | 两条粒度共享同一套约定(间距基数/字号阶梯/id 命名/声明语义);混用时给"未对齐网格"提示;skill 写死边界规则 | B | 待观察 |
|
|
120
|
+
| R10 | **IR 字段演进与向后兼容**(用户会手改 deck.yaml) | 旧 IR 解析失败 | IR 字段全可选 + 版本字段 + 明确的默认值来源(`chartOptions()` 同款"默认值唯一真相") | B | 待观察 |
|
|
121
|
+
| R11 | **容器自底向上包裹不收敛** | 同输入不同轮次结果不同 | 明确"一遍自底向上、不迭代"的纪律;不收敛即降级为固定尺寸 | A/B | 待观察 |
|
|
122
|
+
| R12 | **组包围盒"不含效果"导致漏检**(旋转/发光/阴影) | 组间看似不交却压住了 | 包围盒按含效果范围算 + 安全余量;组间相交必须落到元素级 | A | 待观察 |
|
|
123
|
+
|
|
124
|
+
### C. 校验与防冲突类
|
|
125
|
+
|
|
126
|
+
| ID | 风险 | 早期信号 | 对策 | 阶段 | 状态 |
|
|
127
|
+
|---|---|---|---|---|---|
|
|
128
|
+
| R13 | **结构声明实现宽松 ⇒ 假绿**(如 `contains` 只判中心点) | 子元素"出框一半"却过检 | 判据严格(真包含 + 容差可配);违约即按普通冲突报 | A | 待观察(**必须先钉**) |
|
|
129
|
+
| R14 | **报告体量爆炸**:150 元素 + 结构关系 + 冲突 → 模型读不完就抽样 | 报告数百行、模型只看头部 | 结构化聚合(按类别计数)+ 真冲突永远单独列出 + 可下钻 | A | 待观察 |
|
|
130
|
+
| R15 | **门禁语义变化让老用户困惑**(昨天报错今天不报) | 用户问"门禁是不是变松了" | 报告显式写"因结构关系豁免 N 处"并列出关系;文档给迁移说明 | A | 待观察 |
|
|
131
|
+
| R16 | **图成为 parity / loss-audit / 内容自证的盲区**(我们在图表上栽过一次) | 图节点/边数不进 parity | 图也进 parity:节点数、边数、结构关系数、组数;盲区检查写进纪律 | A/B | 待观察(**必须先钉**) |
|
|
132
|
+
| R17 | **role 降级自利**:`content→background` 把必改项降级为可声明项 | 页里大量角色覆盖且无理由 | 覆盖必须带 reason、进报告与交付说明、单独计数与阈值提示 | A | 待观察 |
|
|
133
|
+
| R18 | **审阅橡皮图章**(模型一律"通过") | 审阅结论全是"无问题" | 固定清单逐项作答 + 结构化输出 + 抽样复核 + 结论进交付说明;"审阅通过"不替代门禁 | B/C | 待观察 |
|
|
134
|
+
| R19 | **数据一致性盲区**:图里的数字未纳入 crosscheck 材料包 | 图与正文数字不一致未被发现 | 图节点/标签文字纳入内容审阅材料包与对账 | C | 待观察 |
|
|
135
|
+
|
|
136
|
+
### D. 组合特性专项
|
|
137
|
+
|
|
138
|
+
| ID | 风险 | 早期信号 | 对策 | 阶段 | 状态 |
|
|
139
|
+
|---|---|---|---|---|---|
|
|
140
|
+
| R20 | **"已审阅"状态过期**:组移动/缩放后旧结论仍被信任 | 改动后不重审就放行 | **几何指纹**绑定结论;指纹变即失效,支撑增量重审 | B | 待观察 |
|
|
141
|
+
| R21 | **布局重排破坏用户想要的观感**:局部改动导致整页重排 | 用户说"我只是想挪一点,别动别的" | 布局锚定/局部重排;改动前给"会变什么"的 diff 预览 | C/D | 待观察 |
|
|
142
|
+
| R22 | **缩放语义不清**:组等比缩放时字号是否跟着缩(会撞最小字号门禁) | 缩放到下限后文字溢出或超小 | 明确"缩放 = 重排优先,等比到字号下限即停" | B | 待观察 |
|
|
143
|
+
| R23 | **块库膨胀与实例语义**:复用块被改动后其它副本是否联动 | 用户困惑"改了怎么别处也变了/没变" | 默认 copy(可预测)+ 显式"同步"操作;块必须有稳定 id 与来源标注 | D | 待观察 |
|
|
144
|
+
| R24 | **嵌套过深导致审阅失焦** | 组名无意义、审阅说不清"这层是什么" | 语义化命名 + 深度上限(≤3)+ 超限提示拆页 | B | 待观察 |
|
|
145
|
+
|
|
146
|
+
### E. 与既有能力 / 产品
|
|
147
|
+
|
|
148
|
+
| ID | 风险 | 早期信号 | 对策 | 阶段 | 状态 |
|
|
149
|
+
|---|---|---|---|---|---|
|
|
150
|
+
| R25 | **常驻 token 成本上升**(工具 schema 常驻,新工具很大) | 无图任务的 prompt/turn 上升 | IR 详解放 skill/`ppt_schema`;工具描述只留"何时用+最小示例";硬指标 ≤5% | A/B | 待观察(**必须先钉**) |
|
|
151
|
+
| R26 | **无图页产物漂移**(改动波及既有链路) | 老 deck 产物字节变化 | 无图页**逐字节不变**断言;提示词只增行;既有断言全绿 | 全程 | 待观察(守门项) |
|
|
152
|
+
| R27 | **patch 误伤**:图里短文本多,按文本替换易误命中 | 改了 A 节点却动了 B 节点 | patch 增加"所属节点/位置"限定;图页可退回整页替换 | C | 待观察 |
|
|
153
|
+
| R28 | **参考稿风格自相矛盾**(多人/多时期混用风格) | 抽出的样式档案与相邻页不符 | 导入阶段做风格主从判定(取多数/最新),档案标注来源页 | D | 待观察 |
|
|
154
|
+
| R29 | **结构抽取抽错**(组拍平/旋转/custGeom 语义丢失) | 用户以为在改原图,骨架被改 | 抽取结果**可视化回放**确认;交付说明标明"结构来自第 X 页,已/未复核" | D | 待观察 |
|
|
155
|
+
| R30 | **期望落差**:能力变强诱导"一句话出专业图册" | 用户对仍需交互感到失望 | 文档与交付说明写清能力边界(支持哪些族、需要什么输入、哪些必须人定) | 全程 | 待观察 |
|
|
156
|
+
|
|
157
|
+
### F. 流程与维护
|
|
158
|
+
|
|
159
|
+
| ID | 风险 | 早期信号 | 对策 | 阶段 | 状态 |
|
|
160
|
+
|---|---|---|---|---|---|
|
|
161
|
+
| R31 | **人工视觉验收成为瓶颈** | 每次改动都要用户看图 | 默认派**独立子代理**按清单审阅;用户只在关键节点抽看;固定夹具 + 与上一版逐页对照 | B/C | 用户已表态 |
|
|
162
|
+
| R33 | **测试爆炸**(族 × 平台 × 有无 Office × 语种) | 断言矩阵失控、跑不动 | 契约夹具 + 快照 + 既有测试分档;真渲染只跑代表页 | C | 待观察 |
|
|
163
|
+
| R34 | **代码体量与维护面**(布局/路由/族库/校验/预览/文档) | 单点改动牵连广泛 | 框架与族分离;族之间不共享隐式状态;文档同步纪律 | 全程 | 待观察 |
|
|
164
|
+
| R35 | **发布回滚成本**(已发新版且用户已升级) | 用户反馈"某任务变差" | 每阶段独立可交付、可回滚;守门指标不达标即回滚该阶段 | 全程 | 待观察 |
|
|
165
|
+
| R36 | **基准夹具同质化**(只用一份稿子的结构) | 优化偏向某一类结构 | 夹具多样化(多行业/多族/多密度)+ 保留手写基线对照 | C | 待观察 |
|
|
166
|
+
|
|
167
|
+
---
|
|
168
|
+
|
|
169
|
+
## 7. 止损判据(写进立项,阶段 B 结束时核对)
|
|
170
|
+
|
|
171
|
+
1. 与手写基线的对照**改善显著**(重叠/箭头脱靶/对齐错误下降),且用户看图认可"明显更专业";
|
|
172
|
+
2. 用户的验收负担**没有超过每阶段 1 次**(其余由独立子代理完成);
|
|
173
|
+
3. 无图任务的 prompt 增幅 **≤5%**、无图页产物**逐字节不变**、既有断言全绿。
|
|
174
|
+
|
|
175
|
+
任一不满足 ⇒ 停在 B(此时已拿到"能画对结构图"的能力,不算白做)。
|
|
176
|
+
|
|
177
|
+
**必须先钉死、否则不开工后段的四条**:R6 确定性、R8 性能基线、R13/R16 判据严格性与图进 parity、R25 常驻 token 阈值。
|
|
178
|
+
|
|
179
|
+
---
|
|
180
|
+
|
|
181
|
+
## 8. 开放问题
|
|
182
|
+
|
|
183
|
+
2. **组合的第二步(真 `grpSp` 导出)**是否要做:收益是用户可整块拖动/缩放,代价是组坐标空间与嵌套的正确性风险。
|
|
184
|
+
3. **块库**(D 阶段的组复用)是否纳入本立项,还是留作独立特性。
|
|
185
|
+
4. **Pillow 真字体度量**是否引入(捆绑 Python 已带 Pillow,但会增加设计期的一次外部调用)。
|
|
186
|
+
5. **`role` 覆盖**是否要设阈值告警(例如一页超过 N 处覆盖就提示复核)。
|
|
187
|
+
|
|
188
|
+
---
|
|
189
|
+
|
|
190
|
+
## 9. 追加讨论结论(2026-09-27 第二轮)
|
|
191
|
+
|
|
192
|
+
> 本节是第二轮讨论的结论,**对 §1 / §3 / §6 / §7 / §8 作更新,冲突处以本节为准**。
|
|
193
|
+
|
|
194
|
+
### 9.1 泛用性优先(更新 §1)
|
|
195
|
+
|
|
196
|
+
用户裁定:**不为特定场景/行业设定"好坏标准"或"领域惯例"**——PPT 适用面太广,执着于某个场景的"好"反而会损害泛用性。因此:
|
|
197
|
+
- 引擎只保证"**结构正确 + 节奏专业 + 不劣化既有能力**",**不内置行业图式偏好**;
|
|
198
|
+
- 密度/拆页这类"惯例"**不作为立项强约束**,交由用户指令与参考稿决定;
|
|
199
|
+
- 验收只用"结构正确性 + 与手写基线对照 + 用户抽看",**不引入场景特定的评分标准**。
|
|
200
|
+
|
|
201
|
+
### 9.2 范围态度(新增 D10)
|
|
202
|
+
|
|
203
|
+
允许某族停在 80%,但必须:① 标 `maturity: stable|beta`;② **优雅降级**(退回简单布局或手写路径,不得产出半成品图)。
|
|
204
|
+
|
|
205
|
+
### 9.3 风格与冲突裁决(更新 D2)
|
|
206
|
+
|
|
207
|
+
**裁决优先级:用户口头要求 > 参考稿 > 其他(主题/引擎默认)。**
|
|
208
|
+
细则(例如参考稿内部风格自相矛盾时取"最新页"还是"多数派")**留待后续版本讨论**,本次只把它写成规则骨架。
|
|
209
|
+
|
|
210
|
+
### 9.4 组合:真 `grpSp` 导出纳入范围(更新 D4)
|
|
211
|
+
|
|
212
|
+
两步都做:① 逻辑分组(校验/审阅/命名/声明/剪枝);② **`grpSp` 真导出**。
|
|
213
|
+
**硬前提**:用户能在 PowerPoint 里**手动"取消组合"**,拆开后仍是可编辑的原生元素(不产生不可逆锁定)。
|
|
214
|
+
新增要求:
|
|
215
|
+
1. 组坐标空间(`off/ext` vs `chOff/chExt`)、嵌套组、组内旋转/翻转必须过**真渲染回归**;
|
|
216
|
+
2. **取消组合后的语义**:元素 id 与结构声明仍有效;原先"组原子化"带来的剪枝不复存在,需退回元素级检查(报告要说明);
|
|
217
|
+
3. 与 G4 一致:块复用默认 **copy 语义**,不做隐式联动。
|
|
218
|
+
|
|
219
|
+
### 9.5 跨组"故意相交"的声明(补 §4)
|
|
220
|
+
|
|
221
|
+
```yaml
|
|
222
|
+
groups:
|
|
223
|
+
- {id: A, members: [e1, e2]}
|
|
224
|
+
- {id: B, members: [e3, e4]}
|
|
225
|
+
expectedIntersections:
|
|
226
|
+
- {from: A.e1, to: B.e4, reason: "A 的徽章压在 B 的卡片上(设计意图)"}
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
语义(注意:这是"剪枝 ≠ 豁免"那句话的另一半):
|
|
230
|
+
1. **设计期校验**:两端存在且**当前确实相交**;若实际不相交 ⇒ 只给 ℹ("声明已失效,建议移除"),**不报错**(意图是"允许相交"而非"必须相交");
|
|
231
|
+
2. **运行期**:先用组间包围盒**剪枝**候选对,再逐对判定——在声明集合里 ⇒ 放行;否则 ⇒ 报错;`content × content` **永不放行**;
|
|
232
|
+
3. **失效绑定**:任一组几何指纹变化 ⇒ 跨界声明需重验(与 G3 一致);
|
|
233
|
+
4. **断言**:既有的"声明传递闭包"**不得沿跨组声明传播**——声明 (A.e1, B.e4) 不能连带放行 (A.e2, B.e4);
|
|
234
|
+
5. 连线端点的相交优先用 `attach`(语义化、可几何反验证);裸 pair 只留给"说不清接口、就是故意压叠"的场景(徽章/衬底)。
|
|
235
|
+
|
|
236
|
+
### 9.6 组合的六种操作 + "醒着做"(补 §4)
|
|
237
|
+
|
|
238
|
+
操作:**拆散 / 部分拆出 / 重组 / 合并 / 整组移动·缩放 / 替换成员**。
|
|
239
|
+
"助手必须清醒"落成**机械形式**:
|
|
240
|
+
1. 组合操作是**带必填 `action` + `reason`** 的工具调用;
|
|
241
|
+
2. 操作后**报告事实**:成员去向、哪些声明仍有效、**哪个不变量失效**、已重跑哪些检查;
|
|
242
|
+
3. **拆开 → 改动 → 重组**后给"变了什么"的 diff,**不允许静默重排**。
|
|
243
|
+
|
|
244
|
+
### 9.7 "缝合页"的症状与防线(补 §4 与 R9)
|
|
245
|
+
|
|
246
|
+
| 症状 | 表现 |
|
|
247
|
+
|---|---|
|
|
248
|
+
| 间距节奏不齐 | IR 块内 16px、手写部分 13/17px ⇒ 一眼"松紧不一" |
|
|
249
|
+
| 差几像素对不齐 | IR 块左边 x=60、手写元素 x=63 ⇒ 说不出哪里怪但就是不对 |
|
|
250
|
+
| 圆角/描边两套语言 | IR 统一圆角 6px/描边 1pt,手写 4px/0.75pt ⇒ 像两种零件 |
|
|
251
|
+
| 字号阶梯塌陷 | IR 走主题 20/16/12,手写 18/15 ⇒ 层级看着"平" |
|
|
252
|
+
| 命名与结构对不上 | IR 块有语义 id,手写是 `t1/t2` ⇒ 审阅/手术时说不清归属 |
|
|
253
|
+
| 交互行为不一致 | IR 组可整块拖动,手写部分要一个个挪 |
|
|
254
|
+
|
|
255
|
+
防线:① 两条粒度**读同一套 token**(间距基数/字号阶梯/圆角/线宽来自 `$theme`/参考档案);② 混用时检查手写元素**是否落在 IR 网格上**(提示级,不报错——手写是合法逃生口);③ 视觉审阅清单加一项"**这页是否像一套**"。
|
|
256
|
+
|
|
257
|
+
### 9.8 审阅锚点分工(新增 D11)
|
|
258
|
+
|
|
259
|
+
| 清单项类型 | 锚是谁 | 做法 |
|
|
260
|
+
|---|---|---|
|
|
261
|
+
| **可机械反查**(箭头落边/意外重叠/元素重复/文本压文本) | 既有门禁 | 审阅者说法与几何不符即可**直接证伪** |
|
|
262
|
+
| **可证据核验的判断**(方向与正文相反/与旁边文字不是一件事/投影看不清) | 抽样复核(开发期 Lead,发布后用户) | 审阅者必须**引用证据**(页/元素/现象),抽样成本极低 |
|
|
263
|
+
| **纯审美**(整体专业感/视觉动线) | **用户** | 关键节点抽看;发布后由用户反馈 |
|
|
264
|
+
|
|
265
|
+
配套:独立子代理审阅(**作者不参与自审**)、只看"渲染图 + 需求原文 + 结构声明与理由"、按固定清单逐项作答、结论进交付说明;**审阅者的"没问题"会被抽样复核,并记录其命中率**——命中率差就换审阅者或把该项升级为机械判据。
|
|
266
|
+
|
|
267
|
+
### 9.9 风险登记册新增(R37–R52)
|
|
268
|
+
|
|
269
|
+
**G. 组合 / 块专项(追加)**
|
|
270
|
+
|
|
271
|
+
| ID | 风险 | 早期信号 | 对策 | 阶段 | 状态 |
|
|
272
|
+
|---|---|---|---|---|---|
|
|
273
|
+
| R37 | **跨组节奏无守门人**:每组内部都好,合起来松散 | 页面像"散落的块" | 跨组检查:组边缘对齐、组间距为网格基数倍数、组视觉权重分层 + 页面级审阅视图 | B | 待观察 |
|
|
274
|
+
| R38 | **同类块跨页/跨组不一致**(同一"模块盒"尺寸样式各异) | 整册像拼凑 | 按"角色"跨页比对尺寸/样式;沿用"主题一致性优先"纪律 | C | 待观察 |
|
|
275
|
+
| R39 | **块参数化语义不清**:改实例还是改定义? | 用户问"改了怎么别处也变了" | 默认改实例;"改定义并同步"是显式操作;规则写进 skill | D | 待观察 |
|
|
276
|
+
| R40 | **组 id 成为公开接口**(改名破坏历史引用) | 复用块改名后引用失效 | 语义化命名规范 + 稳定 id 策略(对齐模板 id 处理) | D | 待观察 |
|
|
277
|
+
| R41 | **IR 与产物脱钩**:手改过的页被"重生成"覆盖 | 用户手改丢失 | 页面记录 **IR 指纹**;不一致时明确提示"重生成会覆盖手改",并提供"只更新某组" | B | 待观察(**高概率会咬人**) |
|
|
278
|
+
| R42 | **组粒度手术语义缺失**:`ppt_patch` 表达不了"整组替换" | 用户意图无法表达 | 组级替换走 `splice`/IR 重生成;三条路的边界写进文档 | C | 待观察 |
|
|
279
|
+
|
|
280
|
+
**H. 审阅专项(追加)**
|
|
281
|
+
|
|
282
|
+
| ID | 风险 | 早期信号 | 对策 | 阶段 | 状态 |
|
|
283
|
+
|---|---|---|---|---|---|
|
|
284
|
+
| R43 | **审阅者不知道设计意图 ⇒ 大量误报** | 审阅把故意重叠判成错 | 审阅输入带**结构声明与理由**;让它核对"声明与实际是否一致"而不是猜 | B | 待观察 |
|
|
285
|
+
| R44 | **审阅看图分辨率不足**:整页缩略图里小字细线看不清 | 漏检细微错位 | 走**组级裁剪渲染**(孤立视图 + 1:1 局部视图),不只看整页缩略图(G2) | B | 待观察 |
|
|
286
|
+
| R45 | **审阅成本超过生成成本** | 迭代越做越慢 | 几何指纹驱动的**增量重审**(只审变化组 + 相邻组) | B | 待观察 |
|
|
287
|
+
| R46 | **审阅者命中率未跟踪**(橡皮图章无人发现) | 审阅结论长期全是"无问题" | 抽样复核 + 记录命中率;差则换审阅者/升级为机械判据(§9.8) | B/C | 待观察 |
|
|
288
|
+
|
|
289
|
+
**I. 内容表达 / 素材 / 可读性(追加)**
|
|
290
|
+
|
|
291
|
+
| ID | 风险 | 早期信号 | 对策 | 阶段 | 状态 |
|
|
292
|
+
|---|---|---|---|---|---|
|
|
293
|
+
| R47 | **富文本/行内样式缺失**:公式行、上标(①②)、行内变色、加粗结论只能拆成多个文本框 | 专业表达被迫拆碎、对齐变难 | 评估 text 的**行内 run**(粗体/颜色/上下标);先支持最小集 | B | 待观察 |
|
|
294
|
+
| R48 | **图标与特殊符号边界**:流程图常带彩色图标 | 用户要求"带图标的流程" | 明确走图片通道;**不内置图标库**(避免审美与版权问题) | C | 待观察 |
|
|
295
|
+
| R49 | **交付说明未披露能力边界**:哪些 IR 生成/哪些手写/哪些未审阅 | 用户无法判断可信度 | 交付说明固定披露这三项(延续"不静默"原则) | 全程 | 待观察 |
|
|
296
|
+
| R50 | **真实参考稿不能进仓库**(含公司信息与图片) | 隐私/版权问题 | 仓库只放**合成/脱敏夹具**;真稿仅本地基准;验收记录只存渲染图与结论 | C | 待观察 |
|
|
297
|
+
| R51 | **样式档案置信度不足**(样本少/风格矛盾) | 推断出的半径/间距明显不对 | 档案带**置信度与回退**:置信度低就如实说"样式来自主题而非参考稿" | B | 待观察 |
|
|
298
|
+
| R52 | **投影/黑白/色盲可读性** | 现场看不清细线浅色小字 | 审阅清单固定项 + 部分机械判据(对比度已有基础) | B | 待观察 |
|
|
299
|
+
|
|
300
|
+
### 9.10 止损判据修正(更新 §7)
|
|
301
|
+
|
|
302
|
+
用户裁定"**没有不值得开发的项**",因此 §7 **不再指向"停掉立项"**,改为**阶段门槛**:
|
|
303
|
+
1. §7 的"**必须先钉死的四条**"(确定性 R6 / 性能 R8 / 判据严格性与图进 parity R13·R16 / 常驻 token 阈值 R25)仍是**硬门槛**:不达标 ⇒ **不进入下一阶段**,先修;
|
|
304
|
+
2. 阶段 B 的"三关"不达标 ⇒ 同样先修,**不带着已知缺陷进入 C/D**;
|
|
305
|
+
3. 出现"既有能力退化"(R26:无图任务变差 / 无图页产物漂移)⇒ **立即回滚该阶段**(这条不受"都做"影响)。
|
|
306
|
+
|
|
307
|
+
### 9.11 开放问题更新(更新 §8)
|
|
308
|
+
|
|
309
|
+
| # | 问题 | 结论 |
|
|
310
|
+
|---|---|---|
|
|
311
|
+
| 2 | `grpSp` 真导出 | **做**(硬前提:可手动取消组合) |
|
|
312
|
+
| 3 | 块库(组复用) | **在范围内** |
|
|
313
|
+
| 4 | Pillow 真字体度量 | **在范围内** |
|
|
314
|
+
| 5 | 裁决优先级细则(参考稿内部矛盾取舍) | **留待后续版本** |
|
|
315
|
+
| 6 | `role` 覆盖阈值告警 | 待定 |
|
|
316
|
+
|
|
317
|
+
> 现行唯一通路是**手写显式 elements**,见 `skills/ppt-studio-diagram/`(SKILL.md / mechanisms.md)。
|
|
318
|
+
> 本文件仅作历史对照保留。
|
|
319
|
+
|
|
@@ -0,0 +1,306 @@
|
|
|
1
|
+
# 08 · 阶段 A 设计说明:结构关系与图专属校验
|
|
2
|
+
|
|
3
|
+
> 上游文档:[docs/07 复杂图能力立项与风险登记](07-复杂图能力立项与风险登记.md)(本文件实现其 §5 的"阶段 A")。
|
|
4
|
+
> 状态:**设计说明(待用户过目后开工)**。所有标 **【待确认】** 的地方需要用户裁定。
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## 0. 阶段 A 的边界
|
|
9
|
+
|
|
10
|
+
**做**
|
|
11
|
+
1. 结构声明词汇:`groups` / `contains` / `attach` / `badgeOf`(+ 既有 `expectedOverlaps` 扩展 `reason`、`role` 覆盖加理由)。
|
|
12
|
+
2. 关系推导与**几何反验证**(纯函数 + 独立自证脚本)。
|
|
13
|
+
3. 图专属校验:元素重复/共位、文本压文本(永不声明)、线穿盒、箭头未落边。
|
|
14
|
+
4. 报告形态:**结构关系聚合 + 真冲突单列 + 声明复核**。
|
|
15
|
+
5. 导出/测量的最小扩展:`attach` 解析、>2 点折线、head+tail 箭头、虚线样式、`notchedRightArrow` 等 prst 补齐。
|
|
16
|
+
6. 图进 parity:组数、结构关系数、附着线数、箭头端数。
|
|
17
|
+
7. 四条硬门槛的**量化基线**:确定性、150 元素性能、判据严格性、常驻 token 增幅。
|
|
18
|
+
8. 导入侧可选增强:`ppt_import` 把拍平的 `grpSp` **同时**产出逻辑 `groups` 声明(便于在真实稿上立刻用组合做审阅与剪枝)。**【待确认】**
|
|
19
|
+
|
|
20
|
+
**不做**(留给 B/C)
|
|
21
|
+
|
|
22
|
+
**非回归不变量(每个提交都验)**
|
|
23
|
+
- 不使用任何新字段的 deck ⇒ **产物逐字节不变**(含 `new` 字段缺省时)。
|
|
24
|
+
- 提示词**只增行**(超集断言 + quick 档字节不变)。
|
|
25
|
+
- 既有断言全绿;隔离矩阵不变;LF/lib 纪律不变。
|
|
26
|
+
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
## 1. DSL 字段草案
|
|
30
|
+
|
|
31
|
+
### 1.1 新增/扩展字段一览
|
|
32
|
+
|
|
33
|
+
| 字段 | 位置 | 必填 | 语义 | 校验强度 |
|
|
34
|
+
|---|---|---|---|---|
|
|
35
|
+
| `groups[]` | page | 可选 | 逻辑分组(可嵌套),剪枝/审阅/声明的作用域 | schema 错误 |
|
|
36
|
+
| `groups[].id` | — | 必填 | 页内唯一;**与元素 id 共用同一命名空间** | schema 错误 |
|
|
37
|
+
| `groups[].label` | — | 可选 | 人类可读用途,出现在审阅输出里 | — |
|
|
38
|
+
| `groups[].members` | — | 必填 | 元素 id 或**嵌套组 id** | 存在性/无环/唯一归属 |
|
|
39
|
+
| `element.contains[]` | element | 可选 | 该元素是这些元素的**视觉容器** | 几何反验证 |
|
|
40
|
+
| `element.attach` | line | 可选 | `{from: {ref, side}, to: {ref, side}}`,导出/测量时解析成边上的点 | 几何反验证 |
|
|
41
|
+
| `element.badgeOf` | element | 可选 | 该元素是那个元素的**徽章/标签**(压在边上或局部覆盖) | 几何反验证 |
|
|
42
|
+
| `element.roleReason` | element | 条件必填 | 当 `role` **覆盖**了推断值时必须给理由 | 缺失 ⇒ 警告 |
|
|
43
|
+
| `expectedOverlaps[].reason` | page | 建议必填 | 既有字段扩展:为"有意重叠"补上**机器可读的理由** | 缺失 ⇒ 警告 |
|
|
44
|
+
|
|
45
|
+
`side ∈ {top, right, bottom, left}`;`role ∈ {background, content, decoration}`(既有)。
|
|
46
|
+
|
|
47
|
+
### 1.2 关于 `expectedIntersections`(对 docs/07 §9.5 的收敛)
|
|
48
|
+
|
|
49
|
+
docs/07 §9.5 写的 `expectedIntersections: [{from, to, reason}]` **不再新增字段**,改为**扩展既有 `expectedOverlaps`**:
|
|
50
|
+
|
|
51
|
+
```yaml
|
|
52
|
+
expectedOverlaps:
|
|
53
|
+
- {pair: [chip_A, card_B], reason: "A 的徽章压在 B 的卡片上(设计意图)"}
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
理由:① 两者语义完全相同("允许这两个相交"),并存会出现两套豁免机制;② `expectedOverlaps` 已经在 schema/verify/闭包里实现并被既有测试覆盖,扩展 `reason` 是**向后兼容的纯增量**;③ 组的作用域由 `groups` 提供,不需要第二个字段承载。
|
|
57
|
+
补强(本条是新能力):**跨组声明要额外校验**——若 `pair` 两端分属不同组,则必须能通过 §2 的"确实相交"谓词;否则按普通重叠处理。**【待确认】**
|
|
58
|
+
|
|
59
|
+
### 1.3 示例
|
|
60
|
+
|
|
61
|
+
```yaml
|
|
62
|
+
pageType: content
|
|
63
|
+
groups:
|
|
64
|
+
- {id: g_in, label: 输入层块, members: [in_box, in_txt]}
|
|
65
|
+
- {id: g_core, label: 仿真内核块, members: [m1, m2, m3, g_loop]}
|
|
66
|
+
- {id: g_loop, label: 迭代反馈小块, members: [loop_line, loop_txt]}
|
|
67
|
+
elements:
|
|
68
|
+
- elementId: zone
|
|
69
|
+
elementType: shape
|
|
70
|
+
kind: roundRect
|
|
71
|
+
bounds: [40, 120, 880, 300]
|
|
72
|
+
contains: [in_box, in_txt, m1, m2, m3]
|
|
73
|
+
role: background
|
|
74
|
+
- elementId: in_box
|
|
75
|
+
elementType: shape
|
|
76
|
+
kind: parallelogram
|
|
77
|
+
bounds: [70, 200, 180, 90]
|
|
78
|
+
- elementId: chip
|
|
79
|
+
elementType: shape
|
|
80
|
+
kind: roundRect
|
|
81
|
+
bounds: [300, 130, 120, 34]
|
|
82
|
+
badgeOf: zone
|
|
83
|
+
role: background
|
|
84
|
+
roleReason: "作为 zone 的标题胶囊"
|
|
85
|
+
- elementId: e1
|
|
86
|
+
elementType: line
|
|
87
|
+
attach: {from: {ref: in_box, side: right}, to: {ref: m1, side: left}}
|
|
88
|
+
arrow: end
|
|
89
|
+
line: {color: "#1F2937", width: 1, dash: solid}
|
|
90
|
+
expectedOverlaps:
|
|
91
|
+
- {pair: [chip, zone], reason: "标题胶囊故意压在容器顶边"}
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
---
|
|
95
|
+
|
|
96
|
+
## 2. 结构关系:严格判据与"反验证"
|
|
97
|
+
|
|
98
|
+
**总原则:声明本身不是豁免,声明 + 通过几何反验证才是豁免。** 任一条关系不成立 ⇒ 该关系**作废**,并按普通冲突处理,同时给出一条点名声明不成立的错误。
|
|
99
|
+
|
|
100
|
+
| 关系 | 严格谓词 | 不成立时 |
|
|
101
|
+
|---|---|---|
|
|
102
|
+
| **包含** `contains` | 对每个 child:`child.x ≥ parent.x + pad` ∧ `child.y ≥ parent.y + pad` ∧ `child.right ≤ parent.right − pad` ∧ `child.bottom ≤ parent.bottom − pad`(`pad` 默认 0) | 错误 `contains-unsatisfied`(点名 parent/child 与溢出量) |
|
|
103
|
+
| **附着** `attach` | 端点落在目标**对应边**上:`side=right` ⇒ \|x − ref.right\| ≤ tol ∧ `ref.y ≤ y ≤ ref.bottom`;其余边同构(`tol` 默认 **1.5px**) | 错误 `attach-unsatisfied`(点名 ref/side 与实际落点) |
|
|
104
|
+
| **徽章** `badgeOf` | ① chip 与 owner **确实相交**(交叠面积 > 0)② chip 面积 ≤ owner 面积 × **0.5** ③ chip 不完全覆盖 owner(owner 至少 1 个角在 chip 之外) | 声明作废;按普通重叠处理并提示"这更像遮罩而非徽章" |
|
|
105
|
+
| **组** `groups` | 成员存在;无重复成员;嵌套**无环**;一个元素**只能属于一个直接组** | schema 错误 |
|
|
106
|
+
| **有意重叠** `expectedOverlaps` | 两端存在;**确实相交**(否则 ℹ 提示"声明已失效");两端不得同时是 `content`(`content × content` 永不放行) | 存在性/类型 ⇒ schema 错误;不相交 ⇒ ℹ |
|
|
107
|
+
|
|
108
|
+
**容差与 pad 的默认值**写进 `ppt_schema` 速查,并允许 page 级覆盖(`relationTolerance: {pad, tol}`)。**【待确认:默认值是否合适,需用真实稿校准】**
|
|
109
|
+
|
|
110
|
+
### 2.1 推导结果不落盘
|
|
111
|
+
|
|
112
|
+
由结构关系**推导出的豁免对**(例如"容器 ⊇ 子元素"隐含的那些 pair)**每次运行时计算、不写回 deck.yaml**。理由:一旦落盘,引擎的一次 bug 会被固化成数据(之后永远豁免),违反"不静默"。
|
|
113
|
+
|
|
114
|
+
---
|
|
115
|
+
|
|
116
|
+
## 3. 新增的图专属校验(无声明也要查)
|
|
117
|
+
|
|
118
|
+
| 检查 | 判据 | 级别 | 可声明豁免? |
|
|
119
|
+
|---|---|---|---|
|
|
120
|
+
| `duplicate-element` | 同 kind + 包围盒差 < **2px**(或完全重合) | **ERROR** | 否 |
|
|
121
|
+
| `text-over-text` | 两个 `role: content` 的**文本**元素相交(容差 1px) | **ERROR** | **永不**(既有规则沿用) |
|
|
122
|
+
| `line-through-box` | 线段几何路径穿过**非端点**元素内部(留 tol) | **ERROR** | 否 |
|
|
123
|
+
| `arrow-not-on-edge` | `arrow` 端未接触任何元素边界(tol 1.5px) | WARNING(提示可能脱靶);**若同时有 `attach` ⇒ ERROR** | 否 |
|
|
124
|
+
| `group-invariant` | 同组内元素应共享对齐/节奏(B 阶段细化;A 只做"组内元素是否落在同一条网格线上"的提示) | WARNING | 否 |
|
|
125
|
+
|
|
126
|
+
> `content × content`、超页面边界仍**永远不可声明**(既有规则不动)。
|
|
127
|
+
|
|
128
|
+
---
|
|
129
|
+
|
|
130
|
+
## 4. 实现:模块、数据流、确定性
|
|
131
|
+
|
|
132
|
+
### 4.1 新增模块 `src/pptd/relations.js`(纯函数,可单测)
|
|
133
|
+
|
|
134
|
+
```
|
|
135
|
+
输入:normalizedPage(元素已归一 + 声明字段)
|
|
136
|
+
输出:{
|
|
137
|
+
groups: [{id, label, members, depth}], // 展开后的组树
|
|
138
|
+
relations: [{type: 'contains'|'attach'|'badge'|'overlapDecl', from, to, valid: bool, evidence, reason}],
|
|
139
|
+
exempt: Set<'a×b'>, // 由**有效**关系推导出的豁免对(排序键)
|
|
140
|
+
invalid: [{type, from, to, why}], // 声明不成立的清单(转错误)
|
|
141
|
+
stats: {contains: n, attach: n, badge: n, groups: n, exempt: n}
|
|
142
|
+
}
|
|
143
|
+
```
|
|
144
|
+
**确定性要求**:全部输出按 id 字典序排序;不使用随机、不使用时间;同一输入两次调用 ⇒ 深度相等(加断言)。
|
|
145
|
+
|
|
146
|
+
### 4.2 数据流
|
|
147
|
+
|
|
148
|
+
```
|
|
149
|
+
resolveDeck → normalizePage
|
|
150
|
+
→ relations.derive() (新:结构关系 + 反验证 + 豁免集)
|
|
151
|
+
→ resolveAttach() (新:把 attach 解析成 points / 折线)
|
|
152
|
+
→ verify.js (改:吃 exempt/relations,产出新报告)
|
|
153
|
+
→ export-pptx.js (改:折线/箭头/虚线/prst 直通)
|
|
154
|
+
→ measure/preview/shot (不改逻辑;折线与箭头沿用同一几何)
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
### 4.3 与既有机制的关系(全部复用,不重造)
|
|
158
|
+
|
|
159
|
+
| 既有机制 | 本阶段如何使用 |
|
|
160
|
+
|---|---|
|
|
161
|
+
| `role` 三值 + 推断 | 不变;新增 `roleReason`(覆盖时必填理由) |
|
|
162
|
+
| `decoration` 完全豁免 | 不变 |
|
|
163
|
+
| `expectedOverlaps` + `buildDeclaredSet` + 传递闭包 | 扩展 `reason`;**闭包继续只沿包含链传播,不沿"跨组声明"传播**(加断言) |
|
|
164
|
+
| 同源 id 前缀豁免 | 不变;`groups` 的成员天然共享前缀时可复用 |
|
|
165
|
+
| 超页面不可声明 / 超安全区声明制 | 不变 |
|
|
166
|
+
|
|
167
|
+
---
|
|
168
|
+
|
|
169
|
+
## 5. 报告形态(聚合 + 真冲突单列)
|
|
170
|
+
|
|
171
|
+
```
|
|
172
|
+
门禁:✗ 2 个错误(必须清零)
|
|
173
|
+
结构关系:组 4|包含 5|附着 6|徽章 1(自动豁免重叠 12 处,未落盘)
|
|
174
|
+
意外冲突(2 —— 必须修正):
|
|
175
|
+
✗ duplicate-element|"box3" 与 "box7" 几乎重合(Δ<2px)
|
|
176
|
+
✗ line-through-box|"e2" 穿过 "box5"
|
|
177
|
+
设计声明复核:
|
|
178
|
+
expectedOverlaps 3 处(其中 1 处已失效:["e9","t4"] 已不相交 ⇒ 建议移除)
|
|
179
|
+
role 覆盖 2 处(chip→background:作为 zone 标题胶囊|zone→background:容器底)
|
|
180
|
+
attach 声明 6 处全部成立(tol 1.5px)
|
|
181
|
+
提示(warning 级,不影响门禁):arrow 端未落边 1 处("e7" 末端)|组内网格不一致 1 处(g_core)
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
规则:
|
|
185
|
+
1. **真冲突永远单独列出**,不做聚合;结构关系只计数。
|
|
186
|
+
2. 报告默认**上限 30 行**,超出折叠为"…另有 N 条,用 `detail` 重跑查看"。
|
|
187
|
+
3. **声明复核段固定存在**(哪怕为空也要打印"声明复核:无"),确保"豁免可见"。
|
|
188
|
+
|
|
189
|
+
---
|
|
190
|
+
|
|
191
|
+
## 6. 导出/测量的最小扩展
|
|
192
|
+
|
|
193
|
+
| 项 | 设计 | 不变量 |
|
|
194
|
+
|---|---|---|
|
|
195
|
+
| `attach` 解析 | 在归一后、导出前把 `attach` 解析为 `points`(直线两点的情形);`side` 相对时用 **L 型单拐**:先沿 from 的法向出 12px,再水平/垂直到 to 的法向入 12px | 与手写 `points` 同时存在 ⇒ **`attach` 优先**并在报告提示 |
|
|
196
|
+
| >2 点折线 | 导出为 **custGeom 开放路径**(`moveTo` + `lnTo`…,不 `close`),带描边、无填充;箭头挂在该路径的 `a:ln.tailEnd/headEnd` | 若开放路径在我们的 custGeom 写盘器上不支持 ⇒ **退化为 N 条直线**(相邻端点重叠 1px 去缝),并记录降级 |
|
|
197
|
+
| 箭头两端 | `arrow: true|'end'|'both'`(`true` 等价 `'end'`,向后兼容) | 既有 `arrow: true` 产物不变 |
|
|
198
|
+
| 虚线 | `line.dash: solid|dash|dot|dashDot`(缺省 solid) | 既有产物不变 |
|
|
199
|
+
| prst 补齐 | `SHAPE_KINDS` 追加 `notchedRightArrow`(含导出的 prst 直通与导入保留) | 既有产物不变 |
|
|
200
|
+
|
|
201
|
+
**验收方式**:以上每一项都配"用了该字段"与"没用该字段"两个夹具;后者产物**逐字节不变**。
|
|
202
|
+
|
|
203
|
+
---
|
|
204
|
+
|
|
205
|
+
## 7. 图进 parity(R16)
|
|
206
|
+
|
|
207
|
+
`report.parity` 新增,且全部进 `parity.ok`:
|
|
208
|
+
|
|
209
|
+
| 字段 | 期望值 |
|
|
210
|
+
|---|---|
|
|
211
|
+
| `groupsExp / groupsOut` | 声明的组数 == 产物/测量中识别到的组数 |
|
|
212
|
+
| `relationsExp / relationsOut` | 有效结构关系数 == 导出时实际解析的结构数(`attach` 解析成功计数) |
|
|
213
|
+
| `attachedLinesExp / attachedLinesOut` | 声明了 `attach` 的线数 == 导出里带解析端点的线数 |
|
|
214
|
+
| `arrowEndsExp / arrowEndsOut` | 声明 `both` 的箭头端数 == 产物 XML 里 headEnd/tailEnd 计数 |
|
|
215
|
+
|
|
216
|
+
无图 deck:上述全部为 0,且**不影响既有断言**(既有断言不动,只增新行)。
|
|
217
|
+
|
|
218
|
+
---
|
|
219
|
+
|
|
220
|
+
## 8. 四条硬门槛的量化验收(本阶段必须钉死)
|
|
221
|
+
|
|
222
|
+
| 门槛 | 验收断言 | 阈值(初值) |
|
|
223
|
+
|---|---|---|
|
|
224
|
+
| **R6 确定性** | 同一 deck 连续导出两次 ⇒ 除 `core.xml` 时间戳外**逐字节一致**;`relations.derive()` 两次调用深度相等 | 必须 100% |
|
|
225
|
+
| **R8 性能** | 150 元素夹具(含 4 组 / 12 关系 / 20 条线)的 `verify`、`render`、`measure`、`preview` 用时与 HTML 体积 | verify ≤ **3s**;preview HTML ≤ **1.5MB**;单页总处理 ≤ **10s** |
|
|
226
|
+
| **R13/R16 判据严格性 + 图进 parity** | ① 负面对照:把容器改小 5px ⇒ `contains` 作废并报错;端点移开 ⇒ `attach-unsatisfied`;chip 覆盖 owner 60% ⇒ `badge` 作废;② 删一个组 / 一条关系数 ⇒ parity 报红 | 全部必须报红 |
|
|
227
|
+
| **R25 常驻 token** | 无图任务的 system prompt token:改动前基线 vs 改动后 | 增幅 **≤ 5%** |
|
|
228
|
+
|
|
229
|
+
基线数字(当前实测)写进 docs/02,作为后续阶段的对照基准。
|
|
230
|
+
|
|
231
|
+
---
|
|
232
|
+
|
|
233
|
+
## 9. 测试与文档交付
|
|
234
|
+
|
|
235
|
+
**测试**
|
|
236
|
+
- `scripts/verify-diagram-relations.mjs`(新,独立自证,退出码 0/1):DSL 校验、关系推导、反验证负例、豁免不落盘、报告形态、parity、确定性、无图页字节不变。
|
|
237
|
+
- `scripts/test-map.mjs` 增加标签 `diagram` / `relations`,让快测档能按影响面选中。
|
|
238
|
+
|
|
239
|
+
**文档**
|
|
240
|
+
- docs/02 增一节"结构关系与图专属校验";docs/06 测试矩阵加行;docs/03 记更新日志;`ppt_schema` 速查补字段与容差;手册技能补"什么时候该用组/包含/附着"。
|
|
241
|
+
- docs/07 §9.5 的 `expectedIntersections` 标注为"已收敛进 `expectedOverlaps`"(§1.2)。
|
|
242
|
+
|
|
243
|
+
---
|
|
244
|
+
|
|
245
|
+
## 10. Definition of Done(阶段 A)
|
|
246
|
+
|
|
247
|
+
- [ ] 字段与校验全部落地,`ppt_schema` 可查;
|
|
248
|
+
- [ ] §2 的 5 类关系、§3 的 5 类检查全部有**正例 + 负例**断言;
|
|
249
|
+
- [ ] 独立自证脚本 PASS,退出码 0;
|
|
250
|
+
- [ ] 四条硬门槛达标(数字写进 docs/02);
|
|
251
|
+
- [ ] 无图 deck 产物逐字节不变;提示词只增行;既有断言全绿;隔离矩阵不变;
|
|
252
|
+
- [ ] 报告形态符合 §5(含"声明复核"段与行数上限);
|
|
253
|
+
- [ ] 文档四件套更新完毕;
|
|
254
|
+
- [ ] 真渲染抽检:至少 1 个含组/包含/附着的页,PowerPoint COM 渲染后读图确认箭头落边、容器包裹正常。
|
|
255
|
+
|
|
256
|
+
---
|
|
257
|
+
|
|
258
|
+
## 11. 需要用户裁定的点
|
|
259
|
+
|
|
260
|
+
1. **`expectedIntersections` 收敛进 `expectedOverlaps`**(§1.2)——同意否?
|
|
261
|
+
2. **导入侧顺带产出逻辑 `groups`**(§0 第 8 条)是否纳入阶段 A?(收益:在真实稿上立刻能做组级审阅与剪枝;成本:导入产物新增字段,需保证下游忽略未知字段不报错)
|
|
262
|
+
3. **容差默认值**:`pad=0`、`attach tol=1.5px`、`duplicate 2px`、`badge 面积比 0.5`——是否先用这套保守默认,等真实稿校准?
|
|
263
|
+
4. **性能阈值初值**(§8)是否接受(verify ≤3s / HTML ≤1.5MB / 单页 ≤10s)?
|
|
264
|
+
5. **`attach` 与手写 `points` 同时存在** ⇒ `attach` 优先 + 报告提示——同意否?
|
|
265
|
+
|
|
266
|
+
---
|
|
267
|
+
|
|
268
|
+
## 12. 实施结果(2026-09-28 落地核对)
|
|
269
|
+
|
|
270
|
+
§11 的 5 点已由用户裁定("都按推荐"):`expectedIntersections` 收敛进 `expectedOverlaps`(+`reason`);导入侧逻辑 `groups` 纳入;容差先用保守默认;性能阈值接受;`attach` 优先 + 报告提示。
|
|
271
|
+
|
|
272
|
+
### 12.1 DoD 逐条(§10)
|
|
273
|
+
|
|
274
|
+
| DoD 项 | 状态 | 证据 |
|
|
275
|
+
|---|---|---|
|
|
276
|
+
| 结构声明词表(groups/contains/attach/badgeOf + reason + roleReason) | ✅ | `src/pptd/schema.js` 校验 + `scripts/verify-diagram-relations.mjs` 第 7 节 |
|
|
277
|
+
| `relations.js` 推导 + 几何反验证 + 豁免不落盘 | ✅ | 同脚本第 1–5 节(含**传递闭包**:A ⊇ B ⊇ C ⇒ A×C) |
|
|
278
|
+
| verify 集成图专属校验与报告形态(聚合 / 真冲突单列 / 声明复核) | ✅ | 同脚本第 8 节 + smoke §58(含**门控**:无新字段的页行为不变) |
|
|
279
|
+
| 导出/测量最小扩展(attach 解析、>2 点折线、head+tail 箭头、虚线、notchedRightArrow) | ✅ | `resolveAttach` 接进 `normalizePage`;`scripts/verify-primitives.mjs` 35/0(含真渲染) |
|
|
280
|
+
| 图进 parity(组/关系/附着线/箭头端) | ✅ | `polyLinesExp/Out`、`arrowEndsExp/Out`、`attachedLinesExp/Out`(导出侧**独立复核**端点落边) |
|
|
281
|
+
| 独立自证脚本 + smoke 分节 | ✅ | `verify-diagram-relations.mjs` **70/0**;smoke §58 **14 条**;`test-map` 48/48 可选中 |
|
|
282
|
+
| 四条硬门槛量化验收 | ✅ | 见 §12.2 |
|
|
283
|
+
|
|
284
|
+
### 12.2 四条硬门槛实测
|
|
285
|
+
|
|
286
|
+
1. **确定性**:同输入两次导出除 `core.xml` 时间戳外逐部件一致(`verify-primitives.mjs` §5)。
|
|
287
|
+
2. **150 元素性能**:verify **14.6ms**(门槛 3000)|预览 HTML **73KB**(门槛 1.5MB)|单页总处理 **122.6ms**(门槛 10000)——`scripts/bench-diagram-scale.mjs` 全部达标(docs/02 §6.1)。
|
|
288
|
+
3. **判据严格性(负面对照必须报红)**:每条关系各一个反例 + 四类图检查 + 传递闭包"只沿有效边"的反例(自证第 2/9 节);导出侧非法值必须降级并告警、不许静默产坏 XML(`verify-primitives.mjs` §3)。
|
|
289
|
+
4. **无图任务 prompt 增幅 ≤5%**:常驻面基线 **4925 tokens**,`npm run probe:prompt:check` 实测 **0.00%**。
|
|
290
|
+
|
|
291
|
+
### 12.3 真渲染抽检
|
|
292
|
+
|
|
293
|
+
一页用满新能力(容器 `contains` 四盒四标签 + 嵌套组 + 三条附着线(单/双箭头)+ 橙色虚线折线 + 顶边徽章 + `notchedRightArrow`):
|
|
294
|
+
导出 parity 全绿(lines 3/3、poly 1/1、**attached 3/3**、arrowEnds 2/2、无警告)→ PowerPoint COM 渲染读图确认:
|
|
295
|
+
**盒间连线精确落在盒子边框上**、虚线折线直角干净且两端有箭头、容器与徽章位置正确、notched 箭头形状正确。
|
|
296
|
+
|
|
297
|
+
### 12.4 阶段 A 遗留(进阶段 B)
|
|
298
|
+
|
|
299
|
+
- `groups` 目前是**逻辑组合**(审计/剪枝/豁免单位),**尚未导出为 `grpSp`**——按 docs/07 决策留到阶段 A 第二步(用户可手动取消组合即可接受)。
|
|
300
|
+
- `import-pptx.js` 尚未把参考稿的容器/组合信息写入 DSL(阶段 D 的北极星场景需要)。
|
|
301
|
+
- `attach` 只支持"边 + 最近点"锚定;折线中途拐点吸附(`attach` 到中段)不在阶段 A 范围。
|
|
302
|
+
|
|
303
|
+
|
|
304
|
+
> 现行唯一通路是**手写显式 elements**,见 `skills/ppt-studio-diagram/`(SKILL.md / mechanisms.md)。
|
|
305
|
+
> 本文件仅作历史对照保留。
|
|
306
|
+
|