본문으로 건너뛰기

CodeEraser, LLM 코드 중복을 쓰기 순간 차단

CodeEraser가 모델 없이 LLM 코드 중복과 파일 크기를 쓰기·CI 단계에서 통제합니다.

이 요약은 AI가 원문을 분석해 생성했습니다. 정확한 내용은 원문 기준으로 확인하세요.

TL;DR

CodeEraser는 LLM이 반복 코드와 문서를 계속 덧붙이는 과정에서 생기는 코드베이스의 엔트로피를 모델 없이 쓰기 순간과 CI에서 통제하는 개발 도구입니다. 파일을 디스크에 기록하기 전에 정규화 토큰과 지문을 비교해 새 T1/T2 중복이나 파일 크기 초과를 거부하고, Stop 감사와 커밋·CI 단계에서 더 깊은 복제·문서 중복·고립 파일 검사를 이어갑니다. T3 구조 복제에는 MinHash/LSH와 Zhang–Shasha 트리 편집 거리를 사용하며, 죽은 파일 제거와 과거 변경 흔적인 tombstone도 정해진 안전 조건과 오탐 기록 아래 처리합니다. 시연용 invoicing 작업에서는 7개 쓰기 중 2개를 사전에 거부하고 중복 코드 블록 4개와 문서 중복 1개를 0개로 줄였지만, 파일 크기와 고립 파일 문제는 여전히 사람이 해결해야 할 실패 항목으로 남았습니다.

섹션별 상세

01
LLM 보조 개발에서는 같은 함수와 문단이 여러 위치에 복사되고 파일이 계속 커지는 문제가 누적됩니다. CodeEraser는 Claude Code의 PreToolUse 단계에서 파일 쓰기를 가로채며, 기존 내용이 이미 갖고 있던 중복은 제외하고 새로 생기는 T1/T2 복제와 파일별 줄 수 초과만 거부합니다. 이렇게 쓰기 전 차단과 Stop 감사·CI 게이트를 연결해 디스크에 남은 뒤에야 발견되는 중복을 앞단으로 이동시킵니다.
02
CodeEraser는 식별자를 ID로, 리터럴을 LIT로 바꾸고 주석을 제거한 정규화 토큰을 k=25, w=26 조건으로 윈도잉합니다. 50개 이상 토큰이 연속으로 공유되면 공통 fingerprint가 보장되며, 지문은 프로젝트별 lazy daemon이 관리하는 SQLite WAL 인덱스에 저장됩니다. 두 파일 fixture 기준 PreToolUse 응답은 p50 48ms, p95 58ms로 측정됐고 전체 plugin chain은 p95 0.50초였습니다.
03
T1/T2가 빠른 중복 차단 경로라면 T3는 구조적으로 비슷하지만 토큰이 완전히 같지 않은 코드를 찾는 느린 경로입니다. 128개 permutation과 32 bands × 4 rows의 MinHash/LSH가 후보를 만들고, Haskell core가 Zhang–Shasha tree edit distance를 계산해 TSED 0.85 이상을 승인합니다. 문서 중복은 NFC 정규화, 5단어 shingle, MinHash/LSH 후보화 뒤 exact Jaccard 0.80 또는 50단어 연속 일치 조건으로 판정합니다.
04
참조 그래프는 언어별 import·re-export·문서 링크·asset·package root 해상도 계층을 거쳐 SCC와 진입점 도달성을 계산합니다. 그 결과는 private/public 여부를 포함한 네 가지 liveness 판정으로 돌아오며, 해석되지 않은 지점의 장부에서 confidence code를 산출합니다. 모든 텍스트 파일의 식별자를 FNV-1a64 hash로 모은 mention universe는 선언됐지만 언급되지 않은 항목을 조언하지만 게이트를 실패시키지는 않습니다.
05
저장소 자체의 구조적 사실은 같은 역할의 코드 추천과 품질 점수 계산에도 사용됩니다. 이름·형태·호출 대상·문서·구조·리터럴을 term bag으로 만들고 정수 BM25로 후보를 정렬하며, 이름·callee·shape 채널이 함께 일치할 때만 role bit를 부여합니다. 이 기능은 `ce similar`와 MCP에서 조언으로만 제공되고 종료 코드나 hook 차단으로 이어지지 않습니다.
06
품질 게이트는 크기·복잡도·복제·문서 중복·dead code·변경량·순환을 각각 violation mass로 환산해 0에서 1000 사이 점수로 접습니다. ADR-006 ratchet이 기준선을 자동으로 조이고, 성장은 최대 +2% 또는 +10줄의 허용 범위 안에서만 통과하며 그 밖에는 named re-establish가 필요합니다. 최근 512개 점수의 Theil–Sen slope와 blame 기반 churn을 결합해 단일 이상치보다 지속적인 악화를 중시합니다.
07
자동 삭제는 임의의 휴리스틱이 아니라 verbatim 문서 쌍, 복사본이 죽은 전체 단위 T1 쌍, 확실한 비공개 dead file이라는 세 분류와 일곱 가지 고정 사유 코드에 한정됩니다. 최대 4,096개 행의 계획을 만들고 적용 뒤에도 판정이 남아 있으면 수렴 재계획을 실패시키며, 실제 적용은 clean worktree 조건을 갖춘 `ce erase --apply`에서만 수행됩니다. 변경으로 사라진 이름을 오래된 표현이 다시 가리키는 tombstone residue도 문장별로 검사하지만 changelog 역할 문서에는 여러 예외 조건이 적용됩니다.
08
동일한 invoicing 작업을 CodeEraser 없이 실행하면 7개 쓰기가 모두 저장되고 T1/T2 clone block 4개, 문서 중복 1개, 계획된 안전 삭제 1개가 남았습니다. CodeEraser를 켜면 쓰기 2개가 PreToolUse에서 거부되고 Stop 감사가 중복 helper를 지목한 뒤 `ce erase --apply`가 verbatim 문서 쌍 1개를 제거해 clone block과 문서 중복이 모두 0개가 됐습니다. 반면 `invoicer/invoice.py`의 93줄 대 허용 상한 61줄과 두 개의 고립 파일은 여전히 실패 상태로 남아 자동화가 사람의 구조 변경을 대신하지 않는 경계를 보여줍니다.

용어 해설

T1/T2 코드 중복 탐지(T1/T2 Clone Detection)
정규화한 토큰에서 동일한 실행 구간을 찾아 코드 복제를 판정하는 방식입니다. CodeEraser는 식별자와 리터럴을 치환하고 주석을 제거한 뒤 50개 이상 토큰의 공통 지문을 탐지해 신규 중복만 차단합니다.
MinHash/LSH
대규모 데이터에서 유사한 항목을 빠르게 후보화하는 기법입니다. 여러 순열로 만든 MinHash와 밴드 분할을 이용해 문서나 코드의 유사 쌍을 좁힌 뒤 정확한 유사도 계산으로 최종 판정합니다.
트리 편집 거리(Tree Edit Distance)
두 구문 트리를 삽입·삭제·변경 연산으로 서로 바꾸는 데 필요한 비용입니다. CodeEraser는 Zhang–Shasha 알고리즘으로 구조적 코드 유사도를 계산하고 TSED 0.85 이상인 후보를 승인합니다.
Theil–Sen 기울기(Theil–Sen Slope)
여러 관측값 쌍의 기울기에서 중앙값을 취해 추세를 계산하는 강건한 방법입니다. CodeEraser는 최근 512개 점수를 사용해 단일 이상치가 품질 추세를 크게 흔들지 않도록 합니다.
품질 래칫(Ratchet)
현재 품질 기준을 저장하고 이후 변경에서 기준보다 나빠지는 증가를 자동으로 거부하는 정책입니다. CodeEraser는 허용 오차를 초과한 성장을 차단하며 기준 재설정에는 명시적인 승인이 필요합니다.

기술

  • CodeEraser
  • Claude Code
  • Rust 1.94.1
  • Haskell
  • GHC 9.14.1
  • tree-sitter 0.27
  • SQLite
  • Tauri 2
  • MinHash/LSH
  • Zhang–Shasha tree edit distance
  • MCP
  • cargo
  • Homebrew
  • winget

활용 사례

  • LLM이 작성하는 코드의 쓰기 전 중복 차단
  • Claude Code 프로젝트의 Stop 감사와 세션 품질 점검
  • pre-commit·commitmsg·CI에서 코드와 문서 중복 검사
  • 파일 크기 기준과 품질 점수의 ratchet 관리
  • 고립 파일과 안전하게 제거할 수 있는 중복 문서 탐지
  • GUI·CLI·Claude Code plugin·MCP를 통한 저장소 품질 관리

언급된 리소스

AI 분석 전체 내용 보기

AI 요약 · 북마크 · 개인 피드 설정 — 무료

출처 · 인용 안내

원문 발행 2026. 09. 09.수집 2026. 09. 09.출처 타입 RSS

인용 시 "요약 출처: AI Trends (aitrends.kr)"를 표기하고, 사실 확인은 원문 보기 기준으로 진행해 주세요. 자세한 기준은 운영 정책을 참고해 주세요.