feat: export core Hermes skills
This commit is contained in:
@@ -0,0 +1,70 @@
|
||||
# Pre-Modified File Detection (v1.x with Existing Tracked Changes)
|
||||
|
||||
## Problem
|
||||
|
||||
Files arriving as "v1.x" or similar versions may already contain tracked changes from other parties (e.g., the counterparty's legal team). The review-rules state: "已有他人的修订模式保持原样不动,不接受也不拒绝,只叠加我们自己的审查修改."
|
||||
|
||||
## Technical Impact
|
||||
|
||||
1. **python-docx `paragraph.text`** only shows non-tracked-change text (skips content inside `w:ins` elements), so it does NOT reflect the "accepted state" of the document
|
||||
2. **ContractEditor.tracked_replace** searches through ALL text including `w:ins` content — search strings must match the accepted state
|
||||
3. **ContractEditor.tracked_replace may fail** when the target text spans across or is inside an existing `w:ins` from another author (lxml parent-child mismatch)
|
||||
|
||||
## Detection Procedure
|
||||
|
||||
```python
|
||||
from lxml import etree
|
||||
ns = {'w': 'http://schemas.openxmlformats.org/wordprocessingml/2006/main'}
|
||||
|
||||
# 1. Detect existing tracked changes and identify authors
|
||||
ins_els = editor.body.findall('.//{http://schemas.openxmlformats.org/wordprocessingml/2006/main}ins')
|
||||
authors = set()
|
||||
for ins in ins_els:
|
||||
author = ins.get('{http://schemas.openxmlformats.org/wordprocessingml/2006/main}author', '')
|
||||
if author:
|
||||
authors.add(author)
|
||||
# If authors contains names other than 'WB', the file is pre-modified
|
||||
```
|
||||
|
||||
## Reading the Accepted State
|
||||
|
||||
```python
|
||||
def get_para_accepted_text(p):
|
||||
"""Get paragraph text as it would appear with all changes accepted."""
|
||||
text = ''
|
||||
W = 'http://schemas.openxmlformats.org/wordprocessingml/2006/main'
|
||||
for t in p.iter(f'{{{W}}}t'):
|
||||
if t.text:
|
||||
parent = t.getparent()
|
||||
in_del = False
|
||||
while parent is not None:
|
||||
if parent.tag == f'{{{W}}}del':
|
||||
in_del = True
|
||||
break
|
||||
parent = parent.getparent()
|
||||
if not in_del:
|
||||
text += t.text
|
||||
return text
|
||||
```
|
||||
|
||||
## Workflow When Pre-Modified File Detected
|
||||
|
||||
1. **First pass**: Read accepted state of all key paragraphs to understand current document content
|
||||
2. **Compare** accepted state vs what python-docx `.paragraphs[].text` shows to identify what's been changed
|
||||
3. **Assess** which of our review issues have already been addressed by the existing modifications
|
||||
4. **Only add** our own changes for issues NOT already covered
|
||||
5. **If tracked_replace fails** on text inside another author's `w:ins`: the text is already part of someone else's tracked change. Options:
|
||||
- Skip if the existing change already addresses our concern
|
||||
- Use direct XML manipulation to add our `w:del` + `w:ins` around the problematic text (complex, error-prone)
|
||||
- Note it as "already addressed by [author]" in review notes
|
||||
|
||||
## 2026-07-06 Case Study (健康云服务费-赵巷v1.2)
|
||||
|
||||
- File arrived with tracked changes from authors: 祺帆, 社区, 俊玮 吴
|
||||
- python-docx showed P59 as "2026年1月20日" but accepted state was "2026年11月20日" (already fixed by 祺帆)
|
||||
- P26 (1.4 侵权条款) already had robust language added by 祺帆
|
||||
- P109 (7.4) already had comprehensive损失赔偿 language added by existing changes
|
||||
- P115 (8.2) had double period due to 祺帆's ins adding "向甲方所在地法院提起诉讼。" after original "则。" — required manual XML w:del to fix the trailing original period
|
||||
- P118 (9.1) already had 转包连带责任 language added
|
||||
|
||||
**Key lesson**: Without reading accepted state first, we would have duplicated 5+ modifications already made by other parties.
|
||||
Reference in New Issue
Block a user