1仕組みと動作原理
最大の強みは「変更履歴認識(revision-aware)」:素の python-docx では変更履歴の挿入(`w:ins` でラップされた子 run)の脱落や段落全体の削除(段落記号を包む `w:del`)の誤認が発生するため、python-docx を使わず公式 OpenXML SDK の csx スクリプトで ins/del/move を第一級オブジェクトとして読み取ります。
python-docx 的 `paragraph.text` 走 `paragraph.runs`,runs 只取直接子 `<w:r>`、不递归 `<w:ins>` 包装——**对方用修订模式插入的所有内容都会被漏读**
アーキテクチャ = Python オーケストレーション層 + C# dotnet-script エンジン:`docx_bridge_client.py` がステートレスに docx を直接読み込み、subprocess 経由で `csharp/tasks/*.csx`(`list_comments`/`list_revisions`/`extract_views`)を呼び出し、結果を (パス + mtime) キーでメモリ内 LRU キャッシュに保持します。
cmd = ["dotnet-script", str(script), "--", str(docx), *extra_args] proc = subprocess.run(cmd, capture_output=True, text=True, env=env)
3つの csx はすべて `DocumentFormat.OpenXml` 3.2.0(`#r nuget` 宣言)に基づいており、Python の描画向けに JSON/NDJSON を出力します。パース処理はすべて C# 側で完結し、Python はオーケストレーションのみを担当します。
#r "nuget: DocumentFormat.OpenXml, 3.2.0" using System.Text.Json; using DocumentFormat.OpenXml.Packaging;
出力は空の「処置」列を備えた突合表(markdown または `--json`):コメント記入者/対象段落/内容/ステータス + 段落ごとの変更履歴の修正内容。アンカー段落は 60 文字で切り詰められ、`--json` では全文が出力されます。
产出表格自带空白「处置」列——它的用途就是拿去逐条裁决。引擎提炼自作者一个真实图书出版项目的审阅工具链(2026-02 起生产验证:单文件 96 条编辑批注、整书修订处理、输入含 WPS 云文档导出件)
結果ゼロ時はサイレントな空テーブルではなく「明確な通知」として設計:コメントも変更履歴もない場合は「この docx には校正の痕跡が含まれていません」というメッセージと2つの主な原因(エクスポート時のコメント脱落/オンライン版でエクスポート未完了)を出力し、「コメントが消えたファイルを見て、相手の意見がないと誤認する」事故を防ぎます。
无批注无修订时输出一段明确提示(「这份 docx 没有携带任何审阅痕迹」+两个常见原因),不会静默输出空表——拿到丢了批注的副本还以为对方没意见,比读错内容更危险。
読み取り専用ポリシーの徹底:変更履歴の承認/却下、コメントへの返信、修正原稿の再エクスポート機能は提供しません。突合後の修正はユーザー自身のマスター原稿に反映し、再生成することを前提としています。
本 skill 只读。它不提供「接受/拒绝修订」「回复批注」「改正文再导出」——对账后的改动应落在你自己的正稿源(合同草案 SSOT、书稿源文件)再重新生成
2コア機能
3外部依存関係
| Kind | Dependency / Endpoint |
|---|---|
| cli | dotnet-script(csx 运行时,dotnet tool install -g) |
| package | DocumentFormat.OpenXml 3.2.0(NuGet,csx 首跑自动 restore 需网络 10-30s) |
| cli | dotnet SDK(brew install dotnet,宿主需装) |
4推奨統制措置と判定根拠
- scripts/: ローカルスクリプトまたはコマンドの実行: `python extract_review.py` / bridge client(ローカルオーケストレーション)
- 网络端点: 外部ネットワークアクセスの宣言: 実行時のネットワークアクセスは、初回の csx 実行時に `DocumentFormat.OpenXml` を NuGet から復元する際のみ発生(SKILL にて 10〜30 秒の通信が必要と明記、以降はローカルキャッシュを使用);d
- 本地工作目录: ファイル読み書きおよび成果物出力: なし(docx は読み取り専用、出力は stdout/ターミナルテーブルまたは `--json` stdout のみ)
5二重目の独立検証
- [ok] 修订感知引擎(csx + OpenXML SDK) — 三个 csx 均 #r 'nuget: DocumentFormat.OpenXml, 3.2.0' 并引用 WordprocessingPackage API;list_revisions/list_comments 输出 JSON。
- [ok] Python 编排壳零第三方依赖 — docx_bridge_client.py import 仅 stdlib(subprocess/json/pathlib/functools 等);SKILL 'Python 侧纯 stdlib' 属实。
- [ok] dotnet-script 调用链 + ROLL_FORWARD/PATH 处理 — _ensure_dotnet_script_on_path 追加 ~/.dotnet/tools、env.setdefault('DOTNET_ROLL_FORWARD','Major') 均在源码。
- [ok] 无状态只读 + (路径,mtime) 缓存 — _cache_key 返回 (str(p), st_mtime);lru_cache 装饰器在三个读取函数上;无写 docx 代码路径。
- [ok] python-docx 漏读叙事(w:ins/w:del) — SKILL 对 python-docx runs 直子与 w:del 段落的描述与 OpenXML 结构一致(技术事实,非夸大);reference csharp-tasks-spec 补充语义。
- [ok] 批注双锚定(WPS 兼容) — list_comments.csx 头注释记录 CommentRangeStart 首选 + CommentReference 回退及 WPS 96 条中 6 条实测。
- [ok] 空结果提示防假阴性 — SKILL 声明 + extract_review.py 输出契约(无批注无修订时输出提示段)。
- [ok] 无网络外发(除 NuGet 首跑) — 脚本全量扫描无 requests/urllib/http/curl;SKILL 明示 NuGet restore 需网络且仅首次。
6結論
5d26333cd2cde9a9…