# De AI Polish

> 检测并修订中文文章正文中的模板腔、姿态腔、隐藏排比、分析型例证同构、重复语义骨架、假排名、固定节拍和其他 AI 化表达，同时保护作者事实、既有标题层级、必要功能性列举、法律术语、Markdown 图片与既有声音。文章完成初稿后、用户要求“去 AI 腔/更像真人/按作者样本改写/检查排比或口吻”时必须使用；无作者样本时只做最小清理，不得凭空注入第一人称、比喻、短句金句或经历，也不得借去 AI 之名重做文章结构。

- Skill: `cat-xierluo/de-ai-polish` (Agent Skill, multi-file: 61 files)
- Install (CLI): `npx skillmds@latest add cat-xierluo/de-ai-polish`
- Raw SKILL.md: https://api.skillmd.com/api/skills/cat-xierluo/de-ai-polish/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Docs & Writing, Coding & Dev Tools
- License: MIT
- Author: cat-xierluo (https://skillmd.com/u/cat-xierluo)
- Updated: 2026-09-09
- Page: https://skillmd.com/skills/cat-xierluo/de-ai-polish

---


# De AI Polish

## 核心立场

去 AI 化不是禁词替换，也不是给文本注入“公众号人设”。按以下优先级处理：

1. **作者事实与判断来源**：不编造经历、感受、材料和立场变化；
2. **段落功能与信息结构**：保护分类、步骤、责任分配和必要重复；
3. **自然表达**：删除姿态、模板、语义稀释和机器节拍；
4. **声音校准**：只有用户提供或明确选择样本时才匹配 voice。

判断一句话时先问它承担什么功能，再问它是否像 AI。词表只用于召回，不能替代通读。

## 职责边界：只修正文，不接管标题结构

`de-ai-polish` 负责正文句子和段落内部的语言表达，不负责文章的信息架构。二级、三级标题及其他 Markdown ATX 标题属于 WeChat Article Writer 或原写作流程的职责范围。

因此默认执行以下边界：

- 保留源稿全部标题行的文字、层级、编号和顺序；不新增、删除、改名、升降级或重排标题；
- 内部段落功能标注、临时分组和问题归纳只用于分析，不能变成成稿里的新标题或编号；
- 正文存在隐藏列表时，在原有标题框架内通过合并、承接、因果、时间或场景重组处理，不为每个分析分组另设小标题；
- 标题本身若有明显模板腔，在报告中标记并建议交给 WeChat Article Writer 处理，本 Skill 不直接修改；
- 用户若另行要求调整标题体系，先完成去 AI 正文修订，再把标题任务交给相应写作 Skill，不把两项职责混成一次改写。

## 使用模式

```text
/de-ai-polish detect @article.md   # 只检测并给出 finding
/de-ai-polish fix @article.md      # 在原文件上修订并执行交付门禁
```

`detect` 只读，不生成快照或修改文件。`fix` 必须执行完整工作流。

## 按需读取参考资料

- 扫描污染模式：读取 `references/pollution-patterns.md`。
- 决定删、合并、恢复列举或重建句子：读取 `references/expression-transformations.md`。
- 处理连续短段、隐藏列表和功能性排比：读取 `references/sentence-rhythm-guide.md`。
- 使用作者样本或本机私有 anchor：读取 `references/personal-style-guide.md`。
- 选择本机私有 anchor：先读取 `assets/local-voice-anchors/config.json`；用户明确给出 ID 时使用该 ID，否则只在用户已经选择 `local_anchor` 时读取 `default_voice_anchor_id`。随后读取同目录下 `<voice_anchor_id>.md`。整个目录只存本机材料，并由项目 `.gitignore` 排除。
- 交付评分：读取 `references/quality-scoring.md`。

不要一次加载无关参考文件。`SKILL.md` 负责流程，细节以对应 reference 为准。

## 启动闸门

### 1. 判定场景

| scene | 默认力度 | 重点 | 保护范围 |
|---|---|---|---|
| `legal_document` | 克制 | 姿态、过程、格式 | 最宽 |
| `wechat_public_comment` | 较强 | 模板、节奏、语义稀释 | 标准 |
| `chat_reply` | 最小 | 谄媚、协作痕迹 | 标准 |
| `general` | 中等 | 全类 | 标准 |

法律文书中的正式语体、程序术语和固定结构默认保留。

### 2. 判定 voice 模式

| voice_mode | 使用条件 | 允许行为 |
|---|---|---|
| `cleanup_only` | 没有作者样本或用户未要求匹配声音 | 只清理和澄清；不得注入人设 |
| `provided_sample` | 用户提供并授权本次使用的样本 | 提取十维 profile 后匹配 |
| `local_anchor` | 用户明确要求使用本机个人声音，且配置与对应文件存在 | 按显式 ID 或本机默认 anchor 的深层 profile 校准 |

本机私有 anchor 不属于公共 Skill 内容。`default_voice_anchor_id` 只是 `local_anchor` 模式内部的缺省选择，不得把普通 `cleanup_only` 请求自动升级为个人声音。不得把样本正文、作者 profile、高辨识短语或本机注册表复制到公开配置、测试 fixture、日志或评测元数据中。

### 3. 写入运行计划

<!-- skill-lint:constraint SCENE-DECLARED-BEFORE-REWRITE -->
<!-- skill-lint:constraint VOICE-MODE-DECLARED-BEFORE-REWRITE -->

`fix` 模式在改写前创建候选外 `run-plan.json`：

```json
{
  "schema_version": 2,
  "scene": "wechat_public_comment",
  "voice_mode": "local_anchor",
  "voice_anchor_id": "my-writing-anchor-v1",
  "protected_spans": []
}
```

约束：

- `cleanup_only` 的 `voice_anchor_id` 必须为 `null`；
- `provided_sample` 使用本次稳定样本 ID，不写样本正文；
- `local_anchor` 使用稳定 slug 作为 `voice_anchor_id`：显式 ID 优先；未给 ID 时，从 `assets/local-voice-anchors/config.json` 读取 `default_voice_anchor_id`。并要求注册项及同目录 `<voice_anchor_id>.md` 均在本机存在；
- 本机 anchor 缺失时停止 voice 校准，回退到 `cleanup_only` 或请用户重新提供样本，不得假装已经读取；
- 不得在改写后倒填 scene、voice 或 Protected Spans。

## 完整工作流

### Step 1：通读、保护与作者证据

完整通读全文，不得只用正则或 grep 检测。先理解文章要解决的问题、核心判断、目标读者和现有语气。

在任何改写前生成双快照：

```bash
python3 scripts/protected_markdown_gate.py snapshot \
  --input <源文件.md> \
  --output <临时目录>/de-ai-protected-lines.json

python3 scripts/heading_preservation_gate.py snapshot \
  --input <源文件.md> \
  --output <临时目录>/de-ai-heading-lines.json

python3 scripts/delivery_gate.py snapshot \
  --input <源文件.md> \
  --run-plan <临时目录>/run-plan.json \
  --output <临时目录>/de-ai-delivery-manifest.json
```

<!-- skill-lint:constraint PROTECTED-SPANS-PRESERVED -->
<!-- skill-lint:constraint PRESERVE-MARKDOWN-IMAGE-LINES -->
<!-- skill-lint:constraint PRESERVE-MARKDOWN-HEADING-LINES -->

把以下内容写入 `protected_spans` 并逐字保护：

- 法条、司法解释、案号、合同条款编号；
- 当事人、机构、律所和公司全称；
- 程序术语、直接引语和正式引证；
- 数值、日期、比例、金额、期限和 URL；
- 用户要求保留的其他字符串；
- 整段 Markdown 图片语法及其所在整行。

同时为需要“作者在场”的关键判断填写 `references/personal-style-guide.md` 中的作者证据卡。材料不足时标记 `AUTHOR_MATERIAL_NEEDED`。不得把一般知识改成“我发现”，也不得编造真实案例或写作经历。

不要把全文反复出现的主题词、核心概念或普通术语登记成要求出现次数完全相同的 `protected_span`，例如文章主题本身的“抽象泄露”。这类词要保持名称一致并保留必要定义，但删除重复段落时允许出现次数下降。若在改写后发现快照误把通用词锁死，不得为了过门禁机械补回；应废弃该次候选，从只读源稿重新选择真实字节不变量并建立新快照，同时记录重启原因。

标题整行属于结构保护项。标题内即使命中模板词，也只记录 finding，不在本流程中改写。

### Step 2：标注段落功能

给每段标一个主功能：`FACT / EXPERIENCE / JUDGMENT / MECHANISM / EXAMPLE / BOUNDARY / TRANSITION / SUMMARY`。

重点检查：

- 连续三段是否都在转场或总结，没有新增事实和机制；
- 每段首句是否用评价词宣布“这一项更重要”；
- 下一段是否承接上一段对象，还是依靠框架提示重新启动；
- 观点是否有来源，推断是否被写成事实。

功能标注只作为改写中间表示，不写入交付正文，也不得转写成新的二级、三级标题或编号。

在扫描和改写前，再建立候选外的**论证脊柱账本**。逐段记录不能被上位总结替代的唯一信息：

```text
源稿锚点：可定位短片段
唯一载荷：该段新增的对象、区分、因果环节、例外、反方、比较、风险放大因素或认识边界
在全文中的作用：它把上一段推进到哪里
处理：逐项保留 / 合并但保留全部载荷 / 可删除的重复
改稿落点：最终段落位置
```

以下内容默认进入脊柱账本：提出核心区分的段落；把一个对象推进到下一条件或后果的中间环节；“风险并不均匀／为什么某一层更危险”一类分布判断；反例、例外、反方与跨领域比较；互不替代的多个放大因素；解释作者为何得出结论的材料或认识边界。

更短、更整齐的上位总结不能替代这些载荷。若源稿先区分风险分布，再解释中间层为何更容易取信，随后列出三个放大因素，改稿不能只留下“法律风险更高”。改写后的每个 `逐项保留` 项都必须有可定位落点；找不到落点就回到源稿恢复机制，而不是在报告中解释已经概括。论证脊柱账本只约束正文，不进入读者正文。

### Step 3：两轮独立扫描

开始前先声明本轮覆盖范围和未覆盖范围。

#### 词汇与模板层

读取 `references/pollution-patterns.md`，扫描姿态、对比、过渡、大词、模糊频次、黑话、强加口语、格式和过程残留。频次只触发复核，不自动决定修改。

#### 结构与段落层

独立扫描：

- 连续相同虚词、疑问词、被动式和短段；
- 每两三段固定出现的短句金句；
- 同一对象的同义词轮换；
- 显式列表被改成隐藏列表；
- `最典型 / 最容易 / 也容易 / 类似的还有`等伪装排比；
- 一组分析例子是否被编辑者逐项扩成同长度、同功能、同收束方式的段落；
- 同一语义关系是否只换了主语、动词或转折词后跨段、跨节重复，例如反复写“工具能完成表层任务，但判断仍需由人作出”；
- 标题承诺“N 层、N 种、N 步”后，正文结构是否被错误打散。

### Step 4：先判定列举功能，再决定保护或重组

不要把所有“有多个项目”的正文都归为功能性列举。先回答两个问题：读者是否需要逐项执行、核对、比较或追踪？项目的顺序、数量或独立边界是否承担文章承诺？

以下结构默认保留显式序号和平行句式：

- 分类、层级、步骤、清单、责任分配；
- 法条、合同条款和固定格式；
- 为核对输入、输出、主体或条件而设置的平行结构。

若多个项目只是共同证明一个判断，读者不需要逐项操作，它们属于**分析型例证组**，不能因为“怕遗漏”就自动扩成连续的“一是、二是、三是”同构段落。按以下顺序处理：

1. 先找源稿已经存在的关系：共同条件、相互影响、冲突、时间先后、风险分配、审查路径或责任主体；
2. 在候选外填写 `references/expression-transformations.md` 的“关系证据卡”，除关系两端各自的锚点外，还必须抄录**关系本身的源稿锚点**；
3. 关系本身的锚点必须在同一处源稿中同时提到两端，或明确让同一个具体变量约束两端。只有 A 的材料和 B 的材料、没有原文连接句时，关系不成立；
4. “必要推论”只允许换一种说法复述源稿已经存在的关系，不能凭专业常识补出时间顺序、程序路径或共同目标。模型自身的法律常识、行业惯例和“通常会怎样”不算源稿材料；
5. 用通过证据卡的关系组织至少两个例子，让后一段承接前一段留下的对象或问题；
6. 若源稿没有足够材料支持关系，只把例子压缩为诚实的一句或一段列举，不虚构客户、案件、谈判过程、审查条件、因果后果或生活场景；
7. 不要求每个例子拥有等长说明、相同段首和相同结论。

关系层不得成为内容扩写许可。不得为了让两个条款“连起来”，新增源稿没有出现的交易联系、履行地点、付款里程碑、程序路径、经营限制、技术使用后果或其他专业分析变量。用户若同时要求补充专业内容，应交给上游写作／研究流程；本 Skill 只在报告中标记 `AUTHOR_MATERIAL_NEEDED`。

关系证据卡、材料充足度、标题或导航保护、扫描范围和评测结论都属于候选外信息。它们只能改变正文的处理结果，不能成为正文内容。最终稿不得出现“按源稿”“源稿的导航仍保留”“材料不足以相连”“不是若干项检查任务”等面向编辑者或评测者的解释；材料不足时，直接保留独立例子或压缩列举，把 `AUTHOR_MATERIAL_NEEDED` 只写入报告。

“换词重复、同功能段落、连续同构、能力边界候选、门禁或阈值”等评测语言也不得进入正文。它们是扫描概念，不是文章概念。

“都属于合同风险”“都要结合具体合作”“都需要判断”“都发生在合作偏离或履行阶段”只是宽泛同类项，不是可写入的关系。真实关系必须满足至少一项：源稿明确用同一个具体变量同时约束两端；一端会改变另一端的解释、效果或处理顺序；源稿明确给出两端的冲突或相互作用。若只有一组关系通过证据卡，就只使用这一组，不为满足数量或段落节奏继续配对。

两端分别有锚点仍不够。例如源稿分别讨论违约金和管辖，不能因此补成“违约发生后进入诉讼，管辖继续影响程序”；源稿分别讨论知识产权使合作难以继续、解除条件影响退出，也不能自动合成“围绕合作继续或退出”的共同关系。除非源稿本身把两端放进同一关系句，否则让它们在同一段各自成立即可。

一个实用判断是：删去某一项会不会破坏分类或操作完整性？会，通常是功能性列举；只会减少一个论据，通常是分析型例证组。这个判断优先于项目数量和原稿是否已有序号。

不要为避免“排比”把“一是、二是、三是”改成“最典型、最容易、也容易”。如果内容本来就是列表，恢复序号；如果作者希望叙事，则必须按真实场景、因果或时间重组，不能只改段首。

恢复正文中的显式序号不等于新增标题。原稿没有小标题时，不得把每一项升级为 `##` 或 `###`；原稿已有标题时，标题行原样保留。

保护列举形式不等于认可分类逻辑。若各项不在同一分类尺度、粒度不一致，或两套“N 分法”被强行宣称一一对应，标记 `STRUCTURE_REVIEW` 并说明错位；除非用户同时授权论证重构，否则去 AI 流程只报告，不擅自发明新分类。

### Step 5：执行最小充分改写

在既有标题框架内按问题选择操作：

1. 删除没有独立信息的姿态句；
2. 合并同义判断和连续短段；
3. 把抽象评价改成对象、条件和后果；
4. 恢复被误伤的显式列举；
5. 把分析型例证从逐项同构改为由真实关系推动的段落；
6. 基于用户提供的材料重建经验段；
7. 仅在必要时重写整句或整段。

不要把禁词替换成固定同义词。不要为了长短句变化拆坏条件、例外和结论之间的联系。具体操作读取 `references/expression-transformations.md`。

不得把“重写整段”扩大为重做章节导航。正文改得再自然，只要标题行被新增、删除、改名、升降级或重排，就属于越界修复。

### Step 6：按 voice 模式校准

- `cleanup_only`：保留源稿已有语气，不新增第一人称、反问、比喻、对话感和短句配额。
- `provided_sample`：读取授权样本，提取十维 profile 和反例；只匹配适合当前场景的维度。
- `local_anchor`：读取指定的本机私有 anchor；学习判断来源、不确定性、段落动力和功能性列举，不复制原句、事实或场景专属主语。

作者样本不能弥补内容不足。Voice Calibration 只调整表达，不制造事实深度。

声音校准也不得提高判断强度。逐项比较源稿与改稿的确定性：`我不这么看 / 我仍有保留 / 可能 / 未必 / 取决于`不能被改成`这个判断错了 / 下得太早 / 必然 / 决定 / 一定会`；源稿没有频率范围时，不新增“已经不算少见、越来越多、通常如此”。VoiceAnchor 提供的是判断方式，不是把文章立场写得更响亮的许可证。

启用 `provided_sample` 或 `local_anchor` 时，改写后运行新增重合门禁。它只拦截相对源稿新出现的长连续重合，不把源稿本来已有的共同表述算成复刻，也不在默认输出中打印私有短语：

```bash
python3 scripts/voice_anchor_copy_gate.py \
  --source <源文件.md> \
  --final <最终文件.md> \
  --sample <作者样本或本机 anchor.md> \
  --min-chars 14
```

### Step 7：修复伪影复扫

改写后单独执行一轮反向检查：

- 是否把清楚列表改成假排名或隐藏列表；
- 是否从旧禁词逃到新口癖；
- 是否强加第一人称、比喻、口语或短句金句；
- 是否编造作者经历、感受、讨论或判断变化；
- 是否复制 voice anchor 原句、高辨识短语或事实；
- 是否为了“自然”损坏专业准确性、必要重复和段落逻辑；
- 是否把分析型例证组逐项扩成等长、同功能、同收束方式的段落；
- 是否为建立关系层新增了源稿没有的变量、审查条件、因果或后果；关系证据卡是否能定位到两端源稿锚点；
- 是否出现三个以上功能相同、句式近似的段落开头；
- 是否跨段、跨节反复使用同一个语义关系骨架，只替换了任务名和转折词。
- 是否把源稿的保留、可能性或未知改成更强的裁断、频率和必然后果。
- 是否把内部分析分组写成了新标题，或改动了原有标题的文字、层级、编号和顺序。
- 是否把“源稿、导航保留、材料不足、关系证据卡、扫描或交付”等候选外过程写进了读者正文；证据不足必须表现为克制处理，而不是向读者解释修订过程。
- 是否保留或新增“先承认一个前提”一类通用框架启动语，而没有直接进入事实或判断。
- 是否通过省略 AI 主语、把限制改成“另一项工作／难点在于／只对应”，让同一能力边界逃过复扫。
- 是否把多处重复判断压成“X 的是 A，不是 B”“工具退场／走到边界，留下判断与责任”等短金句；压缩不是去重，结尾只保留一个由前文自然抵达的完整结论。
- 最后一节是否在解释价值、后续任务和责任后，又用同一组名词压缩总结一次；先给末节逐段标 `JUDGMENT / MECHANISM / CONSEQUENCE / SUMMARY`，只允许一个 `SUMMARY`，其他段落必须提供新的对象或机制。
- 是否保留“AI 最危险／可怕／重要的时候，是……”等脱离新增机制的传播金句；源稿已有也不自动受保护，重复前文时应删除。
- 是否把“入口顺滑”换成“更低的入口／低摩擦入口”等抽象入口隐喻；应直接写“不必从空白文档开始、启动成本下降、可以更早讨论”等实际变化。
- 同一篇正文是否跨三段以上反复使用“入口／门槛／进入／回到内部／穿透／退场”等空间图式；中心概念最多保留一至两处必要解释，其余改成事实、审查动作和后果。
- 论证脊柱账本中的每项唯一载荷是否都能在最终稿定位；是否用一个上位摘要替代了风险分布、中间机制、反例或多个放大因素。

发现修复伪影时回到 Step 2—5，不得继续同义替换。

对“工具能力 → 转折或限制 → 人的判断／经验／责任”这类高频骨架，再运行启发式复检。脚本同时观察显式主语，以及“初稿／外观／措辞完整／填空／规则复述／建议自洽”等隐式能力端。

原始候选只用于扩大召回，不是删除配额。紧跟“第 N 层／第 N 种／第 N 步”等显式导航标签的说明项单独列为 `functional_navigation_item`，不计入普通正文硬阈值；这些段落本来就承担逐项区分功能。豁免只保护分类结构，不保护同义复唱：若五项都以同一个“表面可做—仍需人类判断”收束，仍须人工改写为各自的对象、条件、机制或后果。

公众号评论对普通正文使用四道硬门禁：全文计数候选不超过 6，单节不超过 2，相邻同功能候选最多 1 个，最后一节最多 1 个。不要为了降计数，把包含具体对象、判断来源、条件和后果的段落压成无主语摘要；独立机制应保留，重复的是段落功能和收束方向，不是文章讨论“错误、限制或判断”本身。脚本失败必须继续修订，不能用报告中的人工归并覆盖；脚本通过后仍须人工检查功能性导航项是否真的各有机制。

```bash
python3 scripts/semantic_repetition_gate.py \
  --file <最终文件.md> \
  --max-count 6 \
  --max-per-section 2 \
  --max-final-section 1 \
  --max-adjacent 1
```

### Step 8：标点修正

只在正文改写完成后运行：

```bash
python3 scripts/fix_punctuation.py <文件路径>
```

脚本必须跳过 YAML、代码块、行内代码、URL、Markdown 链接和 Markdown 图片整行。图片行发生任何变化都视为失败。

### Step 9：评分与交付门禁

读取 `references/quality-scoring.md`，按自然度、节奏感、专业度、个性度和精炼度评分。解释口径：

- 节奏感评价信息推进是否自然，不奖励固定长短句序列；
- 个性度在 `cleanup_only` 下评价是否保住源稿声音，在 voice 模式下评价 profile 匹配；
- 总分不能覆盖修复伪影、虚构作者材料或功能性列举受损。

<!-- skill-lint:constraint QUALITY-SCORE-GATE-PASSED -->

生成绑定最终文件 SHA-256、scene、voice mode、anchor ID 和分数的 `score-receipt.json`，再运行：

```bash
python3 scripts/protected_markdown_gate.py verify \
  --manifest <临时目录>/de-ai-protected-lines.json \
  --final <最终文件.md>

python3 scripts/heading_preservation_gate.py verify \
  --manifest <临时目录>/de-ai-heading-lines.json \
  --final <最终文件.md>

python3 scripts/delivery_gate.py verify \
  --manifest <临时目录>/de-ai-delivery-manifest.json \
  --final <最终文件.md> \
  --score-receipt <临时目录>/score-receipt.json

python3 scripts/style_regression_gate.py <最终文件.md>
```

只有图片保护、标题保护、交付绑定以及假排名、编辑过程泄漏、框架启动语和压缩金句逃逸回归门禁均退出 0；启用 voice 时新增重合门禁退出 0；语义骨架复检和人工关系层复扫没有未处理项，才可交付。

## Detect 输出格式

每条 finding 至少包含：

```text
锚点：原文位置或短片段
段落功能：该句本应承担什么
主污染类型：七类之一
问题：为什么像模板、隐藏列表或修复伪影
读者影响：会造成何种理解或信任问题
处理：删除 / 合并 / 直接陈述 / 补足 / 恢复结构 / 作者补料
```

不要只报“命中某词”。保留项写明功能和理由。

## 完成边界

- 脚本门禁只能证明候选绑定、保护项和评分步骤得到执行，不能证明主观评分正确。
- 标题保护门禁只证明 ATX 标题行的文字、层级、编号和顺序未变，不证明原有标题体系本身合理；标题结构优化属于其他写作 Skill。
- 分析型例证与功能性列举的区别依赖文章任务，不能只靠序号或正则判断。
- 语义骨架和长连续重合门禁只能召回已知风险，不能替代通读，也不能证明没有语义模仿或事实污染。
- 正则回归只能拦截已知修复伪影，不能替代通读。
- 缺少作者材料时明确报告 `AUTHOR_MATERIAL_NEEDED`，不要声称已经获得真情实感。
- 未执行真实改写或没有最终文件时，不生成虚假评分回执。

