{
  "markdown": "# unslop\n\nunslop strips the patterns that make writing read as machine-written, then rebuilds the prose\nin a real human voice. It ships as an agent skill, and the host agent runs it while you write,\nbacked by deterministic scanners that any tool can call on its own.\n\nFour commands cover the whole surface:\n\n- `/unslop teach` builds a reusable voice from your own writing samples.\n- `/unslop cleanup` flags AI tells as reviewable suggestions and changes nothing on its own.\n- `/unslop rewrite` diagnoses a draft and rebuilds it under the guards (the default).\n- `/unslop mimic` drafts or rewrites in a taught voice, then clears every removal gate.\n\nDetection carries the weight, and it's cheap, deterministic, and benchmarkable, which is what\nmakes it the trust asset. Voice work is generative, and it runs under detection's constitution,\nso any mimic or rewrite that reintroduces a tell fails, however well it matches the voice.\n\n## What counts as proof\n\nUNSLOP's product claim is not the number of rules or passing repository checks. The core claim\nis narrower: on unfamiliar AI-generated or mixed prose, it should find genuine problems, repair\nthem, and avoid damaging facts or already-good writing. The core benchmark therefore reports\ndetection precision and recall, repair success, preservation, collateral-damage rate, and\nwhole-document net improvement separately, plus byte-exact no-op behavior on clean prose. It\nalso compares with the same Luna model\nworking without the UNSLOP contract. See [`evals/CORE-BENCHMARK.md`](evals/CORE-BENCHMARK.md).\nThe latest independent public result is a **no-ship**: UNSLOP materially improved recall and\nrepair over plain Luna, but it did not yet meet the precision, damage, or whole-document safety\nbar. See [`evals/CORE-RESULTS.md`](evals/CORE-RESULTS.md) for the exact result and remaining\nfailure modes.\n\nResults are divided into three scoreboards so supporting machinery cannot inflate the product\nresult:\n\n- **Core product:** detection, repair, preservation, damage, and net improvement.\n- **Voice:** teach/mimic fidelity and its removal gates.\n- **Engineering:** scanner coverage, schemas, routing, caching, and repository regressions.\n\nThe engineering suite can show that the implementation behaves as specified. Only the core\nscoreboard can show that the specification improves writing.\n\n## Installation\n\n### Using the Skills CLI (recommended)\n\nInstall to any supported coding agent with [npx skills](https://github.com/vercel-labs/skills):\n\n```bash\n# Install to Claude Code (global)\nnpx skills add theclaymethod/unslop -g -a claude-code\n\n# Install to several agents at once\nnpx skills add theclaymethod/unslop -g -a claude-code -a cursor -a codex\n\n# Install to every detected agent\nnpx skills add theclaymethod/unslop -g\n\n# List available skills first\nnpx skills add theclaymethod/unslop --list\n```\n\n### Manual installation\n\n```bash\ngit clone https://github.com/theclaymethod/unslop.git ~/dev/unslop\nln -s ~/dev/unslop ~/.claude/skills/unslop\n# Or wire it as a slash command:\nln -s ~/dev/unslop/SKILL.md ~/.claude/commands/unslop.md\n```\n\nThe Python scripts under `scripts/` run on their own, with no third-party dependencies, just\nPython 3.8+ and the standard library. Call them from CI, a pre-publish check, or another agent,\nand you never load the skill at all.\n\n## Three Detection Layers\n\nDetection stacks three deterministic scanners, coarse to fine. Each one returns JSON and exits\nnon-zero on a flag, and each carries false-positive protection rows, so a literal or domain use\nnever trips it.\n\n**Phrase layer** (`scripts/banned_phrase_scan.py`). The compact runtime pack has 16 literal\ntriggers, each backed by contextual false-positive protection. Gated words fire only in their\njargon collocations. Literal legal, medical, mechanical, historical, and technical uses stay\nclean. Quoted spans, blockquotes, and code fences are masked first, so a tutorial documenting\nbad writing does not flag its own examples.\n\n**Structure layer** (`scripts/structure_scan.py`). 36 structural patterns plus document-level\nmetrics: `sentence_burstiness`, `paragraph_cv`, `triad_density`, `bold_colon_listicle_count`,\n`one_line_staccato_share`, `connective_paragraph_openers`, `signpost_density`,\n`opener_unique_ratio`, `top_opener_share`, `max_consecutive_opener`,\n`participial_closer_share`, `conclusion_coda`, and `summary_sandwich`. This layer catches the\nrhythm tells, the uniform sentence length and the staccato runs, the moralizing codas, the\nconnective scaffolds that open every paragraph with `\"However,\"` or `\"Moreover,\"`, and the\nbold-label listicles that stand in for prose. Genre carve-outs keep it honest, so `--genre docs`\nallows the bold-label lists that reference docs really use, and `--genre social` allows the\nshort-line cadence that belongs in social copy.\n\n**Silhouette layer** (`scripts/silhouette_scan.py`). This one sits a level above the surface and\nscores how the ideas are arranged. It catches outline-following, recap loops, and paragraph-role\ntemplating: body paragraphs that open on a discourse cue instead of their own claim\n(`scaffold_opener_share`), opening vocabulary that disappears mid-document and returns at the\nend (`callback_content`, the strongest single tell), cue-opener roles rotating like a template\n(`role_entropy_bits`), intro content words reappearing as body-paragraph heads\n(`preview_fulfillment`), and section headings that restate the intro's outline\n(`heading_preview`). The composite `silhouette_penalty` flags at `1.0` against a committed\nhuman reference. On the corpus in the repo it separates cleanly, with 12 of 12 AI documents\nflagged and 0 of 8 human documents flagged. A cue-deletion attack collapses the scaffold metric,\nso silhouette gets scored jointly with the structure scanner, as a lower fence.\n\n## The Gamut: What Gets Removed\n\nEvery family below is cataloged in `references/taboo-phrases.md` and pinned by an eval row.\nSeverity is `hard` (always a tell) or `soft` (a default register guard your real voice can\noverride). The idea throughout is contextual gating over blunt word bans, and a pattern ships\nonly once a false-positive row proves the literal sense survives.\n\n### Openers, emphasis, and inflation\n\n| Family | Caught examples |\n|--------|-----------------|\n| Throat-clearing openers | `\"Here's the thing:\"`, `\"The uncomfortable truth is\"`, `\"Let me be clear\"`, `\"It turns out\"`, `\"Let's dive in\"`, `\"Let's unpack\"` |\n| Emphasis crutches | `\"Full stop.\"`, `\"Let that sink in.\"`, `\"Make no mistake\"`, `\"Read that again.\"`, `\"This cannot be overstated.\"` |\n| The \"X is real\" closer | `\"The struggle is real.\"`, `\"The stakes are real.\"` (spares the literal \"is it genuine?\" sense) |\n| Significance inflation | `\"stands as a testament to\"`, `\"pivotal moment\"`, `\"enduring legacy\"`, `\"rich tapestry\"`, `\"cornerstone of\"`, `\"holds great promise\"` |\n| False agency | `\"the numbers speak for themselves\"`, `\"the data tells a story\"`, `\"paints a clear picture\"` |\n\n### Contrast, questions, and drama\n\n| Family | Caught examples |\n|--------|-----------------|\n| Negative parallelism | `\"It's not X, it's Y\"`, `\"Not only... but also\"`, `\"Not merely X, but Y\"`, `\"No X, no Y, just Z\"` |\n| Contrastive definitions | `\"X isn't a Y, it's a Z\"` (spares real corrections like `\"Use pnpm, not npm.\"` and `\"The painting is real, not a forgery.\"`) |\n| Wh-opener self-Q&A | `\"Why does this matter? Because...\"`, `\"What does this mean for...\"`, `\"Why should you care?\"` |\n| Cliffhanger fragments | `\"[Noun]. That's it. That's the [thing].\"`, `\"The ___ loop.\"` as a standalone, `\"X things. One thing.\"` |\n| Hedge stacks | `\"(and perhaps more importantly, ...)\"`, `\"(arguably ...)\"`, `\"While X is promising, Y remains a challenge\"` |\n\n### Attribution, flattery, and jargon\n\n| Family | Caught examples |\n|--------|-----------------|\n| Vague attribution | `\"Experts argue\"`, `\"Studies show\"`, `\"Some critics\"`, and bare clause-initial `\"Research indicates\"` (attributed and possessive forms stay clean) |\n| Reader-addressing flattery | `\"Here's what's interesting\"`, `\"worth reading\"`, `\"worth your time\"`, `\"Whether you're a seasoned developer or just starting out\"` |\n| Business-jargon collocations | `\"navigate challenges\"`, `\"leverage synergies\"`, `\"deep dive\"`, `\"circle back\"`, `\"move the needle\"`, `\"low-hanging fruit\"` |\n| Marketing and headline cadence | `\"world-class\"`, `\"state-of-the-art\"`, `\"a hidden gem\"`, two-beat imperative slogans (`\"Emit 1,100 tokens. Ship 237KB.\"`), and headline slogan cadence firing at three or more short-line headers in one document |\n\n### Chatbot residue and punctuation\n\n| Family | Caught examples |\n|--------|-----------------|\n| Chatbot artifacts | `\"I hope this helps\"`, `\"Certainly!\"`, `\"Great question!\"`, `\"as an AI language model\"`, `\"as of my knowledge cutoff\"` |\n| Emoji section headers | Decorative emoji standing in as headings, flagged as a formatting tell |\n| Em-dash overuse | The single most reliable punctuation tell. Default is zero; two or more in one paragraph is always a hard flag |\n| Reasoning-chain leaks | `\"Let me think step by step\"`, `\"Breaking this down\"`, `\"Here's my thought process\"` |\n\n### Structural and silhouette families\n\nThe structure scanner adds the document-shape tells: uniform sentence rhythm, staccato\none-line-paragraph runs outside social copy, connective paragraph scaffolds, signpost density,\nand moralizing codas like `\"Ultimately, this reminds us that...\"`. The silhouette scanner adds\nthe arrangement tells above. A handful of macro tells stay agent judgment instead of\nscanner-enforced (both-sidesism, templated redemption arcs, over-determination, uniform\nemotional register), because a scanner can't reliably tell a genuine opposing view from a\nmanufactured one.\n\n## What Gets Protected\n\nDo-no-harm is half the product. The scanners leave the following alone, and each guard has its\nown eval row.\n\n- **Register guards.** `\"never store secrets\"`, `\"may cause drowsiness\"`,\n  `\"does not establish causation\"`, and `\"notwithstanding anything to the contrary\"` are\n  content, not filler. In legal, medical, security, and scientific text, these hedges,\n  negations, absolutes, and scope words carry meaning. `validate_preservation.py --strict`\n  turns dropping one into a hard failure.\n- **Literal domain usage.** Construction, mechanics, law, medicine, finance, sailing, and\n  code all use the gated words literally. Every contextual pattern ships with a false-positive\n  row proving the literal sense stays clean.\n- **Quoted examples.** Spans in quotes, blockquotes, and code fences are exempt by default, so\n  documentation never self-flags the bad writing it's teaching.\n- **Facts, with magnitude awareness.** Numbers, names, dates, quotes, units, references like\n  `Section 12(b)`, and `and/or` scope survive a rewrite. Magnitude-aware checking means\n  `$47.3M` can't silently become `$47.3 billion`, and `150 km` can't become `150 miles`.\n- **Genre carve-outs.** Bold-label lists are correct in reference docs, staccato is correct in\n  social copy, and a section-roadmap abstract is academic convention rather than a tell.\n- **English only.** Non-English input gets cheap detection and a clear decline. That's the one\n  graceful refusal in the product, and the scanners return `non_english: true` and stop.\n\n## Voice: teach and mimic\n\nThe right end of the axis writes the way a specific person writes. It's agent-driven end to\nend, and you supply approvals and answers, never a directory or a command.\n\n### teach\n\n`teach` distills your samples into two artifacts under `.unslop/voice/<name>/` (gitignored):\na machine profile (`profile.json`, the deterministic referee) and a layered voice card\n(`card.md` plus per-situation sheets) that any generating model follows in context.\n\n1. **Harvest.** Cheap agents bootstrap the corpus from your chat transcripts and writing\n   folders. Adapters read both Claude Code (`claude-jsonl`) and Codex CLI/Desktop\n   (`codex-jsonl`) sessions, auto-detected by shape. The contamination guarantee is the whole\n   point, because assistant-authored text in a voice profile would teach the exact register\n   unslop removes. So the adapters drop assistant and developer turns, strip injected content\n   like a\n   dumped `AGENTS.md`, and run every kept candidate through the scanners. A hard hit or two\n   scanner categories marks a sample `suspect_ai`, ranked last and never auto-approved. Nothing\n   reaches a profile without your approval.\n2. **Profile and card.** `voice_profile.py` computes the stylometric fingerprint (character\n   3-grams, function-word deltas, sentence-length distribution, punctuation, contractions,\n   MTLD, impostor z-scores, GI rank). `voice_card.py` writes the layered card the generator\n   reads. The card never fabricates, so a dimension with no sample evidence gets no sheet, and\n   it's named under \"Uncovered\" instead. A profile that doesn't describe the supplied samples\n   gets rejected (exit 2), so a stale profile can never drive a card.\n3. **Calibrate.** When samples run thin, an A/B preference game gathers voice signal at\n   tap-level effort. The pairs are dimension-controlled minimal edits of your own passages,\n   mostly from deterministic transforms, so each pair keeps the passage's facts. Preferences\n   aggregate per dimension with confidence bounds, and the game targets the least-known\n   dimension next, while a stated preference that contradicts a sample-measured value surfaces\n   to you as a named conflict, never resolved silently. Voice beats the default register guard,\n   but only in the open.\n4. **Scored demo.** teach closes by mimicking one paragraph, scoring it, and running the\n   scanners in front of you. A voiced demo that trips a slop gate fails the loop.\n\n### mimic\n\n`mimic` drafts or rewrites in the taught voice, then clears the full gate battery. The rule is\nabsolute, so a mimic that scores well on voice but trips a removal gate gets rejected. Voice never\nbuys an exemption from the constitution, and meaning preservation against the original draft\nis its own separate hard gate.\n\n- **Voice check** answers \"does this sound like me?\" with a score and no rewrite. It reports\n  the composite (lower is more you), the General Impostors rank, and the two or three metric\n  deltas that explain the score in plain words. It's the cheapest voice interaction and the\n  usual one after teach. Check drafts often, commission rewrites rarely.\n- **Refine** hill-climbs when a single pass keeps landing short. It splits samples into a\n  retrieval pool and a held-out acceptance split, generates candidates, and discards any that\n  trip a hard gate (banned-phrase, structure, draft-to-candidate preservation, a copy-gate\n  against the pool, and a word floor). Survivors get scored on the held-out split with a\n  gaming-resistant composite: `0.5·(1−GI) + 0.5·` a clipped impostor-z distance against a\n  same-genre impostor pool. A marker-stuffed candidate can drive a raw distance down and still\n  lose under the General Impostors rank, and that's what stops it from beating honest prose. A\n  **divergence guard** halts the loop and raises `reward_hacking_warning` when the pool score\n  improves while the held-out score worsens for two iterations. Claim a win only when\n  `mimic_stats.py` shows the confidence-interval lower bound above zero and p below 0.05.\n\n## Co-writer: cleanup\n\n`cleanup` is the co-writer mode. On detection it surfaces findings as structured suggestions,\nnever a silent rewrite. Each suggestion carries a span, severity, category, rationale, and\nproposed replacement. Detection is cheap and deterministic, and replacement generation is\ndelegated to a stronger model, which fills in the null replacements the scanner leaves.\n\nHard findings become direct replacements. Soft findings are register-dependent, so their\nrationale is phrased as a question rather than an edit. Four contract gates in\n`check_suggestions.py` make \"accept all\" safe by construction:\n\n- **span-minimality**: an edit changes only its own span, and a whole-sentence rewrite fails.\n- **replacement-scanner**: each replacement passes both scanners in isolation and adds no new\n  violation in context.\n- **accept-all**: applying every suggestion yields a document that passes both scanners and\n  preserves every constraint against the original.\n- **span-overlap**: spans may not overlap.\n\nA report-only variant (\"flag it, change nothing\") runs the scanners and reports each issue by\nspan, category, and severity, separating clear problems from judgment calls.\n\n## Contribute: the growth flywheel\n\nDetection catalogs decay as generators evolve. Growth comes from adversarial refresh, where a\nwild specimen becomes an eval row becomes a structured PR. `/unslop contribute` runs the\npipeline offline until you approve publication.\n\n1. **Precheck** tells you whether the tell is already covered.\n2. **Confirmation gate one** shows you the exact snippet and asks whether it may go public,\n   with redaction hints that keep the tell byte-for-byte intact.\n3. **Scaffold and implement eval-first.** The false-negative row lands red before the scanner\n   changes, and a literal-use false-positive row lands beside it. The scanner and catalog then\n   change until the row goes green while the protection row holds.\n4. **Verify** captures the red-to-green transition and refuses TODO markers.\n5. **Full gate battery**, then **confirmation gate two** on the final PR body. Only then does\n   the host agent branch, commit, and open the PR. The scripts never touch the network.\n\nYesterday's miss becomes tomorrow's regression test, and nothing rides on good habits.\n\n### Worked example\n\nThe maintainer caught `\"Four presets, one input.\"` on his own marketing page: a standalone\nsection header in slogan cadence. Precheck against the catalog came back clean — nothing in\n`banned_phrase_scan.py` covered it yet, which is what made the specimen contributable.\n\nThat miss became `OWNER-01`, and the row went red before any fix existed:\n\n```json\n{\n  \"id\": \"OWNER-01\",\n  \"stdin\": \"Four presets, one input.\",\n  \"assertions\": [\n    { \"type\": \"json\", \"path\": \"total_violations\", \"gte\": 1 },\n    { \"type\": \"violation_category_equals\", \"value\": \"slogan_fragment\" }\n  ]\n}\n```\n\nThe fix is a new `slogan_fragment` entry in `STRUCTURAL_PATTERNS`:\n\n```python\nr\"(?:^|\\n)[ \\t]*(?:#{1,6}[ \\t]*|>[ \\t]*|[-*+][ \\t]+)?(?:\\*\\*)?(?:one|two|three|four|five|six|\"\nr\"seven|eight|nine|ten|\\d+)\\s+[^,.!?\\n]{1,40},\\s+one\\s+[^,.!?\\n]{1,40}[.!?](?:\\*\\*)?[ \\t]*(?=\\n|$)\"\n```\n\nIt's anchored to `^|\\n` and `(?=\\n|$)` on purpose: standalone headline position is the tell,\nnot the \"N X, one Y\" shape by itself. `FP-86` proves `\"The unit has two bedrooms, one bath, and\na den.\"` stays clean, since the same words embedded mid-sentence never reach the line boundary.\n\nOWNER-01 went red to green the moment the pattern landed, FP-86 held green the whole time, and\n`slogan_fragment` now sits inside the blocking gate battery that runs on every push to this\nrepo — the project's own site included.\n\nThe pipeline that produced this row is itself eval-covered: the `CONTRIB-*` rows and the\n`contribute-suite` gate pin precheck, scaffold, and redaction behavior end to end, and a\n`SLUG-01` row pins path safety against a hostile `--pattern-name`.\n\nCaught a specimen but working outside an agent? [CONTRIBUTING.md](CONTRIBUTING.md) links the\nfast path and the manual path.\n\n## The Eval Suite Is the Product\n\nThe contracts remain constitutional, but repository checks are engineering evidence. They do\nnot prove that UNSLOP improves prose.\n\n- **Fast core-contract loop.** `python3 evals/check.py` runs five offline examples covering the\n  manifest, Luna runner interface, scorer, evidence boundaries, and acceptance gate.\n- **Bounded release suite.** `python3 evals/check.py --full` adds the deterministic safety and\n  integrity matrix, generated-benchmark currency, and strict leakage validation. The suite is\n  capped at 80 executable examples and 400 expanded outcome predicates, including predicates\n  hidden inside Python fixtures. Nested aggregate wrappers fail the build.\n- **Compact scanner evidence.** Scanner, preservation, and maintenance examples live in\n  explicit contract tables. Current coverage is 36/36 structural patterns, 16/16 literal\n  triggers, and 20/20 protected categories, with zero expected failures.\n- **Behavioral layer.** `evals/shared-benchmark.json` is generated from 12 `skill` cases with\n  three ablations. It is useful for shaping and regression checks, but it is not the core\n  product scoreboard.\n- **Measured simplification.** GEPA Optimize Anything selected one canonical full command over\n  seven redundant phases. In the recorded profile this cut warmed model calls from 48 to 24,\n  command tokens from 19 to 3, and deterministic orchestration time from about 6.25 seconds to\n  about 3.02 seconds while preserving the required gates.\n\nThe latest valid public core result remains the v9 no-ship recorded in\n[`evals/CORE-RESULTS.md`](evals/CORE-RESULTS.md). Later development runs are directionally\nfavorable—Luna+UNSLOP recorded seven wins, four ties, and no plain-Luna wins—but they predate\nscorer and per-case efficiency fixes. A fresh preregistered corpus failed its composition floor\nbefore either arm ran. The current beta therefore does not claim a validated comparative lift.\n\n```bash\npython3 evals/check.py                       # fast offline core-contract check\npython3 evals/check.py --full                # bounded deterministic release suite\npython3 evals/run_adversarial.py --only FP  # diagnose one failing category\npython3 evals/check.py --behavioral tune     # core-contract + behavioral tune\n```\n\n## The Core Comparison Uses Luna\n\nThe shipping question is paired and model-controlled: the same `gpt-5.6-luna` receives the\nsame unfamiliar source in both arms. One arm gets the frozen UNSLOP diagnosis, rewrite, and\nvalidation pipeline; the other gets neutral editorial guidance without repository access,\nscanner output, or validation feedback. A blinded `gpt-5.6-sol` judge sees randomized arm\nlabels. Calls, uncached input tokens, output tokens, and elapsed time are recorded per case.\n\nOlder cross-provider model-parity tables remain in `references/pipeline.md` as ancillary\nengineering history. They are not acceptance evidence and do not replace the Luna-vs-Luna\ncore comparison.\n\n## Standalone Scripts\n\nThe scripts run independently, standard library only. A quick tour:\n\n```bash\n# Phrase, structure, and silhouette scans\npython3 scripts/banned_phrase_scan.py < input.txt\npython3 scripts/banned_phrase_scan.py --include-quoted < input.txt   # audit quoted examples too\npython3 scripts/structure_scan.py < input.txt\npython3 scripts/structure_scan.py --genre docs < README.md           # reference-doc carve-outs\npython3 scripts/silhouette_scan.py < input.txt                       # idea-arrangement tells\n\n# Facts and preservation\npython3 scripts/extract_constraints.py < input.txt\npython3 scripts/validate_preservation.py original.txt transformed.txt\npython3 scripts/validate_preservation.py --strict original.txt transformed.txt  # regulated text\npython3 scripts/diff_check.py original.txt transformed.txt\npython3 scripts/readability_metrics.py < input.txt\n\n# Co-writer suggestions\npython3 scripts/suggest.py document.md\npython3 scripts/check_suggestions.py suggestions.json                # the four contract gates\n\n# Voice\npython3 scripts/harvest_samples.py SOURCE -o candidates.json         # bootstrap from transcripts\npython3 scripts/voice_profile.py samples/ -o profile.json            # stylometric fingerprint\npython3 scripts/voice_card.py --profile profile.json --samples samples/ --out . --name me\npython3 scripts/voice_score.py --profile profile.json candidate.md   # \"does this sound like me?\"\npython3 scripts/calibrate_pairs.py generate --base passage.txt --dimension em_dash --seed 1\npython3 scripts/wiki_sync.py check                                   # sync the phrase catalog\n```\n\n## Project Structure\n\n```\nunslop/\n├── SKILL.md                       # Four-verb router and shared doctrine\n├── README.md                      # This file\n├── references/\n│   ├── commands/                  # The routed flows: teach, cleanup, rewrite, mimic, contribute\n│   ├── taboo-phrases.md           # Authoritative pattern catalog (all families)\n│   ├── mimic.md                   # Teach/mimic internals: card anatomy, scoring, refine\n│   ├── harvest.md                 # Adapter internals and the contamination tripwire\n│   ├── calibrate.md               # The A/B preference game\n│   ├── core-contract.md           # Single diagnosis, rewrite, and preservation contract\n│   ├── pipeline.md                # Luna core protocol plus ancillary model-parity history\n│   ├── fact-preservation.md       # Constraint preservation rules\n│   ├── rubric.md                  # Strict scoring criteria\n│   ├── edit-library.md            # Transformation examples\n│   ├── personality-guide.md       # Adding voice without fake personality\n│   ├── maintenance.md             # Add/list/wiki-sync procedures (eval-first)\n│   └── packs/                     # Small detector rule-packs plus manifest\n├── presets/                       # crisp / warm / expert / story voice deltas\n├── scripts/                       # Scanners, voice tools, preservation, suggest, harvest\n├── evals/\n│   ├── adversarial-evals.json     # Core plumbing, routing, and engineering rows\n│   ├── fixtures/contracts/        # Compact scanner, preservation, and maintenance examples\n│   ├── check.py                   # Fast and full bounded repository checks\n│   ├── run_adversarial.py         # Deterministic runner (--only, --case, --list-gates)\n│   ├── shared-benchmark.json      # Generated behavioral manifest (never hand-edit)\n│   ├── build_shared_benchmark.py  # Regenerates the behavioral manifest\n│   ├── run_model_parity.py        # Re-measures the tiering matrix\n│   ├── CHECKS.md                  # Canonical check and external gate surface\n│   └── check_*.py                 # Parity, doc, pack, voice, and silhouette gates\n├── docs/\n│   └── PRODUCT.md                 # Product doctrine (the why behind the repo)\n└── assets/\n    └── examples/                  # Before/after sets: article, LinkedIn, sales\n```\n\n## Voice Presets\n\nRead one preset from `presets/` before a rewrite.\n\n| Preset | Style | Best for |\n|--------|-------|----------|\n| `crisp` | Short, direct, no filler | Technical writing, documentation |\n| `warm` | Friendly, conversational | Emails, blog posts |\n| `expert` | Authoritative, confident | Thought leadership, articles |\n| `story` | Narrative flow, show rather than tell | Case studies, personal posts |\n\n## Scoring Rubric\n\nEight criteria, one to five points each (40 maximum): directness, natural rhythm, concrete\nverbs, reader trust, human authenticity, content density, fact preservation, and template\navoidance. Strict mode fails a rewrite scoring below 32/40. Criteria live in\n`references/rubric.md`.\n\n## Supported Agents\n\nThis skill follows the [Agent Skills specification](https://agentskills.io) and works with:\n\n- Claude Code\n- Cursor\n- Codex\n- OpenCode\n- Cline\n- Roo Code\n- And [35+ other agents](https://github.com/vercel-labs/skills#supported-agents)\n\n## Wikipedia Sync\n\nPart of the phrase catalog derives from Wikipedia's\n[Signs of AI writing](https://en.wikipedia.org/wiki/Wikipedia:Signs_of_AI_writing) guide. The\nskill can sync itself with that page to pick up new patterns as editors add them:\n\n```bash\npython3 scripts/wiki_sync.py check\n```\n\nThe sync diffs against the last run and proposes updates to `taboo-phrases.md` and the phrase\nscanner, always eval-row-first per `references/maintenance.md`. Wikipedia-only patterns (broken\nwikitext, DOI issues) get skipped, and state lives in `scripts/.wiki_sync_state.json`\n(gitignored).\n\n## Maintenance\n\nAll maintenance is eval-first, and the row lands red in `evals/adversarial-evals.json` before\nany scanner or catalog edit turns it green. `references/maintenance.md` holds the procedures for\nadding a banned phrase (with its required literal-use protection row), adding a structural\npattern, listing current patterns, and running the Wikipedia sync. `CLAUDE.md` and `AGENTS.md`\nhold the contribution rules, and `docs/PRODUCT.md` holds the reasoning behind them.\n\n## Philosophy\n\nAI text follows predictable patterns that readers learn to spot. unslop doesn't just swap\nwords, it restructures content to read as human, and it refuses to fix writing that was never\nbroken. The guiding principles:\n\n- **Cut what carries no meaning.** If removal doesn't change the meaning, remove it.\n- **Trust the reader.** They don't need `\"let that sink in\"`.\n- **Facts are sacred.** Numbers, names, dates, negations, and scope survive unchanged.\n- **Do no harm.** Register hedges, literal vocabulary, and already-human prose stay intact.\n- **Voice runs under the constitution.** A mimic that reintroduces slop is a failure.\n- **The eval suite defines the product.** If a behavior matters, a row fails without it.\n\n## Requirements and License\n\nPython 3.8+ and any supported coding agent. Licensed MIT.\n</content>\n</invoke>\n",
  "bytes": 29153,
  "sha": "47dc44f84f89b6f6d8efc0ca7b17305fcd003f7df3e1e1a731c8149a485bccfe",
  "repo_slug": "theclaymethod/unslop",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/skl_theclaymethod_unslop_unslop_d1712d0b/readme"
}