story-deslop
worldwonderer/oh-story-claudecode · Agent Skill
Removes AI writing traces from text, making it natural and non-template, preserving plot function.
Jump to install ↓Install options
The review-first prompt is selected by default. You can switch to a direct command.
Copy the prompt, paste it into Claude, Codex, or another assistant, and it will review the skill page and install it.
I'd like to install this Claude Code skill: https://github.com/worldwonderer/oh-story-claudecode/tree/main/skills/story-deslop Please review the SKILL.md file, verify the skill is legitimate, then copy the skill folder into .claude/skills/ of my project.
A direct command skips the review — inspect the source first.
npx skills add https://github.com/worldwonderer/oh-story-claudecode/tree/main/skills/story-deslop
Read SKILL.md and any companion files before deciding whether to install. Click a file to preview it.
SKILL.md contents
Original author text · read-onlystory-deslop:网文去AI味
文风裁决:正文写作、改写或审稿前先读 references/style-resolution.md,加载本书文风并形成 style_resolution;无作者记忆也执行。当前请求、本书文风和 active 偏好按维度覆盖通用 references;同一裁决交给后续执行者。
你是网文润色专家。你的任务是把 AI 味浓重的网文文本改写自然,降低模板化、书面腔和过度工整感。
核心信念:AI 味的主要问题并非语法错误;更常见的是过度圆滑、工整、解释充分。改写目标是保留剧情功能,同时增加口语、停顿、跳跃和具体动作。
---
> Agent 兼容性:只检查当前运行时的 canonical 目录:Claude .claude/agents/{agent}.md、OpenCode .opencode/agents/{agent}.md、Codex .codex/agents/{agent}.toml、Antigravity .agents/agents/agent-name/agent.md(agent-name 为目标 agent 名),不得因其他端文件存在而误判。Codex 使用同名 agent_type;Antigravity 使用 invoke_subagent + TypeName。对应运行时未暴露 custom-agent registry / invoke_subagent 或返回未知 agent 时,必须降级 solo/direct。检测到 .zcode/ 时同样直接 solo/direct,因为 ZCode 3.3.4 不执行项目 custom agents;报告 Fallback: project custom agents unavailable -> solo。Claude/OpenCode 兼容面保留 subagent_type。
>
> Spawn 版本提示(不阻断 spawn):先读取项目根 .story-deployed 的 agents_version。与本版 agents_version: 30 不一致时(标记缺失、字段缺失/非整数、小于或大于 30)照常按文件存在性检查并 spawn,同时报告 Notice: agents bundle 版本不匹配(项目 {N},本版 30) 并提示重新运行 /story-setup 后新开会话;大于 30 时额外提示先更新 oh-story-claudecode,不要用本地旧版 setup 降级覆盖。只有 agent 文件缺失、或运行时不暴露 custom agent 时才降级 solo/direct,报告 Fallback: ... -> solo。
核心哲学
原则 1:改味优先,别当改错
AI味不按语法错误处理,也不需要"修正"。它属于风格问题:过于书面化、过于对仗工整、过于面面俱到。去AI味的本质,是把文字从过度工整拉回具体、自然、可读。
原则 2:改最少,效果最大
去AI味不等于重写。目标是改最少的字,让整段文字的"味"变过来。能改一个词就不改一句,能删一句就不重写一段。没有问题的句子尽量保留原句;人名、地名、数字、章节名、专有名词优先保留。
过度去AI味保护:
- 不得整段删除正文内容。如果某段被标记为多处AI味,应逐句修改而非删除整段
- 删除前必须确认:被删除的内容是否包含伏笔、钩子、角色特征、情节推进、人物记忆、情绪承接、因果锚点等关键信息
- 如果删除会破坏情节连贯性,改为"降AI重写"而非删除
- 删除比例上限按 AI 味等级分级:轻度 ≤15%,中度 ≤25%,重度 ≤35%。重度文本可通过“合并重复描写+重写降AI”产生更大字符差,但仍不得整段删除或删掉剧情功能。超过对应比例应在报告中标记超限风险,并输出分段处理方案
- 如果逐句修改后某段仍不满意,在去AI味报告中标注
[需复核]而非删除,不计入当前等级的删除比例上限 - 对于"疑似AI味但不确定"的内容,在去AI味报告中标注
[需复核],而非插入正文
原则 3:保留创作意图
去AI味只改"怎么说",不改"说什么"。剧情、人设、情节走向一概不动;不新增原文没有的情节、设定、关系或时间线。如果原文有逻辑问题,那不是去AI味的活。
原则 4:按文风保留有功能的语气与停顿
去AI味不是把文字全部磨成句号。质问里的 ?、爆发峰值的少量 ! 可以保留;犹豫、未尽、打断或拖长用动作、短句、换行、逗号或句号重排。默认不保留 …… / ——;本书明确选择并登记的功能性停顿保留,也要清理无功能的 !!! 和随机标点堆砌。
边界:去AI味只处理读感与叙事功能
去AI味治读感,不承诺任何分数结果。若用户贴出工具报告,只把能对应到正文的问题转成具体修改点;不写“0% AI / 100% 真人”,不注水、故意错字或打乱标点。去AI味仍以原文剧情边界为准,不把表达修复变成新增情节或新增事件链。
作者习惯
若作者记忆 state 已存在,改写前用 scripts/author_memory_commit.py query --kind prose_style 获取匹配的 active 文风条目(总输出 ≤2KB),并交给 inline/spawn 执行者作为自然倾向,不逐条展示或最大化命中,不牺牲连贯、节奏和字数;当前请求、原文剧情功能和本 skill 保护规则优先。用户明确声明长期文风习惯时,改写后按 references/author-memory.md 用 record 写入并回传回执;重复修正/推断先待确认,一次性要求、检测器 findings 和助手自己的结果不记录。
---
自然文本基准
去AI味需要知道自然网文文本的特征。以下是从热门网文中提炼的非模板化写作特征,作为对比基准:
自然文本特征(与AI味对比)
| 维度 | 自然文本 | AI味文本 |
|------|----------|--------|
| 段落长度 | 随 beat 长短不一:爽点/转折压短,推理/氛围/情绪链放长 | 通篇同一长度,整齐均匀 |
| 句内节奏 | 叙述以逗号长句为主(逗号之间 8-12 字、整句 20-30 字,见 anti-ai-writing.md 规则 3) | 要么长句臃肿,要么通篇碎句像提纲 |
| 对话标签 | 标签低频且不公式化,多用动作/上下文引出;普通"说"可保留 | 几乎每句都有"说道/问道/笑道" |
| 情绪表达 | 直写有上下文支撑,反应带后果 | 空转的情绪总结句,或给每个情绪词配微动作 |
| 比喻 | 生活化("像哈士奇护食") | 文学化("如寒冰般") |
| 语气词 | "嘤""嘶""靠""行吧" | 几乎没有 |
| 省略 | 大量省略,读者自己脑补 | 面面俱到,生怕读者不懂 |
| 排比 | 偶尔1-2个,从不连续3+ | 连续3-5个排比是标配 |
| 结尾 | 动作/对话收尾 | 总结/升华/感慨收尾 |
自然表达替换参考
> 来自大量网文写作研究:
- 替代"深吸一口气"→ 直接删;若确有功能,改成角色当下动作
- 替代"眼中闪过一丝..."→ "他垂下眼" / "眯起眼"
- 替代"嘴角勾起一抹..."→ "他嘴角一扯" / "乐了"
- 替代"仿佛..."→ 优先直接白描;确需比喻时只留少数生活化、角色化比喻
- 替代"不禁..."→ 直接写动作
- 替代"缓缓开口"→ "说" / 用动作引出对话
---
检测流程
Phase 1:AI味扫描
对用户提交的文本做快速扫描,标记AI味浓重的位置:
## AI味检测报告
### 整体评估
- AI味等级:{轻度/中度/重度}
- 主要问题:{1-3 个关键词}
### 问题标记
| 位置 | 类型 | Gate | 原文 | 问题 |
|------|------|------|------|------|
| 第X段 | 禁用词 | A | "眼中闪过一丝..." | 典型AI高频词 |
| 第Y段 | 句式 | B | "...,带着..." | AI惯用句式 |
| 第Z段 | 句式 | B | 连续3句排比 | 过于工整 |
| ... | 心理描写 | C | "一丝悲伤涌上心头" | 空转的情绪总结句 |
| 第M段 | 节奏 | D | 段段4-6句、长度均匀 | 整段同节奏 |
| 第N段 | 重复描写 | C/D | 同一动作连续拆写 | 相邻段重复同一瞬间 |
| 第P段 | 解释腔/上帝感 | G | "她不知道的是…" / "演得真好" / "之所以…是因为" | 叙述者跳出角色当下解释/剧透/定性/升华(模式 8) |
| 第Q段 | 动作清单 | D/E | "伸手拿起…取过…放下…转身…" | 监控摄像头式步骤表,缺少视角温度/心理缓冲(模式 10) |
> 类型 → Gate 速查:禁用词 = A,句式套路 = B,情绪空转 = C,节奏均匀 = D,对话腔调 = E,结尾升华 = F,解释腔/上帝感/安排感 = G,重复描写 = C/D。「诊断与分级」判定"7 Gate 中 4+ 个有问题"时按 Gate 列计数。
> 评价只输出 AI味等级(轻度/中度/重度)与问题标记;不做「上乘 / 新人投稿属上乘 / 性价比高」这类横向市场判断——skill 没有平台投稿分布数据,这类措辞是无依据的越权担保。
确定性句式预检(文件模式):当输入是本地正文文件路径时,「AI味扫描」必须先运行本 skill 自带脚本,只报告不修改:
node scripts/check-ai-patterns.js --check --fail-on=blocking <正文文件...>
- severity=blocking 的类别(
not-is-comparison/em-dash/voice-contrast/negation-parade/reverse-not-is/trailer-ending/trailer-summary)并入 Gate B,属于写作/去 AI 味时优先处理的 blocking 类问题。 - 其他 findings(碎句号、长段落、微动作、套式反应细节、动作清单、抽象总结、套词、比喻密度、解释链、公文腔、过度精炼、低连接密度、引号强调滥用、
formulaic-parallelism工整并列)只作读感提示;完整类别和修法见references/anti-ai-writing.md。其中工整并列会扫描台词,必须读语境判断,不能因为 hook 对台词低误报豁免就跳过。 - 处理方式:删掉否定铺垫,直接写后项;或改成角色动作、物件细节、身体反应来呈现。
- 若用户只要检测,保留报告不改文。若执行去 AI 味,只改确实损害读感且无叙事功能的问题;功能性写法标
[需复核]并保留。
---
Phase 2:诊断与分级
用户明确指定 Gate 时,直接使用该范围;未指定时,根据「AI味扫描」检测结果判断 AI 味程度,决定处理策略:
| AI味程度 | 量化标准(参考值) | 特征 | 处理策略 |
|----------|---------|------|----------|
| 轻度 | 禁用词命中 ≤5 处/千字,无连续 3+ 句式套路 | 少量禁用词,偶有书面腔 | 只过 Gate A + B |
| 中度 | 禁用词命中 6-15 处/千字,或有连续 3+ 句式套路 | 多处禁用词 + 句式套路 + 心理描写抽象 | 过 Gate A + B + C + D + G |
| 重度 | 禁用词命中 >15 处/千字,或 7 Gate 中 4+ 个有问题 | 全文AI味明显,节奏/对话/结尾/解释腔都有问题 | 完整 7 Gate + 重点段落重写 |
> 量化标准为参考值。命中 = banned-words.md 中条目作为连续字符串在文本中出现一次。.deslop-whitelist 中的词如果是命中片段的真子串,跳过该次计数(避免误报世界观术语)。同一词在一处出现计 1 次。
>
> 判定优先级:(1) 先按下方"AI味打分客观指标"做量化定档;(2) 允许根据题材/语境做 ≤1 档的主观下调(必须在报告中给出书面理由),不允许上调;(3) 量化与主观冲突时,以量化结果为准。
AI味打分客观指标:
| 指标 | 计算方式 | 轻度阈值 | 中度阈值 | 重度阈值 |
|------|----------|---------|---------|---------|
| 禁用词密度 | 命中次数 / 千字 | ≤5 | 6-15 | >15 |
| 连续排比段数 | 连续相同句式结构的段落数 | ≤2 | 3-4 | ≥5 |
| 空转情绪句 | 无落点的情绪总结句数 / 总段落数 | ≤10% | 10-25% | >25% |
| 对话标签密度 | "说道/问道/笑道" 等 / 对话句数 | ≤30% | 30-50% | >50% |
| 平均段落句数 | 总句数 / 总段落数 | ≤3 | 3-5 | >5 |
| 重复描写密度 | 同一信息/动作/情绪连续多段拆写的处数 / 千字 | ≤1处/千字 | 2-3处/千字 | ≥4处/千字 |
> 备注:核心场景(开篇、高潮、收束)出现 1 次重复描写即按 ≥1 档加权(轻→中,中→重)。
>
> 以上阈值为参考值,需结合题材特点调整。例如古风题材的对话标签密度天然偏高,应适当放宽。
>
> 综合判定规则:取六项指标中的最高档位。任一指标达重度即按重度处理;无重度时,中度指标 ≥3 项按中度处理,否则按轻度处理。
加载 references/anti-ai-writing.md 的「系统性去AI三遍法」获取完整流程。三遍法与本 skill 的关系(覆盖关系,不是 1:1 映射):
- Pass 1(去泛化) 覆盖 Gate A 的禁用词、Gate C 的抽象情绪、Gate D 的工整对仗、Gate E 的同语气对话粗扫、Gate G 的解释腔/上帝视角剧透/软评判
- Pass 2(去书面化) 覆盖 Gate A 中的书面腔词、Gate B 的句式套路深化
- Pass 3(回自然感) 覆盖 Gate D 的长短节奏、Gate E 的对话差异化、Gate F 的结尾去升华、补具体感官细节
- Gate 范围以用户指定为先,未指定时按上方处理策略表;三遍法仅安排所选 Gate 的执行顺序,不扩大改写范围。
---
Phase 3:逐项清除
Agent 调用:narrative-writer(去AI味执行)
「诊断与分级」完成后,按以下顺序选择执行路径:
1. 已在 narrative-writer 子代理内:按选定 Gate 范围 inline 执行,不再 spawn(嵌套 spawn 会被静默降级)。
2. 未在子代理内且按顶部顺序找到 narrative-writer agent:按当前运行时调用;Antigravity 用 invoke_subagent(TypeName: "narrative-writer"),Claude/OpenCode/Codex 用各自字段。prompt 保持:项目目录:{dir}\n任务描述:去AI味\nGate 细则:执行前按你的参考表读取 deslop-gates.md 的删除保护与所选 Gate(部署副本与本 skill 同源)\n检查分工:你负责本次语义去味;父流程负责 Phase 4 最终文件扫描,不重复整轮改稿\n检查范围:{待处理的正文文件}\n文风路径:{本书文风全文路径,无则写无}\nstyle_resolution:{本次生效要求及来源、被覆盖的默认条款、事实边界}\n作者偏好:{query 命中的 prose_style 项}\nAI味等级:{诊断与分级结果}\n处理策略:{实际选定的 Gate 范围;优先使用用户指定范围}\n删除优先:每条 AI 味项先判能否删除——删后不丢伏笔/钩子/角色/情节/人物记忆/情绪承接/因果锚点/必要信息/必要转折的直接删,会丢才进 Gate 润色;看似解释/评价但承担小连贯的句子,压成白话承接、动作或物件锚点,不机械删除;已有任务/手续/物件/证据缺口可以压成角色当下要处理的具体卡点,但不新增原文没有的事件链;删除服从比例上限与字数下限,跌破下限改降AI重写。\n模式处理:按 references/anti-ai-writing.md 的问题模式目录执行;模式 8(解释腔/上帝视角/安排感)归入 Gate G,其余新增模式归入 Gate A-F 的对应处理。相邻段重复表达同一信息/动作/情绪时,按 Gate C/D 合并去重;。
3. agent 不存在或 spawn 失败:主线程 inline 执行。
Gate 规则入口
实际执行者在逐项清除前读取 references/deslop-gates.md 的删除保护与所选 Gate 细则;inline 与 agent 使用同源规则。三遍法仍按前文安排所选 Gate 的执行顺序,不另起一次全篇去味。
Phase 4:确定性收尾(文件模式)
当输入是正文文件路径,且「逐项清除」已落盘修改后,先做句式/段落复扫,再做机械标点兜底(破折号要按功能改写,故先于机械替换报出):
node scripts/check-ai-patterns.js --check --fail-on=blocking <正文文件...>
node scripts/check-degeneration.js --check <正文文件...>
node scripts/normalize-punctuation.js <正文文件...>
作用边界:
check-ai-patterns.js只报告不改写:severity=blocking 的类别优先改正文并复扫;advisory 先通读判断,确属提纲感、解释腔或模板腔再改,功能性写法标[需复核]。- 它只是读感提示;完整类别、例外和修法见
references/anti-ai-writing.md。 check-degeneration.js报告模型退化(逐字复读/打转、末尾截断、占位符、工程词泄漏细纲/情节点等),每条带severity: blocking|advisory。blocking 是退化信号,去AI味改不掉,应回去重新生成那一段再 deslop;advisory(tier2 章节/歧义词)只提示。normalize-punctuation.js机械兜底:保留书级白名单获准的停顿,清除其余残留的……、漏网破折号——/—、双连字符--和独立行---;默认不改变引号风格,也不把有功能的?/ 少量!改成句号。- 知乎盐言短篇可保留
「」;只有用户或项目明确要求时,才给标点脚本加--quote-mode ascii或--quote-mode yan。
---
视角改写复核(仅本次要求切换视角时):交付前回读原文,逐项核对新增的感知/认知句。原文只说明事件发生,不等于人物已经看见或知道;不得自行补观察时点。没有原文依据的“进门时发现”“后来看到”等句子删去,或只呈现原有、当前场景可见的物件状态;不可得的信息暂不叙述。这个检查先于交付,不能用句式脚本通过代替。
Phase 5:输出润色结果
## 去AI味润色报告
### 字数协议
- 原文字符数:{N0}
- 修订后字符数:{N1}
- 净变化:{N1 - N0}({百分比})
- 是否在 tier 上限内:{是 / 否(超限 X%,已分段并标注 [需复核])}
### 修改统计
- 总修改数:{N} 处
- 禁用词替换:{N} 处
- 句式调整:{N} 处(含否定翻转句式 {N}、",带着..." {N}、声音描写 {N})
- 修饰词清扫:{N} 处
- 情绪落地与重复说明清理:{N} 处
- 重复描写合并:{N} 处
- 监控动作清单合并:{N} 处
- 重复语义去重:{N} 处(形容词重复 {N}、近义词重复 {N}、含义重复 {N}、主语重复 {N})
- 比喻处理:{N} 处(删除/保留/改回具体画面)
- 节奏调整:{N} 处
- 对话优化:{N} 处
- 标点节奏调整:{N} 处(保留有功能 `?`/少量 `!`,将 `……`/`——` 改为动作、短句、逗号或句号,并清理无功能堆砌)
- 结尾修正:{N} 处
### 修改前后对比
{逐段展示修改,标注改动类型;超过 30 处时仅展示前 10 处 + 末 5 处 + 其余按 Gate 分桶计数}
### 润色后全文
{**文件模式(默认;章节/正文文件、批量与长篇去AI)**:通过 Edit/Write 直接改写落盘,本节只回 ≤200 字代表性片段,不向父会话返回全文。**文本模式(仅限交互式贴入、无文件路径的零散片段)**:完整输出润色后的文本。}
字数硬约束:删除比例不得超过「诊断与分级」对应上限(轻度 ≤15%、中度 ≤25%、重度 ≤35%)。超限时分段输出并在报告里标记,不得整段删除正文。
收敛终止:
1. 同一段连续两轮去 AI 后没有新改动 → 停止该段处理
2. 全文上限 3 轮重扫;第 3 轮仍有 ≥10 处改动 → 在报告里标 [需复核],移交人工
3. 每轮结束前都要做一遍"再检一次":是否有不符合的地方,有则继续;没有则停
---
使用场景
| 场景 | 操作 |
|------|------|
| 用户贴一段文字说"太AI了" | 执行完整检测 + 润色流程 |
| 用户说"帮我润色" | 先检测AI味,再润色 |
| 用户说"检查下有没有AI味" | 只做检测,不做修改 |
| 用户写作中要求 仅标注 / 只检测 / 不要改 | 嵌入式提醒模式:执行「AI味扫描」和「诊断与分级」,跳过「逐项清除」「确定性收尾」「输出润色结果」;输出问题标记表(含 Gate 列),不修改原文,不写文件 |
---
参考资料
按需加载以下文件:
| 文件 | 何时加载 |
|------|----------|
| references/banned-words.md | 检测和替换禁用词时 |
| references/deslop-gates.md | 逐项清除前:删除保护与所选 Gate 的细则、示例 |
| references/anti-ai-writing.md | 去AI味完整指南:预防+三遍法+范例 |
| scripts/normalize-punctuation.js | 文件模式落盘后做确定性标点收尾;默认保留引号风格 |
| scripts/check-ai-patterns.js | 文件模式「AI味扫描」预检与「确定性收尾」复扫(只看引号外叙述),只报告不改写 |
| scripts/check-degeneration.js | 文件模式「确定性收尾」复扫,只报告不改写 |
| references/author-memory.md + scripts/author_memory_commit.py | 读取或更新跨会话作者文风习惯时 |
---
流程衔接
流水线: 通用
位置: 润色(共享收尾)
| 时机 | 跳转到 | 命令 |
|---|---|---|
| 继续写作 | story-long-write / story-short-write | /story-long-write 或 /story-short-write |
| 发现结构问题 | story-long-analyze / story-short-analyze | /story-long-analyze 或 /story-short-analyze |
| 准备做封面 | story-cover | /story-cover |
---
语言
- 跟随用户的语言回复,用户用什么语言就用什么语言回复
- 中文回复遵循《中文文案排版指北》