流程文档流水线(process-doc-pipeline)
一条流水线覆盖流程文档的两类生产任务:从 .epros 流程图生成《流程发布文档》,或把既有文档按规范/模板对齐格式。两者共用同一套 DLP 通道层、备份快照、终验与留痕机制。
0. 先分诊:走哪条链
| 用户意图 | 走哪条链 | 判据 |
|---|---|---|
给定 .epros,要输出/重写《流程发布文档》 |
生成链 | paths.epros_files 非空 |
| 给定既有文档 + 规范/模板,要统一版式 | 对齐链 | paths.target_files 非空、无 .epros |
给定 .epros(+ 配套文档),要查连线逻辑/规范并整改 |
复核链(§10D,23 条判据) | 用户语含「复核/检查/排查/问题清单/整改」,且要求判缺陷而非生成 |
| 先按流程图生成、再对生成稿做一次版式终检 | both |
两者皆非空 |
| 仅诊断不改动 | 任一条链的只读阶段 | scope 全关 + 不进入执行步 |
| 需要改写/润色/增删文字 | ❌ 不适用 | 走文档创作类技能 |
从零新建(无 .epros、无模板) |
❌ 不适用 | 走文档生成类技能 |
| 仅 docx↔pdf 格式转换 | ❌ 不适用 | 走转换类技能 |
模式由 task.mode 控制:auto | generate | align | review | both。auto 时按 paths 与意图判定。
复核链与另两条共用同一底座(备份快照 / 终验 / 交付留痕),区别是:产物不是新文档,而是「改回 .epros + 出问题清单」,且必须先出清单、再执行整改(先诊断后动手,§10D D3)。
1. 架构:两条链 + 共享底座
┌──────────────── 共享底座 ────────────────┐
│ DLP 通道层(dlp_channel) │ 备份+MDS 快照 │
│ 参数配置块(唯一覆写入口) │ 终验 + 交付留痕 │
└──────────────────────────────────────────┘
│
┌────────────────────────────┴────────────────────────────┐
│ │
【生成链 generate】 【对齐链 align】
Phase A 解析 .epros(探针 + 泳道 + 连线) Phase B 基准萃取(规范 + 模板实测)
Phase C-G 按模板生成 docx Phase C-A 逐维度对齐格式
│ │
└──────────────────────► Phase D 统一终验 ◄────────────────┘
│
Phase E 交付与留痕
核心区别:
| 维度 | 生成链 | 对齐链 |
|---|---|---|
| 输入 | .epros XML |
既有 Office 文档 |
| 文字 | 新建(来自流程图节点) | 零改动(硬约束) |
| 基准 | 模板 preset / template_file |
spec_file + template_file |
| 主产出 | 《流程发布文档》docx | 版式对齐后的同一批文档 |
| 专属校验 | G 系列(节点守恒) | V 系列(文字 diff/格式抽验) |
2. 参数配置块(唯一覆写入口)
所有具体值集中在 config.template.yaml,正文只引用变量名,禁止散落硬编码。
cp config.template.yaml config.yaml # 复制后填写
python scripts/check_config.py config.yaml --strict
关键键组:
| 键组 | 作用 |
|---|---|
task.mode |
分诊结果(auto/generate/align/both) |
paths.* |
epros 源、规范、模板、目标文档、输出/备份/快照目录 |
channel.* |
通道模式、解释器、COM ProgID、保存策略 |
scope.* |
对齐维度开关(仅 align/both 生效) |
generate.* |
模板 preset、章节骨架、内容口径、编号规则 |
epros.values |
Phase A 实测回填(画布/泳道/节点数/期望行数/根元数据) |
spec_values |
Phase B 实测回填(字体/页边距/边框/加粗/颜色等生效值) |
approved_changes |
仅此处列出的结构变更才允许执行 |
validation.* |
终验判据 + 生成链专属校验开关 |
回填纪律:epros.values 与 spec_values 必须由实测回填,禁止推导或凭记忆填写;未回填即中止。
2A. 能力矩阵(索引 · 2026-11-05)
> 权威表见 references/capability-matrix.md(5 域 27 项,含定义 / 覆盖范围 / 对应流程环节 / 填写规范 / 开源对照)。本节只放索引,避免双事实源。
| 域 | 能力项 | 对应工件 | 对应流程环节 |
|---|---|---|---|
| A 流程图 | A1 结构解析 · A2 规格驱动生成 · A3 高保真重建 · A4 语义级差异比对 · A5 元素类型裁决 · A6 连线逻辑复核(23 条) · A7 文本级手术 · A8 网关必要性审核 · A9 多角色副本与协作框 · A10 几何与连通性校验 | .epros + PNG |
第 7 章 |
| B 流程文件 | B1 12 章骨架生成 · B2 版式对齐(V1.2) · B3 表格与题注 · B4 目录与分页 · B5 图文一致性 · B6 明文审计通道 | 12 章 .docx/.md |
第 1–12 章 |
| C 流程附表 | C1 目录与编号 · C2 骨架与分区 · C3 网格纪律 · C4 字段与正文对应 | 配套表单 .xlsx |
第 11 章的实物化 |
| D 跨工件 | D1 编号三处对齐 · D2 支持文件↔附表 · D3 三级差异分类 | 一致性报告 / 作业单 | 第 7/8/11 章交叉 |
| E 底座 | E1 DLP 通道 · E2 备份回滚 · E3 终验留痕 · E4 四条红线 | 通道 / 快照 / 校验单 | 全流程 |
一句话口径:A 域管"图像不像、通不通",B 域管"版式正不正、章齐不齐",C 域管"表填不填得下",D 域管"三件对不对得上",E 域管"改得安不安全"。
开源对照采纳纪律(详见 capability-matrix §八):bpmnlint(规则可插拔+严重级)、bpmn-moddle(未知属性透传→不重序列化)、bpmn-auto-layout(缺 DI 自动补布局)为机制借鉴;pm4py(AGPL-3.0)、drawio(GPL-3.0)一票否决不集成,只读方法。
待补 3 项(capability-matrix §九):判据「严重级 + 阻断开关」未成列;折线重算未独立成 CLI 子命令;三方对齐表(图/文/表同轴)无固定模板。
3. 执行流程
> 每步格式:输入 → 操作 → 输出 → 门禁。任一步门禁不通过则中止并回报,不得跳步。
Phase 0 · 环境与通道预检(两链共用)
| 项 | 内容 |
|---|---|
| 输入 | paths 下全部参与文件 |
| 操作 | ① 校验路径存在且扩展名受支持;② 探测 DLP 加密态(读文件头 1KB);③ 加密 → 切白名单通道,并选择唯一通道(禁止同步骤双通道操作同一文件);④ 探测白名单应用可用性 |
| 命令 | python scripts/dlp_channel.py <files...> [--mode auto] |
| 输出 | 通道选择结论 + 理由 + 环境探测日志 |
| 门禁 | 存在不以只读方式打开的写操作 → 中止;双通道并行 → 中止 |
文件头判据见 references/docx-com-recipes.md §1.1。
生成链
Phase A · 解析 .epros
| 项 | 内容 |
|---|---|
| 输入 | paths.epros_files |
| 操作 | ① 解析根元素 workflowInfo 及其业务属性;② 提取图形/连线;③ 泳道带推导;④ DottedRect 双分支判定;⑤ 统计分支点/汇合点/悬空边/自环/无文本节点 |
| 命令 | python scripts/epros_probe.py <file.epros> --json probe.json |
| 输出 | 节点清单 / 连线清单 / 泳道表 / expected_rows / 待人工确认清单 |
| 门禁 | expected_rows 未算出 → 中止;出现悬空边或自环 → 列入待确认但可继续 |
解析约定(FigureType 分布、泳道空带陷阱、DottedRect 双重语义)见 references/epros-format.md。
EPROS 客户端打开兼容性(2026-10-13 实测排障,「打开异常」根因库)——生成/改写 .epros 后客户端报「打开异常」时逐项排查:
| 根因 | 症状/堆栈 | 修法 |
|---|---|---|
| 整数属性写成小数(最高频) | NumberFormatException: For input string: "130.0" @ gainFiguresDate(Integer.parseInt) |
Width/Height/FontSize/OrderIndex/LineSize/BodyLine/... 一律整数字符串;仅 PoLongx/PoLongy 与 lineSegments 坐标可小数 |
| ActivityId 为空/重复 | 活动表按 ActivityId 建索引,空值重复即抛 | 每个活动 RoundRectWithLine/Rhombus 填非空唯一 ActivityId(原生件如 jzdsfx-1) |
<figures> 子元素后置 |
洞察:客户端按文档顺序解析,figures 在 ParallelLines/VerticalLines/manhattanLines 之后即异常 |
全部 <figures> 前置于连线元素 |
FigureType 值错误 |
VerticalLines 应为单数 VerticalLine |
竖线 FigureType 用 VerticalLine |
OrderIndex 重复 |
全文件 figures OrderIndex 重复为 "1" | 全局唯一(客户端保存时会自动重编,勿依赖其值做标识) |
| DottedRect 样式缺省 | BodyLine="2"(虚线型)、ShadowColor="187,187,187" |
按原生件补值 |
排障方法:读 D:\EPROS-M\epros_log\epros_log.txt 取真实堆栈(比试错快);用最小探针二分定位(标题+泳道+1角色+1活动+1连线 能开 → 逐项加特征)。
序号呈现规范(2026-10-14 实测,用户定稿)——EPROS 客户端活动框为双层结构:顶栏渲染 ActivityId、正文渲染 FigureText。流程序号(010/020/…,源文档活动表编号)必须放在顶栏:
| 字段 | 取值 | 客户端呈现 |
|---|---|---|
ActivityId |
流程序号(三位,如 010) |
顶栏显示序号 |
FigureText |
纯活动名称(无序号前缀) | 正文干净 |
- 勿把序号写进 FigureText 前缀(如 "010 调研任务接收…")——会与顶栏并存形成双序号冲突;序号只进 ActivityId。
- 协作框双副本顶栏同号(如两个 050):主责/参与副本共用同一逻辑序号。
- 序号取源:源文档(V1.1 活动表「编号」列)为准,间隔 10(010/020/…);先核对源文档编号再改,不得自造编号体系。
- 渲染器同步:PNG 渲染顶栏序号读
ActivityId(而非 FigureText 前缀),正文读FigureText。
Phase C-G · 按模板生成 docx
| 项 | 内容 |
|---|---|
| 输入 | Phase A 结构数据 + template_profile + 可选 template_file |
| 操作 | ① 分节建立版式(纵向→横向→纵向);② 按模板基准 §模板基准(9.25)逐章写入;③ 插入重建流程图;④ 域刷新 |
| 输出 | 《流程发布文档》docx + 生成日志 |
| 门禁 | 活动行数 ≠ expected_rows → 停止并复核;章节骨架/表格列头与基准不一致 → 停止并复核 |
版面与字体规范、四个 COM 必踩坑、保存策略见 references/docx-com-recipes.md。
模板基准(V1.1 现行 / 9.25 历史,2026-10-16 更新)
> 现行基准(2026-10-16 用户改指定,取代 9.25):产品市场信息调研分析流程-V1.1.docx + 竞争对手产品分析流程-V1.1.docx(两份实测格式 100% 同构)。
> 历史基准:流程打样/9.25/2.1.1…docx + 2.1.2…docx(仅版本溯源用,版式口径已作废)。
> 编制要求(《恒泰-EPROS操作标准化-V1.0》「基本属性设计」15 字段)按映射归入下表章节,不另起结构。
> ⚠️ 本节是「生成链」的骨架与版式基准;「对齐链」的参考基准由当批用户指定,两者不是同一套、不得互相覆盖(2026-10-19 对齐批用 2.1.1…9.17日-2 / 2.1.2…9.17-1,数值与本节不同)。对照表见 §10C C8 基准登记。
章节骨架(12 章 + 2 子节,序号+顿号编号):
1、流程档案 2、定义 3、目的 4、适用范围 5、术语和定义 6、角色与职责
7、流程图 8、流程说明 9、裁剪指南 10、流程绩效指标 11、支持文件
12、文控信息 → 1. 文件拟制/修订记录 2. 附则
表格口径(10 表,列头逐字锁定):
| # | 位置 | 列头(逐字) | 行数口径 |
|---|---|---|---|
| 表1 | 章 1 前 | 审批栏 \| 姓名 \| 签名 \| 日期 |
3 行×4 列 |
| 表2 | 章 1 | 流程名称 \| 值 \| 版本/版次 \| 值(含 L1~L4 流程架构、流程编码、负责人/PC 等 10 行档案项) |
10 行×4 列 |
| 表3 | 章 5 | 名称 \| 定义 |
按术语数 |
| 表4 | 章 6 | 角色名称 \| 职责 \| 对应职位/岗位 |
按角色数 |
| 表5 | 章 8 | 活动编号 \| 活动名称 \| 活动内容 \| 角色 \| 输入 \| 输出 \| 相关文件 \| 相关规则/标准 \| 相关IT系统 |
9 列,行数=活动数 |
| 表6~8 | 章 10 | 【指标名称】 \| 指标值描述(每个指标独立一表,10 行×2 列) |
≥2 个指标 |
| 表9 | 章 11 | 序号 \| 文件名称 \| 文件编码 \| 管理者 |
按文件数 |
| 表10 | 章 12 | 版本 \| 拟制/修订责任人 \| 拟制/修订日期 \| 修订内容及理由 \| 批准人 \| 归档时间 \| 保存期限 |
4 行×7 列 |
编制要求(PPT 15 字段)→ 章节映射:概述→章1档案「流程概述」行|目的→章3|适用范围→章4|术语定义→章5|流程驱动规则→章1档案「流程驱动规则」行|输入/输出→章1档案 + 表5 列|角色/职责→章6|流程图→章7|活动说明→表5(含 KCP/风险控制措施写入「活动内容」列)|相关制度/相关标准→表5「相关规则/标准」列 + 章11|支持文件→章11|相关风险→表5「活动内容」列注 + 章3/10|绩效指标→章10。
连接关系表定位:「流程节点连接关系表」(编号|节点名称|节点类型|所在泳道|前置节点|后置节点)模板中无此独立表。当客户要求交付「图+节点表」时按表 3 位次插入第 7 章(2026-10-16 实例:2.2.2/2.2.5 均已随图交付),否则仅作内部图文对照用。
V1.1 版式口径(实测锁定,逐项可脚本校验)
| 要素 | 口径 |
|---|---|
| 节结构 | 4 节 — 节1 封面+目录|节2 1-6 章(纵向)|节3 7-8 章(横向)|节4 9-12 章(纵向)。⚠️ 第 8 章含 9 列活动表,纵向页放不下(742.5pt > 471.3pt),必须与第 7 章同入横向节(用户 2026-10-16 指令) |
| 页边距 | 节1 56.70/56.70/62.35/62.35+页脚距 48.20;节2/4 62/62/60/62+49.60;节3(横)62/62/60/62+页眉距 28.35+49.60;页面 595.30×841.90。⚠️ 切横向后须重设一次边距(Word 会重排) |
| 章标题 | 文本「N、+Tab+章名」;15 磅加粗、两端对齐、li=21 / fi=−21、单倍 18 磅、段前 15.6/段后 7.8(末章「支持文件」为 7.8/3.1) |
| 子节标题 | 文本「N.+Tab+名称」;14 磅加粗、li=47.95 / fi=−21、段前 7.8/段后 3.1 |
| 表题注 | 文本「表 N+Tab+名称」(表序自动递增);12 磅居中、li=21 / fi=−21、多倍 16 磅 |
| 正文段 | 14 磅、左对齐、li=21 / fi=0、单倍 18 磅、段前后 0 |
| 空段 | 10.5 磅、两端对齐、单倍 18 磅、段前后 0 |
| 分节符段 | 10.5 磅、居中、固定 12 磅行距、宋体 |
| 目录条目 | TOC1:左制表位 31.5+右 481.4 点线、li=0;TOC2:左 42.0+右 481.4、li=21;均 15 磅、两端对齐、单倍 18 磅。⚠️ 设 LeftIndent 前须先 CharacterUnitLeftIndent = 0 |
| 封面 | 标题【…】16 磅加粗居中+段前 31.2/段后 46.8;信息行「编制部门:/流程文件编号:(裸编号)/文件版号:」16 磅+li=104.85 / fi=7.05;无独立「审批栏」标题段(表格直接承接) |
| 表格 | 边框外内统一 0.5 磅(sz=4,含审批栏);单元格 12 磅+固定 16 磅行距;行高 表头 22 磅、数据行 ≥20 磅;对齐=术语/角色「表头居中+数据两端」·活动「全两端」·档案/指标/支持/文控「居中」·审批栏「左」 |
表格列宽铁律(2026-10-16 三轮实测,最易踩坑)
- 先按「所在节可用页宽」定上限:节1 封面 9638|节2/4 纵向 9426|节3 横向 14358(twips)。不可直接照搬基准 gridCol 值 — 基准表无
tblW靠 AutoFit 自动压缩,其值本身常超页宽(活动表 14850 vs 纵向 9426),一旦AllowAutoFit=False固定列宽即溢出。 - 再按内容适配(而非等比缩放):逐列测算最长内容所需宽度,重点保证标签列(如档案表 C1 需容纳「流程负责人(岗位)Process Owner」→ ≥2300 twips)与长值列;短值列(L1/L2/L3/L4 → 1200 twips)可压窄。
- 档案表参考分配(9426):
[2300, 1200, 2360, 1900, 1666]= 主标签 115pt / 层级 60pt / 主值 118pt / 次标签 95pt / 次值 83pt(R7-R10 合并值区 356pt)。 - 生成后必验:脚本逐表核对
Σ列宽 ≤ 节可用宽+ 表格数量/行数(_verify_layout.py)。
连接关系表定位补充:交付含节点表时,第 7 章结构为「业务流程图(图题 14 磅居中 li=36/fi=17.85)」→ 图片 → 「表 N 流程节点连接关系表」→ 表 → 注释段。
生成链内容纪律
- 每个
figures中有文字的节点(排除MapNameText/RoleFigure/空文本DottedRect)必须在「活动说明表」(表5,9 列)占一行,编号取ActivityId(流程序号 010/020/…)。 - 因 DottedRect 协同而合并的重复节点:
文档行数 = 节点数 − 合并数,并在「活动内容」列写明协同关系(双责任活动合并为一行,角色列写「主责;参与」)。 - 「流程节点连接关系表」仅内部图文对照用,不入正式文档正文(模板无此表);留存放「附则」附件或交付留痕。
- 流程绩效指标(章10,每个指标独立一表)与流程档案字段(L1/L2/L3/L4、输入/输出、流程驱动规则、负责人/PC)优先引用企业架构卡/源文档;确无来源的字段填「待补充」等占位并明确标注。
- 不臆造数据;缺口写「待补充」并注来源时效。KCP/风险控制措施写入表5「活动内容」列(PPT「活动说明」第 3 条)。
Word COM 生成 · 运行时陷阱与收口(2026-10-16 实测,逐条踩过再修好)
> 本节是「按模板生成 docx」的必备避坑集。全部坑均在真机上复现过,修法已验证;新增生成逻辑时逐条对照,勿凭直觉回退。
A. 结构性七坑(会导致内容丢失/错位)
| # | 陷阱 | 现象 | 修法 |
|---|---|---|---|
| 1 | Range.InsertXML 在本机完全不可用(5 种定位方式均报「不能在指定的位置插入 XML 标记」) |
无法用 OOXML 直插表格/段落 | 全面改走 COM 对象模型(Tables.Add / Content.InsertAfter / Range.FormattedText);不要再尝试 InsertXML |
| 2 | Paragraphs.Add(rng) 在文末或表格后会用新文本覆盖同一段落而不新建 |
段数不增、章节标题整段丢失(曾丢「7、流程图」标题) | 改用 doc.Content.InsertAfter("\r" + text) 追加段落,再取 Paragraphs(Count) |
| 3 | 中途插分节符(InsertBreak(2))后,分节符段成为文档末段会破坏后续落点 |
后续段落全部互相覆盖 | 内容全部写完后,按章标题用 doc.Sections.Add(mp.Range, 2) 分节(InsertBreak 的 2=分节符、7=分页符,勿混) |
| 4 | InsertAfter 段落继承前一段样式 |
紧跟标题的正文变成「标题 1」并混入目录(目录曾多 25 条) | 无 style 参数时显式回落 doc.Styles("正文");换 Style 会重置直接格式 → 先设样式、再设字体/段格式 |
| 5 | Tables.Add 后单元格段落继承前一位置的「标题 1」 |
表格内容进目录、表头加粗误判 | 逐格先 cr.Paragraphs(1).Style = Styles("表格内容") 再设字体 |
| 6 | 分节符段/空段残留「标题 1」样式 | 章节骨架计数多 1、混入目录 | 保存前兜底回落:所有「空段+标题样式」一律 Styles("正文")(失败退 -1),并补齐字体与段格式 |
| 7 | 占位标记用 __X__ 双下划线会被 Word 自动套用格式吞掉(转粗体);早期 Paragraph 对象 Range 会随内容增长漂移 |
占位符找不到;图片被后插入的目录域替换吞掉(保存前 InlineShapes 1→0) |
占位标记改无下划线(如 FIGPLACEHOLDERTAG);图片/目录当场按文本查找定位(配样式过滤,避免命中目录条目),禁止复用早期 Paragraph 对象 |
B. 运行时格式五陷阱(会导致「逐章不一致」的观感问题,最易被漏检)
| # | 陷阱 | 表现 | 修法 |
|---|---|---|---|
| 8 | 正文区空段继承文档默认样式 | 行距多倍 13.9、段后 8 磅 → 章间空行忽大忽小 | blank() 一律套用统一空段口径(10.5/两端/单倍18/段前后0) |
| 9 | Tables.Add 后 Word 自动补的段落继承表题注格式(li=21/fi=−21/多倍16) |
每张表后多出一段"高行距空行" | 建表后立即把该自动段格式化为标准空段 |
| 10 | TablesOfContents.Range 的范围会延伸到紧随其后的段落 |
目录后的分节符段被当目录条目改(15磅/两端) | TOC 格式化循环加 if not sty.startswith("TOC"): continue;并在 TOC 生成后再跑一次分节符段复检 |
| 11 | 分节符段字体未显式指定 → 显示为「+中文正文」 | 字体不符(应为宋体) | 统一设 NameFarEast/Name = 宋体 |
| 12 | TOC2 条目左缩进被样式的字符单位缩进覆盖(设 21 仍显示 22) | 与基准差 1pt | 先 ParagraphFormat.CharacterUnitLeftIndent = 0 再设 LeftIndent |
C. 三道收口(缺一不可,按序执行)
内容构建 → ① 按章标题 Sections.Add 分节
→ ② 分节符段格式化(判据:紧随「标题 1」的空段,或前后节号有差异)
→ ③ 表格/图片/目录域插入
→ ④ 分节符段「复检」(防被 TOC 域范围波及)
→ ⑤ 兜底回落:空段+标题样式 → 正文(并补字体/段格式)
→ ⑥ 保存:SaveAs2(同目录单扩展名临时名, 16) → Close(False) → os.replace 重试
> ⚠️ 判据踩坑记录:勿用 p.Range.End >= Sections(sec).Range.End - 2 收紧「真分节符段」判据 —— 实测会漏处理 1 个分节符段并导致章节骨架校验失败。用「紧随标题1」+「兜底回落」组合最稳。
D. 校验闭环(生成后必跑,全部只读)
| 脚本 | 作用 | 通过条件 |
|---|---|---|
_verify_layout.py |
章节→节归属、每表宽度 vs 节可用宽、行高、图片宽度 | 全部不溢出、章节归属与节规划一致 |
_audit_full_layout.py |
按 16 类别逐项比对字体/字号/行距/段距/缩进/对齐/页面/页边距/表格 | 全部类别 PASS、0 FAIL |
_verify_flow_doc.py(G 系列 13 项) |
章节骨架(标题1=12/标题2=2)、活动行数守恒、表头加粗逐表、页脚域、图片、占位符残留 | FAIL=0 |
_verify_fmt_align.py |
与基准文档逐类别格式指纹比对 | 无 DIFF(或差异已声明) |
E. 保存与落盘(DLP 环境)
SaveAs2(临时名, 16)→Close(False)→os.replace重试;临时名必须单扩展名(*.docx.tmp.docx会致 SaveAs2 无限挂起)。- 落盘后验证文件头
00 00 5b 00(亿赛通加密态)。
多角色活动 · 协作框规范(亦称「协助框」;2026-10-13 立,2026-10-16 补强)
- 判据:活动标注多责任人(分号分隔,如「营销部长;产品经理」)时,不再以「单框落于单一泳道」近似,改用协作框:每个责任角色的泳道各放一个同文本活动副本,副本外裹橙色虚线协作框(
DottedRect,空文本,BodyColor橙235,97,27)。 - 组内关系:副本相互并行且同进同出——共享同一上游活动与同一下游活动;协作框须在连线/节点之前绘制。
- 连线接法:协同分主次(标注首位=主责)时,进出连线只接主责副本,次责副本不接线;不分主次时,连线接协作框边缘(箭头落在框边)。
- 双通道判据(2026-10-16 用户拍板 · 强制规范):同一项活动涉及多个人员时,必须择一表达——① 添加协作框(首选;橙色虚线外裹副本组);② 依据逻辑关系添加连线(副本与上下游逻辑相连、同进同出)。二者并存更佳;禁止多人员副本既无框、又无线、孤立悬挂于泳道。
- 生成器默认行为(2026-10-16 实测沉淀):跨泳道副本组自动外裹协作框——左右各余 17px、上下各余 23px、橙色
235,97,27、先于节点与连线绘制(OrderIndex 靠前);实测 2.2.7「140 签字确认」4 副本 → 协作框134×706,校验无新增告警。连线仍接主责副本(表序首位泳道),次责副本由协作框表达组关系。 - 布线纪律(重排/协作框改造类任务):
1. 左进右出,复杂场景可左、上进(同《恒泰-EPROS操作标准化-V1.0》活动连接规范);
2. 同排相邻节点直连,不为对称而强加拐弯;
3. 改前逐项断言原坐标/原折线,改后拓扑守恒(起讫节点三元组 + 判据标签不变);
4. 干线走廊预留:拐头竖线、协作框边、既有折线相互保持 ≥10 坐标单位间距;
5. 绕行分层:需跨越带状障碍(并行框/节点列)时优先走带外走廊(空泳道带如「客户」带、画布底部空带),其次同带内插空,禁止横穿协作框内部;
6. 目标:不同连线横向交叉数 = 0(不同边线段严格内点相交计 1 次,共线共享干道/端点汇入不计);源图固有交叉如实留痕,重排机会成熟时一并消除。
7. 竖向分叉点对齐(2026-10-16 用户拍板 · 强制规范):横向存在多条连线时,各条连线的竖向分叉点必须对齐在同一位置。含义与实现:- 同源出线:同一节点出发的多条分支,其竖向转折杆共用同一 x(分叉点对齐);
- 同目标入线:汇入同一节点的多条分支,其竖向汇合杆共用同一 x(汇合点对齐);
- 禁止:各分支各自选位、形成高低参差的分叉/汇合位置(视觉上"三岔口"不齐);
- 实现:① 按「源节点 或 目标节点 + 方向」对连线分组;② 组内取统一横向槽位(节点级共享槽位,生成器默认行为);③ 库内优先用「同源侧/同目标侧共享竖杆 + 3 段 Z 形」而非多条独立折线;
- 校验:抽取各连线转折点坐标,按组断言 x(纵向分支)或 y(横向分支)取值唯一;不唯一即判不通过;
- 实证(2026-10-16):2.2.7 合同签订流程全图 8 组共杆全部达标——审核双出
x=1072、评审汇入x=1312×4、四级评定双出1642/1832/2022/2212、起草汇入x=2848×3、审批双出x=3162;单线组零冗余偏移(坐标分组统计脚本一键复核)。
元素定义与职责(2026-11-02 用户裁决 · 菱形与 XOR 严格分家)
> 完整版:<工作区>/_out10/EPROS元素定义与职责说明-V1.0.md(53 份样本 / 1629 图元实测)。
两条分界(最易混淆处,务必先立住):
- 菱形
Rhombus= 判断框,只表达条件分支(这件事做不做 / 过不过),它不是网关,不承担并行、汇合、分流的路由职责。 XORFigure/ORFigure/AndFigure是三个独立的圆形网关元素,表达"多路如何路由"。二者是并列关系,不是包含关系,不得合并描述、不得互相映射。
| 元素 | 职责 | 入活动表 | 命名规则 |
|---|---|---|---|
RoundRectWithLine 活动 |
单一角色完成的一项作业 | 是(一行一活动) | 动词开头、≤12 字、无编号前缀 |
Rhombus 判断框 |
条件分支判定(是/否、通过/不通过) | 否 | 纯判定语;禁带 XOR/OR/AND 前缀,禁带「网关」后缀 |
XORFigure XOR 网关 |
互斥择一:多出口只能走一条 | 否 | 必须带 XOR 前缀 |
ORFigure OR 网关 |
择多:满足一条或多条即继续 | 否 | 必须带 OR 前缀 |
AndFigure AND 网关 |
并行必经:全部走完才继续 | 否 | 必须带 AND 前缀;分流与合流成对 |
ImplFigure 子流程 / FileImage 文档 / EventFigure 触发 / FlowFigureStart·Stop 起止 |
跨流程引用 / 交付物 / 外部触发 / 流程边界 | 否 | 名称即业务对象名 |
DottedRect 协作框·分组框 / RoleFigure 泳道 / MapNameText 图名 / FreeText 注释 / Right·ReverseArrowhead 责任标记 |
装饰(不参与连通性) | 否 | — |
五维区分(判断"该用哪个"):
| 维度 | 菱形判断框 | XOR 网关 |
|---|---|---|
| 形状 | 菱形 | 圆形 |
| 语义对象 | 业务判定(做不做 / 过不过) | 路径路由(走哪一条) |
| 出边关系 | 判定结果分支 | 严格互斥择一 |
| 连接点 | 四个顶点 | 圆周四向中点 |
| 命名 | 纯判定语(专题评审 / 规划审批) | 必须带 XOR 前缀(XOR 成果分流网关) |
一句话:要"判"用菱形,要"分"用网关——判定产生结论,网关消费结论。判据已由上游活动产出、此处只需按结果选路 → XOR;需要在本节点当场作出决定 → 菱形。
映射铁律(生成器 map_node_type,2026-11-02 起取代 2026-09-24「决策关键词优先」旧规):名称带 XOR / AND / OR 前缀 一律映射为对应圆形网关,不得因名称含「评审/审批」而改画菱形(旧规正是这样把 XOR 语义吞进菱形);无类型前缀、且为判定语(审核/评审/审批/判定/是否通过…)才映射为菱形。判不准 → 留空报「请裁决」,不猜。
连接点(锚点)规范(2026-10-14,实测驱动)
EPROS 元素边框上的固定吸附位置称「连接点」,连线端点必须精确落在其上(差几单位即红 ✕ 报「未连接到连接点」)。
- 连接点位置:
- 矩形活动框(
RoundRectWithLine):四边中点各 1 个(共 4); - 菱形判断框(
Rhombus):四个顶点各 1 个(共 4)——落斜边(哪怕居中)即红 ✕,必须落角尖。 - 同方向单锚点:每个元素每个方向(上/下/左/右)只有 1 个连接点;多条线汇入同一方向时共用同一锚点(如 120 左缘的 e208+e217 共用一点),不得同方向挂 2~3 个不同点。
- 菱形出边顶点分工(硬规则;2026-10-14 立,2026-10-17 用户重申并落地生成器):审核通过 → 右侧顶点;不通过(退回)→ 底部顶点;两者不得共用同一顶点。⚠️ 按元素定义(2026-11-02):菱形是判断框,出度以 2 为常态(是/否)、最多 3(如"通过/有条件通过/不通过");若出现 ≥3 条并行向前分支,说明此处是并行路由而非判定,应改用 AND/OR 网关,不得用菱形承载并行语义。同一审批框扇出的多条通过类分支全部从右侧顶点引出后分叉(属同锚点多边,仅限 ≤3 且互斥)。入边仍恒走左侧顶点(左进右出总纲不变)。
- 生成器默认行为(2026-10-17 实测沉淀):菱形双分支由生成器自动分工——正向(通过)边走右侧顶点;回边(退回)自底部顶点直下图底回流区(→ 回流区横线按目标节点分层,多条回边互不交叉 → 目标列隔离带竖线上行 → 目标左缘;4 段折线);底部直通路径有障碍(同列下方存在节点盒)时,短降 18px 横移至源侧隔离带再下行,不压节点盒。分支标签贴连线起点旁(首段为长段时不再取中点,避免标签漂离源节点)。实证 2.1.3:040 审核退回自底部顶点 (1010,315) 直下至回流层 y=990、050 审批退回自 (1200,615) 直下至 y=1006,两线共用目标侧竖杆 x=568 汇入 020,横向交叉 0;
verify_epros --pairFAIL=0。 - 精确吸附:端点坐标 = 连接点坐标(偏差须 <0.01);EPROS 客户端拖动节点会自动吸附,但新增/手改连线后必须复核落点(审计脚本:逐边逐端点算到最近连接点距离)。
EPROS 客户端行为特性(避坑)
| 特性 | 表现 | 应对 |
|---|---|---|
保存时 OrderIndex 自动重编号 |
18 条边可全部从 200~217 重编为 38~55 | 勿把 OrderIndex 当稳定标识;追踪连线用 StartFigure→EndFigure 三元组 |
| 画布声明不自动扩展 | 内容需 2552×800 但声明仍 1969×671 → 越界 | 大幅移动节点后手动核 WorkflowWidth/Height ≥ 内容范围;或客户端拖画布边缘扩展 |
| 拖动时端点自动吸附 | 拖节点线跟随吸附到连接点 | 拖动后仍复核锚点;手改 XML 端点易脱节 |
连线修改经验(平移/退回/拐点)
- 节点平移 → 连线折点同步平移 Δ:起讫点、中间拐点全部跟随;漏调拐点会导致折线斜穿或绕远。
- 退回线贴紧:退回线水平段 y 只需避开沿途节点(间距 30~50 即可),不留过大下方空白走廊;回路越紧图面越干净。
- 拐头竖线按走廊重算:拐头位置取决于左右两侧元素间距(≥10),不是简单跟随节点平移;节点移动后逐条复检拐头与相邻元素/连线间距。
- 大幅重排后必查画布:
WorkflowWidth/Height≥ 最右/最下元素坐标;最后一条泳道分隔线 y < 画布高度(否则泳道带高度为负)。
修改后自检清单(6 步,逐次过)
- 锚点吸附:所有连线端点精确落在连接点(矩形=边中点、菱形=顶点);
- 同方向单锚点:每元素每方向 1 个连接点(多边可共用);
- 顶点分工:菱形通过=右侧顶点、不通过=底部顶点、不共用;
- 方向合规:出=右侧/底部、入=左侧/上部;
- 交叉=0 / 穿体=0;
- 画布覆盖:
WorkflowWidth/Height≥ 内容范围,泳道带高度全为正。
手工修改比对与版本快照(2026-10-15 实测,三轮手工改版驱动)
用户在 EPROS 客户端手工改图是常态(对齐分支、加分组框、改挂载副本)。每一轮改版都要能回答「改了什么」,否则图文对照失据。
① 先留快照,再谈比对(最高频疏漏)
| 陷阱 | 后果 | 正确做法 |
|---|---|---|
| 用户在 EPROS 里保存 → 上一版被原地覆盖 | 无基线,只能靠「生成器重建 + 上轮记录」反推,结论带推定成分 | 每轮比对先 cp:<流程>_用户版N_<时间戳>.epros 存入 _user_snapshots/;比对与报告都引用快照路径 |
| 拿我方生成版当基线 | 生成版早已被覆盖,且客户端已改过 UUID | 基线=生成器内存重建(build_flow + serialize,不落盘)或上一版快照 |
② 语义比对,禁止文本 diff
EPROS 保存会重写 UUID 与属性顺序,逐字节 diff 全是噪声。按下列键匹配后逐项比几何:
| 对象 | 匹配键 | 比对内容 |
|---|---|---|
| 图元 | (FigureType, FigureText, roleName) |
PoLongx/PoLongy/Width/Height + ActivityId |
| 连线 | (StartFigure→EndFigure 文本三元组, LineText) |
段数 + 逐段 (StartPtX/Y → EndPtX/Y) |
| 结构 | 泳道列表 / ParallelLines 分界 y / VerticalLines x / WorkflowWidth·Height / 根元数据 |
数量与取值 |
③ 双副本挂载副本轮换 ≠ 缺陷
跨泳道同名副本(同 ActivityId)只有一份接连线,另一份孤立。用户可能把挂载从主责副本切到审批/后置方泳道副本(实测 2.2.5「销售价格确定与审批」由营销部长泳道切到事业部经理泳道,四条线随之重走,孤立副本同步轮换)。
- 判据:节点集合、类型、文本、泳道、分支标签、连线总数不变 → 属画法选择,不判缺陷;
- 与「多角色活动·协作框规范」(只接主责副本)冲突时,回报客户确认主责口径(同步 ch7 泳道列与角色职责表),勿自行改回。
④ 分组框(DottedRect)避让与穿越豁免
| 情形 | 处置 |
|---|---|
| 新增分组框后相邻出线竖段压框边 | 竖段移到框缘之外(实测框右缘 1455 → 竖段 1468→1507) |
| 进出框内节点的短段必然穿越框边 | 穿越检查须豁免「端点图元被该框包含」的段,否则全为假告警 |
| 入线绕行段数过多(5 段 Z 形) | 优先改走共用竖干线汇合(两条入线同 x 上下汇入,3 段),既短且避开框体 |
⑤ 批次固有告警判读(不拦交付)
跨泳道双副本必然触发三类告警,只核数量与标签,不看编号:孤立业务节点 / ActivityId 重复 / 节点表行数 vs 产物节点数差 1(差=副本数)。出现 FAIL 才拦;这三类维持 WARN 即可交付,并在报告中注明成因。
⑥ 类型词与校验器词汇同步
规格侧新增节点类型词(如「起始」「结束」)时,同步补校验器的类型词映射表,否则生成侧接受、校验侧报假 WARN(曾误报 C6)。
⑦ 编号口径先核对再动手
同名 .epros 可能同号不同名(如 2.2.4报价流程 与 2.2.4关键角色攻关流程)。取号一律以架构卡/流程清单为准,并核对目标目录下既有文件是否已占用该编号;改号时同步生成器缩写映射表(ABBR),勿只改文件名。
比对后自检(4 项)
- 快照已存:本轮与上一轮
.epros均有独立副本,未原地覆盖; - 语义零漂移:节点集/连线集/标签/根元数据与规格 md 的节点连接关系表逐行对应;
- 几何无新伤:走线穿越检查 0 处(分组框必需穿越已豁免)、画布仍覆盖内容;
- 告警未升级:WARN 项数量与成因同上一轮,无新增 FAIL。
流程图高保真重建(EPROS XML → PNG,生成链可选步)
python scripts/gen_flowchart.py -i "流程图目录" -o "流程发布文档" --dpi 150
python scripts/verify_flowchart.py "流程.epros" --png out/flow_x.png --strict
保真原则(核心,勿改)
EPROS 源文件已给出权威布局,渲染器绝不重新排版:
| 维度 | 取值来源 | 实测保证 |
|---|---|---|
| 节点位置/尺寸 | figures 的 PoLongx/PoLongy/Width/Height |
逐坐标照搬,不做任何变换 |
| 连线走线 | manhattanLines/lineSegments 正交折线 |
773/773 条边带精确几何,100% 正交,逐段照搬 |
| 箭头朝向 | 末段方向,画在末段终点 | 773/773 方向一致(起点贴 StartFigure、终点贴 EndFigure) |
| 配色 | figures 的 BGColor(渐变取中点)/BodyColor |
源文件自带,不再自造 |
| 判据标签 | manhattanLines/@LineText |
167 条,置于路径弧长中点 |
| 字号 | 由「1 点 = 多少坐标单位」换算后精确约束 | 保证不溢出盒子 |
> ⚠️ 不引入 Graphviz / ELK / dagre / pyorthogonalrouting 等布局布线库:
> 它们会重新计算布局,反而破坏与原图的一致性 —— 与「提升准确性」背道而驰。
> 仅当某条边缺 lineSegments 时用内置 L 形正交兜底(实测语料 0 例)。
已修复的两个保真缺陷(勿回退)
| 缺陷 | 症状 | 修法 |
|---|---|---|
| 标签字段读错 | manhattanLines 上没有 FigureText,标签在 LineText → 全语料 167 条判据标签被静默丢弃 |
改读 LineText |
| 非业务图元被当装饰丢弃 | VirtualRoleFigure/RightArrowhead/ReverseArrowhead/FreeText 均带文本,且 RightArrowhead 被 2 条边引用 → 漏画 9 个图元 + 丢 2 条带标签的边 |
「非业务节点」≠「不绘制」,分开建模;边不按端点类型过滤 |
渲染细节
- 角色列:
VerticalLines.PoLongx(恒 160)画竖分隔线;RoleFigure按其原始坐标画淡黄圆角框(x≈23~32, w=100, h=60),不要用「贴左浮动文字」近似。 - 图名:
MapNameText居中作标题;责任标记Right/ReverseArrowhead画三角 + 文本(R1/R2)。 - 分组盒 / 协作框:空文本
DottedRect画虚线框,须在连线/节点之前绘制;多角色协作框按《恒泰-EPROS操作标准化-V1.0》用橙色虚线(BodyColor橙235,97,27),源文件自带红色的普通分组盒照源色。 - CJK 字体:按
simhei.ttf → msyh.ttc → simsun.ttc探测并fontManager.addfont。 - 输出映射:不用
bbox_inches='tight'(会让数据→像素映射不可算);改用轴铺满整图 + 显式xlim/ylim,同时写出flow_<key>.meta.json侧车供像素校验。
重建结果的验证(14 项)
| 系列 | 校验内容 |
|---|---|
| P 位置 | 坐标直取源、不越界、不重叠、泳道归属、带文本图元全部纳入绘制 |
| E 连线 | 几何覆盖 100%、逐点零偏差、全正交、端点落位、箭头朝向、标签无丢失、穿体率 |
| R 产物 | 节点填充色像素采样命中(形状感知:菱形沿轴线采样)、尺寸合理 |
> 实测 30 份语料 0 FAIL、穿体率 0%。
> P-3 若报重叠,多为源文件自身的布局问题(实测 1.2.2 有 2 对节点重叠),
> 属如实转述而非渲染缺陷 —— 应回报原作者修正。
对齐链
Phase B · 基准萃取
| 项 | 内容 |
|---|---|
| 输入 | spec_file、template_file、可选 batch_ref_file |
| 操作 | ① 全文读取规范,抽取「字号/行距/编号/页眉页脚/表格」类条款;② 逐参数实测模板(段落 font/size/alignment/indent/行距/段前段后、页边距、页脚距离、表格字号与边框磅值、样式表清单、封面逐段参数);③ 冲突项登记;④ 回填 spec_values;⑤ 多文档批次先出画像再分族(见 §10C C1);⑥ 按「文本角色」归集段落而非按样式名(见 §10C C2) |
| 输出 | spec_values 实填表 + 冲突与裁决记录(模板优先) |
| 门禁 | spec_values 存在未回填占位符 → 中止(禁止用默认值猜) |
四个关键(详见 references/alignment-rules.md §4.2):
- 必须区分「样式定义值」与「实际生效值」 —— 探针应读
Paragraph.Range.Font而非Styles(nm).Font。 - 页边距按节分组实测 —— 封面节/正文节/横向节常为三组不同值,不得只取节 1。
- 加粗口径按表实测 —— 逐表登记到
bold_policy_per_table。 - 样式名不可作为分类依据 —— 实测同一批文档里,有的全篇只有一个「正文」样式(无标题样式、无目录域、章标题靠 15 磅加粗+文本判定),有的用自造样式名(
表格内容/段/table++)。基准画像与套用规则一律按文本角色归集,样式名只作辅助线索。
Phase C-A · 对齐执行
| 项 | 内容 |
|---|---|
| 输入 | 待改项清单(仅格式类)+ spec_values |
| 操作 | 分维度分批执行,每批 ≤10 项、批后即时校验:<br>① 样式层 ② 表格层 ③ 字段层 ④ 结构层(仅 approved_changes)⑤ 封面层 ⑥ 页眉页脚层 ⑦ 颜色层 ⑧ 域刷新 ⑨ 段距/行距层(须先清「行」单位,见 §10C C3) ⑩ 表格排版层(字号分档/边框/单元格行距,不动列宽) ⑪ 目录域重算与差异归因(见 §10C C5) |
| 输出 | 修改后文档 + 逐批执行日志 |
| 门禁 | 任一批失败 → 立即停止并从上批快照回滚,不继续 |
执行前必须先完成备份 + 基线快照(含 MD5 清单与全文文本 dump),否则不得进入本阶段。
批量批次(≥3 份文档)的三条附加纪律(详见 §10C):
- 写后必「全量复审」:套用脚本自带的自检不算数,必须用独立只读审计逐条复核(同一进程内的回读会掩盖未生效的赋值,实测 4/10 份标题段距「设了但没落地」只有在独立复审时才暴露);
- 定点修复后必须再全量复审一次:定点脚本只碰目标属性,易与其他层相互覆盖;
- 每份文件的 before/after 画像必须落盘(
_profile输出 JSON),交付报告的证据从这里生成,不得事后手工回忆填写。
Phase D · 统一终验(两链共用)
| 项 | 内容 |
|---|---|
| 输入 | 备份基线 + 最终文件(+ 生成链的 probe.json) |
| 操作 | 生成链查 G 系列,对齐链查 V 系列,通用项查占位符残留 |
| 命令 | python scripts/verify_docx.py <docx> --chain generate --probe-json probe.json<br>python scripts/verify_docx.py <docx> --chain align --backup <原稿> --spec-json spec.json |
| 输出 | 校验报告(含 diff 明细、抽验表、异常项) |
| 门禁 | ① 出现任何未批准的文本差异 → 恢复备份重做;② 抽验有偏差 → 补正后重验 |
G 系列(生成链):G-01 活动行数守恒 / G-02 泳道名一致 / G-04 无文本节点已声明 / G-05 悬空边已提示 / G-06 横向节生效 / G-07 表头灰底加粗 / G-08 中文字体 / G-09 章节骨架=模板基准(12 章+2 子节,序号+顿号) / G-10 表格列头=模板基准(10 表逐字,表5=9 列)。
V 系列(对齐链):V-01 文字零改动 / V-02 字体字号 / V-03 行距 / V-04 边框加粗 / V-05 页边距按节 / V-06 字段命名顺序 / V-07 页眉页脚 / V-08 颜色 / V-09 结构完整性 / V-10 编码态 / V-11 段距单位与取值(行单位已清零、回读磅值=目标值) / V-12 表格字号分档(按表型:审批栏/活动说明表/普通表)。判据详见 references/alignment-rules.md §3。
V-01 的判据修正(2026-10-19 批量实测):Word 自动目录域在版式重排后页码必然变化,这不属于正文改动。判据须做差异归因:
| 差异行形态 | 归因 | 处置 |
|---|---|---|
全部匹配 ^\s*\d{1,2}\s*[、..].*\t\d{1,3}\s*$(章节名+制表位+页码) |
目录域页码重算 | 判「正文零改动」,在报告中单列「N 行目录页码重算」 |
| 目录条目整行消失 | 原条目指向的章节在正文中不存在(失效条目),域重算时被清除 | 先回备份核实「该章节标题是否真的不存在」;确认后判为修正既有缺陷并显式披露,不得静默 |
| 其他任何行 | 正文被改 | 恢复备份重做 |
逐字符校验刚性要求:
- 表头加粗必须 sum(1 for ch in cell.Range.Characters if ch.Font.Bold) > 0,只读 Range.Font.Bold 查不出丢失;
- 有纵向合并的表必须遍历 Range.Cells,for row in tb.Rows 会抛异常;
- 颜色判据取 OOXML styles.xml/document.xml,不取 COM。
三项易误判的判据(已按实测校正):
| 判据 | 正确做法 | 若做错的后果 |
|---|---|---|
| G-01 活动行数 | 用「表头关键字(活动编号/活动名称)+ 其后编号列形态」精确定位活动说明表;该表常带合并标题行,直接 rows-1 会错一行 |
误选封面审批栏/术语表,报出假差异 |
| G-01 差异定性 | 不一致时按节点类型归组输出(子流程/网关/活动) | 无法判断「只列活动不列子流程」这类约定差异还是真缺陷 |
| G-07 / V-04 加粗 | 加粗逐表口径不同——实测「流程档案表/绩效指标表」为灰底但不加粗,属既定约定。故:登记了 bold_policy_per_table 则强判,未登记则降为信息项并列出未加粗表 |
一律断言「灰底必加粗」→ 把合规文档误报为缺陷 |
| 表头不可读 | 表头因合并单元格读不出时记「无法判定」,不报 FAIL | 误报为「未加粗」 |
| G-08 字体 | 未给 spec_values 基准时只报实测字体分布 |
文档合法使用多字体会被误判为异常 |
Phase E · 交付与留痕
| 项 | 内容 |
|---|---|
| 输入 | 终稿 + 校验报告 + 各阶段日志 |
| 操作 | ① 按 references/delivery-note-template.md 模板写交付说明 md(≤5 节;含依据版本号、变更表「对象/原/改/依据」、校验结果、待人工确认项);② 存结构指纹 fingerprint.json 并与上一轮 --fp-compare 确认结构未漂移;③ 回写项目记忆;④ 呈现文件 |
| 输出 | 交付说明 md + 终稿 + 备份路径 + fingerprint.json |
| 门禁 | 说明缺「依据版本号」或缺「待确认项」或缺 fingerprint.json 留痕 → 不交付 |
4. 硬约束
| 约束 | 适用链 | 说明 |
|---|---|---|
| 文字零改动 | 对齐链 | 含措辞、术语、标点、语序、段数;不改标题措辞;不重排章节顺序。除 approved_changes 显式批准外一律保留 |
| 节点守恒 | 生成链 | 有文本节点数 = 活动表行数 + 协同合并数 |
| 零硬编码 | 两链 | 所有具体值走参数配置块;正文只出现变量名 |
| 单一通道 | 两链 | 同一步骤禁止两条通道操作同一文件 |
| 读操作只读 | 两链 | COM 读一律 ReadOnly=True,关闭时 SaveChanges=False |
| 写后必验 | 两链 | 读文件头 + 回读关键内容 + 核对原文件 size/mtime |
| 破坏性操作先备份 | 两链 | 备份含 MD5 清单,且不得覆盖同名既有目录 |
| ★ 结构不变量守卫 | 两链 | 任何编辑必须包在 docx_guard.Guard 里:节数 / 表数 / 每表行列数 / 每节页面设置在编辑前后必须不变;违规即抛异常,禁止保存 |
| ★ 删段落必排分节符 | 两链 | 删除段落一律走 docx_guard.safe_delete_paragraphs(内置分节符保护)。分节符藏在段落标记里,误删会合并节(横向节丢失) |
| ★ 人工改版先留快照 | 生成链 | 用户交回手工改过的 .epros 时先 cp 快照再分析——客户端保存会原地覆盖上一版,无快照就只能反推基线 |
| ★ 附章节不进骨架 | 两链 | md 文末「## 附:…」编制说明章的小节(### 一、…)渲染时不得套「标题 2」样式(改普通加粗段)——否则混入骨架计数(G-09 标题2=8 误报)且污染目录;正式交付按模板收敛时应整体删除附章节 |
| ★ COM 生成前清 WINWORD 残留 | 两链 | 生成/校验脚本重跑前必先 Get-Process WINWORD 清理无窗口残留——残留实例会令新 COM 会话早期挂起,被外层 SIGTERM 杀死且无任何输出 |
| ★ 段距按磅值落地须先清「行」单位 | 两链 | 中文版 Word 的段前/段后可能以行存储(LineUnitBefore/After≠0)。此时只设 SpaceBefore/SpaceAfter 会被行高换算覆盖(实测 8 磅 → 回读 19.05 磅、2 磅 → 9.5 磅)。必须 LineUnitBefore=LineUnitAfter=0 并把 SpaceBeforeAuto/SpaceAfterAuto=False,再设磅值;样式定义与每个段落都要清(见 §10C C3) |
| ★ 批量统一不动列宽 | 对齐链 | 统一格式时只改框线/字号/行距/对齐,不重新分配列宽——列宽决定单元格换行位置,一改就是布局重排,会连带改变「文字零改动」的观感与分页。基线自身存在的宽表溢出(实测 4 族中 3 族有 742>718pt)如实登记、不修,除非用户明确要求重排 |
★ .epros 只做文本级手术,绝不重序列化 |
复核链 | 用 ElementTree 整体读写会重排属性、丢格式、改变声明引号,客户端可能拒绝加载。改 .epros 一律正则文本手术:按 FigureImageId 删 <figures/>、按 OrderIndex 定位后只改开标签内的 StartFigure/EndFigure、整块替换 <lineSegments/>;每次落盘前 ET.fromstring 校验 |
| ★ 连线只改端点不够,必须同步重算折线 | 复核链 | 只改 EndFigure 不改坐标 → 线头停在旧位置,视觉上仍断,且自家 C-17/C-18 立刻报错。改端点后按「左→右 / 右→左 / 同列」三走向重建正交折线(§10D D5) |
| ★ 不做语义推测式整改 | 复核链 | 分支条件、合流语义(AND/XOR)、活动命名、缺口的上下游归属,一律不改、只出作业单。能自动改的只有「几何与引用关系确定」的项:残留副本删除、吸附协作框的连线重接、折线重算、画布尺寸(§10D D4 四级判据,命中不了就不动) |
4.1 执行时守卫(把事故变成断言)
> 动机(2026-10-12):一日内发生两起事故(分节符误删致节数 4→3、COM 哨兵误判边框致 181 格单元格边框被抹),
> 都在复验阶段才被发现。结论:缺的不是「教训」,而是执行时就跑得起来的断言。
from verify_common import bootstrap; bootstrap(__file__)
from docx_guard import Guard, safe_delete_paragraphs, refresh_toc_then_restore, save_dlp
from docx_probe import structure_fingerprint, find_blank_runs
before = structure_fingerprint(doc) # ① 先取指纹
with Guard(doc, "删空行"): # ② 编辑包在守卫里
safe_delete_paragraphs(doc, [167, 168]) # 内置分节符保护 + 从后往前删
refresh_toc_then_restore(doc) # ③ 先刷域 → 再重建制表位(顺序固定)
save_dlp(doc, path) # ④ SaveAs2 + 重试 + 落盘
四道闸门:
| 闸门 | 拦截什么 | 对应事故 |
|---|---|---|
Guard |
节数/表数/表形状/页面设置被改动 | 分节符误删(节 4→3) |
safe_delete_paragraphs |
承载分节符的段落被删 | 同上 |
docx_probe.table_borders |
用 COM 哨兵误判边框 | 边框误改(181 格受损) |
refresh_toc_then_restore |
刷新域后制表位未重建 | 目录子条目撑散换行 |
第五类断言(2026-10-19 增)· 段距写入后回读校验 —— 上述四门管「结构不变量」,不管「格式是否真的落地」。
批量套用时务必加这一条(纯 COM,无模块依赖):
def assert_space(p, before, after, tol=0.1):
pf = p.Format
for got, exp, unit in ((pf.SpaceBefore, before, pf.LineUnitBefore),
(pf.SpaceAfter, after, pf.LineUnitAfter)):
unit = unit or 0.0 # COM 可能返回 None
if abs(got - exp) > tol or unit > 0.01:
raise AssertionError("段距未落地: got=%.2f exp=%.2f lineUnit=%.2f"
% (got, exp, unit))
- 必须在另起的只读进程里回读(同一会话回读到的是刚设的值,恒过);
- 逐段跑成本可接受(500 段 × 2 属性 ≈ 1~2s),但批量时改为「抽样 + 全量签名比对」:抽样校验取值,全量校验角色分布。
5. 冲突裁决
| 冲突 | 裁决 |
|---|---|
| 规范 vs 模板 | 模板优先,记入交付说明;已知例外见 references/alignment-rules.md §5 |
| 格式修正必须动文字 | 不动,列为待人工确认 |
both 模式下两条链约束打架 |
生成链先产出新稿;对齐链的「文字零改动」以生成稿为基线(即对齐阶段不再改生成结果) |
preset 与 template_file 打架 |
template_file 优先(preset 仅作无模板时的兜底骨架) |
6. 输出规格
| 产出 | 命名 |
|---|---|
| 生成稿 | <流程号>_<流程名>.docx |
| 对齐说明 | 格式对齐说明_<对象>_<YYYYMMDD>.md |
| 格式变更报告(批量) | 格式统一变更报告_<批次>_<YYYYMMDD>.docx(含基准规范表 / 文件清单 / 逐份 before→after / 校验结论 / 说明事项,见 §10C C6) |
| 复核报告 | 流程图与流程文件复核报告_<YYYYMMDD>.docx(范围方法 / 结论 / 分文件统计 / 问题分类 / 逐份清单 / 整改建议 / 局限,见 §10D D8) |
| 问题清单(双表) | 流程复核问题清单_<YYYYMMDD>.xlsx(工作表 待整改 / 已整改,12 列含状态) |
| 整改执行记录 | 流程图整改执行记录_<YYYYMMDD>.docx(已完成项+判定依据 / 前后对比 / 未改原因 / 作业单 / 回退) |
| 生成报告 | 流程发布文档报告_<流程号>_<YYYYMMDD>.md |
| 重建流程图 | flow_<key>.png |
| 备份 | <BACKUP_DIR>/<阶段名>_前/(内含 MD5 清单) |
| 快照 | <DUMP_DIR>/<对象>_<阶段>.txt / .xml |
| 结构指纹留痕 | fingerprint.json(docx_probe.py --fingerprint;跨轮 --fp-compare 比对) |
| 校验报告 | --json(机器可读)/ --html(自包含单文件、零依赖,留痕查阅用) |
6.1 交付门(2026-11-05 起 · 与 §10D D1 的等级列联动)
| 门 | 判据 | 不通过的处理 |
|---|---|---|
| G-0 阻断清零 | 本次范围内 P0 判据项 = 0(C-01 吸附框 / C-04·05 起止 / C-06·07·08 断链 / C-11·12·13 判断分支 / C-14 隐式汇合 / C-17·18·19 几何 / D-01 章节缺项 / D-03 图文不一致) | 拒绝交付,只能出「问题清单 + 整改方案」 |
| G-1 告警登记 | P1 项(C-15 回退环 / C-20 残留副本 / C-22 菱形网关混用 / D-02 编号跳号)逐条进报告「已知问题」段,含处置意见(改 / 不改 / 待裁定) | 未登记即视为漏检,退回重出 |
| G-2 提示归并 | P2 项(C-21 逆向无标注 / F-03 命名)可批量归并说明 | 不阻断 |
| G-3 三件对齐 | 图 / 文 / 附表按 references/three-way-alignment-template.md 填完,差异项均已定性 |
未填 = 未完成交付 |
一句话:P0 不清零不出门,P1 不登记算漏检,P2 可归并,三件不对齐不算完。
7. 依赖与版本约束
> 唯一事实源:pyproject.toml 的 [project.dependencies](本表须与之同步)。
> 装了但用不到的可选件一律优雅降级,不阻断主流程。
> extras 三档(选型报告 P0,对标 docling 分层):minimal 仅解析校验(无需 Windows/COM)|
> office 完整作业运行时(COM 通道 + 重建 + 配置 + 明文 xlsx)|test 全量回归。
| 依赖 | 版本约束 | 用途 | 分层 | 缺失后果 |
|---|---|---|---|---|
pywin32 |
>=306,<313 |
Word/Excel/PPT COM、DLP 白名单通道 | 主依赖(office/test) | COM 通道不可用 |
comtypes |
>=1.4,<2 |
备用 COM 通道(pywin32 失败时自动降级) | office/test | 降级链少一档(pywin32 正常时无感) |
Python 标准库 xml.etree |
— | .epros 解析 |
内置 | — |
defusedxml |
==0.7.1(锁定) |
XML 解析加固(XXE/实体展开) | 主依赖(minimal/test) | 降级标准库,无实体防护 |
lxml |
>=6,<7 |
WordOpenXML 结构化解析(首选引擎,缺失降级正则) | office/test | 降级正则引擎(行为等价) |
matplotlib |
>=3.8,<4 |
流程图高保真重建 | office/test | 重建步骤 SKIP |
pyyaml |
>=6.0 |
配置校验(严格解析) | office/test | 降级正则校验 |
Pillow |
>=10 |
重建产物像素抽检(R 系列) | office/test | R 系列 SKIP |
openpyxl |
==3.1.5(锁定) |
仅明文 xlsx 场景(DLP 加密件读不了) | office/test | xlsx 明文直读不可用 |
pytest |
>=7.4 |
单元测试 | test | 测试段 SKIP |
锁定理由(选型报告 P0):defusedxml==0.7.1 —— API 已冻结、XXE 加固不可替代,仅作加固层不承载业务逻辑;
openpyxl==3.1.5 —— 官方仓库在 Heptapod(非 GitHub)、发布节奏慢,锁版本防 API 漂移外溢。
python-docx 不入运行时依赖:维护模式(近 6 月默认分支 0 提交),仅作 OOXML 对象模型命名语义的参考实现;DLP 加密下读不了,走 COM。
# 完整作业运行时(office 档)
pip install "pywin32>=306,<313" "defusedxml==0.7.1" "lxml>=6,<7" "comtypes>=1.4,<2" "matplotlib>=3.8,<4" "pillow>=10" "pyyaml>=6.0" "openpyxl==3.1.5"
pip install pytest # 仅开发/回归需要(test 档)
7.1 评估依据(周下载量 / 生产案例 / 维护活跃度,数据实测于 2026-10-12~13)
采用
| 方案 | PyPI 周下载 | GitHub ★ | 最近提交 | 许可 | 判定理由 |
|---|---|---|---|---|---|
matplotlib |
39,567,399 | 23,353 | 2026-10-11 | PSF 系 | 绘图事实标准,持久活跃 |
pywin32 |
3,530,298 | 5,621 | 2026-10-07 | PSF | Windows COM 唯一成熟方案 |
comtypes |
430,195 | — | 2026-09-21 | MIT | P2 新引入:纯 Python 备用 COM 通道(Enthought 商业维护,近 12 月 4 版),pywin32 故障时降级链自动切换 |
defusedxml |
52,873,433 | 555 | 2024-09-03 | PSF | API 已冻结、极稳定,无维护风险 |
lxml |
90,987,136 | 3,065 | 2026-10-11 | BSD-3 | P1 新引入:WordOpenXML 结构化解析(recover 容错片段 + 不展开实体),双引擎等价实测通过 |
Pillow |
147,721,937 | 13,890 | 2026-10-12 | MIT 系 | 像素抽检 |
pytest |
201,344,430 | 14,587 | 2026-10-11 | MIT | 测试事实标准 |
pyyaml |
242,292,730 | — | — | MIT | YAML 解析事实标准 |
剔除(附理由)
| 方案 | PyPI 周下载 | GitHub ★ | 最近提交 | 许可 | 剔除理由 |
|---|---|---|---|---|---|
graphviz |
8,208,891 | 1,814 | 2026-07-11 | MIT | 需系统二进制;且会重新布局,破坏源图保真 |
pygraphviz |
130,717 | 848 | 2026-10-08 | BSD-3 | 同上 + 需编译 + 下载量低 |
pyorthogonalrouting |
54 | 0 | 2026-10-04 | AGPL-3.0 | 事实上无人使用 + 传染性许可 |
pm4py |
37,770 | 1,053 | 2026-10-09 | AGPL-3.0 | 面向标准 BPMN,EPROS 非标;AGPL |
pybpmn-parser |
29 | — | — | BSD-3 | 采用度近零 |
SpiffWorkflow |
11,718 | 1,925 | 2026-10-09 | LGPL-3.0 | 面向标准 BPMN 2.0,无非标适配价值 |
python-docx |
25,644,534 | 5,741 | 2026-08-01 | MIT | DLP 加密下读不了;本流水线走 COM,依赖为零 |
docxtpl |
922,687 | 2,721 | 2026-07-07 | LGPL-2.1 | 价值在 {{变量}} 填充;需逐节点动态建表且模板不可读 |
shapely |
15,814,745 | 4,524 | 2026-10-09 | BSD-3 | 源已给几何,无需裁剪/求交 |
networkx |
49,922,043 | 17,319 | 2026-10-06 | BSD-3 | 只需出入度统计,标准库足够 |
loguru / structlog |
16,437,904 / 24,509,184 | 24,139 / 4,971 | 2026-10-11 / 10-05 | MIT / — | 面向长驻服务;本包是「跑完即退」批处理,引入只增负担(详见工程约定 §六) |
核心取舍结论(两条):
- 不引入任何布局/布线库——EPROS 已提供 100% 精确且正交的连线几何,
重算布局会降低而非提升与原图的一致性。最准确的重建方式就是照搬源几何。 - 不引入结构化日志库——批处理脚本用轻量
info()/warn()已足;
若将来接入 CI 日志采集再评估。
8. 脚本清单
| 脚本 | 作用 |
|---|---|
scripts/verify_common.py |
共享底座:统一结果模型 / 退出码 / stdout-stderr 分离 / 脚本引导 / 多形态报告(--json 机器可读、--html 自包含零依赖) |
scripts/dlp_channel.py |
共享底座:DLP 探测 + 通道选择 + 四级降级链(mcp → com/pywin32 → comtypes → plain,后端切换事件留痕 COM_SWITCH_LOG) + Word COM 安全封装(路径坑/Cells 坑)+ 写后回验 |
scripts/docx_probe.py |
共享底座 · 只读探测原语 + CLI:段落三分类 / 空行连续段 / 分节符载体判定 / 边框权威读取(OOXML,lxml 首选 + 正则降级双引擎,等价实测) / 单元格有效值 / TOC 条目与制表位 / 结构指纹(含 fingerprint.json 留痕与跨轮比对)/ 表格角色判定。命令行一图流:python scripts/docx_probe.py <file.docx> [--json out.json] [--fingerprint fp.json];不开 Word 跨轮比对:--fp-compare 上一轮.json 本轮.json(漂移退出码 1) |
scripts/docx_guard.py |
共享底座 · 守卫与安全编辑:Guard 结构不变量上下文管理器 / safe_delete_paragraphs(分节符保护)/ refresh_toc_then_restore / set_toc_entry_tabs / save_dlp(SaveAs2+重试)/ cleanup_orphan_word / remove_lock_files |
scripts/epros_probe.py |
生成链:.epros 结构化普查、泳道归属、连线守恒、精确几何解析、诊断清单、JSON 报告 |
scripts/gen_flowchart.py |
生成链:高保真流程图重建 PNG(源坐标 + 源折线 + 源配色;复用 probe 解析保证图/表口径一致) |
scripts/verify_flowchart.py |
生成链:几何保真度校验(P 位置 / E 连线 / R 产物像素,共 14 项) |
scripts/verify_docx.py |
两链共用:统一终验(G 系列 + V 系列 + C 通用项),强制只读 |
scripts/check_config.py |
配置校验:YAML 语法 + 必需键 + 未回填占位符 |
scripts/selfcheck.py |
一键自检:依赖 → 配置 → 解析 → 渲染 → 单元测试 → 文档门槛(17 项) |
benchmark/run_bench.py |
基准跑批(P3):解析耗时 / 边框双引擎耗时+等价断言 / 渲染耗时+几何保真;--save 存基线、--json 对比(>3× 判漂移),全部合成样本不依赖 COM |
分层口径:docx_probe 只读、docx_guard 只写、verify_* 只验 —— 三者不交叉。
一次性诊断脚本不再落盘,改用 docx_probe.py CLI;确需临时脚本时,先确认原语模块是否已覆盖。
工程约定(改脚本前必读)见 references/engineering-conventions.md。
事故档案与症状→处置对照见 references/docx-com-recipes.md §九。
交付说明统一模板见 references/delivery-note-template.md(Phase E 依据,≤5 节)。
9. 自检命令
# ★ 改动后先跑这个:全链路自检(含 pytest 全量)
python scripts/selfcheck.py
python scripts/selfcheck.py --epros "路径/流程.epros" # 追加真实语料回归
# 0) 配置校验
python scripts/check_config.py config.yaml --strict
# 1) 通道预检(DLP / COM 可用性)
python scripts/dlp_channel.py <参与文件...>
# 2) 生成链:解析 .epros
python scripts/epros_probe.py "路径/流程.epros" --json probe.json
# 3) 生成链:高保真重建流程图 + 几何保真度校验
python scripts/gen_flowchart.py -i "流程图目录" -o "输出目录" --dpi 150 --strict
python scripts/verify_flowchart.py "路径/流程.epros" --png out/flow_x.png --strict
# 4) 终验
python scripts/verify_docx.py 'D:\path\输出.docx' --chain generate --probe-json probe.json
python scripts/verify_docx.py 'D:\path\输出.docx' --chain align --backup 'D:\bak\原稿.docx'
# 4b) 结构指纹留痕与跨轮比对(N-04:每轮作业存一份,漂移退出码 1)
python scripts/docx_probe.py 'D:\path\文档.docx' --fingerprint fp_本轮.json
python scripts/docx_probe.py --fp-compare fp_上一轮.json fp_本轮.json
# 5) 单元测试
python -m pytest tests/ -q
# 6) 基准跑批(可选;改动后与基线比对,>3× 判漂移)
python benchmark/run_bench.py --json benchmark/baseline_20261013.json
退出码约定
| 码 | 含义 |
|---|---|
| 0 | 全部通过 |
| 1 | 有校验项 FAIL |
| 2 | 用法/入参错误(文件不存在等) |
| 3 | 运行环境缺失(依赖未装、COM 不可用) |
| 4 | 内部异常 |
所有脚本统一遵守;--strict 会把 WARN 也升格为失败。
结果走 stdout,诊断走 stderr —— prog > report.txt 只拿结果。
10. 最小执行清单
生成链
- [ ] Phase 0 路径校验 + DLP 探测 + 单通道确定
- [ ] Phase A 解析 .epros → expected_rows 与待确认清单
- [ ] Phase C-G 按模板生成(分节版式 → 逐章写入 → 插图 → 域刷新)
- [ ] Phase D G 系列终验(节点守恒/泳道一致/字体/横向节)
- [ ] Phase E 交付说明 + 待确认项 + 呈现文件
对齐链
- [ ] Phase 0 路径校验 + DLP 探测 + 单通道确定
- [ ] Phase B 规范条款抽取 + 模板参数实测回填
- [ ] 备份(含 MD5)+ 文本基线 dump
- [ ] 待改项清单(格式类 / 内容类分离)
- [ ] Phase C-A 分维度小事务执行(每批 ≤10、批后即验)
- [ ] Phase D V 系列终验(文字 diff / 格式抽验 / 结构 + 编码态)
- [ ] Phase E 交付说明 + 待确认项 + 呈现文件
10A. 流程梳理全案经验 · 应包含的要点 / 覆盖范围 / 预期效果(2026-10-16 系统归纳)
> 本节为单日五轮迭代(业务流程图梳理 → 流程文件编制 → 多源标准融合 → 走线规范 → 协作框标注)的系统归纳:
> 把当日发现的问题与难点提炼为可复用经验要点,明确本技能「应包含的要点 / 覆盖范围 / 预期效果」,供后续同类任务直接对照执行。
10A.1 应包含的要点(11 条 · 逐条可执行)
| # | 要点 | 关键动作 / 判据 | 落位章节 |
|---|---|---|---|
| 1 | 参考标准获取与解析 | DLP 加密 xlsx 走白名单通道只读提取;sheet 内嵌流程图用 Excel COM CopyPicture(xlScreen,xlBitmap)+剪贴板导出 PNG(xlsx 内 1×1「流程图」sheet 即为嵌入图片);解析后先建「节点→标准照表」再设计 |
参见 transparent-encrypt-file-mcp 技能 |
| 2 | 编号口径先行核对 | 多版本编号体系(流程清单 / 架构卡 / 融合版)先核准唯一基准;同号不同名禁止混用;改号须全链同步(文件名 / ABBR / 表单编码 / 正文引用 / 修订记录) |
§3 Phase A · v1.3.7⑥ |
| 3 | 多源标准融合与对齐声明 | 以基准标准为锚(如 RBXS-14 合同管理);节点划分 / 名称 / 顺序 / 衔接口径逐项映射;输出《节点对应关系表》+《差异说明》(几处、为何、待裁定项) | 本节 · §6 |
| 4 | 流程顺序与逻辑重梳 | 关键结构判据:评审前置于起草(按基准标准);常规 / 特殊分流前设审核把关节点;逐级评定串行链+统一回退落点;条件性节点(纠纷 / 修改终止)线性化+触发条件写明 | 本节 |
| 5 | 角色映射与更名 | 跨公司 / 板块角色先出《映射对照表》并标〔待确认〕;用户拍板后全量替换(泳道 / 角色表 / 活动表 / 对照表 / 注文)+残留检查(仅保留「原 XX 更名」追溯表述) | 本节 |
| 6 | 竖向分叉点对齐(绘图规范 A) | 横向多条连线时:同源出线共源侧竖杆、同目标入线共目标侧竖杆,分叉 / 汇合点对齐同一位置;节点级共享槽位+3 段 Z 形 prefer_gx2(均为生成器默认);坐标分组断言校验 |
§3 布线纪律⑦ |
| 7 | 多人员活动标注(绘图规范 B) | 同一活动涉及多人员:添加协作框(橙色虚线 DottedRect 外裹副本组,亦称协助框)或依据逻辑关系添加连线(副本同进同出);二者择一必选、禁止孤立悬挂;生成器默认自动加框 |
§3 协作框规范 |
| 8 | 生成 → 校验 → 渲染 → 目检闭环 | epros 生成后四件套:verify_epros --pair 交叉校验 → 穿越检查(0 hits)→ 走线对齐分组断言 → 预览 PNG 目检;副本类 WARN(孤立副本 / ActivityId 重复 / 行数差 +副本数)为批次固有,记录不拦交付 |
§3 · §9 |
| 9 | 版本与快照纪律 | 每轮改版先备份:新版以新文件名产出、旧版入 _backup_.../;用户手工版 epros 禁重生成(会覆盖手工走线);生成器行为升级后如需回溯旧图,先 cp 快照再处理 |
§4 硬约束 · v1.3.7① |
| 10 | 双版本输出 | 交付形态按需并行:绒布体例《流程标准》(节点编号|名称|工作标准|责任岗位|单位用时|频率|附件|参考编号)+ 12 章《流程图交付文件》;两版节点 / 编号 / 角色互相一致(改动同步双改) | §6 输出规格 |
| 11 | 菱形审批顶点分工(绘图规范 C) | 菱形判断框双分支:通过(含并行通过)→ 右侧顶点、不通过(退回)→ 底部顶点,不得共用同一顶点;入边恒走左侧顶点;生成器默认分工(回边自底部顶点直下图底回流区、按目标分层、有障碍短降横移);标签贴连线起点旁 | §3 连接点规范 |
10A.2 覆盖范围
- 输入侧:DLP 透明加密环境下的参考标准(xlsx / docx / pptx,含 sheet 内嵌流程图)、存量流程文件(
.epros/ md / docx)、用户口述绘图规范; - 处理侧:
.epros生成 / 校验 / 渲染 / 目检全链;多源标准融合与对齐声明;节点—顺序—逻辑—角色—编号全链梳理;走线规范(竖向分叉点对齐、菱形顶点分工、协作框 / 连线标注、回退线走图底回流区);流程文件 12 章编制、版式对齐与 Word 发布文档生成; - 输出侧:
.epros工程文件 + 高保真预览 PNG +《流程图交付文件》(12 章)+《流程标准》(绒布体例)+ 交付说明与留痕(版本备份 / 校验报告)。
10A.3 预期效果
- 不重复踩坑:编号错乱、顺序错位、角色映射不一致、走线歪斜、多人员副本孤立悬挂、菱形双分支共挤同一顶点、版本覆盖丢改动——七类已知问题均已有前置判据与校验断言(要点 2/4/5/6/7/9/11);
- 一次做对:三条绘图规范与协作框均已沉淀为生成器默认行为,正常生成即符合规范,无需事后手工修补;
- 全链可核对:节点对应关系表 + 差异说明 + 走线坐标断言 + 交叉校验报告 + 版本快照,每个结论可溯源、可复核。
10B. 2.2.7 十轮迭代工程经验 · 布线判据链 / 双源校验 / 手动版比对 / 10 列升级 / 模板收敛(2026-10-16 深夜~10-17 系统归纳)
> 承接 §10A(单日五轮),本节归纳 2.2.7 合同签订流程 V6.0→V10.0 十轮迭代(含手动调图比对、授权额度分级审批、
> 双分段图、闭环补全+全面泛化、第 8 章 10 列升级、按模板形态收敛)中新增且可复用的判据与 SOP。
> 项目脚本锚点:<工作区>/_out10/_scripts/(_audit_227_v7.py 参数化版 / _audit_cross_AB.py / _cmp_227_user_0813.py /
> _gen_split227*.py / _generalize_227.py / _upgrade_227_v10.py / _tplclean_227_v10.py / _dump_template_struct.py)。
B1 布线对齐判据链(补全 §10A 要点 6)
| 判据 | 条件 | 走法 | 事故形态 |
|---|---|---|---|
| 直达 / Z 形 | 常规 | 1 段 → 3 段 Z 形 | — |
prefer_gx2 |
源出度<2 且目标入度≥2 | 竖杆落目标侧(同目标共杆) | 同目标入线折点参差 |
both_multi(新增) |
源出度≥2 且 目标入度≥2 | 禁用 3 段 Z 形(只有一根竖杆,两侧无法同时共杆)→ 改 5 段:源侧 gx1+目标侧 gx2+中间水平干线 | 两条分级审批线汇入同一节点时折点 3542/3732 参差;修复后统一 3798 |
B2 md 解析三坑(解析器加固)
| # | 坑 | 判据 / 修复 |
|---|---|---|
| 1 | 第 8 章 9 列活动表混入第 7 章解析(.+? 可吞 \|,列数不能作区分依据),曾致 46 项误报 FAIL |
第 7 章表行过滤必须加「列3∈类型词集(活动/判断/网关/起始/结束/触发事件/子流程调用/文件)」 |
| 2 | 节点名含全角括号(如「合同审批(≤30 万元)」)被 ^(.+?)[((](.+?)[))]$ 误判为「名称+分支条件」 |
节点名档位用间隔号「·」分隔(合同审批·授权额度内),禁用全角括号 |
| 3 | 表格行按 startswith("\| 0") 过滤编号行只匹配 010~090,漏 100~210 |
按首列编号判定(split 后 cells[0]∈编号集),勿用行首前缀 |
B3 校验链四件套与豁免规则(补全 §10A 要点 8)
| 件 | 脚本锚点 | 覆盖 |
|---|---|---|
| 综合校验(双源) | _audit_227_v7.py <md> <out.txt> <epros> |
7 项:入/出度、引用指向、重复冗余、判断分支互斥/标签/闭合、协作框几何包覆、折点锚点唯一性、端点解析率;md 第 7 章为权威逻辑、epros 为实现体 |
| 跨图一致性 | _audit_cross_AB.py |
分段图A/B:节点并集=总图业务节点、跨图入口/出口一一闭合、协同节点不丢、分支互斥;同名不同类型=跨图引用而非重复(图A 活动实体 / 图B 子流程调用) |
| 几何核查 | _geo_v8.py |
泳道归属(RoleFigure 中心最近匹配)+节点盒重叠(排除同名副本);⚠️ 坐标属性是 PoLongx/PoLongy(用 X/Y 全为 0,曾产生 465 假重叠) |
| 配对校验 | verify_epros.py <epros> --pair "<epros>::<md>" |
图/规格配对;孤立副本 / ActivityId 重复 / 行数差=批次固有 WARN |
豁免规则:用户手动布局下(EPROS 打开保存过),规则 1 折点对齐 FAIL 属预期豁免——以手动版为准,如实披露 FAIL 项数与原因,不得回改用户图。
B4 手动版比对 SOP(补全 §10A 要点 9 / v1.3.7①)
- 先快照:
cp到_user_snapshots/<名>_用户手动版_<日期>_<时分>.epros; - 内存重建基线:
G.build_flow(md, no, name)+G.serialize(不落盘),parse 后与用户版做语义 diff 五级:节点(键FigureType+FigureText+roleName)/ 连线(键src+tgt+label)/ 协作框(按中心点包覆集合)/ 泳道 / 画布;坐标差 ≤8 视为容差; - 判读口径:节点/连线 0 增删+标签不变+协作框不变 ⇒ 逻辑零变更、纯布局优化——文件层只需改图占位说明,不改逻辑内容;布局变化按梯队归纳(如「评审区右移~85 / 审批区右移~180」);段数变化(5→4 段等)=EPROS 重排走线,拓扑不变,如实记录;
- 报告落盘
_cmp_*_报告.md(五级变更表+影响说明)。
B5 分段双图管线(总图 → 图A/图B)
- 链路:
_gen_split227.py(抽总图第 1/2/3/4/6 章骨架+硬编码替换第 7 章表 →_split227/子目录,避开all_flows顶层扫描防同编号覆盖总图)→_gen_split227_epros.py(注入G.ABBR["2.2.7-A"]="HTPS"等后调build_flow+serialize); - 编号沿用总图体系不按段重编(分段图跳号属正常形态);跨图衔接用「子流程调用」节点(ImplFigure),EPROS 单文件内无法跨图连线;
- ⚠️ SRC 与第 7 章表硬编码——总图升版后须同步,否则重跑分段图会回退到旧逻辑。
B6 第 8 章 10 列升级与 Word 适配
- 列结构:9 列→10 列:在「输出」后新增「异常处理」列,「角色」更名「责任人」;
- 列宽:
COLW["activity10"] = [700,1200,4900,1200,1100,1000,1500,860,700,740](合计 14200 ≤ 横向节 14358 twips),按首表行列数==10 动态切换; - 附章节解析:
## 附:…作为独立章解析(no="附N");---水平线跳过、>引言转 note;附章节表格动态等分列宽(首列 500,纵向节 9426);附章节小节不套「标题 2」(见 §4 硬约束); - 校验器适配:
TBL_HEADERS_10(10 列基准头)+G-09 骨架允许「附:」章(标题1≥12 且第 13+ 个以「附:」开头)+jobs 按实际行数登记; - 收敛(正式交付):按模板形态删除附章节后,
_gen_flow_doc.py的附章节解析仍保留(审阅稿形态仍可用)。
B7 模板形态收敛 SOP(「参照模板删除多余的内容」)
- 定标尺(dump 实物,勿凭记忆):
_dump_template_struct.py只读 dump 基准 docx——章节骨架 / 注文数 / 各表行列与表头 / 修订记录行数;再用已验收先例(如同批另一份已对齐 PASS 的成品)校准出「模板形态 ± 先例容差」(如基准注文 0 条,先例 6 条=同型注文可保留); - 出删除清单(三类):①模板无的整章(附章节);②过程性注文(编制沿革、参考标准声明、列级口径说明——信息须有正文/其他注承接后才能删);③修订表历史行(收敛为「V1.0 新建+当前版全量摘要」);
- 待确认项转移:删除项中的〔待客户确认:…〕汇总到当前版修订行或相关正文,一个都不丢;
- 保留项白名单:正文/术语中的待确认标记、业务口径注(如五大类指标定义)、先例同型注文;
- 备份 → 收敛 → 重生成 → 终验(骨架计数回到基准形态)→ 交付说明列删除清单与回退路径。
B8 泛化口径与残留扫描(长期口径,见 §10A 与项目 MEMORY)
- 泛化词典脚本(保护
| Vx.x |修订行)跑完后,必须再做数值型残留专项扫描:\d+ 分钟、\d+ 万元、\d+ 元、\d+ 日前等——多轮泛化后仍有漏网(实测 150 行「60/240 分钟」残留至 V10.0 才清出); - 审批分级按「授权额度内/超授权额度」命名,阈值一律指向公司《合同审批授权表》;
- md「字符数」≠「字节数」(UTF-8 中文 3 字节),脚本自检打印与
ls差 ~2.5 倍属正常。
10C. 批次格式统一工程经验 · 基线分族 / 角色法分类 / 段距行单位 / 明文审计通道(2026-10-19,10 份流程文档实测)
> 承接 §10A(单流程梳理)与 §10B(单文档十轮迭代),本节归纳一次批量统一 10 份流程文档(Letter→A4、三种基线族、
> 约 4750 段落 / 94 表格、文字零改动硬约束)的全链经验。项目锚点:<工作区>/流程10.18/_tools/
> (_apply_fmt.py 套用 / _audit.py 只读审计 / _text_diff.py 差异归因 / _profile.py 前后画像 / _report_html.py + _html2docx.py 出报告)。
> 实测结论:10 份 0 格式不符合项;正文与表格文字逐段一致;耗时 套用 6~7 min + 审计 4~5 min(两轮)。
C1 基线先分族,规则再落地
同一批文档常来自不同模板代际,逐份定制既慢又不可复现。先按「页型 + 节数 + 样式体系 + 表格样式」四维聚类,
同族共用一套规则;族间差异只落在「是否需补样式/是否需改页型」这一层。
| 族型(本批实测) | 特征 | 需额外做的结构动作 |
|---|---|---|
| A 单节 Letter 型 | 612×792pt、1 节、全篇仅「正文」样式、目录为手工条目列表(无页码)、无目录域 | 改页型与边距;按文本判定后补「标题1/标题2」样式;目录只排版本(不转自动域,否则会新增页码文字,违反零改动) |
| B 四节 A4 自定义样式型 | 4 节已正确、样式名自造(表格内容/段/table++)、标题纯黑 |
只改字符与段落格式、表格边框与字号 |
| C 四节 A4 网格型 | 4 节、表格样式「网格型」、边框 0.75~1.5 磅混用 | 统一边框 0.5 磅;标题/正文/表格字号重设 |
做法:先用 _profile.py 出四行画像(页型/节数/样式 Top5/表格边框与字号分布)再分组,不要打开文档逐份目测。
C2 角色法分类(样式名不可靠)
把每个非表格段落归入下列角色,规则按优先级自上而下命中即停。归一化:去 \r \x07 \x0c \t、去前导 N、/N.,并加「短文本」约束(章名 ≤14 字、节名 ≤22 字)防正文句子误命中。
| 角色 | 判据 | 本批目标格式 |
|---|---|---|
| 表格内段落 | Range.Information(12) 为真 |
交表格层处理,段落层直接跳过 |
| 目录条目 | 样式名以 TOC 开头;或(区间法,见下)区间内且文本=章名/节名 |
15 磅、段后 8、一级缩进 0/二级 22 |
| 章标题 | 样式=标题 1;或归一化文本 ∈ 12 章名集 |
15 磅粗 #0F4761、两端、段前 8/段后 2(「流程说明」24/4)、多倍 13.9、与下段同页 |
| 节标题 | 样式=标题 2;或 ∈ {文件拟制/修订记录, 附则} |
15 磅粗 #0F4761、段前 6/段后 2 |
| 目录标题 | 文本 ∈ {目录, 目 录, 目 录} | 15 磅粗、居中、段后 6 |
| 表题注 | 文本 ∈ {术语表, 角色职责匹配表, 业务流程图, 流程活动说明表, 流程指标定义表, 相关文件清单, 文件编制控制表} | 15 磅常规(去粗)、居中、段后 2 |
| 封面 | 索引 < 目录标题索引 | 标题 16 磅粗居中段后 10;信息行 16 磅左对齐段后 2 |
| 正文 | 其余 | 14 磅、两端、多倍 13.9、段前后 0、首行缩进 0 |
目录区间定位(必须做,否则 12 个章标题会被误判成目录条目):
- 目录标题索引 = 首个「文本 ∈ 目录集」的非表格段;
- 目录终点 = 该段之后首个含
\x0c(分页/分节符)的段落;找不到则退化为「目录标题 +18 段」; - 只有
目录标题索引 < i < 目录终点的短文本才按章名/节名归入 TOC1/TOC2。
> 实测首轮未设边界时 h1 计数 24(12 真章标题 + 12 目录条目),设边界后回到 12。
C3 段距「行」单位坑(本批最高频,4/10 份中招)
| 项 | 内容 |
|---|---|
| 症状 | 设 SpaceBefore=8 / SpaceAfter=2,保存后回读 19.05 / 9.5;比值 2.381 / 4.75 = 行高 38.1pt 的 0.5 / 0.25 行 |
| 根因 | 段落存的是 w:beforeLines="50" w:afterLines="25",SpaceBefore 只是换算视图;中文版 Word 优先按行 |
| 修法 | LineUnitBefore=0 → LineUnitAfter=0 → SpaceBeforeAuto=False → SpaceAfterAuto=False → SpaceBefore=磅值 → SpaceAfter=磅值(样式定义同样要清,否则继承段落照样漂) |
| 验证 | 必须另起进程只读回读,容差 ≤0.1pt。同一会话内回读读到的是「刚设的值」,测不出这个坑(首轮 4 份"设了但没落地"正是这样漏过的) |
| 判读 | 回读值 ≠ 目标值时,先怀疑行单位、再怀疑赋值失败;LineUnitBefore 读回 0 也不能证明 XML 里没有 beforeLines |
C4 表格排版分档(一表一判,勿全表同参)
| 表型 | 判据 | 字号 | 行距 | 边框 |
|---|---|---|---|---|
| 审批栏 | 首格含「审批栏」 | 16 磅 | 多倍 13.9 | 0.5 磅 |
| 活动说明表 | 列数 ≥9(先判列数再判关键字) | 12 磅 | 固定 13 磅 | 0.5 磅 |
| 普通表(档案/术语/角色/指标/支持/文控) | 其余 | 14 磅 | 多倍 13.9 | 0.5 磅 |
- 边框六向全设:
1 / -1 / -2 / -3 / -4 / -5,LineStyle=1、LineWidth=4(wdLineWidth枚举 4=0.5 磅);单元格级-5/-6不支持,勿在 cell 上设内线。 - 加粗一律不动:表头与指标卡标签的加粗是语义层次,统一去粗会削弱可读性。
- 单元格段前后 0、首行/左右缩进 0、顶端对齐;表格整体左对齐;列宽不重分配(见 §4 硬约束)。
- 复核口径:COM 读回
1/4即正确;Word 导出的 HTML 显示1.0pt属导出上取整,与基线表现一致就是正常,勿按 HTML 判缺陷。
C5 目录域重算的差异归因
见 Phase D 的「V-01 判据修正」表。要点:页码变化不算正文改动,整行消失必须回备份核实后显式披露。本批 8 份含目录域(7~14 行页码重算),其中 2 份各有 1 条指向「9、裁剪指南」的失效条目(该章在正文中不存在)随重算消失,正文段数变化 556→555,已在报告中单列说明。
C6 DLP 下的明文审计通道(本批关键突破)
| 通道 | 结果 | 用法 |
|---|---|---|
Word → PDF(ExportAsFixedFormat(...,17)) |
落盘仍 00 00 5b 00,pypdfium2 报 PdfiumError: Data format error |
❌ 不能用于版面核对 |
Word → 筛选 HTML(SaveAs2(out.html, 10)) |
文件头 <html>,明文可解析 |
✅ 核对 @page{size;margin}、h1{color:#0F4761}、td{border:solid windowtext .5pt}、font-size |
| COM 只读属性 | 可信,但主题色返回 0xD4xxxxxx 编码 |
与 HTML 交叉确认 |
主题色处理:Font.Color 为 0xD400BFFF 这类值(TextColor.ObjectThemeColor ≠ 0)时,不要把这个长整型照抄到目标文档——目标主题不同即变色。用 HTML 解析出真实 RGB(本例 #0F4761),按 R + G<<8 + B<<16 设为直接色最稳。
批量变更报告结构(5 段,本批成品可直接复用):
- 任务概述表(基准/对象/方式/校验/备份位置);2. 参考规范表(逐项实测值,注明「非目测」);
- 文件清单(序号/文件名/所在文件夹/段落数/表格数/文字校验/审计结论);
- 逐份 before→after 表(只列发生变化项,未变化标「(未变更)」)+ 主要变更项一行;
- 校验结论 + 说明事项(编号属文字未改、目录页码重算、列宽未动、加粗保留)。
生成方式走 HTML → docx(SaveAs2(...,16)),比 COM 逐段建表稳(天然避开本文「Word COM 生成 · 结构性七坑」)。
C7 批量执行节奏与留痕
| 环节 | 纪律 |
|---|---|
| 备份 | shutil.copy2 字节复制加密件;MD5 与原件一致即证明副本有效(DLP 只加密写入方,字节复制保真);落盘后读文件头仍为 00005b00 |
| 进程 | 串行单进程:每份 30~60s,10 份约 6~7 min,必须后台跑(默认 120s 超时会被杀并留下 WINWORD 残留) |
| 残留 | 每轮开跑前清无窗口 WINWORD(MainWindowTitle -eq '')并清 HKCU:\Software\Microsoft\Office\16.0\Word\Resiliency |
| 角色分离 | 套用(写)串行;审计(只读)与画像(只读)可并发,但审计必须在套用全部结束后另起进程 |
| 收尾 | 逐份核对:文件头 00005b00、大小合理、参考基准文件 mtime 未变(防止把基准也改了) |
C8 基准登记(防止「基准串台」)
同一项目内并存多套基准,且「生成链基准」与「对齐链基准」是两个独立口径,不得互相覆盖:
| 口径 | 基准 | 关键差异 |
|---|---|---|
| 生成链(§模板基准 V1.1) | 产品市场信息调研分析流程-V1.1.docx / 竞争对手产品分析流程-V1.1.docx |
章标题段前 15.6/段后 7.8;表题注 12 磅带「表 N」前缀;表格 12 磅 |
| 对齐链(本批 2026-10-19) | 2.1.1…9.17日-2.docx / 2.1.2…9.17-1.docx(用户当批指定) |
章标题段前 8/段后 2;表题注 15 磅无前缀;表格 14/12/16 磅;封面节边距 57 |
| 历史(仅溯源) | 流程打样/9.25/2.1.1… / 2.1.2… |
版式口径已作废 |
执行铁律:基准以当批用户指定为准,并在交付说明写明「依据版本号」;发现两套基准数值冲突时回报确认,不得自行择优。
10D. 流程图复核与整改工程经验 · 23 条判据 / 文本级手术 / 重接四级规则 / 跨工件一致性(2026-10-19,12 份 .epros 实测)
> 本节对应复核链:对既有 .epros 做逻辑与规范复核,并把「可机械判定」的缺陷直接改回文件。
> 实测规模:12 份 / 319 图元 / 224 流程节点 / 194 条连线;初检 194 条问题;完成第一优先整改后 175 → 136 条(高 98 → 63)。
> 工程锚点:<工作区>/流程10.18/_review/(epros_model.py 解析 → _review_epros.py 22 条机检 → _fix_epros.py 整改 → _fix_geometry.py 折线修补 → _compare.py 图文比对 → _report_html.py / _build_xlsx2.py 出交付)。
D1 复核判据表(23 条 = 连线逻辑 15 + 走向与结构 5 + 命名 2 + 元素语义 1,逐条可机检)
> 等级口径(2026-11-05 起):P0 = 交付阻断,不修完不得出交付物;P1 = 告警,须在报告中列明并给出处置意见;P2 = 提示,可留待人工润色。「阻断」列直接对应 §6 的交付门:P0 项 > 0 → 拒绝交付。
| 规则 | 等级 | 阻断 | 判据 | 典型成因 | 修正动作 |
|---|---|---|---|---|---|
| C-01 连线未吸附活动 | P0 | 阻断 | 连线端点所在图元 FigureType == DottedRect |
画线时点到虚线协作框 | 重接到框内目标活动(四级判据见 D4) |
| C-20 同名残留副本 | P1 | 告警 | 同名图元中 degree == 0 者 |
改版拖拽复制后未删旧框 | 删除无连线副本;两端都连线的只提示「多实例待确认」 |
| C-06/07/08 未连线 / 无入边 / 无出边 | P0 | 阻断 | 内部度数 = 0 / 入 0 出>0 / 出 0 入>0(排除起止、ImplFigure 移交) |
上面两类问题的下游表现 | 需业务定上下游 → 只出清单 |
| C-04/05 起点 / 终点缺失 | P0 | 阻断 | 无 FlowFigureStart、且无入度 0 的 EventFigure/CustomFigure;无 FlowFigureStop 且无移交型终点 |
客户惯用触发事件当入口 | 见 D6「起止图元不要自动加」 |
| C-11/12/13 判断无分支 / 分支过多 / 缺条件 | P0 | 阻断 | Rhombus 出度 <2 / >3 / 出边 LineText 为空 |
画了菱形但只连一条线;条件写在文档里 | 补条件标注(业务措辞,不代写) |
| C-14 隐式汇合 | P0 | 阻断 | 普通活动入度 ≥2 且无网关 | 全批仅 3 个网关图元 | 定 AND / XOR 后再加网关 |
| C-22 菱形与网关混用(2026-11-02 增) | P1 | 告警 | Rhombus 的 FigureText 含 XOR/OR/AND 前缀或「网关」后缀;或 XORFigure 名称含审批/审核/评审字样 |
生成侧旧规则「决策关键词优先于前缀」把 XOR 网关画成菱形(实测 14 例:2.2.5 ×1 / 2.2.6 ×3 / 2.4.1 ×2 / 2.4.2 ×3 / 2.4.7 ×3 / 2.6.2 ×2) | 二选一:语义是判定 → 保留菱形、改纯判定语;语义是分流 → 改 XORFigure 并保留前缀。只出清单,不代改语义 |
| C-15 回退环路 | P1 | 告警 | DFS 检出回边 | 审批退回、返工 | 标条件即可;环上无正向出口才是死循环 |
| C-17/18/19 端点未吸附 / 连线穿越节点 | P0 | 阻断 | 端点与目标边框距离 >6px;线段穿入非端点图元内部 | 手工拖拽后未吸附 | 重算折线(D5) |
| C-21 逆向连线未标条件 | P2 | 提示 | 目标 x 显著小于源 x 且 LineText 为空 |
回退或布局错位 | 确认语义后补标注 |
| F-03 命名不规范 | P2 | 提示 | 活动 >20 字 / 带句末标点 / 判断非「是否…」式 / 判断框带「网关」后缀 | — | 人工润色 |
| D-01/02/03 章节缺项 / 编号跳号 / 图文不一致 | P0 | 阻断(D-02 为告警) | 12 章白名单;首号 010 且步进 10;活动名集合比对 | 见 D7 | 文档侧修正 |
判定口径两条铁律:① RoleFigure / MapNameText / DottedRect / FreeText 是装饰图元,不参与连通性;② 吸附到协作框的线要计入源/目标的视觉度数,否则会与「死路径」重复计数。
D2 三个判据陷阱(都踩过,务必先看)
- 「分支条件普遍缺失」是错的判断。初判 13 处无条件,实测 20 个判断节点里 18 个已标注,只有 2 个节点、4 条出线缺失。先统计再下结论;本批真正的缺口在汇合侧(16 处多入边无网关),不在分支侧。
- 「同名图元」必须分两类:
degree=0的才是改版残留(删);两端都连线的可能是真多实例(如「战略规划流程」在同一张图出现两次),只提示、不动。 - 入口不能只看
FlowFigureStart:多数文件用EventFigure触发事件当入口。两者都无时才用「入度 0 且出度>0 的最左活动」推定,并必须标注为推定——否则可达度恒为 0,一片误报。
D3 整改手术规范(不重序列化)
| 操作 | 做法 |
|---|---|
| 删图元 | 正则匹配 <figures\b[^>]*FigureImageId="X"[^>]*/> 整块删除 |
| 改端点 | 按 OrderIndex 定位目标 <manhattanLines ...>,只在该开标签内替换 StartFigure / EndFigure |
| 换折线 | 按 OrderIndex 定位整个 <manhattanLines>…</manhattanLines>,整段替换内部 <lineSegments/> 序列 |
| 落盘前 | ET.fromstring(new.encode("utf-8")) 校验,再 open(..., "w", encoding="utf-8", newline="") |
| 顺序号 | OrderIndex 无需连续(实测原件本身就有 0,1,8,9… 的空洞),删除后不必重排 |
D4 重接四级判据(纯几何就近会判错)
按序命中即停,每条都记录判定理由;四级都不满足 → 不改,列入「待人工确认」:
| 级 | 判据 | 说明 |
|---|---|---|
| 0 | 候选名包含保留端名称(「参与客户分级评定」⊃「客户分级评定」) | 语义最强 |
| 1 | 端点已落在某候选图元内部(距离 ≤1px) | 确定性最高,原线其实已画到节点上 |
| 2 | 候选中恰有一个非「参与/协助」主体活动 | 破解「参与者框比主活动更近」的陷阱 |
| 3 | 几何距离显著占优:d0 ≤ 40 且 d1 ≥ 2×d0 或 d1 − d0 ≥ 60 |
兜底 |
> 反例:2.4.1 若纯按距离,会把「参与客户信息深度调研」(近 2px)当成主活动;规则 2 纠正为「客户信息深度调研」。实测 20 条中 15 条可判、1 条判「两端都是协作框→删除」、4 条留给人工(客户满意度 3 + 商务谈判 1)。
D5 重接后必须重算折线
只改 EndFigure 不改坐标 → 线头停在旧协作框边缘,视觉上仍是断的,且 C-17/C-18 立刻报错。按三走向重建 3 段正交线:
| 走向 | 折线 |
|---|---|
| 左 → 右 | 源右边缘 → 中间竖杆 x → 目标左边缘,竖杆 x 优先沿用原折点 |
| 右 → 左(回退) | 下沉 max(两端底边)+24 绕行,避免穿过中间图元 |
| 同列上下 | 源底/顶边 → 中点 y → 目标顶/底边 |
D6 副作用、验收与「不要自动做」的项
- 重接会暴露被掩盖的缺陷:某菱形的第 2 条出边原本连在协作框上,不计入内部出度,故「判断无分支」从未报出;重接后 C-11 才出现。这类必须在报告里标「新暴露的既有缺陷」,不能算整改回归。
- 画布必须复核:
WorkflowWidth/Height可能小于内容 extent(实测 2/12:画布 1464×644 装 2728×910 的内容,右侧 1/3 图元在画布外)。改为extent + 60。 - 整改后必须另起进程全量复审,并做前后逐文件对比(本次逐条留痕
fix_plan.json);同一进程内自检会漏掉未生效项。 - 起止图元不要自动加:图元自 x≈180 起排、紧贴泳道名列,补「流程开始」需把整图右移约 160px,属版面重构;自动平移会破坏客户版面。→ 出作业单(每份:加什么、建议坐标、连到哪个活动),由人在 EPROS 内 2 分钟完成。
D7 文档侧取证要点(三条都会造成误判)
| 项 | 坑 | 对策 |
|---|---|---|
| 活动表提取 | 合并单元格会让 Cell(r,c) 抛异常,逐格「键→右邻值」配对会把「流程责任人」等字段判成空(初版 10/12 误报) |
按行扁平化收集全部单元格文本,再用「键后第一个非空值」配对 |
| 编号判据 | 只比「是否 010 起、步进 10」不够 | 逐对比较 cur − prev == 10,报出具体跳号位置(实测抓出 150→170、005 起编) |
| 名称比对 | 直接字符串相等会把「市场/区域分析 vs 市场区域分析」判成缺项 | 归一化(去空白、编号前缀、括号内容、/·、 等标点)→ 再分「硬缺失」与「近似(表述不一致)」两级 |
D8 交付形态(四件套)
- 复核报告 docx:范围与方法 → 总体结论 → 分文件统计 → 问题分类与标准修正动作 → 逐份问题清单(位置/描述/建议)→ 整改优先级 → 说明与局限。
- 问题清单 xlsx:双表「待整改 / 已整改」,含状态列;整改后重出,已整改项进第二表而不是消失。
- 整改执行记录 docx:执行概述 → 已完成(含逐条改动与判定依据)→ 前后对比 → 未自动整改项及原因 → 起止图元作业单 → 回退与复验。
- 备份目录:
.epros原件快照,报告写明回退方法。
> xlsx 多表:Worksheets.Add() 之后必须 ws.Move(wb.Worksheets(n)) 排序——Add(After=...) 关键字在 pywin32 下不生效,新表会插到最前(与 §10C C7 同一结论)。
D9 跨工件一致性:三级分类与「不得自动改」的红线
复核「图 ↔ 文档」是否一致时,先限定比对对象,否则假阳性会淹没真问题:
| 比对范围 | 纳入 | 排除(重要) |
|---|---|---|
| 图侧节点 | RoundRectWithLine(活动)、Rhombus(判断) |
ImplFigure(子流程引用)、FileImage(文档)、EventFigure(触发事件)不参与比对——子流程是跨流程引用,本就不该在活动表里占行;实测 12 份里约六成「图中有、文档无」来自把它们当活动 |
差异按三级分类,处置门槛逐级升高:
| 级别 | 判据 | 可自动处理? | 处置 |
|---|---|---|---|
| 标点级 | 归一化后完全相等(差异仅在 /、·、括号、空格、标点) |
✅ 可 | 统一为无斜杠的干净写法,改任一侧皆可 |
| 措辞级 | 归一化后互含但不相等(如「客户市场产品收集」⊂「客户市场产品信息收集」) | ❌ 不可 | 需先定权威侧;语义可能不同(「组织执行改善措施」≠「执行改善措施」) |
| 实质级 | 无包含关系(文档有图中无 / 图中有文档无) | ❌ 不可 | 出作业单,由业务确认补画或补登 |
红线:不得自行决定「以图为准」还是「以文档为准」。判权威侧的依据是信息完备度——活动表带编号/角色/输入/输出/测量点(可执行),图只有名称与连线;但先看数量(见 D10),数量不等时改哪边都是错的。
D10 编号一致性:三处必须同时对齐
活动编号同时存在于三个地方,只改一处就会断链:
- 文档第 8 章活动说明表的「活动编号」列;
- 文档正文与 KPI 表中的引用,形如「活动总结与效果评估(110)」——这类括号引用极易漏;
.epros图元的ActivityId属性(可能带前缀,如HTQD-010、SCHDCH-020)。
| 步骤 | 做法 | 判据 |
|---|---|---|
| ① 先数数量 | 文档行数 vs 图中活动节点数 | 数量不等 → 不是「跳号」而是「漏行/漏节点」,此时禁止重排 |
| ② 再对编号 | 去掉 ActivityId 前缀后与文档编号做集合比对 |
缺哪个号 = 缺哪一行,位置可精确定位 |
| ③ 只在三者数量一致时重排 | 重排后同步括号引用 | 引用必须用「占位符两段式」替换防级联 |
> 实测反例(务必记住):2.2.7 文档编号 010–150、170–210(缺 160)被初判为「跳号」,按 010–200 重排后,反而与图中 HTQD-010~210(21 个连续节点)整体错位 5 个号。真相是文档漏了 160「合同审批授权判定」那一行——正确动作是补行,不是重排。发现后已回退编号、恢复原状并改判为「文档漏登」。
D11 规范与基准冲突时,先裁定再动手
基线文件本身可能不合规。实测:作为格式基准的 2.1.1/2.1.2,表格为「审批栏 16 / 普通表 14 / 行距 13.9」,而编制规范写的是「所有表格内容=小四 12 磅、行间距 16 磅」,无任何表型例外。
| 处置顺序 | 动作 |
|---|---|
| 1 | 逐项比对「规范条款」与「基准实测值」,先出冲突清单,不要按基准直接铺开 |
| 2 | 冲突项回报用户裁定,不得自行择一;按基准统一会把偏差复制到全批 |
| 3 | 裁定后重跑一遍:基准文件也纳入整改范围(基准不再是表格参数的基准) |
| 4 | 在交付报告里显式声明「哪份报告的口径已被本轮覆盖」,避免新旧结论并存 |
D12 Word/COM 批量整改的三个坑
| 坑 | 表现 | 解法 |
|---|---|---|
Find.Execute(Replace=1) 只换首处 |
同一编号在文中出现多次,只改了第一个 | 批量替换一律 Replace=2(wdReplaceAll) |
| Find 在加密 docx 上「返回 True 但不生效」 | 即使用 Replace=2,返回成功而文本未变,且不留痕迹 |
改用绝对字符偏移替换:doc.Range(p.Range.Start + m.start(), …+len).Text = 新值(等长替换,格式不丢) |
| 级联替换错位 | 190→180、200→190 顺序执行会连环串号 | 两段式:先把旧值全换成唯一占位符(如 ⟦0⟧),再把占位符换成新值 |
| 逐单元格扫描拖死 Word | 30 行×8 列×10 表≈2400 次 t.Cell(r,c),实测致 COM 挂起、Save() 报「远程过程调用失败」 |
先用 t.Range.Text 判断该表是否含目标词,只扫前 3 行前 6 列;5 份文档由 5 分钟降到 30 秒 |
> 另注:批量处理 10 份以上时每份独立 DispatchEx + Quit(),并在批间清理无窗口 WINWORD(MainWindowTitle -eq '');有窗口的实例可能是用户正在编辑的文档,不得强杀。
11. 变更记录
| 版本 | 变更 |
|---|---|
| v1.7.4 | 三项待补落地轮(2026-11-05,承 v1.7.3 登记的待补项,全部已实测)。① 待补 1 · 判据等级化:§10D D1 的 23 条判据表由 4 列扩为 6 列(+等级 +阻断),并立等级口径——P0 阻断(C-01 吸附框 / C-04·05 起止 / C-06·07·08 断链 / C-11·12·13 判断分支 / C-14 隐式汇合 / C-17·18·19 几何 / D-01·D-03)、P1 告警(C-15 回退环 / C-20 残留副本 / C-22 菱形网关混用 / D-02 编号跳号)、P2 提示(C-21 逆向无标注 / F-03 命名)。② 新增 §6.1 交付门(四门):G-0 P0 清零(不清零拒绝交付,只能出问题清单+整改方案)/G-1 P1 登记(未登记即视为漏检)/G-2 P2 归并/G-3 三件对齐(未填不算交付)。③ 待补 2 · 折线重算独立成 CLI:新增 scripts/recalc_lines.py(--dry/--fix/--tol/--gutter)——按端点是否落在图元四边 ±tol 判悬空(对应判据 C-17),悬空且源在目标左侧时重算为 1 段(同行)或 3 段(右·竖·右);扰动实测通过:2.2.5 人为打偏 60px → --dry 检出 1 条 → --fix 写回 → 复检 0 悬空,figures 33 / lines 20 结构守恒;2.2.5 与 2.6.2 真实文件全量复检 0 悬空(20 条 / 36 条)。④ 待补 3 · 三方对齐表模板:新增 references/three-way-alignment-template.md——以活动编号为轴,8 列(编号/名称/图/文/表/差异类型/处置/备注),给出 8 种状态组合的语义与处置(含 图—/文✓=图漏节点、图✓/文—=文档漏行、表缺=附表漏表单三条 P0),并明确红线「不得自行判定以图为准还是以文档为准」;附 2.6.2 三行实例与 D-01/02/03、C-06/07/08 的衔接说明。⑤ references/capability-matrix.md §九待补清单同步为已落地。 |
| v1.7.3 | 能力矩阵入包轮(2026-11-05,2.6.2 / 2.2.5 等 12 套流程实操驱动)。① 新增 references/capability-matrix.md(能力权威表,约 200 行):按 5 域 27 项组织——A 流程图(A1 结构解析 / A2 规格驱动生成 / A3 高保真重建 / A4 语义级差异比对 / A5 元素类型裁决 / A6 连线复核 23 条 / A7 文本级手术 / A8 网关必要性审核 / A9 多角色副本与协作框 / A10 几何连通性)、B 流程文件(B1 12 章骨架 / B2 版式对齐 V1.2 / B3 表格题注 / B4 目录分页 / B5 图文一致 / B6 明文审计)、C 流程附表(C1 目录编号 / C2 骨架分区 / C3 网格纪律 / C4 字段对应)、D 跨工件(D1 编号三处对齐 / D2 支持文件↔附表 / D3 三级差异)、E 底座(E1 DLP 通道 / E2 备份回滚 / E3 终验留痕 / E4 四条红线);每项给「定义 / 覆盖范围 / 输入→输出 / 成熟度」,并配 12 章对应矩阵与三类工件填写规范(图表/文档/附表的字段与命名硬性规则)。② SKILL.md 新增 §2A 能力矩阵索引(5 域一览 + 一句话口径 + 开源采纳纪律 + 待补 3 项),指向 references 单一事实源。③ 开源对照 11 项(2026-11-05 GitHub API 实测):bpmn-js 9,720★(模型与渲染分离→A3 坐标/折线独立存储)、bpmnlint 173★ MIT(规则可插拔+严重级→A6 判据组织)、bpmn-moddle 515★ MIT(未知属性透传→A7 不重序列化)、bpmn-auto-layout 102★ MIT(缺 DI 自动布局→A7 折线重算)、dmn-js 369★(决策与路由分离→A5)、python-docx 5,757★ MIT、docx-templates 1,098★ MIT(模板/数据分离→B1)、excelize 21,064★ BSD-3、pyexcel 1,295★ BSD-3;pm4py 1,073★ AGPL-3.0 与 drawio 63,817★ GPL-3.0 一票否决不集成(只读方法论),沿用「许可证硬门槛 + 只借鉴机制不搬代码 + 借鉴必须落成判据」三条纪律。④ 待补 3 项登记:判据「严重级+阻断开关」未成列 / 折线重算未独立成 CLI 子命令 / 三方对齐表(图·文·表同轴)无固定模板。 |
| v1.7.2 | EPROS 元素定义澄清 · 菱形判断框与 XOR 网关严格分家(2026-11-02,用户裁决驱动)。① 新增「元素定义与职责」节(置于「连接点(锚点)规范」前):立两条分界——菱形 Rhombus = 判断框,只表达条件分支(做不做/过不过),不是网关;XORFigure/ORFigure/AndFigure 是三个独立的圆形网关元素,表达多路如何路由;二者并列、不得合并描述或互相映射。附元素总览表(15 类:活动/判断/XOR·OR·AND 网关/子流程/文档/触发/起止/协作框/分组框/泳道/虚拟角色/图名/注释/责任标记,标注是否入活动表、是否参与连通性、命名规则)+五维区分表(形状·语义对象·出边关系·连接点·命名)+一句话判据「要『判』用菱形,要『分』用网关——判定产生结论,网关消费结论」。② 生成器规则反转(map_node_type,项目脚本):旧规「决策关键词优先于前缀」→ 新规「类型前缀优先」——名称带 XOR/AND/OR 一律映射为对应圆形网关,不得因含「评审/审批」而改画菱形;无前缀的判定语才是菱形;判断框名含「网关」时返回命名告警。实测用例:XOR 专题评审网关→XORFigure(旧规为 Rhombus)、报告审核→Rhombus。③ 判据 +1 条(22→23):新增 C-22 菱形与网关混用(Rhombus 名含 XOR/OR/AND 前缀或「网关」后缀;或 XORFigure 名含审批字样)——实测 14 例(2.2.5×1 / 2.2.6×3 / 2.4.1×2 / 2.4.2×3 / 2.4.7×3 / 2.6.2×2),处置为只出清单不代改语义(判定语义→改纯判定语;分流语义→改 XORFigure);F-03 命名不规范补「判断框带网关后缀」。④ 依据:本工作区 53 份 .epros、1629 图元实测——菱形名称 TOP 全为判定语(审批 7/销售价格确定与审批 5/合同审批·授权额度内 5/报告审核 4…),而 0 个 XOR 圆形网关带审批/审核/评审字样,佐证「客户原生口径本就分离,混用系生成侧规则引入」。完整说明见 <工作区>/_out10/EPROS元素定义与职责说明-V1.0.md。 |
| v1.7.1 | 跨工件一致性与规范合规经验(2026-10-19 深夜,12 份图+12 份文档全量复核驱动)。新增 §10D 四组:D9 三级分类(标点级可自动统一 / 措辞级需定权威侧 / 实质级出作业单;比对必须排除 ImplFigure、FileImage、EventFigure——实测六成假阳性源于把子流程引用当活动;红线:不得自行决定「以图为准」还是「以文档为准」);D10 编号三处对齐(活动表编号 + 正文/KPI 的「(编号)」引用 + .epros 的 ActivityId;先比数量再比编号——数量不等即「漏行/漏节点」而非「跳号」,此时重排会把原本对齐的序号整体错位,实测 2.2.7 图 21 节点/文档 20 行,按 010–200 重排后与 HTQD-010~210 错开 5 个号,已回退);D11 规范 vs 基准冲突裁定(基准自身不合规时先出冲突清单再回报,不得按基准铺开;裁定后基准也纳入整改并在报告里声明口径覆盖);D12 Word/COM 批量整改四坑(Replace=1 只换首处须用 Replace=2;Find 在加密 docx 上返回 True 却不生效 → 改绝对偏移 Range(start,end).Text;级联替换须占位符两段式;逐单元格扫描 2400 次致 COM 挂起 → 先 t.Range.Text 判存在、只扫前 3 行 6 列,5 份由 5 分钟降到 30 秒;批间只清无窗口 WINWORD)。同轮反例记实:C-20「残留副本」规则原写「删除 degree=0 的同名图元」,遇「全部副本都 degree=0」时会连同真实活动一起删——2.1.1「一手信息收集」即如此被误删,已恢复节点;规则修正为「全为 0 时保留一个,仅删多余者」。 |
| v1.7.0 | 复核链入包 + 22 条判据 + 整改手术规范(2026-10-19,12 份 .epros 实测驱动)。① 新增第三条链「复核链」:§0 分诊表加行(触发词「复核/检查/排查/问题清单/整改」,判据是「要判缺陷而非生成」),task.mode 增 review;与另两链共用底座,区别是产物为「改回 .epros + 出问题清单」,且先出清单再整改。② 新增 §10D(8 组):D1 判定表 22 条(C-01 吸附协作框 / C-20 残留副本 / C-06-08 断链 / C-04-05 起止 / C-11-13 分支 / C-14 隐式汇合 / C-15 回退环 / C-17-19 几何 / C-21 逆向 / F-03 命名 / D-01-03 文档侧),附两条铁律(装饰图元不参与连通性;吸附框的线要计入视觉度数防重复计数);D2 三个陷阱(「分支条件普遍缺失」是错的——20 个判断节点 18 个已标注,真缺口在汇合侧 16 处;同名图元要分「残留」与「真多实例」;入口不能只看 FlowFigureStart,推定入口须标注否则可达度恒 0);D3 文本级手术(绝不 ET.write 重序列化;按 FigureImageId 删 figures、按 OrderIndex 只改开标签内 StartFigure/EndFigure、整块换 lineSegments;OrderIndex 无需连续);D4 重接四级判据(名称包含 → 端点在图元内 → 非「参与/协助」主体 → 距离 2 倍占优;反例:2.4.1 纯按距离会把「参与客户信息深度调研」当主活动);D5 折线重建三走向;D6 副作用与「不要自动做」(重接会暴露被掩盖的 C-11,须标「新暴露的既有缺陷」;画布须 ≥ extent+60,实测 2/12 溢出;起止图元因需整图右移 160px 只出作业单);D7 文档侧三条取证坑(合并单元格致逐格配对丢字段 → 扁平化取值;编号逐对判步进;名称归一化后再分「硬缺失/近似」);D8 四件套交付(复核报告 / 双表清单 / 整改记录 / 备份)+ Worksheets.Add 后必须 Move 排序。③ §4 硬约束 +3 条:「.epros 只做文本级手术绝不重序列化」「连线只改端点不够,必须同步重算折线」「不做语义推测式整改」。④ §6 输出规格 +3 项(复核报告 / 问题清单双表 / 整改执行记录)。⑤ frontmatter 版本 v1.6.0→v1.7.0,description 补「复核流程图」「检查连线逻辑」「问题清单」「整改」触发词与复核链定位。实测结论:初检 194 条,整改后 175→136(−22%)、高 98→63(−36%),12 份 XML 全部合法。 |
| --- | --- |
| v1.6.0 | 批次格式统一工程经验 + 段距「行」单位治本 + DLP 明文审计通道(2026-10-19,10 份流程文档批量实测驱动)。① 新增「§10C」经验节(8 组):C1 基线分族(单节 Letter 型/四节 A4 自定义样式型/四节 A4 网格型,同族共用规则,族间差异只落在「是否补样式/是否改页型」);C2 角色法分类(8 类角色判据表 + 目录区间定位算法〔目录终点=其后首个含 \x0c 的段落〕——不设边界时 12 个章标题会被误判为目录条目,实测 h1 计数 24→12);C3 段距「行」单位坑(beforeLines/afterLines 优先于磅值:设 8/2 回读 19.05/9.5;须按 LineUnitBefore=0→LineUnitAfter=0→SpaceBeforeAuto=False→SpaceBefore=磅值 顺序,且样式定义同样要清;必须另起进程回读,同会话回读测不出——首轮 4/10 份「设了没落地」即由此漏过);C4 表格排版分档(审批栏 16/活动说明表 ≥9 列 12+固定 13 磅/普通表 14;六向边框 1/4;加粗与列宽不动;HTML 显示 1.0pt 属导出上取整非缺陷);C5 目录域差异归因;C6 DLP 明文审计通道(PDF 仍加密不可读,SaveAs2(*.html, 10) 为明文,可解析 @page/h1{color}/td{border}/font-size;主题色 0xD4xxxxxx 须换真 RGB R+G<<8+B<<16,勿照抄长整型)+ 批量变更报告 5 段结构;C7 批量节奏(字节复制备份 MD5 验真、串行后台跑、清 WINWORD 残留与 Resiliency、基准 mtime 复核);C8 基准登记(生成链 V1.1 基准 vs 对齐链当批基准 不是同一套〔段前 15.6/7.8 vs 8/2、表题注 12 带「表 N」vs 15 无前缀〕,冲突须回报不得自行择优)。② Phase B「三个关键」→四个关键(新增「样式名不可作分类依据」:同批存在全篇仅「正文」样式、无标题样式、无目录域的文档);操作项补 ⑤ 分族/⑥ 角色归集。③ Phase C-A 维度 ①-⑧ → ①-⑪(新增 ⑨ 段距行距层、⑩ 表格排版层、⑪ 目录域重算与归因)+批量三纪律(独立复审、定点修复后再全量复审、before/after 画像落盘)。④ Phase D V 系列 +V-11 段距单位与取值 / +V-12 表格字号分档,并新增「V-01 判据修正」差异归因表(页码重算≠正文改动;整行消失须回备份核实后披露)。⑤ §4 硬约束新增两条:「★ 段距按磅值落地须先清「行」单位」「★ 批量统一不动列宽(列宽决定换行位置,改动即布局重排;基线既有宽表溢出〔742>718pt〕如实登记不修)」;§4.1 新增「第五类断言 · 段距写入后回读校验」(assert_space:SpaceBefore/SpaceAfter 与 LineUnitBefore/After 双判,另起只读进程回读;批量时改为「抽样取值 + 全量角色分布签名」)。⑥ §6 输出规格新增「格式变更报告(批量)」命名。⑦ frontmatter 版本 v1.5.1→v1.6.0,description 补触发词「批量统一多份文档版式」「出一份格式变更报告」与明文审计旁路。实测结论:10 份 0 不符合项、正文逐段一致(差异仅目录页码 7~14 行 + 2 条失效条目)、耗时 套用 6~7 min + 审计 4~5 min。 |
| v1.5.1 | 菱形审批顶点分工规则完善+生成器落地(2026-10-17,用户重申驱动)。① 「连接点(锚点)规范」的菱形出边顶点分工硬规则补日期戳(2026-10-14 立,2026-10-17 用户重申)并明确入边恒走左侧顶点;新增「生成器默认行为」条:菱形双分支自动分工——正向(通过)走右侧顶点,回边(退回)自底部顶点直下图底回流区(4 段折线;按目标节点分层互不交叉;共用目标侧竖杆汇入;底部直通有障碍时短降 18px 横移源侧隔离带,不压节点盒);分支标签贴连线起点旁(首段长段不再取中点)。实证 2.1.3:040 审核退回 (1010,315)→y=990、050 审批退回 (1200,615)→y=1006,共杆 x=568 汇入 020,横向交叉 0,verify_epros --pair FAIL=0。② §10A.1 要点表新增第 11 条「菱形审批顶点分工(绘图规范 C)」(10 条→11 条);§10A.2 覆盖范围走线规范补「菱形顶点分工」;§10A.3「两条绘图规范」→「三条」、「六类已知问题」→「七类」(要点 11 入断言清单)。③ 版本号 v1.5.0→v1.5.1。 |
| v1.5.0 | 2.2.7 十轮迭代工程经验沉淀(2026-10-16 深夜~10-17,V6.0→V10.0 实测驱动)。① 新增「§10B」经验节(8 组):B1 布线对齐判据链(新增 both_multi 判据:源出度≥2 且目标入度≥2 时禁 3 段 Z 形改 5 段——两侧折点同时共杆,分级审批线汇入参差 3542/3732→统一 3798);B2 md 解析三坑(第 7 章表行须加「列3∈类型词集」过滤防第 8 章 9 列混入 46 误报;节点名档位用「·」禁全角括号;编号行过滤按首列编号判定勿用行首前缀);B3 校验链四件套(audit 7 项双源 / cross_AB 跨图一致性「同名不同类型=跨图引用」/ geo 几何 PoLongx-PoLongy / verify 配对;用户手动布局下折点对齐 FAIL 属预期豁免);B4 手动版比对 SOP(快照→内存重建基线→语义 diff 五级→「逻辑零变更纯布局」判读口径);B5 分段双图管线(split 抽骨架+ABBR 注入+子目录避 all_flows;编号沿用总图;SRC 硬编码升版须同步);B6 第 8 章 10 列升级(异常处理列、角色→责任人、activity10 列宽、附章节解析与三坑、TBL_HEADERS_10);B7 模板形态收敛 SOP(dump 实物定标尺+先例校准→三类删除清单→待确认项转移→保留白名单→终验回基准骨架);B8 泛化残留扫描(数值型专项 grep:多轮泛化后 60/240 分钟仍漏网至 V10.0)。② §4 硬约束新增两条:「★ 附章节不进骨架」(附章节小节不得套标题 2,防 G-09 骨架污染与目录膨胀)、「★ COM 生成前清 WINWORD 残留」(残留实例致新 COM 会话早期挂起被 SIGTERM 且无输出)。③ 版本号 v1.4.1→v1.5.0。 |
| v1.4.1 | 流程梳理全案经验归纳 + 协作框双通道判据 + 生成器自动协作框(2026-10-16 深夜,单日五轮迭代收口)。① 新增「§10A 流程梳理全案经验 · 应包含的要点 / 覆盖范围 / 预期效果」总纲章节:10 条要点对照表(参考标准解析 / 编号口径 / 多源融合 / 顺序重梳 / 角色映射 / 竖向分叉点对齐 / 多人员活动标注 / 校验闭环 / 版本快照 / 双版本输出)+覆盖范围三段(输入侧 / 处理侧 / 输出侧)+预期效果三款(六类不踩坑 / 一次做对 / 全链可核对)。②「多角色活动 · 协作框规范」补强:标题加「亦称协助框」;新增「双通道判据」(多人员活动必须择一表达——协作框优先 / 依据逻辑关系添加连线;禁止孤立悬挂)与「生成器默认行为」(跨泳道副本组自动外裹协作框:左右余 17px、上下余 23px、橙 235,97,27、先于节点与连线绘制;实测 2.2.7「签字确认」4 副本 → 134×706)。③ 布线纪律第 7 条(竖向分叉点对齐)补实证数据(2.2.7 全图 8 组共杆:1072 / 1312×4 / 1642 / 1832 / 2022 / 2212 / 2848×3 / 3162)。④ 版本号 v1.4.0→v1.4.1。 |
| v1.4.0 | 模板基准换版 V1.1 + Word COM 运行时陷阱集 + 列宽铁律 + 竖向分叉点对齐规范(2026-10-16,单日四轮实测驱动)。① 模板基准由 9.25 换为 产品市场信息调研分析流程-V1.1.docx / 竞争对手产品分析流程-V1.1.docx(两份实测格式 100% 同构)——新增「V1.1 版式口径」12 项速查表:章标题「N、+Tab+章名」15 磅加粗悬挂缩进 li=21/fi=−21/单倍18/段前15.6段后7.8(末章「支持文件」7.8/3.1);子节「N.+Tab+名」14 磅/li=47.95;表题注「表 N+Tab+名」12 磅居中;目录双制表位(TOC1 左31.5/TOC2 左42.0+右481.4点线);全部表格边框外内统一 0.5 磅(含审批栏)、审批栏单元格 12 磅;封面信息行 li=104.85/fi=7.05、无独立「审批栏」标题段;节3=7-8 章横向(第8章9列表放不下)、节3 页眉距 28.35。② 新增「Word COM 生成 · 运行时陷阱与收口」大节:结构性七坑(InsertXML 本机不可用/Paragraphs.Add 覆盖同段/分节符位置/InsertAfter 样式继承/单元格继承「标题1」/空标题段/占位符双下划线+对象 Range 漂移)+运行时格式五陷阱(空段行距/表后自动段继承表题注/TOC 域范围延伸波及后续段/分节符段字体/TOC2 字符单位缩进)+三道收口(分节→格式化→TOC后复检→兜底回落)+四脚本校验闭环。③ 新增「表格列宽铁律」:先按所在节可用页宽定上限(9638/9426/14358 twips)再按内容适配(勿照搬基准 gridCol——基准无 tblW 靠 AutoFit 隐式压缩,值本身常超页宽);档案表参考分配 [2300,1200,2360,1900,1666]。④ 布线纪律新增第 7 条「竖向分叉点对齐」(2026-10-16 用户拍板 · 强制规范):横向多条连线时,同源出线的多条分支共用同一竖杆 x、同目标入线的多条分支共用同一竖杆 x,各分叉/汇合点必须对齐同一位置,禁止参差;附分组实现法与坐标断言校验。⑤ 第 7 章交付形态更新:客户要求「图+节点表」时按表 3 位次插入「流程节点连接关系表」(图题 14 磅居中 li=36/fi=17.85 → 图片 → 表题注 → 节点表 → 注释段)。⑥ 版本号 v1.3.7→v1.4.0。 |
| v1.3.7 | 手工修改比对与版本快照(2026-10-15,同一图三轮手工改版实测驱动)。① 生成链新增「手工修改比对与版本快照」小节(7 条):先 cp 快照再比对(客户端保存原地覆盖上一版,无快照只能反推基线);禁止文本 diff(保存重写 UUID/属性序),改按 (FigureType,FigureText,roleName) 匹配图元、(StartFigure→EndFigure, LineText) 三元组匹配连线做语义 diff,基线取生成器内存重建(不落盘)。② 双副本挂载副本轮换 ≠ 缺陷:用户可把连线由主责副本切到审批/后置方泳道副本(实测 2.2.5 的 060 由营销部长→事业部经理,四条线重走、孤立副本同步轮换),判据为节点集/连线集/标签不变;与协作框「只接主责副本」冲突时回报确认主责口径,勿自行改回。③ 分组框避让与穿越豁免:出线竖段须移出框缘(1455→1507),进出框内节点的必需穿越段应豁免,入线优先共用竖干线汇合(3 段优于 5 段 Z 形)。④ 批次固有告警判读:孤立副本 / ActivityId 重复 / 节点表行数差 1 三类只核数量与标签、不拦交付,有 FAIL 才拦。⑤ 类型词同步:规格新增类型词(起始/结束)须同步补校验器词汇表,否则生成侧接受、校验侧报假 WARN。⑥ 编号口径先核对:同名 .epros 可能同号不同名(2.2.4 报价流程 vs 2.2.4 关键角色攻关流程),取号以架构卡为准并同步生成器 ABBR 映射。⑦ 新增「比对后自检 4 项」;§4 硬约束新增「★ 人工改版先留快照」。⑧ 同步 frontmatter version 至 1.3.7(原 1.3.2 与 §11 漂移)。 |
| v1.3.6 | 模板基准严格对齐(2026-10-14 用户指定 9.25 目录为唯一基准)。① 新增「模板基准(9.25)」小节:实测锁定 docx 实例 + HT-MK xlsx 模板的章节骨架(12 章+2 子节,序号+顿号编号)与表格口径(10 表列头逐字,表5 活动说明=9 列 活动编号\|活动名称\|活动内容\|角色\|输入\|输出\|相关文件\|相关规则/标准\|相关IT系统,表6~8 每指标独立一表);编制要求(PPT 15 字段)映射入章节不另起结构。② 连接关系表定位修正:模板无此独立表 → 仅内部图文对照/校验用,不入正式文档正文(留存放「附则」附件/交付留痕)。③ 生成链内容纪律更新:活动编号取 ActivityId、双责任活动合并行(角色列「主责;参与」)、KCP/风险控制措施写入「活动内容」列。④ G 系列新增 G-09 章节骨架一致 / G-10 表格列头一致;Phase C-G 门禁加「章节骨架/表格列头与基准不一致→停止并复核」。⑤ 修复审计缺口:原缺 7 章节(定义/目的/适用范围/裁剪指南/支持文件/拟制修订记录/附则)、活动表列头未固化、5 编制字段未覆盖——现全部纳入基准映射。 |
| v1.3.5 | 序号呈现规范(2026-10-14 用户定稿)。① Phase A 新增「序号呈现规范」小节:EPROS 客户端活动框双层结构(顶栏渲染 ActivityId、正文渲染 FigureText),流程序号(源文档活动表三位编号 010/020/…)必须放顶栏(ActivityId:=序号、FigureText:=纯名称);勿把序号写进 FigureText 前缀(避免双序号冲突);协作框双副本顶栏同号;序号取源 V1.1 活动表「编号」列,先核对再改,不得自造编号体系;渲染器顶栏读 ActivityId。② 实战回归:两图 35 个活动框序号由 FigureText 前缀迁入 ActivityId 顶栏,坐标/连线零漂移。 |
| v1.3.4 | 连接点规范 + EPROS 打开兼容性根因库 + 连线修改经验(2026-10-13~14 实测排障与手动修改比对驱动)。① Phase A 新增「EPROS 客户端打开兼容性」根因表(6 项:整数属性小数化 NumberFormatException @ Integer.parseInt / ActivityId 空重复 / <figures> 后置 / FigureType=VerticalLines 误值 / OrderIndex 重复 / DottedRect 样式缺省)+ 排障方法(读 epros_log.txt 堆栈 + 最小探针二分)。② 布线纪律后新增「连接点(锚点)规范」:矩形=四边中点、菱形=四顶点(落斜边即红 ✕)、同方向单锚点(多边共用)、菱形出边顶点分工硬规则(通过=右顶点/不通过=底顶点/不得共用)、精确吸附偏差 <0.01。③ 新增「EPROS 客户端行为特性」(OrderIndex 保存自动重编号→用三元组追踪 / 画布声明不自动扩展→手动核宽高 / 拖动自动吸附)。④ 新增「连线修改经验」(节点平移折点同步 Δ / 退回线贴紧 30~50 间距 / 拐头按走廊重算非平移 / 大幅重排必查画布与泳道带高度为正)与「修改后自检清单 6 步」。⑤ 实战回归:B 图画布声明 1969×671→2552×800 修复 7 处越界 + 底部泳道带 -89 负高度;4 个菱形顶点分工核查全合规。 |
| v1.3.3 | 多角色活动协作框规范 + 布线纪律(2026-10-13,依据《恒泰-EPROS操作标准化-V1.0》协作框页实测)。① 生成链内容纪律新增「多角色活动 · 协作框规范」小节:活动标注多责任人(分号分隔)时不再单框单泳道近似,改为每责任角色泳道各一个同文本副本 + 橙色虚线 DottedRect 协作框(BodyColor 橙 235,97,27)外裹;副本并行、同进同出;分主次(首位=主责)连线只接主责副本,不分主次接框边。② 新增布线纪律六条(重排/改造类任务):左进右出(复杂可左、上进)、同排直连、改前断言原值+改后拓扑守恒、干线走廊 ≥10 单位、绕行走带外走廊禁穿框内、横向交叉数=0 目标(严格内点相交计 1,共线共享干道/端点汇入不计;源图固有交叉留痕,重排时一并消除)。③ 渲染细节「分组盒」条目升级为「分组盒 / 协作框」:协作框橙色虚线,普通红色分组盒照源色。④ 实战回归:两份流程图(A 14 活动/B 15 活动)按规范改造——A 增 1 组协作框(130 营销部长+产品经理)、B 增 4 组(030/070/110/140),连线重排后两图横向交叉均归零(含消除源图既有 1 处 e35×e47 交叉:120→110 退回边改走「客户」空带顶部走廊),11 项几何校验全 PASS。 |
| v1.3.2 | P3 工程化(选型报告阶段路径收尾)。① 新增 benchmark/run_bench.py + 基线 benchmark/baseline_20261013.json:三类基线(B-1 epros 解析耗时 / B-2 边框解析双引擎耗时+等价断言 / B-3 渲染耗时+几何保真),全部合成样本不依赖 COM;实测发现大样本下 regex 比 lxml 快约 40× 且结果等价——默认仍取 lxml 的结构稳健性,性能差异留档基线;--json 可与基线比对(>3× 判漂移)。② references/engineering-conventions.md 新增 §十一 发布流程约定:一处编写三处派生(SKILL.md §11 ↔ pyproject version ↔ 交付说明)、版本号语义、发布前四道门槛(pytest/selfcheck/bench 基线/依赖三维评估)、基线更新是显式动作、观察名单季度复查。③ selfcheck.py 新增第 6 段「文档门槛」(D-Doc):10 个核心脚本模块 docstring 自含性 AST 检查(16→17 项)。④ CI 化结论:selfcheck 退出码分层 + stdout/stderr 分离,可直接被计划任务/CI 消费(每日 --json 跑批+告警),约定落 §十一。 |
| v1.3.1 | P2 通道冗余。① dlp_channel.py COM 级扩展为双后端降级链:pywin32 首选 → comtypes(纯 Python,Enthought 维护)备用,open_word_doc(backend="auto") 逐后端尝试,失败/切换事件写入模块级 COM_SWITCH_LOG + stderr(供执行审计);com_available 同步按后端链探测并注明可用后端名。整体通道链现为 mcp → com(pywin32 → comtypes) → python_structured → plain。② 新增 4 个桩测试(auto 首选/降级留痕/双失败抛最后错/显式后端不降级),不触碰真实 COM。③ comtypes 真实 COM 冒烟 PASS:显式 comtypes 后端建档(17.7KB)→ 只读回开 → 内容/表格读取全通;auto 链正确首选 pywin32。④ 依赖登记:comtypes>=1.4,<2 入 office/test 档(评分 7.75:周下载 430,195 / Enthought 商业维护近 12 月 4 版 / pywinauto 生态引用)。⑤ 观察名单(季度复查,下次 2026-12-13):python-redlines、pywinauto、Docxodus。 |
| v1.3.0 | P1 解析升级。① docx_probe.parse_borders_xml 升级为双引擎:lxml 首选(recover=True 容错片段级 XML + resolve_entities=False XXE 加固 + local-name 匹配命名空间无关),正则降级(auto 异常回落 / 可显式 engine="regex" 对照);属性次序错配类缺陷从结构上免疫。② 等价性实测:5 组合成样本(含事故形态「sz 写在 val 前」)双引擎全等 + 真实 Word XML A/B 冒烟 PASS(COM 现场建档含表级+单元格级覆写,tblBorders/tcBorders/72KB 全文档三组全等)。③ probe 画像 JSON 契约版本化:schema: 2 + parse_engine 字段。④ 新增 8 个回归测试(等价 5 例 + auto 回落 + recover 容错契约 + schema 断言),全量 120 用例 0 失败。⑤ 依赖登记:lxml>=6,<7 入 office/test 档(评分 9.7,BSD-3,周下载 9,100 万)。⑥ Phase E 门禁强化:交付说明缺 fingerprint.json 留痕 → 不交付。 |
| v1.2.6 | P0 护栏与分层(零新依赖)。① pyproject.toml extras 重构为三档:minimal(仅解析校验,无需 Windows/COM)/ office(完整作业运行时)/ test(全量回归),主依赖收敛为 pywin32 + defusedxml——安装面最小化(对标 docling 分层)。② 维护模式依赖加护栏:defusedxml==0.7.1、openpyxl==3.1.5 锁定并注明理由(API 冻结不可替代 / 仓库在 Heptapod 发布慢);matplotlib/pyyaml/pillow 从主依赖移入 office/test 档(缺失时优雅降级语义不变)。③ python-docx 正式定位为参考实现(不入运行时依赖;若未来引入须 >=1.2,<2 上限锁定 + 薄适配层)。④ SKILL.md §7 依赖表按分层重构 + 锁定理由入表。 |
| v1.2.5 | 遗留项落地(N-01~N-05,2026-10-13,承接 v1.2.4 优化方案 §七)。① N-01 verify_docx.py 复用 docx_probe.classify_table_role 统一表格角色口径:collect() 逐表记 role,活动表定位改走 activity_candidates()(先角色(列数)后关键字),消除与 docx_probe 的双份口径、封堵 P18 复发面。② N-02 selfcheck.py 依赖前置断言升级:pytest/matplotlib 缺失时除报告 D-X 外,退出码升为 3(EXIT_ENV_MISSING),不再静默成功(--skip-tests 显式豁免)。③ N-03 新增 references/delivery-note-template.md(交付说明≤5 节模板:概要/变更表/校验结果/待确认项/留痕路径,「依据版本号」「待确认项」为门禁字段,解 P24 膨胀)。④ N-04 结构指纹进入交付留痕:docx_probe 新增 write_fingerprint / load_fingerprint / compare_fingerprint_files 与 CLI --fingerprint OUT、--fp-compare A B(不开 Word 跨轮比对,结构漂移退出码 1;段落数漂移属合法,节数/表数/表形状/页面设置漂移必拦)。⑤ N-05 多形态报告评估落地:verify_common.Report.write_html() + 各校验器统一 --html 参数(自包含单文件、零第三方依赖、无脚本、detail 已转义);评估结论——写侧为 Python 直写(与 --json 同通道,已验证可行),「打开」侧依赖浏览器在 DLP 白名单内,未实测前 HTML 定位为留痕/拷贝查阅;DOCX 形态不采用(需 Word 写通道,DLP 成本高收益低)。⑥ 回归测试 +11 例(活动表统一口径 4、指纹留痕 4、HTML 报告 3)。 |
| v1.2.4 | 原语化重构 + 执行时守卫(2026-10-12 单日实测驱动,当日两起事故的工程化收敛)。① 新增 scripts/docx_probe.py(只读探测原语 + CLI):段落三分类 / 空行连续段 / 分节符载体判定 / 边框 OOXML 权威读取 / 单元格有效值 / TOC 条目与制表位 / 结构指纹 / 表格角色判定。一条命令 python scripts/docx_probe.py <file.docx> [--json out.json] 产出一图流结构画像,取代当日 12 个一次性探测脚本。② 新增 scripts/docx_guard.py(写侧守卫):Guard 结构不变量上下文管理器(节数/表数/表形状/页面设置在编辑前后必须不变,违规抛异常禁止保存)、safe_delete_paragraphs(内置分节符保护)、allowed_blank_plan(按「空行段+其后接标题」的允许保留数出方案)、refresh_toc_then_restore(先刷域→再重建制表位,顺序固定)、set_toc_entry_tabs(按层级取值)、save_dlp(SaveAs2+重试)、cleanup_orphan_word / remove_lock_files。③ 新增 23 个单元测试(tests/test_docx_probe_guard.py),含三起事故的回归用例:分节符载体判定、边框属性次序不得错配、宽表不得被关键字误判。④ 依赖落地:本机所有 Python 环境原先既无 pytest 也无 matplotlib(致 101 用例长期不可验证)→ 已装齐并实测 101 用例 0 失败;pyproject.toml 补 test extra 与实测安装命令。⑤ SKILL.md §4 新增「结构不变量守卫」「删段落必排分节符」两条硬约束与「§4.1 执行时守卫」(四道闸门表)。⑥ references/docx-com-recipes.md 新增 §九 事故档案(症状→根因→处置→守卫,共 21 条,含 A 级事故 3 条 / B 级障碍 9 条 / C 级静默判定 5 条 / D 级返工 3 条)与五条铁律。 |
| v1.2.3 | 分节符保护 + 目录层级制表位 + 目录独占一页(2026-10-12 傍晚,用户反馈「目录需要单独一页/每个小节内部的空行需要删除」驱动)。① ⚠️⚠️ 分节符藏在段落标记里,批量删段落前必须排除——空段落可能承载分节符(纵向→横向 分界),删除后节数减少、横向节被合并(本次真实事故:节数 4→3 已回退重做)。判据:p(i).Range.Information(2) != p(i+1).Range.Information(2) ⟺ p(i) 承载分节符;⚠️ 反例:Range.WordOpenXML 检索 <w:sectPr 无区分度(实测 369/379 段全命中)。加固:删除后断言 Sections.Count 不变,异常则中止不保存。② TOC 条目左制表位随层级不同:TOC 1 = 31.50、TOC 2 = 42.00、TOC 3 = 63.00(右侧统一 481.40 right/dots)——统一设同一值会导致带缩进的层级文字被跨过 → 跳右制表位 → 换行 + 两端对齐撑散(本次用户可见缺陷)。③ 目录独占一页=给「目录」标题加段落级 PageBreakBefore(勿插入分页符段落)。④ 删段落流程的通用加固:先按「空行连续段 + 其后接标题」设定允许保留数 → 排除分节符载体 → 从后往前删 → Sections.Count 守卫 → 刷新域 → 重建制表位。 |
| v1.2.2 | 表格边框与目录制表位的复查修复(2026-10-12 下午,用户反馈「目录页和表格边框存在问题」驱动)。① 边框判定必须用 WordOpenXML,禁用 COM Borders 哨兵——单元格级 tcBorders 覆盖表级时 COM tb.Borders 可能返回 9999999(未定义哨兵),据此判形会误得「无内线」,v1.2.1 前的对齐即因此把 T#04/T#08/T#09 改错并抹掉全部单元格级 tcBorders。② 单元格级 Borders 只支持四边(-1..-4),-5/-6 抛「集合所要求的成员不存在」。③ 共享竖线取有效值:cell(i,j).right 与 cell(i,j+1).left 是同一条物理线,Word 只留一个有效值;复刻应以 COM 有效值为目标而非原始 XML。④ TablesOfContents.Update() 会重生成条目制表位(按样式缩进漂移)→ 应在 Update() 之后重建条目制表位为模板口径(pos=31.50 left/none + pos=481.40 right/dots)。⑤ 复刻目标首选「同批备份原件」而非模板:模板行列数与批内文档常不同,用备份可保证逐格等价;功能等价性以逐表逐格 COM 有效边框比对为准。 |
| v1.2.1 | DLP 保存策略修正(2026-10-12 实测推翻旧结论)。① SaveCopyAs 在本机 DLP 环境全局失效(写目标目录/兄弟路径/%TEMP% 一律报 OLE 0x800a1704)→ 保存策略改为 SaveAs2 临时名 → Close → os.replace 原子换名(落盘仍为加密态 00005b00…)。② Table.Borders 必须用整数索引 (-1..-6),链式 b.Top.LineStyle 抛 AttributeError。③ Border.LineWidth 取 wdLineWidth 枚举(2/4/6/8/12 = 0.25/0.5/0.75/1.0/1.5 磅),非磅值。④ 表格语义角色判定须先判列数(≥8→活动说明表)再判关键字,否则表头含「角色/职责」的宽表会被误判。均已在 references/docx-com-recipes.md §三/§五 落文。 |
| v1.2.0 | 技能体系工程化(对照官方 Skill 规范 + GitHub 热门工程实践)。① 新增 verify_common.py 统一校验框架——消除两套互不兼容的结果 schema({item,ok} vs {item,status})与重复的 _chk;引入稳定校验编号、退出码分层(0/1/2/3/4)、stdout-stderr 分离(结果走 stdout、诊断走 stderr)。② 新增 tests/ 78 个 pytest 用例(合成夹具、不依赖用户数据),覆盖解析不变量、几何工具、结果模型、CLI 契约、DLP 探测、渲染闭环。③ 新增 pyproject.toml 作为依赖唯一事实源 + pytest/ruff/coverage 配置。④ 新增 scripts/selfcheck.py 一键自检(依赖→配置→解析→渲染→测试,16 项),落实官方强调的「跑校验器→修复→重复」环。⑤ frontmatter 补 dependencies/version/license。⑥ 新增 references/engineering-conventions.md(改脚本前必读)。⑦ 细节修复:bootstrap() 取代散落的 sys.path.insert;JSON 基准缺失时给出可操作提示而非堆栈;无 ParallelLines 时显式声明「泳道未正式划分」。 |
| v1.1 | 流程图画图能力增强(重点:连线走线与位置排布准确性)。① 改用 manhattanLines/lineSegments 的源正交折线逐段照搬(此前用直线近似);② 修复 LineText 字段读错导致 167 条判据标签静默丢弃;③ 修复非业务图元被当装饰丢弃(漏画 9 个图元 + 丢 2 条带标签的边),改为「非业务节点≠不绘制」且边不按端点类型过滤;④ 采用源文件自带配色(BGColor 渐变/BodyColor);⑤ 补齐角色标签列、图名标题、责任标记、自由注释;⑥ 字号改为按真实坐标缩放精确约束,消除文字溢出;⑦ 输出改用可解析映射(弃 bbox_inches='tight')并写 meta.json 侧车;⑧ 新增 verify_flowchart.py 几何保真度校验(14 项)。<br>依赖取舍:明确不引入任何布局/布线库(Graphviz/ELK/pyorthogonalrouting 等)——源已给精确几何,重排反而降精度;完整评估表见 §7.1 |
| v1.0 | 由 epros-flowchart-to-docx + doc-format-align 合并而成。统一为「两条链 + 共享底座」架构;新增 dlp_channel.py 通道层(含误判修复与写后回验闭环)、check_config.py(修正原脚本硬编码路径);verify_docx.py 统一 G/V 双系列;详细知识下沉至 references/ 三份文档 |