User-Facing Text Cleanup
guillaumemeyer/watermarks-remover
Audits prose for invisible Unicode characters and rewrites it while keeping facts, citations, code and required disclosures unchanged and the writer's voice intact.
Rewrites Korean text written by AI so it reads like a human wrote it, detecting translationese and other AI patterns while leaving the content untouched.
SKILL.md written in Korean; this summary is our English description.
$ npx skills add epoko77-ai/im-not-ai --skill humanize-korean -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install epoko77-ai/im-not-ai humanize-korean --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/epoko77-ai/im-not-ai.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/humanize-korean .claude/skills/humanize-korean && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "humanize-korean" agent skill from https://github.com/epoko77-ai/im-not-ai/tree/main/skills/humanize-korean into .claude/skills/humanize-korean/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "humanize-korean", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/epoko77-ai/im-not-ai/tree/main/skills/humanize-koreanType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add epoko77-ai/im-not-ai --skill humanize-korean -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install epoko77-ai/im-not-ai humanize-korean --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/epoko77-ai/im-not-ai.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/humanize-korean .agents/skills/humanize-korean && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "humanize-korean" agent skill from https://github.com/epoko77-ai/im-not-ai/tree/main/skills/humanize-korean into .agents/skills/humanize-korean/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "humanize-korean", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add epoko77-ai/im-not-ai --skill humanize-korean -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install epoko77-ai/im-not-ai humanize-korean --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/epoko77-ai/im-not-ai.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/humanize-korean .cursor/skills/humanize-korean && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "humanize-korean" agent skill from https://github.com/epoko77-ai/im-not-ai/tree/main/skills/humanize-korean into .cursor/skills/humanize-korean/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "humanize-korean", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/epoko77-ai/im-not-ai.git --path skills/humanize-korean--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add epoko77-ai/im-not-ai --skill humanize-korean -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install epoko77-ai/im-not-ai humanize-korean --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/epoko77-ai/im-not-ai.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/humanize-korean .gemini/skills/humanize-korean && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "humanize-korean" agent skill from https://github.com/epoko77-ai/im-not-ai/tree/main/skills/humanize-korean into .gemini/skills/humanize-korean/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "humanize-korean", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install epoko77-ai/im-not-ai humanize-koreanInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add epoko77-ai/im-not-ai --skill humanize-korean -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/epoko77-ai/im-not-ai.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/humanize-korean .github/skills/humanize-korean && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "humanize-korean" agent skill from https://github.com/epoko77-ai/im-not-ai/tree/main/skills/humanize-korean into .github/skills/humanize-korean/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "humanize-korean", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add epoko77-ai/im-not-ai --skill humanize-korean -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install epoko77-ai/im-not-ai humanize-korean --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/epoko77-ai/im-not-ai.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/humanize-korean .opencode/skills/humanize-korean && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "humanize-korean" agent skill from https://github.com/epoko77-ai/im-not-ai/tree/main/skills/humanize-korean into .opencode/skills/humanize-korean/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "humanize-korean", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
humanize-koreanRewrites Korean text written by AI so it reads like a human wrote it, detecting translationese and other AI patterns while leaving the content untouched.
The skill detects and classifies 85 AI-tell patterns in 10 categories, among them translationese, excess English quotation, mechanical parallelism, idioms, passive overuse, connective overuse, uniform rhythm and too many emojis or bullets, and then rewrites style, rhythm and wording only. Before rewriting it lists the core nouns and concepts of each sentence as anchors and rolls a sentence back if an anchor would disappear.
A shim scores the text and sets a route: light for well-written text (one call), standard (two calls) and heavy for severe or long text (three or more calls: diagnose, targeted rewrite, finalize). You can force light or heavy by wording, and light or standard results graded C or D prompt a suggestion to rerun in heavy mode. Each run gets a folder under `_workspace/` named with a date, sequence number and random tag, and verification gates check the result. Simple spelling fixes, translation and content rewrites are out of scope. The text is in Korean.
4 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit 2f3d943. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Ships script files (Python), which the agent can run.
Shell commands in SKILL.md call:
python3bashFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Korean AI-Text Humanizer loads about 4.5k tokens when it runs, and up to ~87k if it reads all its reference files. Until then it costs about 171 tokens; SKILL.md has 2,516 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from epoko77-ai/im-not-ai at commit 2f3d943, republished under its MIT licence (© epoko77-ai). 2,516 words, ~4,533 tokens.
.claude/skills/humanize-korean/SKILL.md (or your agent's skills folder). This skill also uses 18 other files; get the full folder from GitHub.v2.3.2 — 플러그인 스킬을 관례 위치(루트
skills/)로 이동. 마켓플레이스 설치에서 shim·진단이 조용히 누락되던 경로 문제 해소. v2.3.1 — 경로 해석·런타임 경계·계약 정합 수정 회차(외부 제보 반영). 기능 변경 없음. v2.3.0 — 구조 수렴 게이트(verify_gates.py4축: 목표달성·대구 전멸·수치·golden) + 진단 슬림 인덱스(diagnosis-rules.md, taxonomy 83%↓). (v2.2: route_hint 3경로 + 단일 콜 우선) 버전 히스토리·실측 근거·테스트 시나리오:${CLAUDE_SKILL_DIR}/references/design-notes.md
작업 시작 시 가장 먼저 다음 한 줄을 사용자에게 출력한다.
humanize-korean v2.3 — 경로: {light|standard|heavy} ({route_hint|사용자 지정}) / run_id: {YYYY-MM-DD-NNN-TAG}(경로는 Phase 1의 shim 실행 후에 확정되므로, 이 상태 줄은 shim 직후 출력한다.)
--strict·"정밀 모드"·"정밀하게"·"제대로" → heavy 고정. "가볍게"·"빠르게만" → light 고정. 명시가 있으면 route_hint는 무시한다.00_metrics.json에 쓴 route_hint(light|standard|heavy)를 디폴트 경로로 따른다.route_hint 필드가 없거나 shim이 graceful degrade로 점수 산출에 실패한 경우 → standard로 간주.모든 경로는 cwd 기준. 새 폴더 생성도 cwd 기준 _workspace/{YYYY-MM-DD-NNN-TAG}/에 만든다.
TAG 는 세션 구분자다. Phase 1 맨 처음에 한 번 만들어 그 run 내내 재사용한다.
TAG=$(python3 -c "import secrets;print(secrets.token_hex(2))") # 예: a3f9이후 모든 명령의 _workspace/{run_id} 에 같은 TAG 를 쓴다. 중간에 새로 만들지 않는다.
기존 시퀀스 확인은 Glob 도구로 표지 파일을 매칭해 간접 조회.
올바른 사용법: Glob(pattern="_workspace/YYYY-MM-DD-*/01_input.txt") → 결과에서 폴더명 추출 후 NNN 최댓값 + 1.
(-TAG 가 뒤에 붙어도 접두어가 같아 이 패턴은 그대로 맞는다.)
주의: Glob은 디렉토리 자체는 매칭하지 못한다. 반드시 그 안의 표지 파일(01_input.txt)을 매칭할 것.
Bash ls는 OS·셸 환경에 따라 경로 해석이 달라지므로 사용 금지.
당일 폴더가 없으면 NNN = 001. 있으면 마지막 NNN + 1.
부분 재실행 신호("이 카테고리만 다시"·"2차 윤문")일 경우 기존 run_id 재사용(TAG 포함) + heavy 경로로 자동 승급.
🔴 TAG 를 빼지 마라. 한 머신에서 세션이 여러 개 동시에 도는 환경에서는 NNN 만으로 겹친다. Glob 으로 자리를 확인하고
mkdir하기까지 틈이 있어 다른 세션이 같은 번호를 잡기 때문이다. 두 세션이 한 디렉터리를 쓰면 서로의01_input.txt를 덮어쓰고, 게이트가 남의 원문과 내 윤문본을 비교해 있지도 않은 제목·인용이 사라졌다며 ABORT 를 낸다. 윤문본 자체는 멀쩡하므로 원인을 찾기가 특히 어렵다.
${SKILL_ROOT})스크립트는 절대경로로 부른다. cwd 기준 상대경로로 부르면 안 된다.
references/* 는 스킬 디렉터리 기준이라 ${CLAUDE_SKILL_DIR} 를 쓴다 — ${SKILL_ROOT} 와 기준이 다르니 섞지 않는다. 룰북·taxonomy 경로도 맨앞 접두어 없이 쓰면 cwd 로 풀려 No such file or directory 가 난다.
scripts/*.py는 설치 루트에 있고 cwd 는 사용자 작업 디렉터리다. 마켓플레이스 설치에서 둘은 절대 일치하지 않는다. 반면 _workspace/ 같은 데이터 경로는 cwd 기준이다(run_id 규칙 참조). 두 기준이 한 명령줄에 섞이므로 스크립트 쪽만 절대경로로 고정한다.
Phase 1 시작 전에 한 번 정한다.
SKILL_ROOT="$(d="$(cd -P "${CLAUDE_SKILL_DIR}" && pwd)"; \
while [ "$d" != / ] && [ ! -d "$d/.claude-plugin" ]; do d="$(dirname "$d")"; done; echo "$d")".claude-plugin/ 디렉터리를 만날 때까지 거슬러 올라간다. 고정된 횟수로 올라가지 않는 이유는 스킬 위치가 배포 방식마다 다를 수 있어서다 — 고정 깊이는 레이아웃이 바뀌면 조용히 엉뚱한 곳을 가리킨다.
cd -P 가 핵심이다. 심링크 설치(install.sh 기본)에서는 스킬 디렉터리가 저장소를 가리키는 심링크라, 그냥 cd 하면 셸이 논리 경로를 유지해 엉뚱한 곳(홈 디렉터리)으로 올라간다. -P 로 물리 경로를 먼저 푼 뒤 올라가야 심링크·플러그인 양쪽에서 같은 답이 나온다. 이후 모든 스크립트 호출에 ${SKILL_ROOT}/scripts/... 를 쓴다.
확인: ls "${SKILL_ROOT}/scripts/prepare_monolith_input.py" 가 실패하면 경로 유도가 틀린 것이다. 이 경우 스크립트를 찾을 때까지 임의로 추측하지 말고, 정량 shim·게이트 없이 진행한다고 사용자에게 알린 뒤 계속한다. 조용히 건너뛰면 route_hint 와 철칙 #4 게이트가 사라진 것을 아무도 모른다.
CLAUDE_PLUGIN_ROOT는 Bash 도구 안에서 비어 있는 경우가 확인됐다(#84). 이 변수에 의존하지 않는다.
_workspace/{run_id}/ 생성01_input.txt에 저장python3 ${SKILL_ROOT}/scripts/prepare_monolith_input.py --run-dir _workspace/{run_id} --genre {genre}--genre 값은 영문 키: essay | column | report | blog | abstract (생략 시 essay). 장르 힌트 매핑: 칼럼→column, 리포트→report, 블로그→blog, 공적/기타→essay.--run-dir·--diagnosis의 상대 경로는 cwd 기준으로 해석된다(위 run_id 규칙과 동일 기준). 그 외 인자: --text(run-dir 없이 즉석 실행 시 새 run 디렉토리 자동 생성 — 이때는 --session-tag {TAG} 를 같이 준다), --baseline(baseline JSON 경로 override, 평소 불필요), --diagnosis(진단 텍스트 파일을 점수 블록 앞에 prepend — standard·heavy의 진단 결합용).00_metrics.json(정량 점수 + route_hint) + 01_input_with_metrics.txt(점수 블록을 원문 앞에 붙인 결합 파일).00_metrics.error를 남긴다. 이 경우 route_hint 없음 → standard 경로.00_metrics.json의 route_hint를 읽어 Phase 0 규칙대로 경로를 확정하고 상태 줄을 출력한다.단일 콜 우선 — 청킹은 여기서 하지 않는다. --chunk는 heavy 경로 전용이며, 그때도 청크 경로를 탈지는 shim이 실제로 청크를 2개 이상 만들었는지로 정한다(heavy 절 참조).
어휘 티가 거의 없고 구조 티만 미미한 글. 목표는 과윤문 방지이지 많이 고치는 게 아니다.
humanize-monolith를 Agent 도구로 1회 호출 — 청킹 없음.input_path=01_input_with_metrics.txt, quick_rules_path=${CLAUDE_SKILL_DIR}/references/quick-rules.md, genre_hint, 그리고 강도 지시 보수(내용 앵커 원형 보존, 원문에 없던 표현 삽입 금지, 확신 없는 구간은 그대로 둔다).final.md (본문 + <!-- HUMANIZE-SUMMARY --> 블록).콜 수: 1 (게이트 실패 시 최대 2).
humanize-diagnostician을 Agent 도구로 1회 호출.input_path=01_input_with_metrics.txt, taxonomy_path=${CLAUDE_SKILL_DIR}/references/diagnosis-rules.md (진단 전용 슬림 인덱스 — 전 패턴 전수, taxonomy에서 자동 생성)02_diagnosis.md — 글 전체의 지배 패턴 3~6개(본진 ID + 근거 + 처방) + 장르·격식 + 보존 지침.python3 ${SKILL_ROOT}/scripts/prepare_monolith_input.py --run-dir _workspace/{run_id} --genre {genre} --diagnosis _workspace/{run_id}/02_diagnosis.md01_input_with_metrics.txt가 [진단 → 정량 블록 → 원문] 순으로 재생성된다.humanize-monolith 1회 호출 — 청킹 없음. 1만자급도 단일 콜이다. → final.md.verify_gates.py의 결정적 게이트가 잡는다. finalize 승급 조건(아래 표)에 걸릴 때만 humanize-finalizer 1콜 추가(이 경우 총 3콜).콜 수: 2 (finalize 승급·게이트 롤백 시 3).
--strict·"정밀 모드"의 강제 대상. 진단→겨냥 윤문→finalize의 완전한 3콜 구조.
Standard의 1과 동일 — humanize-diagnostician 1콜 → 02_diagnosis.md. 장문이라도 진단은 통짜 1콜(전 청크 공유)이다.
--chunk를 함께 줄 수 있다:python3 ${SKILL_ROOT}/scripts/prepare_monolith_input.py --run-dir _workspace/{run_id} --genre {genre} --diagnosis _workspace/{run_id}/02_diagnosis.md --chunk01_chunk_{NN}_input_with_metrics.txt N개 + chunk_manifest.json.chunk_manifest.json의 body 청크(passthrough 제외)가 2개 이상일 때만 청크 경로. 1개면 단일 monolith 콜로 처리한다 — 청킹은 shim의 결정이지 오케스트레이터의 추측이 아니다. 단일 콜로 처리할 때의 입력 파일도 manifest가 있으면 그 청크의 input_file 값을, 없으면 01_input_with_metrics.txt를 쓴다.humanize-monolith 1회 호출(input_path=01_input_with_metrics.txt). monolith는 진단문을 앞머리에서 읽고 지배 패턴을 겨냥해 윤문한다. → final.md.input_file·rewritten_file 필드를 그대로 사용한다 — 파일명을 직접 조립하지 않는다(인덱싱 불일치 사고 방지).quick_rules_path(파일 참조)와 같은 02_diagnosis.md를 공유한다. 룰북·진단 전문을 청크 프롬프트에 복붙하지 않는다 — 재로드 비용이 청킹 토큰 폭발의 주범이었다(§설계 노트).python3 ${SKILL_ROOT}/scripts/reassemble_chunks.py --run-dir _workspace/{run_id} → 03_reassembled.md(passthrough 원문 삽입 + 문자수 대사). 이걸 final.md로 삼는다.--chunk 재실행 시 경계가 바뀌므로 기존 02_chunk_*_rewritten.txt는 shim이 자동 삭제한다(stale_removed). 청킹 후 입력을 수정하면 재청킹부터 다시 한다.Phase 2.5(공통)와 동일 — verify_gates.py --genre {genre}. Bash 1회 — LLM 콜 아님.
humanize-finalizer를 Agent 도구로 1회 호출.
original_path=01_input.txt, rewritten_path=final.md, diagnosis_path=02_diagnosis.mdfinal.md(원본은 final_pre_finalize.md 백업) + 09_finalize.json.verdict=hold_and_report면 사람 검토 안내. 그 외 finalize 후 verify_gates.py를 한 번 더 돌려 최종 변경률 확정.콜 수: 3 (진단 1 + 윤문 1 + finalize 1). 청크 병렬 시 2 + N + 국소 패치.
finalize는 추가 LLM 콜이다. 다음 조건에서만 실행한다:
| 조건 | finalize |
|---|---|
| heavy 경로 | 항상 |
| 변경률 게이트 exit 1(경고 30~50%) | 실행 — 과윤문·의미 드리프트 의심 |
| monolith 자체검증 실패(6항 중 2+ 위반) | 실행 |
| 사용자가 검증·증적을 명시 요청 | 실행 |
| light·standard의 그 외 모든 경우 | 생략 — verify_gates.py 결정적 게이트가 과윤문을 확인 |
진단 파일이 없을 때(Light 승급). Light 경로는 02_diagnosis.md를 만들지 않는다. Light에서 승급 조건에 걸리면 diagnosis_path 없이 humanize-finalizer를 호출한다 — 진단을 만들려고 콜을 추가하지 않는다. finalize의 본체(의미 보존 15항 + 자연성)는 원문↔윤문본 직접 대조로 성립하므로 진단 없이도 온전히 동작하며, 이 경우 도구 호출은 3회로 줄어든다. (Light가 승급하는 상황은 애초에 "예상보다 많이 고쳤다"이므로, 겨냥 대상을 새로 진단하는 것보다 고친 결과를 검증하는 것이 맞다.)
P5는 서법 위반을 판정만 한다. 판정 전에 고칠 수 있는 것은 고쳐 둔다 — 유보·요구가 사라진 문장만 원문 문장으로 되돌리는 결정적 변형이다. LLM 콜 0회.
python3 ${SKILL_ROOT}/scripts/restore_modality.py \
--before _workspace/{run_id}/01_input.txt \
--after _workspace/{run_id}/final.md \
--out _workspace/{run_id}/final.md
python3 ${SKILL_ROOT}/scripts/strip_injected_commas.py \
--before _workspace/{run_id}/01_input.txt \
--after _workspace/{run_id}/final.md \
--out _workspace/{run_id}/final.md두 번째 명령은 C-11 역주입 제거 — 윤문이 새로 쓴 문장에서만 연결어미 뒤 쉼표를 걷어낸다(원문에 있던 문장은 불가침 — 필자 쉼표 보호). light 실측에서 윤문 후 연결어미 쉼표가 원문보다 늘어난 문서가 16/28이었다. LLM 콜 0회.
--all 격상 (standard·heavy 한정): 02_diagnosis.md가 C-11(연결어미 뒤
쉼표)을 탐지 티로 지목한 경우에만 두 번째 명령에 --all을 붙인다 — 전 문장
(따옴표 안 제외)에서 제거해 원문에 실려 온 주입 쉼표(잔존분)까지 걷어낸다.
근거: 사람 532편 실측에서 연결어미 쉼표는 사람 중앙값이 문장의 15%라
밀도만으로는 사람/주입을 못 가른다 — 그래서 격상 조건은 밀도 임계가
아니라 경로+진단 판정이다. 진단이 없는 light 경로에서는 절대 쓰지 않는다.
monolith가 자체 보고한 변경률은 참고값이다. 철칙 #4의 게이트 판정은 코드가 한다.
문자 기반 변경률은 구조 편집에 눈이 없다(실측: change_rate 2.77% 뒤에 문장 터치율 29.7%·대구 -75%가 은닉). verify_gates.py는 문자율에 목표 달성·대구 전멸·golden+수치 3축을 더해 이 사각지대를 보완한다.
윤문본이 나온 직후 Bash로 1회 실행:
python3 ${SKILL_ROOT}/scripts/verify_gates.py \
--before _workspace/{run_id}/01_input.txt \
--after _workspace/{run_id}/final.md \
--genre {genre}exit code로 분기한다 (0/1/2/3 의미는 기존 게이트와 동일):
| exit | 판정 | 후속 |
|---|---|---|
| 0 | 수렴 — 4축 모두 통과 | 결과 전달 진행 |
| 1 | 경고 — 문자율 30~50% / S1 목표 미달·과교정 / 대구 전멸 / golden FAIL | 결과 전달 + 해당 축 고지 + finalize 승급 |
| 2 | 중단 — 문자율 ≥ 50% | 윤문본 채택 금지. monolith에 롤백 지시 후 1회 재실행, 재차 2면 hold_and_report |
| 3 | 판정 불가 | 입력 파일 확인 후 재시도. 게이트를 건너뛰지 않는다 |
<!-- HUMANIZE-SUMMARY --> 블록을 자동 제거하고 비교하므로 별도 전처리 불필요.--ignore-markup으로 본문만 재측정해 교차 확인한다. 판정을 뒤집는 근거로 쓰려면 두 수치를 모두 사용자에게 보고할 것.사용자에게 다음 4개를 반환:
완료. 경로 {light|standard|heavy} / 변경률 X% / 등급 Y / 자체검증 N/6 통과 — 변경률은 게이트 스크립트 출력값을 그대로 쓴다<!-- HUMANIZE-SUMMARY --> 블록의 핵심 표 (메트릭 + 카테고리 탐지 + 자체검증)--strict, 진단→윤문→finalize 3콜)로 재실행" 안내wall-clock 목표: light 12분 / standard 5,000자 23분·1만자 35분(단일 콜) / heavy 58분.
| 사용자 신호 | 처리 |
|---|---|
| "특정 카테고리만 다시" | heavy 경로. 02_diagnosis.md의 지배 패턴을 해당 카테고리로 한정해 P1부터 재실행 |
| "이 문단만" | heavy 경로, 해당 문단만 입력으로 새 run_id 생성 |
"2차 윤문"·"/humanize-redo" | 기존 run_id의 final.md를 새 입력으로 heavy P1부터 재실행 |
| "윤문 강도 조정" | heavy 경로, 진단의 지배 패턴 개수(3~6)를 늘리거나 줄여 재실행 |
| "장르 바꿔서" | genre 변경 후 Phase 1부터 재실행 (경로는 route_hint 재판정) |
장르: 칼럼|리포트|블로그|공적 — 장르 명시 (생략 시 자동 추정)강도: 보수|기본|적극 — 윤문 강도 (기본값: 기본. light 경로는 항상 보수)--strict / 정밀 모드 — heavy 경로 강제 (route_hint 무시)가볍게 / 빠르게만 — light 경로 강제01_input.txt
↓ [scripts/prepare_monolith_input.py — 정량 점수 shim, Bash 1회]
00_metrics.json (route_hint 포함) + 01_input_with_metrics.txt
↓ route_hint (사용자 명시가 오버라이드)
├─ light ──→ [humanize-monolith ×1, 보수] ──→ final.md ──→ [verify_gates.py]
│ (변경률 <5%면 "이미 좋습니다" 조기 종료 보고)
├─ standard → [humanize-diagnostician ×1] → 02_diagnosis.md
│ ↓ [shim --diagnosis, Bash]
│ [humanize-monolith ×1 — 단일 콜, 1만자급 포함] → final.md
│ ↓ [verify_gates.py] (finalize는 승급 조건 시만)
└─ heavy ───→ [humanize-diagnostician ×1] → 02_diagnosis.md
↓ [shim --diagnosis (--chunk 가능), Bash]
[humanize-monolith ×1 — 또는 shim이 2+청크를 쪼갠 경우만 병렬 ×N]
↓ [verify_gates.py]
[humanize-finalizer ×1] → final.md(보정) + 09_finalize.json
↓ [verify_gates.py — 최종 확정]단일 콜 우선 — 근거: 1만자 실측에서 청킹 7콜 610K 토큰 vs 단일 콜 134K, 품질 동등(폭발 원인 = 청크마다 룰북·진단 재로드). 청킹 확대는 이 사고의 재현이다. route_hint 분기 — 근거: 잘 쓴 글에도 최중량 파이프라인을 돌리던 낭비를 차단. 3콜 구조 — 근거: 옛 5인 파이프라인은 span 열거 0↔18 요동 + taxonomy 이중 로드로 wall-clock 54%를 탐지에 소모.
| 경로 | LLM 콜 수 | 대상 | 비고 |
|---|---|---|---|
| light | 1 (게이트 실패 시 2) | 잘 쓴 글 — 어휘 티 0·구조 티 미미 | 진단·finalize 생략, 보수 강도 |
| standard | 2 (승급 시 3) | 보통의 AI 초안 | 진단 + 단일 윤문. 1만자도 단일 콜 |
| heavy | 3 (청킹 시 2+N+1) | 중증 슬롭·초장문·증적 필요 | 완전한 진단→윤문→finalize |
모델: 런타임 3종 모두 model: opus. (모델 선택은 본 스킬의 관할이 아니다 — 오픈소스 사용자가 정한다. v2.2의 절감은 전적으로 콜 수·경로에서 온다.)
에이전트 정의 위치: 저장소 루트 agents/에 9종 정의(플러그인 컨벤션). Claude Code 탐색 경로:
humanize-korean 플러그인이 agents/를 번들로 제공(전역).install.sh가 agents/*.md를 ~/.claude/agents/에 심링크(전역).9종의 내역은 런타임 3 + 유지보수 1 + 개발용 1회성 5이며, 본 스킬 런타임이 호출하는 것은 3종뿐이다.
런타임 3종 (스킬 실행 중 호출)
humanize-monolith — 전 경로 공용 윤문 콜humanize-diagnostician — standard·heavy 진단humanize-finalizer — heavy·승급 시 마무리유지보수 1종 (별도 명령으로만 트리거)
korean-ai-tell-taxonomist — 분류 체계(SSOT) 유지·확장. 본 스킬 실행 중에는 호출되지 않음(개발용 1회성 5종·v2.1 은퇴 5종의 계보와 테스트 시나리오는 ${CLAUDE_SKILL_DIR}/references/design-notes.md 참조.)
${CLAUDE_SKILL_DIR}/references/quick-rules.md — S1·S2 핵심 패턴 + 자체검증 체크리스트${CLAUDE_SKILL_DIR}/references/diagnosis-rules.md — 전 패턴 전수 ID·정의·시그니처. build_diagnosis_rules.py가 taxonomy에서 자동 생성(직접 편집 금지)${SKILL_ROOT}/scripts/prepare_monolith_input.py — ${CLAUDE_SKILL_DIR}/references/metrics_v2.py(실패 시 metrics.py fallback) + ${CLAUDE_SKILL_DIR}/references/baseline.json 기반 사전 점수 + route_hint 산출${SKILL_ROOT}/scripts/sanitize_text.py — shim이 자동 호출(끄려면 --no-sanitize). 제로폭·bidi·특수공백 제거 + 한글 NFD→NFC 정규화를 01_input.txt에 반영해 이후 변경률 게이트·diff·글자수가 같은 기준을 쓰게 한다. 결정적 처리, LLM 0콜. 변경이 있으면 00_sanitize.json 기록. AI 워터마크 제거 기능이 아니다 (CLAUDE.md 「AI 워터마킹에 대한 입장」 참조)${CLAUDE_SKILL_DIR}/references/ai-tell-taxonomy.md — 10대분류 × 85 패턴(활성 84 + A-17 hold) 전수. 런타임 콜은 이 파일을 직접 읽지 않는다${CLAUDE_SKILL_DIR}/references/rewriting-playbook.md — 카테고리별 치환 레시피·장르별 허용 표${CLAUDE_SKILL_DIR}/references/scholarship.md — v2.0 학자 인용·caveat verbatim 보존${CLAUDE_SKILL_DIR}/references/web-service-spec.md — 웹 확장 시 로드© epoko77-ai, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 18 other files (references) in skills/humanize-korean of epoko77-ai/im-not-ai.
Open the folder on GitHubat commit 2f3d943
Korean AI-Text Humanizer next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Korean AI-Text Humanizer this skillepoko77-ai/im-not-ai | 5.9k | — | ~4.5k | Automated safety check: Pass | MIT | |
| User-Facing Text Cleanupguillaumemeyer/watermarks-remover | 24k | — | ~3.5k | Automated safety check: Pass | MIT | |
| Chinese Text Humanizerop7418/Humanizer-zh | 19k | — | ~2k | Automated safety check: Pass | MIT | |
| Natural Japanese Business Writingcoji/natural-japanese | 1.9k | — | ~2.1k | Automated safety check: Pass | MIT | |
| Zero Slop Prose Editoriflytek/skillhub | 5.2k | — | ~1.5k | Automated safety check: Pass | MIT | |
| Web Novel AI-Trace Removerzenstory-ai/oh-story-claudecode | 7.4k | 1 repos | ~2.6k | Automated safety check: Pass | MIT |
guillaumemeyer/watermarks-remover
Audits prose for invisible Unicode characters and rewrites it while keeping facts, citations, code and required disclosures unchanged and the writer's voice intact.
op7418/Humanizer-zh
Edits Chinese articles, comments and documents to remove filler, repetition and template phrasing while keeping the facts, the level of certainty and the author's voice.
coji/natural-japanese
Writes and edits Japanese business documents so they read clearly and naturally, removes AI-sounding phrasing and can score how AI-like a text reads.
iflytek/skillhub
Audits and rewrites formulaic, AI-sounding prose while keeping facts, voice and format, using a local Python scorer and inspect-only, rewrite or embedded-gate modes.
zenstory-ai/oh-story-claudecode
Rewrites AI-sounding Chinese web novel text so it reads naturally, changing as little as possible and keeping plot, names and numbers intact.
smixs/humanizer-ru
Edits Russian text to remove signs of AI generation, bureaucratic phrasing and filler while keeping facts, with a lint script and a detect-only mode.
epoko77-ai/im-not-ai
Diagnoses and rewrites Korean text that reads as AI-generated, fixing translationese and mechanical parallelism across 85 patterns in 10 categories, with light to heavy passes.
epoko77-ai/im-not-ai
Rewrites Korean commit messages that read like office jargon or translation into natural wording, leaving the type, scope and meaning untouched.
epoko77-ai/im-not-ai
Finds the telltale patterns of AI-written Korean text and rewrites style, rhythm and wording so it reads as human, leaving the content unchanged.
epoko77-ai/im-not-ai
Scores how AI-written a Korean text reads by testing six signals, then shows sample before-and-after fixes in the chat without creating files.
epoko77-ai/im-not-ai
Runs Korean text through a humanizing pipeline at a light, standard, or heavy pass depth chosen automatically, then reports what changed and why.
epoko77-ai/im-not-ai
가장 최근 윤문 결과를 2차로 다시 다듬는다 — 특정 카테고리·문단·강도 조정도 가능. An agent skill from epoko77-ai/im-not-ai.
Categories
Rewrites Korean text written by AI so it reads like a human wrote it, detecting translationese and other AI patterns while leaving the content untouched. The skill detects and classifies 85 AI-tell patterns in 10 categories, among them translationese, excess English quotation, mechanical parallelism, idioms, passive overuse, connective overuse, uniform rhythm and too many emojis or bullets, and then rewrites style, rhythm and wording only. Before rewriting it lists the core nouns and concepts of each sentence as anchors and rolls a sentence back if an anchor would disappear.
Korean AI-Text Humanizer fits situations like: removing the AI feel from Korean text written with ChatGPT, Claude or Gemini; fixing translation-style Korean and mechanical sentence patterns; re-running one pattern category or adjusting rewrite intensity.
Run `npx skills add epoko77-ai/im-not-ai --skill humanize-korean -a claude-code`. Or copy the skill folder (skills/humanize-korean in epoko77-ai/im-not-ai) into .claude/skills/humanize-korean in your project. Claude Code loads it when a task matches its description.
Run `npx skills add epoko77-ai/im-not-ai --skill humanize-korean -a codex`. Or copy the skill folder (skills/humanize-korean in epoko77-ai/im-not-ai) into .agents/skills/humanize-korean in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add epoko77-ai/im-not-ai --skill humanize-korean -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/humanize-korean, .gemini/skills/humanize-korean, .github/skills/humanize-korean and .opencode/skills/humanize-korean in your project.
Going by SKILL.md and its folder, Korean AI-Text Humanizer needs Python for the scripts in its folder and the command-line tools its instructions call (python3 and bash). Our summary lists: Python 3, for the shim and verification gates.
SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Korean AI-Text Humanizer is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 4.5k tokens (SKILL.md is roughly 18k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 82k tokens, read only when the agent opens those files.
Skills that share tags, products or a category with Korean AI-Text Humanizer: User-Facing Text Cleanup (guillaumemeyer/watermarks-remover, 24k stars), Chinese Text Humanizer (op7418/Humanizer-zh, 19k stars), Natural Japanese Business Writing (coji/natural-japanese, 1.9k stars) and Zero Slop Prose Editor (iflytek/skillhub, 5.2k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
epoko77-ai (a GitHub user) maintains it in epoko77-ai/im-not-ai, which has 5,909 GitHub stars. The repository holds 7 skills in this directory. The repository was last updated on September 26, 2026.
Source: epoko77-ai/im-not-ai on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.