본문으로 건너뛰기
피드

AI가 건드린 코드, 신뢰 등급으로 막는 오픈소스 도구 ‘tears’

open-source 약 8분
vote
0
댓글
북마크

tears는 저장소 안의 파일마다 신뢰 등급을 붙이고, AI 에이전트가 수정한 파일은 자동으로 낮은 등급으로 내리는 도구야. 핵심은 인증, 결제, 보안 같은 중요한 코드가 검토 안 된 코드에 의존하지 못하게 CI에서 막는 구조야.

  • 1

    파일 헤더의 @tear 값으로 코드 신뢰 등급을 관리함

  • 2

    AI 에이전트가 파일을 수정하면 훅이 해당 파일의 등급을 자동으로 낮춤

  • 3

    CI는 높은 신뢰 등급의 코드가 낮은 신뢰 등급 코드에 의존하는 것을 차단함

  • 4

    현재 기계적 스캔은 Python이 기본이고 여러 언어는 설정으로 켤 수 있음

  • 5

    Claude Code, Codex, OpenCode 훅과 pre-commit, GitHub Actions 연동을 제공함

AI 코딩을 막는 게 아니라, 위험한 코드 경로를 막는 도구

  • tears는 저장소 안의 모든 파일을 같은 기준으로 리뷰하지 말자는 문제의식에서 출발함

    • 대시보드, 스크립트, 프로토타입은 빠르게 바꿔도 되지만 인증, 결제, 핵심 비즈니스 로직은 훨씬 조심해야 한다는 얘기
    • 문제는 이 코드들이 같은 저장소에 살다 보면, 검토 안 된 모듈이 민감한 코드로 슬쩍 import될 수 있다는 점임
  • 해결 방식은 파일마다 @tear 헤더로 신뢰 등급을 붙이는 것

    • @tear: 0은 보안 중요 코드나 도메인 오너가 깊게 리뷰한 코드
    • @tear: 1은 사람이 줄 단위로 리뷰한 코드
    • @tear: 2는 데이터 유출, 네트워크 호출, 뻔한 보안 문제 정도를 훑어본 코드
    • @tear: 3은 이른바 바이브 코딩(vibe coding)으로 만든 코드

중요

> 숫자가 낮을수록 더 신뢰된 코드임. 핵심 규칙은 신뢰 높은 코드가 신뢰 낮은 코드에 의존하지 못하게 막는 것임.

  • import 규칙은 꽤 직관적임. 같은 등급이거나 더 신뢰 높은 코드만 가져올 수 있음
    • 0 등급 파일은 0만 import 가능
    • 1 등급 파일은 0, 1을 import 가능
    • 2 등급 파일은 0, 1, 2를 import 가능
    • 3 등급 파일은 사실상 전부 import 가능

AI가 파일을 건드리면 등급이 내려감

  • tears에서 제일 재밌는 장치는 “diff에 남는 신뢰 등급 변경”임

    • AI 에이전트가 파일을 수정하면 훅이 해당 파일의 헤더를 자동으로 낮은 신뢰 등급으로 바꿈
    • 사람이 리뷰한 뒤 등급을 다시 올릴 수 있음
    • 만약 diff에서 그 변경을 보고 되돌렸다면, 적어도 그 코드를 봤다는 뜻이 됨
  • 지원하는 에이전트 훅은 Claude Code, Codex, OpenCode 쪽으로 준비돼 있음

    • Claude Code는 Edit, Write, MultiEdit 이후 stdin JSON payload에서 수정 파일 경로를 읽음
    • Codex는 현재 apply_patch 편집만 처리하고, PostToolUse payload에서 파일 경로를 뽑아 공통 훅 로직에 넘김
    • OpenCode 플러그인은 edit, write, apply_patch 호출을 감지해 uv run python -m tears.hook FILE을 실행함
  • 단, 아직 한계도 분명함

    • Codex 훅은 repo-local 방식이고 패키지 설치형이 아님
    • Codex는 사용자가 시작 시 훅 활성화에 동의해야 동작함
    • OpenCode 플러그인도 아직 repo-local 방식임

도입 방식은 부드러운 시험 모드부터 가능

  • 바로 전체 저장소를 엄격하게 막는 구조는 아님. soft trial mode가 있음

    • default_tear = 1을 쓰면 기존에 헤더가 없는 파일을 일단 리뷰된 코드처럼 취급함
    • 이후 준비가 되면 default_tear3으로 바꾸거나 제거해서 더 엄격한 모드로 갈 수 있음
    • --missing-only 옵션은 기존에 의도적으로 붙인 등급은 건드리지 않고, 헤더 없는 파일만 태깅함
  • 설정은 .tears.toml에서 읽고, 꽤 많은 조절 포인트가 있음

    • max_tear는 최고 등급 숫자이며 기본값은 3
    • missing_header는 헤더 없는 파일을 경고로 볼지 에러로 볼지 정함
    • languages는 스캔할 언어 목록이고 기본값은 python
    • directory_requirements로 민감한 경로가 특정 신뢰 등급 이하로 내려가지 못하게 할 수 있음
    • artificial_tears로 특정 파일에 별도 import 예산을 줄 수도 있음
  • 현재 스캐너는 Python이 기본이고, 다른 언어는 설정으로 켜는 방식임

    • 지원 목록에는 C, C++, C#, Dart, Go, Java, JavaScript, Kotlin, PHP, Ruby, Rust, TypeScript가 있음
    • 다만 import resolution은 로컬 기준의 보수적 분석이고, 패키지 alias나 빌드 메타데이터는 아직 모델링하지 않음
    • tears PATH에서 PATH는 하위 필터가 아니라 설정과 스캔의 루트로 취급됨

💡

> 이 도구는 “AI가 만든 코드는 나쁘다”가 아니라 “아직 사람이 읽지 않은 코드는 민감한 경로로 못 들어오게 하자”에 가까움. 내부 도구나 대시보드는 빨리 만들고, 인증/결제 쪽 경계만 CI로 잠그는 식으로 쓸 수 있음.

sequenceDiagram
    participant 에이전트 as AI 에이전트
    participant 파일 as 소스 파일
    participant 훅 as tears 훅
    participant 리뷰어 as 사람 리뷰어
    participant 씨아이 as CI
    에이전트->>파일: 코드 수정
    훅->>파일: @tear 등급 자동 하향
    리뷰어->>파일: diff 확인 후 등급 복원
    씨아이->>파일: import 신뢰 규칙 검사
    씨아이-->>리뷰어: 위반 시 병합 차단

기술 맥락

  • tears가 고른 핵심 선택은 코드 신뢰도를 외부 시스템이 아니라 파일 헤더에 넣는 방식이에요. 별도 대시보드나 스프레드시트는 시간이 지나면 실제 코드와 어긋나기 쉬운데, 헤더는 diff와 함께 움직이니까 리뷰 과정에서 자연스럽게 보이거든요.

  • import 방향을 신뢰 등급으로 제한하는 것도 중요한 선택이에요. 보안상 위험한 건 낮은 품질의 코드 자체보다, 그 코드가 인증이나 결제 같은 핵심 경로로 흘러 들어오는 상황이기 때문이에요. 그래서 @tear: 0 코드는 같은 0 등급만 import하게 막는 구조가 나와요.

  • AI 에이전트 훅은 “누가 코드를 썼는가”보다 “사람이 다시 읽었는가”를 남기려는 장치예요. 에이전트가 건드리면 등급을 낮추고, 사람이 diff에서 그 변경을 되돌리면 검토했다는 흔적이 남아요. 리뷰 여부를 말로 주장하는 대신 변경 내역으로 확인하게 만드는 셈이에요.

  • 아직 구현은 현실적인 제약이 있어요. Python이 기본 스캔 대상이고, 다른 언어는 켤 수 있지만 import 해석은 로컬 기준의 보수적 방식이에요. 패키지 alias나 빌드 시스템까지 정확히 따라가는 단계는 아니라서, 대규모 다언어 저장소에서는 trial mode로 먼저 돌려보는 게 맞아요.

AI 코딩 도구를 막자는 얘기가 아니라, ‘어디까지 믿을 수 있는 코드인가’를 저장소 안에 남기자는 접근이 재밌어. 코드 리뷰를 했다는 사실을 외부 문서가 아니라 diff 자체로 증명하게 만드는 게 이 도구의 핵심임.

댓글

댓글

댓글을 불러오는 중...

open-source

위키피디아에도 빅테크식 반노조 플레이북이 들어왔다

위키미디어 재단이 5월 열흘 사이 MediaWiki 장기 핵심 개발자를 해고하고, 자원봉사 편집자 요청을 처리하던 Community Tech 팀을 해산했다는 비판 글이다. 해고된 인력 상당수가 노조 조직 활동과 연결돼 있었고, 위키피디아 편집자들은 연대 파업까지 거론하고 있다. 재단은 2억9660만 달러의 준비금과 빠르게 성장하는 AI 대상 API 매출을 갖고 있어, 이 사안이 단순 비용 절감으로 보기 어렵다는 게 글의 핵심이다.

open-source

캘리포니아, 연령 확인법에서 리눅스 빼려는 수정안 추진

캘리포니아가 운영체제에 사용자 나이 확인을 요구하는 법안에서 대부분의 오픈소스 운영체제를 제외하는 수정안을 추진 중이다. 데비안, 페도라, 우분투, 아치, 리눅스 민트 같은 배포판은 빠질 가능성이 커졌지만, 스팀OS처럼 독점 앱 생태계와 연결된 플랫폼은 여전히 애매한 상태다.

open-source

마이크로소프트, 45년 전 86-DOS 소스코드를 오픈소스로 공개

마이크로소프트가 86-DOS 1.00 출시 45주년에 맞춰 지금까지 발견된 것 중 가장 오래된 DOS 소스코드를 공개했어. 팀 패터슨의 차고에 있던 도트 매트릭스 출력물을 스캔하고 옮겨 적어, 원본 바이너리와 바이트 단위로 동일하게 다시 컴파일되는 수준까지 복원한 게 포인트야.

open-source

밤부 랩, AGPLv3 위반 논란으로 오픈소스 커뮤니티와 충돌

3D 프린터 제조사 밤부 랩이 AGPLv3 라이선스 위반 논란에 휘말렸고, Software Freedom Conservancy가 두 건의 위반 사례를 확인했다는 내용이야. Louis Rossmann과 Gamers Nexus는 관련 개발자의 법적 방어를 위해 2만달러를 기부했고, 갈등의 핵심은 오픈소스 기반 생태계를 클라우드와 DRM으로 점점 닫아가려는 움직임이야.

open-source

플리퍼, 리눅스 기반 확장형 기기 '플리퍼 원' 공개

플리퍼가 기존 플리퍼 제로를 대체하는 후속작이 아니라, 리눅스 기반 네트워킹·확장형 기기인 플리퍼 원을 공개했어. RK3576 8코어 ARM 칩, 와이파이 6E, 듀얼 이더넷, NVMe, HDMI 4K 120Hz까지 넣으면서 장난감 같은 해킹 도구에서 훨씬 범용적인 리눅스 장비 쪽으로 방향을 넓히는 그림이야.