13 · docx / pdf 明星文档技能深拆

← 返回主报告:Kimi Agent(云端沙箱)技术报告GitHub 原文

合规与风险声明:本报告为安全研究与互操作学习目的的逆向分析,全程只读采集,未对目标系统做任何修改;文中所有密钥、token、账号级标识(chat_id / project_id / tenant_id 等)均已脱敏;沙箱内发现的默认弱口令(VNC/SSH)属平台侧配置,仅作安全发现披露,请勿用于访问任何不属于自己的系统。docx/pdf/xlsx/kimi-slides 等引擎二进制为 Moonshot 专有许可(禁再分发/逆向),本文仅作行为级描述。报告基于单次分析窗口(约 50 分钟生命周期),软件版本与技能库存随镜像更新可能变化。

采集方式:本轮仅 HTTP 只读(http://127.0.0.1:18080/)。隧道中途断线约 25 分钟、恢复后大文件传输频繁被截断,二进制只做流式 strings 取样 + 部分落盘分析(临时文件已删除)。全部关键文本文件已通读并留存于 /root/kimiagent-analysis/13-raw/。 前置上下文:sections/07-skills-b.md §2.3(docx 速览)、sections/09-skills-d.md §3.1(pdf 速览)。


〇、许可证(先于一切技术评估)

两个技能根目录的 LICENSE.txt 内容相同,是 Moonshot AI Skill License(2026,专有):

“These materials … are the proprietary property of Moonshot AI … may not be reproduced, modified, or redistributed in whole or in part. Reverse engineering, decompiling, or attempting to derive source code from any compiled component is prohibited.

这对移植评估是硬约束:文本部分(SKILL.md/references/scripts)属于”不能复制再分发”,只能”读思路、自己重写”;WIR .so 即使技术上可搬运,也是闭源 + 许可禁止再分发/逆向。下文移植表会据此标注法律风险,与技术可行性分开评价。


一、docx 技能(/app/.agents/skills/docx/)

1.1 结构与体量

docx/
├── SKILL.md                      7.1 KB  路由 + 硬规则 + 质量标准(本文 §1.2)
├── LICENSE.txt                   Moonshot 专有许可
├── references/                   6 份深度参考(合计 ~84 KB)
│   ├── openxml-sdk-reference.md  28 KB  Create 路由:C# 模式/陷阱全书
│   ├── wir-reference.md          34 KB  WIR 编辑接口与规则体系
│   ├── md2docx-reference.md      6 KB   引用管线说明
│   ├── chart-reference.md        8 KB   原生 Word 图表(饼/柱/线)
│   ├── omml-reference.md         4 KB   OMML 数学公式模式
│   └── matplotlib-guide.md       5 KB   Word 做不了的图用 matplotlib
├── scripts/
│   ├── docx                      bash 统一入口(env|init|build|validate)
│   ├── engine/__init__.py + _core.cpython-312-x86_64-linux-gnu.so   ← WIR 引擎 15,340,648 B
│   ├── docx_lib/__init__.py + _core.cpython-312-x86_64-linux-gnu.so ← 校验/修复库 577,320 B
│   ├── validate_all.py           元素顺序修复 + 业务规则校验(调 docx_lib)
│   ├── md2docx/                  6 个 Python 文件(引用→Word 管线,全源码)
│   └── generate_*.py             6 个封面背景"风格参考"脚本(Playwright+SVG)
├── validator/                    .NET 8 自包含 OpenXML Validator
│   ├── Validator.dll             10 KB(入口逻辑)
│   ├── Validator                 72 KB(apphost)
│   ├── DocumentFormat.OpenXml.dll / .Framework.dll / System.IO.Packaging.dll
│   └── Validator.runtimeconfig.json  →  net8.0 / Microsoft.NETCore.App 8.0.0
└── assets/templates/
    ├── Program.cs (839 B) / Docx.csproj (net8.0 + DocumentFormat.OpenXml 3.0.2)
    ├── Example.cs (36 KB) 英文完整示例 / CJKExample.cs (34 KB) 中文示例
    └── obj/  (竟把 NuGet 构建缓存也打包了,工程卫生小瑕疵)

1.2 路由逻辑(SKILL.md Part 1,三路由)

SKILL.md 开篇即路由表,判定条件是”你手里有什么“:

路由触发条件参考文件
WIR已存在 .docx 且格式/样式重要(模板、待编辑/批注/审阅文档)→ 必选首选路径wir-reference.md
md2docxMarkdown 是内容源:Orchestrator/Swarm 产新 docx、用户点名转换、上游(含 Deep Research)交出了 final.md + citation.jsonlmd2docx-reference.md
Create以上都不是 → C# + OpenXML SDK 从零建openxml-sdk-reference.md

关键判据细节(原文证据):

  • “If the .docx is merely a content/data source … just read file to extract text — that is NOT a WIR case” —— 纯数据源的 docx 连 WIR 都不进,直接抽文本。
  • “When a complete final.md and its citation.jsonl are supplied, treat them as the finished content and citation inputs: do not restart research or rewrite the report“。
  • .doc → 先 libreoffice --headless --convert-to docx
  • md2docx 的验证不用 ./scripts/docx validate(那是 Create 路由的),以转换器自身反馈 + 包能正常打开 + 渲染目检为准。

1.3 Create 路由:bash 入口 scripts/docx 怎么工作

  1. 环境自愈find_dotnet 扫 6 个候选路径(dotnet$HOME/.dotnet/dotnet/usr/share/dotnet/dotnet 等);check_dotnet_status 四态(ok/outdated/broken/missing);missing 时自动 curl dot.net/v1/dotnet-install.sh --channel 8.0 装到 $HOME/.dotnet
  2. 固定工作目录 /tmp/docx-work/:init 时把 Docx.csproj + Program.cs 模板拷进去(不覆盖已有),agent 只需编辑 Program.cs
  3. build 管线:编译前检查 → dotnet builddotnet run -- <output>强制验证 → pandoc 统计(字数/图片数,0 图时警告”如果生成了图表,检查 AddInlineImage() 是否被调用”)→ 检测 <w:ins|<w:delword/comments.xml 提示用 --track-changes=all 复查。
  4. 编译错误翻译器 enhance_error:把 C# 编译错误映射成修复建议,例如 CS0103 'WordprocessingDocument' → “Add: using DocumentFormat.OpenXml.Packaging;”;CS1056 → “用 ASCII 引号,不是中文弯引号”。这是”把 LLM 高频错误前置成词典”的典型手法。
  5. 预编译门禁 check_cjk_unicode_abuse:内嵌 Python 扫 .cs 里的 \uXXXX 转义,若命中 ≥50 个 CJK 码位就警告”鉴于 会变 视然”式的码点错乱,要求直接写字面汉字。

验证两段式do_validate):

  • validate_all.py(Python):一次解压做两件事——用 docx_libfix_element_order_in_tree/fix_settings/fix_table_width_conservative/fix_relationship_paths/fix_content_types 原地自动修复(535 条 XSD 元素顺序规则模型记不住也不需要记,直接静默修),再做只读业务规则检查(表格网格一致性、图片宽高比、批注完整性、节边距、命名空间声明、ID 唯一性)。修复前先备份 .bak,重打包按 [Content_Types].xml → _rels → word/_rels → 其余 排序。还把 SDK 偶发把图片放到根 /media/ 而非 /word/media/ 的坑自动挪正。
  • Validator.dll(.NET 8):跑真正的 OpenXML SDK 语义校验(DocumentFormat.OpenXml.Validation),需要 docx 文件本身所以是第二次解压。失败时输出一大段”文档已保存但可能打不开”的醒目提示并退出 1。

角色定位:docx_lib 管”能修就修掉的结构性问题”,Validator.dll 管”修不了必须人/agent 知道的语义错误”,两者互补,都失败即阻断交付。

1.4 WIR 引擎(15.3 MB 闭源 .so)——本技能的灵魂

二进制指纹(实测):

  • 文件名 core.cpython-312-x8664-linux-gnu.so,15,340,648 字节,ELF x86-64,section headers 被剥离file 报 “missing section headers”)。
  • 动态符号含 __pyx_module_is_main_engine___core确定是 Cython 编译产物(模块名 engine._core),不是 Rust/C++ 原生手写。docx_lib 同理(__pyx_module_is_main_docx_lib___core)。
  • NEEDEDlibc.so.6(不链 libpython,运行期解析符号),样本头部 GLIBC 需求 ≤2.14 —— 可移植性意外地好
  • strings 几乎榨不出业务字符串(前 3.6MB 全是代码段),逻辑字符串在更深偏移,隧道质量没支撑完整拉取。

调用方式(bash 入口根本不碰它)scripts/docx 只管 Create/validate;WIR 由 agent 在 Python 里直接 import:

import sys; sys.path.insert(0, '<path-to>/docx/scripts')
from engine import WIRSession
session = WIRSession.open(path)
w1, wir, next_cursor = session.read(part="document")     # 窗口化读
updated = session.edit(w1, [TextEdit(old_string=..., new_string=...)])
session.save(out)

engine/init.py 完整导出表(即全部公开契约): WIRSession, TextEdit, OldStringNotFoundError, EditWarning, open_docx, read_wir, modify_wir, save_docx, DocxPackage, DocxPackageError, CommentsManager, StyleManager, NumberingManager, embed_image, EmbedResult, cm_to_emu, inch_to_emu, latex_to_omml, LatexCompileError, validate_docx, validate_docx_full, validate_wir_window

WIR 概念模型(wir-reference.md 34KB 全文通读):

  • WIR = “Windowed Intermediate Representation”:把 OOXML 归一化成简化 XML(<wfrag v="3"> 根、无自闭合、属性定序、2 空格缩进),按窗口 + cursor 分页读写大文档;part= 可选 document/styles/prototypes/comments/footnotes/endnotes/header:rIdX/footer:rIdX
  • class-first 视图:窗口顶部 <classes> 列出可复用语义类(<class name="heading_2" on="p" hint="Heading 2">),编辑时优先引用类而不是裸 attr;<classes> 只读,改它报 E_CLASSES_METADATA_EDITED,改样式默认值要走 part="styles"
  • TextEdit 锚点编辑:old_string 约 80–400 字符、锚在一个窗口内;一次 edit() 可带 1–3 个局部编辑或 30–80 个批量策略编辑;任一锚失配整批 E_OLD_NOT_FOUND、无部分写入(事务语义)。
  • 结构化能力:表格、TOC(<toc instr="TOC \o "1-3" \h \z \u">)、超链接、脚注/尾注、页眉页脚、<field kind="PAGE"><section> 分节(页面布局/页码/栏数)、<omml latex="E=mc^2"> LaTeX→OMML 内置转换<image><keep> 不透明块克隆(proto="clone:K5")、<ins>/<del> 修订、批注(含 start_text/end_text 段落内精确锚定、CJK 标点归一化匹配、W_COMMENT_ANCHOR_FALLBACK 回退警告)。
  • 错误码体系成文:E_OLD_NOT_FOUND / E_XML_INVALID / E_STYLE_NOT_FOUND / E_LIST_INVALID / E_PROTO_NOT_FOUND / E_URL_INVALID / E_READ_TOO_LARGE / E_NAMESPACE_IGNORABLE_MISSING_USED_PREFIX + 警告 W_MULTI_MATCH_REPLACED_FIRST / W_COMMENT_ANCHOR_FALLBACK,每个都配恢复动作(先停、重读、小批量重试)。
  • 单位纪律:所有 attr 数值用 OOXML 原生单位(半点/twips/EMU),明确禁止套 python-docx 的 Pt()/Cm() 帮助函数

为什么禁 python-docx(Hard Rule #1 原文):”no ad-hoc XML surgery; no python-docx unless a specific WIR operation has failed and you can name the failure“。原因从参考文档可还原:(a) python-docx 的模型层会丢弃它不认识的 OOXML 结构(charts、复杂 DrawingML、修订/批注锚点),模板保真度差;(b) WIR 引擎内建事务性锚点编辑 + 窗口化大文档处理 + 命名空间守卫 + 保存时校验,python-docx 全没有;(c) 统一入口才能统一错误码和恢复协议。禁令留了具名逃逸口:必须能说出哪个 WIR 操作失败才准回退,回退前还要先查 wir-reference.md。

1.5 md2docx 管线(全源码,6 文件 ~45KB)

final.md + citation.jsonl
  → citation_parser.py   T1[^123^]/T2[^123]/T3[123] 三级检测(T3 要求 DB 命中率>50% 且 >5 个才转换)
                         按首次出现顺序重编号 → Pandoc 上标语法 ^N^
                         非数字引用([^Insight6^])转义保原文;缺库 ID 保留 marker + WARNING,绝不静默删除
  → md2docx_convert.py   UTF-8 严格门禁:拒绝非法 UTF-8;检测 latin-1/cp1252 双重编码"恢复出 ≥2 个 CJK 字"
                         直接拒转("修复或重新生成 Markdown,不要做有损回退")
                         pandoc --from=markdown --to=docx → base.docx
  → 按 style 分流后处理:
     footnote: docx_footnote.py  首现→真 footnote 对象,后续→NOTEREF 域交叉引用(\h \f)
     endnote:  docx_endnote.py   同上走 endnotes.xml
     hyperlink: docx_postprocess.py  fldSimple REF 域 → 文末参考文献书签(WPS 兼容唯一场景)
  → 输出 {name}.{style}.docx + .converted.md + .base.docx 中间件

依赖:pandoc + python-docx + lxml(requirements 级,纯开源)。工程亮点:证据指针守恒(任何解析不了的引用 marker 都保留原文并告警,禁止编造映射);docx_utils.py 只给建出来的 note part 注册 relationship/content-type,不动无关部件。

1.6 references 与模板的知识含量

  • openxml-sdk-reference.md 是”陷阱驱动”写作:元素复用 InvalidOperationException、DifferentFirstPage 不存在要用 TitlePage、TableGrid 必须是 Table 的子而非 TableProperties 的、TOC 占位条目要与正文标题 1:1、UpdateFieldsOnOpen 自动刷新、浮动背景 4 命名空间嵌套的 CreateFloatingBackground() 可直接抄、PNG 头字节 16-23 读宽高保持纵横比、每类图给 maxWidthCm 建议表。附色号体系(暖棕/冷板岩/自然绿等低饱和 6 组方向)和”禁纯 #FF0000/#0000FF”纪律。
  • chart-reference.md:原生 ChartSpace 的饼/柱/线三件套 + “饼图加轴=文件损坏”、”线图无 Marker=数据点隐形”这类血泪表。
  • omml-reference.md:OMML 容器子元素顺序表(PreSubSuper 的 Base 在最后这种反直觉点都标了)+”Hidden ≠ absent”(HideDegree=true 但 Degree() 必须存在)。
  • matplotlib-guide.md:反”AI slop”图表哲学——”标题=分析师结论”、视觉权重=信息权重、L 型边框、透明背景补丁;含 adjustText 防撞、双轴、断轴等进阶技巧。
  • CJKExample.cs 头部即”CJK-TRAP #1/#2″清单(中文引号断字符串、中文标点泄露进 C# 语法位)。
  • generate_*.py 六个背景脚本被明确定位为”只读技术参考,禁止直接调用或复用输出“——教 Playwright 截图(794×1123、device_scale_factor=2)+ SVG 滤镜(feTurbulence 纸纹)手法,要求每个文档从零原创背景。

二、pdf 技能(/app/.agents/skills/pdf/)

2.1 结构

pdf/
├── SKILL.md            207 行:只做约束 + 路由表,实现细节全下沉 routes/
├── LICENSE.txt         同上 Moonshot 专有
├── routes/
│   ├── html.md         619 行  HTML 路由(默认,绝对主力)
│   ├── latex.md        399 行  LaTeX 路由(仅用户明示)
│   └── process.md      240 行  已有 PDF 处理
└── scripts/
    ├── pdf.sh          统一 CLI: check|fix|html|latex|process,退出码 0/1/2/3
    ├── setup.sh        环境诊断(含 Playwright↔Chromium 版本兼容性校验),只检查不安装
    ├── html_to_pdf.js  600 行  Playwright + Paged.js 转换核心
    ├── browser_helper.js 408 行  Playwright/Chromium 多路径解析器
    ├── paged.polyfill.js 921,702 B  Paged.js 本地打包(离线兜底,CDN 为 unpkg pagedjs@0.4.3)
    ├── compile_latex.py 363 行  Tectonic 包装(日志过滤 + PDF 统计 + 伪 system-reminder 输出)
    ├── pdf.py + cmd_{form,extract,pages,meta,convert}.py  处理路由 CLI(pikepdf/pdfplumber/LibreOffice)
    └── package.json    仅 {"type":"commonjs"}

2.2 三路由判定(SKILL.md)

路由触发
HTML(默认)一切”做 PDF/报告/论文”请求
LaTeX仅用户明确说 LaTeX/.tex/Tectonic
Process已有 PDF 的抽取/合并/填表等

两个压强技巧:

  1. 正文内嵌伪 <system-reminder>:”You MUST read the corresponding route file before writing ANY code”,把实现细节逼到 route 文件再读一遍(两级渐进披露)。
  2. Markdown-first 交接协议:上游 Deep Research 交出完整 Markdown 时,HTML 只是”表现层投影”——保留章节/表格/图/论断/source ID,不重启研究。引用 marker [^123^]id 键控对 /mnt/agents/.store/citation.jsonl(或随附的 JSONL),引用呈现形式不做硬性规定(内联链接/上标/脚注/尾注/References 节均可),但未解析的 marker 必须保留并告警,”never fabricate or silently delete a source”。

SKILL.md 还内置了写作纪律:涉数据/政策/研究/时效内容必须先搜索;字数约束量化(”3000字”→±20%;”5页”→精确;”>5000字”→≤2x);用户提供大纲时不准增删节、有问题先问用户;简历默认 1 页。引用格式按语言分流(中文 GB/T 7714 带 [J][M][D] 标识符、英文 APA、混排分流)。

2.3 HTML 路由管线(routes/html.md + html_to_pdf.js)

写作纪律(html.md 核心):

html_to_pdf.js 执行逻辑(600 行全读):

  1. browser_helper.resolveChromium():先查 Playwright 默认路径 → 缓存目录(多用户 /home/*/.cache/ms-playwright显式硬编码了 kimi/ubuntu/sandbox/user/app 五个沙箱用户名)→ 系统浏览器;fallback 候选按”revision 与期望值距离”打分选最近的;都没有且允许安装则 npx playwright install chromium。环境变量 PLAYWRIGHT_CHROMIUM_PATH/CHROMIUM_PATH/BROWSER_PATH/PDF_EXTRA_BROWSER_PATHS 可覆盖。
  2. 载入 HTML(file:// + networkidle)→ 预检:扫 <style> 里的 CSS counter 用法并警告;等 Mermaid 全部渲染(waitForFunction 30s + 2s 稳定);检测未渲染的 $...$ 则主动调 renderMathInElement
  3. 自动修复:超过 1000px 高的 break-inside:avoid 元素改回 auto;自定义编号的 <ol> 把 counter 值”烧入” data-counter 属性再注入覆盖 CSS(在 Paged.js 拆 DOM 之前固化编号)。
  4. 注入本地 paged.polyfill.js(缺失回退 CDN)→ 分页稳定轮询:页数连续 3 次(每秒采样)不变才算完,上限 120s。
  5. 导出page.pdf({format:'A4', printBackground:true, preferCSSPageSize:true, tagged:true, scale:1.5}) —— 注意 scale:1.5 是个带 TODO 注释的 workaround(”内容渲染成 ~67% 大小,根因不明,疑似 Paged.js 内部缩放,大量测试验证安全”)。
  6. 导出后审计:溢出元素(scrollWidth>clientWidth+2)、逐页字数(中文字符+英文词)、TOC 页识别(≥5 个 …+数字 模式)、空白页(<50 词)、低内容页(<均值 25%)异常报告。

compile_latex.py:找 ~/tectonic 或 PATH;tectonic -X compile 多轮(交叉引用 2 轮、带 bib 3 轮,单轮 120s 超时);正则过滤 note 级日志,把 Overfull/Underfull hbox、Font shape、Missing character 单列为 Layout Issues;用 pypdf 统计页数/字数/图片数;最后输出一段伪造的 “这些排版问题必须修,不准说’警告不影响输出'”——用输出模拟系统提示词反向约束 agent,是这批技能里最激进的手法。

2.4 Process 路由(pdf.py + cmd_*)

  • 统一 JSON 输出契约:成功 {"status":"success","data":{...}} 到 stdout;错误 {"status":"error","error","message","hint"} 到 stderr;退出码 0/1(参数)/2(文件不存在)/3(解析)/4(操作失败)。
  • cmd_form.py:pikepdf 遍历 AcroForm 字段,区分 text/checkbox(读 /AP./N 状态)/radio(Ff 位 15)/dropdown(Combo 位 17)/listbox;填表时 checkbox 接受 "true"/"false" 字符串自动映射 /Yes|/Off
  • cmd_extract.py:pdfplumber 抽文本/表格(结构化 rows/cols/data),页范围解析器支持 1-3,5,7-9
  • cmd_pages.py:pikepdf 合并/拆分/旋转/裁剪(裁剪框 left,bottom,right,top 单位 pt)。
  • cmd_meta.py / cmd_convert.py:元数据读写(pikepdf)、Office→PDF 走 soffice --headless
  • 明文声明不支持加密 PDF;内存预估 2–3x 文件大小;大文件分档预期(<50MB 正常 / 50–200MB 1–2 分钟 / >200MB 先拆)。

2.5 与 deep-research 的对接

pdf 与 docx 共用同一交接协议:权威输入 = 完整 Markdown + citation.jsonl(每行 {"id":123,"url":...,"page":{"site_name":...}},默认路径 /mnt/agents/.store/citation.jsonl)。两边都要求:不重启研究、不改写正文、marker 按数值 id 精确匹配、未解析保留+告警。差别在呈现:docx 走 md2docx 固定三样式管线(footnote/endnote/hyperlink,带 NOTEREF/REF 交叉引用),pdf 把引用呈现下放给 agent 自由选型。这构成 deep-research → {docx,pdf} 双出口的完整证据链。


三、依赖清单

组件依赖性质
WIR 引擎 .soCPython 3.12 ABI(cpython-312 tag)、x86_64、glibc(样本需求 ≤2.14)、仅 NEEDED libc闭源 Cython 二进制,无外部服务/凭证
docx_lib .so同上同上(577KB)
Create 路由.NET SDK 8(可自动装)、NuGet 包 DocumentFormat.OpenXml 3.0.2(首次联网还原)、python3、pandoc(可选统计)、playwright(可选背景)全开源,但要 dotnet + NuGet 网络
Validator.dll.NET 8 runtime(framework-dependent,runtimeconfig 指明 Microsoft.NETCore.App 8.0.0)闭源编译的入口 dll(10KB 逻辑)+ 官方 OpenXml dll
md2docxpandoc、python-docx、lxml全开源、全源码可见
pdf HTML 路由Node.js、Playwright、Chromium(~500MB)、本地 paged.polyfill.js、KaTeX/Mermaid(CDN 或内联)、CJK 字体或 webfont全开源
pdf Process 路由python3、pikepdf、pdfplumber、LibreOffice(convert)全开源
pdf LaTeX 路由Tectonic 单二进制(首次编译联网拉包)开源

凭证检查:两个技能目录未发现任何密钥/token/硬编码云服务地址;唯一外部网络依赖是公开 CDN/安装源(dot.net、NuGet、unpkg、Google Fonts、tectonic 安装脚本、/mnt/agents/.store/citation.jsonl 是本地文件不是凭证)。


四、工程质量亮点

  1. 路由即心智模型:SKILL.md 只回答”走哪条路 + 不准做什么”,实现细节全部下沉到按需读取的 route/reference 文件(两级渐进披露),还用内嵌伪 <system-reminder> 强制先读 route 再动手。
  2. 确定性引擎兜底 + 静默自愈:535 条 XSD 元素顺序规则不要求模型记——docx_lib 直接静默修;OpenXML Validator 管”修不了的”;pandoc 统计负责”内容有没有少”。编译错误→修复建议词典、CJK \uXXXX 预检门禁都是”把 LLM 高频错误前置成工具链检查”。
  3. 证据指针守恒:md2docx 与 pdf 都明令”解析不了的引用 marker 保留原文 + 告警,禁止编造/删除”——把反幻觉做成了管线级不变量。
  4. 事务式编辑语义:WIR 一批 TextEdit 任一锚失配整批回滚;窗口 + cursor 分页;错误码每个配恢复协议。
  5. 输出端反向约束:compile_latex.py 在 stdout 里伪造 <system-reminder> 逼 agent 修排版警告;html_to_pdf.js 的异常页/溢出报告同理——工具输出被当作下一轮 prompt 来设计
  6. 审美纪律代码化:低饱和色板、禁 emoji/卡片/圆角、封面 11 风格表、matplotlib “标题即结论”、背景脚本”只准学手法不准复用”——把”AI slop”防范写进了技能文件。

五、坑

  • 隧道/环境层面:dotnet、tectonic、Chromium 全要现装现下,首跑分钟级;NuGet 还原要网。
  • Paged.js 的 DOM 重构是 pdf 技能一半禁令的总根源,且 scale:1.5 是根因未明的 workaround(代码里留 TODO),换 Playwright/Paged.js 版本有回归风险。
  • templates/obj/ 被误打包(NuGet 构建缓存进发行目录),说明发布流程没有 hygiene 检查。
  • WIR .so strip 了 section headers + Cython 编译,排查问题时无法符号化;且锁死 CPython 3.12 + x86_64。
  • md2docx 的 T3 [123] 检测依赖 DB 命中率阈值(>50% 且 >5),阈值设计本身可能漏转真实引用——但它选择”宁可不转也不错转”,方向正确。
  • pdf Process 路由明文不支持加密 PDF;LibreOffice 转换保真度依赖本机 soffice 版本。

六、移植评估表

组件对 Hermes 价值对 Kimi Code 价值移植工作量硬依赖 / 风险
WIR 引擎 .so + wir-reference.md——Hermes 目前无文档编辑能力,WIR 是现成的事务式 docx 编辑内核;Python 系 Hermes 可直接 import——Kimi Code 支持 skill 目录,形态天然匹配技术上”拷贝 .so + reference”即可(需 Python 3.12 + x86_64 glibc 环境);但许可是 Moonshot 专有、禁止再分发/逆向 → 合规上不可直接搬,只能照接口语义自研(工作量大)闭源、锁 CPython 3.12 x86_64;无符号;法律风险高
docx_lib 校验修复库中——”静默修 XSD 顺序”思路好思路易仿(order_map + ElementTree 重排),自研中等工作量同上闭源
scripts/docx bash 入口 + Create 路由 references——全是公开知识(OpenXML SDK 陷阱集),自建等价物收益快需重写(许可)但素材全是公开技术;1–2 天可出等效版.NET 8 SDK + NuGet 网络
.NET Validator中——dotnet 官方 OpenXML 校验谁都能搭,它只省了胶水需重写(入口 dll 10KB 逻辑简单).NET 8 runtime
md2docx 管线(6 个 .py)——citation.jsonl→Word 三样式引用是 deep-research 类 agent 的刚需,且全源码源码可见但许可禁止复制;照管线设计重写约 1 天(pandoc + python-docx + lxml)pandoc/python-docx/lxml,全开源
pdf HTML 路由(html.md + html_to_pdf.js + browser_helper.js + paged.polyfill.js)——”HTML+Paged.js 打印”是通用 PDF 工厂,脚本无 Kimi 耦合脚本逻辑透明可仿写;Paged.js polyfill 本身 MIT 可合法再分发(unpkg pagedjs@0.4.3),只重写自家胶水Node+Playwright+Chromium(~500MB);scale=1.5 workaround 有版本回归风险
*pdf Process 路由(pdf.py + cmd_)**中——pikepdf/pdfplumber 薄封装,JSON 契约可借鉴需适配(自家 CLI 规范),工作量小pikepdf/pdfplumber/LibreOffice
pdf LaTeX 路由(latex.md + compile_latex.py)重写工作量小(tectonic 包装 + 日志过滤)Tectonic 二进制 + 首编联网
*generate_.py 背景技术 / 封面风格表**低–中——审美纪律本身比重用代码值钱低–中学思路,零拷贝Playwright
citation.jsonl 交接协议(deep-research→docx/pdf)——最值得抄的是协议而不是代码:”Markdown 为权威源 + 证据指针守恒 + 呈现层自由”需重写(规范文档化即可),工作量极小

一句话:技术层面 WIR .so”能搬”(CPython 3.12 x86_64 + libc 即可跑,无外部服务),但 Moonshot 专有许可明令禁止再分发与逆向,合规路径只有两条——(a) 照 wir-reference.md 的公开接口语义自研等价引擎(WIR 窗口/cursor/TextEdit/错误码都是文档化的);(b) 只搬全开源的 Create/md2docx/pdf 三套路由的思路并用公开依赖重写。对 Hermes 和 Kimi Code 最高性价比的动作是后者 + 抄 citation.jsonl 交接协议。


附:本轮采集留档

  • 全部文本原件:/root/kimiagent-analysis/13-raw/{docx,pdf}/...(SKILL.md、6 份 references、routes、全部脚本源码、LICENSE.txt)
  • WIR .so 部分样本(3.6MB 头部,strings/符号分析用):分析后即删 /tmp/_core*.so;docx_lib .so 完整样本同。
  • 未竟事项:WIR .so 完整 15MB 因隧道反复截断未拉全,业务字符串表(错误码全文、WIR schema 常量)未能离线枚举——但 wir-reference.md 34KB 已把公开语义写全,影响有限。