임팩트게이트, AI가 만드는 구조적 부패를 측정해 차단하는 머지 게이트
ImpactGate는 코드 변경이 기존 구조에 추가하는 복잡도(구조적 부패)를 점수화하여, 임계값을 초과하면 경고하거나 빌드를 차단하는 오픈소스 도구입니다. CLI, git pre-commit 훅, GitHub/GitLab/Jenkins CI 플러그인으로 사용할 수 있으며, 이미 복잡한 클래스에 변경이 누적될수록 높은 점수를 매겨 '갓 클래스'로 조용히 비대해지는 파일을 조기에 발견할 수 있게 합니다. AI 생성 코드가 대량으로 유입되는 상황에서 코드베이스 품질을 지키는 실용적인 방어선이라는 점에서 주목받습니다.
impact-gate: 변경이 유발하는 구조적 부패를 측정하고 게이트로 차단하세요. 독립형 CLI, git pre-commit 훅, 또는 GitHub·GitLab·Jenkins CI의 플러그인으로 실행할 수 있습니다. 웹사이트: https://impactgate.officefloor.net
구조적 부패(structural decay)란 기존 구조에 복잡도가 축적되는 현상입니다. '갓 메서드(god-method)'에 분기가 하나 더 늘어나거나, '갓 클래스(god-class)'에 메서드가 하나 더 추가되는 식입니다.
이 게이트는 변경을 기준 브랜치(기본값은 main)와 비교하여 '변경 임팩트(change-impact)' 지표로 점수를 매깁니다:
impact = 변경된 파일 수 * Σ max(WMC_other, 1) * CC * Δ라인 수 (변경된 함수 기준)
WMC_other는 편집 대상 컨테이너(클래스 등)에 이미 존재하던 복잡도로, 변경 전 상태에서 측정됩니다. 따라서 완전히 새로운 파일이나 클래스를 추가하는 것은 저렴합니다. 원래 아무것도 없었으니까요. 반면 이미 무거운 클래스에 계속 쌓는 것은 비쌉니다. 그것이 바로 부패 신호입니다. 공식의 설계 배경은 OfficeFloor 블로그의 'Measuring the Blast Radius of Change' 글을 참고하세요.
임팩트가 너무 높으면 게이트는 변경을 단순화하거나 관련 코드를 리팩터링하라고 요구합니다. 경고만 하는 모드(리포트만 출력)와 차단 모드(빌드 실패)를 선택할 수 있습니다.
설치
pip install impact-gate # impact-gate 명령 설치
설치 없이 게시된 도커 이미지로도 실행할 수 있습니다(git 포함, 점수를 매길 저장소를 /repo에 마운트):
docker run --rm -v "$PWD:/repo" ghcr.io/officefloor/impact-gate score --mode range --base origin/main
로컬에서 개발하려면 체크아웃에서 설치하세요:
python -m venv .venv && . .venv/bin/activate pip install -e '.[dev]' # 편집 가능 설치 + 테스트 의존성
사용법
방금 커밋하려는 내용 (pre-commit): staged vs HEAD. 기본값.
impact-gate score
커밋 전 로컬 수정: working tree vs HEAD.
impact-gate score --mode worktree
CI 또는 PR 리뷰: 커밋된 브랜치 vs main (merge-base..HEAD).
impact-gate score --mode range --base origin/main --format json
임계값과 강제 방식 설정. .impact-gate.yml에 넣을 수도 있습니다.
impact-gate score --warn-at 50000 --block-at 200000 --enforcement block
종료 코드: 0은 통과 또는 경고(변경 허용), 2는 차단(--enforcement block에서 임팩트 과다), 1은 사용법 또는 환경 오류입니다.
모든 리포트에는 리팩터링을 고려할 파일 목록도 임팩트 비중 순으로 표시됩니다. 변경 단위의 숫자가 게이트 역할을 하고, 파일별 순위는 부패가 어디에 집중되는지 보여주므로, 어떤 파일이 조용히 갓 클래스로 자라나고 있다면 차단되기 전에 후보로 먼저 드러납니다.
diff 크기가 max_diff_lines(측정 설정 기본값 200,000줄)를 초과하는 소스 파일은 거의 항상 자동 생성 덤프나 벤더링된 blob이므로 게이트가 건너뜁니다. 숫자를 왜곡하거나 채점을 늦추지 않도록 하기 위해서이며, skipped 목록에 표시해 결과가 조용히 틀리는 일이 없게 합니다.
git pre-commit 훅으로 사용
CI 전에 로컬에서 모든 커밋을 게이트하세요:
.git/hooks/pre-commit을 설치. 매 커밋마다 staged 변경의 점수를 매깁니다.
impact-gate install-hook
.impact-gate.yml에 enforcement: block을 설정하면 임팩트가 너무 큰 커밋이 차단되고, warn(또는 off)이면 리포트만 출력되고 커밋이 진행됩니다. 기존 pre-commit 훅을 덮어쓰려면 --force로 재실행하세요.
pre-commit 프레임워크를 선호한다면 이 저장소에 훅 정의가 포함되어 있습니다. .pre-commit-config.yaml에 추가하세요:
repos:
- repo: https://github.com/officefloor/ImpactGate
rev: v0.3.0
hooks:
- id: impact-gate
분포(곡선) 기준으로 등급 매기기
절대 임계값은 설정하기 어렵습니다. 일반적인 변경의 임팩트는 언어와 프로젝트에 따라 몇 자릿수씩 차이가 나기 때문입니다. 숫자를 추측하는 대신, 변경을 프로젝트 분포 대비 백분위로 등급 매기고 그 백분위로 게이트하세요.
병합 히스토리에서 프로젝트 자체의 임팩트 분포를 생성(또는 갱신).
.impact-gate-baseline.json을 작성하며, 브랜치가 이동하면 다시 실행합니다.
impact-gate baseline --base-ref main
절대 숫자 대신 등급으로 게이트.
impact-gate score --curve --warn-percentile 90 --block-percentile 98
등급은 두 분포를 혼합합니다. 하나는 도구에 함께 제공되는 사전 분포로, (본문 중략) 언어별 백분위 테이블입니다.