{
  "markdown": "# Idiolect\n\n**Make the draft read like you wrote it — because you did.**\n\nAn idiolect is the version of a language only one person speaks. Idiolect\nmeasures yours, finds the constructions a language model reaches for and you do\nnot, and loops a revision pass against both until they agree.\n\nIt installs into Claude Code, Codex, Gemini CLI, opencode, Cursor and a dozen\nother agents from one command.\n\n---\n\n## What it actually does\n\nTwo checkers and a loop.\n\n**`deslop.py`** locates model-reflex prose, sentence by sentence — thirteen flag\ncodes covering model-tell vocabulary, connector openers, \"There is\" and \"it is\nimportant to note\", rules of three, antithesis frames, hedged closings,\nscene-setting openers, metronomic sentence runs, stock collocations.\n\nFor scale: prose written straight out of a model runs near 100% of sentences\nflagged. Human technical prose runs 1–3%.\n\n**`voice_profile.py`** turns samples of *your* writing into a profile — sentence\nrhythm and burstiness, punctuation preference, vocabulary richness, hedging,\npassive rate, first- and second-person habit, and the list of model-tell words\nyou never use. Each axis gets a range measured from how much you vary between\nyour own segments, not a threshold anyone picked.\n\n**`verify.py`** runs both gates and returns an exit code, so the agent can loop:\nrevise → check → revise, until it passes or stops improving.\n\n---\n\n## What it does not do\n\n**It is not a way to make machine-written text pass as human.** That was tested,\nrepeatedly, against real per-sentence detector labels. Style-level intervention\ndid not move them, and several attempts made the score worse. What moved it was\nthe author writing the prose themselves. The evidence is in\n[FINDINGS.md](FINDINGS.md) and [CASE_STUDY.md](CASE_STUDY.md).\n\nSo the loop optimises against local checkers — real properties of the text — and\nnever against a detector percentage. When a passage will not come clean, the two\nmoves are **cut it** or **you write it**. Rewriting it again is not one of them,\nand the skill is built to refuse.\n\nIf you are submitting work under rules about AI assistance, your institution's\nrules govern. See [DISCLAIMER.md](DISCLAIMER.md).\n\n---\n\n## Install\n\nOne command installs into every agent you have. Pick the line for your shell.\n\n**macOS, Linux, WSL, Git Bash:**\n\n```bash\ncurl -fsSL https://raw.githubusercontent.com/joshuamanasye/idiolect/main/install.sh | bash\n```\n\n**Windows PowerShell:**\n\n```powershell\nirm https://raw.githubusercontent.com/joshuamanasye/idiolect/main/install.ps1 | iex\n```\n\nUse the PowerShell line in PowerShell. The `curl` there is an alias for\n`Invoke-WebRequest`, not real curl, and it will reject the `-fsSL` flags.\n\nThe installer detects which agents are on your machine and installs into each.\nDesktop apps that never put a binary on `PATH` — Codex, for one — are found by\ntheir config directory instead.\n\nTo update an existing install, add `--force`; without it, files that already\nexist are left alone.\n\n```bash\nnode bin/install.js --force\n```\n\n`--list` shows what was detected without changing anything, `--dry-run` shows\nexactly what would be written.\n\n---\n\n## Requirements\n\n| | Needed for | When |\n|---|---|---|\n| **Python 3.8+** | the checkers | every time the skill runs |\n| Node 18+ and git | the installer | once |\n\n**Python is not optional, and your agent cannot supply it.** Claude Code, Codex\nand the rest run these scripts as shell commands on your machine — they have no\nPython of their own to fall back on. If Python is missing, the checkers fail and\nthe skill has nothing to check against. The installer probes for it and tells\nyou at the end of the run.\n\nNo pip packages. Nothing to set up beyond the interpreter itself.\n\n**Install Python:**\n\n```bash\nwinget install Python.Python.3.12\n```\n\n```bash\nbrew install python3\n```\n\n```bash\nsudo apt install python3\n```\n\nOr [python.org/downloads](https://www.python.org/downloads/). On Windows, tick\n**\"Add python.exe to PATH\"** in the installer — without it nothing on this page\nwill resolve.\n\n### `python3` or `python`?\n\nThe examples below say `python3`, which is right on macOS and Linux. A stock\npython.org install on Windows gives you `python` and `py` but **no `python3`**,\nso those commands will fail with a confusing error.\n\nCheck which one you have:\n\n```bash\npython3 --version || python --version || py --version\n```\n\nUse whichever answered, in place of `python3` everywhere below. The agents know\nto probe for this and will pick the right one themselves.\n\n<details>\n<summary><b>Per-agent install, if you would rather do it by hand</b></summary>\n\n**Claude Code** — as a plugin:\n\n```bash\n/plugin marketplace add joshuamanasye/idiolect\n```\n\n```bash\n/plugin install idiolect@idiolect\n```\n\n**Codex** — skills go in `$CODEX_HOME/skills/` (default `~/.codex/skills/`),\nprompts in `~/.codex/prompts/`. Codex's own `skill-installer` will fetch them:\n\n```bash\npython3 ~/.codex/skills/.system/skill-installer/scripts/install-skill-from-github.py --repo joshuamanasye/idiolect --path skills/idiolect skills/idiolect-verify skills/idiolect-profile\n```\n\n**Gemini CLI:**\n\n```bash\ngemini extensions install https://github.com/joshuamanasye/idiolect\n```\n\n**Cursor, Windsurf, Amp, Copilot, Goose, Crush, Qwen and friends** — via the\n`skills` CLI, swapping `-a codex` for your agent:\n\n```bash\nnpx -y skills add joshuamanasye/idiolect --skill '*' -a codex --yes\n```\n\n**opencode:**\n\n```bash\nnode bin/install.js --only opencode\n```\n\n**Anything else** — copy the three directories in `skills/` into your agent's\nskills folder, and point it at [AGENTS.md](AGENTS.md). For an agent with no\nskill support at all, [LLM_PROMPT.md](LLM_PROMPT.md) is a single paste-in prompt.\n\n</details>\n\n---\n\n## Using it\n\nThe skills stay dormant until you ask for them by name — they will not fire on\nordinary writing requests. Open your agent in the folder with your draft and say\nsomething like:\n\n> Remove the AI slop from this draft and make it sound like me.\n\nor\n\n> Build my voice profile from these three essays.\n\nYou will be asked for two things:\n\n| What | Why |\n|---|---|\n| Your draft | the thing being revised |\n| Samples of your own unassisted writing | what \"sounds like you\" is measured against |\n\nThe samples matter more than anything else here. **Exclude anything a model\nwrote or edited** — a polluted profile encodes the model's voice as yours, and\nevery later check will then approve exactly the prose it exists to catch. That\nfailure produces no error message, which is why the skill asks out loud.\n\n1500 words minimum, 5000+ preferred. Same register as the draft: your formal and\ncasual writing differ more than two people's writing in the same register, so\nbuild separate profiles rather than pooling them.\n\n**No samples?** The slop gate still runs on its own, and the skill says the\nverdict covers only that half.\n\nBe aware of what the other half was doing. The slop gate catches lexical\nhabits — vocabulary, connector openers, stock phrases. Strip those and a draft\ncan reach zero flags while still reading as a model wrote it: in a measured\nexample, a passage went from 44 flags to 0 with its burstiness unchanged at 0.28\nagainst 0.56 for human prose, and not one comma in ninety words.\n\nWithout samples there is also nothing to revise *toward*, so the agent rewrites\ninto its own default register — which is the register you were trying to leave.\n`verify.py` prints the rhythm numbers as information in this case, ungated,\nbecause without a profile there is no threshold anyone could defend.\n\n### Optional: an external report\n\nIf you already have a per-sentence report from an AI detector, hand it over and\nit will be used to *locate* passages worth a second look. Never as a target to\noptimise against, and never worth buying access for. Labels are noisy enough\nthat roughly four in ten unchanged paragraphs flip between two submissions of\nidentical text.\n\n---\n\n## Commands\n\n| Command | Does |\n|---|---|\n| `/idiolect` | the whole loop |\n| `/idiolect-profile` | build `voice.json` and explain it back to you |\n| `/idiolect-verify` | score a draft against your profile |\n\nOr run the scripts directly:\n\n```bash\npython3 skills/idiolect/scripts/voice_profile.py essay1.docx essay2.md -o voice.json\n```\n\n```bash\npython3 skills/idiolect/scripts/verify.py draft.docx --profile voice.json\n```\n\nBoth accept `.docx`, `.md` and `.txt`. Headings, code blocks, tables and\ncaptions are stripped; only prose is measured.\n\n---\n\n## Reading the output\n\n```\n== draft.md | 3059 words | 141 sentences\nPASS  slop            7 flags across 9/141 sentences (6.4%), 0 model-tells\nPASS  voice           21 MATCH / 6 DRIFT / 0 OFF vs \"Name\" (5200 words)\n== VERDICT: PASS\n```\n\n**MATCH** is inside your range, **DRIFT** is just outside and usually nothing,\n**OFF** is worth acting on. A handful of DRIFT rows is normal — your own\nheld-out writing produces some. A clean sweep of MATCH on every axis is *more*\nsuspicious than a mixed result, because real writing varies.\n\nThe metrics measure surface: rhythm, punctuation, lexical habit. Not argument,\nnot structure, not whether the thinking is any good. A PASS is not a verdict on\nquality.\n\n---\n\n## Documents\n\n| | |\n|---|---|\n| [METHOD.md](METHOD.md) | the protocol end to end |\n| [FINDINGS.md](FINDINGS.md) | what was tested, what held, what died |\n| [CHECKLIST.md](CHECKLIST.md) | both gates, every flag code, how to read them |\n| [CASE_STUDY.md](CASE_STUDY.md) | the run the conclusions came from |\n| [DISCLAIMER.md](DISCLAIMER.md) | limits, and whose rules govern |\n| [AGENTS.md](AGENTS.md) | portable ruleset for agents without skill support |\n| [LLM_PROMPT.md](LLM_PROMPT.md) | single paste-in prompt |\n\n---\n\n## Licence\n\nCode MIT, documents CC BY 4.0. See [LICENSE](LICENSE) and\n[LICENSE-DOCS](LICENSE-DOCS).\n",
  "bytes": 9767,
  "sha": "1f8103d8651974be080f3dc79aee710eff6f0e033716d22ab65e4b87c77aacaa",
  "repo_slug": "joshuamanasye/idiolect",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/plg_joshuamanasye_idiolect_5bbb5bd4/readme"
}