mcpField
A
agentic-humanizer

agentic-humanizer

github.com/numen-tech创意与媒体5870 次安装17 周前更新
代码仓库

关于 agentic-humanizer

通过五轮流程改写文本的 Agent 技能,可选用 Slop or Not Pro 检查检测评分与可读性。它支持多种欧洲语言、声音风格匹配、改写偏好和针对不同 harness 的交互流程。

主要功能

  1. 01五轮文本改写
  2. 02语言、语气与长度偏好
  3. 03可选的本地检测与可读性检查
  4. 04从写作样本提取声音特征
  5. 05Harness 检测与配置管理

适用场景

  1. 01按目标语气修订文本
  2. 02将文本调整到指定阅读水平
  3. 03匹配已保存的写作风格
  4. 04查看英文文本的检测评分

MCP 相关

该技能会探测 Slop or Not Pro 是否可通过 MCP 或 CLI 使用。配合 Slop or Not Pro Pro 时,可增加检测评分、可读性检查和 Text Cleanup。

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/numen-tech/slopornot --skill agentic-humanizer

安装后在 Claude Code 中输入/agentic-humanizer确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

README.md
examples/
sample-ai-text-de.md
sample-ai-text.md
harnesses/
claude-code.md
codex.md
cursor.md
gemini-cli.md
generic.md
opencode.md
references/
detection-guidance.md
multilingual.md
patterns.md
per-iteration-strategies.md
profile-resolution.md
slop-cli-setup.md
slop-mcp-setup.md
supplemental-ai-tells.md
voice-fingerprint.md
references/ai-tells/
da.md
de.md
es.md
it.md
no.md
sv.md

详细介绍

Agentic Humanizer

一款采用 5 轮流程的 AI 文本人性化工具。它始终运行核心改写工作流;Slop or Not Pro 则会额外进行经测量的设备端 AI 检测器检查。

  • **不使用 Slop or Not:**运行完整的改写工作流。
  • **使用 Slop or Not Pro:**增加设备端 AI 检测器评分、可读性、Text Cleanup 和 清理统计。

支持的语言:英语、西班牙语、德语、意大利语、瑞典语、丹麦语和 挪威语(Bokmal 和 Nynorsk)。AI 检测器评分仅支持英语;其他 语言使用原生可读性指标和各语言特征。请参阅 references/multilingual.md。

斜杠命令: /agentic-humanizer [粘贴文本]

内联覆盖项: /agentic-humanizer language=<code> variant=<spec> dialect=us|uk grade=N level=<band> tone=casual|professional|academic length=±10|exp|trim threshold=N max=N voice=/path/to/file.txt|off voice-skip skip-interview [粘贴]

language=<code> 和 variant=<spec> 用于设置目标语言和变体(例如 language=de variant=de-AT)。dialect=us|uk 是旧版英语别名:dialect=us 等同于 language=en variant=en-US,dialect=uk 等同于 language=en variant=en-GB。grade=N 用于设置 Flesch-Kincaid 目标,仅适用于英语;level=<band> 用于设置任意语言的阅读级别(elementary|middle|high_school|college|graduate)。显式设置的 language=/variant= 优先于 dialect=。设置 language= 而未设置 variant= 时,将使用该语言在注册表中的默认变体(列出的第一个变体;如果某种不受支持的语言没有注册表条目,则使用 other:<code>)。设置 variant=<tag> 而未设置 language= 时,将根据该变体的 BCP-47 前缀推断基础语言(例如 variant=de-AT -> language=de);如果前缀不受支持,则保留该前缀作为语言,使用内联变体,并发出警告。支持的代码和变体请参阅 references/multilingual.md。

此技能的功能

  1. 检测宿主工具环境(Claude Code、Codex、Cursor、Gemini CLI、 OpenCode 或通用环境)。
  2. 在进行任何改写前处理配置文件和语音管理命令。
  3. 从内联覆盖项、已保存的配置文件或宿主工具环境访谈中解析改写偏好。
  4. 可选地解析写作样本并提取缓存的文体特征。语音匹配无需 Slop or Not。
  5. 探测是否可通过 MCP 或 CLI 访问 Slop or Not Pro。
  6. 运行 5 轮文本人性化工作流:
    • 核心模式记录未评分的迭代。
    • Slop or Not Pro 运行 Text Cleanup、检测和可读性检查。
  7. 返回最终文本、循环历史记录、影响最大的编辑,以及(如果运行了 Slop 清理)Text Cleanup 摘要。

第 1 步:检测宿主工具环境

通过检查宿主工具环境特有的问题工具,确定当前运行的环境。使用第一个匹配项:

宿主工具环境是否存在特有工具?阅读此文件
Claude CodeAskUserQuestionharnesses/claude-code.md
Codex CLItool/requestUserInput(或 ask_user_question)harnesses/codex.md
CursorAskQuestionharnesses/cursor.md
Gemini CLIask_user(或等效的结构化问题工具)harnesses/gemini-cli.md
OpenCodeOpenCode 内置的 question 工具或 AUQ MCPharnesses/opencode.md
其他环境(例如 ChatGPT Skills)n/a;回退到纯文本harnesses/generic.md

此时不要加载宿主工具环境文件。将选项留到第 3 步。

步骤 2:配置文件管理命令

用户可以使用以下子命令管理已保存的配置文件:

命令操作
/agentic-humanizer show profile打印 ~/.agentic-humanizer/profile.json(或显示“未保存配置文件”)。
/agentic-humanizer reset执行 rm ~/.agentic-humanizer/profile.json 并确认。
/agentic-humanizer set language=de variant=de-AT level=high_school tone=casual length=±10根据内联参数写入配置文件,不运行访谈。可识别的键:language、variant、dialect(旧版英语别名)、grade(仅限英语)、level、tone、length。允许只提供任意子集;缺少的键保留当前值,若不存在配置文件则使用默认值。当 language 更改且未显式指定 variant 时,将 variant 重置为 references/multilingual.md 中该语言的默认值(列出的第一个变体;对于不受支持的语言,则为 other:<code>),而不是保留旧值,以确保保存的语言和变体保持一致(例如,在英语配置文件上执行 set language=de 会写入 variant=de-DE,而非 en-US)。如果旧版 dialect= 更改时未显式指定 variant,则将 variant 重置为该别名对应的特定英语变体,而非注册表默认值:dialect=us 写入 variant=en-US,dialect=uk 写入 variant=en-GB。如果指定了 variant=<tag> 但未指定 language=,则根据变体的 BCP-47 前缀推断基础语言(例如 set variant=de-AT -> language=de),并相应更新已保存的 language;如果前缀不受支持,则将该前缀原样作为 language,保留内联变体,并警告该语言没有经过整理的支持。对于英语,保持级别字段一致:level= 设置 reading_level,并根据级别区间中点推导 target_grade(elementary 为 4,middle 为 7,high_school 为 10,college 为 13,graduate 为 17);grade=N 设置 target_grade=N,并将 reading_level 设为该年级对应的级别区间;当已保存的 language 变为非英语时,写入 target_grade: null(循环会读取 reading_level)。
/agentic-humanizer show voice如果 ~/.agentic-humanizer/voice-fingerprint.json 存在,则打印其内容及样本路径;否则说明未保存语音。
/agentic-humanizer reset voice删除 ~/.agentic-humanizer/voice.txt 和 ~/.agentic-humanizer/voice-fingerprint.json,然后从配置文件中清除语音字段,但不删除改写偏好。
/agentic-humanizer set voice=/path/to/file.txt保存配置文件的 voice_path,清除 voice_skip,并在后续运行中使用该路径。直到下一次改写调用时才提取指纹。

遇到这些子命令之一时,执行该命令并停止。不要探测 Slop 或运行循环。

步骤 3:解析改写偏好

首先检测源语言。 在读取配置文件或运行访谈之前,使用宿主 LLM 检测粘贴文本的语言(使用前约 300 个词;无需后端,因此在 Core 和 Slop or Not Pro 模式下都可运行)。存储 detected_language(例如 de 这样的基础代码),并在拼写形式能够明确判断时存储 detected_variant_hint(例如 de-DE)。 按照 references/multilingual.md 规范化代码(Norwegian Bokmal 应转换为 nb,绝不能是 no)。如果尚未粘贴文本,则延后检测。如果文本少于约 20 个词或包含多种语言,则将语言视为不明确。

配置文件解析顺序:

  1. 行内覆盖项(language=、variant=、dialect=、grade=、 level=、tone=、length=)-> 使用这些值;对于被覆盖的键,不读取配置文件。行内的 language=/variant= 也会覆盖检测结果。如果给出了 language= 但未给出 variant=,则将 variant 设为 references/multilingual.md 中该语言的默认值(列出的第一个 variant),而不是配置文件中的 variant,以确保二者匹配(例如,单独的 language=de 会解析为 variant=de-DE;没有注册表条目的不支持语言,例如 language=fr,会解析为 variant=other:fr)。如果给出了 variant=<tag> 但未给出 language=,则根据 variant 的 BCP-47 前缀推断基础语言(例如,variant=de-AT -> language=de,variant=es-419 -> language=es);如果前缀不受支持,则将该前缀原样作为 language,保留行内 variant,并警告该语言没有精选支持。如果也显式给出了 language=,且它与 variant 的基础语言冲突,则以 language= 为准,并发出警告。对于英语,如果设置了 level= 但未设置 grade=,则根据解析后的等级区间中点推导 target_grade(elementary 4、middle 7、high_school 10、college 13、graduate 17);显式的 grade=N 始终优先。行内覆盖项按键生效;未在行内提供的键应根据以下规则 2 至 4 进行解析,而不是留空。
  2. skip-interview 标志 -> 如果存在已保存的配置文件,则使用它。没有配置文件时,保留检测到的源语言;对于 variant,如果 detected_variant_hint 是已解析语言的有效 variant,则使用它,否则使用 references/multilingual.md 中该语言的默认 variant。其余项使用默认值(High school、Professional、±10%);只有在检测结果不明确或未粘贴文本时,才回退到英语/en-US。对于英语,根据 High school 等级区间推导 target_grade 10。
  3. 存在已保存的配置文件 ~/.agentic-humanizer/profile.json:
    • 如果 detected_language 与配置文件的 language 相同,或检测结果不明确,则静默使用配置文件并跳过访谈。除非用户主动要求,否则绝不再次询问已有配置文件的用户。
    • 如果 detected_language 与配置文件的 language 不同(检测结果明确),则本次调用不使用配置文件中的语言:如果有行内 language=,则以它为准;否则以检测结果为准,而行内 variant/tone/length/level/grade 仍按键覆盖配置文件。对于这种情况,按照 references/profile-resolution.md 中的决策表解析 language、variant、reading level、tone、length 和英语 target_grade。不要发起提问,也不要重写配置文件。将决策表中的匹配说明带入步骤 7。
  4. 没有已保存的配置文件 -> 对尚未通过行内覆盖项(规则 1)设置的任何改写键,运行 harness 访谈。如果部分键已通过行内设置,则只询问其余键;如果没有任何键通过行内设置,则按以下内容运行完整访谈。

使用以下内容读取已保存的配置文件:

PROFILE=~/.agentic-humanizer/profile.json
[ -f "$PROFILE" ] && cat "$PROFILE"

如果文件不存在或不是格式正确的 JSON,则视为不存在并运行访谈。如果可以解析,先应用下一段中的向后兼容规范化(将旧版 dialect/target_grade 配置文件映射到 language/variant/reading_level),然后判断其是否完整:只有在映射后仍缺少已解析的改写设置(language、variant、reading_level、tone、length_policy)时,才将配置文件视为不存在(并运行访谈)。版本 1 和版本 2 配置文件使用 dialect 和 target_grade,而非 v3 键;规范化后即视为完整,并会在不再次询问的情况下加载。缺失的语音字段使用步骤 4 中的默认值。如果可解析的配置文件含有 voice_skip,但规范化后仍缺少改写键,则在改写访谈中忽略该配置文件,但仍在步骤 4 中遵循 voice_skip。 向后兼容(将任何旧版配置文件视为 v3)。 没有 language 字段的配置文件默认为英语:设置 language="en",并将旧版 dialect 映射为 variant (us -> en-US,uk -> en-GB,other:<spec> -> variant: "other:<spec>")。 根据 references/multilingual.md 中的分档表,从 target_grade 推导 reading_level(3 到 5 -> elementary,6 到 8 -> middle,9 到 11 -> high_school,12 到 14 -> college,15 及以上 -> graduate;如果 没有 target_grade,则默认为 high_school)。先读取所有现有字段,以保留自定义值,然后在下次写入时将整个文件重写为 v3。只有英语会根据 target_grade 决定终止条件;其他语言的循环会读取 reading_level,并通过注册表进行映射。

进行访谈:读取第 1 步中选定的 harness 文件,并遵循其访谈流程。访谈包含四个改写问题(另有一个单独的语言消歧步骤,仅在检测结果不明确时进行)。选定的 harness 可以在符合条件时将条件式语气问题合并提问;第 4 步会处理该回答。在此处记录这些改写设置:

  • language(基础代码,如 en、de、es、it、sv、da、nb、 nn 或其他)和 variant(BCP-47 标签或 other:<spec>)。Q1 确认 检测到的语言,并提供 references/multilingual.md 中该语言的变体。参见下文“访谈 Q1 和 Q2”。
  • reading_level 可选值:{elementary、middle、high_school、college、 graduate}。英语还需设置 target_grade(对应分档的中点:4、7、 10、13、17)。其他语言的循环会通过注册表读取 reading_level。
  • tone 可选值:{casual、professional、academic}
  • length_policy 可选值:{±10、exp、trim}

访谈 Q1 和 Q2。 Q1 确认语言和变体。如果语言检测结果明确,提问:“检测到 。请选择变体。”并提供 references/multilingual.md 中该语言的变体,以及“其他(不同语言)”。如果语言模糊或未知,先询问语言,再询问变体;选项数量受限的 harness(Claude Code、Cursor、Gemini CLI、OpenCode)会提供最可能的三种语言以及“其他(不同语言)”,以符合最多四个选项的限制;纯文本和自由文本 harness(通用、Codex)可以列出所有语言。如果用户选择“其他(不同语言)”,则在下一轮记录语言名称或代码,并根据注册表解析;如果不受支持(没有经过整理的识别线索或可读性信息),则发出警告。Q2 涵盖五个阅读级别分档;根据已解析语言所用的衡量标准,显示每个分档的辅助说明(例如,瑞典语的“高中(LIX 约为 40 到 50)”,英语的“高中(9 到 11 年级)”),内容取自注册表分档表。选项数量受限的 harness 会将 College 和 Graduate 合并为一个“大学或职业”选项,以符合最多四个选项的限制,因此在此类 harness 中,需通过行内 level=graduate 或 grade=N 选择 Graduate;通用和 Codex 会保留全部五个分档。对于挪威新挪威语和不受支持的语言,显示分档时不附带衡量标准说明。将 Q1 映射到 language(标准化后)和 variant;将 Q2 映射到 reading_level(英语还需映射到 target_grade)。

回答完改写问题后,再问一个最后的“是/否”问题(使用相同的 harness 提问工具):

“将这些设置保存为默认值,这样下次我就不会再问了,可以吗?你随时可以使用 /agentic-humanizer reset 重置。”

如果回答“是”:

mkdir -p ~/.agentic-humanizer
cat > ~/.agentic-humanizer/profile.json <<EOF
{
  "language": "<en|de|es|it|sv|da|nb|nn|other>",
  "variant": "<en-US|en-GB|de-DE|de-AT|de-CH|es-ES|es-419|it-IT|sv|da|nb|nn|other:...>",
  "reading_level": "<elementary|middle|high_school|college|graduate>",
  "target_grade": <4|7|10|13|17 for en, else null>,
  "tone": "<casual|professional|academic>",
  "length_policy": "<±10|exp|trim>",
  "voice_path": "~/.agentic-humanizer/voice.txt",
  "voice_skip": false,
  "voice_fingerprint_hash": null,
  "saved_at": "$(date -u +%Y-%m-%dT%H:%M:%SZ)",
  "version": 3
}
EOF

仅当 language 为 en 时,target_grade 才有意义;对于其他语言,将其写为 null,这些语言的循环会读取 reading_level。对于英语,请确保 target_grade 与 reading_level(对应分档的中点)保持一致,包括使用行内 level= 路径时。

然后继续第 4 步。未来调用中的行内覆盖始终只对本次调用优先于已保存的配置文件;不会覆盖该文件。

第 4 步:解析语气样本

运行此步骤前,请先阅读 references/voice-fingerprint.md。默认设置 voice_active=false。

语音样本解析顺序:

  1. 内联 voice=off 或 voice-skip -> 本次调用跳过语音匹配。

  2. 内联 voice=/path/to/file.txt -> 仅在本次调用中使用该样本。 如果路径不存在或不可读,警告用户一次,然后 从规则 3 开始继续处理,视同未设置内联覆盖项。

  3. 已保存的 profile.json 中有 voice_path,且对应文件存在 -> 使用该文件。

  4. 默认文件 ~/.agentic-humanizer/voice.txt 存在 -> 使用该文件。

  5. 已保存的 profile.json 中有 "voice_skip": true -> 静默跳过。

  6. 否则 -> 使用所选运行框架已收集的条件性 Q5 答案;如果运行框架未批量收集,则现在询问:

    "模仿一份您的写作样本?"

    选项:Yes、No、Never ask again。

如果 Q5 为 No,本次调用跳过语音匹配。如果 Q5 为 Never ask again, 保存 voice_skip,不要臆造改写偏好,然后跳过语音匹配。先读取任何现有配置文件:

  • 配置文件已存在(包括刚在步骤 3 中保存的文件):重写该文件,设置 "voice_skip": true 和 "version": 3,保留现有改写键 (language、variant、reading_level、target_grade、tone、 length_policy)。
  • 不存在配置文件(用户在步骤 3 中拒绝保存改写默认设置): 写入仅包含 "voice_skip": true 和 "version": 3 的纯语音记录, 不要从 v3 默认设置中填入改写键。步骤 3 会将此类配置文件视为 不完整,因此下次仍会询问语言、语气和阅读等级,同时在此处遵循 voice_skip。

如果 Q5 为 Yes,请原样说:

"请在下一条消息中粘贴 200 个以上的单词。"

将用户的下一轮消息作为样本。写入前进行验证:

  • 少于 50 个单词:拒绝该样本,告知用户样本太短,将 voice_active=false 保持不变,并继续处理,不更改配置文件。
  • 50-199 个单词:提醒用户 200 个以上的单词效果更好,然后询问是 使用较短样本继续,还是粘贴更长的样本。
  • 200 个以上的单词:将样本写入 ~/.agentic-humanizer/voice.txt。

对于每个已接受的样本,仅使用前 3000 个单词提取特征。 对样本内容的前 50 KB 计算哈希:

VOICE_SAMPLE="<resolved-sample-path>"
head -c 51200 "$VOICE_SAMPLE" | shasum -a 256

在存储的值前加上 sha256:。

特征缓存:

缓存位于 ~/.agentic-humanizer/voice-fingerprint.json。根据 references/voice-fingerprint.md 中的每条规则验证缓存:缓存失效条件 (文件存在、version: 1、sample_hash 匹配、所有必需字段均已填写)。 缓存命中且有效时,静默使用缓存并设置 voice_active=true。触发任何失效条件时, 均视为缓存未命中并运行特征提取。

缓存未命中时,使用主机 LLM 运行 references/voice-fingerprint.md 中的提取提示词。 呈现 JSON 特征并询问:

"看起来正确吗?"

选项:Yes、Edit、Re-extract。

  • Yes:将获批的 JSON 写入 ~/.agentic-humanizer/voice-fingerprint.json,然后重写 ~/.agentic-humanizer/profile.json,使 voice_path 指向解析出的样本, voice_skip 为 false,voice_fingerprint_hash 与样本哈希匹配,且 version 为 3。使用与步骤 3 相同的 heredoc 模式,仅替换这些语音字段, 并保留改写偏好(language、variant、reading_level、target_grade、 tone、length_policy):

    mkdir -p ~/.agentic-humanizer
    cat > ~/.agentic-humanizer/profile.json <<EOF
    {
      "language": "<keep current>",
      "variant": "<keep current>",
      "reading_level": "<keep current>",
      "target_grade": <keep current>,
      "tone": "<keep current>",
      "length_policy": "<keep current>",
      "voice_path": "<resolved-sample-path>",
      "voice_skip": false,
      "voice_fingerprint_hash": "sha256:<current-sample-hash>",
      "saved_at": "$(date -u +%Y-%m-%dT%H:%M:%SZ)",
      "version": 3
    }
    EOF
    

    然后设置 voice_active=true。

  • Edit:允许用户直接内联修正 JSON。保存前根据 references/voice-fingerprint.md 中的必需字段列表验证。若编辑内容删掉任何 必需字段,拒绝保存并提供 Re-extract 选项。

  • Re-extract:询问要更改什么,然后根据该提示重新运行特征提取。

对于没有结构化问题工具的运行框架(generic 回退模式), 审批环节会降级为打印后继续。参见 harnesses/generic.md 中的 Fingerprint approval。 行内 voice=/path/to/file.txt 不会覆盖默认样本或已保存的配置文件路径。它可能会刷新该样本哈希对应的共享指纹缓存。

如果提取失败、样本为二进制文件或无法读取,或者没有可用于提取提示词的主机 LLM,请设置 voice_active=false,添加 Step 7 的提取失败页脚标记,并继续操作,不进行语气匹配。

Step 5:探测 Slop or Not Pro

默认将 slop_mode="llm-only" 且 slop_backend=null。探测 Slop 只会选择增强路径,不会决定是否运行人性化处理。

运行真实的 detect_text 测试调用,以确认该功能存在且为 Pro 级别。slop status 对非 Pro 级别也会成功;只有 detect_text 会限制 Pro 级别。

两种路径都使用以下测试:

In today's digital environment, organizations often adopt new software because it promises efficiency, but the real value depends on whether people can trust it. A useful tool should explain what it does, respect the user's context, and avoid turning simple decisions into complicated workflows. Clear documentation helps teams evaluate those tradeoffs before they commit time or money.

MCP 路径(优先尝试):

使用测试内容调用 mcp__SlopOrNot__detect_text,并设置 include_readability: true。如果工具调用成功,且解析后的响应包含数值型 score 或 ai_probability 字段,则设置 slop_mode="slop-or-not-pro" 和 slop_backend="mcp"。将 score 和 ai_probability 的值视为 0 到 1 之间的小数,除非该值已大于 1。对于可读性评分,从 readability.scores[] 中读取 kind 为 fleschKincaidGradeLevel 的值。

CLI 路径(其次尝试):

通过 Bash 使用应用包二进制文件运行:

cat <<'EOF' | "/Applications/Slop Or Not.app/Contents/MacOS/slop" text --json
In today's digital environment, organizations often adopt new software because it promises efficiency, but the real value depends on whether people can trust it. A useful tool should explain what it does, respect the user's context, and avoid turning simple decisions into complicated workflows. Clear documentation helps teams evaluate those tradeoffs before they commit time or money.
EOF

如果退出代码为 0,且 stdout 可解析为 JSON,并包含以下某个数值型评分路径,则设置 slop_mode="slop-or-not-pro" 和 slop_backend="cli":

  • detection.result._0
  • detection.resultFewSentences._0
  • ai_probability

对于 CLI 可读性评分,从 readability.scores[] 中读取 kind 为 fleschKincaidGradeLevel 的值。检测评分(detection.result._0)是 0 到 1 之间的小数:除非该值大于 1,否则乘以 100 转换为百分比。可读性等级永远不是百分比。

上方的探测测试内容为英文,因此其可读性区块始终会返回 kind: fleschKincaidGradeLevel。此调用仅用于确认 Pro 访问权限;请丢弃其可读性值。源语言的可读性会在 Step 6 中针对实际源文本单独测量,届时返回的 kind 取决于源语言(参见 references/multilingual.md)。

如果两种路径都不可用,请保留 slop_mode="llm-only" 并继续执行 Step 6。不要跳过访谈、语气匹配或改写循环。

Step 6:运行循环

使用 Step 3 中确定的语言 L(该步骤已按优先级处理所有行内 language=、仅由 variant= 覆盖推断出的基础语言、检测并确认的语言以及已保存的配置文件)。如果 L 不是英语,请阅读 references/multilingual.md(注册表:可读性公式、等级映射、代码归一化)。阅读 references/per-iteration-strategies.md(逐轮操作指南)。然后加载下方对应 L 分支的标记目录。语言分支与 5 轮迭代计划组合使用,不会取代它。

保留覆盖范围。 改写,而非删除:保留源文本涵盖的每项事实和章节,并保留核心含义。去除 AI 痕迹绝不意味着删减内容。在 length_policy=trim 下,只能删减冗余、填充内容和重复表述,不得删去独有事实或整个章节;应缩短事实的表述,而不是将其删除。长度变化只能由解析后的 length_policy 决定,绝不能通过悄然省略内容实现。

语言分支:加载与终止

L 为 en(英语)。 阅读 references/patterns.md(规范的 33 项模式改写词汇表)、references/supplemental-ai-tells.md 和 references/detection-guidance.md(用于防止误报:说明哪些内容不应标记,以及哪些体现人工写作的信号应予以保留)。使用完整的检测流程。从 scores[] 中读取 kind 为 fleschKincaidGradeLevel 的 Flesch-Kincaid 年级。如果此处的 target_grade 为 null 或未设置(例如通过部分内联覆盖继承了非英语已保存配置中的值),则在终止检查前,根据解析后的 reading_level 档位中点推导:小学 4、初中 7、高中 10、大学 13、研究生 17。显式内联设置 grade= 时,始终优先采用该值。按照下方“Slop or Not Pro 的终止条件”终止。

L 为 es、de、it、sv、da 或 nb(受支持的非英语语言)。 不要阅读 references/patterns.md(其中的词汇适用于英语)。阅读 references/supplemental-ai-tells.md 和对应语言的特征文件 references/ai-tells/<L>.md(挪威书面语 Bokmål 使用 references/ai-tells/no.md 中的 Bokmål 部分)。每次调用 Slop or Not 时都传入规范化后的 language_code。读取 scores[] 返回的 kind,按该 kind 标注分数,并使用 references/multilingual.md 将数值映射到相应档位。AI 分数为 n/a:对于非英语输入,detect_text 会返回 kind: "not_english" 和 score: null,因此不要为了可读性收敛而调用它。使用 Slop or Not Pro 时,只调用一次 analyze_readability 获取可读性结果;不要再调用 detect_text。当可读性落入相应档位(遵循注册表中的各尺度语义)或达到 MAX_ITER 后终止;无需检查 AI 阈值。

L 为 nn(挪威新挪威语)。 不要阅读 references/patterns.md。阅读 references/supplemental-ai-tells.md 和 references/ai-tells/no.md 中的 Nynorsk 部分。无法获取可读性(应用会返回 unsupported_language),因此跳过 analyze_readability。AI 分数为 n/a。运行全部 MAX_ITER 次迭代,并按质量选择最终迭代结果(与 Core 模式相同)。警告用户:“此版本应用不支持挪威新挪威语的可读性评分。”

L 为不受支持的语言。 不要阅读 references/patterns.md。只阅读 references/supplemental-ai-tells.md。AI 分数为 n/a。不要调用 detect_text。使用规范化后的 language_code 调用 analyze_readability;如果 scores[] 返回已知 kind,只将数值记录为参考信息,不得用于终止;如果 scores[] 为空,则视为无法获取可读性。运行全部 MAX_ITER 次迭代,并按质量选择最终迭代结果(与 Core 模式相同)。遵循 references/multilingual.md 中针对不受支持语言的策略。

当 voice_active=true 时,迭代 2 和迭代 5 根据 references/per-iteration-strategies.md 中的约定使用缓存的指纹。其他迭代不得使用语气指纹。

常量(Slop or Not Pro 可用时,可通过内联参数覆盖):

  • AI_THRESHOLD = 40(覆盖方式:threshold=N)
  • MAX_ITER = 5(覆盖方式:max=N)
  • 年级容差:±1
Slop or Not Pro 设置

如果 slop_mode="slop-or-not-pro",在迭代 0 之前对源文本运行 Text Cleanup。保存:

  • source_cleaned_text
  • source_cleanup_stats

将 source_cleaned_text 用作迭代 0 的基线。对清理后的源文本评分和分析,而非原始文本。

Core 设置

如果 slop_mode="llm-only",将原始源文本用作迭代 0。不要调用 detect_text、analyze_readability 或 clean_text。

清理统计信息解析

对于 MCP clean_text,请先将 content[0].text 解码为 JSON,然后再读取:

  • cleaned_text
  • removed_invisibles
  • punctuation_replacements
  • homoglyphs_replaced
  • british_substitutions

对于 CLI 清理,将选定文本通过管道传入应用程序包二进制文件:

cat <<'TEXT_TO_CLEAN' | "/Applications/Slop Or Not.app/Contents/MacOS/slop" cleanup --json
<selected source or final text>
TEXT_TO_CLEAN

然后读取:

  • cleanedText
  • 汇总 invisibleCounts[].count
  • 汇总 punctuationCounts[].count
  • 汇总 homoglyphCounts[].count
  • 统计 britishMappings.length

将这些值规范化为以下内部结构:

{
  "invisibles": 0,
  "punctuation": 0,
  "homoglyphs": 0,
  "dialect_substitutions": 0
}
以 Slop 或 Not Pro 模式终止

**英语(L 为 en):**AI 分数 <= AI_THRESHOLD 且阅读等级测试通过,或达到 MAX_ITER。等级测试取决于 Graduate 目标的设置方式。对于从小学到大学的等级,测试始终为 |grade - target_grade| <= 1。对于 Graduate 等级:当 Graduate 是通过 level=graduate 或访谈选定的等级带(target_grade 推导为 17)时,将等级测试替换为范围成员资格 grade >= 15(FK 下限),因此 College 等级的 14 无法满足 Graduate 目标;当明确给出内联 grade=N(仅限英语)时,无论推导出的等级带为何,都保留对称的 |grade - target_grade| <= 1 容差,以确保遵循明确指定的目标。此条件仅适用于英语 FK;德语 Wiener 的 level=graduate 始终使用范围成员资格(该处没有明确的数字等级)。若未收敛,则返回最佳迭代结果:在满足等级测试的结果中选择分数最低者;若没有任何结果满足等级测试,则直接选择分数最低者。不得选择通过删减源内容中的事实或章节来降低分数的迭代结果;最终选择应遵循上文的 Preserve 覆盖规则。

**支持的非英语语言(L 属于 {es, de, it, sv, da, nb}):**没有 AI 阈值(AI 分数为 n/a)。当 L 对应公式的可读性分数落入目标等级带时终止(等级分数使用 |score - band_midpoint| <= 1,但开放式 Graduate 等级带使用范围成员资格,因此 College 等级的分数无法满足 Graduate 目标;易读性分数和 LIX 使用等级带范围成员资格;参见 references/multilingual.md),或达到 MAX_ITER。若未收敛,则返回最接近目标等级带的迭代结果。

**Nynorsk(L 为 nn):**仅使用 tells,不进行可读性分析,也不计算 AI 分数。运行全部 MAX_ITER 次迭代,并像 Core 模式一样按质量选择结果。

**不支持的语言(L 为其他值):**仅使用 tells,不计算 AI 分数。运行全部 MAX_ITER 次迭代,并像 Core 模式一样按质量选择结果。如果 analyze_readability 返回已知分数,则仅将其记录为参考信息;绝不根据该参考分数终止迭代或选择最终结果。

选定最终迭代结果后,对该文本运行 Text Cleanup。保存 final_cleanup_stats,并将清理后的文本用作最终输出。然后根据 L 执行最终评分,并遵循循环中各语言对应的规则:对于英语,运行最终的 detect_text 和 analyze_readability;对于支持的非英语语言(es、de、it、sv、da、nb),仅运行最终的 analyze_readability(跳过 detect_text,因为它会返回 not_english 和 null 分数);对于 Nynorsk,两者都跳过;对于不支持的语言,仅运行最终的 analyze_readability,并将任何已知分数记录为参考信息(AI 分数为 n/a)。

Core 模式下的完成流程

除非源文本为空或不可用,否则运行全部五种改写策略各一次。 每次迭代的 AI 评分和可读性均记录为 null。根据改写质量选择最终 迭代结果:保留原意以及源文本中的事实和章节覆盖范围,遵循指定的阅读 难度、语气和长度,并去除为 L 分支加载的提示特征文件中最明显的 AI 特征 (对于英语,使用 references/patterns.md 和 references/supplemental-ai-tells.md;对于受支持的非英语语言, 使用 references/supplemental-ai-tells.md 和 references/ai-tells/<L>.md, 其中挪威语 Bokmål 和 Nynorsk 均使用 references/ai-tells/no.md;对于 不受支持的语言,仅使用 references/supplemental-ai-tells.md,因为不存在 该语言专属的提示特征文件)。

中途 Pro 门控

如果任何 detect_text、analyze_readability 或 clean_text 调用在迭代 >= 1 时 返回 isError: true(MCP)或非零退出码(CLI),则剩余迭代改用 Core 模式。请参阅 references/per-iteration-strategies.md 中的中途 Pro 门控回退说明。

步骤 7:输出

渲染此规范区块。示例使用英文;语言行和可读性列会根据解析出的语言进行调整(参见区块下方的规则)。

## Humanized text
<final text>

## Language
English (en-US). Readability: Flesch-Kincaid grade.

## Loop history
| Iter | AI score | Readability | Strategy |
|---|---:|---:|---|
| 0 | 92% | 11.4 (College) | baseline |
| 1 | 71% | 10.8 (High school) | pattern surgery |
| 2 | 48% | 10.4 (High school) | variant + tone |
| 3 | 27% | 9.7 (High school) | grade gap |
Converged at iter 3 (<=40% AI, grade target 9 to 11).

## Text Cleanup summary
| Stage | Invisibles | Punctuation | Homoglyphs | Dialect substitutions |
|---|---:|---:|---:|---:|
| Source cleanup | 1 | 2 | 0 | 0 |
| Final cleanup | 0 | 1 | 0 | 0 |

## Highest-impact edits
- <bullet 1>
- <bullet 2>
- <bullet 3 (optional)>

语言行。 始终显示解析出的语言和变体,以及 references/multilingual.md 中可读性公式的显示名称,例如“德语(de-DE)。可读性:Wiener Sachtextformel。”对于挪威语尼诺斯克语(nn),将可读性显示为不可用,例如“挪威语尼诺斯克语(nn)。可读性:不可用。”对于不支持的语言,如果 analyze_readability 返回了已知类型,则将可读性标记为参考项,例如“法语(fr-CA)。可读性:参考 Flesch-Szigriszt。”否则将其显示为不可用。 当检测结果覆盖了已保存的配置文件语言时,标明这一点并添加说明,例如“德语(de-DE,已检测;已保存的配置文件语言为英语)。可读性:Wiener Sachtextformel。”后接:

> _Ran in German because the text was detected as German; your saved profile language is English. Override with `language=` to change._

当内联 language= 或根据变体推断出的语言覆盖了已保存的配置文件语言时,标明该来源,而不是说语言由检测结果决定。使用 references/profile-resolution.md 中的措辞,例如:

> _Ran in French because `language=fr` was set for this call; your saved profile language is English._

可读性列。 公式只在语言行中命名一次(使用 references/multilingual.md 中的显示名称)。在循环历史列中仅显示数值和括号中的级别,例如“10.6(高中)”。对于不支持语言的参考性可读性,仅显示数值和“(参考)”,因为没有目标级别。

AI 分数列(非英语)。 首行显示“n/a(检测器仅支持英语)”,之后各行显示“n/a”。在 Core 模式下,每行都显示“n/a”。

收敛行(有可读性的非英语)。 引用级别,而不是 AI 阈值,例如“在第 3 次迭代时收敛(可读性达到目标级别:高中)。”对于尼诺斯克语,或没有参考性可读性分数的不支持语言,使用“完成 MAX_ITER 次迭代(此语言没有可用的可读性指标;按质量选择)。”对于有参考性可读性分数的不支持语言,使用“完成 MAX_ITER 次迭代(此语言的可读性仅供参考;按质量选择)。”

仅当实际运行了 Slop 或 Not Text Cleanup 时,才显示 Text Cleanup summary。面向用户的输出中不要显示后端名称。

如果所有清理计数均为零,则将表格替换为:

## Text Cleanup summary
Slop or Not found no hidden characters, punctuation artifacts, homoglyphs, or dialect substitutions to clean.

当 Slop 或 Not Pro 未收敛时(英语),将收敛行替换为:

Did not converge below threshold in MAX_ITER iterations. Best result shown above
(iter N at S%). Re-run with `threshold=40 max=8` for a more aggressive loop,
or `tone=casual` if professional tone is constraining the rewrite.

对于非英语的未收敛情况,将收敛行替换为:

Did not reach the target band in MAX_ITER iterations. Closest result shown above (iter N, <formula>: X.X). Re-run with a different `level=` to widen the target.

当 Slop 或 Not Pro 不可用时,将分数和等级显示为 n/a,并在历史表格后添加此说明:

> _Ran without Slop or Not Pro. Add Slop or Not Pro for on-device AI detector scoring, readability checks, Text Cleanup, and cleanup stats: <https://slopornot.ai/download>_

对于执行过程中的 Core 模式回退迭代,将分数和等级显示为 n/a,并添加此说明:

> _Iterations N-M ran without on-device scoring. Local stats are unavailable for those iterations._

如果启用了语气匹配,则添加此页脚说明:

> _Voice matched from <path> (fingerprint cached <date>)._

如果步骤 4 中语气提取失败,则改为添加此页脚说明:

> _Voice extraction failed; ran without voice match. Re-run with `/agentic-humanizer reset voice` to retry._

Pointer files

  • harnesses/claude-code.md · harnesses/codex.md · harnesses/cursor.md · harnesses/gemini-cli.md · harnesses/opencode.md · harnesses/generic.md
  • references/patterns.md(权威的 33 条 AI 特征,仅英文)
  • references/detection-guidance.md(仅英文的误报防护指南:哪些内容 不应标记,以及应保留哪些人工写作信号)
  • references/supplemental-ai-tells.md(补充的语言无关 AI 特征)
  • references/multilingual.md(多语言可读性注册表)
  • references/profile-resolution.md(第 3 步的已保存配置与检测到的语言 决策表)
  • references/ai-tells/<code>.md(各语言特征:es、de、it、sv、da、no)
  • references/per-iteration-strategies.md(循环策略指南)
  • references/voice-fingerprint.md(语气样本提取与循环注入约定)
  • references/slop-cli-setup.md · references/slop-mcp-setup.md (安装指南;用户询问设备端 AI 检测器评分设置时,向其展示)

评论

支持 Markdown