[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M71AXGRBTG1D7FRDPNRSZ00P":3,"skill-same:01M71AXGRBTG1D7FRDPNRSZ00P":162},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":23,"publishedAt":43,"linkOnly":44,"markdownContent":45,"markdownBody":46,"frontMatter":47,"refName":54,"commitSha":55,"skillDirectory":56,"forksCount":57,"repositoryHtmlUrl":58,"repositoryHomepageUrl":59,"ownerHtmlUrl":60,"ownerBlogUrl":61,"ownerDescription":62,"updatedAt":63,"install":64,"resources":77},"01M71AXGRBTG1D7FRDPNRSZ00P","humanize",null,"Prose-quality cleanup for text real users read: READMEs and docs, blog\nposts, marketing pages, templates, locale strings, UI text, and copy that\ncode generates, in any language or file type (md, html, Blade\u002FERB\u002FLiquid,\njson\u002Fyaml\u002Fpo, jsx\u002Fvue\u002Fsvelte, Go\u002FRust\u002FPHP\u002FPython\u002FNode generators), keeping\nthe author's voice. Markdown gets deterministic punctuation fixes; every\ntype gets a slop scan, surgical edits, and a re-scan. Use when asked to\n\"humanize\" or \"remove AI slop\" from user-facing text. Do not invoke for\ncode logic, code comments, log text, prompts, or agent instructions.\nPreserve facts.","ariadoss\u002Fsuperskills","ariadoss","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F414341?v=4","01M71AC7383PT6JCRZSQJ4AVTM","Danilo Stern-Sapad","01M71AC73Y7NTBTJ9KQYNENRRE",12,"MIT","https:\u002F\u002Fgithub.com\u002Fariadoss\u002Fsuperskills\u002Fblob\u002Fmain\u002Fskills\u002Fhumanize\u002FSKILL.md",[18],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000009","前端开发","SCENARIO","使用场景",[5,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42],"svelte","write","read","markdown","text","log","code","Bash","when","invoke","cleanup","rust","re","remove","strings","slop","code comments","posts","agent instructions","2026-11-10 10:12:30",false,"---\nname: humanize\ndescription: |\n  Prose-quality cleanup for text real users read: READMEs and docs, blog\n  posts, marketing pages, templates, locale strings, UI text, and copy that\n  code generates, in any language or file type (md, html, Blade\u002FERB\u002FLiquid,\n  json\u002Fyaml\u002Fpo, jsx\u002Fvue\u002Fsvelte, Go\u002FRust\u002FPHP\u002FPython\u002FNode generators), keeping\n  the author's voice. Markdown gets deterministic punctuation fixes; every\n  type gets a slop scan, surgical edits, and a re-scan. Use when asked to\n  \"humanize\" or \"remove AI slop\" from user-facing text. Do not invoke for\n  code logic, code comments, log text, prompts, or agent instructions.\n  Preserve facts.\nallowed-tools:\n  - Bash\n  - Read\n  - Write\n  - Edit\n  - Grep\n---\n\n# Humanize — cut AI slop, keep the voice\n\nDeterministic fixes and a scan do the measuring. **You, the agent, then make the\nedits**: surgical, subtractive, one flagged span at a time with the Edit tool,\napplied directly to the working copy without asking first. A re-scan is the gate.\nNever regenerate or paraphrase the whole text; a whole-document rewrite loses the\nauthor's voice and adds new tells.\n\n## Scope\n\nUse this skill on language people read: READMEs and documentation, blog\nposts, marketing pages and copy, help text, email or notification text,\nlocale strings, visible UI labels and messages, and the pages or files that\ncode generates for people to read. It is by content, not extension: a\nlanding page is in scope as `.html`, `.mdx`, `.vue`, a `.liquid` or `.blade.php`\ntemplate, a string in `locales\u002Fen.json`, or the HTML a Go, Rust, PHP, Python\nor Node generator writes out.\n\nOut of scope, whatever the extension: code logic, code comments, log and\nerror text, prompts, agent instructions (`SKILL.md`, `AGENTS.md`, `CLAUDE.md`,\n`prompts\u002F`), tests and fixtures, and vendored or generated trees\n(`node_modules`, `vendor`, `target`, `dist`, `build`). A README is always in\nscope, even inside a `tests\u002F` folder. Past changelog entries are history:\nscan them, but edit only text the change adds.\nInternal prompts, agent instructions, plans, and code comments are out of scope.\nTechnical wording in those files serves an operational purpose; style cleanup\ncan change instructions or obscure meaning.\n\nThe toolkit decides this in one place. Ask it, never guess from the extension:\n\n```bash\npython3 \"$TOOLKIT\u002Fuserfacing.py\" classify \u003Cpath>   # markdown | text | html | template | locale | source | none\npython3 \"$TOOLKIT\u002Fuserfacing.py\" extract  \u003Cpath>   # the copy only, same line numbers as the file\n```\n\n`none` means leave the file alone. What each type yields:\n\n| type | files | what is scanned |\n|---|---|---|\n| `markdown`, `text` | `.md .mdx .markdown .txt .rst .adoc` | prose; code fences, inline code, link targets, comments and front matter are dropped except copy keys (`title`, `description`, `summary`, ...) |\n| `html`, `template` | `.html .htm`, Blade, ERB, Twig, Liquid, Jinja, Handlebars, Nunjucks, EJS, Go templates | text nodes and `alt`\u002F`title`\u002F`placeholder`\u002Fmeta description; tags, `\u003Cscript>`\u002F`\u003Cstyle>`\u002F`\u003Ccode>`, template logic and comments are dropped; sentence-like strings inside translation calls such as `{{ __('...') }}` are kept |\n| `locale` | `.json .yaml .yml` under `locales\u002F`, `i18n\u002F`, `lang\u002F`, `translations\u002F` and the like or named `en.json`; `.po .pot .properties .strings .arb` | message values only, never keys |\n| `source` (components) | `.jsx .tsx .vue .svelte .astro` | JSX and template text, sentence-like string literals |\n| `source` (generators) | `.go .rs .php .py .rb .js .ts .java .kt .swift .cs` and the like, **only** when the file visibly renders pages or writes files (HTML in strings, `WriteFile`, `render_template`, `res.send`, `echo`, ...) | string literals of four or more words in sentence shape; comments, docstrings, log\u002Fprint\u002Fpanic\u002Fraise text, SQL and imports are excluded; PHP also scans the HTML outside `\u003C?php ?>` |\n\nExtraction is conservative by design: short labels and one-word strings are\nnot scanned from code. A code file with no output signal is `none`. Symlinks\nand files over 512KB are never read and are not reported; strings assigned to\na prompt or instruction name are never copy.\n\n**Markdown and plain text** (`markdown`, `text`) run the whole workflow below.\n**Every other type** must never go through `normalize.py`: it would corrupt\nmarkup, JSON or source. For these, use Step 2 on the extraction\n(`extract \u003Cpath> > \u003Cscratch>.txt`, then `slop_report.py \u003Cscratch>.txt`; line\nnumbers match the source), then apply Step 3 as surgical Edit calls on the\n**source file's** string or text span only, preserving interpolation, markup\nand syntax. Re-scan the extraction as the Step 4 gate and run the project's\ntests or build. Skip Step 1.\n\nFor Markdown runs, `TOOLKIT` below means the `toolkit\u002F` directory inside this skill's own directory.\nThe host prints that directory when the skill loads (Claude Code: \"Base directory\nfor this skill: …\") — use it. Do **not** derive it from `$0`: in your shell that\nnames the shell, not this file. Confirm the path before running a toolkit command, so a\nwrong one fails loudly instead of step 1 running nothing:\n\n```bash\nTOOLKIT=\"\u003Cbase directory for this skill>\u002Ftoolkit\"\n# Fallback, only if the host printed no base directory. Never the shell's cwd:\n# that would run whatever toolkit\u002F happens to sit there.\nfor d in \"$TOOLKIT\" \"$HOME\u002F.claude\u002Fskills\u002Fhumanize\u002Ftoolkit\"; do\n  [ -f \"$d\u002Fslop_report.py\" ] && { TOOLKIT=\"$d\"; break; }\ndone\n[ -f \"$TOOLKIT\u002Fslop_report.py\" ] || { echo \"humanize toolkit not found\" >&2; exit 1; }\n```\n\n## Prerequisites\n\nThe toolkit runs on the Python standard library alone. Two optional packages\nimprove it, and their absence degrades cleanly rather than failing:\n\n| Optional | Used for | Without it |\n|---|---|---|\n| `spacy` + `en_core_web_sm` | telling an independent clause from an appositive, so a dash becomes a period rather than a comma splice | undecidable dashes are **kept** and reported on stderr; expansions still become colons |\n| `nltk` | better tokenizing and CMU-dict syllable counts for the complexity index | falls back to a regex tokenizer and a syllable heuristic |\n\n```bash\npip install spacy && python3 -m spacy download en_core_web_sm   # recommended\npip install nltk                                                # optional\n```\n\nNote: when `nltk` is installed, the scorer downloads the `punkt` tokenizer once,\nquietly, on first use.\n\n## Arguments\n\n`\u003Cfile> [exempt.txt]`\n\n- `file` — the user-facing copy to clean. Markdown and text: write to\n  `\u003Cdir>\u002F\u003Cname>_humanized.md`. **Never overwrite the source** with the normalizer's\n  output. Other types are edited in place at the flagged spans (see Scope). Output\n  derived from private text must not be committed.\n- `exempt.txt` — optional allowlist of product names and terms of art, one token\n  per line, so the scan and your edits leave legitimate vocabulary alone. See\n  `toolkit\u002Fexempt_example.txt`.\n\n## Steps\n\n**1. Em-dashes — the default is to replace them.**\n\n```bash\npython3 \"$TOOLKIT\u002Fnormalize.py\" \"\u003Cfile>\" \"\u003Cdir>\u002F\u003Cname>_humanized.md\"\n```\n\n`normalize.py` runs `emdash_fix.py` then `mla_format.py` and writes the output\nonly if both succeed, so a failure leaves no half-written `_humanized.md` to\nmistake for a result. It refuses to overwrite the source. Code blocks, hard\nbreaks and indentation pass through untouched.\n\nReplace by clause role: clean appositive → commas, independent clause → period,\nexpansion → colon, break-off → period. Keep an em-dash only where replacing it\ngenuinely hurts the line, not as a default. A kept dash is sparse (~2 per 1,000\nwords), **lone** rather than paired, and closed\u002Funspaced (`word—word`), which\n`mla_format.py` enforces along with single sentence spacing. Straighten stray\ncurly quotes. Nothing else is auto-safe: never let a tool do synonym\nsubstitution, which corrupts meaning.\n\n**2. Scan the working copy.**\n\n```bash\npython3 \"$TOOLKIT\u002Fslop_report.py\" \"\u003Cdir>\u002F\u003Cname>_humanized.md\" [--exempt \u003Cexempt.txt>]\n```\n\nYou get `slop_index`, `complexity_index`, EQ-Bench slop words\u002Fbigrams\u002Ftrigrams\nwith line numbers, and construction densities (way-x, aphorism, as-if, magic\nadverb, pushbutton, distancing verb, filler).\n\nThe **rhetorical scaffolding** group flags stock scene invitations, announced\nquestions or takeaways, and conversational filler. These are review candidates,\nnot proof of AI authorship or automatic deletions. They do not affect the\nlexical `slop_index`, which can remain zero while constructions need editing.\n\nThe **editorial patterns** group checks selected stock openers and closers,\ncontrast formulas, and chatbot wrappers. A match records a shape, not a verdict:\npreserve both claims in a real comparison, purposeful fictional rhythm or\nreader address, and actual greetings, offers, or closings in correspondence.\nWhen a contrast adds only emphasis, state its useful claim directly. Retain\nthe negative half only if it corrects a real misconception or carries useful\ninformation; do not turn discarded framing into a new assertion.\nPython detects the wording; you decide whether it serves the passage. Resolve\neach finding by editing it or explaining the hold. Do not impose Wikipedia's\nmarkup or neutral-register conventions on marketing, documentation, or fiction.\n\n**3. Apply the edits to `\u003Cdir>\u002F\u003Cname>_humanized.md` with the Edit tool.**\n\nWork through the flags from step 2 and fix each one in place, without stopping\nto ask for approval. Each edit touches only the flagged span and what it needs\nto stay grammatical. In this order:\n\n1. **Delete** — filler adverbs, rhetorical scaffolding, redundant restatement (a\n   sentence that merely repeats the one before it). This is the biggest win.\n2. **Compress** — only where meaning and temperature survive intact.\n3. **Hold** — if a flagged line is vivid, specific, and reads aloud well, **leave\n   it** and note it for the report. A flag is a reason to look, not a mandate to\n   change.\n4. **Substitute only as a last resort**, and only for something strictly plainer\n   with the same meaning. **Never swap one charged word for another to clear a\n   flag** (`delve`→`dig into`, `crucial`→`key`). That flattens voice, and it is\n   exactly what the scanner would reward.\n5. **Normalize punctuation last.**\n\nAlso read for these construction roles when the scanner misses a variant:\nan invitation to picture something before stating it, a label announcing the\nnext question or lesson, or a stock claim of candor before a plain assertion.\nFlag unnecessary scaffolding during that read, then edit just that span. A\nsetup that adds nothing can usually be deleted while keeping its useful point.\nPreserve concrete thought experiments, direct questions, literal uses,\nquotations, code, and distinctive narrator or character voice. In fiction,\ncheck whether a reader address or rhetorical question creates perspective,\nsuspense, or rhythm before changing it; retain it when that function matters.\nExplain a hold rather than flattening the passage to clear a flag.\n\n**Preserve meaning absolutely.** Never change a fact, number, name, date, or the\nlogical relation between statements. Edit prose, not content.\n\n**4. Re-scan — this is the gate.**\n\nRun `slop_report.py` again on the edited file. **PASS** when every genuine flag\nfrom step 2 is either removed by a disciplined edit, a deliberately held vivid\nline (name which, and why), or an exempt domain term — **and** the edits\nintroduced no new flags — **and** meaning is intact.\n\nThe scan and editorial read must cover the version being handed off. An earlier\ndraft's report does not validate a later adaptation or replacement paragraph.\n\n`slop_index == 0` is **not** a pass condition. Do not chase the index to zero:\nthat rewards synonym-swapping and flattening. A held vivid word leaving a nonzero\nindex is the correct outcome. At most **three rounds**; if something cannot be\nfixed without harming the prose, hold it and say so.\n\n**5. Meaning check, then hand off.** Diff the output against the source and\nconfirm no fact, number or name drifted. Report: the output path, what you cut,\nwhat you deliberately held and why, and the before\u002Fafter slop headline.\n\n## MLA style for all output\n\n- Em-dashes closed and unspaced; prefer replacing (step 1).\n- One space after sentence-ending punctuation.\n- Spell out numbers writable in one or two words (`twenty-seven`, `two thousand`);\n  numerals for the rest and with units. Restore digit forms a paraphrase\n  introduced (`450` → `four hundred fifty`) — but never change the numeric value.\n- Double quotes for quotations, single for nested, straight and consistent.\n\n## Never\n\n- Never regenerate, paraphrase or rewrite the whole text. Edit flagged spans only.\n- Never swap a charged word for another charged word; never alter facts, numbers,\n  names or values.\n- Never commit output derived from private text.\n\n## Attribution\n\nThe scan reuses public research data, redistributed under the licenses below. See\n`toolkit\u002FNOTICE.md` for the full list.\n\n- EQ-Bench slop lists and slop-index formula — Sam Paech, MIT.\n- Over-represented words and phrases — `slop-forensics` (MIT) \u002F `antislop-sampler`\n  (Apache-2.0), Sam Paech.\n- Academic AI-overused vocabulary — Reinhart et al., PNAS 2025\n  ([arXiv:2410.16107](https:\u002F\u002Farxiv.org\u002Fabs\u002F2410.16107)); Juzek, COLING 2025.\n- `top2000_en.json` — common-word frequency list via `wordfreq` (Apache-2.0).\n- Selected editorial patterns — [blader\u002Fhumanizer](https:\u002F\u002Fgithub.com\u002Fblader\u002Fhumanizer),\n  MIT; source revision and license are recorded in `toolkit\u002FNOTICE.md`.\n","# Humanize — cut AI slop, keep the voice\n\nDeterministic fixes and a scan do the measuring. **You, the agent, then make the\nedits**: surgical, subtractive, one flagged span at a time with the Edit tool,\napplied directly to the working copy without asking first. A re-scan is the gate.\nNever regenerate or paraphrase the whole text; a whole-document rewrite loses the\nauthor's voice and adds new tells.\n\n## Scope\n\nUse this skill on language people read: READMEs and documentation, blog\nposts, marketing pages and copy, help text, email or notification text,\nlocale strings, visible UI labels and messages, and the pages or files that\ncode generates for people to read. It is by content, not extension: a\nlanding page is in scope as `.html`, `.mdx`, `.vue`, a `.liquid` or `.blade.php`\ntemplate, a string in `locales\u002Fen.json`, or the HTML a Go, Rust, PHP, Python\nor Node generator writes out.\n\nOut of scope, whatever the extension: code logic, code comments, log and\nerror text, prompts, agent instructions (`SKILL.md`, `AGENTS.md`, `CLAUDE.md`,\n`prompts\u002F`), tests and fixtures, and vendored or generated trees\n(`node_modules`, `vendor`, `target`, `dist`, `build`). A README is always in\nscope, even inside a `tests\u002F` folder. Past changelog entries are history:\nscan them, but edit only text the change adds.\nInternal prompts, agent instructions, plans, and code comments are out of scope.\nTechnical wording in those files serves an operational purpose; style cleanup\ncan change instructions or obscure meaning.\n\nThe toolkit decides this in one place. Ask it, never guess from the extension:\n\n```bash\npython3 \"$TOOLKIT\u002Fuserfacing.py\" classify \u003Cpath>   # markdown | text | html | template | locale | source | none\npython3 \"$TOOLKIT\u002Fuserfacing.py\" extract  \u003Cpath>   # the copy only, same line numbers as the file\n```\n\n`none` means leave the file alone. What each type yields:\n\n| type | files | what is scanned |\n|---|---|---|\n| `markdown`, `text` | `.md .mdx .markdown .txt .rst .adoc` | prose; code fences, inline code, link targets, comments and front matter are dropped except copy keys (`title`, `description`, `summary`, ...) |\n| `html`, `template` | `.html .htm`, Blade, ERB, Twig, Liquid, Jinja, Handlebars, Nunjucks, EJS, Go templates | text nodes and `alt`\u002F`title`\u002F`placeholder`\u002Fmeta description; tags, `\u003Cscript>`\u002F`\u003Cstyle>`\u002F`\u003Ccode>`, template logic and comments are dropped; sentence-like strings inside translation calls such as `{{ __('...') }}` are kept |\n| `locale` | `.json .yaml .yml` under `locales\u002F`, `i18n\u002F`, `lang\u002F`, `translations\u002F` and the like or named `en.json`; `.po .pot .properties .strings .arb` | message values only, never keys |\n| `source` (components) | `.jsx .tsx .vue .svelte .astro` | JSX and template text, sentence-like string literals |\n| `source` (generators) | `.go .rs .php .py .rb .js .ts .java .kt .swift .cs` and the like, **only** when the file visibly renders pages or writes files (HTML in strings, `WriteFile`, `render_template`, `res.send`, `echo`, ...) | string literals of four or more words in sentence shape; comments, docstrings, log\u002Fprint\u002Fpanic\u002Fraise text, SQL and imports are excluded; PHP also scans the HTML outside `\u003C?php ?>` |\n\nExtraction is conservative by design: short labels and one-word strings are\nnot scanned from code. A code file with no output signal is `none`. Symlinks\nand files over 512KB are never read and are not reported; strings assigned to\na prompt or instruction name are never copy.\n\n**Markdown and plain text** (`markdown`, `text`) run the whole workflow below.\n**Every other type** must never go through `normalize.py`: it would corrupt\nmarkup, JSON or source. For these, use Step 2 on the extraction\n(`extract \u003Cpath> > \u003Cscratch>.txt`, then `slop_report.py \u003Cscratch>.txt`; line\nnumbers match the source), then apply Step 3 as surgical Edit calls on the\n**source file's** string or text span only, preserving interpolation, markup\nand syntax. Re-scan the extraction as the Step 4 gate and run the project's\ntests or build. Skip Step 1.\n\nFor Markdown runs, `TOOLKIT` below means the `toolkit\u002F` directory inside this skill's own directory.\nThe host prints that directory when the skill loads (Claude Code: \"Base directory\nfor this skill: …\") — use it. Do **not** derive it from `$0`: in your shell that\nnames the shell, not this file. Confirm the path before running a toolkit command, so a\nwrong one fails loudly instead of step 1 running nothing:\n\n```bash\nTOOLKIT=\"\u003Cbase directory for this skill>\u002Ftoolkit\"\n# Fallback, only if the host printed no base directory. Never the shell's cwd:\n# that would run whatever toolkit\u002F happens to sit there.\nfor d in \"$TOOLKIT\" \"$HOME\u002F.claude\u002Fskills\u002Fhumanize\u002Ftoolkit\"; do\n  [ -f \"$d\u002Fslop_report.py\" ] && { TOOLKIT=\"$d\"; break; }\ndone\n[ -f \"$TOOLKIT\u002Fslop_report.py\" ] || { echo \"humanize toolkit not found\" >&2; exit 1; }\n```\n\n## Prerequisites\n\nThe toolkit runs on the Python standard library alone. Two optional packages\nimprove it, and their absence degrades cleanly rather than failing:\n\n| Optional | Used for | Without it |\n|---|---|---|\n| `spacy` + `en_core_web_sm` | telling an independent clause from an appositive, so a dash becomes a period rather than a comma splice | undecidable dashes are **kept** and reported on stderr; expansions still become colons |\n| `nltk` | better tokenizing and CMU-dict syllable counts for the complexity index | falls back to a regex tokenizer and a syllable heuristic |\n\n```bash\npip install spacy && python3 -m spacy download en_core_web_sm   # recommended\npip install nltk                                                # optional\n```\n\nNote: when `nltk` is installed, the scorer downloads the `punkt` tokenizer once,\nquietly, on first use.\n\n## Arguments\n\n`\u003Cfile> [exempt.txt]`\n\n- `file` — the user-facing copy to clean. Markdown and text: write to\n  `\u003Cdir>\u002F\u003Cname>_humanized.md`. **Never overwrite the source** with the normalizer's\n  output. Other types are edited in place at the flagged spans (see Scope). Output\n  derived from private text must not be committed.\n- `exempt.txt` — optional allowlist of product names and terms of art, one token\n  per line, so the scan and your edits leave legitimate vocabulary alone. See\n  `toolkit\u002Fexempt_example.txt`.\n\n## Steps\n\n**1. Em-dashes — the default is to replace them.**\n\n```bash\npython3 \"$TOOLKIT\u002Fnormalize.py\" \"\u003Cfile>\" \"\u003Cdir>\u002F\u003Cname>_humanized.md\"\n```\n\n`normalize.py` runs `emdash_fix.py` then `mla_format.py` and writes the output\nonly if both succeed, so a failure leaves no half-written `_humanized.md` to\nmistake for a result. It refuses to overwrite the source. Code blocks, hard\nbreaks and indentation pass through untouched.\n\nReplace by clause role: clean appositive → commas, independent clause → period,\nexpansion → colon, break-off → period. Keep an em-dash only where replacing it\ngenuinely hurts the line, not as a default. A kept dash is sparse (~2 per 1,000\nwords), **lone** rather than paired, and closed\u002Funspaced (`word—word`), which\n`mla_format.py` enforces along with single sentence spacing. Straighten stray\ncurly quotes. Nothing else is auto-safe: never let a tool do synonym\nsubstitution, which corrupts meaning.\n\n**2. Scan the working copy.**\n\n```bash\npython3 \"$TOOLKIT\u002Fslop_report.py\" \"\u003Cdir>\u002F\u003Cname>_humanized.md\" [--exempt \u003Cexempt.txt>]\n```\n\nYou get `slop_index`, `complexity_index`, EQ-Bench slop words\u002Fbigrams\u002Ftrigrams\nwith line numbers, and construction densities (way-x, aphorism, as-if, magic\nadverb, pushbutton, distancing verb, filler).\n\nThe **rhetorical scaffolding** group flags stock scene invitations, announced\nquestions or takeaways, and conversational filler. These are review candidates,\nnot proof of AI authorship or automatic deletions. They do not affect the\nlexical `slop_index`, which can remain zero while constructions need editing.\n\nThe **editorial patterns** group checks selected stock openers and closers,\ncontrast formulas, and chatbot wrappers. A match records a shape, not a verdict:\npreserve both claims in a real comparison, purposeful fictional rhythm or\nreader address, and actual greetings, offers, or closings in correspondence.\nWhen a contrast adds only emphasis, state its useful claim directly. Retain\nthe negative half only if it corrects a real misconception or carries useful\ninformation; do not turn discarded framing into a new assertion.\nPython detects the wording; you decide whether it serves the passage. Resolve\neach finding by editing it or explaining the hold. Do not impose Wikipedia's\nmarkup or neutral-register conventions on marketing, documentation, or fiction.\n\n**3. Apply the edits to `\u003Cdir>\u002F\u003Cname>_humanized.md` with the Edit tool.**\n\nWork through the flags from step 2 and fix each one in place, without stopping\nto ask for approval. Each edit touches only the flagged span and what it needs\nto stay grammatical. In this order:\n\n1. **Delete** — filler adverbs, rhetorical scaffolding, redundant restatement (a\n   sentence that merely repeats the one before it). This is the biggest win.\n2. **Compress** — only where meaning and temperature survive intact.\n3. **Hold** — if a flagged line is vivid, specific, and reads aloud well, **leave\n   it** and note it for the report. A flag is a reason to look, not a mandate to\n   change.\n4. **Substitute only as a last resort**, and only for something strictly plainer\n   with the same meaning. **Never swap one charged word for another to clear a\n   flag** (`delve`→`dig into`, `crucial`→`key`). That flattens voice, and it is\n   exactly what the scanner would reward.\n5. **Normalize punctuation last.**\n\nAlso read for these construction roles when the scanner misses a variant:\nan invitation to picture something before stating it, a label announcing the\nnext question or lesson, or a stock claim of candor before a plain assertion.\nFlag unnecessary scaffolding during that read, then edit just that span. A\nsetup that adds nothing can usually be deleted while keeping its useful point.\nPreserve concrete thought experiments, direct questions, literal uses,\nquotations, code, and distinctive narrator or character voice. In fiction,\ncheck whether a reader address or rhetorical question creates perspective,\nsuspense, or rhythm before changing it; retain it when that function matters.\nExplain a hold rather than flattening the passage to clear a flag.\n\n**Preserve meaning absolutely.** Never change a fact, number, name, date, or the\nlogical relation between statements. Edit prose, not content.\n\n**4. Re-scan — this is the gate.**\n\nRun `slop_report.py` again on the edited file. **PASS** when every genuine flag\nfrom step 2 is either removed by a disciplined edit, a deliberately held vivid\nline (name which, and why), or an exempt domain term — **and** the edits\nintroduced no new flags — **and** meaning is intact.\n\nThe scan and editorial read must cover the version being handed off. An earlier\ndraft's report does not validate a later adaptation or replacement paragraph.\n\n`slop_index == 0` is **not** a pass condition. Do not chase the index to zero:\nthat rewards synonym-swapping and flattening. A held vivid word leaving a nonzero\nindex is the correct outcome. At most **three rounds**; if something cannot be\nfixed without harming the prose, hold it and say so.\n\n**5. Meaning check, then hand off.** Diff the output against the source and\nconfirm no fact, number or name drifted. Report: the output path, what you cut,\nwhat you deliberately held and why, and the before\u002Fafter slop headline.\n\n## MLA style for all output\n\n- Em-dashes closed and unspaced; prefer replacing (step 1).\n- One space after sentence-ending punctuation.\n- Spell out numbers writable in one or two words (`twenty-seven`, `two thousand`);\n  numerals for the rest and with units. Restore digit forms a paraphrase\n  introduced (`450` → `four hundred fifty`) — but never change the numeric value.\n- Double quotes for quotations, single for nested, straight and consistent.\n\n## Never\n\n- Never regenerate, paraphrase or rewrite the whole text. Edit flagged spans only.\n- Never swap a charged word for another charged word; never alter facts, numbers,\n  names or values.\n- Never commit output derived from private text.\n\n## Attribution\n\nThe scan reuses public research data, redistributed under the licenses below. See\n`toolkit\u002FNOTICE.md` for the full list.\n\n- EQ-Bench slop lists and slop-index formula — Sam Paech, MIT.\n- Over-represented words and phrases — `slop-forensics` (MIT) \u002F `antislop-sampler`\n  (Apache-2.0), Sam Paech.\n- Academic AI-overused vocabulary — Reinhart et al., PNAS 2025\n  ([arXiv:2410.16107](https:\u002F\u002Farxiv.org\u002Fabs\u002F2410.16107)); Juzek, COLING 2025.\n- `top2000_en.json` — common-word frequency list via `wordfreq` (Apache-2.0).\n- Selected editorial patterns — [blader\u002Fhumanizer](https:\u002F\u002Fgithub.com\u002Fblader\u002Fhumanizer),\n  MIT; source revision and license are recorded in `toolkit\u002FNOTICE.md`.\n",{"name":5,"description":48,"allowed-tools":49},"Prose-quality cleanup for text real users read: READMEs and docs, blog\nposts, marketing pages, templates, locale strings, UI text, and copy that\ncode generates, in any language or file type (md, html, Blade\u002FERB\u002FLiquid,\njson\u002Fyaml\u002Fpo, jsx\u002Fvue\u002Fsvelte, Go\u002FRust\u002FPHP\u002FPython\u002FNode generators), keeping\nthe author's voice. Markdown gets deterministic punctuation fixes; every\ntype gets a slop scan, surgical edits, and a re-scan. Use when asked to\n\"humanize\" or \"remove AI slop\" from user-facing text. Do not invoke for\ncode logic, code comments, log text, prompts, or agent instructions.\nPreserve facts.\n",[31,50,51,52,53],"Read","Write","Edit","Grep","main","c7ec8d78e5dc37484c2cfe90ab04de163d97dd41","skills\u002Fhumanize",0,"https:\u002F\u002Fgithub.com\u002Fariadoss\u002Fsuperskills","https:\u002F\u002Fhyperion360.com\u002Fblog\u002Fparallel-ai-agents-engineering-workflow\u002F","https:\u002F\u002Fgithub.com\u002Fariadoss","https:\u002F\u002Fdanilosapad.com\u002F","CEO & Founder of @Hyperion360","2026-11-01 12:36:50",{"source":8,"skillName":5,"commands":65,"prompt":75,"zipAvailable":76},[66,69,72],{"tool":67,"command":68},"npx","npx skills add ariadoss\u002Fsuperskills --skill humanize",{"tool":70,"command":71},"bunx","bunx skills add ariadoss\u002Fsuperskills --skill humanize",{"tool":73,"command":74},"pnpm","pnpm dlx skills add ariadoss\u002Fsuperskills --skill humanize","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fariadoss\u002Fsuperskills\u002Fblob\u002Fmain\u002Fskills\u002Fhumanize\u002FSKILL.md",true,[78,84,90,94,98,102,106,110,114,118,122,126,130,134,138,142,146,150,154,158],{"path":79,"resourceType":80,"resourceTypeDesc":81,"sizeBytes":82,"sourceHtmlUrl":83},"toolkit\u002F__init__.py","SCRIPT","脚本",3517,"https:\u002F\u002Fgithub.com\u002Fariadoss\u002Fsuperskills\u002Fblob\u002Fmain\u002Fskills\u002Fhumanize\u002Ftoolkit\u002F__init__.py",{"path":85,"resourceType":86,"resourceTypeDesc":87,"sizeBytes":88,"sourceHtmlUrl":89},"toolkit\u002Fai_overused_research.json","REFERENCE","参考文档",9785,"https:\u002F\u002Fgithub.com\u002Fariadoss\u002Fsuperskills\u002Fblob\u002Fmain\u002Fskills\u002Fhumanize\u002Ftoolkit\u002Fai_overused_research.json",{"path":91,"resourceType":86,"resourceTypeDesc":87,"sizeBytes":92,"sourceHtmlUrl":93},"toolkit\u002Fai_slop_wordlist.json",3295,"https:\u002F\u002Fgithub.com\u002Fariadoss\u002Fsuperskills\u002Fblob\u002Fmain\u002Fskills\u002Fhumanize\u002Ftoolkit\u002Fai_slop_wordlist.json",{"path":95,"resourceType":86,"resourceTypeDesc":87,"sizeBytes":96,"sourceHtmlUrl":97},"toolkit\u002Fcliche_signals.json",2453,"https:\u002F\u002Fgithub.com\u002Fariadoss\u002Fsuperskills\u002Fblob\u002Fmain\u002Fskills\u002Fhumanize\u002Ftoolkit\u002Fcliche_signals.json",{"path":99,"resourceType":80,"resourceTypeDesc":81,"sizeBytes":100,"sourceHtmlUrl":101},"toolkit\u002Fconstruction_scanner.py",25778,"https:\u002F\u002Fgithub.com\u002Fariadoss\u002Fsuperskills\u002Fblob\u002Fmain\u002Fskills\u002Fhumanize\u002Ftoolkit\u002Fconstruction_scanner.py",{"path":103,"resourceType":80,"resourceTypeDesc":81,"sizeBytes":104,"sourceHtmlUrl":105},"toolkit\u002Femdash_fix.py",11428,"https:\u002F\u002Fgithub.com\u002Fariadoss\u002Fsuperskills\u002Fblob\u002Fmain\u002Fskills\u002Fhumanize\u002Ftoolkit\u002Femdash_fix.py",{"path":107,"resourceType":80,"resourceTypeDesc":81,"sizeBytes":108,"sourceHtmlUrl":109},"toolkit\u002Feq_bench_slop_index.py",7849,"https:\u002F\u002Fgithub.com\u002Fariadoss\u002Fsuperskills\u002Fblob\u002Fmain\u002Fskills\u002Fhumanize\u002Ftoolkit\u002Feq_bench_slop_index.py",{"path":111,"resourceType":86,"resourceTypeDesc":87,"sizeBytes":112,"sourceHtmlUrl":113},"toolkit\u002Feq_bench_slop_list_bigrams.json",3488,"https:\u002F\u002Fgithub.com\u002Fariadoss\u002Fsuperskills\u002Fblob\u002Fmain\u002Fskills\u002Fhumanize\u002Ftoolkit\u002Feq_bench_slop_list_bigrams.json",{"path":115,"resourceType":86,"resourceTypeDesc":87,"sizeBytes":116,"sourceHtmlUrl":117},"toolkit\u002Feq_bench_slop_list_trigrams.json",4832,"https:\u002F\u002Fgithub.com\u002Fariadoss\u002Fsuperskills\u002Fblob\u002Fmain\u002Fskills\u002Fhumanize\u002Ftoolkit\u002Feq_bench_slop_list_trigrams.json",{"path":119,"resourceType":86,"resourceTypeDesc":87,"sizeBytes":120,"sourceHtmlUrl":121},"toolkit\u002Feq_bench_slop_list.json",13502,"https:\u002F\u002Fgithub.com\u002Fariadoss\u002Fsuperskills\u002Fblob\u002Fmain\u002Fskills\u002Fhumanize\u002Ftoolkit\u002Feq_bench_slop_list.json",{"path":123,"resourceType":86,"resourceTypeDesc":87,"sizeBytes":124,"sourceHtmlUrl":125},"toolkit\u002Feq_bench_slop_phrase_prob_adjustments.json",1902594,"https:\u002F\u002Fgithub.com\u002Fariadoss\u002Fsuperskills\u002Fblob\u002Fmain\u002Fskills\u002Fhumanize\u002Ftoolkit\u002Feq_bench_slop_phrase_prob_adjustments.json",{"path":127,"resourceType":86,"resourceTypeDesc":87,"sizeBytes":128,"sourceHtmlUrl":129},"toolkit\u002Fexempt_example.txt",129,"https:\u002F\u002Fgithub.com\u002Fariadoss\u002Fsuperskills\u002Fblob\u002Fmain\u002Fskills\u002Fhumanize\u002Ftoolkit\u002Fexempt_example.txt",{"path":131,"resourceType":86,"resourceTypeDesc":87,"sizeBytes":132,"sourceHtmlUrl":133},"toolkit\u002Fllm_slop.json",75910,"https:\u002F\u002Fgithub.com\u002Fariadoss\u002Fsuperskills\u002Fblob\u002Fmain\u002Fskills\u002Fhumanize\u002Ftoolkit\u002Fllm_slop.json",{"path":135,"resourceType":80,"resourceTypeDesc":81,"sizeBytes":136,"sourceHtmlUrl":137},"toolkit\u002Fmla_format.py",9198,"https:\u002F\u002Fgithub.com\u002Fariadoss\u002Fsuperskills\u002Fblob\u002Fmain\u002Fskills\u002Fhumanize\u002Ftoolkit\u002Fmla_format.py",{"path":139,"resourceType":80,"resourceTypeDesc":81,"sizeBytes":140,"sourceHtmlUrl":141},"toolkit\u002Fnormalize.py",1864,"https:\u002F\u002Fgithub.com\u002Fariadoss\u002Fsuperskills\u002Fblob\u002Fmain\u002Fskills\u002Fhumanize\u002Ftoolkit\u002Fnormalize.py",{"path":143,"resourceType":86,"resourceTypeDesc":87,"sizeBytes":144,"sourceHtmlUrl":145},"toolkit\u002FNOTICE.md",3239,"https:\u002F\u002Fgithub.com\u002Fariadoss\u002Fsuperskills\u002Fblob\u002Fmain\u002Fskills\u002Fhumanize\u002Ftoolkit\u002FNOTICE.md",{"path":147,"resourceType":80,"resourceTypeDesc":81,"sizeBytes":148,"sourceHtmlUrl":149},"toolkit\u002Fslop_report.py",34170,"https:\u002F\u002Fgithub.com\u002Fariadoss\u002Fsuperskills\u002Fblob\u002Fmain\u002Fskills\u002Fhumanize\u002Ftoolkit\u002Fslop_report.py",{"path":151,"resourceType":80,"resourceTypeDesc":81,"sizeBytes":152,"sourceHtmlUrl":153},"toolkit\u002Ftextio.py",1745,"https:\u002F\u002Fgithub.com\u002Fariadoss\u002Fsuperskills\u002Fblob\u002Fmain\u002Fskills\u002Fhumanize\u002Ftoolkit\u002Ftextio.py",{"path":155,"resourceType":86,"resourceTypeDesc":87,"sizeBytes":156,"sourceHtmlUrl":157},"toolkit\u002Ftop2000_en.json",18946,"https:\u002F\u002Fgithub.com\u002Fariadoss\u002Fsuperskills\u002Fblob\u002Fmain\u002Fskills\u002Fhumanize\u002Ftoolkit\u002Ftop2000_en.json",{"path":159,"resourceType":80,"resourceTypeDesc":81,"sizeBytes":160,"sourceHtmlUrl":161},"toolkit\u002Fuserfacing.py",28884,"https:\u002F\u002Fgithub.com\u002Fariadoss\u002Fsuperskills\u002Fblob\u002Fmain\u002Fskills\u002Fhumanize\u002Ftoolkit\u002Fuserfacing.py",[163,186,210,229,257,273],{"skillNo":164,"name":165,"nameZh":6,"description":166,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":167,"categories":168,"keywords":172,"publishedAt":43},"01M71AZE3MPF891RM354EMRYA1","youtube","Download YouTube video transcripts when user provides a YouTube URL or asks to download\u002Fget\u002Ffetch a transcript from YouTube. Also use when user wants to transcribe or get captions\u002Fsubtitles from a YouTube video.","https:\u002F\u002Fgithub.com\u002Fariadoss\u002Fsuperskills\u002Fblob\u002Fmain\u002Fskills\u002Fyoutube\u002FSKILL.md",[169],{"categoryNo":170,"categoryName":171,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000016","图像与多媒体",[165,173,174,175,25,176,177,31,178,32,179,180,181,182,26,183,184,185],"user","download","transcribe","transcript","video transcripts","URL","Captions","get","fetch","Video","use","subtitles","transcripts",{"skillNo":187,"name":188,"nameZh":6,"description":189,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":190,"categories":191,"keywords":192,"publishedAt":43},"01M71AZAYR85PW6BJGSQXS4BN2","write-plan","Use when you have a spec or requirements for a multi-step task, before touching code. Produces an engineering plan complete with TDD tasks, DRY\u002FSOLID\u002FYAGNI principles, a required Test Plan & Verification section, and a coverage target — then auto-runs \u002Fplan-eng-review as an independent double-check before execution.","https:\u002F\u002Fgithub.com\u002Fariadoss\u002Fsuperskills\u002Fblob\u002Fmain\u002Fskills\u002Fwrite-plan\u002FSKILL.md",[],[193,194,25,195,196,197,198,30,199,32,200,201,202,203,204,205,206,207,208,209],"write plan","plan","dry","verification","review","tasks","you","auto","eng","coverage","complete","section","for","test plan","target","as","yagni",{"skillNo":211,"name":212,"nameZh":6,"description":213,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":214,"categories":215,"keywords":216,"publishedAt":43},"01M71AZ8NDDP5ZMGEE6FSC4FKR","worktrees","Use when starting feature work that needs isolation from current workspace or before executing implementation plans - creates isolated git worktrees with smart directory selection and safety verification","https:\u002F\u002Fgithub.com\u002Fariadoss\u002Fsuperskills\u002Fblob\u002Fmain\u002Fskills\u002Fworktrees\u002FSKILL.md",[],[212,217,218,219,183,220,221,222,223,224,225,196,226,32,227,228],"implementation","workspace","with","plans","feature","isolation","git","directory","work","git worktrees","selection","Safety",{"skillNo":230,"name":231,"nameZh":6,"description":232,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":233,"categories":234,"keywords":238,"publishedAt":43},"01M71AZ4ZQHTNWFRZVYHKQFP08","web-perf","Analyzes web performance using Chrome DevTools MCP. Measures Core Web Vitals (LCP, INP, CLS) and supplementary metrics (FCP, TBT, Speed Index), identifies render-blocking resources, network dependency chains, layout shifts, caching issues, and accessibility gaps. Use when asked to audit, profile, debug, or optimize page load performance, Lighthouse scores, or site speed. Biases towards retrieval from current documentation over pre-trained knowledge.","https:\u002F\u002Fgithub.com\u002Fariadoss\u002Fsuperskills\u002Fblob\u002Fmain\u002Fskills\u002Fweb-perf\u002FSKILL.md",[235],{"categoryNo":236,"categoryName":237,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发",[239,240,241,242,243,244,245,246,247,32,248,249,250,251,252,36,253,254,255,256],"web","perf","web perf","resources","MCP","layout","optimize","documentation","caching","qa","knowledge","devtools","issues","render","performance","chrome devtools","vitals","never",{"skillNo":258,"name":259,"nameZh":6,"description":260,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":261,"categories":262,"keywords":263,"publishedAt":43},"01M71AZ2KZNWYEGKKRMJH8PYG2","verify","Use when about to claim work is complete, fixed, or passing, before committing or creating PRs - requires running verification commands and confirming output before making any success claims; evidence before assertions always","https:\u002F\u002Fgithub.com\u002Fariadoss\u002Fsuperskills\u002Fblob\u002Fmain\u002Fskills\u002Fverify\u002FSKILL.md",[],[259,203,264,265,225,196,266,267,32,268,183,269,270,271,272],"commands","about","claims","output","assertions","claim","prs","evidence","running",{"skillNo":274,"name":275,"nameZh":6,"description":276,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":277,"categories":278,"keywords":279,"publishedAt":43},"01M71AZ0ACCK7N1QMWQK1FV2HJ","validate-idea","Validate a business idea using the minimalist entrepreneur framework. Use when someone has a business idea and wants to test if it's worth pursuing before building anything.","https:\u002F\u002Fgithub.com\u002Fariadoss\u002Fsuperskills\u002Fblob\u002Fmain\u002Fskills\u002Fvalidate-idea\u002FSKILL.md",[],[280,281,282,283,284,285,286,32,287,183,288],"validate","idea","validate idea","framework","it","minimalist","test","business","before building"]