Atlas / Skills / one7410 / humanizer-novel

humanizer-novelBLOCK

skills/one7410/humanizer-novel

一键洗掉网文里的 AI 味:针对 GPT / Claude / DeepSeek / 千问等不同模型的病灶定向清洗,去味效果可量化(0-100 去味指数)、每处修改可对账,支持超长篇分块处理与热力图定位。含开箱即用的 Claude Code 双 Skill(评分+润色)与零依赖引擎 | (MIT)

Verdict
BLOCK
Grade
D
Trust score
67 /100
Version
—
Hosts
2 documented
License
MIT
Stars
1
01

Overview

From the repository's own README, as read at the audited commit. Badges and raw HTML are left out.

面向中文网文的「去 AI 味」领域能力层:结构化规则库 + 确定性评分引擎 + 双形态润色管线。 后续小程序/Web 应用的引擎层;同时以 Agent Skill 形态发布(Claude Code / Cursor 可装)。

架构

rules/                      ← 唯一事实源(34 条三段式规则:识别条件/改写动作/保留边界)
├── patterns/*.yaml             sweep-transition / quant-metaphor / hedge-modifier /
│                               idiom-pileup / preach-ending / summary-tell / dialogue-stiff
├── models/*.yaml               GPT说教 / Claude华丽 / DeepSeek量化 / Qwen成语(加权与策略)
├── genres/*.yaml               玄幻修仙 / 都市脑洞 / 言情日常
├── wordlists/modifiers.yaml    55 词修饰词表(评分 d2 指标源)
└── profiles/{basic,deep}.yaml  质量门档位(阈值/重写上限/提前停)

engine/                     ← 确定性引擎(零 npm 依赖,Node ≥20,js-yaml 已 vendor 化)
├── cli.js                      评分命令行:node engine/cli.js  [--model deepseek]
├── hard-filter.js              硬过滤(仅零歧义规则,只删不改)
└── src/
├── segment.js / dialogue.js    分句 / 对话区间(对话豁免与 dialogue-stiff 双轨)
├── rules.js                    规则加载 + 匹配(模型加权、boundary_guard)
├── metrics.js / compose.js     三指标 + D1 扣分制合成 → 去味指数
├── score.js / polish.js        评分组装 / 润色管线(硬过滤→软改写→质量门→回滚)
├── diff.js                     句子级 LCS,修改归因 rule_id
└── llm/                        provider adapter / mock / prompt 组装 / judge / extract

prompts/                    ├── rewrite/{gpt,claude,deepseek,qwen}.md(软改写策略)
skills/                     ← 构建产物:novel-deai-score / novel-deai-polish(scripts/build-skills.js)
eval/                       ← 回归门禁:run.js(score 级 33 用例)/ run-polish.js(真实 API)/
calibrate.js(embedding 校准)/ zhuque-protocol.md(人工基准)

一份规则的三个出口:正则被执行(硬过滤/评分,零 token)、改写指令注入 prompt(软改写,只注入命中规则)、 渲染成 SKILL.md(Agent 引流形态)。见 openspec/changes/add-novel-deai-skills/design.md(D6)。

快速开始

npm install            # 开发环境(测试用);运行时引擎已零依赖
npm test               # 122 项测试
npm run validate       # 规则库 schema 校验
node eval/run.js       # score 级回归门禁(33 用例)

# 评分
node engine/cli.js 样本.txt --model deepseek

# 润色(需 DEA
Read from source at commit 527b4c091ae3OBSERVED · 2026-10-12
Advertisement
02

Install

Commands as the repository documents them. They are shown, not run.

npm install            # 开发环境(测试用);运行时引擎已零依赖
03

Host compatibility

What the documentation claims. We have not run a compatibility test.

HostStatusNotes
claude-codementioned
cursormentioned
04

What it tells the agent

The instruction file, verbatim from the audited commit — this is the text the model reads, and the surface the audit's instruction layer examines. Quoted here so you can judge it without cloning anything.

---
name: novel-deai-polish
description: 网文去AI味润色。按保留边界清洗AI机械痕迹(说教升华/量化比喻/华丽堆砌/成语套话/对话念稿腔),保留剧情事实与作者声音,输出Diff与修改理由。Agent 即 judge:由你按本说明自查边界并执行质量门。
---

# novel-deai-polish:网文去 AI 味润色(Agent 即 judge 形态)

> **形态差异声明**:本 skill 由你(Agent)执行改写与质量门判断——你就是 judge。
> 评分与硬过滤仍由打包引擎完成(确定性代码)。后端 API 形态的 judge 是独立 LLM 调用,
> 判定口径以本说明为准,两种形态语义一致。

## 编辑约束(约束优先级,冲突时按序处理)

1. **剧情事实、人设、时间线、因果完整**:禁止增删情节事件、改变事件结果、引入原文没有的人物/道具/设定;「可能」不得改成「确定」,「计划」不得改成「已经完成」。
2. **题材文风匹配**:改写方向符合题材节奏与语言习惯。
3. **去AI味处理**:在不违反前两条的前提下清洗机械痕迹。

对话专项:命中对话念稿腔时删除公式语、还原说话感(语气词/停顿/半截话),
但角色身份需要的公腔语吻(官员/HR 等人设)保持一致,不为去味而改人设。
反同质化纪律:示例只示范方向与粒度,**禁止复用示例的具体措辞与意象**,
细节必须从当前剧情上下文中长出来。

## 工作流程

1. **评分**:执行 `node engine/cli.js <文本文件> [--model <源模型>]`,读取 `index` 与 `breakdown`。
2. **逐条改写**:对照下方规则明细,只处理实际命中的规则;每条先读「保留边界」,
   边界情形(对话内/真实事实纠正/角色口吻)一律不动。没有问题的句子原样保留。
3. **复评**:再次执行评分 CLI。指数未提升或语义被改坏时,回退你的改写。
4. **输出**:交付改写稿 + Diff 对照(删除的套路句 vs 替换细节),每处修改附 rule_id 与理由。
5. **质量门**:改后指数仍低于 60(basic 档)时,仅对低分段落做第二轮定点改写;单轮提升不足 5 分即停。

## 规则摘要表(34 条,版本 ec18265c,生成于 2026-10-12T03:08:41.905Z)

| 规则 | 类别 | 严重度 | 保留边界(首行) |
|---|---|---|---|
| P-DLGSTIFF-001 | dialogue-stiff | high | 保留情形:1非对话语境不适用本规则(dialogue_only 语义); |
| P-HEDGE-001 | hedge-modifier | high | 保留情形:1对话引号内(引擎通用豁免);2同段已无可删的重复修饰、 |
| P-HEDGE-002 | hedge-modifier | medium | 保留情形:1对话引号内(引擎通用豁免);2悬疑铺垫中确需「未明信息」 |
| P-HEDGE-003 | hedge-modifier | medium | 保留情形:1对话引号内(引擎通用豁免);2侦测/隐匿题材中角色 |
| P-HEDGE-004 | hedge-modifier | low | 保留情形:1对话引号内(引擎通用豁免);2被引用的格言、角色 |
| P-HEDGE-005 | hedge-modifier | high | 保留情形:1对话引号内(引擎通用豁免);2恐怖/悬疑中「说不清」 |
| P-HEDGE-006 | hedge-modifier | medium | 保留情形:1对话引号内(引擎通用豁免);2专有名称全称与 |
| P-IDIOM-001 | idiom-pileup | medium | 保留情形:1对话引号内(引擎通用豁免);2角色战前动员、说书人 |
| P-IDIOM-002 | idiom-pileup | medium | 保留情形:1对话引号内(引擎通用豁免);2全篇单次且情绪冲击 |
| P-IDIOM-003 | idiom-pileup | low | 保留情形:1对话引号内(引擎通用豁免);2描写千军万马、大场面 |
| P-IDIOM-004 | idiom-pileup | low | 保留情形:1对话引号内(引擎通用豁免);2真正的日常/种田流 |
| P-IDIOM-005 | idiom-pileup | low | 保留情形:1对话引号内(引擎通用豁免);2初见重要角色的 |
| P-PREACH-001 | preach-ending | high | 保留情形:1对话引号内(引擎通用豁免);2真实剧情揭示的谜底时刻 |
| P-PREACH-002 | preach-ending | high | 保留情形:1对话引号内(引擎通用豁免);2角色主观宣言且符合 |
| P-PREACH-003 | preach-ending | high | 保留情形:1对话引号内(引擎通用豁免);2枭雄/命格类角色口吻 |
| P-PREACH-004 | preach-ending | medium | 保留情形:1对话引号内(引擎通用豁免);2实指角色开口讲述的 |
| P-QUANT-001 | quant-metaphor | high | 保留情形:1对话引号与【】系统面板内(引擎通用豁免)——系统流面板数值 |
| P-QUANT-002 | quant-metaphor | medium | 保留情形:1对话引号与【】系统面板内(引擎通用豁免);2否定句式 |
| P-QUANT-003 | quant-metaphor | low | 保留情形:1对话引号内(引擎通用豁免)——「吐血三升」作角色口头禅 |
| P-QUANT-004 | quant-metaphor | medium | 保留情形:1对话引号与【】系统面板内(引擎通用豁免);2角色以 |
| P-QUANT-005 | quant-metaphor | medium | 保留情形:1对话引号内(引擎通用豁免);2武术、体育题材中的 |
| P-SUMMARY-001 | summary-tell | high | 保留情形:1对话引号内(引擎通用豁免);2极简快节奏转场中 |
| P-SUMMARY-002 | summary-tell | high | 保留情形:1对话引号内(引擎通用豁免);2推理/悬疑解谜处的 |
| P-SUMMARY-003 | summary-tell | medium | 保留情形:1对话引号内(引擎通用豁免);2角色自己承认 |
| P-SUMMARY-004 | summary-tell | medium | 保留情形:1对话引号内(引擎通用豁免);2极偶发的情绪转场 |
| P-SUMMARY-005 | summary-tell | high | 保留情形:1对话引号内(引擎通用豁免);2角色以分析口吻罗列 |
| P-SWEEP-001 | sweep-transition | high | 保留情形:1对话引号内(引擎通用豁免);2否定部分在纠正真实误解 |
| P-SWEEP-002 | sweep-transition | medium | 保留情形:1对话引号内(引擎通用豁免);2引用他人原话或反讽语气确有必需。 |
| P-SWEEP-003 | sweep-transition | medium | 保留情形:1对话引号内(引擎通用豁免);2「最后」作时序词时不在硬过滤中删除 |
| P-SWEEP-004 | sweep-transition | low | 保留情形:1对话引号内(引擎通用豁免);2全篇仅一处且承接真实转折 |
| P-SWEEP-005 | sweep-transition | high | 保留情形:1对话引号内(引擎通用豁免);2两层信息都具体且缺一不可 |
| P-SWEEP-006 | sweep-transition | high | 保留情形:仅对话引号内(引擎通用豁免)。叙事中出现即删除。 |
| P-SWEEP-007 | sweep-transition | medium | 保留情形:1对话引号内(引擎通用豁免);2誓师、祭文、宣言等 |
| P-SWEEP-008 | sweep-transition | medium | 保留情形:1对话引号内(引擎通用豁免);2官场文、职场文中 |

## 规则明细

### P-DLGSTIFF-001(dialogue-stiff,high)

- 识别线索:`我表示|请注意|根据(规定|流程|我的观察)|按照(规定|流程|你的要求)|经研究决定|本人(认为|表示|同意)|正如你(所说|所见)|不得不指出`
- **保留边界(这些情况不要动)**:保留情形:1非对话语境不适用本规则(dialogue_only 语义);
2角色身份即需要这种语吻(官员、HR、管家、AI 角色本人)且全篇
语吻一致——由软改写按人设判断,评分命中会保留但 judge 在热力图
标注「人物口吻需要」;3引用他人原话的转述。
- 改写动作:念稿腔改为符合身份的口语:删掉「我表示」「请注意」等公式语,
用语气词、停顿、半截话还原说话感;同一对话单独抽出来读,
应能听出是哪个角色在说话。
「我表示同意你的方案。但请注意,出现问题责任由你承担。」
→「行,你说了算。出了岔子,别往我身上赖。」
- 示例:改前「“我表示同意你的方案。”他顿了顿,“但请注意,如果出现问题,责任由你来承担。”」→ 改后「“行吧,你说了算。”他哼了一声,“不过这事你兜着,出了岔子别往我身上赖。”」

### P-HEDGE-001(hedge-modifier,high)

- 识别线索:`带着(一丝|一抹|一缕|几分)`
- **保留边界(这些情况不要动)**:保留情形:1对话引号内(引擎通用豁免);2同段已无可删的重复修饰、
且该处确需保留细微情绪过渡时(全篇密度由引擎统计,零星单处降权)。
- 改写动作:把「带着一丝X」换成看得见的样子:笑意→嘴角动了一下;
疲惫→眼白里有血丝。删掉量词壳,让情绪直接落在动作上。
- 示例:改前「她抬起头,眼中带着一丝不易察觉的慌乱。」→ 改后「她抬起头。就半秒——视线先飘向了门,才落回他脸上。」

### P-HEDGE-002(hedge-modifier,medium)

- 识别线索:`隐隐(约约)?(透着|传出|传来|浮现|散发|泛起)`
- **保留边界(这些情况不要动)**:保留情形:1对话引号内(引擎通用豁免);2悬疑铺垫中确需「未明信息」
且后文有揭示回收的(每场景至多一处)。
- 改写动作:「隐隐透着危险」要么写实(墙上有新鲜刀痕),要么删掉——
读者不需要被提醒"有危险",需要看到线索。
- 示例:改前「山道间隐隐透着一股危险的气息。」→ 改后「山道旁的草伏倒了一片,断口还是新的。」

### P-HEDGE-003(hedge-modifier,medium)

- 识别线索:`(不易|难以|无法)察觉的`
- **保留边界(这些情况不要动)**:保留情形:1对话引号内(引擎通用豁免);2侦测/隐匿题材中角色
主观刻意为之的技巧描写(如刺客的移动本身)。
- 改写动作:「不易察觉的X」改为"观察者差点错过"的具体细节:频次、角度、
时长。删掉「不易察觉」四个字,细节本身会说明它不易察觉。
- 示例:改前「他嘴角勾起一抹不易察觉的冷笑。」→ 改后「他嘴角挑了一下,又压回去。快得像没动过。」

### P-HEDGE-004(hedge-modifier,low)

- 识别线索:`(仿佛|宛如|恍若|好似|如同)`
- **保留边界(这些情况不要动)**:保留情形:1对话引号内(引擎通用豁免);2被引用的格言、角色
有意使用的比喻;3全篇一两处确实精彩的比喻。密度问题:
引擎按频次计分,单处优秀比喻不处理。
- 改写动作:密度过高时删除大半,保留最有力的一个;其余直接写本体——
「刀快得仿佛一道白光」→「刀快,只剩一道白光」。
- 示例:改前「剑光宛如游龙,仿佛能撕裂苍穹,好似银河倒泻。」→ 改后「剑光过去,雨帘断了一息才落回地面。」

### P-HEDGE-005(hedge-modifier,high)

- 识别线索:`某种(说不清[道不明]?|难以言喻|无法形容|难以名状|莫名)的` 或 `(散发|透露|弥漫)(着|出)?(一股)?[^。,!?\n]{0,8}(气息|氛围)`
- **保留边界(这些情况不要动)**:保留情形:1对话引号内(引擎通用豁免);2恐怖/悬疑中「说不清」
本身是手法(信息缺失即恐怖源)且后文有兑现。
- 改写动作:「难以言喻的气息」给读者一个可感的替代物:气味(铁锈、血腥、
檀香)、温度、声音。写不出具体是什么时,删掉整句。
- 示例:改前「他的身上散发着某种难以言喻的气息。」→ 改后「他走近时,她闻到一股淡淡的铁锈味。」

### P-HEDGE-006(hedge-modifier,medium)

- 识别线索:`[^。,!?\n]{1,8}的[^。,!?\n]{1,8}的[^。,!?\n]{1,8}的`
- **保留边界(这些情况不要动)**:保留情形:1对话引号内(引擎通用豁免);2专有名称全称与
不可拆的所属链("他母亲的娘家侄子的婚事"这类指代必需结构);
3层叠部分含设定术语且拆开会丢信息。
- 改写动作:拆链:三个以上连续「的」定语,拆成两个短句,或把其中
一层改成独立描写。「半张冷峻的隐没在阴影里的脸」→
「灯只照到半张脸。露出来的那半截下颌线绷得很紧。」
- 示例:改前「窗外微弱的光映在他半张冷峻的隐没在阴影里的脸上。」→ 改后「灯只照到半张脸。露出来的那半截下颌线绷得很紧。」

### P-IDIOM-001(idiom-pileup,medium)

- 识别线索:`(势如破竹|摧枯拉朽|势不可挡|锐不可当|所向披靡)`
- **保留边界(这些情况不要动)**:保留情形:1对话引号内(引擎通用豁免
05

Trust audit

BLOCKgrade D · trust 67/100 Do not install this without reading the findings. The audit found something that could harm you or your machine.

LayerWhat it checksResult
L0Provenance & inventoryPASS
L1Static analysis of the codeFAIL
L2Instruction surface (what it tells the agent)PASS
L3Class-specific surfacePASS
L4Behavioural (sandbox)SKIPPED

What the source does

Filesystem
none-observed
Network
none-observed
Shell
declared (5 observation(s))
Dependencies
not all pinned
Secrets in source
none-found

Findings (12)

HIGHCode injection · code.deserialize · CWE-78, CWE-94, CWE-95
engine/src/polish.js:24
const doc = yaml.load(fs.readFileSync(p, 'utf8'));
Why it matters. deserialises untrusted bytes into live objects
Fix. use json or yaml.safe_load
HIGHCode injection · code.deserialize · CWE-78, CWE-94, CWE-95
engine/src/rules.js:42
const doc = yaml.load(raw);
Why it matters. deserialises untrusted bytes into live objects
Fix. use json or yaml.safe_load
HIGHCode injection · code.deserialize · CWE-78, CWE-94, CWE-95
engine/src/rules.js:78
const doc = yaml.load(fs.readFileSync(file, 'utf8'));
Why it matters. deserialises untrusted bytes into live objects
Fix. use json or yaml.safe_load
HIGHCode injection · code.deserialize · CWE-78, CWE-94, CWE-95
engine/src/rules.js:87
const doc = yaml.load(fs.readFileSync(wordlistPath, 'utf8'));
Why it matters. deserialises untrusted bytes into live objects
Fix. use json or yaml.safe_load
HIGHCode injection · code.deserialize · CWE-78, CWE-94, CWE-95
scripts/validate-rules.js:29
return yaml.load(fs.readFileSync(file, 'utf8'));
Why it matters. deserialises untrusted bytes into live objects
Fix. use json or yaml.safe_load
LOWInsecure crypto · crypto.weak_hash · CWE-327, CWE-338
engine/src/core.js:40
.createHash('md5')
LOWInsecure crypto · crypto.weak_hash · CWE-327, CWE-338
engine/src/llm/structure.js:111
return crypto.createHash('md5').update(fs.readFileSync(promptPath, 'utf8')).digest('hex').slice(0, 8);
LOWInsecure crypto · crypto.weak_hash · CWE-327, CWE-338
engine/src/rules.js:15
.createHash('md5')
LOWInsecure crypto · crypto.weak_hash · CWE-327, CWE-338
skills/novel-deai-polish/engine/src/core.js:40
.createHash('md5')
LOWInsecure crypto · crypto.weak_hash · CWE-327, CWE-338
skills/novel-deai-polish/engine/src/llm/structure.js:111
return crypto.createHash('md5').update(fs.readFileSync(promptPath, 'utf8')).digest('hex').slice(0, 8);
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
tests/llm-adapter.test.js:13
server.listen(0, '127.0.0.1', () => resolve({ server, url: `http://127.0.0.1:${server.address().port}` }));
LOWSupply chain · supply.unpinned · CWE-829, CWE-1357
package.json
js-yaml
Why it matters. 1 dependency range(s) float
Fix. pin exact versions or ship a lockfile

Gates applied: no_behavioural_pass.

Audited 2026-10-12 · audit v0.4.1 · source sha 527b4c091ae3full audit observations/trust-audit/skill/one7410__humanizer-novel.json · Report an issue / request a re-scan
06

Audit history

Every audit this skill has had.

DateSourceVerdictGradeScoreChange
2026-10-12527b4c091ae3BLOCKD67first audit
07

Questions

What does the humanizer-novel skill do?

一键洗掉网文里的 AI 味:针对 GPT / Claude / DeepSeek / 千问等不同模型的病灶定向清洗,去味效果可量化(0-100 去味指数)、每处修改可对账,支持超长篇分块处理与热力图定位。含开箱即用的 Claude Code 双 Skill(评分+润色)与零依赖引擎 | (MIT)

Is humanizer-novel safe to install?

No — not without reading the findings first. The audit graded it D (67/100) and found 5 critical or high issues in the source. Each one is listed on this page with the file and line it is on.

What can humanizer-novel access on my machine?

The audit observed that it runs shell commands. Each of those is consistent with what it says it does. Secrets in the source: none found.

Which assistants does humanizer-novel work with?

Its documentation mentions claude-code and cursor. That is what the text claims, not a compatibility test we ran.

How current is this page?

The grade is for one exact copy of the source (527b4c091ae3), read on 2026-10-12. The repository is watched, and a new audit runs when it changes — this is the first audit.

Advertisement