Back to the catalog

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).

More