From humanize-korean
Rewrites Korean text to remove AI-generated patterns (translationese, excessive English quotes, mechanical parallelism, passive voice, uniform rhythm, emoji/bullet overuse) across 70 patterns in 10 categories. Preserves content while adjusting style, rhythm, and expression. Supports light/standard/heavy processing paths.
How this skill is triggered — by the user, by Claude, or both
Slash command
/humanize-korean:humanize-koreanThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
> **v2.3.0** — 구조 수렴 게이트(`verify_gates.py` 4축: 목표달성·대구 전멸·수치·golden) + 진단 슬림 인덱스(`diagnosis-rules.md`, taxonomy 83%↓). (v2.2: route_hint 3경로 + 단일 콜 우선)
v2.3.0 — 구조 수렴 게이트(
verify_gates.py4축: 목표달성·대구 전멸·수치·golden) + 진단 슬림 인덱스(diagnosis-rules.md, taxonomy 83%↓). (v2.2: route_hint 3경로 + 단일 콜 우선) 버전 히스토리·실측 근거·테스트 시나리오:references/design-notes.md
작업 시작 시 가장 먼저 다음 한 줄을 사용자에게 출력한다.
humanize-korean v2.3 — 경로: {light|standard|heavy} ({route_hint|사용자 지정}) / run_id: {YYYY-MM-DD-NNN}
(경로는 Phase 1의 shim 실행 후에 확정되므로, 이 상태 줄은 shim 직후 출력한다.)
--strict·"정밀 모드"·"정밀하게"·"제대로" → heavy 고정. "가볍게"·"빠르게만" → light 고정. 명시가 있으면 route_hint는 무시한다.00_metrics.json에 쓴 route_hint(light|standard|heavy)를 디폴트 경로로 따른다.route_hint 필드가 없거나 shim이 graceful degrade로 점수 산출에 실패한 경우 → standard로 간주._workspace/{YYYY-MM-DD-NNN}/에 만든다.Glob 도구로 표지 파일을 매칭해 간접 조회.
올바른 사용법: Glob(pattern="_workspace/YYYY-MM-DD-*/01_input.txt") → 결과에서 폴더명 추출 후 NNN 최댓값 + 1.
주의: Glob은 디렉토리 자체는 매칭하지 못한다. 반드시 그 안의 표지 파일(01_input.txt)을 매칭할 것.
Bash ls는 OS·셸 환경에 따라 경로 해석이 달라지므로 사용 금지._workspace/{run_id}/ 생성01_input.txt에 저장python3 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는 프로젝트 루트 기준 상대 경로 허용 (스크립트가 절대화). 그 외 인자: --text(run-dir 없이 즉석 실행 시 새 run 디렉토리 자동 생성), --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=references/diagnosis-rules.md (진단 전용 슬림 인덱스 — 71패턴 전수, taxonomy에서 자동 생성)02_diagnosis.md — 글 전체의 지배 패턴 3~6개(본진 ID + 근거 + 처방) + 장르·격식 + 보존 지침.python3 scripts/prepare_monolith_input.py --run-dir _workspace/{run_id} --genre {genre} --diagnosis _workspace/{run_id}/02_diagnosis.md
→ 01_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 scripts/prepare_monolith_input.py --run-dir _workspace/{run_id} --genre {genre} --diagnosis _workspace/{run_id}/02_diagnosis.md --chunk
01_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 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 결정적 게이트가 과윤문을 확인 |
monolith가 자체 보고한 변경률은 참고값이다. 철칙 #4의 게이트 판정은 코드가 한다.
문자 기반 변경률은 구조 편집에 눈이 없다(실측: change_rate 2.77% 뒤에 문장 터치율 29.7%·대구 -75%가 은닉). verify_gates.py는 문자율에 목표 달성·대구 전멸·golden+수치 3축을 더해 이 사각지대를 보완한다.
윤문본이 나온 직후 Bash로 1회 실행:
python3 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/에 12종 정의(플러그인 컨벤션). Claude Code 탐색 경로:
humanize-korean 플러그인이 agents/를 번들로 제공(전역).install.sh가 agents/*.md를 ~/.claude/agents/에 심링크(전역)..claude/agents/에는 총 10개 정의가 있으나, 본 스킬 런타임이 호출하는 것은 3종뿐이다.
런타임 3종 (스킬 실행 중 호출)
humanize-monolith — 전 경로 공용 윤문 콜humanize-diagnostician — standard·heavy 진단humanize-finalizer — heavy·승급 시 마무리유지보수 1종 (별도 명령으로만 트리거)
korean-ai-tell-taxonomist — 분류 체계(SSOT) 유지·확장. 본 스킬 실행 중에는 호출되지 않음(개발용 1회성 5종·v2.1 은퇴 5종의 계보와 테스트 시나리오는 references/design-notes.md 참조.)
references/quick-rules.md — S1·S2 핵심 패턴 + 자체검증 체크리스트references/diagnosis-rules.md — 71패턴 전수 ID·정의·시그니처. build_diagnosis_rules.py가 taxonomy에서 자동 생성(직접 편집 금지)scripts/prepare_monolith_input.py — references/metrics_v2.py(실패 시 metrics.py fallback) + references/baseline.json 기반 사전 점수 + route_hint 산출references/ai-tell-taxonomy.md — 10대분류 × 활성 70 패턴 (+A-17 hold 1건) 전수. 런타임 콜은 이 파일을 직접 읽지 않는다references/rewriting-playbook.md — 카테고리별 치환 레시피·장르별 허용 표references/scholarship.md — v2.0 학자 인용·caveat verbatim 보존references/web-service-spec.md — 웹 확장 시 로드npx claudepluginhub epoko77-ai/im-not-ai --plugin humanize-koreanRewrites AI-generated Korean text (ChatGPT, Claude, Gemini) to sound more human. Detects 40+ AI tell patterns and naturalizes style without altering content.
Detects and removes AI-typical patterns from Korean text (translationese, set phrases, structural AI markers) to produce natural human-sounding prose. Supports fast and strict multi-stage pipeline.
Polishes AI-generated Korean text to remove AI tell. Invoked via /humanize with fast mode or strict 3-pass mode, supporting genre, intensity, and severity options.