k-skill/korean-humanizer/references/ai-tell-taxonomy.md
Jeffrey (Dongkyu) Kim 66f12cb43d
dev → main: srt-booking 좌석 탐색, korean-humanizer 신규 스킬, toss-securities 공식 OpenAPI 클라이언트, korean-law k-skill-proxy 편입 (#314)
* feat(srt-booking): SRT 좌석 확인과 탐색 우선순위 개선 (#305)

* feat(srt): 좌석 조회와 탐색 우선순위 추가

SRT search 결과의 stable train_id로 객차별 좌석을 조회하고, 특정 호차/좌석 확인과 탐색 우선순위 옵션을 제공한다.

Constraint: SRT와 KTX는 별도 upstream 표면이므로 SRT HTML 파서와 테스트를 분리함
Rejected: KTX 좌석 helper 공유 | Korail API와 SRT 웹 좌석선택 HTML 계약이 달라 혼용하면 파서 안정성이 낮아짐
Confidence: medium
Scope-risk: moderate
Directive: SRT 좌석선택 HTML에서 노출되지 않는 속성은 추정하지 말고 명시적으로 처리할 것
Tested: PYTHONPATH=.:scripts python3 -m unittest scripts.test_srt_booking scripts.test_ktx_booking; python3 -m py_compile scripts/srt_booking.py scripts/srt_seats.py scripts/test_srt_booking.py
Not-tested: 실제 예약 API에 우선순위 좌석 선택을 연결하는 흐름

* fix(srt): 좌석 조회 JSON 출력 안정화

SRT 대기열 메시지가 stdout에 섞여 seats JSON을 깨는 실제 표면 문제를 막고, 누락된 좌석 방향/위치 속성을 unknown으로 정규화한다.

Constraint: issue #303 범위는 예약 부작용이 없는 좌석 조회 보조 흐름으로 제한됨
Rejected: 실제 예약 subcommand 추가 | 좌석 선점/예약은 외부 부작용이라 이번 acceptance criteria에 포함되지 않음
Confidence: high
Scope-risk: narrow
Directive: SRTrain upstream 출력이 추가되더라도 helper stdout은 JSON 전용으로 유지할 것
Tested: RED→GREEN in .omo/ulw-loop/evidence/srt-c002-red-green-tests.txt; live SRT tmux QA in .omo/ulw-loop/evidence/srt-c001-live-search-seats.txt; npm run ci in .omo/ulw-loop/evidence/srt-c003-regression-ci.txt
Not-tested: 실제 예약/결제/취소 부작용 흐름

* test(srt): split seat helper regression coverage

---------

Co-authored-by: Jeffrey (Dongkyu) Kim <vkehfdl1@gmail.com>

* feat: add korean-humanizer skill

AI가 쓴 티가 나는 한국어 글을 자연스러운 사람 글로 고치는 프롬프트 기반 스킬.
blader/humanizer의 구조·방법론(패턴 카탈로그 + draft→audit→final 루프 +
false positive 가이드)을 한국어에 맞게 재구성했다.

- 한국어 특화 33개 패턴: 번역체(직역 조사·무생물 주어·"~들"·"가지다"·이중피동·
  명사화), AI 상투어, 3의 법칙, 과장된 의의 부여, 마무리 상투구, 챗봇 잔재,
  줄표·가운뎃점·곡선따옴표 등
- Triage(최소 개입) 원칙: 서식만 문제면 산문은 그대로 두어 과교정 방지
- Length control: 목표 글자수 지정 시 ±5% 내로 맞추고 공백 포함/제외 수치 보고,
  korean-character-count 스킬과 연동

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* feat(korean-humanizer): rebuild v2 on im-not-ai framework

Build on happy-nut's PR #311 korean-humanizer skill (cherry-picked,
authorship preserved) by re-centering it on the epoko77-ai/im-not-ai
(Humanize KR, MIT) methodology:

- 4대 철칙 (의미 불변 · 근거 기반 · 장르 유지 · 과윤문 금지 30%/50% 가드)
- S1/S2/S3 severity tiers and A~D quality grades
- A~J taxonomy with Korean-specific patterns (A-16 그/그녀 강박,
  A-18 관계절 좌향 수식, A-19 이중 조사, C-11 연결어미 뒤 쉼표, E-7 경어법)
- detect -> rewrite -> audit -> grade loop with self-check checklist
- references/ai-tell-taxonomy.md full A~J table
- docs/features/korean-humanizer.md crediting im-not-ai and happy-nut
- README row + link, regenerated plugin.json, docs regression test

Co-authored-by: happy-nut <happynut.dev@gmail.com>

* docs(korean-law-search): document official precedent API evidence (#313)

Enhance the existing korean-law-search skill and feature doc with the
official 법제처 Open API precedent endpoints and detail retrieval, without
adding a new skill, package, workspace, or changeset.

- Document 판례 목록 조회 (lawSearch.do?target=prec) and 판례 본문 조회
  (lawService.do?target=prec&ID=...) as official evidence behind the
  korean-law-mcp search_precedents/get_precedent_text path.
- Add supported precedent filters (query, court, case number, source
  name, date, sort) and precedent-specific failure modes (missing LAW_OC,
  upstream unavailable/rate-limit/timeout, empty results, body
  unavailable for some sources) plus the legal-advice boundary.
- Keep korean-law-mcp first and Beopmang as the only post-failure
  fallback; lawService.do?target=prec is official detail retrieval, not a
  Beopmang-style fallback.
- Extend the skill-docs regression test with stable endpoint/tool
  literals and concept-level filter/failure-mode/legal-boundary checks.

Closes #308

* feat(toss-securities): add official read-only OpenAPI client (#312)

Add an official Toss Securities Open API client alongside the existing
unofficial tossctl wrapper. The package ships read-only helpers backed by
the official REST API (https://openapi.tossinvest.com): OAuth2
client_credentials token issuance with an in-memory token cache, bearer +
X-Tossinvest-Account header handling, TossApiError/TossCredentialsError
with secret/token redaction, and 429 Retry-After/backoff retry.

Credentials are read from TOSSINVEST_CLIENT_ID/TOSSINVEST_CLIENT_SECRET
(optional TOSSINVEST_ACCOUNT/TOSSINVEST_API_BASE_URL) and sent directly to
Toss, never through a shared proxy. Order mutation remains out of scope;
the tossctl path is retained as a documented fallback.

Closes #306

* Revert "docs(korean-law-search): document official precedent API evidence (#313)"

This reverts commit 5faec8bb2a.

* feat(k-skill-proxy): fold Korean law lookups into k-skill-proxy, drop Beopmang (#315)

Add hosted korean-law proxy routes and make the korean-law-search skill
proxy-first, removing the unstable Beopmang fallback from the support list.

- proxy: new src/korean-law.js wrapping official 법제처 DRF lawSearch.do /
  lawService.do, injecting LAW_OC + browser User-Agent/Referer (the real
  cause of "사용자 정보 검증 실패") and retrying empty/HTML responses.
- proxy: /v1/korean-law/search and /v1/korean-law/detail routes + lawOc
  config + koreanLawConfigured health flag; 17 module + 6 route tests.
- skill/docs: korean-law-search becomes proxy-first (no per-user LAW_OC,
  no local CLI). Drop Beopmang everywhere; credit chrisryugj/korean-law-mcp
  as design reference and 법제처 open.law.go.kr as official source.
- ops: LAW_OC added to deploy doc KEYS, secret accessor loop, and the
  Cloud Run deploy workflow set-secrets.
- changeset: k-skill-proxy minor.

---------

Co-authored-by: iamiks <rmstjr1030@naver.com>
Co-authored-by: happy-nut <happynut.dev@gmail.com>
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-12 19:06:18 +09:00

8.9 KiB
Raw Permalink Blame History

한국어 AI 흔적 분류 체계 (AI-tell Taxonomy)

korean-humanizer 스킬의 전체 패턴 표다. 정의 1줄 + 처방 1줄로 압축했다. 본문 SKILL.md의 핵심 패턴을 보강하는 레퍼런스이며, 무더기 판단이 애매할 때 이 표로 심각도를 가른다.

이 분류 체계·심각도·처방은 epoko77-ai/im-not-ai (Humanize KR, MIT)의 ai-tell-taxonomy.md / quick-rules.md를 한국어 단일 스킬 형식에 맞게 재구성한 것이다. 학술 anchor는 해당 프로젝트의 scholarship.md 인용을 따른다.

심각도

  • S1 결정적 — 한 번만 나와도 AI 확신. 무조건 제거.
  • S2 강함 — 1~2회 허용, 3회 이상 반복 시 제거.
  • S3 약함 — 다른 패턴과 무더기로 겹칠 때만 문제.

과윤문 가드 / Do-NOT

  • 변경률 30% 초과 = 경고, 50% 초과 = 강제 중단·롤백.
  • 탐지·윤문 모두 제외: 고유명사·제품명·모델명·기관명, 수치·날짜·단위, 큰따옴표 안 직접 인용, 법률 조문, 수학·화학·통계 표기, 업계 표준 영어 약어(LLM·GPU·API·MCP 등).

A. 번역투 (Translation-ese)

ID 패턴 심각도 처방
A-1 "~에 대해(서)" S1 목적격 조사로 직결("X에 대해 논의" → "X를 논의")
A-2 "~를 통해/통하여" 남발 S1 "~로", "~해서", "~함으로써"로 분산
A-3 "~에 있어(서)" S1 "~에서", "~을 볼 때"
A-4 "~라는 점에서" 3회+ S2 "~서", "~라는 이유로"
A-5 "~와 관련하여/관련된" S2 "~에", "~의"
A-6 명사화 과잉 / "~에 기반하여/바탕으로" S2 동사로 환원("성능의 향상" → "성능을 높이려고")
A-7 "가지고 있다" / have·make·take·give + N 직역 S1 형용사·동사 환원("경쟁력을 가지고 있다" → "경쟁력이 강하다")
A-8 이중 피동 "~되어진다/보여진다" S1 능동 또는 단일 피동("판단되어진다" → "판단된다")
A-9 "~에 의해" 피동 S2 행위자를 주어로("AI에 의해 생성" → "AI가 만든")
A-10 "~할 수 있다" 남발 S2 단언으로("높일 수 있다" → "높인다")
A-11 "~을 위해" 목적절 남발 S2 "~려고", "~위한"
A-15 추상 주어 + 만능 동사 / 사역·인지 동사 직역 S2 구체 주어 환원, "suggest/show"는 "~에 따르면 ~이다"로 분리
A-16 "그/그녀/그것/그들" 한 단락 3회+ (영어 대명사 직역) S1 50%+ 영형(생략) 또는 호칭·명사구로 (김도훈 2009)
A-17 복수 접미사 "~들" 남발 S2 맥락으로 복수면 삭제("개발자들이" → "개발자가")
A-18 명사 앞 3어절+ 관형구·관계절 좌향 수식 S2 문장 분리 또는 후치 동격절 (박옥수 2018)
A-19 이중 조사 "~에서의/~으로의/~에의/~으로부터의" S2 절·구로 풀어쓰기 (김정우 2007)

B. 영어 인용·용어 과다

ID 패턴 심각도 처방
B-1 한글 + 괄호 영어 매번 병기 S2 첫 등장만 병기, 이후 한글만
B-2 직역 가능한 영어 그대로 S2 한국어로 옮기되 업계 표준 약어는 유지

C. 구조적 AI 패턴

ID 패턴 심각도 처방
C-5 이모지 남발 S1 칼럼·리포트면 전부 삭제
C-7 "먼저·반면·결국" 3단 공식 / 3의 법칙 S2 접속사 1~2개로 줄이거나 본문에 녹임
C-8 "A인가·B인가" 대구 반복 S2 한 번만 살리고 나머지는 평서문으로
C-9 숫자 괄호 인덱싱 "(1)·(2)·(3)" S2 본문에 녹이거나 단순 줄바꿈
C-10 콜론 부제 헤딩 "X: Y" 반복 S1 헤딩 짧게 또는 평서 헤딩으로
C-11 연결어미(-고/-며/-지만/-아서) 직후 쉼표 S1 쉼표 제거. 6회+ = 강한 신호

D. AI 특유의 관용구 (Signature Phrases)

ID 패턴 심각도 처방
D-1 결산 피벗 "결론적으로/따라서/이를 통해/요약하면" S1 3회 초과 시 1~2건만 치환, 나머지 삭제
D-2 "시사하는 바가 크다/주목할 만하다" S1 삭제 또는 구체 결론으로
D-3 "본질적으로/핵심적으로" S1 삭제
D-4 hype 어휘(파격적·압도적·획기적·다채로운·진정한·자리매김) 3회+ S1 구체 수치·사실로 환원
D-5 의인화 추상 주어("기술이 묻는다·시대가 부른다") S1 사람·기관 주어로
D-6 결말 공식 "~할 때다/~해야 한다/지금이야말로" / 막연한 긍정 마무리 S1 평서로 닫거나 삭제
D-7 변환 공식 "X에서 Y로" 반복 S2 한 번만, 나머지는 일반 서술
D-8 과장된 의의 부여(이정표·산물·새 지평·상징) S1 구체 사실로 환원
D-9 출처 없는 권위 호출(전문가들은·~로 알려져 있다) S2 구체 출처 명시 또는 삭제

E. 리듬·종결어미

ID 패턴 심각도 처방
E-1 문장 길이 균일(stdev 8 미만) S2 단문·장문을 의도적으로 섞음
E-2 동일 종결어미 "~다" 4문장 연속 / "~고 있다" 자동 매핑 S2 종결어미 다양화, 단순 시제 환원
E-7 청자 경어법 일관성 손실(대화·구어 한정) S2 한 단락 내 혼용 금지 (김혜영 2019)

F. 과도한 수식·중복

ID 패턴 심각도 처방
F-1 동의어 돌려쓰기(주인공→캐릭터→인물→그) S2 한 명칭으로 통일
F-2 가짜 범위 "A에서 B까지" / 부정 병렬 "단순한 X가 아니라 Y" S2 평서로 환원
F-4 -성/-적/-화 + 영어 -tion/-ment 누적(한 글 12회+) S2 동사·형용사 어근으로 환원
F-5 "~적 N" 추상 체인("전략적 함의·실천적 기반") S2 명사+명사 또는 풀어쓰기

G. Hedging

ID 패턴 심각도 처방
G-1 "~것이다/~할 것이다" 미래 단정 남발 S2 현재형·확정형으로
G-2 "~로 보인다/~인 듯하다" 추정 남발 S2 단언 가능한 곳은 단언
G-3 안전 균형 lexicon "장점도 있지만/신중하게/균형" 4회+ S2 1~2건만 화자 입장으로 치환
G-4 지식 한계 면피("공개된 정보가 제한적이지만") S2 "자료에 없다" 또는 문장 삭제

H. 접속사 남발

ID 패턴 심각도 처방
H-1 문두 접속사 "또한·따라서·즉·나아가·게다가" 5회+ S1 대량 제거, 문장이 흐름을 잡게
H-3 메타 진입 "이는·이 점에서·이 관점에서" 3회+ S1 본문에 녹이거나 삭제
H-4 "즉" 남발 S2 1회로 제한

I. 형식명사·의존명사

ID 패턴 심각도 처방
I-1 "~인 것이다/~한 것이다" 결말 / 권위적 본질 호명 S1 평서형으로
I-2 "X은 ~라는 점에 있다" S2 "X는 ~다" 직설로
I-3 "~다는 뜻이다/~다는 의미다" 결말 S2 본문에 풀어 쓰기
I-4 설교조 당위 "~해야 한다·~할 필요가 있다" / 예고 멘트 반복 S2 평서·단언으로, 예고 삭제

J. 시각 장식

ID 패턴 심각도 처방
J-1 볼드 ** 강조 남발 / 불릿+굵은 머리말 나열 S2 칼럼·리포트면 줄글로 통합
J-2 줄표(—)·en dash() / 따옴표 강조 5회+ / 곡선따옴표·물결표 S1(줄표) 줄표 제거(마침표·쉼표·괄호로), 강조 한두 개만
J-3 불릿 리스트 (장르가 칼럼·리포트일 때) S2 문단 산문으로 통합

챗봇 잔재

ID 패턴 심각도 처방
K-1 챗봇 응대("좋은 질문이에요!·도움이 되었으면") S1 통째로 삭제
K-2 아첨·과잉 공손("정말 훌륭한 지적이세요!") S1 삭제, 본론만 남김

자가검증 체크리스트 (윤문 후, 한 항목 위반 시 해당 edit 롤백)

  1. 고유명사·수치·날짜·인용 100% 보존 — 원문 대비 한 글자도 다르지 않은가.
  2. 변경률 30% 이하인가 (50% 초과는 작업 중단).
  3. 장르 이탈 없음 — 칼럼이 에세이로, 리포트가 블로그체로 떨어지지 않았는가.
  4. register 보존 — 원문이 격식체면 결과도 격식체.
  5. 잔존 S1 0건 — D-1~D-6·A-7·A-8·A-16·C-5·C-10·C-11·H-1·I-1·J-2.
  6. 인공 표현 자제 — 원문에 없던 비유·수사를 임의로 더하지 않았는가.

등급 기준 (자가 채점)

  • A: S1 잔존 0, S2 잔존 2 이하, 변경률 10~25%, 자가검증 6항 통과.
  • B: S1 잔존 0, S2 잔존 4 이하, 자가검증 5항 이상 통과.
  • C: S1 잔존 1~2 또는 자가검증 4항 이하 → 2차 윤문 권고.
  • D: S1 잔존 3+ 또는 변경률 50% 초과 → 작업 중단, 사람 검토 권고.