resumate 03. Nova 에이전트 교체와 파이프라인 재구성
에이전트 이름 하나를 바꾸려다 파이프라인 구조까지 다시 짰다. 에이전트 사이에 대화 맥락을 넘기는 방법을 정하고, 응답 스트림이 조용히 잘리던 파싱 버그를 잡았다. 오후에는 노트북 없이 코딩하는 방법도 찾아봤다.
Forge라는 이름이 혼자 공장 분위기였다
처음엔 forge라는 이름으로 에이전트를 만들었다. 단련한다는 느낌이 좋아서였다. 그런데 막상 코딩하다 보니 이름이 프로젝트 분위기와 안 맞았다. Nyx, Paws, Echo가 모두 고양이 계열 감성인데 Forge 혼자 공장이었다.
nova로 바꿨다. 별이 폭발할 때 나오는 에너지. 취업 준비생이 면접을 통과하는 순간에 더 가깝다고 생각했다.
이름만 바꾼 게 아니라 파이프라인 구조도 손봤다.
Nova는 이제 독립 에이전트가 아니라 파이프라인 조율자 역할을 맡는다. 사용자 의도를 파악해서 어떤 캐릭터에게 넘길지 결정한다. 코드로 보면 단순한 분기처럼 보이지만, 실제 라우팅 판단은 Claude에게 맡기는 구조다.
Paws는 Nyx가 본 이력서를 모른다
멀티 에이전트 구조에서 대화 히스토리를 어떻게 공유할지가 골치였다.
Nyx가 이미 이력서를 분석했는데, Paws에게 "이 이력서를 기반으로 공고 맞춤 수정해줘"라고 하면 Paws는 그 이력서를 모른다. 캐릭터마다 대화 세션이 독립돼 있기 때문이다.
해결책은 생각보다 단순했다. 에이전트를 전환하는 시점에 세션 컨텍스트 스냅샷을 주입하는 것이다. Nyx의 대화 히스토리를 요약해 Nova가 받고, 그걸 Paws 프롬프트 앞에 붙인다. Claude CLI의 -p 플래그(프롬프트를 명령행 인자로 직접 넘기는 옵션)로 호출하는 구조라서, 컨텍스트를 텍스트로 직렬화해 앞에 붙이면 그대로 전달된다. 우아하진 않지만 동작한다.
응답이 조용히 잘려나가고 있었다
Claude CLI가 stdout으로 출력하는 JSON 스트림이 항상 예상대로 나오지 않는다. 정상일 때는 {"type":"text","text":"안녕하세요..."} 같은 한 줄이지만, 빈 줄이 섞이거나 JSON이 중간에 끊기거나 일반 텍스트가 함께 나오는 경우가 있다.
파싱 로직이 JSON.parse() 하나로 끝나던 게 문제였다. 줄 단위로 파싱하고, 실패하면 버퍼에 쌓았다가 다음 줄과 합쳐서 다시 시도하는 로직을 추가했다.
고친 코드 자체는 몇 줄 안 됐는데 원인을 찾는 데 시간이 더 걸렸다. 스트림이 잘리는 시점이 매번 달라서 재현이 잘 안 되는 종류의 버그였다.
소파에서 코딩하기
오후에 외출할 일이 있었다. 노트북을 들고 나가기 귀찮아서 Claude Code로 원격 제어가 되는지 찾아봤다. 된다.
claude remote-control 명령 하나로 세션 URL과 QR 코드가 뜬다. 스마트폰으로 스캔하면 그 세션에 접속된다. 맥북에서 돌아가는 Claude Code를 스마트폰이 창문처럼 들여다보는 것이다.
인바운드 포트를 열지 않는 설계가 인상적이었다. 맥북에서 Anthropic 서버로 나가는 방향만 쓰는 폴링 방식이라 방화벽을 건드릴 필요가 없다.
비슷해 보이는 Claude Code on the Web과는 실행 위치부터 다르다.
| Remote Control | Claude Code on the Web | |
|---|---|---|
| 실행 위치 | 내 맥북 | Anthropic 클라우드 VM |
| 로컬 파일 접근 | 가능 | 불가 (GitHub 저장소 기반) |
| 맥북이 꺼지면 | 세션 종료 | 계속 실행 |
| 적합한 상황 | 잠깐 자리 비울 때 | 오래 걸리는 작업 위임 |
Remote Control로 Nova 파이프라인 테스트를 스마트폰에서 지시했다. 맥북 앞에 없는데 맥북에서 코드가 돌아가는 게 신기했다.
이름이 안 맞는다는 감각이 설계 신호였다
에이전트 이름을 바꾸는 게 사소해 보이지만 프로젝트 방향을 다시 생각하게 만든다. Nova로 바꾸면서 이 에이전트가 무엇을 해야 하는지를 다시 정의하게 됐고, 결국 단일 처리기에서 조율자로 역할 자체가 바뀌었다. Nova가 라우팅 판단까지 맡게 되면서 캐릭터를 추가할 때 손댈 곳도 한 군데로 줄었다.
엣지 케이스는 언제나 예상보다 많다. 파싱 로직 하나가 몇 줄밖에 안 됐는데, 그게 없으면 응답의 일부가 조용히 사라진다. 조용히 사라지는 게 제일 무섭다.
남은 건 아직 많다. 컨텍스트 주입이 텍스트 직렬화라 대화가 길어지면 프롬프트가 얼마나 커지는지 안 재봤고, 캐릭터별 시스템 프롬프트의 취업 특화도 그대로다. 이력서 PDF 파싱과 채용공고 URL 스크래핑, CharacterBlob 3D 컴포넌트 연결도 남았다.