# Workflow审查遗漏手动补修方法（2026-07-09 职业卫生合同实证）

## 场景
Doro要求"查看交付合同哪里不符合审查规则"并指示手动修复。

## 诊断步骤

### 1. 提取修订清单
```python
# 从交付文件提取所有WB tracked changes
import zipfile
from lxml import etree
W = 'http://schemas.openxmlformats.org/wordprocessingml/2006/main'

with zipfile.ZipFile(path) as z:
    xml = z.read('word/document.xml')
root = etree.fromstring(xml)

# INS
for ins in root.findall(f'.//{{{W}}}ins'):
    if ins.get(f'{{{W}}}author') != 'WB': continue
    texts = [t.text for t in ins.iter(f'{{{W}}}t') if t.text]
    text = ''.join(texts).strip()
    if text:
        print(f"[INS] {text[:100]}")

# DEL
for d in root.findall(f'.//{{{W}}}del'):
    if d.get(f'{{{W}}}author') != 'WB': continue
    texts = [t.text for t in d.iter(f'{{{W}}}delText') if t.text]
    text = ''.join(texts).strip()
    if text:
        print(f"[DEL] {text[:100]}")
```

### 2. 逐条对照review-rules.md
将每一条审查规则（10大项）与已做修订比对，找出"规则要求做但没做的"。

### 3. 用ContractEditor补修

```python
import sys
sys.path.insert(0, '/home/maggie/contract-work')
from contract_docx_lib import ContractEditor

editor = ContractEditor(work_path)

# tracked_replace: 在现有文本上追加/替换
editor.tracked_replace("原文片段。", "原文片段并新增内容。")

# add_clause: 在某段落之后插入新条款
# 参数: (full_text, after_search, use_title_format=False)
editor.add_clause(
    "X.X 新增条款内容。",
    "在包含此文本的段落之后插入"  # after_search
)

editor.save(work_path)
editor.validate()  # 返回空列表=无问题
```

### 4. 字体验证
```bash
python3 ~/.hermes/skills/legal/contract-reviewer/scripts/wb-ins-font-verify.py <file.docx>
```

已知误报：混合字体段落（如"甲方："用仿宋，名称用宋体）中的INS匹配相邻run但脚本比对首个run——属于false positive，无需修复。

### 5. 上传替换
```bash
sudo docker cp <local.docx> nextcloud-nextcloud-1:<NC路径>
sudo docker exec nextcloud-nextcloud-1 chown www-data:www-data <NC路径>
sudo docker exec -u www-data nextcloud-nextcloud-1 php occ files:scan --path="doro/files/..."
sudo docker exec nextcloud-onlyoffice-1 bash -c 'rm -rf /var/lib/onlyoffice/documentserver/App_Data/cache/files/data/*'
sudo docker restart nextcloud-onlyoffice-1
```

## 2026-07-09 职业卫生合同具体修复

| # | 类型 | 位置 | 修订内容 | 规则 |
|---|------|------|----------|------|
| 1 | tracked_replace | 1.4条 | "承担全部责任。"→"承担全部责任并全额赔偿甲方因此遭受的一切损失。" | 规则6 |
| 2 | add_clause | 4.8.1后 | 新增4.8.2数据归属 | 规则4 |
| 3 | add_clause | 4.8.2后 | 新增4.8.3泄露责任 | 规则4 |
| 4 | add_clause | 5.7后 | 新增5.8持续使用权 | 规则9 |

同时修复了"有2才有1"编号问题：原4.8.1是唯一子项（违规），加上4.8.2和4.8.3后变为3个子项（合规）。

## 关键注意事项

1. **ContractEditor.add_clause参数是(full_text, after_search)**，不是keyword argument `after_text=`
2. 新增子项时注意"有2才有1"规则——单独一个子项就不要加子编号
3. P4字体验证FAIL是已知false positive（混合字体段落），详见`references/wb-ins-font-verify-false-positive.md`
4. 手动修复直接替换交付目录文件，不重跑workflow
