| name | omd-humanize |
| description | Rewrite text so it reads as if a person wrote it โ strip AI prose tics (Korean and English), translation-ese, uniform rhythm, hedging stacks, and self-negating meta-copy โ without changing a single fact. Works on any text: page copy, blog posts, READMEs, marketing lines. Also used by omd-ultradesign for every word that ships. Triggers: humanize, ์ฌ๋๊ฐ์ด, ์ฌ๋์ฒ๋ผ ์จ, AIํฐ ๋นผ์ค, ์์ฐ์ค๋ฝ๊ฒ ๋ฐ๊ฟ, ๊ธ ๋ค๋ฌ์ด, make it sound human, de-AI, rewrite naturally. |
omd-humanize
Generated prose confesses before generated pixels do. The tells are countable, and this
skill removes them without touching what the text claims.
The four laws
- Meaning is frozen. Facts, claims, numbers, names, quotes survive verbatim. You are
changing rhythm and diction, never content. If a sentence cannot be de-ticced without
changing its claim, leave it and flag it.
- Only rewrite what a rule tagged. Read the text once, list the violations you found
(pattern โ span), then rewrite exactly those spans. No freestyle "improvements".
- Genre survives. An essay stays an essay; a spec stays a spec. Do not make formal
text chatty or chatty text formal.
- Stop before you over-edit. Two thresholds, not one: if more than 30% of the text
needs rewriting, warn and present only the worst offenders โ do not proceed silently.
If more than 50%, stop entirely; a text that far gone needs a human rewrite, and
patching half of it is how the meaning drifts fastest.
Severity hierarchy
Not all tells are equal. Treating a rare connective comma the same as a mild hedging word
makes rewrites noisy and trust collapse fast. Three tiers:
- S1 โ always remove. One instance is the tell. C-11 connective commas, A-16
pronoun substitutions: a single ๊ทธ๋
in Korean prose reads machine-written to any fluent
reader. Remove on first occurrence, no exceptions.
- S2 โ 1โ2 instances allowed, flag at 3+. These patterns appear in natural writing
but cluster in generated text. A-18 nested relative clauses, A-19 stacked postpositions:
one is fine; three in a paragraph is a fingerprint.
- S3 โ flag only when clustered. E-7 register inconsistency: a single casual ending
in formal prose might be intentional voice; five in a row is drift. Name the cluster
and let the writer decide.
The tells (Korean โ from the im-not-ai taxonomy)
- Translation-ese: ~๋ฅผ ํตํด, ~์ ๋ํด ์ดํด๋ณด๋ค, ์ด์ค ํผ๋(-๋์ด์ง๋ค)
- A-16 (S1): ๊ทธ/๊ทธ๋
/๊ทธ๊ฒ ๊ธฐ๊ณ์ ๋๋ช
์ฌ ๋งคํ โ ํ๊ตญ์ด๋ ์ฃผ์ด๋ฅผ ์๋ตํ๊ฑฐ๋ ๋ช
์ฌ๋ฅผ
๋ฐ๋ณตํ๋ค. ๊ทธ/๊ทธ๋
๊ฐ ๋์ค๋ฉด ์ญ์ ํ๊ฑฐ๋ ์ง์ ๋์ ๋ช
์ฌ๋ก ๋์ฒด.
- A-18 (S2): ์ผ์ชฝ ๋ถ๊ธฐ ๊ดํ์ 3์ค์ฒฉ ์ด์ โ "~์ ์ํด ๊ฒฐ์ ๋ ๊ฒฐ๊ณผ๋ก ๋์ถ๋ ๋ฐฉํฅ์ฑ"์ฒ๋ผ
๋ช
์ฌ ์์ ๊ดํ์ ์ด 3๊ฐ ์ด์ ์์ด๋ฉด ๋ถ๋ฆฌ.
- A-19 (S2): ๊ฒน์กฐ์ฌ โ -์์์/-์๋ก์/-์ผ๋ก์ ๊ฐ์ ์กฐ์ฌ ์ค์ฒฉ. ๋ฌธ์ฅ์ ์ชผ๊ฐ๊ฑฐ๋ ์กฐ์ฌ๋ฅผ
๋จ์ํ.
- C-11 (S1): ์ ์์ด ์งํ ์ผํ โ ๊ทธ๋ฌ๋, / ํ์ง๋ง, / ๋ํ, / ๋ฐ๋ผ์, ํํ. ๊ฐ์ฅ ๊ฐํ
๋จ์ผ ํ๋ณ์. ํ๊ตญ์ด ์์ฐ๋ฌธ์์ ์ ์์ด ๋ค ์ผํ๋ ๊ฑฐ์ ์๋ค. ์ผํ๋ฅผ ์ญ์ ํ๊ฑฐ๋ ์ ์์ด๋ฅผ
์ ๊ฑฐํ๊ณ ๋ฌธ์ฅ์ ์ด์ด๋ผ.
- Mechanical structure: ์ฒซ์งธ/๋์งธ/์
์งธ ๋์ด, ๋ถ๋ฆฟยท์ด๋ชจ์ง ๋จ๋ฐ
- AI stock phrases: ๊ฒฐ๋ก ์ ์ผ๋ก, ์์ฌํ๋ ๋ฐ๊ฐ ํฌ๋ค, ์ฃผ๋ชฉํ ๋งํ๋ค, ~ํ ํ์๊ฐ ์๋ค,
์ค์ํ ๊ฒ์ ~๋ผ๋ ์ ์ด๋ค
- Uniform rhythm: ๋ฌธ์ฅ ๊ธธ์ด ๋ถ์ฐ์ด ์์, ๊ฐ์ ์ด๋ฏธ ์ฐ์(-๋ค/-๋ค/-๋ค, -์
๋๋ค 3์ฐ์)
- E-7 (S3): ๊ฒฝ์ด๋ฒ ๋ ๋ฒจ ํ๋ค๋ฆผ โ ํฉ์ผ์ฒด์ ํด์ฒด๊ฐ ๋จ๋ฝ ์์์ ์์. ๋ํ๋ฌธ ์์ ํ๋ค๋ฆผ์
์์ธ. ๊ตฐ์ง(5ํ+)์ผ ๋๋ง ์ ๊ฑฐ.
- E-8 (S1): ํ๊ตญ์ด ๋ฌธ์ฅ ์ ์คํ์ด์ค๋ ๋์ โ " โ " ๋๋ " โ "(์์ ๊ณต๋ฐฑ์ด ์๋ em-dash/
en-dash)๊ฐ ํ๊ธ์ด ํฌํจ๋ ๋ฌธ์ฅ์ ๋ฑ์ฅํ๋ฉด ์ฆ์ ์ ๊ฑฐ. ์๋ฌธ ํ์ดํฌ๊ทธ๋ํผ ๊ด์ต์ด ๋ฒ์ญ ๊ณผ์ ์์
๊ทธ๋๋ก ์ฎ๊ฒจ์ง ํจํด์ด๋ค. ์ผํยท์ฝ๋ก ยท์ ๋ฌธ์ฅ์ผ๋ก ๋์ฒด.
SLOP-KO-EMDASH ๊ท์น๊ณผ ๋์ผํ ํจํด.
- E-9 (S1): ๊ฒฝ์ด๋ฒ ํผ์ฉ โ ํด์์ฒด(์์/์ด์/์์/์์)์ ํฉ๋๋ค์ฒด(์ต๋๋ค/ใ
๋๋ค)๊ฐ ๊ฐ์
๋จ๋ฝ์์ ๊ต์ฐจํ๋ฉด S1์ผ๋ก ์ฒ๋ฆฌ. ๋ฐ์ดํ ์์ ๋ํ๋ ์์ธ. ํ์ด์ง ์ ์ฒด์์ ๋ณด์ด์ค ์คํฐ๋๊ฐ
๊ฒฐ์ ํ ํ ๊ฐ์ง ์ด์ฒด๋ง ์ฌ์ฉ.
SLOP-KO-REGISTER-MIX ๊ท์น๊ณผ ๋์ผํ ํจํด.
- Redundant modification: ๋งค์ฐ/์ ๋ง/์์ฃผ ์ต๊ด์ ์ฌ์ฉ, ์ ์์ด ์(๋ช
ํํ๊ณ ๋ถ๋ช
ํ),
-์ /-์ฑ/-ํ ์ ๋ฏธ์ฌ ๋จ๋ฐ
- Hedging stacks: ~ํ ์ ์์ ๊ฒ์ผ๋ก ๋ณด์ธ๋ค, ~์ผ ์๋ ์๋ค๊ณ ์๊ฐ๋๋ค
- Connector abuse: ๋ํ/๋ฐ๋ผ์/์ฆ/๊ทธ๋ฆฌ๊ณ ๋ก ์ฐ์ ๋ฌธ์ฅ ์์ โ 3๋ฌธ์ฅ ์ด์ ์ฐ์์ผ๋ก ์ ์์ด๊ฐ ์ค๊ฑฐ๋,
C-11 ํจํด(์ ์์ด ์งํ ์ผํ)์ด ์์ ๋๋ง ์ฒ๋ฆฌ. ์ ์์ด ์์ฒด๋ ์ญ์ ํ์ง ์๋๋ค. ์์ฐ์ด์์ ์ ์์ด
์ฌ์ฉ๋ฅ ์ ๋ฌธ์ฅ๋น 0.4 ์์ค์ด ์ ์์ด๋ค. ์ ์์ด๋ฅผ ์ ๋ถ ์ ๊ฑฐํ๋ฉด ๋์ด์ฝ๊ธฐ๊ฐ ๋น์ธ๊ฐ์ ์ผ๋ก ๋๊ปด์ง๋ค.
- Tidy closure (S2): ์์ธ์ดยทํ๊ณ ๊ธ ๋ฑ essayistic ์ฅ๋ฅด์์ ์์ง ํด๊ฒฐ๋์ง ์์ ์ง๋ฌธ์
ํด๊ฒฐ๋ ๊ฒ์ฒ๋ผ ํฌ์ฅํ๋ ๋ฌธ๋จ ๋ง๋ฌด๋ฆฌ. "์ด๊ฒ ๊ฐ์ฅ ํฐ ๊ตํ์ด์์", "์ฌํด์ ํต์ฌ ์ํ์ด์์" ํํ๋ก
๋ถํ์ค์ฑ์ ์ง์ด๋ค. ์ธ๊ฐ ํ์๋ "ํ์ง๋ง ์์ง๋ ์ ๋ชจ๋ฅด๊ฒ ๋ค" ์ฒ๋ผ ์ด๋ฆฐ ๊ฒฐ๋ง์ ์ด๋ค. ๋จ, product
copy๋ ํํ ๋ฆฌ์ผ์ ์์ธ โ ๋ช
ํํ takeaway๊ฐ ์ ๋นํ๋ค. essayistic ๋งฅ๋ฝ์์๋ง ํ๋๊ทธ.
- Formal-noun padding: ~๊ฒ์ด๋ค, ~์ ์ด๋ค, ~์ ์๋ค ๋ก๋ง ๋๋๋ ๋ฌธ๋จ
The tells (English)
- Stock openers/closers: "In conclusion", "It's worth noting", "Moreover", "delve into",
"In today's fast-paced world"
- Rule-of-three everywhere; balanced "not only X but also Y"; em-dash chains
- Every paragraph the same length; every sentence 15โ25 words
- Hedging: "can potentially", "may possibly", "it could be argued"
- Bold key phrases sprinkled as decoration
- Self-introductory product copy (S1 in hero/opener): "[Product] is a [platform/tool/
system/solution/service] that helps you [verb]." The model is quoting its own brief.
Rewrite from the user's change, not the product's mechanism:
- โ "Acme is a project management platform that helps teams ship faster."
- โ
"Ship the Monday build, not the Monday Slack thread."
The Korean form is the same pattern: "X๋ Y๋ฅผ ๋์์ฃผ๋ ํ๋ซํผ์ด์์" โ write what changes
for the user, not what the product is.
- Reflexive over-politeness (S2, flag at 2+ instances): "Please feel free to", "We'd
be happy to help", "Don't hesitate to reach out", "Should you have any questions." These
phrases come from helpdesk training data. On a product page they read as a form letter.
Cut the reflex clause; write the direct action:
- โ "Please feel free to get started when you're ready."
- โ
"Ready when you are."
- โ "We'd be happy to help you with any questions."
- โ
"Something unclear? [link]"
- Over-nominalization clusters (S2, flag at 3+ in a paragraph): "the facilitation of
onboarding", "the optimisation of workflows", "the management of permissions". Each
alone is acceptable; clustered they mark the register as generated. Replace with the
verb and the concrete subject.
Four tells the linter cannot fully catch
These require human judgment because the IR cannot measure them mechanically:
-
Hard line breaks mid-sentence (<br> or \n inside a paragraph, not at a sentence
boundary): the DOM collapses <br> before the linter sees the text, so SLOP-BR-BREAK
cannot be a YAML rule. Look for <br> in the source HTML of any paragraph or hero line.
Remove it; max-width and line-height control the column, not the markup. An inserted
break that is not at a sentence end is always an AI formatting artifact.
-
Self-explainer copy (both languages): the product describing its own mechanism in
README cadence instead of selling an outcome. Patterns: "X๋ Y๋ฅผ ์ก์๋ด๋ ํ๋ฌ๊ทธ์ธ์ด์์",
"X is a tool that helps you Y", "omd detects Z and fixes it". These read as the model
quoting its own task description. Rewrite as the outcome: what the reader gets, what
changes, what happens next. The self-introductory product copy tell above is its hero
variant โ same root, slightly different surface; both are pre-handoff checks, not linter
rules, because product comparison tables and developer docs legitimately use the same
construction.
The pink elephant (absolute, both languages)
Copy must never state what the thing is NOT. Told "no clutter", a model writes "No
clutter here." โ that is the model quoting its own instructions. Delete the negation and
write the positive fact it was hiding:
- โ "์ด ์ฌ์ดํธ์๋ ๊ด๊ณ ๋ ๋ถํ์ํ ๋ด์ฉ์ด ์์ต๋๋ค" โ โ
์ค์ ๋ก ์๋ ๊ฒ์ ๋งํ๋ค
- โ "No fluff, no jargon, just value" โ โ
name the value concretely
- โ "We don't waste your time" โ โ
"Setup takes four minutes."
And design rationale never appears in shipped copy. If the text is page copy inside an
omd project, run omd check <page> โ SLOP-LEAKED-RATIONALE fires when five consecutive
words match .omd/frame.md or decisions.md. The frame explains the work; the page must
never quote it.
What to write toward
The tells above describe what to remove. theory/voice.md under the directory omd pack dir prints (in this repo:
core/theory/voice.md) describes what to write toward: sentence-length variance as the human signal, front-loading,
concrete nouns over nominalisations, the Mailchimp plainspoken standard, the Toss "Easy
to speak" test for Korean. The removes and the positive moves are two sides of the same
operation โ a rewrite that only strips tells without installing variance is a cleaned-up
monotone, not a human voice.
Procedure
- Read the whole text. Build the violation list:
[pattern-id] "span" โ one line each.
- Rewrite tagged spans only. Vary sentence length deliberately: after two long sentences,
a four-word one. Restore the writer's register, not yours.
- Show the result, then the violation list so the change is auditable.
- For page copy in an omd project:
omd check <page> --category slop must come back
clean before you call it done.