feat: export core Hermes skills

This commit is contained in:
2026-07-15 02:45:56 +00:00
parent a028b63eda
commit 54711fee2a
308 changed files with 41310 additions and 1 deletions
@@ -0,0 +1,62 @@
# "对错误的处理或者决定予以撤销或者变更"的法律解释
## 来源法条
《公安机关内部执法监督工作规定》(公安部令第40号,2020年修订)
**第十九条** 对公安机关及其人民警察不合法、不适当的执法活动,分别作出如下处理:
(一)对错误的处理或者决定予以撤销或者变更;
(二)对拒不履行法定职责的,责令其在规定的时限内依法履行;
(三)对违反法律、法规和有关规定收费或者罚没财物的,责令退回并依照有关规定处理;
(四)公安机关及其人民警察违法行使职权已经给公民、法人和其他组织造成损害,需要给予国家赔偿的,应当依照《中华人民共和国国家赔偿法》的规定予以国家赔偿;
(五)公安机关人民警察在执法活动中因故意或者过失,造成执法过错的,按照《公安机关人民警察执法过错责任追究规定》追究执法过错责任。
**第十三条** 在执法监督过程中,发现本级或者下级公安机关已经办结的案件或者执法活动**确有错误、不适当的**,主管部门报经主管领导批准后,直接作出纠正的决定,或者责成有关部门或者下级公安机关在规定的时限内依法予以纠正。
**第九条**(审查标准)就案件的**事实是否清楚,证据是否确凿、充分,定性是否准确,处理意见是否适当,适用法律是否正确,程序是否合法**,法律文书是否规范、完备等内容进行审核。
## "错误"的四种类型
配套的《公安机关人民警察执法过错责任追究规定》(2016年修订)第2条定义:
> "本规定所称执法过错是指公安机关人民警察在执法办案中,故意或者过失造成的**认定事实错误、适用法律错误、违反法定程序、作出违法处理决定**等执法错误。"
| 错误类型 | 具体表现 | 在万禹案中的对应 |
|---------|---------|----------------|
| 认定事实错误 | 处罚对象有误、关键事实查明有误 | 万禹公司非赌博组织者/参与者 |
| 适用法律错误 | 援引法律条款不当、法律适用前提不成立 | "从事"赌博的主观要件(间接故意)无法证成 |
| 违反法定程序 | 未依法告知、听证、送达等 | (本案未涉及) |
| 作出违法处理决定 | 超越处罚幅度、无权作出该类处罚 | (本案未涉及) |
## 权威判例:焦志刚案
**最高人民法院公报2006年第10期**
焦志刚诉天津市公安局和平分局治安管理处罚决定行政纠纷案
天津市第一中级人民法院二审
### 裁判要旨
1. **"错误"的门槛较高**——必须是实质性的违法或不当(事实不清、证据不足、法律适用错误、程序违法等),而非主观上认为处罚轻重不当:
> "056号处罚决定书依照法定程序作出,事实清楚、证据确凿,处罚在法律规定的幅度内,是合法且已经发生法律效力的处罚决定,**不在《公安机关内部执法监督工作规定》所指的'错误的处理或者决定'之列**,不能仅因交警部门认为处罚过轻即随意撤销。"
2. **该规定是内部规章**——只在公安机关内部发挥作用,不能成为对外制作行政处罚决定的法律依据
3. **反向推论价值**——引用第19条第1项撤销处罚,按焦志刚案确立的高门槛标准,意味着公安机关自行认定原处罚确有实质性错误
## 论证路径模板(供再审申请书使用)
> 上海市公安局闵行分局引用《公安机关内部执法监督工作规定》第十九条第一项撤销对万禹公司的行政处罚。根据焦志刚诉和平公安分局案(最高人民法院公报2006年第10期)所确立的规则,该条款仅适用于"确有错误"的处罚,合法且已生效的处罚"不在该条所指的'错误的处理或者决定'之列"。由此可见,公安机关引用该条撤销处罚,意味着其经内部执法监督审查后认定原处罚**确属实质性错误**——处罚对象有误、万禹公司未实施违法行为。
>
> 原判决一方面认定行政处罚已被撤销,另一方面又以被撤销的行政处罚所认定的事实作为万禹公司"根本违约"的理由,逻辑上存在根本矛盾。
## 进一步强化论证(配合谈话笔录)
若行政诉讼案件中存在调解谈话笔录,公安机关的自认(如"原告日常经营合法合规")可直接引用:
> 更为重要的是,在(2024)沪0115行初501号行政诉讼案件的调解过程中,作出原行政处罚的上海市公安局闵行分局代理人明确表示:"原告日常的经营合法合规。"同时表示撤销需经过"办案单位发起→法制审核→上报分局局领导审批"的正式程序——这是《公安机关内部执法监督工作规定》规定的内部纠错程序,而非简单的行政诉讼和解让步。
## 相关条文效力状态
- 《公安机关内部执法监督工作规定》:公安部令第40号,1999年发布,2020年修订版现行有效
- 《公安机关人民警察执法过错责任追究规定》:2016年修订版现行有效(替代1999年公安部令第41号)
- 焦志刚案:最高法院公报2006年第10期,判决时间2005年,适用《治安管理处罚条例》但法律解释原则不受影响
@@ -0,0 +1,64 @@
# 民事诉讼法条文号版本对照(审判监督程序)
## 为什么需要这个对照表
民诉法历经5次修正(2007/2012/2017/2021/2023),每次修正条文总数变化导致后续条文编号后移。审判监督程序在法律末段,是编号漂移最严重的区域。**凭记忆引用条文号极其危险**——搜索引擎结果中的文章可能引用任何一个旧版本的编号。
## 审判监督程序关键条文对照
| 条文内容 | 2021版(第四次修正) | 2023版(第五次修正,现行) |
|---------|------|------|
| 院长发现错误→审委会 | 第198条 | 第209条 |
| 当事人申请再审(管辖) | 第199条 | 第210条 |
| **再审事由13项** | **第200条** | **第211条** |
| 调解书再审 | 第201条 | 第212条 |
| 申请期限(6个月) | 第205条 | 第216条 |
| 再审申请书材料 | 第204条 | 第214条 |
| 审查期限(3个月) | 第206条 | 第215条 |
| 中止执行 | 第207条 | 第217条 |
| 再审审理程序 | 第208条 | 第218条 |
| 检察院抗诉 | 第209条 | 第219条 |
| 检察建议/抗诉申请 | 第210条 | 第220条 |
## 2023版变化原因
2023年9月1日第五次修正主要修改涉外编(第四编),新增16条涉外条文。非涉外编条文内容未改,但**编号整体后移约10条**。
## 交叉验证方法
当不确定条文号时,用**交叉引用法**验证:
- 第219条(检察抗诉)引用"本法第二百一十一条规定情形"→ 确认第211条=再审事由
- 第215条规定"三个月内审查"→ 确认第215条=审查期限(不是第211条)
## 再审事由13项(2023版第211条)
第(一)项:有新的证据,足以推翻原判决、裁定的
第(二)项:原判决、裁定认定的基本事实缺乏证据证明的
第(三)项:原判决、裁定认定事实的主要证据是伪造的
第(四)项:原判决、裁定认定事实的主要证据未经质证的
第(五)项:对审理案件需要的主要证据,当事人因客观原因不能自行收集,书面申请人民法院调查收集,人民法院未调查收集的
第(六)项:原判决、裁定适用法律确有错误的
第(七)项:审判组织的组成不合法或者依法应当回避的审判人员没有回避的
第(八)项:无诉讼行为能力人未经法定代理人代为诉讼或者应当参加诉讼的当事人,因不能归责于本人或者其诉讼代理人的事由,未参加诉讼的
第(九)项:违反法律规定,剥夺当事人辩论权利的
第(十)项:未经传票传唤,缺席判决的
第(十一)项:原判决、裁定遗漏或者超出诉讼请求的
第(十二)项:据以作出原判决、裁定的法律文书被撤销或者变更的
第(十三)项:审判人员审理该案件时有贪污受贿,徇私舞弊,枉法裁判行为的
## 常见再审申请书引用格式
> 根据《中华人民共和国民事诉讼法》第二百一十条、第二百一十一条第(二)项、第(六)项之规定,向贵院提出再审申请。
其中:
- 第210条 = 当事人申请再审的管辖和程序规定
- 第211条第(二)项 = 基本事实缺乏证据证明
- 第211条第(六)项 = 适用法律确有错误
## ⚠️ 2026-06-12教训
在审阅万禹案再审申请书时,我看到申请书引用"第二百一十一条第(二)、第(六)项",误认为第211条是审查期限条款(2021版编号思维),挑战了Doro的正确引用。实际2023版第211条就是再审事由条款。
**根因**:搜索结果中天同律师事务所的文章列出"第206条=申请再审、第207条=再审事由"——但那是2021版编号,我未意识到该文章写于2023年修正前。
**预防**:永远不要仅凭搜索结果中的条文号下结论。必须(1)确认文章引用的是哪个版本(2)用交叉引用法验证(3)如有官方PDF,直接查PDF原文。
@@ -0,0 +1,133 @@
# 刑事/行政材料 → 民事追偿诉讼方案
> 来源:万禹案(2026-07-03,Maggie指导),场所内犯罪导致经营者被牵连停业
## 适用场景
客户因他人犯罪/违法行为遭受经济损失,需从刑事笔录、庭审材料中提取信息,构建民事追偿方案。典型案型:
- 场所内发生犯罪 → 场所经营者被行政处罚(停业/吊照)→ 向犯罪人追偿
- 员工犯罪导致公司被牵连 → 向犯罪人(含员工本人)追偿
- 第三方在租赁物内违法 → 出租人被追责 → 向承租人/实际违法人追偿
## 工作流
### Step 1:材料获取与OCR
**扫描件公安笔录处理**
1. docx内嵌图片→zipfile提取word/media/所有jpeg
2. tesseract逐页OCR(`tesseract imageN.jpeg stdout -l chi_sim`
3. ⚠️ 手写体姓名必须用vision_analyze逐页核实,OCR常出错(万禹案:"詹爱兰"被OCR为"张爱兰"/"凑爱兰"/"座爱兰")
**语音识别庭审笔录处理**
- 不是简单的OCR清理,需要结合案情还原表达本意
- 详见主skill"语音识别庭审笔录整理"一节
### Step 2:被告身份信息提取
从公安笔录中提取每个潜在被告的:
- 姓名(⚠️ 手写签名+正文两处交叉验证)
- 身份证号、出生日期
- 户籍地、现住址
- 联系方式
- 前科情况(对论证"高度可归责性"有价值)
**姓名验证陷阱**
- 手写体"詹"和"张"极易混淆(言字旁vs弓旁)
- OCR对手写中文名准确率低,必须vision看原图
- 杨建兰手机存"张姐,打牌"≠该人姓张(可能是谐音随手存的)
- 以笔录原件上的身份证号核验为准(前6位=户籍区划)
### Step 3:被告选择策略
不是所有犯罪参与人都应列为被告:
| 考虑因素 | 列入 | 不列入 |
|---------|------|-------|
| 主犯/组织者 | ✅ 必列 | — |
| 共犯(已判决) | ✅ 列入扩大连带基数 | — |
| 参赌者(治安处罚) | — | ❌ 因果关系论证难,执行价值低 |
| **原告自己的员工** | — | ❌ 列为被告=给对方送"管理过错"弹药 |
| 帮助犯/从犯 | 视情况 | 如果其证言对原告有利,留作证人更好 |
**员工被告取舍决策(关键)**
- 如果员工是被欺骗的(如杨建兰被詹爱兰以"喝茶打牌"骗),其证言价值>被告价值
- 员工证言中有利于原告的内容(如"我主动打电话拒绝""老板不知道"),保护这些比追她一点钱更重要
- 列员工为被告后,对方必然抗辩"你自己管不好员工还起诉她?你的管理过错更大"
### Step 4:侵权构成要件论证
按五板块结构逐一论证,详见 `references/tort-liability-analysis.md`
这里补充该reference中未涉及的"被牵连方"专题:
### Step 5:"被牵连方"定位论证
**核心逻辑**:行政诉讼争的是"原告该不该被罚";民事追偿争的是"谁让原告陷入了这个境地"。这是两个完全不同的法律关系。
**论证结构**
1. 原告不是违法活动的参与者/组织者/受益者
2. 原告是被犯罪行为侵入和波及的第三方
3. 公法上的"场所管理责任"≠民法上的"过错"
4. 行政处罚的存在不免除真正致害人的民事赔偿责任
5. 类比:有人在商铺内放火→消防灭火造成水损→向放火者索赔全部损失
### Step 6:行政处罚效力与民事追偿的互动
**处罚被撤销=最强武器**
- 行政法院认定原告无过错→堵死对方"过失相抵"抗辩
- 连行政法院都认为原告无过错,民事法院更没有理由认定原告有过失
- 被告承担100%赔偿,没有过失相抵空间
**处罚维持≠不能追偿**
- 行政法上的"管理责任"是公法义务,不等于民法上对犯罪人的"过错"
- 被管理者(场所)≠致害者(犯罪人)
- 只是过失相抵风险存在,需要做预期管理(100%/70-80%/50-60%三档)
**公安错误处罚不切断因果关系**(四层论证):
1. 可预见性:场所被处罚是犯罪的可预见制度性后果
2. 风险制造:仍在被告制造的风险范围内
3. 多因一果:不免除任何一方,原告可两头追(民事+国赔)
4. 独立损害兜底:犯罪行为直接造成的损害不需要经过行政处罚
### Step 7:过失相抵应对
逐项反驳对方可能的管理过错指控,核心反驳逻辑:
- "受骗者≠放任者"——原告方面是被欺骗的,不是知情放任的
- 不能以事后结果倒推管理过错(正常工作权限≠授权违法)
- 终极武器:行政处罚撤销=法院认定无过错
### Step 8:受损法益分层
**第一层(铁板钉钉)**:犯罪行为直接侵害,不依赖行政处罚——
- 场所占有权/使用权(236条)
- 经营场所安全利益
- 法人名誉权/商业信誉(1024条)
**第二层(主要诉请)**:经行政处罚传导——
- 经营自主权
- 财产权(积极损失:固定成本)
- 财产权(消极损失:可得利润)
- 企业存续利益
分层意义:即便对方攻击第二层因果关系,第一层损害跑不掉。
## 注意事项
1. **先确认行政诉讼结果再起诉**——这决定策略方向和过失相抵预期
2. **刑事判决书是核心证据**——犯罪事实无需再行举证,但判决书通常匿名化或不公开,需通过法院调取
3. **损失金额要务实**——起诉按100%主张,但内部做70%底线预期
4. **杨建兰供述中的2300元/天 vs 200元/次矛盾**——可用于论证詹爱兰的"高度可归责性"(支付高额场地费=明知是犯罪行为),不必纠结谁说的对
5. **讨论记录要保存为md**——方案经过多轮讨论演进,保存完整讨论脉络(含被否定的方案),下次回来能快速接上
## 文件夹结构建议
```
~/案件名/
├── 原始材料.docx ← 邮件附件
├── images/ ← 扫描件拆页
├── OCR原文.txt ← tesseract原始输出
├── 公安笔录原文.md ← 整理后的纯文字
├── 庭审笔录整理.md ← 还原后的庭审记录
├── 诉讼方案分析.md ← 起诉状+构成要件分析
└── 讨论记录.md ← 全部讨论过程和决策理由
```
@@ -0,0 +1,39 @@
# 《情况反映》——法院内部监督渠道(区别于检察监督申请)
当事人认为审判程序违法,有两条并行的外部/内部纠错路径,文书类型、受文机关、姿态都不同,**不能混用页眉/抬头/称谓**:
| | 检察监督申请书 | 情况反映 |
|---|---|---|
| 受文机关 | 同级人民检察院 | 本案审理法院(院领导+审判监督/监察部门) |
| 性质 | 外部法律监督(检察院→法院发检察建议) | 法院内部自我纠错 |
| 姿态 | "请求贵院依法监督" | "恳请督促承办部门依法办案",**不碰追究法官责任的对抗腔** |
| 法律依据 | 民诉法第十四条、《人民检察院民事诉讼监督规则》第三十条等 | 最高法 法发〔2014〕13号(见下) |
| 称谓 | 申请人 / 申请监督 / 受理法院 | 反映人 / 反映 / 贵院 |
## 权威法律依据(已核 court.gov.cn 原文,2026-06-23)
**最高人民法院 法发〔2014〕13号《关于人民法院在审判执行活动中主动接受案件当事人监督的若干规定》**(2014-07-15 印发,court.gov.cn 全文可查):
- **第十二条第(四)项**(核心路由依据):人民法院监察部门对当事人反映的意见,"对反映的**办案程序、法律适用**及事实认定等方面问题,依照相关规定**分别移送案件承办部门、审判监督部门或者审判管理部门处理**。"
- 第七条:当事人可将填有意见的廉政监督卡**直接寄交人民法院监察部门**;监察部门统一处置管理。
- 第十六条:尚未设立监察部门的法院,由政工部门承担监察部门职责。
- 第十七条:案件当事人含民事案件的原告、被告及第三人。
→ "办案程序违法 + 法律适用偏差"正属第十二条第(四)项射程,对口受理是法院**监察部门**,再移送**审判监督部门/审判管理部门**。这就是《情况反映》"寄给谁"的官方落点。
## 文书结构(已实测交付,邹家案)
标题《关于(××××)×号案审判程序违法情形的情况反映》→ 受文机关顶格"××法院:"→ 一、案件基本情况 → 二、本案审理中存在的程序违法情形(分项)→ 三、反映请求(编号列举督促事项)→ 此致 / ××法院 → 反映人签名捺印 / 日期 → 附:随附材料清单。
## "寄给谁"的检索方法(落地投递信息)
1. 法院**官网**(如 ld.lsfy.gov.cn)页脚/"联系方式"/"部门及职能"栏,取地址、邮编、**信访接待电话**(这是当事人反映程序问题的对口窗口,区别于立案咨询/办公室电话)。
2. 全国法院统一诉讼服务/监督热线 **12368**
3. 递交方式三选(由用户定):①诉讼服务中心/信访窗口当面递交要回执(留痕最实);②挂号信寄法院地址、信封注明"院领导/监察部门 收";③省法院网上信访/12368 同步留痕。
4. 抬头只写到"××人民法院"、请求里点名"院领导及审判监督、监察部门",**不写死具体庭室名**(各地内设机构名称不一,写死易错);用户知道当地确切受理部门再替换。
## 节奏提示(与检察申请书并用时)
情况反映与检察监督申请书共用同一事实证据。通常打法:**先递法院情况反映(给自纠机会),并行或稍后递检察监督**,姿态更顺;两份别同时递得互相矛盾。是否走此节奏由用户定。
## 采纳前景判断框架(检察监督申请,邹家案沉淀)
判断"检察院会不会采纳"要把**受理**和**实质支持**拆成两道门槛分别说:
- **受理**:看程序定位是否选对(如"审判程序中审判人员违法行为监督"不以生效裁判为前提,审理中也能进)、是否引了"不受异议/复议/起诉前置限制"条款堵住不予受理的退路、书证链是否齐。
- **实质支持**:逐个违法点分强弱(强制性义务/逻辑硬伤=硬,程序裁量/释明瑕疵=软),别把宝押在软点上。
- **裁判倾向(非法律结论,须标明)**:检察机关对**未审结案件**的同步监督整体偏克制、倾向事后监督;即便支持也多以**检察建议**柔性处理,法院采不采有不确定性。但这类申请一半价值在**留痕施压**——程序规范本身即对承办法官形成"依法办案"约束,是即便短期不强力介入也值得递的理由。
@@ -0,0 +1,120 @@
# docx 批注(Word Comments)+ 修订痕迹 联合写入
适用:审核他人文书时,**既要插入批注(comment / 批注气泡)又要直接修订(tracked changes)**,author 跟随指示人(莎莎的诉讼文书 author=苌莎莎;Doro 的合同 author=WB;按谁审核定,不要写死)。
> 与 `references/tracked-changes-text-replacement.md` 的区别:那份只讲 DEL/INS 文字替换;本份补全**原生批注**所需的 4 处 OOXML 接线,这是 python-docx 不直接支持、必须手写 XML 的部分。
## 一、原生批注需要改动的 4 个地方(缺一不可)
插入一条批注,不是只在正文加个标记,而是要同时改 4 个部件:
1. **word/document.xml** — 在被批注文字两端插入 `w:commentRangeStart` / `w:commentRangeEnd`,并在范围后加一个带 `w:commentReference` 的 run
2. **word/comments.xml** — 新建该部件,每条批注一个 `w:comment`(含 id/author/date/initials + 段落内容)
3. **word/_rels/document.xml.rels** — 加一条 Relationship 指向 comments.xml(Type 结尾 `/comments`
4. **[Content_Types].xml** — 加一条 Override 声明 comments.xml 的 content-type
漏掉 3 或 4,Word/OnlyOffice 打开时批注不显示或报文件损坏。
## 二、关键陷阱(本会话实际踩到)
- **`comments_root.set('xmlns:w', W)` 会抛 `ValueError: Invalid attribute name 'xmlns:w'`**。lxml 不允许手动 set 命名空间属性。正确做法是在创建根元素时用 `nsmap`
```python
nsmap = {'w': W, 'r': R}
comments_root = etree.Element(f'{{{W}}}comments', nsmap=nsmap)
```
- **id 唯一性**:批注 id、修订(w:ins/w:del) id 各自独立递增,全文不重复。本会话用 comment 从 101 起、revision 从 200 起两个独立计数器,避免撞号。
- **`xml:space="preserve"`**:批注文字和 ins/del 文字的 `w:t`/`w:delText` 都要设 `{http://www.w3.org/XML/1998/namespace}space=preserve`,否则首尾空格被吃掉。
- **批注 rPr 用宋体小四**:批注内容 run 显式设 `w:rFonts`(ascii/hAnsi/eastAsia=宋体)+ `w:sz`(如 18=9pt),不靠继承。
- **多行批注**:一条批注要分多段时,`w:comment` 下放多个 `w:p`,每段一个 run;用 `\n` split 文本逐段建 p。
## 三、可复用代码骨架
```python
import zipfile, shutil, copy
from lxml import etree
W = 'http://schemas.openxmlformats.org/wordprocessingml/2006/main'
R = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships'
AUTHOR = '苌莎莎' # 跟随指示人,不写死 WB
DATE = '2026-06-15T12:00:00Z'
# 读取四个部件
with zipfile.ZipFile(SRC) as z:
all_files = {n: z.read(n) for n in z.namelist()}
doc = etree.fromstring(all_files['word/document.xml'])
rels = etree.fromstring(all_files['word/_rels/document.xml.rels'])
ct = etree.fromstring(all_files['[Content_Types].xml'])
body = doc.find(f'{{{W}}}body')
# --- 批注:包裹某段落 ---
def add_comment_to_para(para, cid):
rs = etree.Element(f'{{{W}}}commentRangeStart'); rs.set(f'{{{W}}}id', cid)
para.insert(0, rs)
re_ = etree.SubElement(para, f'{{{W}}}commentRangeEnd'); re_.set(f'{{{W}}}id', cid)
r = etree.SubElement(para, f'{{{W}}}r')
rpr= etree.SubElement(r, f'{{{W}}}rPr')
rst= etree.SubElement(rpr, f'{{{W}}}rStyle'); rst.set(f'{{{W}}}val','CommentReference')
cr = etree.SubElement(r, f'{{{W}}}commentReference'); cr.set(f'{{{W}}}id', cid)
def make_comment(cid, text):
c = etree.Element(f'{{{W}}}comment')
c.set(f'{{{W}}}id', cid); c.set(f'{{{W}}}author', AUTHOR)
c.set(f'{{{W}}}date', DATE); c.set(f'{{{W}}}initials','CSS')
for line in text.split('\n'):
p = etree.SubElement(c, f'{{{W}}}p')
if line.strip():
r = etree.SubElement(p, f'{{{W}}}r')
rpr = etree.SubElement(r, f'{{{W}}}rPr')
rf = etree.SubElement(rpr, f'{{{W}}}rFonts')
for a in ('ascii','hAnsi','eastAsia'): rf.set(f'{{{W}}}{a}','宋体')
etree.SubElement(rpr, f'{{{W}}}sz').set(f'{{{W}}}val','18')
t = etree.SubElement(r, f'{{{W}}}t')
t.set('{http://www.w3.org/XML/1998/namespace}space','preserve'); t.text = line
return c
# --- 修订:在一个 run 内 DEL 旧 + INS 新(拆 before/old/after)---
# 详见 references/tracked-changes-text-replacement.md,本份重点在批注接线
# --- 组装 comments.xml ---
comments_root = etree.Element(f'{{{W}}}comments', nsmap={'w':W,'r':R})
for c in comment_elems: comments_root.append(c)
comments_xml = etree.tostring(comments_root, xml_declaration=True, encoding='UTF-8', standalone=True)
# --- rels 加关系(先查重,避免重复)---
if not any(r.get('Target')=='comments.xml' for r in rels):
maxid = max((int(r.get('Id')[3:]) for r in rels if r.get('Id','').startswith('rId')), default=0)
nr = etree.SubElement(rels, 'Relationship')
nr.set('Id', f'rId{maxid+1}')
nr.set('Type', 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/comments')
nr.set('Target', 'comments.xml')
# --- content-types 加 Override ---
ctns = ct.nsmap.get(None)
if not any(o.get('PartName')=='/word/comments.xml' for o in ct):
ov = etree.SubElement(ct, f'{{{ctns}}}Override')
ov.set('PartName','/word/comments.xml')
ov.set('ContentType','application/vnd.openxmlformats-officedocument.wordprocessingml.comments+xml')
# --- 写回 zip(document/rels/ct 覆盖,comments.xml 新增)---
with zipfile.ZipFile(DST,'w',zipfile.ZIP_DEFLATED) as zout:
for name, data in all_files.items():
if name=='word/document.xml': zout.writestr(name, etree.tostring(doc, xml_declaration=True, encoding='UTF-8', standalone=True))
elif name=='word/_rels/document.xml.rels': zout.writestr(name, etree.tostring(rels, xml_declaration=True, encoding='UTF-8', standalone=True))
elif name=='[Content_Types].xml': zout.writestr(name, etree.tostring(ct, xml_declaration=True, encoding='UTF-8', standalone=True))
else: zout.writestr(name, data)
zout.writestr('word/comments.xml', comments_xml)
```
## 四、交付前自检(程序化,vision 不可用时的硬验证)
vision/截图分析工具可能不可用,改用程序化核验,逐项确认:
```python
with zipfile.ZipFile(DST) as z:
cm = etree.fromstring(z.read('word/comments.xml'))
print('批注数', len(cm.findall(f'{{{W}}}comment'))) # 与预期条数一致
dx = etree.fromstring(z.read('word/document.xml'))
print('DEL', len(dx.findall(f'.//{{{W}}}del')), 'INS', len(dx.findall(f'.//{{{W}}}ins')))
print('rels ok', b'comments.xml' in z.read('word/_rels/document.xml.rels'))
print('ct ok', b'comments' in z.read('[Content_Types].xml'))
```
再用 LibreOffice 转 PDF → pdftoppm 转 PNG → `browser_navigate('file:///...png')` 目检版面(批注气泡、修订删除线/下划线是否到位)。
@@ -0,0 +1,147 @@
# docx 版式核验(不依赖 vision 工具)
审核他人文书时常需确认「自动编号实际渲染成什么」「字号/字体是否统一」。当 vision 工具不可用时,直接解析 OOXML 比肉眼看渲染图更精确、可复现。
## 一、确认自动编号实际渲染格式(核心技巧)
`w:numPr` 只记录 `numId`,真正决定显示成「一、二、」还是「1. 2.」的是 `numbering.xml` 里的 `numFmt`。必须三级映射:`段落 numId → num.xml 的 abstractNumId → abstractNum 的 numFmt/lvlText`
```python
import zipfile
from lxml import etree
W='{http://schemas.openxmlformats.org/wordprocessingml/2006/main}'
ns={'w':W[1:-1]}
z = zipfile.ZipFile('file.docx')
# 1) numId -> abstractNumId
num = etree.fromstring(z.read('word/numbering.xml'))
nummap = {n.get(W+'numId'): n.find('w:abstractNumId', ns).get(W+'val')
for n in num.findall('w:num', ns)}
# 2) abstractNumId -> (numFmt, lvlText) 仅取 ilvl=0
abfmt = {}
for an in num.findall('w:abstractNum', ns):
lvl0 = an.find('w:lvl', ns)
if lvl0 is not None:
abfmt[an.get(W+'abstractNumId')] = (
lvl0.find('w:numFmt', ns).get(W+'val'),
lvl0.find('w:lvlText', ns).get(W+'val'))
# 3) 遍历正文带编号的段落
doc = etree.fromstring(z.read('word/document.xml'))
for p in doc.findall('.//w:p', ns):
texts = ''.join(t.text or '' for t in p.findall('.//w:t', ns))
numPr = p.find('.//w:numPr', ns)
if numPr is not None and numPr.find('w:numId', ns) is not None:
nid = numPr.find('w:numId', ns).get(W+'val')
ab = nummap.get(nid, '?')
fmt = abfmt.get(ab, ('?', '?'))
print(f'numId={nid} numFmt={fmt[0]} lvlText=[{fmt[1]}] | {texts[:28]}')
```
### numFmt 取值对照(常见)
| numFmt | lvlText | 渲染 | 适用 |
|--------|---------|------|------|
| `chineseCountingThousand` | `%1、` | 一、二、三、 | 法律文书一级论点(答辩状/起诉状惯例) |
| `japaneseCounting` | `%1、` | 一、二、三、 | 同上(部分模板用此) |
| `decimal` | `%1.` | 1. 2. 3. | 英文/普通编号 |
| `lowerLetter` | `%2)` | a) b) c) | 子层级 |
| `bullet` | (符号) | • | 无序列表 |
⚠️ 同一个 docx 的 `numbering.xml` 里通常定义了多套 abstractNum(decimal、bullet、中文计数并存),**不能假设第一套就是正文用的那套**——必须从目标段落的 numId 反查。本会话实测:三个加粗论点标题套用的是 `chineseCountingThousand`(渲染为「一、二、三、」),而文件里同时还存在多套 decimal/bullet 定义是干扰项。
## 二、字号/字体/对齐一致性巡检
```python
from docx import Document
from docx.oxml.ns import qn
doc = Document('file.docx')
for i, p in enumerate(doc.paragraphs):
if not p.text.strip():
continue
align = str(p.alignment)
has_num = (p._p.find(qn('w:pPr')) is not None
and p._p.find(qn('w:pPr')).find(qn('w:numPr')) is not None)
sz = bold = font = None
for r in p.runs: # 取首个有字的 run
if r.text.strip():
sz = r.font.size.pt if r.font.size else None
bold = r.font.bold
font = r.font.name
break
print(f'[{i:02d}] align={align[:6]} num={has_num} sz={sz} bold={bold} font={font} | {p.text[:26]}')
```
- `sz=None` 表示该 run 继承 Normal 样式的字号——不是 bug,但若要确认实际磅值需读 styles.xml 的 Normal 定义。
- **西文字体回退陷阱**:`font.name` 显示 `Calibri` 而中文正常显示,说明文档正文字体是 Calibri(西文字体),中文靠系统回退渲染。正式法律文书定稿前应统一为仿宋/宋体,符合法院惯例。提醒制作人即可,不必擅改(除非指示人要求)。
## 三、标题孤行(orphan heading)检测 + 修复(格式洁癖用户必查,2026-06-22 邹家案实测)
长文书插入新章节后,**二级/三级标题可能被挤到页尾,正文翻到下一页**——标题与其正文分离(orphan heading)。Doro/Maggie 有格式洁癖,这种排版会被退回。vision 工具不可用时,用「逐页首末行文本提取」程序化检测:
```python
import fitz, re
d = fitz.open("rendered.pdf") # 必须用 OnlyOffice 口径渲染的 PDF(见 memory: x2t)
for i in range(d.page_count):
lines = []
for b in d[i].get_text("dict")["blocks"]:
if b.get("type") != 0: # 跳过图片块
continue
for l in b["lines"]:
txt = "".join(s["text"] for s in l["spans"]).strip()
if txt:
lines.append(txt)
tail = lines[-1] if lines else ""
# 末行若是「(X)」或「X、」开头的短标题 → 疑似孤行
if re.match(r'^[((]?[一二三四五六七八九十]', tail) and len(tail) < 22:
print(f"⚠️ 第{i+1}页末行疑似标题孤行: {tail}")
```
**判读**:末行是「(三)混淆举证期限……」这类编号小标题且很短 = 孤行;末行是正文中途自然断句 = 正常。结构性分页(「此致」「落款」前)也正常。
**修复**:给该标题段的 `w:pPr` **最前面**插入 `<w:pageBreakBefore/>`,把标题压到下一页与正文同页。不动任何文字,纯版式调整:
```python
pPr = target_para.find(W+"pPr")
if pPr.find(W+"pageBreakBefore") is None:
pPr.insert(0, etree.Element(W+"pageBreakBefore")) # 必须在 pPr 子元素最前
```
修完**重渲一次复跑上面检测,确认孤行清零且未制造新孤行**。⚠️ 用 OnlyOffice(x2t) 渲染核验,不信 LibreOffice 页数(同 docx 常差一页,本案 LO=7 页 / OO=8 页)。
## 四、克隆模板段插入新条款 + 自动编号续号(2026-06-22 实测)
向已有文书插入新条款/请求项时,**不手搓 pPr/rPr,而是 `copy.deepcopy` 一个同类型的既有段落**,只改文字——格式、缩进、字体、加粗全部继承,最稳。配合 Word 自动编号(`numPr/numId`),插入后**编号自动续号**,无需手写「(五)」「三、」:
```python
import copy
def clone(template_para, text):
np = copy.deepcopy(template_para)
runs = np.findall(W+"r"); first = runs[0]
for r in runs[1:]: np.remove(r) # 只留首 run
for t in first.findall(W+"t"): first.remove(t)
t = etree.SubElement(first, W+"t")
t.set("{http://www.w3.org/XML/1998/namespace}space", "preserve"); t.text = text
return np
# 克隆「请求项」模板 [08](挂 numId=10)插到其后 → 自动渲染为「三、」
req = clone(p08, "督促……依法予以释明。"); p08.addnext(req)
# 克隆「违法子条标题」模板 [23](挂 numId=13)→ 自动渲染为「(五)」
```
**实战要点**
- **空占位段**:v3 里「标题有、正文空」的段落(如 [22][24])就是预留正文位——`addprevious()` 把正文段插在它前面,再 `body.remove()` 删掉空段。
- **编号三级映射先摸清**:插入前用「第一节」三级映射确认每套 numId 渲染成什么(请求项 numId=10→「一二三」,子条 numId=13→「(一)(二)」),克隆对应模板才会续对号。
- **手敲硬编号要顺手修**:本案「事实与理由」下小标题用 numId=12 自动编到「二、」,但下一节「本申请符合受理条件」是**手敲的「四、」**(跳号笔误),插入后一并改回「三、」。自动编号段和手敲编号段混排时,手敲的那个最易跳号,交付前核一遍。
- **改完必查未接受修订残留**:编辑前先 `findall(w:ins)/findall(w:del)` 确认为 0(纯新增不留修订痕迹),编辑后再核一遍字号/字体全量无异常(唯一允许的「异常」是大标题 sz=30/小二,那是标题本就该大)。
## 五、PDF 渲染兜底(目检版面)
XML 巡检确认结构后,仍可生成渲染图供人目检:
```bash
libreoffice --headless --convert-to pdf --outdir /tmp "file.docx"
pdftoppm -png -r 110 /tmp/file.pdf /tmp/page # 生成 page-1.png, page-2.png ...
```
- LibreOffice 首次转换可能报 `failed to launch javaldx` 警告,不影响 PDF 生成。
- vision 工具若返回 `No LLM provider configured for task=vision`,是环境未配置,**不是文档问题**——改用本文上述 XML 解析法核验,并把 PNG 作为 MEDIA 发给指示人自行目检。
@@ -0,0 +1,49 @@
# 先息后本还款抵充——判决书常用表述
## 法律依据
- **民法典第561条**:先费用→利息→本金
- **民法典第560条**:多笔债务抵充顺序
## 判决书典型写法
### 利息计算表述
```
以本金XXX元为基数,自XXXX年X月X日起至XXXX年X月X日止,
按月利率1%计算,利息为XXX元(XXX元×1%×12÷365×N天)。
```
```
以本金XXX元为基数,自XXXX年X月X日起至XXXX年X月X日止,
按照全国银行间同业拆借中心公布的一年期贷款市场报价利率计算,
逾期违约金为XXX元(XXX元×3.6%÷365×N天)。
```
### 还款抵充表述
```
被告于XXXX年X月X日偿还XXX元,
按照先息后本原则,先冲抵截至该日的利息XXX元,
余款XXX元冲抵本金,冲抵后本金余额为XXX元。
```
```
本次还款XXX元不足以清偿全部应付利息XXX元,
依先息后本原则全额冲抵利息,尚余利息XXX元未获清偿。
```
### 多笔债务分摊表述
```
截至XXXX年X月X日,各项债务应付利息情况如下:
(1)XXX利息XXX元;(2)XXX利息XXX元;...
本次还款XXX元依先息后本原则,依次冲抵各项应付利息:
冲抵XXX利息XXX元、XXX利息XXX元后,
剩余XXX元冲抵XXX利息,该笔尚余利息XXX元未获清偿。
```
## 实务要点
1. "冲抵"而非"偿还"用于描述利息抵扣
2. 每个数字附计算过程(本金×利率÷365×天数=结果)
3. LPR利率称呼:借款用"利息",股权/分红等用"逾期违约金"
4. 最后一段注明"暂计至"日期 + "此后按XXX继续计算"
5. 天数计算:起止日期之差(不含起始日/含截止日,即尾算头不算)
@@ -0,0 +1,78 @@
# 利息公式重叠检测方法
## 问题描述
xlsx本息计算表中,同一列可能有多行利息公式。如果时间范围重叠,SUM汇总行会重复计算。
## 检测步骤
1. 逐列提取所有利息公式行的时间范围:
```python
# 伪代码
for col in interest_columns:
periods = []
for row in data_rows:
formula = ws.cell(row, col).value
if formula and is_interest_formula(formula):
start_date, end_date = parse_date_range(formula)
periods.append((row, start_date, end_date))
# 检查重叠
for i, (r1, s1, e1) in enumerate(periods):
for (r2, s2, e2) in periods[i+1:]:
if s2 < e1: # 后一个的起始在前一个结束之前
print(f"OVERLAP: Row {r1} ({s1}-{e1}) and Row {r2} ({s2}-{e2})")
```
2. 常见重叠模式:
- **累计vs累计**:D13=(A13-A9)..., D15=(A15-A9)... → D15包含D13的全部期间
- **期间+累计混合**:某行用期间公式(A13-A11),另一行用累计(A15-A9)
- **安全模式**:所有行用期间公式且首尾相连(如F列:F11从E3, F13从A11, F15从A13)
## 修复方法
### 方案A:删除中间行,保留最后的累计公式
- 删除D13(中间累计行),D15覆盖全段
- 适用于:中间行无扣减动作依赖该数字
- 优点:简洁,公式少
- 缺点:中间节点的利息数字消失,docx中不能引用
### 方案B:全部改为期间公式(推荐)
- D13=(A13-A9)*rate*principal → 保留(2023-7-5到2025-1-23)
- D15=(A15-**A13**)*rate*principal → 只算后半段(2025-1-23到2025-8-27)
- 适用于:所有行都应保留(如docx需要引用中间节点的利息数字)
- 优点:每个时间节点都有独立数字,SUM正确
### 选择依据
- 如果docx正文中需要引用中间节点(如"截至2025年1月23日的利息为X元"),用方案B
- 如果docx正文跳过中间节点直接算到暂计日,用方案A
## 2026-06-09 梁永案实例
### 原始问题
```
D9 = (A9-C3)*1%*12/365*C4 → 2019-1-13 到 2023-7-5 (1634天) ✓
D10 = -2,000,000 → 2023-7-5 还款
D13 = 933,698.63 (hardcoded) → 2023-7-5 到 2025-1-23 (568天)
D15 = (A15-A9)*1%*12/365*C4 → 2023-7-5 到 2025-8-27 (784天) ← 包含D13!
```
D16=SUM(D4:D15) → D13和D15重叠568天,导致933,698.63元被重复计算。
### 修复(Doro采用方案A)
删除D13,D15覆盖全段:D16 = D9(-2M) + D15 = 686,027.40 + 1,288,767.12 = 1,974,794.52 ✓
### 对比:F列(无重叠,已是期间模式)
```
F11 = (A11-E3)... → 2019-10-15 到 2024-4-7
F12 = -1,000,000
F13 = (A13-A11)... → 2024-4-7 到 2025-1-23 ← 从A11开始,不从E3
F15 = (A15-A13)... → 2025-1-23 到 2025-8-27 ← 从A13开始
```
三段首尾相连,无重叠 ✓
## docx联动注意
xlsx改了利息计算结构后,docx中利息累计的表述必须与xlsx结构一致:
- xlsx用方案A(删中间行+全段累计)→ docx直接写"自X日起至Y日止利息Z元"
- xlsx用方案B(期间公式)→ docx可分段写每期利息再合计
⚠️ **表达清晰性**:如果某个数字已经是净额(如686,027.40 = 2,686,027.40 - 2,000,000),不要在同一句中同时出现被减数和减数,否则读者无法验证算术。详见 SKILL.md "表达清晰性要求"。
@@ -0,0 +1,75 @@
# 管辖权异议申请书 起草与审核(涉外/跨域被告)
实测来源:2026-06-16 上海喆航 VS 艾达(上海)/ AMOS(新加坡)买卖合同纠纷。原告以"AMOS 系艾达唯一股东"为由,依公司法第23条第3款主张连带责任,将境外股东与中国子公司一并诉至浦东。被告二 AMOS 提管辖异议。ShaSha 多轮纠正后确立以下要点。
## 一、核心 doctrine(被 ShaSha 纠正确立)
### 1. 管辖审查是法院依职权审查,不适用"谁主张谁举证"
- 法律依据:《民事诉讼法》(2023修正)第一百三十条"人民法院对当事人提出的异议,**应当审查**"。
- 连接点是否成立,是**法院依职权认定的客观事实**,不是实体争议里的举证责任分配。
- ❌ 不能写"原告应就股权的存在、所在地及关联承担**举证责任**"——法院一句"管辖依职权审查、不适用举证责任分配"即可驳回,反而拉低专业度。
- ❌ 异议方(被告)也**不负**证明"境内无财产"的举证责任,只需否认对方主张的连接点。
### 2. "可供扣押财产所在地"≠"诉讼标的物所在地"——两个并列、独立的连接点
- 第276条把二者**并列**列举,文本结构本身就证明:可供扣押财产恰恰是**诉讼标的物以外**的财产。
- 制度功能:被告境内无住所,但只要有**任何**可供执行财产,财产所在地法院即可管辖(为将来执行)。**从不要求该财产是诉讼指向的对象**。
- ❌ 致命法理错误:写"本案系金钱给付之诉、并非针对持有财产主张权利、故不适用可供扣押财产"——这是把"可供扣押财产"误解成"诉讼标的物",法官一眼看破,**会被秒驳**,留着反而自曝。
### 3. 股权作为"可供扣押财产",所在地随目标公司登记地认定
- 股权属于可供扣押财产;其"所在地"在**执行实务**中通常认定为**目标公司登记地**(股权冻结通过公司登记机关办理)。
- ⚠️ 这是**执行/保全实务的通常认定,非法条明文**——**不写进书面**,仅作策略判断依据。
- 推论:境外股东持有中国公司 100% 股权,若该公司登记在受诉法院辖区,则"可供扣押财产所在地"**客观成立**,受诉法院据此对境外股东有管辖权。这是硬风险。
## 二、战略原则
### 4. 不要逐一列举六连接点再逐个击破——当其中一个是己方最弱点时
- 合同签订地/履行地/诉讼标的物/侵权行为地/代表机构住所地这五项往往无人主张(打稻草人);唯一有杀伤力的是"可供扣押财产"。
- 把六连接点列成清单逐项驳,等于一趟"导览"——五句铺垫,终点正好停在己方最弱、对方最强的那一格上,**亲手替法院和对方画出通往管辖权的路线图**。
- ✅ 更稳:**删掉连接点列举**,把"**不能合并管辖**"(不同法律关系应分别审查管辖)提为主攻,直接打中原告"拉境外股东进辖区"的真实意图。
### 5. 删除连接点论述 ≠ 风险消失(必须如实向当事人提示)
- 管辖权法院依职权审查(第130条),即便只字不提,法院/对方仍可能**自行发现**该连接点。
- 删除的价值是"**不主动递刀、不自曝败点**",把法院注意力引向己方强项——**不是消灭风险**。
- 风险扎根在**事实层面**(境外股东持有中国公司股权),不在措辞里。若目标公司确在受诉法院辖区,这份异议在"无连接点"这条路上是**逆风**的,真正指望落在"不能合并管辖"+"不方便法院"。
- ⚠️ 必须诚实告知当事人这一点,不能让其误判"删了就过去了"。
### 6. "不能合并管辖"论点的法律依据要标清
- 依据 = **民法典第465条合同相对性** + **学理/最高法裁判倾向**(普通共同诉讼应分别审查各独立之诉管辖权;参最高法"太原吉业"案、"李沈生"案,中国法学网马超雄/康临芳文)。
- **并非某一条直接法条**——被问"法律依据"时如实说明是合同相对性+裁判倾向的组合,不要假装有一条直接法条。
## 三、程序陷阱
### 7. 应诉管辖陷阱(涉外/跨域被告)
- 涉外被告若**先提交实体答辩**,可能构成**应诉管辖**(第278条涉外应诉管辖 / 第130条第2款)而**丧失管辖异议权**。
- 管辖异议必须在**答辩期内、提交实体答辩之前**提出。审核此类文书时,若发现被告身份特殊(境外/跨域),主动提示是否已评估管辖异议与实体答辩的先后顺序。
### 8. 条文号必须查2023修正版原文
- 管辖异议提出依据=第130条("应当审查");涉外特殊地域管辖=第276条;不方便法院=第282条;涉外应诉管辖=第278条。
- 2023修正(2024.1.1生效)因涉外编扩容,条文号整体后移,**必须查原文核验**,不能凭记忆或旧版文章。
## 四、典型三层结构(删连接点列举后的成稿骨架)
- **(一)合同相对性**:境外股东非买卖合同当事人,合同连接点不及于它(民法典465条,地基)。
- **(二)不能合并管辖**:对股东的责任之诉 ≠ 买卖合同纠纷,分属不同法律关系,不得仅因其系共同被告即合并管辖,否则纵容原告"追加境外股东规避法定管辖"(**主攻**)。
- **(三)不方便法院原则**(第282条五要件,兜底)。
## 五、"可供扣押财产"的限缩论点与权威依据(2026-06-16 补充)
⚠️ 前提:在中国大陆,第276条"可供扣押财产所在地"连接点**正面否认极难成功**——下列限缩论点是"逆风加固",不是翻盘王牌。若目标公司确在受诉法院辖区,主战场仍是"不能合并管辖"+"不方便法院"。
### 1. 权威依据:财产所在地管辖=国际公认的"过度管辖"
- **来源**:蓝海法律查明和商事调解中心《财产所在地的涉外管辖——2019年中国当事人在韩国诉讼的一个案例》(苏晓凌,2020.07.25),评述韩国大法院 **2016다33752** 判决(2019.6.13)。URL: bcisz.org/html/yuwaifalvchaming/1165.html
- **核心警示(可引为学理观点,但须注明系评述/学理而非中国法明文)**:
> "仅以可供扣押财产为管辖根据,通常在国际上被认为属于**过度管辖**……如在中国境内扣押财产不足以偿债,在其他国家申请承认和执行时,承认国法院可能因不认可基于财产所在地的管辖而**拒绝承认我国法院判决**。"
- **战略用法**:当委托方是境外被告、且原告可能拿到的中国判决将来需到境外(如新加坡)执行时,可补强"不方便法院"——强调即便中国法院管辖,判决也面临境外不被承认的风险,由境外法院审理对各方更经济、更具实效性。
### 2. 实质性联系/偶然财产限缩(域外比较法,仅作学理参考)
- 韩国大法院规则:财产若"**只是偶然位于法院地**"、且"原告诉请与该财产**没有联系**",则不能单凭财产所在地认定管辖,须综合"财产在法院地的原委、价值、权利救济必要性、判决实效性"等多因素判断。
- ⚠️ **中国实务相反**:因第276条措辞明确且无关联性要件,中国法院"一般**不分析**可供扣押财产与讼争事实的关联性",只要境内有可供扣押财产即认定管辖。典型:北京(2018)京民终519号、上海(2019)沪民辖98号——均未分析关联性即认定管辖。**所以"财产与诉请无关"这条限缩论点在中国大陆说服力弱**,引用时须诚实定位为"国际趋势/学理",不可冒充中国现行裁判规则。
### 3. "可供扣押财产"的范围抗辩:债权不算
- **南京鼓楼区法院(2013)鼓民初字第1143号**:原告主张的"可扣押财产"是被告对原告享有的**债权**,法院认定"**债权不属于可供扣押的财产**",驳回起诉。
- 学理(苏晓凌):"扣押"本质是属地执行措施,债权"不具有属地性,不能成为管辖的根据";以"可供执行的财产"表述更贴切。
- **用法**:若原告主张的境内财产是债权/应收款一类无体且无属地性的权利,可援此抗辩其"不属于可供扣押财产"。但**股权不同**——股权可冻结、所在地随公司登记地认定(见一·3),不能套用债权抗辩。
### 4. 引用纪律
- 这些是**评述/域外判例/个别中国裁定**,不是司法解释或主流裁判规则。书面引用时:①注明确切来源(案号/文章/法院);②如实标注"国际趋势""学理观点""个案裁定"的层级,不拔高为中国通行规则;③能不写进异议书正文就不写(同一·3的"不递刀"原则),主要价值在内部策略研判和"不方便法院"的实效性论证。
@@ -0,0 +1,53 @@
# 合同解除条件模糊条款分析方法
## 适用场景
租赁合同约定的解除条件用语模糊(如"欠交租金二个月"),需要分析在不同解释下是否满足解除条件。
## 分析框架(2026-06-15 万禹案13.1条实测)
### 一、识别条款模糊性
"欠交租金二个月"至少有两种理解:
1. **累计金额说**:累计欠付金额达到二个月租金
2. **连续期间说**:连续二个月未付任何租金
需分别按两种解释分析,并针对每种准备抗辩。
### 二、累计金额说的分析
**制作逐月统计表**(见 rental-monthly-rent-table.md),核心看:
- 累计欠付何时首次突破门槛(如2个月租金)
- 突破后是否被后续付款补正(回落至门槛以下)
- 权利人是否在突破期间行使了解除权
- 发出解约函时累计欠付实际金额
**抗辩方向**
- 解除权产生后未及时行使 → 在对方继续履行后解除权消灭
- 权利人继续接受租金 → 以行为放弃解除权(默示放弃)
- 发出解约函时解除条件已不满足 → 不具备行使解除权的事实基础
- 法律依据:合同法/民法典关于解除权行使期限的规定
### 三、连续期间说的分析
**制作付款间隔表**,核心看:
- 最长付款间隔是多少天
- 是否存在连续2个月(约61天)以上的零付款期
- 零付款期的原因是什么
**抗辩方向(重点——停付的正当理由)**
- 先履行抗辩权(民法典第525/526条):出租人在先违约(如面积瑕疵、信息隐瞒),承租人有权暂停付租
- 租赁物无法使用(民法典第729条):物业封楼等导致无法使用,有权请求减少租金
- 按瑕疵减价后的实际欠付金额:即便存在零付款期,实际欠付是否微不足道(如仅几万元 vs 月租十几万),说明承租人非恶意拖欠
### 四、综合论证要点
两种解释的共同要害:
- 出租人自身是否存在在先违约(面积瑕疵、缔约过失、信息隐瞒等)
- 承租人的止付行为是否有法律依据(先履行抗辩权)
- 考虑减免/扣减后的实际欠付金额与门槛的关系
### 五、特别注意
- 合同13.1条中"欠交一个月"需"书面通知后5日"的催告前置程序,但"欠交二个月"写的是"无须催告"——两个条件的程序要求不同,不要混淆
- 即便条款写"无须催告",仍需查看是否有通知义务的法律强制规定
- "视作乙方自动解除本合同"这种表述在法律上是约定解除权,不是自动解除——仍需权利人积极行使(发出解除通知)
@@ -0,0 +1,80 @@
# 用同案件已有 docx 作母版生成"全新文书"——页眉/边框继承陷阱
## 场景
同一案件已有一份成稿文书(如检察监督申请书 v9),需要再做一份**不同类型**的全新文书(如给法院的《情况反映》)。为保证字体、字号、行距、页边距、样式与申请书**同源**,最稳的做法是:把申请书 docx 当母版,克隆它的段落模板(标题段/正文段/落款段/附件段的 pPr+rPr),清空 body 后用模板段重建全文。
> ⚠️ 这套手法适用于**任何"用 A 文书作母版生成 B 文书"**,不限于《情况反映》。2026-06-25 郭同学案再次踩中:用万禹案**再审申请书**作母版生成**答辩状**,header2.xml 原样继承了"申 请 人:上海万禹实业… / 再审申请书 / 生效判决案号:(2025)沪01民终15828号"——OnlyOffice 渲染第 1 页页眉赫然是别案的当事人和案号。清空页眉法(见下)验证有效:删 header2.xml 所有 run、重新打包后页眉纯净。**判别哪个 header 文件有文字**:遍历 `word/header*.xml`,读各自 `w:t` 拼出文字,非空的那个才是要清的(母版常有 header1/2/3 三个,只有一个带内容)。
这套"克隆段落模板 + 替换 body"的手法对**正文**是对的、省心,但有一个隐蔽的坑:
## 坑:header/footer 和 pBdr 横线会原样继承,且常常张冠李戴
- 替换 `word/document.xml` 的 body 只动了正文。**`word/header1.xml``word/footer1.xml` 原封不动**被继承。
- 实测(2026-06-23 邹家案):申请书 v9 的 header1.xml 写的是"**申请人(被告)… / 申请监督民事诉讼案号:… / 受理法院:…**"——这是**检察监督申请书的页眉**。套到《情况反映》(受文机关是法院本身)上,称谓完全错配("申请监督""受理法院"对法院内部监督渠道不成立)。
- 更隐蔽的是**页眉横线**:清掉页眉文字后,OnlyOffice 渲染里页面顶端仍残留一条贯穿左右的黑线。它不是文字,是页眉段落 `pPr` 里的**段落下边框 `<w:pBdr>`**(页眉样式自带)。只删 run 文字删不掉它。
## 交付前必查(母版法专用三查)
凡是"用 A 文书作母版生成 B 文书",OnlyOffice 渲染后**必须逐页看页眉页脚**,确认:
1. 页眉文字是否属于 B 文书的类型(不是 A 残留的称谓/案号格式);
2. 页眉/页脚有无 A 残留的横线、单位名、修订标识;
3. 落款受文机关、抬头与 B 的收件对象一致。
vision 看第 1 页时,把"页眉区域内容"作为独立一项问出来——它最容易被正文的整洁掩盖过去。
## 修法(清空页眉 + 去横线)
默认推荐**清空页眉**(内部反映材料正文已含案号当事人,页眉非必需,留空最干净不会错配)。纯 zipfile+lxml:
```python
import zipfile, io
from lxml import etree
W='http://schemas.openxmlformats.org/wordprocessingml/2006/main'
def w(t): return f'{{{W}}}{t}'
zin = zipfile.ZipFile(src)
h = etree.fromstring(zin.read('word/header1.xml'))
# 1) 清空页眉所有 run 文字(保留空段结构,别删整段——破坏 schema)
for p in list(h.iter(w('p'))):
for r in list(p.findall(w('r'))):
p.remove(r)
# 2) 删 pBdr(横线的真正来源)——只删文字删不掉这条线
for ppr in h.iter(w('pPr')):
pBdr = ppr.find(w('pBdr'))
if pBdr is not None:
ppr.remove(pBdr)
# 3) 去掉 pStyle 引用(页眉样式常自带下边框,连根拔)
for ppr in h.iter(w('pPr')):
ps = ppr.find(w('pStyle'))
if ps is not None:
ppr.remove(ps)
new_h = etree.tostring(h, xml_declaration=True, encoding='UTF-8', standalone=True)
buf = io.BytesIO()
with zipfile.ZipFile(buf, 'w', zipfile.ZIP_DEFLATED) as zo:
for n in zin.namelist():
d = zin.read(n)
if n == 'word/header1.xml': d = new_h
zo.writestr(n, d)
open(src, 'wb').write(buf.getvalue())
```
若要**保留页眉但改成中性表述**(方案 B),把 run 文字替换成"案号:(…)… / 反映人:…"这类不带"申请监督""受理法院"的中性字段即可——但默认先问用户走 A 还是 B,别擅自保留错配页眉。
## 关掉修订模式(全新文书非修订态)
母版若是修订态(settings.xml 带 `<w:trackRevisions/>`),生成全新文书时要去掉它——新文书是全新成稿不是改稿,不该带修订痕迹:
```python
if n == 'word/settings.xml':
s = etree.fromstring(d)
tr = s.find(w('trackRevisions'))
if tr is not None: s.remove(tr)
d = etree.tostring(s, xml_declaration=True, encoding='UTF-8', standalone=True)
```
## 段落模板克隆要点(正文部分,已验证可用)
- 从母版抽各类型段落各一个作模板:标题(居中 bold sz30)、正文(首行缩进 fl480 sz24)、受文机关(顶格 bold sz24)、落款(右对齐 sz24)、附件标题(顶格 bold sz24)、附件项(fl480 sz24)。
- `mk()` 构造段落时:深拷贝模板段 → 删掉模板里的旧 run/ins/del → 删 numPr(避免继承自动编号)→ 强制字体(eastAsia=仿宋、ascii/hAnsi=Times New Roman)→ 按需 set/unset bold → 塞入新文字 run(`t.set('{http://www.w3.org/XML/1998/namespace}space','preserve')`)。
- 顶格段(受文机关、"丽水市…法院:")用 `no_indent=True` 删掉 ind,否则继承首行缩进会缩进两格。
- body 清空后把新段 `insert``sectPr` 之前(sectPr 必须保留在 body 末尾,决定页面尺寸/页边距)。
- 字体属性交付前用 zipfile 逐 run 统计核验:CJK 全仿宋、LATIN 全 Times New Roman,0 回退。
@@ -0,0 +1,180 @@
# 面积争议租金重算分析框架
## 适用场景
不动产租赁纠纷中,合同约定面积与出租方有权出租面积不符(如转租方超面积计租)。
## 计算要素
### Sheet 1:一审判决认定的租金事实
从判决书中逐项提取法院认定的租金相关事实,每项需标注判决书页码:
| 序号 | 认定事项 | 法院认定内容 | 判决书位置 |
|------|---------|------------|-----------|
| 1 | 合同面积 | 1500㎡ | 第X页 |
| 2 | 月租金 | 118,625元 | 第X页 |
| 3 | 免租期 | 2021.6.1-9.15 | 第X页 |
| ... | ... | ... | ... |
### Sheet 2:按实际面积天数重算
#### 基础参数
- **合同面积** vs **有权面积**(如1500㎡ vs 1243㎡)
- **单价**(如2.6元/㎡/天)
- **合同期间**起止日
- **免租期**起止日
- **疫情减免**金额和期间
#### 分月计算表
按月逐行计算,列包括:
- 月份
- 应付天数(大月31/小月30/2月28-29)
- 月租金 = 有权面积 × 单价 × 当月天数
- 实际应付(扣除免租期、疫情减免的月份标0或减免金额)
- 已付金额(从判决书/凭证中提取)
- 累计差额
#### 关键结论
- 按实际面积应付总额
- 已付总额
- 欠付金额 = 应付 - 已付
- **是否满足合同解除条件**(如"拖欠2个月以上"的门槛金额 = 2 × 月租金按实际面积计算)
## 多数据源交叉比对(Sheet 3-5)
### 何时需要交叉比对
- 案件经历了一审→二审,需要梳理判决间的差异
- 对方当事人提交了情况说明或计算明细
- 再审准备:需要系统性发现一审/二审的事实认定错误
### 比对维度(5个Sheet)
**Sheet 3:交叉比对总表**
按五个维度组织,每个维度一个区块:
| 维度 | 比对列 | 重点 |
|------|--------|------|
| 一、基础数据比对 | 原告主张 / 一审认定 / 二审认定 / 重算 / 差异说明 | 面积、月/日租金、免租期、解除日、疫情减免、违约金标准等12+项 |
| 二、租金应付金额比对 | 天数 / 原告(1500㎡) / 重算(1243㎡) / 差额 / 说明 | 按期间分段,标注月计vs日计的细微差额 |
| 三、已付租金比对 | 数据来源 / 已付金额 / 说明 / 差异 | 对比各方陈述的已付金额,发现重复计算等错误 |
| 四、欠付金额核心比对 | 原告/一审/二审/重算/再审意义 | 逐项对比欠付金额及法律后果 |
| 五、合同解除条件论证 | 1500㎡计算 / 1243㎡计算 / 结论 | 是否超2个月门槛,结论是否相反 |
**Sheet 4:原告诉请vs判决对比**
- 本诉逐项:原告主张金额 → 一审 → 二审 → 按实际面积应为 → 差异分析
- 反诉逐项:万禹主张金额 → 一审 → 二审 → 按实际面积应为 → 差异分析
- 判决金额汇总:万禹净支出合计(各来源口径)
- 重点标注"不应支持"(本诉在面积纠正后不成立的项)和"应支持/应提高"(反诉在面积纠正后应支持的项)
**Sheet 5:二审纠正与未审查问题**
- 区域一:二审已纠正的一审错误(如已付租金重复计算)
- 区域二:一审/二审均未审查的核心问题(再审争点)
- 每项包含:未审查问题 / 法院回避方式 / 实际情况 / 再审论证方向
### 交叉比对制表要点
1. **数据源标注**:每个数字都要标明出处(判决书页码、情况说明、银行回单等),确保可追溯
2. **差异高亮**:用黄底+红字标注关键差异和错误认定,绿底标注万禹有利结论
3. **算术验证**:比对月计算(月租金×月数)和日计算(日租金×天数)是否一致,标注差额(通常有千元级差异)
4. **二审纠正追踪**:明确标出二审改判了哪些项,哪些维持——二审已纠正的不再是再审争点,二审维持的才是
5. **合同解除条件的"结论翻转"**:是面积争议案件的核心——重算后欠付是否仍超2个月门槛,如果结论从"可解除"变为"不可解除",所有后续判项(违约金、免租期租金、装修补偿比例)都应翻转
### 已付租金比对的典型陷阱
- **补充协议40万的双重计算**:一审可能在"2022.6前欠缴30万"和"2022.7后已付230万"中都包含了补充协议的40万,导致重复计算30万
- **保证金是否计入已付**:被告答辩的"已付2,939,020"含保证金118,625,但租金计算时保证金单独抵扣免租期,不能计入已付租金
- **原告情况说明的增补项**:原告可能在情况说明中增加原先未计入的付款记录(如因账户注销导致计时间点不同),核对时注意金额是否与银行回单一致
- **按月计vs按日计的差额**:月租金×月数 vs 日租金×天数 通常有千元级差额(因非整月),交叉比对时要标注此差异但不应放大
## 无权处分论证逻辑
转租方合同面积 > 上手合同面积的差额:
1. 差额面积无租赁权基础 → 转租属无权处分
2. 承租人按差额面积支付的租金 = 转租方不当得利
3. 法律依据:民法典311条(无权处分)、985条(不当得利)
## 缔约过失论证
出租方未告知实际面积(以"商业秘密"为由拒绝披露上手合同):
- 民法典500条:缔约过失/隐瞒重要事实
- 商品房销售管理办法第18条类比(虽非直接适用于租赁)
## 终审判决逐项拆解方法
再审准备的前提是精确理解终审判决每一项的计算方式。拆解流程:
### 步骤一:列出判决主文所有给付项
从判决书末尾提取,区分维持项和变更项。例:
- 第一项(维持):确认合同解除
- 第二项(★变更):租金差额 → 金额变化
- 第三项(★变更):违约金 → 基数调整
- 第四项(维持):水电费
- 第五项(维持):免租期租金差额
- 第六项(维持):装修补偿
### 步骤二:逆向推算每项金额
从"本院认为"段落提取计算公式并独立验证:
**月计算法**(法院常用):
- 整月数×月租金 + 零头天数÷当月天数×月租金
- 例:21个月×118,625 + 12天÷31天×118,625 = 2,537,044.35
**日计算法**(重算时用):
- 计租天数×日租金
- 例:651天×3,231.80 = 2,103,901.80
两种方法因非整月存在千元级差额,标注但不放大。
### 步骤三:汇总万禹净负担
| 类别 | 项目 | 金额 |
|------|------|------|
| 应付 | 租金差额 | |
| 应付 | 违约金(已发生) | |
| 应付 | 水电费 | |
| 应付 | 免租期租金差额 | |
| 应收 | 装修补偿 | |
| 费用 | 诉讼费(承担部分) | |
| 持续 | 后续违约金(日增X元) | |
### 步骤四:酌情项倒推比例
法院"酌情"的项目(免租期租金、装修补偿),倒推其比例以理解法院的量化逻辑:
- 免租期租金酌情比例 ≈ 剩余租期÷总租期(如1906天÷2922天≈65%)
- 装修补偿酌情比例 ≈ 补偿额÷残值(如55万÷263万≈21%)
此比例在再审中可用于论证:如果面积纠正后万禹非违约方,这些酌情项的前提("万禹违约导致合同提前解除")不成立,应翻转。
## 当事人矛盾点系统分析
结合判决书和庭审笔录,从四个维度穷举矛盾:
### 维度一:原告自身矛盾
检查原告在起诉状、答辩状、情况说明、上诉状中的前后陈述差异。典型模式:
- 金额数字反复变化(如已付金额、欠缴金额)
- 事实陈述出尔反尔(如"没有残值"→鉴定出263万残值)
- 对关联公司关系的否认与书面协议的矛盾
- 面积构成的自圆其说(承认只承租1243㎡,但声称1500㎡包含电梯间和公摊——无测量证据)
### 维度二:被告自身矛盾
同样检查被告各阶段陈述:
- 已付金额前后不一(如2,939,020→2,474,500)
- 一审确认后二审翻供(如水电费、合同解除日期)
- 面积知情时间主张缺乏证据("一直口头提过"无书面记录)
### 维度三:双方之间核心矛盾
制表对照,明确证据指向哪方。特别注意:
- 一方以"商业秘密"为由拒绝披露的信息,恰恰是争议核心
- 法院采信某方陈述时是否审查了该陈述的证据支撑
### 维度四:两审判决矛盾
- 二审已纠正的错误→证明一审事实认定不可靠
- 两审共同回避的问题→识别为再审核心争点
- 法院的推定逻辑是否合理(如"装修时已知面积"——装修合同恰恰按1500㎡签订,说明被告相信合同面积)
## 参考判例引用规范
无公开案号的判例引用格式:
```
据《XX日报》XXXX年X月X日报道,XX区法院审理了类似案件,
二房东将公摊面积计入转租面积被认定为无权处分,二审维持。
(注:该案裁判文书未上网公开,无法获取案号。)
```
⚠️ 不能假装有案号。没找到就注明来源是新闻报道,让法官自行判断证据效力。
@@ -0,0 +1,104 @@
# 租金逐月统计表制作方法(应付-已付-累计欠付)
## 适用场景
租赁纠纷中需要证明承租人在合同解除前是否/何时达到约定解除条件(如"欠交租金二个月")。
## 关键方法论
### 铁律1:计算口径必须与再审申请书完全一致 + Doro最终计租规则(2026-06-15 万禹案教训)
**Doro最终确认的计租规则(2026-06-15,优先级最高)**:"按月租金固定算,不足月的才按天算"
- **整月**:用合同约定的固定月租(如118,625元),不管该月28/29/30/31天,都收固定月租
- **不足月(首月/末月)**:才用日租金×天数(如首月9/16-9/30=15天×3,900;末月3/1-3/12=12天×3,900)
- 这是合同约定的计租方式,符合\"月租金\"的法律含义。**不要为了对齐申请书的按日总数而把所有月份都改成按日**——那是中间错误版本,被Doro否定
**与申请书核对——方法可不同但关键数字必须锚定同一来源**
- 申请书可能用纯按日(1500×2.6×908=3,541,200)作总额验算,统计表用\"整月固定+首尾按天\",两者总应付会有约3,557元的方法性差异(整月118,625≈30.42天 vs 实际天数)——这个差异是计租方法不同造成的,可以接受,在表底\"交叉验证区\"如实标注差异和原因即可
- **但已付租金、减免金额、瑕疵减价单价、解除门槛这些关键数字必须与申请书/判决书完全一致**,不能算出两个值
- **两份文件同一个数字不能算出不同结果**——这是Doro质疑的直接原因
**踩坑顺序(2026-06-15,三次返工)**
1. 第一版用整月118,625逐月累加 → 漏掉\"补充协议减免\"列,欠付暴涨到226,281(见铁律4)
2. 补回减免列后欠付75,032.70,与申请书71,475.90差3,556.80 → 追查发现是计租方法差异(整月vs按日 + 末月天数)
3. 改成全部按日(3,900×天数)、末月11天 → 欠付71,475.90完全对齐申请书,但Doro指出\"按月租金固定算,不足月的才按天算\",又改回整月固定+首尾按天
- **末月天数**:解除日当天是否计入要与申请书一致(申请书908天不含解除日当天,则末月用11天而非12天;用Python `(end-start).days` 验证)
**核对步骤**
1. 找到申请书中的总应付公式(如"1,500㎡×2.6元/日×908日=3,541,200元")
2. 确认总天数(起始日到解除日是否含末日,用Python `(end-start).days` 验证)
3. 确认减免总额公式(如"388,498.50元"是哪几项之和)
4. 确认瑕疵减价公式(如"257×2.6×908=606,725.60")
5. 统计表合计行的每个数字都必须能还原到申请书公式
### 铁律2:减免金额用判决书/申请书确认的数字
- ✅ 判决书确认"疫情减免2022年4月和5月共237,250元" → 直接用
- ✅ 申请书写"388,498.50元(含补充协议减免151,248.50元+疫情减免237,250元)" → 直接用
- ❌ 自己重新计算减免金额(会因计租方法差异产生偏差)
- 原则:凡申请书/判决书有确认数字的,用它的数字
### 铁律3:已付租金按实际付款日期归入对应月份
- 不要平摊到多个月——一笔付款就在付款当月全额记入
- 付款记录必须交叉核对多个数据源(银行回单 > 当事人明细 > 判决书认定)
### 铁律4:重做表格时必须逐列对照旧版(2026-06-15 教训)
**重做/更新统计表时,MUST逐列对照旧版检查,不能凭记忆重建**。漏掉一列就可能导致15万元级别的计算错误。
- 2026-06-15教训:重做统计表时漏掉了"补充协议减免"列(¥151,248.50),导致累计欠付从75,032.70暴涨到226,281.20。Doro发现后问"为什么和申请书的71,475.90差距那么大"
- 原因:旧表有10列(含补充协议减免),新表只建了9列
- 修正方法:读取旧表headers → 逐列确认新表是否覆盖 → diff列出新旧差异
### 铁律5:Excel保留计算公式,不填静态数字
- 应付租金 = `=B{row}*C{row}`(天数×日租金)
- 瑕疵减价 = `=257*2.6*B{row}`
- 当月欠付 = `=D{row}-E{row}-G{row}-H{row}-I{row}`
- 累计欠付 = `=K{row-1}+J{row}`
- 是否达到 = `=IF(K{row}>=237250,"是","否")`
- 合计行 = `=SUM()`
- 新增"交叉验证"区:申请书公式 vs 统计表公式 vs 差异,方便核对人一眼看出是否一致
## 表格列结构
| 期间 | 天数 | 日租金 | 合同应付租金 | 已付租金 | 支付凭证来源 | 疫情减免 | 补充协议减免 | 瑕疵减价(257㎡×2.6×天) | 当月欠付(净额) | 累计欠付 | 是否达到解除门槛 |
### 各列说明
- **天数**:当月计租天数(注意首月和末月按实际天数,末月是否含解除日当天需与申请书一致)
- **日租金**:固定值(如3,900元),作为公式引用基础
- **合同应付租金**:= 天数 × 日租金(公式)
- **已付租金**:当月实际到账金额,附凭证来源
- **支付凭证来源**:银行编号/页码,便于核查
- **疫情减免**:法院认定的固定金额,按减免月份填入
- **补充协议减免**:协议确认的债务减免差额,在对应月份一次性填入(**不可遗漏!**)
- **瑕疵减价**:= 257 × 2.6 × 天数(公式)
- **当月欠付** = 应付 - 已付 - 疫情减免 - 补协减免 - 瑕疵减价(公式)
- **累计欠付** = 上月累计 + 当月欠付(公式,可为负)
- **是否达到门槛** = IF(累计欠付 ≥ 门槛, "是", "否")(公式)
## 交叉验证区(统计表底部必备)
在合计行下方新增验证区:
| 项目 | 申请书数值 | 统计表公式 | 差异 |
|------|-----------|-----------|------|
| 应付总租金 | =1500*2.6*908 | =SUM(应付列) | =申请书-统计表 |
| 疫情减免 | 388498.50 | =SUM(减免列) | ... |
| 瑕疵减价 | =257*2.6*908 | =SUM(瑕疵列) | ... |
| 实际应付 | =应付-减免-瑕疵 | =应付-减免-瑕疵 | ... |
| 已付 | 2474500 | =SUM(已付列) | ... |
| 欠付 | 71475.90 | =实际应付-已付 | ... |
**差异列全部为0才算通过。**
## 支付凭证OCR交叉校验方法(2026-06-15实测)
当支付凭证为扫描件PDF时:
1. **双OCR引擎交叉验证**:tesseract(快速但质量一般)+ DeepSeek-OCR(质量高但API不稳定)。CamScanner扫描件先用pymupdf转200dpi PNG再逐页OCR,DeepSeek API易Connection reset,要retry+background运行
2. **去重关键**:同一交易可能以付款详情和回单两种格式出现在不同页面,用银行编号(FT号)去重
3. **金额相同≠重复交易**:两笔金额相同但银行编号(FT号)或回单编号不同 = 两笔独立交易,不能去重(2026-06-15教训:P10有两笔8,176水电费、P6+P10各有一笔11,440水电费,FT号和回单编号都不同,是独立交易,差点漏记19,616元)。去重只认银行编号/回单编号,不认金额
4. **金额验证**:大写金额与小写金额不一致时以小写为准(OCR对大写汉字识别率较低;2026-06-15实测DeepSeek把壹万壹仟肆佰肆拾误读成壹万捌仟肆佰肆拾,而回单小写11,440正确)
5. **总额验证(最强校验手段)**:某收款方总额减去非相关项(住宿费、物业管理费、用途不详等)后应等于二审认定的已付租金。本案首乌丽亚收款2,749,350 - 十楼房租150,254 - 物业管理费120,000 - 住宿费2,606 - 用途不详1,990 = 2,474,500,与二审认定分毫不差,反向确认了OCR分类正确
## Excel格式规范
- 标题行:深蓝底白字
- 达到门槛的月份:红字高亮
- 数字格式:#,##0.00
- 合计行:粗体+浅绿底色
- 交叉验证区:独立于合计行下方
@@ -0,0 +1,73 @@
# 再审申请书复核清单
## 法律依据核查
- [ ] 民事诉讼法条文号是否准确(第210条、第211条及具体项)
- [ ] 引用的实体法条文是否现行有效
- [ ] 参考判例案号是否完整(法院+年份+案号类型+编号)
- [ ] 判例裁判要旨是否准确概括(不得歪曲或过度概括)
- [ ] 无案号判例是否标注替代来源(新闻报道+发布日期+媒体名称)
## 事实主张核查
- [ ] 每一条事实主张是否有原审证据支撑
- [ ] 引用的合同条款号是否正确
- [ ] 引用的庭审陈述是否与笔录原文一致(OCR文本必须与扫描件原图核对)
- [ ] 引用的金额、面积、日期等数字是否准确
- [ ] 计算过程是否可验证(公式+数字+结果)
- [ ] 按实际面积重算的数据是否有独立Excel佐证
## 逻辑一致性核查
- [ ] 多处引用同一事实时表述是否一致
- [ ] 不同论点之间是否存在逻辑矛盾
- [ ] 因果关系是否严密(A→B→C,不跳步)
- [ ] 量词使用是否精确("均""全部""部分"等)
- [ ] 己方数据是否有利——如重算结果反而不利,需要重新评估论证策略
## 论证完整性核查
- [ ] 对方可能的抗辩是否已预先回应
- [ ] 是否有更有利的法律规定可补充引用
- [ ] 是否有更有利的判例可补充引用
- [ ] 论证路径是否涵盖"事实错误+法律适用错误"两条线
- [ ] 行政处罚/监管行为的效力论证是否独立充分(如行政处罚是否意味着行为违法,撤销后能否视为行政机关认可)
## 行政诉讼材料交叉核验(涉行政处罚案件专用)
- [ ] 撤销决定书的"现因"(启动契机)与引用法条(法律根据)是否都已准确引用
- [ ] 撤销决定书的文书编号格式是否与原件一致(特别注意六角括号〔〕vs方括号[])
- [ ] 询问笔录中的责任链是否已完整提取——违法行为的策划者、组织者、设备提供者、场地出租者分别是谁,本方当事人是否在链条中
- [ ] 庭审笔录中行政机关(被告)的关键表态是否已引用——特别是对本方当事人经营合法性的自认
- [ ] 调解/谈话笔录中行政机关的自认是否已引用——⚠️ **这往往是最直接有力的证据,最容易被遗漏**
- [ ] 撤销的内部审批流程是否已论证——证明走的是正式内部纠错程序而非简单和解
- [ ] 证人证言中"私自行为""会被开掉"等关键细节是否已引用——证明公司禁止/不知情
- [ ] 被处罚人员中是否有本方当事人的员工——如果没有,这是有力的反证
- [ ] 事后报警行为是否已作为"不知情"的佐证引用
## 格式核查
- [ ] 当事人信息是否完整(名称、法定代表人、地址)
- [ ] 诉讼请求是否明确具体
- [ ] 落款(申请人+日期)是否正确
- [ ] 致送法院是否正确
- [ ] 有无错别字(如"和"vs"何"、"做"vs"作"、"扔"vs"仍"等同音字)
- [ ] 有无重复文字(如"撤销对……撤销对"——修改中遗留的重复片段)
- [ ] 有无严重语病(特别是含多个因果关系的复杂句式,如"分别是系因为……均——")
- [ ] 文书编号括号格式是否规范(正式文书用六角括号〔〕,非方括号[])
## 附件清单制作
- [ ] 每条事实主张对应原审材料精确位置
- [ ] 位置标注格式统一("XX证据第X页"或"庭审笔录第X页")
- [ ] 附件PDF已合并并插入书签
- [ ] 书签标题与清单条目对应
- [ ] 独立主题汇编PDF已单独制作(如租金支付凭证汇编)
## 万禹案特有的参考判例
### 无权处分/超面积转租
- 厦门市同安区法院+厦门中院(转租方将公摊计入转租面积属无权处分,判返还押金+驳回原告全部诉请)
- 来源:据《厦门日报》2023年9月1日报道(裁判文书未上网公开,无法获取案号)
- 再审申请书中已标注来源为新闻报道
### 面积差异与租金调整
- 北京高院《关于审理房屋租赁合同纠纷案件若干疑难问题的解答》第8条
- 承租人以面积不符主张减付租金的,可予支持
### 缔约过失
- 民法典第500条(隐瞒重要事实的缔约过失责任)
- 商品房销售管理办法第18条(面积差异处理)——类比适用于租赁
@@ -0,0 +1,53 @@
# 一人公司股东"财产独立"抗辩(公司法第23条第3款)
场景:债权人起诉子公司(被告一),并依据一人公司规则把唯一股东母公司(被告二)列为共同被告主张连带责任。我方代理被告二/股东。本框架贯穿质证意见、答辩状、证据目录三类文书。
## 一、法条与举证责任(核实后引用)
- **2023年《公司法》第23条第3款**(原2018年第63条,已平移并上升至总则):
> "只有一个股东的公司,股东不能证明公司财产独立于股东自己的财产的,应当对公司债务承担连带责任。"
- 关键特征:**举证责任倒置**。法律推定一人公司"财产混同",由股东自证清白。这是与第23条第1款(一般人格否认,债权人举证)的根本区别。
- 适用边界(通说"特殊与一般"):第3款**仅就"财产混同"倒置举证**。"过度支配与控制""资本显著不足""人员/业务混同"等其他人格否认情形,仍由债权人举证。可据此把对方主张限缩到"财产混同"单一战场。
- 合同相对性配套:《民法典》第465条第2款"依法成立的合同,仅对当事人具有法律约束力"——证明被告二非买卖合同当事方,不受该合同约束。
## 二、三类文书的论证落点
**质证意见**(针对原告每组证据):
- 订单/付款安排/银行流水 → 真实性无法确认、关联性不认可:被告二非签约/履行/收付方,与其无关。
- 国家企业信用信息报告 → 三性认可、证明目的不认可:该证据恰恰证明被告二已足额出资、不存在出资瑕疵,反而对我方有利。
**答辩状**(三段式,每段结合质证立场 + 拟提交证据):
1. 合同相对性:被告二非合同方,援引民法典465条,呼应对证据1-3的质证。
2. 主体独立/财产不混同:母子公司各为独立法人;以连续年度审计报告为核心,辅以银行流水、账簿、场所、社保;援引公司法23条3款点明举证责任已尽。
3. 已履行出资:呼应对证据4的质证,股东以出资额为限担责。
**证据目录**:每份证据的"证明对象和内容"全部指向同一核心——被告一与被告二财产独立、不混同。这是写证明内容的总纲。
## 三、审计报告的 5 个风险点(最高院及各地裁判规则)
单凭年度审计报告常被认定"仅反映负债和利润,不足以单独证明财产独立"。要让它站得住,必须满足且向客户核实:
| 核查点 | 要求 | 不满足的后果 |
|--------|------|------|
| 及时性 | 每会计年度终了时及时编制 | 诉讼后补做→削弱客观性(多案不采信) |
| 连续性 | 覆盖债务关键期、年份不断裂 | 断裂→质疑财务不规范 |
| 意见类型 | 无保留意见 | 保留意见→证明力严重削弱 |
| 独立性 | 审计所不得既做账又审计 | 同所→独立性被否 |
| 完整性 | 披露与股东的关联交易、不遗漏已知/可公开查询债务 | 遗漏→"审计失败",整份不采信 |
> 注:2023年新《公司法》删除了原第62条"一人公司强制年度审计"的特别规定(仅保留第208条对所有公司的一般审计要求)。但司法实践惯性下,**经审计的连续年度财务报告仍是股东证明财产独立的核心证据**,未提供或诉讼中补做都很被动。
## 四、补强证据链(审计报告之外)
| 证据 | 证明内容 |
|------|---------|
| 出资凭证 / 验资报告 | 已全面履行出资义务,无出资不实/抽逃 |
| 独立银行账户流水 | 资金独立收付、独立核算 |
| 财务账簿、会计凭证 | 账簿独立完整,与股东不混同 |
| 经营场所产权证/租赁合同 | 住所独立 |
| 员工名册 + 社保缴纳记录 | 人员独立用工 |
| 关联交易合同及付款凭证(如有) | 交易真实、定价公允、如实入账,非利益输送 |
## 五、答辩状里写"拟提交"证据的联动陷阱
答辩状若写"被告二拟提交 X、Y、Z",必须与最终确定的证据目录保持一致。客户实际无法提供某项时,回到答辩状删除对应表述——否则文书自述的证据与实际提交不符。
@@ -0,0 +1,79 @@
# 夫妻共同债务:配偶还款行为的司法认定
## 核心论证路径
### 路径一:事后追认(民法典1064条第一款)
配偶在还款协议签订后持续还款→构成"事后追认等共同意思表示"
**法律依据层级:**
1. 民法典1064条第一款(法律)
2. 最高法民一庭答记者问(2018.1.17):"事后追认不限于书面形式"
3. 浙高法〔2018〕89号第12条:"归还借款本息可推定共同举债合意"
4. 上海一中院审理思路第78条:"借款后曾归还借款"属**明示**追认行为
### 路径二:共同生产经营(民法典1064条第二款)
配偶作为公司股东/共同受让人→直接参与经营→债务用于共同经营
**审查三要素(上海一中院第81条):**
1. 债务款项专用性
2. 夫妻经营共同性(核心:合意参与)
3. 经营利润共享性
### 路径三:反向论证
若否认还款系清偿本案债务→全部债务均未清偿→与被告陈述矛盾
## 关键来源验证(2026-06-10确认)
### 上海市第一中级人民法院《夫妻共同债务类案件的审理思路和裁判要点》
- **官方URL**:https://www.a-court.gov.cn/xxfb/no1court_412/docs/202009/d_3645567.html
- **发布时间**:2020年9月9日
- **发布机关**:上海市第一中级人民法院(⚠️ 不是上海高院)
- **关键段落位置**:第三部分(二)→ 第1小节"夫妻就债务达成合意"
- **原文**:"明示包括夫妻双方共签借据或一方以短信、微信等方式表示合意;非举债配偶以其名下财产为借款设立抵押,借款后曾归还借款等追认行为。"
- **验证方式**:浏览器访问+JS高亮截图,已交付Doro
### 浙高法〔2018〕89号
- **全称**:《浙江省高级人民法院关于妥善审理涉夫妻债务纠纷案件的通知》
- **发布**:2018年5月23日
- **效力**:未被公开废止,核心精神与民法典1064条一致,浙江省内仍被引用
## 判例汇编
### 支持"配偶还款=共同债务"
| 案号 | 法院 | 要旨 | 来源 |
|------|------|------|------|
| (2018)最高法民申634号 | 最高法 | 配偶参与经营收益用于共同生活→共同债务 | 《商事审判指导》2019年第2辑 |
| (2021)最高法民申4323号 | 最高法 | 配偶任公司股东/监事/高管→共同经营 | 中国裁判文书网 |
| (2018)京民终18号 | 北京高院 | "小马奔腾"案:享有股权收益即承担对应债务 | 最高法(2020)最高法民申2195号维持 |
### 限缩"还款=追认"的观点
- 上海一中院孙少君法官(2025年):"仅凭单一还款行为,尚不足以认定配偶具有加入债务、同意承担所有还款责任的意思表示,应当结合其他证据"
- (2024)豫03民终663号:仅有银行流水往来缺乏其他佐证→不足以证明追认
### 反面案例
| 案号 | 法院 | 要旨 |
|------|------|------|
| (2018)最高法民再20号 | 最高法 | 债权人明知非用于共同生活→不认定共同债务 |
## 权利义务一致原则论证(2026-06-10新增)
当配偶本人就是经营活动的直接参与者(如公司股东、房产共有人)时,其债务性质不只是"用于夫妻共同经营"——而是**配偶本人即为义务主体**。论证时应区分:
- **借款类债务**:一方举债 → 需论证追认或共同经营
- **股权转让款/分红/房产对价**:配偶本人是股东/共有人 → 这些更接近其**自己的债务**,非"一方以个人名义所负"
- **权利义务一致原则引用**:《最高人民法院民法典婚姻家庭编继承编理解与适用》(人民法院出版社2020年版,第167-169页):"如果未举债配偶一方已经基于该债务受益,则认定为夫妻共同债务。此情况下,基于权利义务一致原则,似无不妥。"
- 参见(2018)京民终18号"小马奔腾案":配偶主张股权为夫妻共同财产→须同时承担相关债务
## "追认"与"知情"的关键区分(2026-06-10新增)
上海一中院明确:**"非举债配偶事后知情但未作出追认的不能认为就债务达成夫妻共负债务的合意"**
论证时必须区分并明确对接:
- ❌ 消极知情:知道有这笔债但没有任何行动 → **不构成追认**
- ✅ 主动还款:持续、多次、大额还款 → **行为本身即追认**
建议在论述中加一句明确区分:"张华丽的上述行为并非单纯的'事后知情',其持续、主动的还款行为本身即构成对案涉债务的实际追认,与消极知情存在本质区别。"
## ⚠️ 诚实说明
- 最高法层面**没有**公报案例或指导性案例专门以"配偶还款行为"为核心裁判要旨
- 支撑主要来自地方法院审判指导文件+各地生效判决
- 本案优势:不是单一还款,而是10次、近4年、合计1200万元、部分转账备注"还款",远超一般"知晓"的程度
@@ -0,0 +1,71 @@
# 夫妻共同债务法律依据汇编(梁永案研究 2026-06-10)
## 核心法律
### 《民法典》第1064条(2021年1月1日施行)
**第一款(共同意思表示):** 夫妻双方共同签名或者夫妻一方事后追认等共同意思表示所负的债务,以及夫妻一方在婚姻关系存续期间以个人名义为家庭日常生活需要所负的债务,属于夫妻共同债务。
**第二款(共同生产经营):** 夫妻一方在婚姻关系存续期间以个人名义超出家庭日常生活需要所负的债务,不属于夫妻共同债务;但是,债权人能够证明该债务用于夫妻共同生活、共同生产经营或者基于夫妻双方共同意思表示的除外。
## 现行有效司法解释
### 《婚姻家庭编解释(一)》法释〔2020〕22号
- 第33条:婚前个人债务原则上不及配偶,除非用于婚后共同生活
- 第34条:虚构债务不支持
- 第35条:离婚协议不影响债权人向双方主张权利
- 第36条:赌博吸毒债务不认定为共同债务
### 《婚姻家庭编解释(二)》法释〔2025〕1号(2025年2月1日施行)
- 第3条:离婚逃债的财产分割可撤销(未新增共同债务认定标准)
## 地方审判指导文件
### 浙高法〔2018〕89号
- **全称**:《浙江省高级人民法院关于妥善审理涉夫妻债务纠纷案件的通知》
- **发布**:2018年5月23日,浙江省高级人民法院
- **效力**:地方审判指导,未被公开废止,核心精神与民法典1064条一致,在浙江省内仍被广泛引用
- **关键条文**:
- 第12条(追认推定):配偶出具借条时在场、借款汇入配偶账户、**归还借款本息**等情形,可推定共同举债合意
- 第15-16条:20万元为家庭日常/超出日常的参考分界
- 第22条(共同经营):举债用于夫妻共同工商业或共同投资,或举债人单方经营但配偶分享收益
### 上海一中院审理思路
- **全称**:《夫妻共同债务类案件的审理思路和裁判要点》
- **发布**:2020年9月9日,上海市第一中级人民法院(⚠️ 不是上海高院)
- **第78条**(事后追认):将"借款后曾归还借款"列为**明示的**事后追认行为(比浙高法的"推定"更进一步)
- **第81条**(共同经营三要素):债务款项专用性、夫妻经营共同性、经营利润共享性
## 关键案例
### 配偶还款 → 追认
| 案号 | 法院 | 要旨 | 来源 |
|------|------|------|------|
| (2018)最高法民申634号 | 最高法 | 配偶参与经营收益用于共同生活→共同债务 | 《商事审判指导》2019年第2辑(总第49辑) |
| (2023)皖1181民初5202号 | 天长市法院 | 配偶在后续借条签名→明示事后追认 | 中国裁判文书网 |
### 共同经营 → 共同债务
| 案号 | 法院 | 要旨 | 来源 |
|------|------|------|------|
| (2021)最高法民申4323号 | 最高法 | 配偶任公司股东/监事/高管→共同经营 | 中国裁判文书网 |
| (2018)京民终18号 / (2020)最高法民申2195号 | 北京高院/最高法 | "小马奔腾"案:享有股权收益即承担对应债务 | 公开报道+裁判文书网 |
### 反面案例(限缩认定)
| 案号 | 法院 | 要旨 |
|------|------|------|
| (2024)豫03民终663号 | 洛阳中院 | 仅有银行流水往来缺乏其他佐证→不足以证明追认 |
| (2018)最高法民再20号 | 最高法 | 债权人明知非用于共同生活→不认定共同债务 |
### 最高院权威释义
**《最高人民法院民法典婚姻家庭编继承编理解与适用》(人民法院出版社2020年版,第167-169页):**
- "事后追认的方式,不限于书面形式,实践中可以通过电话录音、短信、微信、邮件等方式记载的内容进行判断。"
- "夫妻共同生产经营……要根据经营活动的性质以及夫妻双方在其中的地位作用等综合认定。"
- "如果未举债配偶一方已经基于该债务受益,则认定为夫妻共同债务。此情况下,基于**权利义务一致原则**,似无不妥。"
## ⚠️ 已废止
- 法释〔2018〕2号(三条实体规定已被民法典1064条完整吸收)
- 原《婚姻法》司法解释二第24条
## 注意事项
- 最高法层面**没有**公报案例或指导性案例专门以"配偶还款=事后追认"为裁判要旨
- 该认定标准主要来自地方法院文件(浙高法89号+上海一中院审理思路)
- 上海一中院孙少君法官(2025年)提醒:仅凭单一还款行为不足以认定追认,需结合其他证据
@@ -0,0 +1,70 @@
# 侵权追偿诉讼——构成要件分析方法
> 来源:万禹案追偿诉讼讨论(2026-07-03,Maggie指导)
## 分析框架(五板块)
按以下顺序逐一论证,每个被告单独分析后再合并论证共同侵权:
### 一、不法行为
- 各被告具体实施了什么行为
- 行为的违法性依据(如刑事判决已认定)
- 共同不法行为的认定(1168条四要素:共同故意+行为关联+结果统一+因果关系不可分)
### 二、受损法益
**分层论证**(关键技巧):
- 第一层:犯罪行为直接侵害的法益(不依赖行政处罚/其他中间环节即已存在)
- 如:场所占有权、经营安全、名誉权
- 第二层:经中间环节(如行政处罚)传导的法益侵害
- 如:经营自主权、财产权(积极损失+可得利益)、企业存续利益
分层意义:即便对方主张因果关系被切断,第一层损害仍然不受影响。
### 三、损害结果
- 已发生的确定损害(可量化)
- 可主张的其他损害(举证难度标注)
### 四、行为与结果的因果关系
这是最容易被攻击的环节,需要多层论证:
#### (1)因果链条——画出完整路径
#### (2)"被牵连方"定位
- 原告不是违法活动的参与者/组织者/受益者
- 原告是被犯罪行为侵入和波及的第三方
- 公法上的"管理责任"≠民法上的"过错"
#### (3)第三方介入是否切断因果关系
当损害结果存在两部分原因时(如:犯罪行为 + 行政机关错误处罚),论证不切断:
1. **可预见性**——行政处罚是犯罪行为的可预见制度性后果,不是"异常介入"
2. **风险制造理论**——损害后果仍在被告制造的风险范围内
3. **多因一果**——即便认为构成介入因素,按1172条分别侵权处理,不免除被告责任
4. **独立损害兜底**——即便切掉传导层,犯罪行为本身直接造成的损害仍然存在
类比:甲伤害乙→乙就医→医疗过失→伤情加重,不免除甲的责任。
#### (4)行政处罚撤销的战略价值
- 撤销=法院认定原告无过错→堵死对方"过失相抵"抗辩
- 不撤销也不免除被告责任(公法管理责任≠民法过错)
#### (5)被告犯罪行为的高度可归责性
列举具体事实证明被告应当承担主要/全部责任
### 五、主观故意
- 各被告的故意内容(明知+意欲)
- 惯犯的认知程度更高
- 对"牵连场所方"这一后果的预见性
- 共同故意的认定(意思联络+共同认知+共同追求/放任)
## 附:过失相抵应对
被告抗辩"原告管理有过失"时的回应模式:
- 逐项反驳具体指控(正常工作需要≠授权违法、事后结果不能倒推管理过错等)
- 核心反驳:"受骗者≠放任者"——原告方面是被欺骗的,不是知情放任的
- 终极武器:如行政处罚被撤销,直接援引"行政法院已认定原告无过错"
## 注意事项
1. 被告选择要考虑诉讼策略——如果某人既是被告又与原告有特殊关系(如员工),列为被告可能给对方送弹药,不如留作证人
2. 损害赔偿金额要分层次预估(最乐观/中间值/保守),起诉按最高主张
3. 行政诉讼结果是前置条件——影响整个策略方向,应先确认再起诉
@@ -0,0 +1,228 @@
# Tracked Changes for Text Replacement (python-docx + lxml)
For **simple text replacements** (fix typos, swap terms, correct punctuation) in reviewed documents,
python-docx load + lxml XML manipulation + python-docx save works well. This is **simpler** than the
pure zipfile+lxml approach used for complex format-sensitive edits (Section 四 of the main skill).
## When to Use This vs Pure zipfile+lxml
| Scenario | Method |
|---|---|
| Text replacement (swap words, fix typos, correct brackets) | python-docx + lxml (this reference) |
| New paragraphs, format-sensitive edits, number-heavy legal analysis | Pure zipfile + lxml (Section 四) |
| Contract review (合同审查) | contract_docx_lib.py |
## Implementation Pattern
```python
import copy
from docx import Document
from docx.oxml.ns import qn
from lxml import etree
doc = Document('input.docx')
AUTHOR = "WB"
DATE = "2026-06-11T21:30:00Z"
def tracked_replace_in_paragraph(para, old_text, new_text, author=AUTHOR, date=DATE):
"""Replace old_text with new_text using w:del + w:ins tracked changes."""
full_text = para.text
if old_text not in full_text:
return False
# Find which runs contain old_text
runs = para.runs
accumulated = ""
start_run = end_run = -1
start_offset = end_offset = 0
idx = full_text.find(old_text)
for i, run in enumerate(runs):
prev_len = len(accumulated)
accumulated += run.text
if start_run == -1 and idx >= prev_len and idx < prev_len + len(run.text):
start_run = i
start_offset = idx - prev_len
if start_run != -1 and len(accumulated) >= idx + len(old_text):
end_run = i
end_offset = idx + len(old_text) - prev_len
break
if start_run == -1:
return False
# Get rPr from first affected run (preserves font/size/bold)
rpr = runs[start_run]._element.find(qn('w:rPr'))
rpr_xml = copy.deepcopy(rpr) if rpr is not None else None
# Single-run case
if start_run == end_run:
run_elem = runs[start_run]._element
parent = run_elem.getparent()
before_text = runs[start_run].text[:start_offset]
after_text = runs[start_run].text[end_offset:]
insert_pos = list(parent).index(run_elem)
# Before-text run
if before_text:
br = copy.deepcopy(run_elem)
br.find(qn('w:t')).text = before_text
parent.insert(insert_pos, br)
insert_pos += 1
# w:del
del_elem = etree.SubElement(parent, qn('w:del'))
del_elem.set(qn('w:id'), str(hash(old_text) % 10000))
del_elem.set(qn('w:author'), author)
del_elem.set(qn('w:date'), date)
del_run = etree.SubElement(del_elem, qn('w:r'))
if rpr_xml: del_run.append(copy.deepcopy(rpr_xml))
dt = etree.SubElement(del_run, qn('w:delText'))
dt.set(qn('xml:space'), 'preserve')
dt.text = old_text
parent.insert(insert_pos, del_elem)
insert_pos += 1
# w:ins
ins_elem = etree.SubElement(parent, qn('w:ins'))
ins_elem.set(qn('w:id'), str((hash(new_text) + 1) % 10000))
ins_elem.set(qn('w:author'), author)
ins_elem.set(qn('w:date'), date)
ins_run = etree.SubElement(ins_elem, qn('w:r'))
if rpr_xml: ins_run.append(copy.deepcopy(rpr_xml))
it = etree.SubElement(ins_run, qn('w:t'))
it.set(qn('xml:space'), 'preserve')
it.text = new_text
parent.insert(insert_pos, ins_elem)
insert_pos += 1
# After-text run
if after_text:
ar = copy.deepcopy(run_elem)
ar.find(qn('w:t')).text = after_text
parent.insert(insert_pos, ar)
parent.remove(run_elem)
return True
# Multi-run case: merge affected runs, then split
# (same logic but operates across run boundaries)
# ... see session 20260611 for full implementation
```
## Key Notes
- **w:id must be unique** across all ins/del in the document. Using `hash() % 10000` works for small batches but can collide — use a counter for production.
- **rPr must be copied** from the original run to preserve font/size/bold in both del and ins elements.
- **xml:space='preserve'** is required on both w:delText and w:t, or Word strips leading/trailing whitespace.
- **Paragraph alignment fix** (e.g. missing JUSTIFY): manipulate `w:pPr/w:jc` directly — this isn't a tracked change, just a format correction.
## Whole-Paragraph Delete & Full-Paragraph Replace (pure zipfile+lxml)
For **structural restructures** — deleting an entire paragraph, or replacing a whole
paragraph's text — operate on document.xml directly and rewrite the zip. Cleaner than
python-docx save for multi-paragraph edits (2026-06-16 上海喆航 VS AMOS 管辖异议重构, 5 处改动).
```python
import zipfile, copy, os
from lxml import etree
W='http://schemas.openxmlformats.org/wordprocessingml/2006/main'
def w(t): return f'{{{W}}}{t}'
XMLSPACE='{http://www.w3.org/XML/1998/namespace}space'
AUTHOR="苌莎莎"; DATE="2026-06-16T12:00:00Z" # author 跟随指示人,见下
_id=[3000]
def nid(): _id[0]+=1; return str(_id[0]) # 全文唯一计数器,别用 hash()
def del_para(p):
"""整段删除:每个 run 包 w:del + w:t→w:delText,并标记段落标记删除。"""
for r in p.findall(w('r')):
idx=list(p).index(r); p.remove(r)
for t in r.findall(w('t')):
t.tag=w('delText'); t.set(XMLSPACE,'preserve')
d=etree.Element(w('del')); d.set(w('id'),nid()); d.set(w('author'),AUTHOR); d.set(w('date'),DATE)
d.append(r); p.insert(idx,d)
# 关键:标记段落标记(paragraph mark)删除,否则接受修订后会留空行
ppr=p.find(w('pPr')) or etree.SubElement(p,w('pPr'))
rpr=ppr.find(w('rPr')) or etree.SubElement(ppr,w('rPr'))
pmd=etree.SubElement(rpr,w('del')); pmd.set(w('id'),nid()); pmd.set(w('author'),AUTHOR); pmd.set(w('date'),DATE)
def repl_para(p, new_text):
"""整段文字替换:旧 run 全部 w:del,新文字一个 w:ins,rPr 取自首个旧 run。"""
rpr_t=None
for r in p.findall(w('r')):
rr=r.find(w('rPr'))
if rr is not None: rpr_t=copy.deepcopy(rr); break
for r in p.findall(w('r')):
idx=list(p).index(r); p.remove(r)
for t in r.findall(w('t')):
t.tag=w('delText'); t.set(XMLSPACE,'preserve')
d=etree.Element(w('del')); d.set(w('id'),nid()); d.set(w('author'),AUTHOR); d.set(w('date'),DATE)
d.append(r); p.insert(idx,d)
ins=etree.SubElement(p,w('ins')); ins.set(w('id'),nid()); ins.set(w('author'),AUTHOR); ins.set(w('date'),DATE)
nr=etree.SubElement(ins,w('r'))
if rpr_t is not None: nr.append(rpr_t)
nt=etree.SubElement(nr,w('t')); nt.set(XMLSPACE,'preserve'); nt.text=new_text
# 定位用「接受所有修订后的最终文本」匹配,不要用 run 内的碎片
def ptext(p): return ''.join(t.text or '' for t in p.findall('.//'+w('t')))
# 写回:逐项复制 zip,只替换 document.xml
newxml=etree.tostring(root, xml_declaration=True, encoding='UTF-8', standalone=True)
tmp=out+'.tmp'
with zipfile.ZipFile(src) as zin, zipfile.ZipFile(tmp,'w',zipfile.ZIP_DEFLATED) as zout:
for it in zin.namelist():
zout.writestr(it, newxml if it=='word/document.xml' else zin.read(it))
os.replace(tmp,out)
```
⚠️ **整段删除的 w:del 计数会偏高**:一段 N 个 run → N 个 w:del(每 run 单独包)。
5 处改动可能产生 35+ 个 w:del,属正常,不是 bug。
## 修订 author 跟随指示人(铁律)
author 署谁 = **谁指示你改这份文书**,不是你自己("小Maggie"):
- ShaSha(苌莎莎)发来审核/修订 → `author="苌莎莎"`
- Doro 发来 → `author="WB"`
- 2026-06-16 教训:先误用 `author="小Maggie"`,被规范纠正为 `"苌莎莎"`。生成前先确认指示人是谁,别用机器人自己的名字。
## 自动编号链完整性(删段后必查)
删除带 `numPr` 的段落,或删除其相邻段落,可能打断一级标题的中文自动编号(一、二、三)。
删段后用三级映射核验保留下来的 `numId` 项仍正确:numId→abstractNumId→`numFmt`
`chineseCountingThousand` + lvlText `(%1)` = 渲染「(一)(二)(三)」)。详见
`docx-format-verification.md`。本会话删的三段均为无 numPr 的正文段,编号链未受影响。
## Verification After Save
```python
from zipfile import ZipFile
from lxml import etree
with ZipFile('output.docx', 'r') as z:
xml = z.read('word/document.xml')
root = etree.fromstring(xml)
ns = {'w': 'http://schemas.openxmlformats.org/wordprocessingml/2006/main'}
ins = root.findall('.//w:ins', ns)
dels = root.findall('.//w:del', ns)
print(f"{len(ins)} insertions, {len(dels)} deletions")
for i in ins:
for t in i.findall('.//w:t', ns):
print(f" INS: '{t.text}'")
```
### 模拟「接受所有修订」验证最终成稿(vision 工具不可用时的兜底)
当 vision 工具报 `No LLM provider configured` 时,不靠肉眼看 PDF,改用程序化核验:
1. **模拟接受全部修订**:遍历段落,收集所有 `w:t`(含 `w:ins` 内的),跳过 `w:delText`
`pPr/rPr/del` 标记的整删段且接受后无文字的,丢弃。打印最终文本逐段读一遍逻辑。
2. **PDF 文字层零乱码检测**:LibreOffice 转 PDF → PyMuPDF `get_text()`
`re.findall(r'[\ufffd]', full)` 数量应为 0。
3. **关键内容 in 核查**:用 `"关键短语" in full_text` 逐项断言删的删了、留的留了、新写的在。
⚠️ **连续字符串核查必须打在「接受修订后」文本上,不能打在 PDF 文字层上(2026-06-16 实测陷阱)**
- 修订模式下 PDF 把删除文本(带删除线的旧字)和新增文本**交织渲染**在一起。对 PDF 文字层做
`"新论证短语" in pdf_text` 会**假阴性**——本会话 5 处改动里有 3 处在 PDF 核查中报 ✗,
实则全部改对了。
- 正确做法:核查 1(in 断言)的语料 = 上面第 1 步生成的「跳过 delText、保留 ins」的最终文本,
**不是** `pdftotext` 的输出。PDF 文字层只用于核查 2(零乱码 / 页数)。
- 报 ✗ 时先换语料重核,别急着改文件——很可能文件是对的,是验证方法用错了层。