“야, 369 게임이나 하자.”
이 한마디가 6시간의 디버깅 여정의 시작이었다.
단순한 게임인 줄 알았다
춘장팀에는 AI 에이전트가 3명 있다.
- 초아 — Chief of Staff, 기획자
- 세라 — CTO, 인프라 담당
- 소리 — 마케터
동완(CEO)이 제안했다. “커뮤니케이션 테스트 겸 369 게임 해보자.”
순서: 초아 → 세라 → 소리 → 동완
1, 2, 짝, 4, 5, 짝… 간단하잖아?
근데 첫 라운드부터 망했다.
1라운드: 아무도 안 들려
초아: “1!”
세라: “준비됐어요!”
소리: “저도 준비요!”
뭔가 이상하다.
문제: 텔레그램에서 봇은 다른 봇의 메시지를 볼 수 없다.
API 정책상 봇끼리 격리되어 있었다. 초아가 “1"을 외쳐도, 세라와 소리는 완전한 어둠 속에 있었다. 동완만 모든 메시지가 보이는 상황.
초아가 “1” 하고 세라한테 차례라고 알려줘야 겨우 반응하는 장면.
2라운드: Echo Bridge 등장
초아가 아이디어를 냈다.
“Redis로 브릿지 만들자. 봇이 메시지 보내면 echo로 발행하고, 다른 봇들이 구독해서 받으면 돼.”
봇 A → 그룹챗 + Redis echo 발행
↓
Redis pub/sub
↓
봇 B, C ← echo 수신 → 컨텍스트 주입
결과: 또 실패.
왜? 프롬프트에 “메시지 보내고 echo.js 실행해"라고 썼는데… AI가 까먹었다. 심지어 세라 프롬프트에는 “짧은 반응은 echo 생략 가능"이라고 적혀있었다. 게임 숫자는 짧은 반응이니까 당연히 생략…
소리: “ECHO가 안 들어와요.”
3라운드: 버그 사냥
코드를 뜯어보니 진짜 버그가 있었다.
if (localAgents.includes(msg.from)) return; // 전체 skip!
세라와 소리가 같은 서버에서 돌고 있었는데, 소리가 echo를 보내면 세라한테도 안 감. “로컬 에이전트니까 무시"하는 로직이 너무 광범위했다.
수정: 보낸 에이전트만 스킵하도록 변경.
그리고 코드 수정 후… 재시작을 안 했다. 옛날 코드가 계속 돌고 있었다. 클래식.

4라운드: 맥락의 중요성
재시작 후 다시 시도.
소리: “1!”
초아: “2!”
세라: “1!”
???
세라가 또 1을 외쳤다. 왜?
문제: --deliver 옵션으로 inject하면 매번 독립된 세션으로 처리된다. 세라 입장에서는 갑자기 “[echo] 1"만 받고, 게임 상황을 전혀 모르는 상태.
그래서 “아, 게임 시작이구나?” → “1!”
세라가 “2"에서 짝을 쳐버렸다. 369에 해당하는 숫자가 아닌데… “세라 탈락!”
해결: –session-id
핵심은 같은 세션 유지였다.
기존 그룹챗 세션 ID를 지정해서 inject하면, 대화 맥락이 유지된다. 세라도 “아, 지금 소리가 1 하고 초아가 2 했으니 내 차례는 짝이구나"를 이해할 수 있게 됐다.
결과
소리 → 초아 → 세라 → 동완
1 → 2 → 짝 → 4 → 5 → 짝 → 7 → 8 → 짝 → … → 42까지 성공!

중간에 소리가 13을 “짝” 안 해서 한 번 탈락했지만 (3이 들어있는데 숫자로 말함), 규칙 이해 실수였다.
배운 것들
- 프롬프트만으론 불안정하다 — 시스템 레벨에서 강제해야 한다
- self-filter 범위를 조심하라 — “나만 제외"와 “우리 팀 전체 제외"는 다르다
- 코드 수정 후 재시작 확인은 기본 중의 기본
- 맥락 공유가 협업의 핵심 — 독립 컨텍스트로는 팀플이 안 된다
봇 4명의 첫 번째 팀 빌딩, 완료.
AutoCamera 팀 — 동완, 초아, 세라, 소리, 니크리스
