dsh-ppt-studio 1.1.4 → 1.1.5
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 +1 -1
- package/docs/03-/346/233/264/346/226/260/346/227/245/345/277/227.md +22 -0
- package/docs/05-/350/277/255/344/273/243/346/265/201/347/250/213.md +1 -1
- package/examples/smoke/imported/source.pptx +0 -0
- package/examples/smoke/out-smoke.pptx +0 -0
- package/lib/router.js +2 -2
- package/lib/tools.js +2 -2
- package/package.json +1 -1
- package/scripts/fixtures/workflow-baseline.json +20 -15
- package/scripts/verify-native-charts.mjs +25 -10
package/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
在 DeepSeek Harness 里说需求,它把 PPT 做出来:先定大纲和版式,再逐页制作,每页过一遍自动检查,最后交付一个能用 PowerPoint 打开、继续改的 `.pptx`。
|
|
4
4
|
|
|
5
|
-
当前版本 **1.1.
|
|
5
|
+
当前版本 **1.1.5**,安装包约 **890 kB**(1.0.3 及更早的版本是 35 MB,因为随包带着 4 套没人用过的导入模板,1.0.4 把它们删了)。
|
|
6
6
|
|
|
7
7
|
**隔离是默认的**:装好之后,这套能力**只出现在「PPT 工作室」预设里**,其他预设与"没装插件"完全一样(§1.6)。
|
|
8
8
|
新建会话时选「PPT 工作室」即可;预设提供的是"完整工作台"——人格 + 22 个工具 + `/ppt` 命令 + 4 本手册 + 工作流提示段。
|
|
@@ -5,6 +5,19 @@
|
|
|
5
5
|
|
|
6
6
|
---
|
|
7
7
|
|
|
8
|
+
## [1.1.5] 2026-09-26 —— 事实修正:pptd 图表描述与提示词不再写"矢量拼绘";证据脚本自身缺陷修复
|
|
9
|
+
|
|
10
|
+
**触发**:1.1.4 发布后的独立验证门禁指出——`ppt_export` 的工具描述、以及工作流提示词的两条引擎行仍写"图表矢量拼绘",与第三轮"图表默认原生可编辑"**正相反**;模型据此可能误告用户"pptd 图表不可编辑、改不了数据"。这是**用户可见的事实错误**,必须单独发一版(npm 不允许覆盖已发布版本)。
|
|
11
|
+
|
|
12
|
+
**改动**
|
|
13
|
+
- `src/tools.js`:`ppt_export` 描述改为"**图表默认原生可编辑**:`ppt/charts/*.xml` + 内嵌数据工作簿,`chart.render: vector` 可回到矢量拼绘";python-pptx 分支的输出行同步(原写"引擎 A 的图表是矢量拼绘、不可改数据")。
|
|
14
|
+
- `src/router.js`:quick 第 7 条、标准第 10 条两条引擎行同步改写;**重建提示词基线**(`scripts/fixtures/workflow-baseline.json`,10 变体/230 行)——逐行超集与"quick 档逐字节不变"两条断言全绿。
|
|
15
|
+
- `scripts/verify-native-charts.mjs` 第 8 节修复(**证据脚本自身缺陷**):原实现只从 `HEAD:src/pptd/` 取 4 个文件做对照,一旦 HEAD 包含本轮改动就会 ①对照退化为"新 vs 新"失去意义 ②复制出的 `svgCharts.js` import 未被复制的 `./schema.js` ⇒ `ERR_MODULE_NOT_FOUND` 崩溃(本轮真实发生)。现改为按**参照提交**取**整棵 `src/`**(`PPT_OLD_EXPORT_REF`,缺省 `eb1e6f8`=原生图表之前,回落 `v1.1.2`/`HEAD~1`),并有明确跳过语义。
|
|
16
|
+
|
|
17
|
+
**验证**:`npm test` **303/0**(LF/lib 新鲜度/文档计数/预设漂移全绿);`node scripts/verify-native-charts.mjs` **PASS 52 / FAIL 0**(第 8 节"17 个部件全部逐字节一致");`node scripts/check-lib-freshness.mjs` 32 文件一致。
|
|
18
|
+
|
|
19
|
+
**影响**:纯文案 + 证据脚本修正,**无行为变化**;1.1.4 的功能不受影响(图表本来就是原生可编辑,只是描述与提示词没跟上)。
|
|
20
|
+
|
|
8
21
|
## [1.1.4] 2026-09-26 —— 三个批次:按预设隔离(默认)+ office 接入与兜底增强 + pptd 原生可编辑图表
|
|
9
22
|
|
|
10
23
|
> 本批按「发布列车」攒着:`package.json` 版本号与 tag 在发版那一步才推进(见 docs/05「发版节奏」)。
|
|
@@ -70,6 +83,15 @@
|
|
|
70
83
|
|
|
71
84
|
**兼容性**:`chart` 元素默认行为**变了**(旧 deck 不写 `render` 即 native);要旧观感请写 `render: vector`。**旧 deck 若当年为矢量图表手工补过分类名/数值文本框,改默认 native 后会出现"图表自带标签 + 你补的标签"并存**(真渲染实测可见)——这类既有工程建议保留 `render: vector`,或删掉手写标签。其余元素类型零改动。**诚实边界**:未用 UI 点过"编辑数据",自动化证据是完整关系链自证(graphicFrame→slide rels→chartN.xml→`c:externalData`→chart rels→内嵌 xlsx)+ 工作簿被独立阅读器读通。
|
|
72
85
|
|
|
86
|
+
### 发布结果(1.1.4,2026-09-26)
|
|
87
|
+
| 环节 | 实测 |
|
|
88
|
+
|---|---|
|
|
89
|
+
| 构件 | `dsh-ppt-studio-1.1.4-20260926-2313-72e7d806.tgz`(sha256 `72e7d806…`);`npm run sync` 三向一致 + 用户视角终验 9/0 + 安装路径自证 28/0 |
|
|
90
|
+
| CI 自动发布 | run [`36251141426`](https://github.com/zbsph/dsh-ppt-studio/actions/runs/36251141426) **success**(release 事件 → 等资产 → 取最新 → OIDC `npm publish` → 发后自证 integrity) |
|
|
91
|
+
| 发后自证(CI 内,权威) | `包版本 = 1.1.4`|`registry integrity = sha512-V0Gik3vMciF6DxxeHtcgz1UZPM+jPq5Xkbcl33IrD3eYNzTQR5+SzYaq3l8PRbUm+UVB2ffAy2wKDV44r8/mxA==`|`✓ registry 字节 == Release 资产字节`(该步失败会让 job 红,实际 success) |
|
|
92
|
+
| 发布身份 | 走 Trusted Publishing(OIDC,零长期 token)+ 自动 provenance |
|
|
93
|
+
| 本地复核 | ⚠ 本机到 `registry.npmjs.org` 的 TLS 握手全部失败(`Invoke-WebRequest`/`curl --ssl-no-revoke` 连续 9 次;`npm view` 因此返回**本地缓存的旧值** 1.1.0,不可作数)——发布结论以 CI 内的发后自证为准;网络恢复后可用 `npm view dsh-ppt-studio dist-tags` 复核 |
|
|
94
|
+
|
|
73
95
|
## [并入 1.1.4] 2026-09-26 —— 用户目录口径统一(认 `DSH_HOME`)+ smoke 整轮隔离;附记宿主供应链策略与发版节奏
|
|
74
96
|
|
|
75
97
|
> 本批按新的「发布列车」攒着:`package.json` 版本号与 tag **在发版那一步才推进**(见 docs/05「发版节奏」)。
|
|
@@ -112,7 +112,7 @@
|
|
|
112
112
|
想要会话级隔离就切后者(`dsh plugin --profile web remove <包>` → `node scripts/install.mjs` → 重启;README §10 有切换与回退命令),
|
|
113
113
|
日常迭代照旧 `--local`——它现在**两种挂载模式都自证**(非 bundle 走"穿过 junction 读到的字节")。
|
|
114
114
|
插件**无法**在 bundle 挂载下自己按预设过滤:注册发生在插件 `apply`(profile 级),要按预设隔离就得从预设组合里注册。
|
|
115
|
-
- 版本号:未获用户指示不改(当前 **1.1.
|
|
115
|
+
- 版本号:未获用户指示不改(当前 **1.1.5**;历史值见 docs/03);**资产名带构建时间 + 构建戳**(2026-09-15 起):`dsh-ppt-studio-<版本>-<YYYYMMDD-HHmm>-<sha256 前 8 位>.tgz`。
|
|
116
116
|
> 2026-09-18 改名说明:包名由 `@dsh-external/dsh-ppt-studio` 改为**无 scope** 的 `dsh-ppt-studio`(发布到 npm),
|
|
117
117
|
> 于是 `npm pack` 产出的资产名也从 `dsh-external-dsh-ppt-studio-…` 变成 `dsh-ppt-studio-…`;v1.0.2 及更早的资产仍在 Releases 页上(老用户重装不受影响)。
|
|
118
118
|
**时间段的用处**:老资产**不删**(已装用户靠它重装),页面上会并排多条名字近似者,sha 段看不出新旧 ⇒ 取时间最新那条即当前版本;发布日志里同时打印本轮的完整资产名。
|
|
Binary file
|
|
Binary file
|
package/lib/router.js
CHANGED
|
@@ -113,7 +113,7 @@ export function workflowSection(taskType, cfg) {
|
|
|
113
113
|
'4. 页数:≤8 页(用户指定除外);每页文本精简(每块 ≤40 字为默认参考,用户要求可放宽)。',
|
|
114
114
|
'5. 审阅:ppt_render + ppt_verify 必跑——内容互压/出界/文本溢出/预期外重叠(设计意图声明制)必须清零;出界分级同标准模式(超页面不可声明;安全区外有意元素逐项加 expectedOutOfSafeArea);autoDeclare 后附一句意图说明;跳过截图视觉审阅与美学迭代。',
|
|
115
115
|
'6. 交付:ppt_export(引擎 auto=pptd)→ 交付说明标注"快速模式:未经视觉审阅"。',
|
|
116
|
-
'7. 引擎:auto 默认 = pptd
|
|
116
|
+
'7. 引擎:auto 默认 = pptd(自研主引擎;**图表默认原生可编辑**:图表部件 + 内嵌数据工作簿,`chart.render: vector` 可回到矢量拼绘);python-pptx 仅显式指定或 pptd 失败时使用(其图表同为原生可编辑图表 + 内嵌数据工作簿)。不要自行切换引擎。',
|
|
117
117
|
'8. 用户明确要求始终优先;回到完整模式:/ppt normal。',
|
|
118
118
|
].join('\n'),
|
|
119
119
|
}
|
|
@@ -150,7 +150,7 @@ export function workflowSection(taskType, cfg) {
|
|
|
150
150
|
'7. 交付前:S4 全通过 + S6 导出 .pptx + 交付说明(素材来源、未视觉审阅项、修改指引)。**内容审阅(M3 重写 2026-09-18)**:有具体数字/事实主张的稿子,交付前用 `ppt_crosscheck` 生成「审阅材料包」(全页正文 + 素材清单 + 审阅协议)→ 再按协议做一次内容审阅:**默认用独立子代理**(全新上下文、只给材料包与素材文件;**用户明确禁止子代理时改自审并标注「自审(同上下文)」**),逐条判"一致 / 冲突 / 无来源支撑 / 无法核实",重点核对同一指标跨页值是否一致、数字是否有依据、结论是否强于数据;**没有外部素材时只能判"无法核实",不得报绿**。该工具**只汇总材料、不做判定、不构成门禁**(旧版 grounded/unmapped 状态与跨页数字分组已废除)。制作进程中**供用户看稿优先用 ppt_preview(dir)**(返回同源预览链接,用户点击即看,附在交付信息里);导出前/后均可预览。**修改既有精美 PPT 的某一页(edit/augment 高频场景)**:ppt_import 参考层读真身 → 改工作区页并审阅清零 → **`ppt_splice`**(只把该页替换进原稿:保留源母版横幅/页脚/备注关系/媒体,其余页条目 SHA256 逐字节一致——不要整册近似重渲伤及其他页)→ 交付整册副本;用户要"单页独立版"再 **`ppt_slice`**;抽查该页观感用 **`ppt_visual pages=N`**(按页真渲染,不必整册);"看起来就是模板原样"用 `ppt_patch`(手术贴模板)。',
|
|
151
151
|
'8. 版式系统(审美基线,用户风格优先):写页面之前先定版式规则——默认基线:8px 网格对齐、3-4 级字号阶梯、4-5 色主题(只在 $theme 内取色)、统一间距节奏(8/16/24px)、左右外边界一致、构图重心居中;**用户对风格有要求(字体/字号/配色/密度)一律优先,默认基线仅为未指定时的风格参考**。文字:短句化(每块 ≤60 字为默认参考,可依内容放宽),**文本最小字号以用户指令为准**(hardConstraints;未给下限不设强制),长句在语义断点显式 \\\\n 换行。',
|
|
152
152
|
'9. 审美建议(ppt_verify 输出的 [·] 建议)不是门禁,但请逐条斟酌采纳;overlap/out-of-page/text-overflow 错误仍必须清零(审美改进不得引入元素区块冲突)。',
|
|
153
|
-
'10. 引擎:**PPT 制作唯一通道 = pptd**(`deck.yaml` + `pages/*.yaml
|
|
153
|
+
'10. 引擎:**PPT 制作唯一通道 = pptd**(`deck.yaml` + `pages/*.yaml`;**图表默认原生可编辑**:图表部件 + 内嵌数据工作簿,`chart.render: vector` 可回到矢量拼绘)。pptd 硬失败时自动回退 python-pptx(报告醒目标注降级;其图表同为**原生可编辑图表 + 内嵌数据工作簿**);python-pptx 仅用户显式指定时使用。**不要**用 python-pptx 或官方 `office-pptx` 技能从零拼版来绕过本工作流的门禁——它们只适合**读取**既有 pptx、或作为上面的兜底(能不能用由 `ppt_state` 的 `capabilities` 如实报告)。除非用户要求,不要自行切换引擎。',
|
|
154
154
|
'11. 质量档 audit(/ppt quality audit,从严门禁):禁 autoDeclare(工具已拦);每页必须 ppt_shot + 读图视觉审阅(无读图能力则降级结构 Lint 并在交付说明标注"未经视觉审阅");导出报告必须包含并核对 audit 回读断言(页数/尺寸/最小字号 ≥ minFontSize);有 Office 时导出后自动 **Office 真渲染**(成品视觉审核,逐页 read_image);交付说明含素材来源与数据脱敏/假设标注。',
|
|
155
155
|
'12. **真渲染抽检铁律(P1 事故教训)**:有 Office 时,真渲染抽查**必须覆盖所有含 table/chart/image/custGeom 的页**(每类至少一页,其余页轮换)——不要只挑"美观重点页";抽查后逐页 read_image(渲染图已带 1px=1pt 比例标注水印,降低坐标误判)。导出报告会给出建议覆盖页清单(P8 行)。',
|
|
156
156
|
'13. **改既有 PPT 的两条纪律**:① **就地手术优先**——任务若是"改某几页 / 改一处文字 / 换一张图",优先 `ppt_splice`(把工作区某一页替换进原稿,**其余页逐字节不变**;用户要"单页独立版"用 `ppt_slice`;要"看起来就是模板原样"用 `ppt_patch`),不要图省事整册重渲。`ppt_import` 会给出**页码/元素级**的"无法保真特性"清单(工程内 `loss-audit.json` + 一行结论),并按 ✓/⚠/ℹ 三档区分:✓ 干净、⚠ 有会丢的可见特性(动画/阴影/超链接/切换/SmartArt/EMF 等)、ℹ 仅主题样式表里的渐变模板未被引用(不影响观感);**⚠ 命中时"只改某几页"必须走 `ppt_splice`,并在交付说明里写明"整册重渲会丢 <类别 N 处>"**。② **Excel 素材的数字要么重算、要么标注**:从 xlsx 取数时公式的缓存值可能陈旧或缺失;探测到捆绑 LibreOffice kit 就用它的 `recalculate` 重算,做不到时必须在交付说明里写明"公式值未重算(可能陈旧)",别把旧缓存值当已核对的数据。',
|
package/lib/tools.js
CHANGED
|
@@ -665,7 +665,7 @@ export function registerTools(ctx) {
|
|
|
665
665
|
|
|
666
666
|
reg({
|
|
667
667
|
name: 'ppt_export',
|
|
668
|
-
description: '导出 .pptx。engine 缺省 auto(=pptd
|
|
668
|
+
description: '导出 .pptx。engine 缺省 auto(=pptd 自研主引擎;**图表默认原生可编辑**:`ppt/charts/*.xml` + 内嵌数据工作簿,`chart.render: vector` 可回到矢量拼绘;hard 失败时自动回退 python-pptx 并醒目标注降级);python-pptx 仅显式指定(其图表同为原生可编辑图表 + 内嵌数据工作簿)。out 支持绝对路径(原样使用)或文件名(相对 deck 目录)。audit 质量档自动追加回读断言(页数/尺寸/最小字号)',
|
|
669
669
|
parameters: {
|
|
670
670
|
dir: dirSchema,
|
|
671
671
|
engine: { type: 'string', enum: ['auto', 'pptd', 'python-pptx'], description: '缺省 auto(=pptd);python-pptx 需 python 环境' },
|
|
@@ -709,7 +709,7 @@ export function registerTools(ctx) {
|
|
|
709
709
|
const py = findPython()
|
|
710
710
|
if (!py.has) return `⚠ python-pptx 引擎不可用(未检测到带 python-pptx 的解释器):${py.cmd ? '请给它 pip install python-pptx' : '未找到 python 解释器,也没探测到捆绑 Python'}。可改用默认 pptd 引擎。`
|
|
711
711
|
const r = await runPythonExport(ctx0, outName)
|
|
712
|
-
return `✓ 已导出(python-pptx 引擎):${r.file}\n
|
|
712
|
+
return `✓ 已导出(python-pptx 引擎):${r.file}\n图表为**原生可编辑图表**(带内嵌数据工作簿;与 pptd 默认通路一致——只有 chart.render=vector 才是不可改数据的矢量拼绘)。${await fallbackNote(ctx0, r)}${officialQaNote(r.file, ctx0.pages?.length)}${await withAudit(r.file)}${engineNote}`
|
|
713
713
|
}
|
|
714
714
|
try {
|
|
715
715
|
const r = await exportPptx(ctx0, { out: outName, engine: 'pptd' })
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dsh-ppt-studio",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.5",
|
|
4
4
|
"description": "在 DeepSeek Harness 里做 PPT:说需求 → 逐页制作 → 导出可编辑的 .pptx。含布局检查、Office 真渲染复核,以及可扩展的本地模板库",
|
|
5
5
|
"//publish": "2026-09-18 定:发 npm,**无 scope** 包名 `dsh-ppt-studio`。**状态(2026-09-26):已发布** —— `dsh-ppt-studio@1.1.0` 在 npm 上(`dist-tags.latest`、public,发布者 `zbsph`),registry 的 tarball 与 GitHub Release 资产**逐字节相同**(sha256 `9303cc5c…`)。首个版本是 `npm publish <发版 tgz>` 直发的;**从下一版起改走 Trusted Publishing(OIDC)全自动通道**:`.github/workflows/publish.yml` 由 release 事件触发 → 下载 Release 资产 → OIDC `npm publish` → 发后自证 integrity —— 零长期 token、零手工(npm 已公告:Bypass-2FA 直发 2027-01 移除)。发布纪律不变:**用发版时那个 tgz**(`.sync-state.json` 的 `localTgz`),**别在 main 前进后跑裸 `npm publish`**(会按当前工作区重新打包 ⇒ 破坏'两条通道同一份字节')。手动补发入口:Actions → Publish to npm → Run workflow。见 README §10 与 docs/05「发布-同步纪律」。",
|
|
6
6
|
"repository": { "type": "git", "url": "git+https://github.com/zbsph/dsh-ppt-studio.git" },
|
|
@@ -35,9 +35,10 @@
|
|
|
35
35
|
"7. 交付前:S4 全通过 + S6 导出 .pptx + 交付说明(素材来源、未视觉审阅项、修改指引)。**内容审阅(M3 重写 2026-09-18)**:有具体数字/事实主张的稿子,交付前用 `ppt_crosscheck` 生成「审阅材料包」(全页正文 + 素材清单 + 审阅协议)→ 再按协议做一次内容审阅:**默认用独立子代理**(全新上下文、只给材料包与素材文件;**用户明确禁止子代理时改自审并标注「自审(同上下文)」**),逐条判\"一致 / 冲突 / 无来源支撑 / 无法核实\",重点核对同一指标跨页值是否一致、数字是否有依据、结论是否强于数据;**没有外部素材时只能判\"无法核实\",不得报绿**。该工具**只汇总材料、不做判定、不构成门禁**(旧版 grounded/unmapped 状态与跨页数字分组已废除)。制作进程中**供用户看稿优先用 ppt_preview(dir)**(返回同源预览链接,用户点击即看,附在交付信息里);导出前/后均可预览。**修改既有精美 PPT 的某一页(edit/augment 高频场景)**:ppt_import 参考层读真身 → 改工作区页并审阅清零 → **`ppt_splice`**(只把该页替换进原稿:保留源母版横幅/页脚/备注关系/媒体,其余页条目 SHA256 逐字节一致——不要整册近似重渲伤及其他页)→ 交付整册副本;用户要\"单页独立版\"再 **`ppt_slice`**;抽查该页观感用 **`ppt_visual pages=N`**(按页真渲染,不必整册);\"看起来就是模板原样\"用 `ppt_patch`(手术贴模板)。",
|
|
36
36
|
"8. 版式系统(审美基线,用户风格优先):写页面之前先定版式规则——默认基线:8px 网格对齐、3-4 级字号阶梯、4-5 色主题(只在 $theme 内取色)、统一间距节奏(8/16/24px)、左右外边界一致、构图重心居中;**用户对风格有要求(字体/字号/配色/密度)一律优先,默认基线仅为未指定时的风格参考**。文字:短句化(每块 ≤60 字为默认参考,可依内容放宽),**文本最小字号以用户指令为准**(hardConstraints;未给下限不设强制),长句在语义断点显式 \\\\n 换行。",
|
|
37
37
|
"9. 审美建议(ppt_verify 输出的 [·] 建议)不是门禁,但请逐条斟酌采纳;overlap/out-of-page/text-overflow 错误仍必须清零(审美改进不得引入元素区块冲突)。",
|
|
38
|
-
"10. 引擎:**PPT 制作唯一通道 = pptd**(`deck.yaml` + `pages/*.yaml
|
|
38
|
+
"10. 引擎:**PPT 制作唯一通道 = pptd**(`deck.yaml` + `pages/*.yaml`;**图表默认原生可编辑**:图表部件 + 内嵌数据工作簿,`chart.render: vector` 可回到矢量拼绘)。pptd 硬失败时自动回退 python-pptx(报告醒目标注降级;其图表同为**原生可编辑图表 + 内嵌数据工作簿**);python-pptx 仅用户显式指定时使用。**不要**用 python-pptx 或官方 `office-pptx` 技能从零拼版来绕过本工作流的门禁——它们只适合**读取**既有 pptx、或作为上面的兜底(能不能用由 `ppt_state` 的 `capabilities` 如实报告)。除非用户要求,不要自行切换引擎。",
|
|
39
39
|
"11. 质量档 audit(/ppt quality audit,从严门禁):禁 autoDeclare(工具已拦);每页必须 ppt_shot + 读图视觉审阅(无读图能力则降级结构 Lint 并在交付说明标注\"未经视觉审阅\");导出报告必须包含并核对 audit 回读断言(页数/尺寸/最小字号 ≥ minFontSize);有 Office 时导出后自动 **Office 真渲染**(成品视觉审核,逐页 read_image);交付说明含素材来源与数据脱敏/假设标注。",
|
|
40
|
-
"12. **真渲染抽检铁律(P1 事故教训)**:有 Office 时,真渲染抽查**必须覆盖所有含 table/chart/image/custGeom 的页**(每类至少一页,其余页轮换)——不要只挑\"美观重点页\";抽查后逐页 read_image(渲染图已带 1px=1pt 比例标注水印,降低坐标误判)。导出报告会给出建议覆盖页清单(P8 行)。"
|
|
40
|
+
"12. **真渲染抽检铁律(P1 事故教训)**:有 Office 时,真渲染抽查**必须覆盖所有含 table/chart/image/custGeom 的页**(每类至少一页,其余页轮换)——不要只挑\"美观重点页\";抽查后逐页 read_image(渲染图已带 1px=1pt 比例标注水印,降低坐标误判)。导出报告会给出建议覆盖页清单(P8 行)。",
|
|
41
|
+
"13. **改既有 PPT 的两条纪律**:① **就地手术优先**——任务若是\"改某几页 / 改一处文字 / 换一张图\",优先 `ppt_splice`(把工作区某一页替换进原稿,**其余页逐字节不变**;用户要\"单页独立版\"用 `ppt_slice`;要\"看起来就是模板原样\"用 `ppt_patch`),不要图省事整册重渲。`ppt_import` 会给出**页码/元素级**的\"无法保真特性\"清单(工程内 `loss-audit.json` + 一行结论),并按 ✓/⚠/ℹ 三档区分:✓ 干净、⚠ 有会丢的可见特性(动画/阴影/超链接/切换/SmartArt/EMF 等)、ℹ 仅主题样式表里的渐变模板未被引用(不影响观感);**⚠ 命中时\"只改某几页\"必须走 `ppt_splice`,并在交付说明里写明\"整册重渲会丢 <类别 N 处>\"**。② **Excel 素材的数字要么重算、要么标注**:从 xlsx 取数时公式的缓存值可能陈旧或缺失;探测到捆绑 LibreOffice kit 就用它的 `recalculate` 重算,做不到时必须在交付说明里写明\"公式值未重算(可能陈旧)\",别把旧缓存值当已核对的数据。"
|
|
41
42
|
]
|
|
42
43
|
},
|
|
43
44
|
{
|
|
@@ -74,9 +75,10 @@
|
|
|
74
75
|
"7. 交付前:S4 全通过 + S6 导出 .pptx + 交付说明(素材来源、未视觉审阅项、修改指引)。**内容审阅(M3 重写 2026-09-18)**:有具体数字/事实主张的稿子,交付前用 `ppt_crosscheck` 生成「审阅材料包」(全页正文 + 素材清单 + 审阅协议)→ 再按协议做一次内容审阅:**默认用独立子代理**(全新上下文、只给材料包与素材文件;**用户明确禁止子代理时改自审并标注「自审(同上下文)」**),逐条判\"一致 / 冲突 / 无来源支撑 / 无法核实\",重点核对同一指标跨页值是否一致、数字是否有依据、结论是否强于数据;**没有外部素材时只能判\"无法核实\",不得报绿**。该工具**只汇总材料、不做判定、不构成门禁**(旧版 grounded/unmapped 状态与跨页数字分组已废除)。制作进程中**供用户看稿优先用 ppt_preview(dir)**(返回同源预览链接,用户点击即看,附在交付信息里);导出前/后均可预览。**修改既有精美 PPT 的某一页(edit/augment 高频场景)**:ppt_import 参考层读真身 → 改工作区页并审阅清零 → **`ppt_splice`**(只把该页替换进原稿:保留源母版横幅/页脚/备注关系/媒体,其余页条目 SHA256 逐字节一致——不要整册近似重渲伤及其他页)→ 交付整册副本;用户要\"单页独立版\"再 **`ppt_slice`**;抽查该页观感用 **`ppt_visual pages=N`**(按页真渲染,不必整册);\"看起来就是模板原样\"用 `ppt_patch`(手术贴模板)。",
|
|
75
76
|
"8. 版式系统(审美基线,用户风格优先):写页面之前先定版式规则——默认基线:8px 网格对齐、3-4 级字号阶梯、4-5 色主题(只在 $theme 内取色)、统一间距节奏(8/16/24px)、左右外边界一致、构图重心居中;**用户对风格有要求(字体/字号/配色/密度)一律优先,默认基线仅为未指定时的风格参考**。文字:短句化(每块 ≤60 字为默认参考,可依内容放宽),**文本最小字号以用户指令为准**(hardConstraints;未给下限不设强制),长句在语义断点显式 \\\\n 换行。",
|
|
76
77
|
"9. 审美建议(ppt_verify 输出的 [·] 建议)不是门禁,但请逐条斟酌采纳;overlap/out-of-page/text-overflow 错误仍必须清零(审美改进不得引入元素区块冲突)。",
|
|
77
|
-
"10. 引擎:**PPT 制作唯一通道 = pptd**(`deck.yaml` + `pages/*.yaml
|
|
78
|
+
"10. 引擎:**PPT 制作唯一通道 = pptd**(`deck.yaml` + `pages/*.yaml`;**图表默认原生可编辑**:图表部件 + 内嵌数据工作簿,`chart.render: vector` 可回到矢量拼绘)。pptd 硬失败时自动回退 python-pptx(报告醒目标注降级;其图表同为**原生可编辑图表 + 内嵌数据工作簿**);python-pptx 仅用户显式指定时使用。**不要**用 python-pptx 或官方 `office-pptx` 技能从零拼版来绕过本工作流的门禁——它们只适合**读取**既有 pptx、或作为上面的兜底(能不能用由 `ppt_state` 的 `capabilities` 如实报告)。除非用户要求,不要自行切换引擎。",
|
|
78
79
|
"11. 质量档 audit(/ppt quality audit,从严门禁):禁 autoDeclare(工具已拦);每页必须 ppt_shot + 读图视觉审阅(无读图能力则降级结构 Lint 并在交付说明标注\"未经视觉审阅\");导出报告必须包含并核对 audit 回读断言(页数/尺寸/最小字号 ≥ minFontSize);有 Office 时导出后自动 **Office 真渲染**(成品视觉审核,逐页 read_image);交付说明含素材来源与数据脱敏/假设标注。",
|
|
79
|
-
"12. **真渲染抽检铁律(P1 事故教训)**:有 Office 时,真渲染抽查**必须覆盖所有含 table/chart/image/custGeom 的页**(每类至少一页,其余页轮换)——不要只挑\"美观重点页\";抽查后逐页 read_image(渲染图已带 1px=1pt 比例标注水印,降低坐标误判)。导出报告会给出建议覆盖页清单(P8 行)。"
|
|
80
|
+
"12. **真渲染抽检铁律(P1 事故教训)**:有 Office 时,真渲染抽查**必须覆盖所有含 table/chart/image/custGeom 的页**(每类至少一页,其余页轮换)——不要只挑\"美观重点页\";抽查后逐页 read_image(渲染图已带 1px=1pt 比例标注水印,降低坐标误判)。导出报告会给出建议覆盖页清单(P8 行)。",
|
|
81
|
+
"13. **改既有 PPT 的两条纪律**:① **就地手术优先**——任务若是\"改某几页 / 改一处文字 / 换一张图\",优先 `ppt_splice`(把工作区某一页替换进原稿,**其余页逐字节不变**;用户要\"单页独立版\"用 `ppt_slice`;要\"看起来就是模板原样\"用 `ppt_patch`),不要图省事整册重渲。`ppt_import` 会给出**页码/元素级**的\"无法保真特性\"清单(工程内 `loss-audit.json` + 一行结论),并按 ✓/⚠/ℹ 三档区分:✓ 干净、⚠ 有会丢的可见特性(动画/阴影/超链接/切换/SmartArt/EMF 等)、ℹ 仅主题样式表里的渐变模板未被引用(不影响观感);**⚠ 命中时\"只改某几页\"必须走 `ppt_splice`,并在交付说明里写明\"整册重渲会丢 <类别 N 处>\"**。② **Excel 素材的数字要么重算、要么标注**:从 xlsx 取数时公式的缓存值可能陈旧或缺失;探测到捆绑 LibreOffice kit 就用它的 `recalculate` 重算,做不到时必须在交付说明里写明\"公式值未重算(可能陈旧)\",别把旧缓存值当已核对的数据。"
|
|
80
82
|
]
|
|
81
83
|
},
|
|
82
84
|
{
|
|
@@ -113,9 +115,10 @@
|
|
|
113
115
|
"7. 交付前:S4 全通过 + S6 导出 .pptx + 交付说明(素材来源、未视觉审阅项、修改指引)。**内容审阅(M3 重写 2026-09-18)**:有具体数字/事实主张的稿子,交付前用 `ppt_crosscheck` 生成「审阅材料包」(全页正文 + 素材清单 + 审阅协议)→ 再按协议做一次内容审阅:**默认用独立子代理**(全新上下文、只给材料包与素材文件;**用户明确禁止子代理时改自审并标注「自审(同上下文)」**),逐条判\"一致 / 冲突 / 无来源支撑 / 无法核实\",重点核对同一指标跨页值是否一致、数字是否有依据、结论是否强于数据;**没有外部素材时只能判\"无法核实\",不得报绿**。该工具**只汇总材料、不做判定、不构成门禁**(旧版 grounded/unmapped 状态与跨页数字分组已废除)。制作进程中**供用户看稿优先用 ppt_preview(dir)**(返回同源预览链接,用户点击即看,附在交付信息里);导出前/后均可预览。**修改既有精美 PPT 的某一页(edit/augment 高频场景)**:ppt_import 参考层读真身 → 改工作区页并审阅清零 → **`ppt_splice`**(只把该页替换进原稿:保留源母版横幅/页脚/备注关系/媒体,其余页条目 SHA256 逐字节一致——不要整册近似重渲伤及其他页)→ 交付整册副本;用户要\"单页独立版\"再 **`ppt_slice`**;抽查该页观感用 **`ppt_visual pages=N`**(按页真渲染,不必整册);\"看起来就是模板原样\"用 `ppt_patch`(手术贴模板)。",
|
|
114
116
|
"8. 版式系统(审美基线,用户风格优先):写页面之前先定版式规则——默认基线:8px 网格对齐、3-4 级字号阶梯、4-5 色主题(只在 $theme 内取色)、统一间距节奏(8/16/24px)、左右外边界一致、构图重心居中;**用户对风格有要求(字体/字号/配色/密度)一律优先,默认基线仅为未指定时的风格参考**。文字:短句化(每块 ≤60 字为默认参考,可依内容放宽),**文本最小字号以用户指令为准**(hardConstraints;未给下限不设强制),长句在语义断点显式 \\\\n 换行。",
|
|
115
117
|
"9. 审美建议(ppt_verify 输出的 [·] 建议)不是门禁,但请逐条斟酌采纳;overlap/out-of-page/text-overflow 错误仍必须清零(审美改进不得引入元素区块冲突)。",
|
|
116
|
-
"10. 引擎:**PPT 制作唯一通道 = pptd**(`deck.yaml` + `pages/*.yaml
|
|
118
|
+
"10. 引擎:**PPT 制作唯一通道 = pptd**(`deck.yaml` + `pages/*.yaml`;**图表默认原生可编辑**:图表部件 + 内嵌数据工作簿,`chart.render: vector` 可回到矢量拼绘)。pptd 硬失败时自动回退 python-pptx(报告醒目标注降级;其图表同为**原生可编辑图表 + 内嵌数据工作簿**);python-pptx 仅用户显式指定时使用。**不要**用 python-pptx 或官方 `office-pptx` 技能从零拼版来绕过本工作流的门禁——它们只适合**读取**既有 pptx、或作为上面的兜底(能不能用由 `ppt_state` 的 `capabilities` 如实报告)。除非用户要求,不要自行切换引擎。",
|
|
117
119
|
"11. 质量档 audit(/ppt quality audit,从严门禁):禁 autoDeclare(工具已拦);每页必须 ppt_shot + 读图视觉审阅(无读图能力则降级结构 Lint 并在交付说明标注\"未经视觉审阅\");导出报告必须包含并核对 audit 回读断言(页数/尺寸/最小字号 ≥ minFontSize);有 Office 时导出后自动 **Office 真渲染**(成品视觉审核,逐页 read_image);交付说明含素材来源与数据脱敏/假设标注。",
|
|
118
|
-
"12. **真渲染抽检铁律(P1 事故教训)**:有 Office 时,真渲染抽查**必须覆盖所有含 table/chart/image/custGeom 的页**(每类至少一页,其余页轮换)——不要只挑\"美观重点页\";抽查后逐页 read_image(渲染图已带 1px=1pt 比例标注水印,降低坐标误判)。导出报告会给出建议覆盖页清单(P8 行)。"
|
|
120
|
+
"12. **真渲染抽检铁律(P1 事故教训)**:有 Office 时,真渲染抽查**必须覆盖所有含 table/chart/image/custGeom 的页**(每类至少一页,其余页轮换)——不要只挑\"美观重点页\";抽查后逐页 read_image(渲染图已带 1px=1pt 比例标注水印,降低坐标误判)。导出报告会给出建议覆盖页清单(P8 行)。",
|
|
121
|
+
"13. **改既有 PPT 的两条纪律**:① **就地手术优先**——任务若是\"改某几页 / 改一处文字 / 换一张图\",优先 `ppt_splice`(把工作区某一页替换进原稿,**其余页逐字节不变**;用户要\"单页独立版\"用 `ppt_slice`;要\"看起来就是模板原样\"用 `ppt_patch`),不要图省事整册重渲。`ppt_import` 会给出**页码/元素级**的\"无法保真特性\"清单(工程内 `loss-audit.json` + 一行结论),并按 ✓/⚠/ℹ 三档区分:✓ 干净、⚠ 有会丢的可见特性(动画/阴影/超链接/切换/SmartArt/EMF 等)、ℹ 仅主题样式表里的渐变模板未被引用(不影响观感);**⚠ 命中时\"只改某几页\"必须走 `ppt_splice`,并在交付说明里写明\"整册重渲会丢 <类别 N 处>\"**。② **Excel 素材的数字要么重算、要么标注**:从 xlsx 取数时公式的缓存值可能陈旧或缺失;探测到捆绑 LibreOffice kit 就用它的 `recalculate` 重算,做不到时必须在交付说明里写明\"公式值未重算(可能陈旧)\",别把旧缓存值当已核对的数据。"
|
|
119
122
|
]
|
|
120
123
|
},
|
|
121
124
|
{
|
|
@@ -152,9 +155,10 @@
|
|
|
152
155
|
"7. 交付前:S4 全通过 + S6 导出 .pptx + 交付说明(素材来源、未视觉审阅项、修改指引)。**内容审阅(M3 重写 2026-09-18)**:有具体数字/事实主张的稿子,交付前用 `ppt_crosscheck` 生成「审阅材料包」(全页正文 + 素材清单 + 审阅协议)→ 再按协议做一次内容审阅:**默认用独立子代理**(全新上下文、只给材料包与素材文件;**用户明确禁止子代理时改自审并标注「自审(同上下文)」**),逐条判\"一致 / 冲突 / 无来源支撑 / 无法核实\",重点核对同一指标跨页值是否一致、数字是否有依据、结论是否强于数据;**没有外部素材时只能判\"无法核实\",不得报绿**。该工具**只汇总材料、不做判定、不构成门禁**(旧版 grounded/unmapped 状态与跨页数字分组已废除)。制作进程中**供用户看稿优先用 ppt_preview(dir)**(返回同源预览链接,用户点击即看,附在交付信息里);导出前/后均可预览。**修改既有精美 PPT 的某一页(edit/augment 高频场景)**:ppt_import 参考层读真身 → 改工作区页并审阅清零 → **`ppt_splice`**(只把该页替换进原稿:保留源母版横幅/页脚/备注关系/媒体,其余页条目 SHA256 逐字节一致——不要整册近似重渲伤及其他页)→ 交付整册副本;用户要\"单页独立版\"再 **`ppt_slice`**;抽查该页观感用 **`ppt_visual pages=N`**(按页真渲染,不必整册);\"看起来就是模板原样\"用 `ppt_patch`(手术贴模板)。",
|
|
153
156
|
"8. 版式系统(审美基线,用户风格优先):写页面之前先定版式规则——默认基线:8px 网格对齐、3-4 级字号阶梯、4-5 色主题(只在 $theme 内取色)、统一间距节奏(8/16/24px)、左右外边界一致、构图重心居中;**用户对风格有要求(字体/字号/配色/密度)一律优先,默认基线仅为未指定时的风格参考**。文字:短句化(每块 ≤60 字为默认参考,可依内容放宽),**文本最小字号以用户指令为准**(hardConstraints;未给下限不设强制),长句在语义断点显式 \\\\n 换行。",
|
|
154
157
|
"9. 审美建议(ppt_verify 输出的 [·] 建议)不是门禁,但请逐条斟酌采纳;overlap/out-of-page/text-overflow 错误仍必须清零(审美改进不得引入元素区块冲突)。",
|
|
155
|
-
"10. 引擎:**PPT 制作唯一通道 = pptd**(`deck.yaml` + `pages/*.yaml
|
|
158
|
+
"10. 引擎:**PPT 制作唯一通道 = pptd**(`deck.yaml` + `pages/*.yaml`;**图表默认原生可编辑**:图表部件 + 内嵌数据工作簿,`chart.render: vector` 可回到矢量拼绘)。pptd 硬失败时自动回退 python-pptx(报告醒目标注降级;其图表同为**原生可编辑图表 + 内嵌数据工作簿**);python-pptx 仅用户显式指定时使用。**不要**用 python-pptx 或官方 `office-pptx` 技能从零拼版来绕过本工作流的门禁——它们只适合**读取**既有 pptx、或作为上面的兜底(能不能用由 `ppt_state` 的 `capabilities` 如实报告)。除非用户要求,不要自行切换引擎。",
|
|
156
159
|
"11. 质量档 audit(/ppt quality audit,从严门禁):禁 autoDeclare(工具已拦);每页必须 ppt_shot + 读图视觉审阅(无读图能力则降级结构 Lint 并在交付说明标注\"未经视觉审阅\");导出报告必须包含并核对 audit 回读断言(页数/尺寸/最小字号 ≥ minFontSize);有 Office 时导出后自动 **Office 真渲染**(成品视觉审核,逐页 read_image);交付说明含素材来源与数据脱敏/假设标注。",
|
|
157
|
-
"12. **真渲染抽检铁律(P1 事故教训)**:有 Office 时,真渲染抽查**必须覆盖所有含 table/chart/image/custGeom 的页**(每类至少一页,其余页轮换)——不要只挑\"美观重点页\";抽查后逐页 read_image(渲染图已带 1px=1pt 比例标注水印,降低坐标误判)。导出报告会给出建议覆盖页清单(P8 行)。"
|
|
160
|
+
"12. **真渲染抽检铁律(P1 事故教训)**:有 Office 时,真渲染抽查**必须覆盖所有含 table/chart/image/custGeom 的页**(每类至少一页,其余页轮换)——不要只挑\"美观重点页\";抽查后逐页 read_image(渲染图已带 1px=1pt 比例标注水印,降低坐标误判)。导出报告会给出建议覆盖页清单(P8 行)。",
|
|
161
|
+
"13. **改既有 PPT 的两条纪律**:① **就地手术优先**——任务若是\"改某几页 / 改一处文字 / 换一张图\",优先 `ppt_splice`(把工作区某一页替换进原稿,**其余页逐字节不变**;用户要\"单页独立版\"用 `ppt_slice`;要\"看起来就是模板原样\"用 `ppt_patch`),不要图省事整册重渲。`ppt_import` 会给出**页码/元素级**的\"无法保真特性\"清单(工程内 `loss-audit.json` + 一行结论),并按 ✓/⚠/ℹ 三档区分:✓ 干净、⚠ 有会丢的可见特性(动画/阴影/超链接/切换/SmartArt/EMF 等)、ℹ 仅主题样式表里的渐变模板未被引用(不影响观感);**⚠ 命中时\"只改某几页\"必须走 `ppt_splice`,并在交付说明里写明\"整册重渲会丢 <类别 N 处>\"**。② **Excel 素材的数字要么重算、要么标注**:从 xlsx 取数时公式的缓存值可能陈旧或缺失;探测到捆绑 LibreOffice kit 就用它的 `recalculate` 重算,做不到时必须在交付说明里写明\"公式值未重算(可能陈旧)\",别把旧缓存值当已核对的数据。"
|
|
158
162
|
]
|
|
159
163
|
},
|
|
160
164
|
{
|
|
@@ -191,9 +195,10 @@
|
|
|
191
195
|
"7. 交付前:S4 全通过 + S6 导出 .pptx + 交付说明(素材来源、未视觉审阅项、修改指引)。**内容审阅(M3 重写 2026-09-18)**:有具体数字/事实主张的稿子,交付前用 `ppt_crosscheck` 生成「审阅材料包」(全页正文 + 素材清单 + 审阅协议)→ 再按协议做一次内容审阅:**默认用独立子代理**(全新上下文、只给材料包与素材文件;**用户明确禁止子代理时改自审并标注「自审(同上下文)」**),逐条判\"一致 / 冲突 / 无来源支撑 / 无法核实\",重点核对同一指标跨页值是否一致、数字是否有依据、结论是否强于数据;**没有外部素材时只能判\"无法核实\",不得报绿**。该工具**只汇总材料、不做判定、不构成门禁**(旧版 grounded/unmapped 状态与跨页数字分组已废除)。制作进程中**供用户看稿优先用 ppt_preview(dir)**(返回同源预览链接,用户点击即看,附在交付信息里);导出前/后均可预览。**修改既有精美 PPT 的某一页(edit/augment 高频场景)**:ppt_import 参考层读真身 → 改工作区页并审阅清零 → **`ppt_splice`**(只把该页替换进原稿:保留源母版横幅/页脚/备注关系/媒体,其余页条目 SHA256 逐字节一致——不要整册近似重渲伤及其他页)→ 交付整册副本;用户要\"单页独立版\"再 **`ppt_slice`**;抽查该页观感用 **`ppt_visual pages=N`**(按页真渲染,不必整册);\"看起来就是模板原样\"用 `ppt_patch`(手术贴模板)。",
|
|
192
196
|
"8. 版式系统(审美基线,用户风格优先):写页面之前先定版式规则——默认基线:8px 网格对齐、3-4 级字号阶梯、4-5 色主题(只在 $theme 内取色)、统一间距节奏(8/16/24px)、左右外边界一致、构图重心居中;**用户对风格有要求(字体/字号/配色/密度)一律优先,默认基线仅为未指定时的风格参考**。文字:短句化(每块 ≤60 字为默认参考,可依内容放宽),**文本最小字号以用户指令为准**(hardConstraints;未给下限不设强制),长句在语义断点显式 \\\\n 换行。",
|
|
193
197
|
"9. 审美建议(ppt_verify 输出的 [·] 建议)不是门禁,但请逐条斟酌采纳;overlap/out-of-page/text-overflow 错误仍必须清零(审美改进不得引入元素区块冲突)。",
|
|
194
|
-
"10. 引擎:**PPT 制作唯一通道 = pptd**(`deck.yaml` + `pages/*.yaml
|
|
198
|
+
"10. 引擎:**PPT 制作唯一通道 = pptd**(`deck.yaml` + `pages/*.yaml`;**图表默认原生可编辑**:图表部件 + 内嵌数据工作簿,`chart.render: vector` 可回到矢量拼绘)。pptd 硬失败时自动回退 python-pptx(报告醒目标注降级;其图表同为**原生可编辑图表 + 内嵌数据工作簿**);python-pptx 仅用户显式指定时使用。**不要**用 python-pptx 或官方 `office-pptx` 技能从零拼版来绕过本工作流的门禁——它们只适合**读取**既有 pptx、或作为上面的兜底(能不能用由 `ppt_state` 的 `capabilities` 如实报告)。除非用户要求,不要自行切换引擎。",
|
|
195
199
|
"11. 质量档 audit(/ppt quality audit,从严门禁):禁 autoDeclare(工具已拦);每页必须 ppt_shot + 读图视觉审阅(无读图能力则降级结构 Lint 并在交付说明标注\"未经视觉审阅\");导出报告必须包含并核对 audit 回读断言(页数/尺寸/最小字号 ≥ minFontSize);有 Office 时导出后自动 **Office 真渲染**(成品视觉审核,逐页 read_image);交付说明含素材来源与数据脱敏/假设标注。",
|
|
196
|
-
"12. **真渲染抽检铁律(P1 事故教训)**:有 Office 时,真渲染抽查**必须覆盖所有含 table/chart/image/custGeom 的页**(每类至少一页,其余页轮换)——不要只挑\"美观重点页\";抽查后逐页 read_image(渲染图已带 1px=1pt 比例标注水印,降低坐标误判)。导出报告会给出建议覆盖页清单(P8 行)。"
|
|
200
|
+
"12. **真渲染抽检铁律(P1 事故教训)**:有 Office 时,真渲染抽查**必须覆盖所有含 table/chart/image/custGeom 的页**(每类至少一页,其余页轮换)——不要只挑\"美观重点页\";抽查后逐页 read_image(渲染图已带 1px=1pt 比例标注水印,降低坐标误判)。导出报告会给出建议覆盖页清单(P8 行)。",
|
|
201
|
+
"13. **改既有 PPT 的两条纪律**:① **就地手术优先**——任务若是\"改某几页 / 改一处文字 / 换一张图\",优先 `ppt_splice`(把工作区某一页替换进原稿,**其余页逐字节不变**;用户要\"单页独立版\"用 `ppt_slice`;要\"看起来就是模板原样\"用 `ppt_patch`),不要图省事整册重渲。`ppt_import` 会给出**页码/元素级**的\"无法保真特性\"清单(工程内 `loss-audit.json` + 一行结论),并按 ✓/⚠/ℹ 三档区分:✓ 干净、⚠ 有会丢的可见特性(动画/阴影/超链接/切换/SmartArt/EMF 等)、ℹ 仅主题样式表里的渐变模板未被引用(不影响观感);**⚠ 命中时\"只改某几页\"必须走 `ppt_splice`,并在交付说明里写明\"整册重渲会丢 <类别 N 处>\"**。② **Excel 素材的数字要么重算、要么标注**:从 xlsx 取数时公式的缓存值可能陈旧或缺失;探测到捆绑 LibreOffice kit 就用它的 `recalculate` 重算,做不到时必须在交付说明里写明\"公式值未重算(可能陈旧)\",别把旧缓存值当已核对的数据。"
|
|
197
202
|
]
|
|
198
203
|
},
|
|
199
204
|
{
|
|
@@ -212,7 +217,7 @@
|
|
|
212
217
|
"4. 页数:≤8 页(用户指定除外);每页文本精简(每块 ≤40 字为默认参考,用户要求可放宽)。",
|
|
213
218
|
"5. 审阅:ppt_render + ppt_verify 必跑——内容互压/出界/文本溢出/预期外重叠(设计意图声明制)必须清零;出界分级同标准模式(超页面不可声明;安全区外有意元素逐项加 expectedOutOfSafeArea);autoDeclare 后附一句意图说明;跳过截图视觉审阅与美学迭代。",
|
|
214
219
|
"6. 交付:ppt_export(引擎 auto=pptd)→ 交付说明标注\"快速模式:未经视觉审阅\"。",
|
|
215
|
-
"7. 引擎:auto 默认 = pptd
|
|
220
|
+
"7. 引擎:auto 默认 = pptd(自研主引擎;**图表默认原生可编辑**:图表部件 + 内嵌数据工作簿,`chart.render: vector` 可回到矢量拼绘);python-pptx 仅显式指定或 pptd 失败时使用(其图表同为原生可编辑图表 + 内嵌数据工作簿)。不要自行切换引擎。",
|
|
216
221
|
"8. 用户明确要求始终优先;回到完整模式:/ppt normal。"
|
|
217
222
|
]
|
|
218
223
|
},
|
|
@@ -232,7 +237,7 @@
|
|
|
232
237
|
"4. 页数:≤8 页(用户指定除外);每页文本精简(每块 ≤40 字为默认参考,用户要求可放宽)。",
|
|
233
238
|
"5. 审阅:ppt_render + ppt_verify 必跑——内容互压/出界/文本溢出/预期外重叠(设计意图声明制)必须清零;出界分级同标准模式(超页面不可声明;安全区外有意元素逐项加 expectedOutOfSafeArea);autoDeclare 后附一句意图说明;跳过截图视觉审阅与美学迭代。",
|
|
234
239
|
"6. 交付:ppt_export(引擎 auto=pptd)→ 交付说明标注\"快速模式:未经视觉审阅\"。",
|
|
235
|
-
"7. 引擎:auto 默认 = pptd
|
|
240
|
+
"7. 引擎:auto 默认 = pptd(自研主引擎;**图表默认原生可编辑**:图表部件 + 内嵌数据工作簿,`chart.render: vector` 可回到矢量拼绘);python-pptx 仅显式指定或 pptd 失败时使用(其图表同为原生可编辑图表 + 内嵌数据工作簿)。不要自行切换引擎。",
|
|
236
241
|
"8. 用户明确要求始终优先;回到完整模式:/ppt normal。"
|
|
237
242
|
]
|
|
238
243
|
},
|
|
@@ -252,7 +257,7 @@
|
|
|
252
257
|
"4. 页数:≤8 页(用户指定除外);每页文本精简(每块 ≤40 字为默认参考,用户要求可放宽)。",
|
|
253
258
|
"5. 审阅:ppt_render + ppt_verify 必跑——内容互压/出界/文本溢出/预期外重叠(设计意图声明制)必须清零;出界分级同标准模式(超页面不可声明;安全区外有意元素逐项加 expectedOutOfSafeArea);autoDeclare 后附一句意图说明;跳过截图视觉审阅与美学迭代。",
|
|
254
259
|
"6. 交付:ppt_export(引擎 auto=pptd)→ 交付说明标注\"快速模式:未经视觉审阅\"。",
|
|
255
|
-
"7. 引擎:auto 默认 = pptd
|
|
260
|
+
"7. 引擎:auto 默认 = pptd(自研主引擎;**图表默认原生可编辑**:图表部件 + 内嵌数据工作簿,`chart.render: vector` 可回到矢量拼绘);python-pptx 仅显式指定或 pptd 失败时使用(其图表同为原生可编辑图表 + 内嵌数据工作簿)。不要自行切换引擎。",
|
|
256
261
|
"8. 用户明确要求始终优先;回到完整模式:/ppt normal。"
|
|
257
262
|
]
|
|
258
263
|
},
|
|
@@ -272,7 +277,7 @@
|
|
|
272
277
|
"4. 页数:≤8 页(用户指定除外);每页文本精简(每块 ≤40 字为默认参考,用户要求可放宽)。",
|
|
273
278
|
"5. 审阅:ppt_render + ppt_verify 必跑——内容互压/出界/文本溢出/预期外重叠(设计意图声明制)必须清零;出界分级同标准模式(超页面不可声明;安全区外有意元素逐项加 expectedOutOfSafeArea);autoDeclare 后附一句意图说明;跳过截图视觉审阅与美学迭代。",
|
|
274
279
|
"6. 交付:ppt_export(引擎 auto=pptd)→ 交付说明标注\"快速模式:未经视觉审阅\"。",
|
|
275
|
-
"7. 引擎:auto 默认 = pptd
|
|
280
|
+
"7. 引擎:auto 默认 = pptd(自研主引擎;**图表默认原生可编辑**:图表部件 + 内嵌数据工作簿,`chart.render: vector` 可回到矢量拼绘);python-pptx 仅显式指定或 pptd 失败时使用(其图表同为原生可编辑图表 + 内嵌数据工作簿)。不要自行切换引擎。",
|
|
276
281
|
"8. 用户明确要求始终优先;回到完整模式:/ppt normal。"
|
|
277
282
|
]
|
|
278
283
|
},
|
|
@@ -292,7 +297,7 @@
|
|
|
292
297
|
"4. 页数:≤8 页(用户指定除外);每页文本精简(每块 ≤40 字为默认参考,用户要求可放宽)。",
|
|
293
298
|
"5. 审阅:ppt_render + ppt_verify 必跑——内容互压/出界/文本溢出/预期外重叠(设计意图声明制)必须清零;出界分级同标准模式(超页面不可声明;安全区外有意元素逐项加 expectedOutOfSafeArea);autoDeclare 后附一句意图说明;跳过截图视觉审阅与美学迭代。",
|
|
294
299
|
"6. 交付:ppt_export(引擎 auto=pptd)→ 交付说明标注\"快速模式:未经视觉审阅\"。",
|
|
295
|
-
"7. 引擎:auto 默认 = pptd
|
|
300
|
+
"7. 引擎:auto 默认 = pptd(自研主引擎;**图表默认原生可编辑**:图表部件 + 内嵌数据工作簿,`chart.render: vector` 可回到矢量拼绘);python-pptx 仅显式指定或 pptd 失败时使用(其图表同为原生可编辑图表 + 内嵌数据工作簿)。不要自行切换引擎。",
|
|
296
301
|
"8. 用户明确要求始终优先;回到完整模式:/ppt normal。"
|
|
297
302
|
]
|
|
298
303
|
}
|
|
@@ -461,22 +461,37 @@ check('负对照(c) 图表部件缺失 ⇒ 计数判据必须红(chartsOut < c
|
|
|
461
461
|
|
|
462
462
|
// ── 8. 回归:不含图表的工程产物**零变化** ────────────────────────────────────
|
|
463
463
|
// 用户拍板的取舍里有一条:**其他绘图(text/shape/line/image/table/custGeom)保持不变**。
|
|
464
|
-
// 判据最硬的一档 =
|
|
464
|
+
// 判据最硬的一档 = 拿**原生图表之前**的导出器跑同一个(无图表)工程,产物**逐部件**比对(只有 core.xml 的时间戳除外)。
|
|
465
465
|
// 关系编号(媒体/讲稿/图表)是我这轮动过的地方,正需要这条挡住"加图表把 rId 排错"的回归。
|
|
466
|
-
|
|
466
|
+
// ⚠ 2026-09-26 Lead 修复:原实现取 `HEAD:src/pptd/*` 只复制 4 个文件——一旦 HEAD 变成"已含本轮改动"的提交,
|
|
467
|
+
// ① 对照失去意义(新 vs 新),② 复制出来的 svgCharts.js 会 import 未被复制的 ./schema.js ⇒ ERR_MODULE_NOT_FOUND 崩溃。
|
|
468
|
+
// 现在改成:从"原生图表之前的参照提交"取**整棵 src/**(相对 import 全部可解析),并有明确的回落链与跳过语义。
|
|
469
|
+
h('8. 回归:不含图表的工程产物逐部件零变化(对照"原生图表之前"的导出器)')
|
|
467
470
|
{
|
|
468
471
|
const oldDir = join(WORK, 'old-src')
|
|
469
|
-
const
|
|
470
|
-
let
|
|
471
|
-
for (const
|
|
472
|
-
const r = spawnSync('git', ['-C', root, '
|
|
473
|
-
if (r.status
|
|
474
|
-
|
|
475
|
-
|
|
472
|
+
const refs = [process.env.PPT_OLD_EXPORT_REF, 'eb1e6f8', 'v1.1.2', 'HEAD~1'].filter(Boolean)
|
|
473
|
+
let ref = null
|
|
474
|
+
for (const cand of refs) {
|
|
475
|
+
const r = spawnSync('git', ['-C', root, 'cat-file', '-e', `${cand}^{commit}`], { encoding: 'utf8' })
|
|
476
|
+
if (r.status === 0) { ref = cand; break }
|
|
477
|
+
}
|
|
478
|
+
let extracted = false
|
|
479
|
+
if (ref !== null) {
|
|
480
|
+
const list = spawnSync('git', ['-C', root, 'ls-tree', '-r', '--name-only', ref, 'src'], { encoding: 'utf8', maxBuffer: 20 * 1024 * 1024 })
|
|
481
|
+
const files = String(list.stdout ?? '').trim().split('\n').filter(Boolean)
|
|
482
|
+
extracted = list.status === 0 && files.length > 0
|
|
483
|
+
for (const f of files) {
|
|
484
|
+
const r = spawnSync('git', ['-C', root, 'show', `${ref}:${f}`], { maxBuffer: 32 * 1024 * 1024 })
|
|
485
|
+
if (r.status !== 0) { extracted = false; break }
|
|
486
|
+
const rel = f.replace(/^src\//, '')
|
|
487
|
+
mkdirSync(join(oldDir, dirname(rel)), { recursive: true })
|
|
488
|
+
writeFileSync(join(oldDir, rel), r.stdout)
|
|
489
|
+
}
|
|
476
490
|
}
|
|
477
491
|
if (!extracted) {
|
|
478
|
-
check('
|
|
492
|
+
check(`回归对照:参照提交的 src/ 可取得(尝试 ${refs.join(' → ')};无 git/无该提交 ⇒ 跳过,不计 FAIL)`, true, '未取得参照,跳过逐部件对照')
|
|
479
493
|
} else {
|
|
494
|
+
check(`回归对照:参照版本 = ${ref}(整棵 src/ 已取出,相对 import 可解析)`, true, `文件数 = 已复制`)
|
|
480
495
|
// 无图表的工程:文本 / 表格 / 形状 / 连线 / 图片 / 讲稿(覆盖媒体 rId + 讲稿 rId 两条编号路径)
|
|
481
496
|
const noChart = join(WORK, 'no-chart')
|
|
482
497
|
mkdirSync(join(noChart, 'pages'), { recursive: true })
|