idiolect
Strip model-reflex prose from a draft and revise it toward the author's own measured voice.
Open source Open in the app JSON README (API)
About
Strip model-reflex prose from a draft and revise it toward the author's own measured voice.
Details
- Kind
- Plugins
- Topic
- No topic detected
- Publisher
- joshuamanasye
- Origin
- gemini
- Category
- ferramentas
- Version
- 0.1.0
- Stars
- 1
- Last push
- 2026-08-12T17:10:29Z
- Repository state
- ativo
- Language
- Python
- License
- MIT
- Added
- 2026-09-13 00:04:44
- Updated
- 2026-09-13 00:04:44
- Origin id
joshuamanasye/idiolect
README
# Idiolect **Make the draft read like you wrote it — because you did.** An idiolect is the version of a language only one person speaks. Idiolect measures yours, finds the constructions a language model reaches for and you do not, and loops a revision pass against both until they agree. It installs into Claude Code, Codex, Gemini CLI, opencode, Cursor and a dozen other agents from one command. --- ## What it actually does Two checkers and a loop. **`deslop.py`** locates model-reflex prose, sentence by sentence — thirteen flag codes covering model-tell vocabulary, connector openers, "There is" and "it is important to note", rules of three, antithesis frames, hedged closings, scene-setting openers, metronomic sentence runs, stock collocations. For scale: prose written straight out of a model runs near 100% of sentences flagged. Human technical prose runs 1–3%. **`voice_profile.py`** turns samples of *your* writing into a profile — sentence rhythm and burstiness, punctuation preference, vocabulary richness, hedging, passive rate, first- and second-person habit, and the list of model-tell words you never use. Each axis gets a range measured from how much you vary between your own segments, not a threshold anyone picked. **`verify.py`** runs both gates and returns an exit code, so the agent can loop: revise → check → revise, until it passes or stops improving. --- ## What it does not do **It is not a way to make machine-written text pass as human.** That was tested, repeatedly, against real per-sentence detector labels. Style-level intervention did not move them, and several attempts made the score worse. What moved it was the author writing the prose themselves. The evidence is in [FINDINGS.md](FINDINGS.md) and [CASE_STUDY.md](CASE_STUDY.md). So the loop optimises against local checkers — real properties of the text — and never against a detector percentage. When a passage will not come clean, the two moves are **cut it** or **you write it**. Rewriting it again is not one of them, and the skill is built to refuse. If you are submitting work under rules about AI assistance, your institution's rules govern. See [DISCLAIMER.md](DISCLAIMER.md). --- ## Install One command installs into every agent you have. Pick the line for your shell. **macOS, Linux, WSL, Git Bash:** ```bash curl -fsSL https://raw.githubusercontent.com/joshuamanasye/idiolect/main/install.sh | bash ``` **Windows PowerShell:** ```powershell irm https://raw.githubusercontent.com/joshuamanasye/idiolect/main/install.ps1 | iex ``` Use the PowerShell line in PowerShell. The `curl` there is an alias for `Invoke-WebRequest`, not real curl, and it will reject the `-fsSL` flags. The installer detects which agents are on your machine and installs into each. Desktop apps that never put a binary on `PATH` — Codex, for one — are found by their config directory instead. To update an existing install, add `--force`; without it, files that already exist are left alone. ```bash node bin/install.js --force ``` `--list` shows what was detected without changing anything, `--dry-run` shows exactly what would be written. --- ## Requirements | | Needed for | When | |---|---|---| | **Python 3.8+** | the checkers | every time the skill runs | | Node 18+ and git | the installer | once | **Python is not optional, and your agent cannot supply it.** Claude Code, Codex and the rest run these scripts as shell commands on your machine — they have no Python of their own to fall back on. If Python is missing, the checkers fail and the skill has nothing to check against. The installer probes for it and tells you at the end of the run. No pip packages. Nothing to set up beyond the interpreter itself. **Install Python:** ```bash winget install Python.Python.3.12 ``` ```bash brew install python3 ``` ```bash sudo apt install python3 ``` Or [python.org/downloads](https://www.python.org/downloads/). On Windows, tick **"Add python.exe to PATH"** in the installer — without it nothing on this page will resolve. ### `python3` or `python`? The examples below say `python3`, which is right on macOS and Linux. A stock python.org install on Windows gives you `python` and `py` but **no `python3`**, so those commands will fail with a confusing error. Check which one you have: ```bash python3 --version || python --version || py --version ``` Use whichever answered, in place of `python3` everywhere below. The agents know to probe for this and will pick the right one themselves. <details> <summary><b>Per-agent install, if you would rather do it by hand</b></summary> **Claude Code** — as a plugin: ```bash /plugin marketplace add joshuamanasye/idiolect ``` ```bash /plugin install idiolect@idiolect ``` **Codex** — skills go in `$CODEX_HOME/skills/` (default `~/.codex/skills/`), prompts in `~/.codex/prompts/`. Codex's own `skill-installer` will fetch them: ```bash python3 ~/.codex/skills/.system/skill-installer/scripts/install-skill-from-github.py --repo joshuamanasye/idiolect --path skills/idiolect skills/idiolect-verify skills/idiolect-profile ``` **Gemini CLI:** ```bash gemini extensions install https://github.com/joshuamanasye/idiolect ``` **Cursor, Windsurf, Amp, Copilot, Goose, Crush, Qwen and friends** — via the `skills` CLI, swapping `-a codex` for your agent: ```bash npx -y skills add joshuamanasye/idiolect --skill '*' -a codex --yes ``` **opencode:** ```bash node bin/install.js --only opencode ``` **Anything else** — copy the three directories in `skills/` into your agent's skills folder, and point it at [AGENTS.md](AGENTS.md). For an agent with no skill support at all, [LLM_PROMPT.md](LLM_PROMPT.md) is a single paste-in prompt. </details> --- ## Using it The skills stay dormant until you ask for them by name — they will not fire on ordinary writing requests. Open your agent in the folder with your draft and say something like: > Remove the AI slop from this draft and make it sound like me. or > Build my voice profile from these three essays. You will be asked for two things: | What | Why | |---|---| | Your draft | the thing being revised | | Samples of your own unassisted writing | what "sounds like you" is measured against | The samples matter more than anything else here. **Exclude anything a model wrote or edited** — a polluted profile encodes the model's voice as yours, and every later check will then approve exactly the prose it exists to catch. That failure produces no error message, which is why the skill asks out loud. 1500 words minimum, 5000+ preferred. Same register as the draft: your formal and casual writing differ more than two people's writing in the same register, so build separate profiles rather than pooling them. **No samples?** The slop gate still runs on its own, and the skill says the verdict covers only that half. Be aware of what the other half was doing. The slop gate catches lexical habits — vocabulary, connector openers, stock phrases. Strip those and a draft can reach zero flags while still reading as a model wrote it: in a measured example, a passage went from 44 flags to 0 with its burstiness unchanged at 0.28 against 0.56 for human prose, and not one comma in ninety words. Without samples there is also nothing to revise *toward*, so the agent rewrites into its own default register — which is the register you were trying to leave. `verify.py` prints the rhythm numbers as information in this case, ungated, because without a profile there is no threshold anyone could defend. ### Optional: an external report If you already have a per-sentence report from an AI detector, hand it over and it will be used to *locate* passages worth a second look. Never as a target to optimise against, and never worth buying access for. Labels are noisy enough that roughly four in ten unchanged paragraphs flip between two submissions of identical text. --- ## Commands | Command | Does | |---|---| | `/idiolect` | the whole loop | | `/idiolect-profile` | build `voice.json` and explain it back to you | | `/idiolect-verify` | score a draft against your profile | Or run the scripts directly: ```bash python3 skills/idiolect/scripts/voice_profile.py essay1.docx essay2.md -o voice.json ``` ```bash python3 skills/idiolect/scripts/verify.py draft.docx --profile voice.json ``` Both accept `.docx`, `.md` and `.txt`. Headings, code blocks, tables and captions are stripped; only prose is measured. --- ## Reading the output ``` == draft.md | 3059 words | 141 sentences PASS slop 7 flags across 9/141 sentences (6.4%), 0 model-tells PASS voice 21 MATCH / 6 DRIFT / 0 OFF vs "Name" (5200 words) == VERDICT: PASS ``` **MATCH** is inside your range, **DRIFT** is just outside and usually nothing, **OFF** is worth acting on. A handful of DRIFT rows is normal — your own held-out writing produces some. A clean sweep of MATCH on every axis is *more* suspicious than a mixed result, because real writing varies. The metrics measure surface: rhythm, punctuation, lexical habit. Not argument, not structure, not whether the thinking is any good. A PASS is not a verdict on quality. --- ## Documents | | | |---|---| | [METHOD.md](METHOD.md) | the protocol end to end | | [FINDINGS.md](FINDINGS.md) | what was tested, what held, what died | | [CHECKLIST.md](CHECKLIST.md) | both gates, every flag code, how to read them | | [CASE_STUDY.md](CASE_STUDY.md) | the run the conclusions came from | | [DISCLAIMER.md](DISCLAIMER.md) | limits, and whose rules govern | | [AGENTS.md](AGENTS.md) | portable ruleset for agents without skill support | | [LLM_PROMPT.md](LLM_PROMPT.md) | single paste-in prompt | --- ## Licence Code MIT, documents CC BY 4.0. See [LICENSE](LICENSE) and [LICENSE-DOCS](LICENSE-DOCS).