One sentence: point it at a sample you wrote, and get back a ready-to-use skill that rewrites other text into your voice — measured against your own numbers, with the meaning frozen.
- 🧬 Voice from a sample — build a personal humanizer from as little as one document you wrote.
- 📐 Quantitative fingerprint — a stdlib profiler measures sentence architecture, ending register, lexical density, connective rhythm, stance, and formatting as distributions, not vibes.
- 🧵 Multi-agent analysis — one specialist agent per style axis fans out over your text, then a synthesizer merges them into a single profile.
- 🏭 Emits a real skill — output is a standalone
humanize-<name>/skill:SKILL.md+ astyle_metrics.pywith your baselines baked in + before/after examples mined from your own sentences. - 🔒 Meaning stays frozen — every emitted skill inherits an ironclad covenant: facts, numbers, citations, and order never change; only phrasing, rhythm, and arrangement do.
- 🇰🇷 🇬🇧 Korean or English — pick the language at the start; the taxonomy and the metrics switch with it.
- ✅ Self-verifying — fully automatic, so the factory round-trips each emitted skill on held-out text and won't silently ship an overfit voice.
Not Just "Rewrite This in My Style"
A normal prompt like "make this sound like this sample" is a one-off imitation. It asks the model to notice whatever it notices in the moment, and the next request starts over from scratch.
personal-humanizer-maker turns the sample into a reusable, inspectable artifact:
| One-off prompt | personal-humanizer-maker |
|---|---|
| Reads a sample and improvises | Measures the sample into a quant_profile.json first |
| Style is whatever the model remembers | Seven axis specialists write explicit rules for sentence shape, register, lexicon, cohesion, stance, figuration, and formatting |
| No persistent baseline | Emits style_metrics.py with the author's numeric bands baked in |
| Hard to audit | Emits style_profile.md and examples mined from the author's own sentences |
| Can drift or over-edit | Injects the same meaning-invariance covenant into every generated skill |
| Every rewrite repeats the analysis | One build creates humanize-<name>/; every later rewrite reuses that skill |
The output is not a vibe prompt. It is closer to a tiny style compiler: sample in, measured profile out, reusable skill emitted.
Why It Exists
Writing a style guide for your own voice by hand is slow and subjective. The seed skill
personal_humanize is exactly that — a hand-authored
S1–S8 / A1–A3 ruleset plus hardcoded metric thresholds, all derived by staring at one
author's corpus until the patterns fell out.
personal-humanizer-maker generalizes that labor. Point it at a writing sample and it does
the profiling, the axis-by-axis dimension analysis, the threshold calibration, and the skill
packaging for you — and hands back a skill shaped exactly like the hand-made one, so it
"just works" the same way. The hand-tuned instance becomes one output of the factory
rather than a bespoke artifact.
How It Works
sample doc + language (ko/en)
│ [CODE] profile_corpus.py
▼
quant_profile.json 7-axis distributions: sentence length · ending mix · gloss rate · connective density · passive/nominalization · formatting
│ [MULTI-AGENT] one specialist agent per axis, fanned out ← references/taxonomy.{lang}.md
▼
dimension_profiles[] per-axis value + confidence + rules + before/after mined from your text
│ [MULTI-AGENT] synthesizer (barrier): merge, dedup, demote weak axes
▼
style_profile.json unified rules + calibrated baselines + canonical examples
│ [CODE] emit_skill.py + templates ← references/ironclad.md (covenant injected)
▼
humanize-<name>/ standalone skill: SKILL.md + style_metrics.py (your bands) + examples.md
│ [CODE+AGENT] roundtrip_check.py + fidelity audit ← automatic safety gate
▼
PASS → ship / FAIL → widen bands · demote low-confidence axes · re-emit once · else ship with CONFIDENCE note
Three layers, kept deliberately separate:
| Layer | Does | Artifacts |
|---|---|---|
| CODE (deterministic, stdlib-only) | corpus profiler · skill emitter · round-trip checker | scripts/profile_corpus.py, scripts/emit_skill.py, scripts/roundtrip_check.py |
| REFERENCE (static knowledge) | style-dimension taxonomy (ko/en) · signal→axis map · covenant · templates | references/taxonomy.{ko,en}.md, references/signal-map.md, references/ironclad.md, templates/* |
| LLM / multi-agent (interpretive) | axis specialists · synthesizer · fidelity auditor | orchestrated from SKILL.md |
What It Learns
The generated skill is readable. For a Korean public-rhetoric test built from Kim Gu's
My Wish excerpts, the emitted SKILL.md learned rules like:
SA1. Combine short explanatory sentences into longer declarative sentences around
65-85 Korean characters, without exceeding 135 characters.
RM1. End sentences with -다, -것이다, -이라 믿는다, or -하기 때문이다;
avoid modern polite explanatory endings.
SV1. Use "나는" to state public conviction and responsibility, not private preference.
Expand individual judgment into "우리 사회", "나라", or "민족" when the source supports it.
For an English public-oratory test built from Lincoln texts, it learned a different rule set:
SA2. Use parallel clause chains with repeated openings such as "if", "we", "that",
or "it is" when the source presents alternatives or obligations.
RM1. Keep the prose formal and contraction-free.
CA3. End paragraphs on commitment, preservation, judgment, or consequence rather than
on a neutral summary.
Those rules are paired with numeric bands such as mean sentence length, long-sentence ratio, declarative-ending ratio, passive/nominalization rate, bullet ratio, and emoji count. A rewrite can then be checked mechanically:
python3 humanize-kimgu-ko-test/scripts/style_metrics.py rewritten.md
# strict 8/8, CONVERGED
Before / After
Korean
Neutral modern input:
한국 사회가 기술을 잘 활용하려면 몇 가지 조건이 필요하다. 먼저 시민이 기술의 원리를 이해하고
비판적으로 판단할 수 있어야 한다. 기업은 빠른 성장만 추구하지 말고 이용자의 권리와 안전을 함께
고려해야 한다.
Generated Kim Gu-style rewrite:
나는 우리 사회가 기술을 잘 쓰는 나라가 되려면 먼저 시민이 그 기술의 원리를 알고, 스스로 옳고 그름을
판단할 힘을 길러야 한다고 믿는다. 기업도 빠른 성장만을 소원할 것이 아니라 이용자의 권리와 안전이
함께 보장되어야 할 것이요, 정부도 규제를 세울 때에는 현장의 빠른 걸음과 공익의 큰 길이 서로
어그러지지 않도록 해야 할 일이다.
The original matched 5 / 8 strict Korean bands. The rewrite matched 8 / 8.
English
Scientific input:
Natural selection in each well-stocked country, must act chiefly through the competition
of the inhabitants one with another, and consequently will produce perfection, or strength
in the battle for life, only according to the standard of that country.
Generated Lincoln-style rewrite:
Natural selection, in each well-stocked country, must act chiefly through competition,
one inhabitant with another. It may therefore produce perfection, or strength in the
battle for life, only by the standard of that country.
The original matched 10 / 12 strict Lincoln bands. The rewrite matched 12 / 12.
Install
git clone https://github.com/TaewoooPark/personal-humanizer-maker.git
cd personal-humanizer-maker
# Claude Code (default) -> ~/.claude/skills
bash setup/install.sh
# Codex -> ~/.codex/skills (+ ~/.agents/skills mirror)
bash setup/install.sh --target codex
# Both
bash setup/install.sh --target both
Pure standard-library Python 3.9+. No venv, no third-party packages, no network at install time.
Too busy to run three commands? You're already talking to a coding agent — make it earn its keep. Paste the repo link and one of these into Claude Code / Codex / Cursor:
English
Clone
https://github.com/TaewoooPark/personal-humanizer-makerand install it for this host (bash setup/install.shin Claude Code, orbash setup/install.sh --target codexin Codex), then confirm thepersonal-humanizer-makerskill is active in my session. Once it's in, build a personal humanizer from a sample of my writing.
한국어
https://github.com/TaewoooPark/personal-humanizer-maker클론해서 현재 호스트에 맞게 설치해줘(Claude Code면bash setup/install.sh, Codex면bash setup/install.sh --target codex). 그리고personal-humanizer-maker스킬이 활성화됐는지 확인해줘. 되면 내가 쓴 글 샘플로 개인 휴머나이저 하나 만들어줘.
Yes — the tool for not sounding like an AI, installed by an AI. We're aware.
Usage
Inside Claude Code or Codex, trigger it in natural language and hand it a sample:
build a personal humanizer from this document I wrote: <path or paste>
내가 쓴 이 글로 개인 휴머나이저 스킬 만들어줘
It asks one thing up front — Korean or English — then runs the pipeline and drops the
emitted skill into the active host's skill root: ~/.claude/skills/humanize-NAME/ in
Claude Code, or ${CODEX_HOME:-~/.codex}/skills/humanize-NAME/ in Codex. From then on you
humanize any text with that skill:
humanize this draft in my voice
이 초안 내 문체로 다듬어줘
The maker is the factory; the emitted skill is the tool. One profiling run per author; the skill it produces is reusable forever.
Outputs
An emitted skill mirrors the hand-made seed exactly, so nothing new has to be learned:
~/.claude/skills/humanize-NAME/ # Claude Code
${CODEX_HOME:-~/.codex}/skills/humanize-NAME/ # Codex
├── SKILL.md # §0 covenant + your per-axis rules + workflow + self-check
├── scripts/style_metrics.py # your baseline bands baked in (+ language flag)
└── references/
├── style_profile.md # the full profile, for transparency / debugging
└── examples.md # before/after pairs mined from your own writing
Benchmark
Two questions: can a one-document profile generalize to other texts by the same author,
and can an emitted skill actually move a different input into the learned style bands?
Tested with public corpora and smoke-test rewrites in both English and Korean. Full method:
docs/benchmark.md.
Generalization: build from one Paul Graham essay (How to Work Hard), test on five held-out essays:
| Evaluation | Strict bands | Convergence | Verdict |
|---|---|---|---|
| Paul Graham — 5 held-out essays (pooled) | 41 / 45 | 91% | ✅ CONVERGED |
| per essay | 8–9 / 9 | 89–100% | ✅ |
| Federalist No. 10 — different author (control) | 7 / 9 | 78% | ❌ DIVERGED |
A one-document build generalizes to 91% of strict bands across the author's other essays, and the same bands reject a different author — which fails precisely on the sentence-length signature (mean 33 words vs. the PG band [13, 22]), not on traits formal prose shares. The 7-axis multi-agent pass captured this voice, not a template: keep contractions, pivot on "But / And yet" (never however / therefore), land paragraphs on a blunt fragment ("There isn't.").
Rewrite smoke tests:
| Test | Before | After | Verdict |
|---|---|---|---|
| Kim Gu-style Korean rewrite | 5 / 8 | 8 / 8 | CONVERGED |
| Lincoln-style English rewrite | 10 / 12 | 12 / 12 | CONVERGED |
These are not claims of perfect authorship cloning. They show the intended product behavior: the factory creates a measurable, reusable voice skill, and a consumer model can use that skill to move a draft toward the learned profile while preserving facts.
Repository Layout
personal-humanizer-maker/
├── README.md · README.ko.md · LICENSE
├── schemas/ # the three code↔agent contracts
│ ├── quant_profile.schema.json
│ ├── dimension_profile.schema.json
│ └── style_profile.schema.json
├── setup/install.sh
└── skills/personal-humanizer-maker/
├── SKILL.md # orchestrator
├── agents/openai.yaml # Codex UI metadata
├── references/ # taxonomy.{ko,en}.md · signal-map.md · ironclad.md
├── scripts/ # profile_corpus.py · emit_skill.py · roundtrip_check.py
└── templates/ # SKILL.md.tmpl · style_metrics.py.tmpl
Notes & Limitations
- Fully automatic, so overfitting is the real risk. A thin sample can't support a strong claim on every axis — under-supported axes ship as advisory, the bands widen, and the round-trip gate is the backstop. The factory never ships a voice it couldn't reproduce.
- Generation costs tokens. The multi-agent analysis is a one-time cost per author; the emitted skill is free to run afterward.
- Korean is the calibrated path. The metrics and taxonomy were first derived on a Korean corpus; English is supported and switches in at the start, but is the newer path.
- No third-party text is vendored. When a public author's writing is used for testing, only aggregate metrics are reported — never their text republished.
- The covenant is not optional. Meaning-invariance is injected into every emitted skill regardless of the author's own style.
License
Original work in this repository is released under the MIT License.
No comments yet
Be the first to share your take.