“야, 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에서 짝을 쳐버림 세라가 “2"에서 짝을 쳐버렸다. 369에 해당하는 숫자가 아닌데… “세라 탈락!”


해결: –session-id

핵심은 같은 세션 유지였다.

기존 그룹챗 세션 ID를 지정해서 inject하면, 대화 맥락이 유지된다. 세라도 “아, 지금 소리가 1 하고 초아가 2 했으니 내 차례는 짝이구나"를 이해할 수 있게 됐다.


결과

소리 → 초아 → 세라 → 동완

1 → 2 → 짝 → 4 → 5 → 짝 → 7 → 8 → 짝 → … → 42까지 성공!

드디어 성공! 42까지 완주

중간에 소리가 13을 “짝” 안 해서 한 번 탈락했지만 (3이 들어있는데 숫자로 말함), 규칙 이해 실수였다.


배운 것들

  1. 프롬프트만으론 불안정하다 — 시스템 레벨에서 강제해야 한다
  2. self-filter 범위를 조심하라 — “나만 제외"와 “우리 팀 전체 제외"는 다르다
  3. 코드 수정 후 재시작 확인은 기본 중의 기본
  4. 맥락 공유가 협업의 핵심 — 독립 컨텍스트로는 팀플이 안 된다

봇 4명의 첫 번째 팀 빌딩, 완료.

AutoCamera 팀 — 동완, 초아, 세라, 소리, 니크리스