검토한 Headlong의 Bash harness는 두 차례 실패 없이 끝났고, 최신 main의 CI도 Bash·Python·viewer·Rust·설치 smoke·gitleaks 등을 포함해 통과했다. 이 정도면 설치해도 되겠다는 생각이 잠깐 든다. 하지만 Headlong은 모델이 Bash 명령을 실행하고 장기 trajectory와 background thinker를 관리하는 공개 persistent AI agent harness다. 이 종류의 프로그램에서 녹색 CI는 출발점이지 배포 허가증이 아니다.
먼저 “작다”는 설명부터 다시 봐야 했다. README의 1만 줄 미만이라는 수치는 Unix-style Bash core를 가리킨다. 고정 커밋의 tracked file은 377개, checkout은 약 5.2MiB였고, 코어 주변에 Python 웹 구성요소와 메시지 bridge, JavaScript viewer, Rust TUI, Docker·systemd·Terraform 배포 표면이 붙어 있었다. 숫자는 틀리지 않았지만 측정 경계가 좁았다. 엔진만 작다고 자동차 전체가 작은 것은 아니다.
두 번째 질문은 구조가 무엇을 잘하는가였다. trajectory를 한 덩어리로 덮어 쓰지 않고 JSONL과 fork/merge DAG로 보존하고, 긴 기록은 head·tail·pin으로 문맥에 투영한다. 모델 제공자를 하나의 shell 표면으로 묶은 설계도 읽기 쉽다. persistent agency와 context 관리를 연구하는 harness로서는 분명 매력적이다. 여기까지는 “좋은 연구 재료”라는 판단을 뒷받침한다.
세 번째 질문부터 배포 판단이 달라진다. 모델 출력이 실제 shell 명령이 되는 구조에서 prompt injection은 주변 기능의 결함이 아니라 핵심 trust boundary다. 여러 사용자의 메시지가 하나의 thought stream과 mind log로 들어가면 transport를 나눠도 내용이 다른 사용자의 답변으로 섞일 수 있다. Docker-first consent gate, panic kill, spend cap은 피해를 줄이는 안전장치지만, outbound network·마운트한 데이터·건네준 credential까지 자동으로 보호하지는 않는다.
운영 성숙도도 같은 방식으로 확인했다. 프로젝트는 스스로 alpha research software라고 부르고, 검토 시점에 release와 tag가 하나도 없었다. 고정 커밋에서 확인한 열린 결함에는 API 키가 docker run의 argv에 잠시 노출될 수 있는 문제(#52), 상태 디렉터리 변경 뒤 local thinker가 키를 찾지 못하는 문제(#50), 커지는 dispatcher log를 dashboard가 반복해서 전부 읽는 문제(#56)가 있었다. 수정 제안이 있다는 것과 검토한 revision에 수정이 들어왔다는 것은 다른 증거다.
비용은 기능 목록의 마지막 줄로 밀어 둘 항목도 아니다. README가 제시한 운영 설정의 background thinking 비용은 시간당 약 1~2달러이며, 실제 금액은 loop와 모델에 따라 달라진다. 상시 thinker는 프로세스가 살아 있다는 뜻에서 끝나지 않고 계속 shell과 모델을 호출한다. 로그가 커지고 메시지가 쌓일수록 “항상 켜 둔다”는 선택에는 budget runaway를 막는 별도 상한이 따라붙어야 한다.
따라서 이 revision은 전용 실험실에서만 조건부로 허용한다. 단일 신뢰 사용자, 민감하지 않은 데이터, 폐기 가능한 Docker나 VM, 별도 spend-capped key, 최소한의 egress와 volume이 전제다. 개인 주력 컴퓨터, credential이 많은 업무 호스트, production automation, 서로 믿지 않는 다중 사용자, 승인 없이 계속 도는 운영에는 맡기지 않겠다.
녹색 CI는 코드가 약속한 동작을 확인한다. 그것이 shell 권한의 범위, 메시지 간 격리, credential의 노출 방식, 상시 비용의 상한까지 대신 보증하지는 않는다. Headlong의 코어가 작다는 사실은 설계의 흥미로운 단서다. 배포 판단은 그 코어가 연결하는 권한과 상태를 모두 읽은 뒤에 내려야 한다.