From 46704ee5da1153a311bce8aa7339f7e87d6fbad3 Mon Sep 17 00:00:00 2001 From: zizi Date: Fri, 17 Jul 2026 11:52:54 +0800 Subject: [PATCH] =?UTF-8?q?fix(parse-book):=20=E7=8B=AC=E7=AB=8B=E5=A4=8D?= =?UTF-8?q?=E6=A0=B8=E6=8F=AA=E5=87=BA=E7=9A=842=E4=B8=AA=E7=9C=9Fbug?= =?UTF-8?q?=E2=80=94=E2=80=94recluster=E8=B7=A8=E4=B9=A6=E5=AE=9E=E4=BE=8B?= =?UTF-8?q?=E5=BD=92=E5=B1=9E=E8=A2=AB=E8=A6=86=E5=86=99+=E8=BF=81?= =?UTF-8?q?=E7=A7=BB=E7=AB=A0=E5=8F=B7=E6=AD=A3=E5=88=99=E8=AF=AF=E6=8A=93?= =?UTF-8?q?=E6=95=B0=E9=87=8F=E8=AF=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bug1(parse_ingest _absorb):归并时用输家书名无条件覆写每条实例的来源书名→'二级归并母卡'里跨书实例的真实来源被抹成输家书名;改为保留实例原有书名(ins.get('书') or book)。已跑的718归并中75条实例/31母卡受影响,可从回溯归并审计的被并卡全文还原(待remediate)。 Bug2(parse_upgrade INLINE_CHAP_RE):裸'N章'分支把'隔3章/花了3章篇幅'数量词误当章号、还标最高置信'内嵌',违背人工精确化(拍板#5);改为只认'第X章'/'Ch.X'(区间取首章'第489-490章'→489),裸写法一律落待LLM重抽。迁移仅dry-run未落库、无数据影响。11条边界用例亲测通过。 独立opus子代理对抗复核确认无阻断性问题:无物理删知识卡/无dry-run漏写/无额度绕过/软删可逆/连接三段/调用契约完好。 --- .claude/skills/parse-book/scripts/parse_ingest.py | 4 +++- .claude/skills/parse-book/scripts/parse_upgrade.py | 5 ++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/.claude/skills/parse-book/scripts/parse_ingest.py b/.claude/skills/parse-book/scripts/parse_ingest.py index 708dff6..53f0581 100644 --- a/.claude/skills/parse-book/scripts/parse_ingest.py +++ b/.claude/skills/parse-book/scripts/parse_ingest.py @@ -532,7 +532,9 @@ def _absorb(mother, loser, sim, why): """把输家并入母卡(内存态,写库延后到写段统一落):输家实例(带书名归属)追加进母卡实例数组 + 记「回溯归并审计」(相似度/判定依据/被归并卡全文——全文留痕保证归并可逆)。""" book = (loser.get("出处") or {}).get("书名") or "" - add = [dict(ins, 书=book) for ins in (loser.get("实例") or [])] # 跨书归属:每条实例标来源书 + # 跨书归属:优先保留实例原有的书名——输家可能是"此前已跨书吸并过的母卡",其实例里混有别书来源, + # 绝不能用输家自己的书名无条件覆写(那会把二级归并的真实来源抹成输家书名);无原书名的才补输家书名。 + add = [dict(ins, 书=ins.get("书") or book) for ins in (loser.get("实例") or [])] mother["实例"] = (mother.get("实例") or []) + add mother.setdefault("回溯归并审计", []).append( {"相似度": round(float(sim), 4), "判定依据": why, "被归并卡": loser}) diff --git a/.claude/skills/parse-book/scripts/parse_upgrade.py b/.claude/skills/parse-book/scripts/parse_upgrade.py index f420826..34e4dd8 100644 --- a/.claude/skills/parse-book/scripts/parse_upgrade.py +++ b/.claude/skills/parse-book/scripts/parse_upgrade.py @@ -322,7 +322,10 @@ def _entry_win(x): # 章级排序不用运行时窗号,而用真实章号(设计稿 §6.1「真实章号索引」的落点)。 # 内嵌真实章号抽取:正文/台阶里原样出现的「第X章 / X章 / Ch.X」——迁移与降级共用 -INLINE_CHAP_RE = re.compile(r"第\s*(\d+)\s*章|(?:Ch|CH|ch)\.?\s*(\d+)|(?