English:
README.en.md
AI(ChatGPT · Claude · Gemini 등)가 쓴 한글 글을 사실 · 주장 · 수치는 바꾸지 않고 문체 · 리듬 · 표현만 자연스러운 한국어로 되돌리는 CLI 스킬입니다.
번역투, 과도한 영어 인용, 기계적 병렬 ("첫째 · 둘째 · 셋째"), "결론적으로 / 시사하는 바가 크다" 같은 AI 특유 관용구, 피동태 남용, 문두 접속사 남발, 이모지·불릿 남용 등 10대 카테고리 × 85 서브 패턴(+검증 대기 hold 1건 포함)을 심각도(S1/S2/S3)로 분류해 스팬 단위로 탐지한 뒤, 윤문합니다.
Claude Code, GitHub Copilot CLI, OpenAI Codex CLI, Gemini CLI를 지원합니다. 전체 가이드:
INSTALL.md
GitHub Copilot CLI — 플러그인 마켓플레이스 (클론 불필요, 권장)
copilot plugin marketplace add epoko77-ai/im-not-ai
copilot plugin install humanize-korean@im-not-ai
copilot plugin listCopilot에서 humanize-korean 스킬로 이 글의 AI 티를 없애줘:처럼 요청하거나 /skills list로 로드 여부를 확인하세요. 업데이트는 copilot plugin update humanize-korean@im-not-ai, 제거는 copilot plugin uninstall humanize-korean@im-not-ai입니다. Copilot은 단일 호출 경로만 제공하며 Claude Code 전용 진단·finalize 다중 호출 경로는 실행하지 않습니다.
호환성 참고: 1.0.79-5에서는
copilot plugin install epoko77-ai/im-not-ai도 동작하지만, CLI가 저장소 직접 설치의 사용 중단 예정 경고를 표시합니다. 신규 설치 경로로는 권장하지 않습니다.
Claude Code — 플러그인 마켓플레이스 (클론 불필요, 권장)
/plugin marketplace add epoko77-ai/im-not-ai
/plugin install humanize-korean@im-not-ai
새 세션에서 /humanize-korean (또는 자연어로 "이 글 AI 티 없애줘").
Claude Code · Codex CLI — 클론 + 스크립트
git clone https://github.com/epoko77-ai/im-not-ai.git
cd im-not-ai
./install.sh # 설치된 claude/codex 자동 감지 → 전역 심링크- Claude:
/humanize-korean· Codex:$humanize-korean - 한쪽만:
./install.sh --claude-only/--codex-only/--gemini-only· 제거:./uninstall.sh - 업데이트:
./update.sh— 새 버전 자동 감지 후git pull+ 재설치(--check는 감지만). 마켓플레이스 설치는/plugin update. - Codex도 light·standard·heavy 전체 경로를 제공합니다. 협업 에이전트가 있으면 진단·윤문·finalize를 독립 실행하고, 없으면 같은 역할을 순차 실행합니다.
Gemini CLI — 원격 설치 (클론 불필요, Gemini CLI 0.14.0 이상)
gemini extensions install https://github.com/epoko77-ai/im-not-ai.git새 세션에서 /humanize-korean(또는 /humanize). 업데이트는 gemini extensions update im-not-ai, 제거는 gemini extensions uninstall im-not-ai입니다. 클론해 둔 경우 ./install.sh --gemini-only로도 연결됩니다.
Gemini 확장은 별도 룰북을 씁니다.
GEMINI.md에 패턴 47종을 내장한 독립 배포물(확장 버전 1.5.0)이라, 본체 분류 체계(85 서브 패턴)와route_hint3경로·결정적 게이트는 적용되지 않습니다. 자세한 내용:RELEASING.md·INSTALL.md
영어권 humanizer(QuillBot · Hix · Undetectable AI)는 한국어에 약합니다. 한글 AI 글의 티는 대부분 영어 번역투에서 나옵니다.
- "AI 기술을 통해 효율을 높일 수 있다" → "AI로 효율을 높일 수 있다"
- "이에 있어서 중요한 점은" → "여기서 중요한 건"
- "~에 의해 생성된" → "~가 만든"
- "결론적으로, 이는 시사하는 바가 크다" → (삭제)
이 도구는 그 한글 고유 패턴을 SSOT로 정리하고, 글의 상태에 맞는 세 경로(light 1콜 / standard 2콜 / heavy 3+콜) 중 하나로 윤문합니다. 잘 쓴 글일수록 콜 수가 줄어 빠르고 싸게 끝납니다.
- 의미 불변 — 사실 · 주장 · 수치 · 고유명사 · 직접 인용은 100% 원문 보존.
- 근거 기반 — 탐지된 span에만 수술적 수정. 탐지 없는 구간은 건드리지 않음.
- 장르 유지 — 칼럼을 문학으로, 리포트를 에세이로 옮기지 않음.
- 과윤문 금지 — 변경률 30% 초과 시 경고, 50% 초과 시 강제 중단.
입력을 shim(prepare_monolith_input.py)이 먼저 정량 채점하고, 그 점수로 route_hint(light | standard | heavy) 를 결정적으로 산출합니다. 글의 상태가 경로를 정하고, 경로가 콜 수를 정합니다. 절감은 모델 교체가 아니라 콜 수 축소에서 옵니다(모델 선택은 사용자 몫).
| 경로 | LLM 콜 수 | 언제 | 파이프라인 |
|---|---|---|---|
| light | 1 | 잘 쓴 글 — 어휘 티가 거의 0 | 진단·finalize 생략, 보수 강도 단일 윤문. 손댈 게 거의 없으면 "이미 좋습니다"로 조기 종료 |
| standard | 2 | 보통의 AI 초안 — 어휘·구조 티 섞임 | 진단 1콜 + 겨냥 윤문 1콜. 1만자급도 청킹 없이 단일 윤문 콜 |
| heavy | 3+ | 중증 AI 슬롭 밀집 or 초장문(15,000자 초과) or 검증 증적 필요 | 진단 → 윤문(shim이 청크를 2개 이상 만든 경우에만 청크 병렬) → finalize |
입력 텍스트
↓
[prepare_monolith_input.py] ── 정량 사전 점수 (KatFish·post-editese 지표) + route_hint 산출
↓ 실패 시 점수 없이 standard로 자동 진행 (graceful degrade)
├─ light ────→ [humanize-monolith ×1] ────────────────────────────→ final.md
├─ standard ─→ [humanize-diagnostician] → [monolith 겨냥 윤문] ───→ final.md
└─ heavy ────→ [diagnostician] → [monolith(필요시 청크 병렬)] → [humanize-finalizer]
↓
[verify_gates.py] ── 문자율·목표달성·대구 전멸·golden/수치 검증 — 모든 경로 공통
- 사용자 명시가 route_hint를 오버라이드합니다:
--strict·"정밀 모드" → heavy 고정, "가볍게" → light 고정. - 단일 콜 우선: 청킹은 heavy 전용이며 15,000자 이하는 비권장. 실측으로 1만자 글을 청킹 7콜로 돌리면 610K 토큰, 단일 콜이면 134K(4.5배 절감, 품질 동등)였습니다 — 청크마다 룰북·진단을 재로드하는 비용이 절감분을 다 먹기 때문입니다.
- 이번 개선의 핵심 가치: 잘 쓴 글은 1콜로 싸게 끝납니다. 어휘 티 없는 글에 최중량 파이프라인을 돌리던 낭비를 route_hint가 차단합니다.
verify_change_rate.py는 기존 연동을 위한 하위 호환 도구로 보존하며, 최종 판정의 SSOT는verify_gates.py입니다.
윤문 런타임 역할 3개와 별도 유지보수 역할 1개가 있습니다.
| 에이전트 | 경로 | 역할 |
|---|---|---|
humanize-monolith |
전 경로 공용 | 단일 호출 윤문 (탐지·윤문·자체검증 일괄, 도구 호출 3회 캡) |
humanize-diagnostician |
standard·heavy | 글 전체의 지배 패턴 3~6개 진단, taxonomy ID + 처방 |
humanize-finalizer |
heavy | 원문 직접 대조로 의미 보존 15항 + 자연성 판정, 국소 보정 |
korean-ai-tell-taxonomist |
별도 명령 | 분류 체계(SSOT) 관리, 신규 패턴 심사 승격 |
이 외에 agents/에는 릴리스 회차 전용 개발 도구 5개(translationese-research-distiller · korean-translation-scholar · taxonomy-gap-analyzer · post-editese-metric-engineer · quick-rules-integrator — v2.0 학술 흡수 작업용, 윤문 실행과 무관)가 함께 들어 있습니다.
Claude Code는 루트 agents/ 정의를 호출합니다. Codex는 같은 런타임 역할을 references/roles/{diagnostician,monolith,finalizer}.md 계약으로 실행합니다. 협업 에이전트를 사용할 수 있으면 역할별 독립 컨텍스트로 실행하고, 사용할 수 없으면 주 에이전트가 같은 계약을 순차 실행합니다.
옛 strict 5인 파이프라인의 ai-tell-detector · korean-style-rewriter · content-fidelity-auditor · naturalness-reviewer와 웹 확장 설계용 humanize-web-architect는 v2.1에서 은퇴했습니다(아래 v2.1 릴리스 노트 참조).
| ID | 대분류 | 대표 서브 패턴 |
|---|---|---|
| A | 번역투 | "~를 통해", "~에 대해", "~에 있어서", 이중 피동 "~되어진다", "가지고 있다", "그/그녀" 강박적 사용 (A-16), 관계절 좌향 수식 (A-18), "~에서의/~에로의" 이중 조사 (A-19) |
| B | 영어 인용·용어 과다 | 과도한 괄호 병기, 번역 가능한 영어 그대로 |
| C | 구조적 AI 패턴 | 기계적 "첫째/둘째/셋째", 과도한 불릿·헤딩·이모지, 연결어미 뒤 쉼표 (C-11) |
| D | AI 특유 관용구 | "결론적으로", "시사하는 바가 크다", "주목할 만하다", "혁신적인" |
| E | 리듬 균일성 | 문장 길이 표준편차 낮음, 동일 종결어미 반복, 청자 경어법 일관성 손실 (E-7) |
| F | 수식·중복 | "매우", "정말", 동의어 이중 수식, "~적/~성/~화/-tion/-ment" 남발 |
| G | Hedging 남용 | "~할 수 있을 것으로 보인다" 다중 완곡 |
| H | 접속사 남발 | 문두 "또한/따라서/즉/나아가" 연속 |
| I | 형식명사 과다 | "것이다", "점", "수", "바", "~할 필요가 있다" |
| J | 시각 장식 남용 | 과도한 볼드, "따옴표", 대시(—) 남발 |
전체 85 서브 패턴(hold 1건 포함)과 처방: ai-tell-taxonomy.md · rewriting-playbook.md · 학술 인용 외부 SSOT: scholarship.md (v2.0 신규)
심각도
- S1 결정적: 한 번만 나와도 강한 AI 신호. 윤문 시 우선 제거. 단, 단일 패턴·단일 지표만으로 AI 작성 여부를 판정하지는 않습니다(#110).
- S2 강함: 1~2회 허용, 3회+ 반복 시 제거.
- S3 약함: 다른 패턴과 중첩될 때만 문제.
품질 등급 (윤문 후)
- A: S1 0건, S2 ≤2건, 점수 개선 70%+
- B: S1 0건, S2 ≤4건, 개선 50%+
- C: S1 1~2건 or 과윤문 시그널 2개 → 2차 윤문
- D: S1 3건+ or 심각한 과윤문 → 사람 검토
전역 설치(설치)를 마쳤다면 1~2단계(클론·폴더 진입)는 건너뛰고, 아무 폴더에서나 바로 3단계로 가세요. 아래는 설치 없이 리포에서 곧바로 체험하는 흐름입니다.
사용할 런타임을 하나 이상 설치합니다. Mac · Windows · Linux에서 사용할 수 있습니다.
# Claude Code
claude --version
# 또는 Codex CLI 0.121.0 이상
codex --version웹 버전 Claude.ai나 일반 ChatGPT가 아니라, 파일·셸·에이전트 기능을 제공하는 CLI에서 실행합니다. 아래 1~6단계는 Claude Code와 Codex 기준입니다. GitHub Copilot CLI는 방법 D, Gemini CLI는 설치 섹션을 참고하세요.
git clone https://github.com/epoko77-ai/im-not-ai.git
cd im-not-aiclaude --plugin-dir .
# 또는
codex전역 설치를 했다면 아무 폴더에서나 Claude Code의
/humanize-korean또는 Codex의$humanize-korean을 사용할 수 있습니다(설치 참고). 설치 없이 Claude Code로 체험만 하려면 방금 클론한im-not-ai폴더 안에서 실행하세요. Codex는./install.sh --codex-only로 스킬을 먼저 연결합니다.
Claude Code 사용자는 방법 A~C를, GitHub Copilot CLI 사용자는 방법 D를, Codex 사용자는 방법 E를 참고하세요.
방법 A — 자연어 한 문장 (가장 쉬움)
평소 말투 그대로 쓰면 됩니다:
이 AI 글 자연스럽게 윤문해줘:
[ChatGPT / Claude / Gemini 초안 여기에 붙여넣기]
아래 표현 중 아무거나 쓰면 스킬이 자동 발동합니다:
- "AI 티 없애줘"
- "GPT 문체 제거해줘"
- "사람이 쓴 것처럼 윤문해줘"
- "번역투 제거"
- "한글 AI 윤문"
방법 B — 슬래시 커맨드 (v1.2~)
/humanize [윤문할 텍스트 또는 파일 경로]
옵션을 인자 끝에 자연어로 적을 수 있습니다: 장르: 칼럼, 강도: 적극, 최소심각도: S1. 결과가 마음에 안 들면 /humanize-redo "번역투만 다시" 같은 식으로 재실행. 진입점은 스킬입니다: humanize · humanize-scan · humanize-redo
전수 윤문을 돌릴 값어치가 있는지 먼저 보고 싶으면 /humanize-scan입니다. 워크스페이스·진단·게이트 없이 이 대화 안에서 끝나고, 실측 판별력이 모델·과업을 바꿔도 살아남은 AI 티 6개(C-8 대구 12배 · E-1 장문 결핍 · C-11 연결어미 쉼표 · I-4 당위 · E-2 종결 편중 · F-5 추상 체인)를 실제로 고쳐 본 전후 수치와 바뀐 문장 표본을 돌려줍니다. 손볼 게 많다고 나오면 전문 대신 /humanize를 권합니다 — 6개만 본 결과를 완성본으로 쓰게 두지 않기 위해서입니다.
방법 C — Plugin / 마켓플레이스 (공식)
본체가 이제 Claude Code Plugin/Marketplace를 공식 지원합니다. 클론 없이 마켓플레이스로 설치하세요:
/plugin marketplace add epoko77-ai/im-not-ai
/plugin install humanize-korean@im-not-ai
스킬 3개 + 서브에이전트 9개가 함께 설치됩니다. 자세한 옵션·스크립트 설치는 설치 섹션과 INSTALL.md 참고. (초기 패키징을 탐색한 gaebalai/im-not-ai 포크도 있습니다.)
방법 D — GitHub Copilot CLI (공식, 단일 호출 경로)
GitHub Copilot CLI 1.0.79-5에서 마켓플레이스 설치와 스킬 탐색을 확인했습니다.
copilot plugin marketplace add epoko77-ai/im-not-ai
copilot plugin install humanize-korean@im-not-ai
copilot plugin list
copilot skill list새 Copilot 세션에서 humanize-korean 스킬로 이 글을 자연스럽게 윤문해줘: 또는 이 글 AI 티 없애줘:처럼 요청합니다. /skills list에서도 스킬을 확인할 수 있습니다. 업데이트는 copilot plugin update humanize-korean@im-not-ai, 제거는 copilot plugin uninstall humanize-korean@im-not-ai을 사용하세요.
Copilot은 별도의 단일 호출 경로를 사용합니다. Claude Code와 Codex가 제공하는 route_hint 3경로 오케스트레이션과 진단·finalize 역할 실행은 Copilot에서 수행하지 않습니다.
저장소 직접 설치 명령
copilot plugin install epoko77-ai/im-not-ai은 1.0.79-5에서 동작하지만 사용 중단 예정 경고가 표시되는 호환성 경로입니다.
방법 E — Codex CLI (공식, 전체 경로)
본체가 이제 Codex CLI Skills를 공식 지원합니다. 리포 클론 후 한 줄이면 ~/.codex/skills/에 연결됩니다:
git clone https://github.com/epoko77-ai/im-not-ai.git && cd im-not-ai
./install.sh --codex-onlyCodex에서 $humanize-korean으로 발동합니다(또는 /skills 메뉴). route_hint가 light·standard·heavy를 선택하며 --strict로 heavy를 강제할 수 있습니다. Codex 협업 에이전트가 있으면 진단·윤문·finalize와 장문 청크를 역할별로 실행합니다.
$humanize-korean을 사용해 이 글의 AI 티를 없애줘.
[윤문할 한글 텍스트]
진단→윤문→finalize 전체 경로를 강제하려면:
$humanize-korean을 사용해 이 글을 --strict 정밀 모드로 윤문해줘.
[윤문할 한글 텍스트]
산출물은 Codex를 시작한 디렉터리의 _workspace/{실행날짜-번호}/에 저장됩니다. 별도 환경에서 시험하려면 임시 디렉터리에서 Codex를 시작하세요.
방법 F — Web UI (비공식)
opencode 로 윤문하는 커뮤니티 제작 포트입니다.
공식 지원 런타임은 Claude Code · GitHub Copilot CLI · Codex · Gemini CLI 네 가지입니다. 저희가 라이브로 검증할 수 있는 범위를 넘어서면 "공식 지원" 을 표기하지 않는다는 정책이라, 그 밖의 런타임은 커뮤니티 포트로 안내합니다.
| 포트 | 런타임 | 제작 |
|---|---|---|
Squirbie/im-not-ai-codex |
Codex Desktop 어댑터 | @Squirbie |
| im-not-ai-ocx | opencode Web UI | 커뮤니티 |
포트를 만드셨다면 Issue 로 알려주세요 — 확인 후 이 표에 추가합니다. 본체를 건드리지 않는 격리 설계와, 룰북 사본이 본진과 어긋나면 깨지는 드리프트 검사를 갖추는 것을 권장합니다(PR #61 이 좋은 참고입니다).
정량 사전 채점이 산출한 route_hint에 따라 세 경로 중 하나로 처리합니다(사용자 명시가 오버라이드).
light (1콜 · 잘 쓴 글 · 1~2분) — 진단·finalize 없이 humanize-monolith 한 콜이 보수 강도로 윤문합니다. 손댈 게 거의 없으면 "이미 좋습니다"와 손댄 곳 요약으로 조기 종료합니다.
standard (2콜 · 보통의 AI 초안 · 2~5분) — 진단 1콜이 지배 패턴을 짚고, 겨냥 윤문 1콜이 처리합니다. 1만자급도 청킹 없이 단일 윤문 콜입니다.
산출물은 _workspace/{실행날짜-번호}/에:
| 파일 | 내용 |
|---|---|
01_input.txt |
원문 그대로 |
00_metrics.json · 01_input_with_metrics.txt |
정량 사전 점수 + route_hint + 점수 블록을 원문 앞에 붙인 결합 입력 (점수 계산 실패 시 standard로 자동 진행) |
02_diagnosis.md |
(standard·heavy) 지배 패턴 3~6개 진단 (taxonomy ID · 근거 · 처방 · 장르/격식) |
final.md |
윤문본 + 본문 끝 <!-- HUMANIZE-SUMMARY --> 주석 블록(메트릭·카테고리 탐지 before/after·자체검증 6항·등급·주요 변경 하이라이트). HTML 주석이라 마크다운 뷰어·웹 게시·복사 시 본문에만 노출 |
heavy (3+콜 · 중증 슬롭·초장문·증적 필요 · --strict로 강제 가능 · 5~8분) — 진단 → 윤문(shim이 청크를 2개 이상 만든 경우에만 청크 병렬) → finalize. 위 산출물에 더해:
| 파일 | 내용 |
|---|---|
chunk_manifest.json |
heavy 청킹 경계·입출력 파일명·원문 해시. body 청크가 하나여도 재조립 계약에 사용 |
00_chunk_*_metrics.json · 01_chunk_*_input_with_metrics.txt |
청크별 점수와 결합 입력 |
02_chunk_*_rewritten.txt |
청크별 윤문 결과. body 청크가 2개 이상이면 가능한 범위에서 병렬 실행 |
03_reassembled.md · 03_reassembly_report.json |
passthrough 복원·문자 수 대사를 거친 재조립본과 검증 리포트 |
final_pre_finalize.md |
finalize 보정 전 윤문본 백업 |
09_finalize.json |
의미 보존 15항 + 자연성 판정 결과 |
Heavy는 body 청크가 하나여도 재조립 단계를 생략하지 않습니다. 이를 통해 passthrough 블록과 문자 수 대사를 동일한 방식으로 검증합니다.
부분 재실행("이 카테고리만 다시"·"2차 윤문")은 heavy 경로로 자동 전환됩니다.
| 런타임 | Light | Standard | Heavy | 청킹 | 구조 게이트 | 후속 재실행 |
|---|---|---|---|---|---|---|
| Claude Code | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| GitHub Copilot CLI | ✅ | — | — | — | 자체검증 | 제한적 |
| Codex | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| Gemini CLI | ✅ | — | — | — | 자체검증 | 제한적 |
Codex 포트는 결정적 회귀, 패키지·독립 복사 설치, light/heavy 독립 전방 테스트를 통과했습니다. 현재 검증 항목과 재현 방법은 tests/test_codex_package.py와 INSTALL.md를 참고하세요.
그대로 말씀하시면 됩니다. 재실행·수정 명령을 따로 외울 필요 없습니다:
- "이 문단만 다시 윤문해줘" — 해당 구간만 재시도
- "번역투만 더 손봐줘" (또는 "관용구만 다시") — 특정 카테고리만 재처리
- "윤문 강도 낮춰줘" — 보수적 윤문 (결정적 패턴만 제거)
- "원문 톤을 더 살려줘" — 변경률 상한을 낮춰 원문 유지
- "2차 윤문해줘" — 현재 결과를 한 번 더 다듬기
Claude Code 세션 안에서 새 글을 붙여넣고 똑같이 부탁하면 됩니다. 실행마다 새 _workspace/{날짜-번호}/ 폴더가 만들어져 이전 결과와 섞이지 않습니다.
- 수치 · 단위 · 날짜
- 고유명사 · 인명 · 제품명 · 모델명
- 큰따옴표 내부 직접 인용
- 법률 · 규정 조문
- 학술 개념어 (불가피한 경우)
같은 저장소에 함께 있지만 humanize-korean과는 독립된 별도 스킬입니다. AI가 제안한 한글 커밋 메시지 1~2줄의 사무적·번역투 어휘("~을 수행함"·"~을 진행함")만 걷어냅니다. 진단·청킹 없이 단일 콜로 즉시 처리합니다.
커밋 메시지 자연스럽게: fix(auth): 로그인 실패 시 재시도 로직을 수행함
→ fix(auth): 로그인 실패 시 재시도 로직 추가 (type/scope 접두사, 이슈 번호, 파일·함수명은 그대로 보존)
기본 플러그인·install.sh 범위 밖이라 별도 설치가 필요합니다: ./install.sh --extras (자세한 내용은 INSTALL.md). 스킬 정의: extras/skills/commit-ko/SKILL.md
웹 버전은 별도 코드베이스로 운영 중입니다. 본 리포의 설계 문서 web-service-spec.md는 산출물로 보존합니다 (설계 담당이던 humanize-web-architect 에이전트는 v2.1에서 은퇴).
데이터 품질 기업 Pebblous가 본 프로젝트의 공개 코드를 분해 리뷰했습니다(기술 블로그, 2026-08-20). 인용 변조·수치 누락 포착과 과윤문 차단이 정상 동작함을 확인해 준 한편, 재현 가능한 반례 하나를 제시했습니다: 2020년(pre-ChatGPT) 사람 에세이가 위험도 6/6 최고 판정 — 필자의 개인 쉼표 습관(연결어미 뒤 쉼표율 83.3%)이 C-11 단일 계열의 z-점수를 폭주시킨 오판이었습니다.
지적을 재현·확장 검증한 결과, 1편짜리 반례가 아니라 시스템 결함이었습니다. 클린 사람 코퍼스 532편(칼럼 11·위키 설명문 521) 실측:
| 판정기 | 사람 글 high 오판 | medium | low |
|---|---|---|---|
| 수정 전 | 285편 (53.6%) | 171 | 76 |
| 계열 상한 + 독립 2계열 요건 (#119) | 0 | 4 | 528 |
| + column·report 장르 셀 (#121) | 0 | 0 | 532 (100%) |
3단계로 반영했습니다 (지적 접수 → 반영 완료까지의 기록은 각 PR 참조):
- 오탐 방지 원칙 (#110) — 단일 지표 비증거·단독 판정 금지·개인 편차 캐비엇·판정 3인+ICC를 분류 체계에 명문화
- 판정기 수정 (#119) — 쉼표 계열 기여 상한 + high는 독립 계열 2개 이상 동시 발화 시에만
- 장르 베이스라인 확장 (#121) — 근본 원인은 column/report 장르가 essay(KatFish) 셀로 폴백되던 구멍. 실측 인간 극으로 두 셀을 추가하고, 인간 실측이 AI 극을 역전한 지표(ending_comma_rate 등)는 해당 장르에서 비활성
재실측이 셀 산출 코퍼스와 같은 in-sample이라는 한계는 남습니다 — out-of-sample 검증은 다음 코퍼스 라운드에서 수행합니다. 공개 코드에 대한 재현 가능한 외부 반례는 이 프로젝트가 가장 빨리 좋아지는 경로입니다. 이런 리뷰는 언제든 환영합니다.
마켓플레이스·플러그인으로 설치하셨다면 업데이트를 권합니다. 스킬은 로드됐지만 내부에서 두 층이 조용히 빠지고 있었습니다.
플러그인 로더는 스킬을 플러그인 루트 skills/ 에서 기본 스캔합니다. 그런데 이 저장소는 .claude/skills/ 에 두고 plugin.json 의 skills 필드로 가리키고 있었습니다.
스펙에 예외가 있습니다 — marketplace 항목의 source 가 마켓플레이스 루트로 풀리면, 선언한 디렉터리가 기본 skills/ 스캔을 대체합니다. 우리 source 는 "./" 라 정확히 그 경우였고, 관례 위치는 비어 있었습니다.
결과가 로더마다 갈렸습니다.
| 환경 | 이전 |
|---|---|
| CLI 심링크 설치 | 정상 |
| CLI 마켓플레이스 설치 | 로드는 됐지만 정량 shim·진단이 조용히 누락 |
| 관례 위치만 스캔하는 로더(Cowork 등) | 스킬 자체를 못 찾음 |
두 번째가 특히 문제였습니다. route_hint 와 철칙 #4 게이트가 사라진 채로도 결과물은 정상적으로 나오기 때문에 품질이 떨어진 것을 알아채기 어려웠습니다.
- 스킬 3종을
.claude/skills/→skills/(관례 위치)로 이동.plugin.json의skills필드 제거 — 루트skills/는 기본 스캔 대상이라 선언이 불필요하고, 선언하면 오히려 예외 조항에 걸립니다. ${SKILL_ROOT}유도를 깊이 비의존으로..claude-plugin/마커를 만날 때까지 거슬러 올라갑니다. 고정 횟수(cd ../../..)는 레이아웃이 바뀌면 조용히 엉뚱한 곳을 가리킵니다.- 끊어져 있던
codex/skills/.../references심링크 복구.
에이전트는 같은 이유로 이미 루트 agents/ 에 있었습니다(#26). 스킬만 남아 있었던 것입니다.
# 플러그인
/plugin update humanize-korean
# 스크립트 설치
./update.sh # 또는 ./install.sh.claude/skills/ 가 사라졌기 때문입니다. ./install.sh 를 다시 돌리면 복구됩니다.
pytest236 passed (레이아웃 회귀 4건 신설 — 구 위치 부활 금지,skills필드 재도입 금지, 고정 깊이 유도 금지)claude plugin validate .통과- 격리 환경 설치 실측 ·
${SKILL_ROOT}유도 4종(저장소 직접·심링크·깊이 2·깊이 3) 검증
제보해주신 분들 덕에 잡혔습니다. 세 건 모두 실제로 설치해 쓴 분들에게서 왔고, 저장소 안에서만 테스트하면 원리적으로 보이지 않는 것들이었습니다.
외부 제보로 드러난 실행 불가 경로를 고친 패치 회차입니다. 기능·분류 체계 변경은 없습니다.
-
--run-dir상대경로가 cwd 가 아닌 저장소 루트 기준으로 해석되던 문제 (#71, @bukbuk82-alt). SKILL.md 는 "모든 경로는 cwd 기준"이라 지시하는데 스크립트는 반대로 동작해, 심링크로 설치해 작업 디렉터리에서 스킬을 부르면 첫 실행부터 항상 실패했습니다. 저장소 루트에서 돌리면cwd == PROJECT_ROOT라 내부에서는 드러나지 않던 버그입니다.--diagnosis도 같은 기준으로 통일했고, 실패할 때마다 빈_workspace/{run_id}/가 쌓이던 부작용도 제거했습니다. -
프로덕션 게이트가
tests/를 런타임 import 하던 경계 위반 (#59, @andrea9292).verify_gates.py가tests/golden/checks.py를 불러 쓰고 있어, 런타임 파일만 선별 배포하면 P3 golden 축이 통째로 죽었습니다.checks.py는 이름만 tests 아래 있었을 뿐 전부 프로덕션 검사 로직이라scripts/로 옮겼습니다. -
Light 경로 finalize 승급이 실행 불가하던 계약 공백 (#54, @andrea9292). Light 는
02_diagnosis.md를 만들지 않는데 finalizer 가 그 파일을 필수로 요구했습니다.diagnosis_path를 선택으로 바꾸고, 진단 콜을 추가하지 않는 쪽을 의도로 명문화했습니다 — finalize 본체(의미 보존 15항 + 자연성)는 원문↔윤문본 직접 대조로 성립합니다. -
내용 앵커 유실 (#74, @ruddyscent). 윤문 콜이 편집 전에 문장별 핵심 내용 명사를 기록하고, 앵커가 사라지는 edit 은 즉시 롤백하는
anchor_ledger계약을 배포 경로 5곳에 적용했습니다. 실측(opus-5 ×fx_guard_overedit, 계약 적용 전후 각 11 run): 보호 어휘 유실 2회 → 0회. -
전역 설치 범위 한정 (#70, @penta505) — 스킬이 실제로 쓰는 런타임 4종만 설치(
--all-agents로 전체). 구버전 설치본 자동 정리(#73, 원안 @yswyang0228) — 재실행 시 범위 밖·은퇴 dangling 링크를 해제합니다. 소유권은 심링크 대상으로만 판별해 사용자 파일·타 도구 링크는 건드리지 않습니다.<





