Problem
RelationshipsOverlay.merge(Sources/OOXMLSwift/IO/RelationshipsOverlay.swift:56)用 Dictionary(uniqueKeysWithValues: typedRels.map { ($0.id, $0) }) 建索引。word/_rels/document.xml.rels 只要有兩條 relationship 的 id 在 XML 解析後相同——純粹寫兩次 Id="rId5",或 Id="rId5" 與 Id="rId5"(NSXML 在 parse 期就解碼)——這行就 Fatal error: Duplicate values for key: 'rId5',process 以 SIGTRAP 結束。
che-word-mcp#199 verify R2 的 DA 實測:save_document 對同檔本來就 crash(gate 在 base 就呼叫 writeData);#199 把唯讀的 list_images 也接上 writeData 後,list 也會把整個 MCP server 打死。che-word-mcp 端會在序列化前預檢重複 id 當緩解,但 library 不該對可從磁碟讀入的資料 fatalError。
Type
bug
Expected
merge 對重複 id 拋可捕捉的錯誤(具名 part 與 id),或以「後者覆蓋前者/保留第一條」的明確政策合併並在報告中具名;reader 端亦可在讀入時就拒絕/去重。
Actual
fatalError,整個 process 終止。
Source: surfaced during /idd-verify che-word-mcp#199 R2 (Step 5b follow-up triage). Verify report: PR PsychQuant/che-word-mcp#218 (Verify R2 comment)
Refs PsychQuant/che-word-mcp#199
Current Status
Phase: needs-fix
Last updated: 2026-09-06 by idd-verify (R3 → fix round 3 landed; R4 running) — unattended /idd-all, cluster PR #141
Key Decisions
Blocking
Problem
RelationshipsOverlay.merge(Sources/OOXMLSwift/IO/RelationshipsOverlay.swift:56)用Dictionary(uniqueKeysWithValues: typedRels.map { ($0.id, $0) })建索引。word/_rels/document.xml.rels只要有兩條 relationship 的 id 在 XML 解析後相同——純粹寫兩次Id="rId5",或Id="rId5"與Id="rId5"(NSXML 在 parse 期就解碼)——這行就Fatal error: Duplicate values for key: 'rId5',process 以 SIGTRAP 結束。che-word-mcp#199 verify R2 的 DA 實測:
save_document對同檔本來就 crash(gate 在 base 就呼叫writeData);#199 把唯讀的list_images也接上writeData後,list 也會把整個 MCP server 打死。che-word-mcp 端會在序列化前預檢重複 id 當緩解,但 library 不該對可從磁碟讀入的資料fatalError。Type
bug
Expected
merge對重複 id 拋可捕捉的錯誤(具名 part 與 id),或以「後者覆蓋前者/保留第一條」的明確政策合併並在報告中具名;reader 端亦可在讀入時就拒絕/去重。Actual
fatalError,整個 process 終止。Source: surfaced during /idd-verify che-word-mcp#199 R2 (Step 5b follow-up triage). Verify report: PR PsychQuant/che-word-mcp#218 (Verify R2 comment)
Refs PsychQuant/che-word-mcp#199
Current Status
Phase: needs-fix
Last updated: 2026-09-06 by idd-verify (R3 → fix round 3 landed; R4 running) — unattended /idd-all, cluster PR #141
Key Decisions
nsWellFormed;守門測試把<zz:x/>放在根元素之後、revert 整個修法照綠);R2 用lowercased()索引模擬檔案系統本身是新的靜音開關(碰撞時依封裝順序選、APFS 摺 U+017F、./收合)。3807b6a,在隔離 worktree 完成、ff-merge 進 cluster branch):inspector 改走 reader 自己的ZipHelper.unzip、part 以 OPC 位址組字串交檔案系統查(不模擬);解壓失敗/無word/document.xml→invalidDocx;delegate 自判未宣告前綴(真實 writer 唯一會產生的那一類);撤回「reader 拒的 inspector 也拒」全稱宣稱(DA D1 裁決:走封閉列舉——拒絕理由四類、不模擬的 namespace 類別點名、isConsistent是關係陳述),以 leniency 測試釘住;預檢驗完整 UTF-8、自閉合算深度;writer 以 rels 檔存在判斷、拒非 UTF-8/零長度/含註解/CDATA/前綴<Relationship>的 rels、訊息依成因分句(DocxWriter把rId1–rId4寫死給 styles/settings/fontTable/numbering——真實封裝若把rId1用在圖片就無法存檔(sister concern from #139) #140 亦然)。1512 tests / 0 failures。hasNewTypedRelationships與RelationshipsOverlay.parseRels是 #137 的同一反模式(sister concern from #137) #142;固定槽 →DocxWriter把rId1–rId4寫死給 styles/settings/fontTable/numbering——真實封裝若把rId1用在圖片就無法存檔(sister concern from #139) #140。Blocking
3807b6a進行中;PASS → merge PR cluster: PackageInspector parses XML with the reader's parser, and no serialization path traps (#137, #138, #139) #141、tag v3.7.0、idd-close ×3;FAIL → fix round 4。