스스로를 고쳐 쓰는 Common Lisp 코딩 에이전트 'Autolith' 공개
Autolith는 Common Lisp 이미지 하나로 돌아가는 터미널 기반 프로그래밍 에이전트다. 자신이 실행되는 런타임을 직접 들여다보고, 고치고, 망가뜨리고, 다시 복구할 수 있다는 점을 전면에 내세운다. lambda-symbolics가 공개했으며, GitHub 저장소에서 nix 실행, 설치 스크립트, 소스 부트스트랩 세 가지 경로로 받을 수 있다.
지원 범위는 Linux, macOS, FreeBSD, NetBSD, OpenBSD, Windows다. 에이전트 전체가 단일 Lisp 이미지로 구성되어 MCP 서버 연결, 대화 저장소, 지속 메모리, 워크스페이스, 아젠다, 툴 레지스트리, 변경 저널 같은 요소를 같은 런타임 안에서 관리한다. 파일 검색은 Rust로 작성된 fff 라이브러리를 사용하며, 실험이나 스크립트 실행을 위한 Lisp 워커를 힙 격리 상태로 띄워 유지할 수 있다. 저장소 탐색용 파일시스템·셸·검색 도구와 LSP 서버 연동도 갖췄다.
핵심은 자기 수정이다. Common Lisp이 런타임에 제공하는 describe, 조건(condition), 재시작(restart), CLOS 프로토콜, 소스 폼 같은 기능을 활용해 자신의 구현을 검사하고 바꾼다. self.redefine은 완전한 정의를 컴파일해 이미지에 설치하고 저널에 덧붙인다. self.exercise는 대기 중인 변경에 대해 assert를 돌려 제대로 동작하는지 확인하고, self.diff는 변경 내역을 검토하게 해준다. self.discard는 결과가 좋지 않거나 필요 없어진 변경을 버리고, self.commit은 이를 내부 git 저장소의 커밋으로 만들어 필요할 때 이미지를 재빌드할 수 있게 한다. 프로세스를 재시작하지 않고도 실행 중인 에이전트의 함수, 메서드, 클래스, 매크로, 조건, 전역 설정을 교체할 수 있다.
입력 프롬프트는 문법 설탕을 얹은 REPL이다. 사용자가 문장을 그대로 입력하면 내부적으로는 (prompt) 호출로 읽히고, :to 파라미터로 특정 에이전트를 지정할 수 있다. 일반 텍스트만으로 대화가 되기 때문에 Lisp 폼을 몰라도 사용에 지장이 없다. 다만 Lisp 폼을 직접 입력하면 그것이 이미지에서 실행되고, 에이전트는 입력과 실행 결과, 그리고 발생한 조건까지 함께 보게 된다. 하위 에이전트가 작업하는 도중에도 메시지를 보내 방향을 교정할 수 있고, 그 응답이 터미널로 돌아온다.
컨텍스트 윈도를 넘는 자료를 다루기 위해 Recursive Language Models(Alex L. Zhang, Tim Kraska, Omar Khattab) 방식을 구현했다. 작은 프로그램을 작성해 자료를 검색하고 잘라내며, 중요한 조각만 별도의 사이드 대화로 보내 답만 남기는 식이다. 시작 전에 호출 수, 토큰, 재귀 깊이에 상한을 정해 토큰이 무한정 늘어나는 것을 막는다. 공개된 예시에서는 3.1MB, 121개 소스 파일에서 83개 조건 클래스를 14개 서브시스템별로 정의 파일과 함께 분류했는데, 예산은 32회 호출·40만 토큰·깊이 2였고 루트 대화는 59.6K 토큰 입력에 915 토큰 출력을 기록했다.
크래시 대응도 눈에 띈다. 프로세스가 죽으면 크래시 캡슐을 남기고, 별도로 빌드된 순정 이미지를 부팅해 정상 동작하던 세대를 선택한다. 진행 중이던 대화가 복원되고 읽기 전용 진단 턴이 열려 원인을 살핀 뒤 고칠지, 어떻게 고칠지를 결정할 수 있다. 일반적인 조건, 즉 흔한 에러는 프로세스를 죽이지 않고 Lisp 디버거를 띄워 모델과 사용자가 함께 처리 방식을 정한다. 시연에서는 duration formatter를 런타임에 재정의하고 검증·커밋한 뒤 일부러 망가뜨려 복구하는 흐름이 소개됐다.
최근 코딩 에이전트는 대개 외부 프로세스로 파일을 수정하고, 변경을 반영하려면 재시작이 필요하다. Autolith는 이미지 기반 런타임이라는 Lisp의 오래된 특성을 에이전트에 그대로 붙였다. MCP와 LSP 같은 주변 도구를 한 이미지에 통합하고, 입출력 스키마를 규정한 헤드리스 모드로 기존 워크플로에 끼워 넣을 수 있게 한 것도 같은 맥락이다.
실무적으로 참고할 지점은 자가 수정의 안전장치다. 변경을 저널에 기록하고, assert로 검증하고, 커밋 가능한 단위로 묶고, 문제가 생기면 알려진 정상 세대로 되돌리는 절차는 어떤 자가 개선 에이전트에도 적용할 수 있는 구조다. 대화·메모리·아젠다·체크포인트를 이식 가능하게 유지하는 접근도 장기 실행 에이전트를 다룰 때 참고할 만하다.
주의할 점도 분명하다. 런타임 변경이 프로세스보다 오래 살아남을지는 사용자와 Autolith가 정하는 몫이며, 자기 수정 자체가 위험을 동반한다. RLM은 상한을 두지만 토큰 소모가 작지 않고, 공개된 크래시 복구 시연에서는 28.9만 토큰이 쓰였다. Lisp 생태계에 익숙하지 않다면 진입 장벽이 있을 수 있다. 대부분의 사용자는 Lisp 폼을 쓸 필요가 없다고 하지만, 디버깅과 확장까지 하려면 Lisp 지식이 도움이 된다.