← 返回主报告: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 |
| md2docx | Markdown 是内容源:Orchestrator/Swarm 产新 docx、用户点名转换、上游(含 Deep Research)交出了 final.md + citation.jsonl | md2docx-reference.md |
| Create | 以上都不是 → C# + OpenXML SDK 从零建 | openxml-sdk-reference.md |
关键判据细节(原文证据):
- “If the .docx is merely a content/data source … just
read fileto extract text — that is NOT a WIR case” —— 纯数据源的 docx 连 WIR 都不进,直接抽文本。 - “When a complete
final.mdand itscitation.jsonlare 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 怎么工作
- 环境自愈:
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。 - 固定工作目录
/tmp/docx-work/:init 时把Docx.csproj+Program.cs模板拷进去(不覆盖已有),agent 只需编辑Program.cs。 - build 管线:编译前检查 →
dotnet build→dotnet run -- <output>→ 强制验证 → pandoc 统计(字数/图片数,0 图时警告”如果生成了图表,检查 AddInlineImage() 是否被调用”)→ 检测<w:ins|<w:del和word/comments.xml提示用--track-changes=all复查。 - 编译错误翻译器
enhance_error:把 C# 编译错误映射成修复建议,例如CS0103 'WordprocessingDocument'→ “Add: using DocumentFormat.OpenXml.Packaging;”;CS1056→ “用 ASCII 引号,不是中文弯引号”。这是”把 LLM 高频错误前置成词典”的典型手法。 - 预编译门禁
check_cjk_unicode_abuse:内嵌 Python 扫.cs里的\uXXXX转义,若命中 ≥50 个 CJK 码位就警告”鉴于 会变 视然”式的码点错乱,要求直接写字面汉字。
验证两段式(do_validate):
validate_all.py(Python):一次解压做两件事——用docx_lib的fix_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)。 NEEDED仅libc.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 的抽取/合并/填表等 |
两个压强技巧:
- 正文内嵌伪
<system-reminder>:”You MUST read the corresponding route file before writing ANY code”,把实现细节逼到 route 文件再读一遍(两级渐进披露)。 - 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 核心):
- 禁止页面自己加载 Paged.js(转换脚本自动注入,重复加载页数翻倍);Paged.js 重构 DOM(
.pagedjs_page→sheet→area→content)这件事是全篇约束的总根源:- 禁一切 CSS counter(counter-reset/increment/content:counter())→ 编号全用
data-label属性 +content: attr(data-label),或手写; - 封面背景图禁 CSS
background-image,必须<img>+ absolute + object-fit; - 目录页码用
target-counter(attr(href url), page)+leader('.'),TOC 条目必须; - Mermaid SVG 超页高会炸分页 →
flowchart LR默认、subgraph≤3、总节点≤12、复杂图改”表格+简图”。
- 禁一切 CSS counter(counter-reset/increment/content:counter())→ 编号全用
- 禁 JS 动态图表库(ECharts/Chart.js/D3/Plotly),数据图一律 matplotlib 预生成
<img>,且必须横向 figsize。 - 全出血封面 CSS 三件套:
body{margin:0}+@page :first{margin:0}+.cover{margin:0;width:210mm;height:297mm},缺一个就”左上细白边”。 - 页眉
string-set防空:”body 先string-set: doctitle "",h1 再覆盖”,防出现 “undefined”。 page-break-inside: avoid只保护原子小组件,大容器用了会整页空白。- 垂直居中禁
line-height,一律 flexbox。防溢出统一规则表(max-width:100%、text-align-last:left、a{word-break:break-all}等)。 - 学术默认风:禁卡片/仪表盘/圆角/阴影/emoji,三线表、定理盒(左边条)、
#f5f5f5代码底。封面 11 种风格表(Muji/Bauhaus/Swiss/渐变丝带/双线框…)。
html_to_pdf.js 执行逻辑(600 行全读):
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可覆盖。- 载入 HTML(file:// + networkidle)→ 预检:扫
<style>里的 CSS counter 用法并警告;等 Mermaid 全部渲染(waitForFunction 30s + 2s 稳定);检测未渲染的$...$则主动调renderMathInElement。 - 自动修复:超过 1000px 高的
break-inside:avoid元素改回 auto;自定义编号的<ol>把 counter 值”烧入”data-counter属性再注入覆盖 CSS(在 Paged.js 拆 DOM 之前固化编号)。 - 注入本地
paged.polyfill.js(缺失回退 CDN)→ 分页稳定轮询:页数连续 3 次(每秒采样)不变才算完,上限 120s。 - 导出:
page.pdf({format:'A4', printBackground:true, preferCSSPageSize:true, tagged:true, scale:1.5})—— 注意scale:1.5是个带 TODO 注释的 workaround(”内容渲染成 ~67% 大小,根因不明,疑似 Paged.js 内部缩放,大量测试验证安全”)。 - 导出后审计:溢出元素(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 引擎 .so | CPython 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 |
| md2docx | pandoc、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 是本地文件不是凭证)。
四、工程质量亮点
- 路由即心智模型:SKILL.md 只回答”走哪条路 + 不准做什么”,实现细节全部下沉到按需读取的 route/reference 文件(两级渐进披露),还用内嵌伪
<system-reminder>强制先读 route 再动手。 - 确定性引擎兜底 + 静默自愈:535 条 XSD 元素顺序规则不要求模型记——docx_lib 直接静默修;OpenXML Validator 管”修不了的”;pandoc 统计负责”内容有没有少”。编译错误→修复建议词典、CJK
\uXXXX预检门禁都是”把 LLM 高频错误前置成工具链检查”。 - 证据指针守恒:md2docx 与 pdf 都明令”解析不了的引用 marker 保留原文 + 告警,禁止编造/删除”——把反幻觉做成了管线级不变量。
- 事务式编辑语义:WIR 一批 TextEdit 任一锚失配整批回滚;窗口 + cursor 分页;错误码每个配恢复协议。
- 输出端反向约束:compile_latex.py 在 stdout 里伪造
<system-reminder>逼 agent 修排版警告;html_to_pdf.js 的异常页/溢出报告同理——工具输出被当作下一轮 prompt 来设计。 - 审美纪律代码化:低饱和色板、禁 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.md34KB 已把公开语义写全,影响有限。