← 목록으로

팀 대화 재작성 — "한 자리에 있는 친구들" (2026-08-30 새벽)

결론 먼저

팀 방(1:N)을 전면 재작성해 배포·검증 완료. 지적하신 4가지 증상(리더 침묵·본명 못 알아들음·헛발화·팀 인지 부재) 전부 원인을 찾아 고쳤고, 기억·검색·지식·특기가 팀 방에서도 1:1과 같은 배선으로 붙습니다(하이퍼콜라보). 멘션 픽커·방 제목 자동 작명·rail 인원 배지까지 포함해 서버·웹 모두 실서버 반영 + 실동작 검증을 마쳤습니다. 시험 데이터는 전부 원상복구했습니다.


무엇이 문제였나 (방 67befdf6 실측)

그 방에서 벌어진 일은 전부 코드에서 원인이 확인됐습니다.

증상 원인
재우고나서(리더)가 한 마디도 안 함 자리에서 내려진(잠든) 상태라 설계상 침묵 — 그런데 방도 동료도 그걸 모름
"진소연은?" 하니 "여기 없어요"(마당) / "@진소연이 더 잘 압니다"(담담) 본명 진소연은 시스템 프롬프트 문장 속에만 있고, 동료 정보는 - @마당할머니 (말벗) 한 줄뿐 → 서로 누군지 모름
두 할머니가 같은 인사 복창 옛 1:N은 전원이 서로 안 보고 병렬로 답하는 "전문가 패널" 구조
말 같지 않은 발화 "전문영역 80%·다른 영역은 @멘션으로 연결·MECE·중복 금지" — 업무팀 프롬프트가 말벗 할머니에게 적용됨
팀이라는 인지 없음 팀 이름·지침(crew_groups.description)이 어떤 프롬프트에도 안 실림

무엇으로 바꿨나 — friends-room.ts

사회자 판정 → 순서대로 발화 → 뒷사람은 앞사람 말을 실제로 듣는다.

  1. 사회자 LLM이 턴마다 "누가 말할 차례인가"를 정합니다. 이름·본명·별명 호명을 알아듣고(각 친구의 본명 카드가 판정 재료), 인사엔 1~2명, "다들 어떻게 생각해?"엔 전원. 정규식 0.
  2. 말하는 친구의 프롬프트: 자기 페르소나 전문 + 같이 있는 친구들(본명 한 줄씩) + 자리 비운 친구("지금 잠들어 있다 — 소식을 지어내지 마라") + 팀 이름·지침 + 이번 턴 앞사람 발화 원문 + "같은 자리에서 말하는 법".
  3. 하이퍼콜라보: 크루별 기억 + 팀 원장, 크루 지식(벡터 검색), 턴당 1회 웹/장소 검색(결과는 "같이 찾아본 자료"로 전원 공유), 특기(SKILL:) 실행, 인용 대조(지어낸 상호 차단) — 전부 1:1과 같은 규칙.
  4. 업무팀 장치(MECE·directive·S²-MAD·80:20)는 친구 방에서 제거. 옛 1:Team 경로는 보존.

검증 (전부 실서버, 실측 발화)

함께 처리한 지시 (주무시기 전 피드백)

  1. 방 제목 = 무슨 대화 — 제목 함수 재작성: 사람 이름 제목("OO 외 2명")은 내용이 생기면 갈고, 이후엔 화제가 분명히 넘어간 전환점에만 LLM이 갱신(매 턴 아님). 실측: "재우고나서 외 2명" → "아이들과 주말 나들이".
  2. 🔴 부수 발견: gpt-5.6-luna는 추론 토큰이 max_tokens를 잠식해 30·80 예산이면 JSON이 중간에 잘려 조용히 실패 — 제목·검색판정·사회자 예산 전부 상향. (기존 첫-제목 생성도 이 병으로 죽어 있었습니다)
  3. rail 다인방 표시 — 겹침 스택 대신 리더 아바타 하나 + 우하단 인원 숫자 배지.
  4. 이름 표기 — 대표 표기는 name(211개 전원 고유·짧음)으로 통일돼 있음을 확인. nickname(문장형 소개)은 프로필 소개로만 쓰임. 방 헤더는 제목(=화제)+명단.
  5. 멘션 메커니즘 리서치 — 슬랙·디스코드·노션 전부 "픽커가 구조화 토큰을 심는" 방식이며 자유 문장을 정규식으로 이름 대조하는 서비스는 없습니다(오탐). 우리 구조가 그 최신 결과 같습니다: @픽커 토큰 = 결정론 라우팅, 자연어 호명 = 사회자 LLM. 화면(픽커 UI)도 이 결에 맞춰 구현했습니다.

남은 것 / 아침에 보실 것