unmachined
Make it read written and look made, not generated.
AI output converges on the statistical center: the same vocabulary, the same
cadence, the same purple gradient on the same centered hero. This skill holds
two lines of defense. First, catalogs of known tells with severity tiers.
Second, a variety requirement, because the fix becomes a new tell when every
output converges on the same alternative. Never swap one monoculture for
another.
Priorities: text first, design and layout equal second, branding last.
Always-on (native enforcement)
Once installed, the skill can stay on for the whole CLI session so agents
do not write AI-text slop unless the user opts out.
| Mode |
Behavior |
| always_on: true |
Every user-facing text (and optional UI) is drafted under anti-slop rules and scanned before ship. No need to type /unmachined each time. |
| always_on: false |
Opt-in only: run /unmachined … when you want enforcement. |
| not onboarded |
Ask once (see onboard). Until answered, treat as off. |
Full contract: references/always-on.md.
Onboarding (required once)
On first use, or when onboarded_at is missing, ask:
Turn unmachined always-on for this CLI so all user-facing writing is
anti-slop by default? Or leave off (only when you invoke the skill)?
Then save via:
python3 scripts/onboard.py # interactive
python3 scripts/onboard.py --always-on # native on, text+ui
python3 scripts/onboard.py --always-on --text-only
python3 scripts/onboard.py --always-off
python3 scripts/onboard.py --show # status
Config: project .unmachined.json overrides ~/.config/unmachined/config.json.
Env UNMACHINED_ALWAYS_ON=1|0 overrides the boolean for a single session.
Agent duties when always_on is true
- Resolve config (
scripts/onboard.py --show or read the JSON files).
- Load
references/text-tells.md before drafting user-facing prose.
- Write clean; do not draft slop intending to clean later.
- Run
scripts/scan_text.py on the deliverable; score >= threshold blocks ship.
- If
ui is in surfaces and the task is UI, also load design refs and
scan_ui.py when editing UI source.
- First content write of the session: one short line that always-on is active.
Out of scope: pure logic without user-facing strings; this skill's ban-list
docs; raw logs and data dumps. See always-on.md.
Verbs
| Invocation |
Behavior |
/unmachined <task> (default) |
Build or write with all applicable rules active from the start |
/unmachined onboard |
Ask always-on preference; write config |
/unmachined always-on |
Enable always-on and save |
/unmachined always-off |
Disable always-on and save |
/unmachined status |
Print resolved config |
/unmachined learn |
Build the personal voice profile from the user's own writing (scripts/learn.py) |
/unmachined learn status |
Print the saved voice-profile summary |
/unmachined learn off / learn on |
Toggle personal mode without deleting the profile |
/unmachined audit <target> |
Score and report findings by severity. Never edit |
/unmachined fix <target> |
Audit, repair, verify, and summarize the changes |
/unmachined text <target> |
Run only the prose and copy pipeline |
/unmachined ui <target> |
Run only the interface and frontend pipeline |
/unmachined diff [base] |
Audit only changed lines and their necessary context |
Hosts without slash commands use the same words in natural language.
Dispatch contract
- Parse an explicit verb first. If none is present, use the default build
workflow. A file named
audit or fix remains a target when supplied as a
path.
- If verb is
onboard / always-on / always-off / status, handle config
only (shell scripts/onboard.py …). If verb is learn (or learn status|on|off), shell scripts/learn.py and load
references/personal-voice.md.
- If no config
onboarded_at and the task will write user-facing text, run
onboarding once before continuing (or instruct the user to run the script).
- If always_on is true, apply the always-on agent duties even when the user
did not type
/unmachined.
- Resolve the smallest target that satisfies the request. For
diff, use the
working-tree diff by default.
- State detected surfaces in one short line when both text and UI apply.
audit and diff are read-only unless the user asks to fix.
- Load only the references named by the chosen pipeline.
Load budget
One hop per level: description -> this file -> the reference the pipeline
names. Bulk-loading references/ is a defect, not thoroughness.
- Text (default):
text-tells.md only. Add voice-and-copy.md for microcopy,
technical-founder-correspondence.md for founder or sales replies.
- UI:
design-tells.md. Add design-system.md only when building or
restyling, audit-playbook.md only for audit/fix on existing UI, and
stack-rules.md only when package.json shows Next.js, Tailwind, or shadcn.
- Config verbs (
onboard, always-on, always-off, status): scripts only,
no references.
- Personal voice (
learn verb, or fix/rewrite of the user's own prose when a
profile is enabled): personal-voice.md only.
- Execute the scanners, never read their source.
scan_text.py and
scan_ui.py are run targets, not reading material.
Text pipeline (main priority)
- Read
references/text-tells.md. Microcopy also needs
references/voice-and-copy.md.
- Draft or edit under the rules (em-dash ban; no critical vocabulary; concrete
claims; honesty gate).
- Run the deterministic scanner before self-judgment:
python3 scripts/scan_text.py <file> [file...] [--json] [--threshold 40] [--mode prose|chat|ui]
Stdin works for pasted content. Score >= threshold blocks fix / build /
always-on delivery. Fix criticals first. For JSX/TSX or other source files,
do not treat a whole-file scan_text.py score as a copy verdict: operators,
comments, template expressions, and placeholders can produce false positives.
Run scan_ui.py on the source, then scan extracted user-facing strings or
changed copy separately with scan_text.py. When a personal voice profile
is enabled and the text is the user's own writing, add --personal and
follow references/personal-voice.md for fix/rewrite exemplar targeting.
- Self-critique once, naming what still reads as AI-generated. Revise for
cadence and variety. Do not sand every sentence to the same length.
- Honesty gate: every number is real or a labelled placeholder. No invented
metrics, quotes, or anecdotes.
- For technical founder DMs, prospect chats, or sales-engineering replies, load
references/technical-founder-correspondence.md. Separate truth approval from
voice editing: the domain owner confirms the substance first, then improve the
wording without changing claims. For outreach batches, scan every message
individually and scan the concatenated bodies as a batch; repeated openers,
questions, founder lines, CTAs, or sentence rhythms block shipment even when
each message passes alone. Deleted or retracted messages remain history, but
their claims and CTAs are inactive until a corrected replacement is sent.
Design pipeline
- Read
references/design-tells.md and references/design-system.md. Audits
also need references/audit-playbook.md.
python3 scripts/scan_ui.py <src-dir> [--json] [--threshold 40] [--tailwind-version auto|3|4]
- For Next.js/Tailwind/shadcn, read
references/stack-rules.md and match the
project pin.
- Structure before color; one justified aesthetic risk; WCAG 2.2 AA; reduced
motion; focus visible; 320-768px layouts.
Cross-output variety
Consecutive outputs must not share the same layout skeleton, display font, or
accent hue unless the project design system requires it.
Resolved rule conflicts
- Em-dash: banned in generated text. Hyphen, comma, or restructure.
- Serif type: only with justification; not a lazy default.
- Metrics: real, cited, or labelled placeholder.
- Eyebrows / section numbers: only when they encode a true sequence.
Reference index
| File |
Load when |
references/always-on.md |
Onboard, always-on, or session writing policy |
references/text-tells.md |
Any text work |
references/technical-founder-correspondence.md |
Technical founder DMs, prospect chats, sales-engineering replies, or corrections after domain-owner review |
references/voice-and-copy.md |
Microcopy, UX writing |
references/personal-voice.md |
learn verb, personal-mode scans, fix/rewrite of the user's own prose |
references/design-tells.md |
Any UI work |
references/design-system.md |
Building or restyling UI |
references/audit-playbook.md |
audit or fix on existing UI |
references/stack-rules.md |
Next.js / Tailwind / shadcn |
references/host-support.md |
Install paths and host notes |
scripts/onboard.py |
Onboarding and always-on toggles |
scripts/learn.py |
Build/inspect/toggle the personal voice profile |
scripts/config_show.py |
Status |
scripts/scan_text.py |
Every text deliverable before shipping |
scripts/scan_ui.py |
UI source audits |
Output discipline
This skill's own reports must pass its own rules. Findings are concrete: quote
the line, name the rule, show the fix. No praise padding. Never claim a scan,
render, or test that did not run.
1---2name: unmachined3description: Finds and removes AI slop from prose, UX copy, and web interfaces. Use when writing, auditing, or revising articles, posts, READMEs, marketing copy, UI copy, layouts, or frontend code that must not feel AI-generated; when the user says unmachined, de-slop, AI slop, anti-slop, humanize, make this human, sounds like AI or ChatGPT, looks AI-generated, feels generic, or design/copy audits; and when always-on is enabled in unmachined config (any user-facing text in the CLI must pass anti-slop rules and scan_text before ship). Quality layer, not the author: it edits what authoring skills produce. Not for greenfield brand or aesthetic invention, pure logic without user-facing strings, or evading AI detectors. Supports onboard, always-on/off, status, learn (personal voice profile), audit, fix, text, ui, and diff workflows.4license: MIT5---67# unmachined89Make it read written and look made, not generated.1011AI output converges on the statistical center: the same vocabulary, the same12cadence, the same purple gradient on the same centered hero. This skill holds13two lines of defense. First, catalogs of known tells with severity tiers.14Second, a variety requirement, because the fix becomes a new tell when every15output converges on the same alternative. Never swap one monoculture for16another.1718**Priorities:** text first, design and layout equal second, branding last.1920## Always-on (native enforcement)2122Once installed, the skill can stay **on for the whole CLI session** so agents23do not write AI-text slop unless the user opts out.2425| Mode | Behavior |26|---|---|27| **always_on: true** | Every user-facing text (and optional UI) is drafted under anti-slop rules and scanned before ship. No need to type `/unmachined` each time. |28| **always_on: false** | Opt-in only: run `/unmachined …` when you want enforcement. |29| **not onboarded** | Ask once (see onboard). Until answered, treat as off. |3031Full contract: `references/always-on.md`.3233### Onboarding (required once)3435On first use, or when `onboarded_at` is missing, **ask**:3637> Turn unmachined **always-on** for this CLI so all user-facing writing is38> anti-slop by default? Or leave **off** (only when you invoke the skill)?3940Then save via:4142```bash43python3 scripts/onboard.py # interactive44python3 scripts/onboard.py --always-on # native on, text+ui45python3 scripts/onboard.py --always-on --text-only46python3 scripts/onboard.py --always-off47python3 scripts/onboard.py --show # status48```4950Config: project `.unmachined.json` overrides `~/.config/unmachined/config.json`.51Env `UNMACHINED_ALWAYS_ON=1|0` overrides the boolean for a single session.5253### Agent duties when always_on is true54551. Resolve config (`scripts/onboard.py --show` or read the JSON files).562. Load `references/text-tells.md` before drafting user-facing prose.573. Write clean; do not draft slop intending to clean later.584. Run `scripts/scan_text.py` on the deliverable; score >= threshold **blocks ship**.595. If `ui` is in surfaces and the task is UI, also load design refs and60 `scan_ui.py` when editing UI source.616. First content write of the session: one short line that always-on is active.6263Out of scope: pure logic without user-facing strings; this skill's ban-list64docs; raw logs and data dumps. See always-on.md.6566## Verbs6768| Invocation | Behavior |69|---|---|70| `/unmachined <task>` (default) | Build or write with all applicable rules active from the start |71| `/unmachined onboard` | Ask always-on preference; write config |72| `/unmachined always-on` | Enable always-on and save |73| `/unmachined always-off` | Disable always-on and save |74| `/unmachined status` | Print resolved config |75| `/unmachined learn` | Build the personal voice profile from the user's own writing (`scripts/learn.py`) |76| `/unmachined learn status` | Print the saved voice-profile summary |77| `/unmachined learn off` / `learn on` | Toggle personal mode without deleting the profile |78| `/unmachined audit <target>` | Score and report findings by severity. Never edit |79| `/unmachined fix <target>` | Audit, repair, verify, and summarize the changes |80| `/unmachined text <target>` | Run only the prose and copy pipeline |81| `/unmachined ui <target>` | Run only the interface and frontend pipeline |82| `/unmachined diff [base]` | Audit only changed lines and their necessary context |8384Hosts without slash commands use the same words in natural language.8586## Dispatch contract87881. Parse an explicit verb first. If none is present, use the default build89 workflow. A file named `audit` or `fix` remains a target when supplied as a90 path.912. If verb is `onboard` / `always-on` / `always-off` / `status`, handle config92 only (shell `scripts/onboard.py` …). If verb is `learn` (or `learn93 status|on|off`), shell `scripts/learn.py` and load94 `references/personal-voice.md`.953. If no config `onboarded_at` and the task will write user-facing text, run96 onboarding **once** before continuing (or instruct the user to run the script).974. If always_on is true, apply the always-on agent duties even when the user98 did not type `/unmachined`.995. Resolve the smallest target that satisfies the request. For `diff`, use the100 working-tree diff by default.1016. State detected surfaces in one short line when both text and UI apply.1027. `audit` and `diff` are read-only unless the user asks to fix.1038. Load only the references named by the chosen pipeline.104105## Load budget106107One hop per level: description -> this file -> the reference the pipeline108names. Bulk-loading `references/` is a defect, not thoroughness.109110- Text (default): `text-tells.md` only. Add `voice-and-copy.md` for microcopy,111 `technical-founder-correspondence.md` for founder or sales replies.112- UI: `design-tells.md`. Add `design-system.md` only when building or113 restyling, `audit-playbook.md` only for audit/fix on existing UI, and114 `stack-rules.md` only when package.json shows Next.js, Tailwind, or shadcn.115- Config verbs (`onboard`, `always-on`, `always-off`, `status`): scripts only,116 no references.117- Personal voice (`learn` verb, or fix/rewrite of the user's own prose when a118 profile is enabled): `personal-voice.md` only.119- Execute the scanners, never read their source. `scan_text.py` and120 `scan_ui.py` are run targets, not reading material.121122## Text pipeline (main priority)1231241. Read `references/text-tells.md`. Microcopy also needs125 `references/voice-and-copy.md`.1262. Draft or edit under the rules (em-dash ban; no critical vocabulary; concrete127 claims; honesty gate).1283. Run the deterministic scanner before self-judgment:129 `python3 scripts/scan_text.py <file> [file...] [--json] [--threshold 40] [--mode prose|chat|ui]`130 Stdin works for pasted content. Score >= threshold blocks `fix` / build /131 always-on delivery. Fix criticals first. For JSX/TSX or other source files,132 do not treat a whole-file `scan_text.py` score as a copy verdict: operators,133 comments, template expressions, and placeholders can produce false positives.134 Run `scan_ui.py` on the source, then scan extracted user-facing strings or135 changed copy separately with `scan_text.py`. When a personal voice profile136 is enabled and the text is the user's own writing, add `--personal` and137 follow `references/personal-voice.md` for fix/rewrite exemplar targeting.1384. Self-critique once, naming what still reads as AI-generated. Revise for139 cadence and variety. Do not sand every sentence to the same length.1405. Honesty gate: every number is real or a labelled placeholder. No invented141 metrics, quotes, or anecdotes.1426. For technical founder DMs, prospect chats, or sales-engineering replies, load143 `references/technical-founder-correspondence.md`. Separate truth approval from144 voice editing: the domain owner confirms the substance first, then improve the145 wording without changing claims. For outreach batches, scan every message146 individually and scan the concatenated bodies as a batch; repeated openers,147 questions, founder lines, CTAs, or sentence rhythms block shipment even when148 each message passes alone. Deleted or retracted messages remain history, but149 their claims and CTAs are inactive until a corrected replacement is sent.150151## Design pipeline1521531. Read `references/design-tells.md` and `references/design-system.md`. Audits154 also need `references/audit-playbook.md`.155 `python3 scripts/scan_ui.py <src-dir> [--json] [--threshold 40] [--tailwind-version auto|3|4]`1562. For Next.js/Tailwind/shadcn, read `references/stack-rules.md` and match the157 project pin.1583. Structure before color; one justified aesthetic risk; WCAG 2.2 AA; reduced159 motion; focus visible; 320-768px layouts.160161## Cross-output variety162163Consecutive outputs must not share the same layout skeleton, display font, or164accent hue unless the project design system requires it.165166## Resolved rule conflicts167168- Em-dash: banned in generated text. Hyphen, comma, or restructure.169- Serif type: only with justification; not a lazy default.170- Metrics: real, cited, or labelled placeholder.171- Eyebrows / section numbers: only when they encode a true sequence.172173## Reference index174175| File | Load when |176|---|---|177| `references/always-on.md` | Onboard, always-on, or session writing policy |178| `references/text-tells.md` | Any text work |179| `references/technical-founder-correspondence.md` | Technical founder DMs, prospect chats, sales-engineering replies, or corrections after domain-owner review |180| `references/voice-and-copy.md` | Microcopy, UX writing |181| `references/personal-voice.md` | `learn` verb, personal-mode scans, fix/rewrite of the user's own prose |182| `references/design-tells.md` | Any UI work |183| `references/design-system.md` | Building or restyling UI |184| `references/audit-playbook.md` | audit or fix on existing UI |185| `references/stack-rules.md` | Next.js / Tailwind / shadcn |186| `references/host-support.md` | Install paths and host notes |187| `scripts/onboard.py` | Onboarding and always-on toggles |188| `scripts/learn.py` | Build/inspect/toggle the personal voice profile |189| `scripts/config_show.py` | Status |190| `scripts/scan_text.py` | Every text deliverable before shipping |191| `scripts/scan_ui.py` | UI source audits |192193## Output discipline194195This skill's own reports must pass its own rules. Findings are concrete: quote196the line, name the rule, show the fix. No praise padding. Never claim a scan,197render, or test that did not run.