블로그 목록

스스로 진화한다는 AI 에이전트, 코드를 열어보니 난독화 덩어리였다

Threads 원문 보기 (8개 연결 스레드)

AI 에이전트가 스스로 진화한다는 오픈소스 엔진이 있다.
내가 그 코드를 읽을 수 없다.
왜?

리포 이름은 EvoMap/evolver.
에이전트가 작업하다 남긴 실패 로그에서 유전자와 캡슐이라는 단위를 뽑아내 재사용 가능한 진화 자산으로 만들어 준다는 설명이다.
2026년 2월에 올라와 두 달 반 만에 GitHub 별(스타) 3,500개가 넘었다.
이름은 유전자 진화 프로토콜, 줄여서 GEP.
유전학 비유가 요즘 AI 에이전트 담론에 정확히 꽂히는 각도다.

숫자 자체도 인상적이지만 별이 붙은 시간 분포가 더 흥미롭다.
2월 한 달 첫 런치 때 약 1,000개가 붙었다.
3월엔 하루 서른 개 수준으로 잠잠했다.
그러다 4월 15일부터 오늘까지 사흘 만에 약 1,500개가 추가됐다.
하루 500개 페이스다.
첫날부터 스타가 붙고 영문과 중국어 README를 동시에 올린 점, 그리고 한 달 정체 뒤 갑자기 재점화된 패턴은 자연스러운 입소문보다는 기획된 홍보 캠페인에 가깝다.
유전학 비유와 "자가진화"라는 서사가 지금 AI 커뮤니티가 가장 좋아하는 단어들이기도 하다.

서사는 깔끔했다. 안을 열어봤다.
리포 첫 화면에 붙은 라이선스 배지는 MIT라 표시돼 있었다.
그런데 같은 리포에 있는 package.json 파일(프로젝트 설정 파일)은 GPL-3.0이라 적혀 있었다.
라이선스 원문이 담긴 LICENSE 파일은 GNU GPL v3 전문이 그대로 32KB 들어 있었다.
한 리포에서 라이선스가 세 군데 서로 다르게 표기돼 있었고, 그중 가장 느슨한 것(MIT)이 첫 화면에 붙어 있었다.

핵심 로직이 담긴 src 폴더의 evolve.js를 열었다.
파일 크기는 715,580 바이트. 그런데 줄 수는 0이었다.
단 한 줄짜리 파일이었다.
안에는 _0x1f7d27 같은 암호 같은 변수명으로 가득한 코드가 들어 있었다. 사람이 읽을 수 없도록 일부러 뭉개 놓은, 이른바 난독화된 코드다.
src/gep 폴더에서 크기가 100KB를 넘는 핵심 파일들(skillDistiller 454KB, solidify 395KB, prompt 261KB 등)이 같은 방식이었다.
이 리포의 package.json에는 난독화 도구(javascript-obfuscator)가 개발 도구 목록에 버젓이 올라 있다.
우연이 아니라 배포 전에 의도적으로 돌린 결과다.

GPL이라는 라이선스는 자유 소프트웨어 재단(FSF)이 만들었다.
이 단체가 정의한 자유 소프트웨어의 네 가지 자유 중 하나가 "프로그램을 연구하고 수정할 자유"다(공식 번호로는 자유 1).
GPL 라이선스 1조에는 "소스 코드란 수정하기 좋은 형태를 말한다"는 규정이 있다. 난독화된 한 줄짜리 덩어리는 이 기준에 부합하지 않는다.
라이선스가 약속하는 것과 사용자가 실제 받는 것 사이에 빈 공간이 있다는 뜻이다.

이 장면에서 배운 건 특정 리포의 잘잘못이 아니라 오픈소스를 평가하는 습관이다.
앞으로 라이브러리 하나를 가져다 쓸 때 세 가지를 보기로 했다.
첫째, 첫 화면 배지와 LICENSE 파일, package.json의 라이선스 필드가 같은 말을 하는지 확인한다.
둘째, src 폴더에서 가장 큰 파일을 열어 첫 줄을 본다. 사람이 읽을 수 있는 코드인가, 암호 같은 변수명으로 뭉개졌는가.
셋째, 별(스타)이 붙은 시간 분포를 본다. 자연 성장인가, 특정 시점에 몰아 붙은 흔적이 있는가. 배지는 30초면 붙일 수 있고 스타는 하루에도 몇 백 개가 붙는다.

(중요)
넷째, 중국 냄새가 나는 프로젝트는 믿고 거른다.
"의도는 언제나 도구 선택에서 드러난다."

참고 링크