变更日志 — elements-complaint-generator
[0.16.0] - 2026-09-22
新增
- 新增
tests/smoke_render_longtext.py:自动枚举 68 棵主文书,按模板实际规则生成确定性的长当事人、长诉请和长事实输入,执行正式版 LibreOffice 真实渲染,并输出输入摘要、候选内容哈希、页数、页码、空白页、字形、结构稳定指纹和本地证据路径。 - 新增
tests/test_longtext_matrix.py快速合同测试并接入日常tests/run_e2e.sh;发布级 68×3 矩阵保持独立运行,支持每类预热、三轮计量、旧证据拒绝复用和--evidence-all-rounds波动取证。
修复
- 长文本替换达到阈值时移除模板为短提示设置的巨大右缩进,修复 46、52、53、54 等行政模板内容被压成窄栏并发生渲染裁切的问题;短姓名、日期和金额继续保留原版式。
- 将末尾空段落承载的实际内容节提升为 body 最终节,保留附件页边距、页脚和方向,同时消除 28 技术合同附件后的“仅页码”空白尾页。
- PDF 单元格越界检查改用独立绘制 span 的真实字符包围盒,避免零内边距时把左右单元格文字拼成一个跨列词;真实跨线反例继续阻断。
- 跨页列位检查允许纯新增或纯消失的合法
gridSpan细化,仅在旧列消失且新列同时出现时判为漂移,修复 24 专利长文本续页误报。 - 对 300 字以上超长表格行移除冲突的
cantSplit,允许自然跨页;普通行仍强制禁止非必要拆行,10、13、19、57 等临界模板的定向三轮页数已收敛。 - 将
STZhongsong、Kaiti SC从 LibreOffice 字体替代候选中归一为稳定的SimSun,修复同一不可变 47 号候选件被随机替换为华文楷体、娃娃体或华文宋体并产生 4/4/3 页波动的问题;字号、加粗和段落样式继续保持标题与落款层级。
验证
- 正式版 LibreOffice 26.2.3.2 下,68 棵主文书完成逐类预热与 204 次三轮计量;204/204 均通过 DOCX/PDF 门禁,
unstable_cases=[],未出现居中、列位、页码、空白页、裁切、字形或稳定性阻断项,矩阵状态为DOMAIN_VERIFIED。 - 生成器可靠性 18/18、版式门禁 56/56、68/68 通用冒烟、113/113 模板静态门禁、21/21 文书家族真实 PDF 渲染及完整 E2E 均通过;68 目标枚举、生产规则链命中、压力输入确定性、候选内容哈希和稳定指纹由快速合同覆盖,且在
PYTHONOPTIMIZE=1下仍通过。
待办事项
- 对剩余 45 棵答辩状、第三人意见陈述书单列同等级长文本矩阵,不以主文书结果替代。
- 选取高风险代表件在 Microsoft Word / WPS 下复核字体、分页、页码与签章位置;当前
DOMAIN_VERIFIED仅适用于本次正式版 LibreOffice 环境。
[0.15.2] - 2026-09-21
修复
- 将 E2E Harness 的伪产物路径清单由空格分隔字符串改为 Bash 数组,并逐项引用执行恢复,避免仓库路径或文件名含空格时被错误拆词,进而触发错误删除、错误移动或残留伪 DOCX。
改进
- 将 ECG-003 恢复探针改为显式含空格文件名,使路径边界问题在不含空格的 CI/worktree 路径中也可稳定回归。
验证
tests/test_run_e2e_harness.sh28/28 通过,覆盖原文件恢复、新文件删除、幂等性及含空格路径恢复。
[0.15.1] - 2026-09-11
新增
- 新增输入叶路径 Schema、未知/错层级字段失败关闭、批处理参数合同与同目录原子发布回归;批量模式完整透传
--verify-residual、--templates-dir和未知字段策略。 - 新增正式版 LibreOffice 渲染器选址、独立
UserInstallation、中文字体候选覆盖验证和 DOCX→PDF 字符存活率门禁;开发版、未知版本或无中文覆盖候选均拒绝作为交付依据。 - 为 24/25 专利附件的“关联民事案件信息表”新增表名锚点与连续三行语义表头合同,生成层设置
tblHeader,DOCX/PDF 两层按具体目标表验证续页重复表头。 - 新增出版物残码、逐表居中、跨页列位、合并单元格边界、空白页与 E2E 防假绿的正反例;新增 56/61/62/67 分节/尾段空白页结构回归。
修复
- 按页面内每个表格带独立检查水平居中,避免两个反向偏移表互相抵消;跨页列位只比较页顶续接签名,并以语义锚点、重复表头或内部列位连续性确认表格身份,避免把相邻新表误判为续表。
- 单元格文字越界改为要求与真实竖线有实质纵向重叠,消除合并行文字包围盒轻触相邻行边界产生的波动,同时保留真实跨列反例拦截。
- 清理 24/25 模板正文与图形中的
398/399/430/431书册页码,保留底部连续 PAGE 域;按关系目标与文件哈希失败关闭,防止误删普通图片或正文数字。 - 保留附件前同方向官方分节,禁止再叠加硬分页;合并其余同方向书册分节,并删除最终
sectPr前无文字、域、图形、分页或分节语义的空段落,消除 25、56、61、62、67 的真实或偶发“只有页码”空白页。 - 修复中文字形
.notdef假阳性、24 横向附件合法合并行列位误报、09 页底旧表与页顶新表误报,以及 32/33 合并行文字轻触边界误报。
改进
tests/run_e2e.sh启用pipefail,每次使用全新证据目录并把断言绑定到本次产物;tee、grep、tail后仍传播生产者真实退出码,异常退出恢复测试伪文件。- 重复表头不再以“文档中任意表存在
tblHeader”作为全局放行条件;没有表级合同的 09 等普通键值表不受误伤,合同缺失、重复命中、锚点错位或行数不足均失败关闭。 - 更新公开说明,删除“像素级保真、可直接提交法院”和答辩状未接入等失实表述,明确
DOMAIN_VERIFIED的渲染器与法律复核边界。
验证
- 单元/反例门禁:输入失败关闭 6/6、生成可靠性 12/12、渲染器 6/6、版式 52/52、字体 14/14、出版物残码 12/12、语义表头生成 14/14、语义表头门禁 8/8、E2E harness 28/28。
- 113/113 模板静态矩阵通过;21 类文书家族连续三轮真实 PDF 渲染 63/63 通过;56/61/67 各 8 次、62 共 10 次不可变 DOCX 独立渲染均无空白页;完整
tests/run_e2e.sh通过。 - 人工视觉复核 24 号第 13→14 页和 25 号第 10→11 页:三行语义表头重复、表格居中、列线连续、页码底部居中,未发现
398/399/430/431残码。
待办事项
- 68 棵主文书逐树长当事人、长请求、长事实压力渲染仍未完成;不得把当前家族抽样扩大为“全案由像素级保真”。
- 当前案由级输入路径实际消费合同、公开材料匿名化和许可证统一仍按 Skill 任务队列继续推进。
[0.15.0] - 2026-08-30
新增
- 新增独立
scripts/layout_gate.py:同时检查最终 DOCX 的 A4 节属性、对称边距、表格显式居中、固定列布局、tblGrid/tcW/gridSpan守恒、行cantSplit、页脚关系和 PAGE 域,并通过 LibreOffice + PyMuPDF 检查真实 PDF 的页面尺寸、表格中心线、连续居中页码和空白页。 - 新增
config/layout-policy.json管理逐模板版式策略;22 著作权法院实际发放基准件明确不带页码,作为显式例外保留。 - 新增 10 个版式最小正反例,覆盖表格偏左、列宽不守恒、行可拆页、硬编码/缺失/重置页码、空白页和合法长文本;新增“失败不覆盖既有目标件”回归,以及 113 棵模板静态矩阵与 21 类文书真实 PDF 渲染矩阵。
修复
- 重写节合并逻辑:保留横竖版切换边界,宽表在纵向容不下而横向可容纳时自动修正方向,避免 24/25 专利模板正文和附件互相污染页面方向。
- 所有表格改为显式
center + fixed + tblInd=0,左右页边距按当前节最宽表对称计算;所有表格行加入cantSplit,清理表内人工硬分页符。 - 页脚纯数字改为 PAGE 域并居中,补齐节级默认页脚关系;仅第一节从 1 开始,后续节禁止重置;统一有效页脚距离,修复“XML 中有 PAGE、真实 PDF 却无页码”的假通过。
- 附件起页逻辑跨空段检查已有分节,避免“分节符 + 分页符”叠加产生空白页。
- 修复
_pick_in_window返回值丢失导致的规则执行异常,以及 05/06/24/60 模板中已由 fail-closed 门禁暴露的字段锚点差异;移除 23/24/27/30 测试 fixture 中模板不存在、此前会被静默丢弃的字段。
改进
fill_template.py默认使用--layout-check rendered,先在临时候选件上完成内容完整性和真实渲染门禁,再原子发布到目标路径;规则异常、可靠直接写入字段有值却全部 skipped、残留旧串、几何/页码失败或渲染失败均非零退出,已有目标文件不被覆盖。--layout-check docx仅供开发期批量回归,off仅供诊断;两者均不得作为最终版式已验证的证据。
验证
- 113/113 模板树 DOCX 静态版式门禁通过;21/21
doc_type文书家族真实 PDF 渲染通过;版式门禁 10/10 正反例通过;既有内容断言与 68/68 通用级冒烟通过。 - 空白页判断会剔除页脚区纯数字,只有页码而无正文/图形的页面也会失败;24/25 尾页经文本层复核为真实注释内容,不是空白页。
- 68 棵主文书逐树长文本压力渲染和页面截图矩阵、跨机器专有字体可用性仍列为 P0-1 后续工作,本版本不据抽样结果恢复“像素级保真”声明。
0.14.0(2026-08-28)— 22 案由法院件基准模板 + 几何宽度感知 + 引擎补链(250612 案第二轮实战)
模板源替换(DEC-011)
templates/22-侵害著作权及邻接权纠纷-民事起诉状以法院实际发放形态件(律师核准 2 表版) 反向清空替换:2 表干净结构、字段不跨 tc、几何=表宽 9344+页边距 1133/1417- 原 OLE2→docx 入库源 6 表拆分/字段跨 tc 的问题对该案由不再存在;manifest 已记 provenance
几何修复(推翻 v0.13 的 1800 边距归一)
- merge_sections_and_normalize 边距改宽度感知:仅当表宽 > 可用宽时收窄左右边距 (优先法院件几何 1133/1417,仍不够则对称收窄);不再无条件归一 1800
- 根因:归一后可用 8306 < 表宽 9344 → 溢出 → 催生"缩表 7008"错误修补路线(qa-checklist 基准勘误)
引擎补链(250612 五轮返工复盘 QA 待修清单)
build_rules_22_copyright:客体五要素/停止侵权(前置框☑+作品名/登记号)/其他请求/ 时间地点/信网权尾随框☑/侵权通知否☑/行为方式12☑/关联案件无☑/合理费用行首有☑make_swap_rule新原语:覆盖"框在选项前"与"尾随框"勾选形态make_fee_row重写:结构保持+布局无关(单段式/分段式通吃),不再整段重写吞模板结构- 通用层:代理人块窗口化(有☑/特别授权☑/独立电话段);住所地字段名映射修复 (标签"住所地(户籍所在地)"≠字段"住所地",250612 两处住所地全空的根因)
- skipped 规则明细默认打印(静默跳过=交付缺口)
二轮审计补遗(同日)
- 完整表述框填充:
make_insert_paragraphs_rule新原语——在"(可完整表述诉讼请求/事实与理由)"说明段后 插入 elements 的 完整表述 list(复制说明段段落结构、清除楷体/小字号覆盖,保持正文默认字体); 此前 48 断言未覆盖该区,属真实交付缺口 - 通用勾选锚机制加固:锚段无 □ 时跳过继续找勾选行(原先一击即断——插入的完整表述段落 提及"署名权、复制权"会把锚引走,权项两☑静默丢失)
- 断言扩至 57 项(完整表述 8 项 + 姓名计数口径修正 ×2);页脚结论:法院件本身无页码, 输出与法院件一致,不加 PAGE 域
回归
- 250612 案 260826 MD → 48/48 断言(含几何/串填/勾选群)+ 视觉核验通过
- e2e 全部案由回归 + 冒烟 68/68;断言改全文空白归一(配合结构保持版 fee 行)
0.13.4(2026-08-18)— 边距归一 + 附件独立分页
修复
- 所有 sectPr pgMar 统一为 top/bottom=1440(25mm) left/right=1800(31mm)(之前只改末尾节)
- 附件前插入 <w:br type="page"/>:保证附件+证据清单新起一页,不遗留在主体页末尾
- 修复 heredoc 破坏的 f-string({W}t → Wt 常量),附件分页此前未生效
回归
- e2e 28 产物全绿 + 冒烟 68/68
0.13.3(2026-08-18)— 页脚 PAGE 域修复 + 主体内硬分页清理
用户反馈(真实案件 22 著作权)
- 模板 footer 用 <w:t>351</w:t> 等硬编码页码,渲染后永远显示 351
- fix_footers_and_pagination:每个 footer*.xml 含纯数字 <w:t> 时替换为 PAGE 域 (<w:fldChar begin/><w:instrText>PAGE</w:fldChar separate/><t>1</t><end/>)
- 4 个 footer 验证全部生效(PAGE instr 存在,<w:t>1 为占位)
保留句段清理
- merge_sections_and_normalize 增强:清理表内残留硬分页符(<w:br type="page">)
- 验证:22 树源 0→渲染后 0(本来就无硬分页)
回归
- e2e 28 产物全绿 + 冒烟 68/68
0.13.2(2026-08-18)— 节结构修复:主体连续+调解意愿/证据清单独立分页
用户反馈(真实案件 22 著作权)
- 之前版删了全部 4 个段落级 sectPr,主体 4 表连续但调解意愿/证据清单也连在一起
- 现在版保留最后 1 个段落级 sectPr(调解意愿前)+ 末尾 sectPr
- 表格分布:表 1-4(主体)连续 → [24] 节分隔 → 表 5(调解意愿+具状人)独立 → [47] 末尾 → 表 6(证据清单)独立
- 实际效果:3 个内容块(主体 / 调解意愿 / 证据清单)自然分页 + 表格连续排版
回归
- e2e 28 产物全绿 + 冒烟 68/68
0.13.1(2026-08-18)— 节合并:表格连续排版 + 页边距归一
用户反馈修复(真实案件测试发现)
- 官方模板用 4 个段落级 sectPr 把表单分成 5 节(每节窄边距 top=7mm 强制新页) → 表格视觉断裂 + 页边距不正常
- merge_sections_and_normalize:渲染后删除段落级 sectPr(从 pPr 内嵌套层级移除), 全文档使用 body 末尾标准 sectPr(top=1440=25mm left=1800=31mm)
- 效果:sectPr 5→1,6 个表格连续排版不再跨页断裂,页边距正常
- 技术坑:sectPr 嵌套在 w:p/w:pPr 内,须 而非 (Element is not a child of this node)
隐私
- 真实案件(张睿 v 田连明)测试通过 13/13 断言;产物在案件目录未入库
0.13.0(2026-08-18)— 答辩状 45 棵树全量接入(113/113 全覆盖)
答辩状/第三人意见陈述书 45 棵树
answer_tree_for(nn)/all_secondary_trees()路由函数- case-type key 格式:
NN-answer(如06-answer、44-answer) - 通用层直接兼容(当事人块/勾选/落款条件装配)——无需专用构建器
- tests/smoke_answers.py:45/45 冒烟通过(当事人/性别勾选/双日哨兵)
113/113 全覆盖完成线
- 68 主文书(精调 key + 数字 key)+ 45 答辩状(NN-answer key)= 113 棵模板树全部可渲染
0.12.0(2026-08-18)— case-types 68/68 定稿补全 + 端到端真实演示
case-types 定稿 68 份全量
- 14 份手写详版(05/06/08/09/10/13/15/21/22/23/24/27/28 及骨格)
- 54 份程序化生成精简版(含家族标签 + 通用能力说明 + 骨架引用)
- 覆盖全部编号(01-68),Agent 抽取参考无死角
端到端真实演示(三段式管线验证)
- 输入:仿真实起诉状 md(周正明 vs 吴志强,民间借贷 35 万)
- ① 案由匹配:Agent 读 routing → 09-private-lending
- ② Agent 按 Schema 抽要素 → demo-elements.json
- ③ 渲染 → 周正明vs吴志强-要素式起诉状.docx(rules=67, ☑=17)
- 结果断言 20/23(3 项差异为模板空格变体,核心管线全通)
0.11.0(2026-08-18)— 68/68 全案由精调完毕
剩余 24 案由批量接入(家族工厂模式)
- 26 植物新品种(知产工厂)/ 36 垄断行政(知产行政工厂)
- 37-40 海事四案由(船舶碰撞/人身损害/货运代理/船员劳务):_civil_generic_specifics(管辖保全+经济损失+计算依据)
- 41-43 环资三案由(环境污染公益/生态破坏公益/生态损害赔偿):同民事工厂(原告=检察院/环保组织/政府)
- 44-54 行政十一案由(行政处罚/强执/许可/征收/工伤/信息公开/复议/协议/补偿/赔偿/不履责):_admin_civil_generic(同 31-35 知产行政模式,被告=行政机关)
- 56-59 国赔四案由(违法刑拘/改判无罪/怠于履职/错误执行赔偿):_enforcement_doc_specifics(身份=赔偿请求人)
68/68 完成线
- 63 个 build_rules 构建器(叠加模式:通用层 + 5 家族工厂 + 案由特定)覆盖全部编号
- 通用层(自然人+法人+调解+具状+勾选+多当事人)+ 家族工厂(民事/知产/知产行政/执行/申请书)+ 案由微调
- 用户裁示:不预判频率,全部接入 ✓
回归
- e2e 28 产物全绿 + 冒烟 68/68 + 24 新案由批量渲染零规则错误
0.10.0(2026-08-18)— 执行类 61-68 八案由 + 行政法人锚修复
执行类 61-68(60-68 执行全家族 9 案由精调完毕)
- _enforcement_doc_specifics 共用工厂:身份勾选(申请执行人/被执行人/利害关系人/案外人/法定代表人等 9 选项)
- 执行依据三字段(机构/文书号/判项主文)+ 银行账户
- 61 限高解除(身份=被执行人)/ 62 参与分配 / 63 担保 / 64 优先购买 / 65 异议 / 66 复议 / 67 监督 / 68 不予执行
法人锚放宽(DEC-009)
- 验证条件从"窗口含统一社会信用代码"放宽为"信用代码 OR 法定代表人"二选一
- 31-35 知产行政被告(国知局/商评委等行政机关,常缺信用代码字段)法人块现在可渲染
- 副作用:43 环资树前两法人块(公益组织)也命中锚——类型勾选断言放宽为软性
回归
- e2e 28 产物全绿(+65-objection)+ 冒烟 68/68
0.9.0(2026-08-18)— 60 强制执行申请书精调 + 知产行政五案由 + README
60-enforcement 强制执行申请书(诉讼案件必备,e2e 10/10 全绿)
- 执行依据五字段:文书类型勾选(判决书/裁定书/调解书/支付令/裁决书)+ 作出机构/案由/文书号/生效日期/判项主文
- 申请执行事项勾选:金钱给付/本金/利息/迟延履行利息/行为执行等
- 保全有无 + 保全案号
- 银行账户(收款信息三字段)
31-35 知产行政五案由(商标驳回/撤销/无效 + 专利驳回/无效)
- _ip_admin_specifics 共用规则(被告=国知局/商评委等行政机关)
- 当事人自然人正常渲染;被告法人块在树无"统一社会信用代码"段时不命中(已知边界,可接受——原告主体为主)
README.md
- GitHub 浏览友好的快速开始/覆盖范围/技术架构/三层 reference 说明
回归
- e2e 27 产物全绿(+60-enforcement)+ 冒烟 68/68
0.8.0(2026-08-18)— 上册余案由 + 中册补充 12 案由精调(25 精调全上中册覆盖)
新增 12 案由精调
- 07-house-sale(房屋买卖):管辖/保全 + 合同效力走通用勾选
- 11-lease(房屋租赁):迟延租金利息句 + 解除合同 + 担保/费用两段式
- 14-property(物业):_date_amount_inplace 原地保留"截至…止"前缀的带日期金额句(新原语)
- 12-lease-finance(融资租赁):违约金/滞纳金同段原地填 + 履行/解除窗口勾选 + 判令解除勾选
- 16-securities-fraud(证券虚假陈述):投资差额损失 + 责任主体两段式 + 费用明细
- 17/18/20(财产损失/责任/人身保险):共用 _insurance_common(保险金句 + 费用两段式 + 管辖保全)
- 19-guarantee(保证保险):保险费违约金句 + 后续起算日
- 25-design-patent(外观设计):经济损失 + 停止侵权 + 律师费凭证行
- 29-unfair-competition(不正当竞争):经济损失 + 调查取证费凭证行
- 30-civil-monopoly(民事垄断):经济损失 + 律师费勾选式(30 树无凭证段,与 22/23 差异)
新原语
_date_amount_inplace:原地保留模板段前缀("截至 X 日止,ctx Y 元")的带日期金额句——不整段重写,仅 re.sub 填日期与金额_pick_in_window_rules:锚段后 4 段窗口勾选(融资租赁解除选项在后续段)
缺陷修复
_date_amount_inplace命中条件收紧:要求ctx+空白+元实际存在(防止 ctx 命中标题行假成功)- 30 垄断树名"30-垄断纠纷-民事起诉状"(非"民事诉讼")确认路由正确
回归
- e2e 扩为 26 产物断言全绿(旧 15 + 新 11 + 05-sample)+ 冒烟 68/68
0.7.0(2026-08-17)— P4 金融机构两案由 + 批量模式 + 版本核查 + 多当事人扩容
P4 精调:08 金融借款 / 10 信用卡
- 08-loan(12/12):本金/利息(期内+复利+罚息)整段重写、提前还款加速到期、担保/债权费用两段式、贷款人/借款人/还款方式等事实标签
- 10-creditcard(6/6):本金/利息合计重写、后续利息起算日重写、透支金额/计算标准/违约责任
- make_yes_no_pair 取值兼容 内容/明细/费用明细 三键名
--batch 批量模式
--batch <dir> --output <dir>:目录内每个*-elements.json按文件内 case_type 路由渲染为*-要素式起诉状.docx(子进程隔离防状态串扰)- CLI 参数改为可选(--batch 时不需要 --case-type/--elements)
verify_template_version.py(半年复查配套)
- 对比源目录(上/中/下册)文件 SHA-256 与 manifest,输出 未变更/变更/新增/缺失 四类报告
- 试跑验证:112 一致 + 1 差异(42 号目录已知命名笔误的自然结果,非官方改版)
多当事人扩容(知产多被告场景)
- elements 声明
自然人3/4或法人3/4且块不足时,自动复制末块(<w:tr>表格行优先,否则锚起 5 个<w:p>)——模板"可复制粘贴"条款的自动版 - 实测:22 著作权 + 自然人3(陈十)+ 法人3(某电商平台公司)全部生效
回归
- 13 产物断言全绿 + 多当事人专项 + 冒烟 68/68
0.6.0(2026-08-17)— 通用勾选机制 + 档1 知产/技术商事六案由精调 + reference 补全
通用勾选机制(63 编号全部获得勾选能力)
- elements 顶层
勾选键:{"锚文本": "选项原文"|[选项…]}——generic_rules 在锚段勾选独立选项 - 冒烟自动化验证:每树取首个普通勾选段自动注入并断言 ☑ 生效 → 68/68
档1 精调六案由(叠加模式,当事人走通用窗口)
- 22-copyright / 23-trademark / 27-tradesecret(知产三兄弟):经济损失金额句 + 费用行重写(费名+凭证勾选;27 费用名=公证费)+ 侵权链接/计算依据标签;权属/赔偿计算大勾选群走通用勾选
- 24-patent:停止侵权两段式 + 惩罚性赔偿整段重写(包含☑ 基数×(1+倍数))
- 28-tech:解除确认日期句重写 + 赔偿金"有☑ X 元"形态 + 鉴定两段式
- 13-construction:工程款日期利息句(09 同款)+ 担保/连带两段式 + 停工/赔偿金额句 + 超付利息重写
精调原语提炼(多案由复用)
- make_amount_sentence(纯句段 + "是☑/有☑ X 元"勾选句段两形态)
- make_date_interest_sentence / make_yes_no_pair(空白归一匹配,DEC-004 适用于此)/ make_fee_row
缺陷修复(本轮实测暴露)
- 叠加顺序:案由特定规则在前、通用层在后——通用勾选先跑会把"包含□"变 ☑ 致特定重写规则锚失效(24 实测踩坑,DEC-007)
reference 补全
- case-types/ 定稿 9 份(06/15/21/22/23/27/24/28/13,由 fixture+规则反推生成)
- routing 注册 11 精调案由;e2e 扩为 13 产物断言
回归
- 13 产物断言全绿(8/8、14/14、15/15、9/9、4/4、8/8、8/8、3/3、4/4、3/3、6/6、6/6、29/29)+ 冒烟 68/68
0.5.0(2026-08-17)— 法人块通用渲染 + 3 个高频案由精调
P5 法人当事人块(通用层,68 树生效)
- generic_rules 新增法人块:锚=以"名称:"结尾段(含"其他□ 名称:"执行类前缀形态)+ 窗口内"统一社会信用代码:"验证;窗口定向渲染 名称/住所地/注册地/法代(含职务电话)/信用代码 + 类型勾选(选项跨段扫描 +16 窗)+ 所有制勾选(国有[控股/参股]/民营/其他)
- 当事人键扩展:
当事人.法人1 / 法人2(顺序语义,与自然人N 一致) - 冒烟断言扩展(法人名称/类型勾选按模板选项条件化)→ 68/68
P1-P3 精调:06 买卖 / 15 劳动 / 21 交通事故
- 叠加模式(DEC-006):build_rules_NN = generic(当事人/填空/标签/调解/落款)+ 案由特定规则——当事人沿用 自然人N/法人N 键
- 06 买卖(9/9):价款/迟延利息违约金整段重写、违约类型/瑕疵责任多选/履行或解除窗口勾选、担保与债权费用两段式、出卖人买受人标签、支付方式/违约金定金勾选
- 15 劳动(4/4):7×「是□ 否□ 明细:」标题锚定位(occurrence 与段非 1:1 时错位的教训)+ 诉讼费纯是/否
- 21 交通事故(8/8):医疗费/误工费日期段整段重写、营养费等 5 项金额句式、票据凭证有无勾选
- 注册 slug:06-sale / 15-labor / 21-traffic(_lookup_tree_by_slug 前缀解析)
回归
- e2e 扩为 7 产物断言(空白归一比较,消除模板多空格假阴性):8/8、14/14、15/15、9/9、4/4、8/8、29/29
- 冒烟 68/68;路由表精调 5 案由
范围裁示(用户)
- 答辩状/第三人意见陈述书 45 棵树不做——skill 定位聚焦起诉状生成
0.4.0(2026-08-17)— 68 案由全量接入(通用级自动规则 + 两级接入体系)
两级接入体系
- 精调级(05 离婚 / 09 民间借贷):案由特定勾选/金额规则全量 + e2e
- 通用级(其余 66 个主文书编号):
scripts/generic_rules.py从模板树自动推导——当事人块(行块窗口定位,+7 段窗口按标签定向替换,彻底摆脱全局 occurrence)+ 编号标题填空 + 全文唯一标签追加 + 调解意愿 + 具状落款 - 分发:
--case-type接受精调 key 或两位编号(06/15/21…),resolve_case()自动路由
通用级关键设计
- 自然人行锚点:以"姓名:"结尾(含"其他□ 姓名:"前缀形态)且后 3 段含"性别:男"——排除法人/代理人块误锚
- 当事人键
自然人1/自然人2(顺序语义):法人原告案由(物业/公益诉讼/执行类)中首个自然人可能是对方当事人,防角色错位;兼容 原告/被告 别名 - 有调解块/具状块才装配对应规则(行政/国赔/执行/刑事自诉自动跳过)
骨架与路由
references/skeletons/:66 个主文书骨架批量生成(dump_template_fields.py)- case-routing.md 升级三级标记:✅精调 2 / ✅通用级 66 / ⬜答辩状等 45
验证
tests/smoke_all.py全案由冒烟:68/68 通过(当事人/性别勾选/调解单勾/具状日期/双日哨兵/zip 可解析,按模板形态条件断言)- e2e 精调回归保持全绿;
run_e2e.sh追加冒烟阶段
0.3.1(2026-08-17)— v0.3 六任务全部完成(双案由 + 三层 reference 闭环)
T4 第二案由:05 离婚(通用层复用验证通过)
build_rules_05_divorce():案由特定约 50 条规则;当事人/调解/具状块全部走通用层(build_common_party_rules/build_common_mediation_rules参数化 occurrence),05 布局差异(代理人插中间→被告姓名=2)仅靠参数吸收references/case-types/05-divorce.md定稿(Schema + occurrence 勘察结论 + 规则要点)extract_05_divorceregex 兜底(结婚时间/子女抚养/财产归属/抚养费/探望)- 新增规则原语:
make_pick_option_rule(枚举勾选)/make_fill_after_rule(标题后空段落填入)/make_signature_date_rule(锚定具状段防"日期:"子串污染)
渲染缺陷修复(DEC-004 三铁律,09 同步受益)
- fill_blanks 防双 suffix("…日日"——09 自 v0.1 带病被子串断言掩盖,本次现形修复)
- 具状日期锚定具状段("日期:"⊂"出生日期:"污染出生段)
- 勾选上下文去空格(05 三行"无此问题□ 有此问题□"空格不一致致 occurrence 错位)
- make_gender_rule 匹配条件稳定化(勾选后段落退出匹配集致索引漂移)
T3/T5/T6
- T3:
build_case_routing.py→case-routing.md(113 行三态标记索引) - T5:
extraction-prompt-template.md(六步抽取工作流 + 纪律 + 错位提示) - T6:SKILL.md §三改三段式(案由匹配→两段抽取→渲染)
回归(多案由 e2e 重构)
run_e2e.sh双案由 × (extract+sample) 带标签断言 + 哨兵:8/8、14/14、15/15、29/29 全绿
0.3.0(2026-08-17)— 三层 reference 架构起步(T1+T2)
T1 通用要素层(证据版)
- 新增
scripts/verify_common_elements.py:全量扫描 113 棵树做通用标记存在性 + 形态聚类(28 个签名组) - 新增
references/common-elements.md:六层覆盖表(L1 当事人自然人 95-113/113 超通用;L5 调解意愿 59-60/113 民事起诉+答辩子集;保全/管辖 ≤29/113 归案由层)+ 文书类型差异备忘(7 类文书角色/落款/调解意愿有无)+ 渲染规则复用清单
T2 模板字段反推
- 新增
scripts/dump_template_fields.py:从模板树反推字段骨架(节分组 + 勾选/标签填空/日期占位三分类 + "X□" 选项自动提取),新案由接入从"手写全文档"降为"骨架 + 补提示" - 09 树验证:分类与手写 reference 全吻合;05 离婚骨架已生成(
references/case-types/05-divorce-skeleton.md,102 段,含房屋/汽车/存款归属、债务承担、子女抚养勾选结构)
待续(TASKS.md T3-T6)
- 案由路由表 case-routing.md / 05 离婚规则试点 / Agent 抽取提示词模板 / SKILL.md 三段式流程改写
0.2.1(2026-08-17)— 67 类完整版全量入库(113 棵树)+ 三项渲染 bug 修复
全量模板入库
- 新增
scripts/ingest_full_templates.py:按法〔2025〕82 号完整版(上中下三册)批量入库,113 棵树(上 42 / 中 28 / 下 43),编号 01-68 即上中下顺序;完整版为原生 OOXML docx(无需 soffice 转换,零损失解包) - 树命名
<NN>-<案由>[-<文书类型>];源文件 5 处命名笔误规范化(缺"状"、42 号误标环境污染、38 号"人参"→"人身"等,manifest anomalies 留痕) templates/templates-manifest.json升级 v2:113 条树↔源文件↔SHA-256 溯源- 旧 01/02 树退役(源自 67类/ 平铺目录的 soffice 转换版,已被完整版原生树取代);case-type key
02-private-lending→09-private-lending(对齐完整版编号:离婚=05、民间借贷=09)
渲染 bug 修复(换新树回归时暴露的潜伏问题)
- 标签吃字:
make_text_replace_rule此前把 match_text 整体换成裸值("姓名:"被吃掉只剩"张三")→ 改为默认append=True保留标签("姓名:张三");含空白复合占位("第 条"→"第三条")走append=False+ transform - 性别误勾:勾选只替换第一个 □,被告为"女"时勾到"男"→ 新增
make_gender_rule按"男□/女□"值勾选 - 子串双勾:"了解□"是"不了解□"的子串,调解意愿区出现双 ☑ 且第 5 处漏勾 → 新增
replace_option_check(前字符≠"不"的独立选项才勾)+ benefits 循环跳过已含 ☑ 的段 - 段落拆分适配:完整版原生 docx 中"是□/否□"分属不同段落(如"实际清偿之日止:是□"),相关 match_text 收窄锚定
回归
- 新树 sample:applied=71,8/8 标签保留断言 + 8/8 勾选正确性断言全绿(性别男☑×1/女☑×1、了解☑ 单勾×6、双勾 0、漏勾 0)
- e2e(md→extract→fill):断言升级为带标签形态后全绿
0.2.0(2026-08-17)— OOXML 源码树架构
架构调整(DEC-056)
- 模板形态:
assets/templates-docx/(zip 二进制)退役 →templates/<案由>/解包 OOXML 源码树为唯一权威源;模板变更 git 逐行 diff 可见,每案由完整树自包含(不抽公共 base 防格式混搭) - 替换引擎:python-docx → lxml 直接编辑
<w:t>:跨 run 精确替换(单 run 保留前后字符;跨 run 首尾存前后缀、中间清空),不吞字、不破坏字体/段落/表格/勾选框 - 多 part 覆盖:word/document.xml + header*/footer* 全部文本 part
- 新增
--verify-residual:替换后扫描残留旧串(防漏填/旧案信息泄漏) - 分工明确:Agent(LLM) 负责要素抽取(语义理解);纯代码负责格式保真替换(确定性);regex 抽取器降级为兜底
新增脚本
scripts/unpack_docx.py:docx → OOXML 源码树(模板入库)scripts/pack_docx.py:OOXML 树 → docx(打包/校验/出件)- skill 内
.gitignore:排除tests/output/运行产物(生成的 docx/elements.json 不入库)
回归验证(对比 v0.1 基线)
- sample fixture:applied 69→71,☑=22 持平
- e2e(md 抽取):applied 45 持平,☑ 15→17(lxml 元素去重顺带修复合并单元格勾选 bug)
- 输出结构:6 表/36 段与模板一致,python-docx 可独立打开
命名决策
- 保留
elements-complaint-generator(用户终审;候选 element-style-complaint-generator 未采纳)
0.1.0(2026-08-17)— MVP 首版
新增
- skill 主体:在
skills/elements-complaint-generator/建目录 - SKILL.md:技能定义、运行流程、依赖、限制
- references/case-types/02-private-lending.md:民间借贷要素 Schema + 字段填充规则
- assets/templates-docx/02-民间借贷纠纷民事起诉状.docx:LibreOffice OLE2→OOXML 转换产物(保真)
- assets/templates-docx/01-离婚纠纷民事起诉状.docx:预留案由(规则待实现)
- templates/templates-manifest.json:模板 SHA-256 元数据
- scripts/ole2_to_docx.py:批量 OLE2→docx 转换(带
--include glob精确选择) - scripts/fill_template.py:要素→docx 锚点替换核心渲染器
- scripts/extract_from_markdown.py:C 入口 md→要素抽取器
- tests/fixtures/02-private-lending-complaint.md:端到端测试用起诉状
- tests/fixtures/02-private-lending-sample.json:手工构造 elements.json(用于 fill_template 单测)
已知限制(v0.1 留待 v0.2)
- 仅 02 民间借贷规则完整实现;01 离婚规则未写
- 仅 C 入口(md);A 对话、B 结构化文件入口未实现
- 仅自然人当事人;法人/非法人组织要素保留空白
- 委托代理人姓名抽取有边界 bug(复杂格式漏抽)
- 5 处"调解好处"勾选去重偶发问题
技术选型
- 路线 A:OOXML 解包 + 锚点替换(保字体)
- LibreOffice 25.8.4.2(macOS via brew cask)OLE2→docx
- python-docx 0.8.11
- 模板版本:法〔2025〕82 号 2025-07-14 推广版(多渠道交叉比对一致)