## 설명 - 백엔드 PR #134에서 SYSTEM 메시지 렌더링 계약이 명문화됨: `content`는 저장 시점 닉네임 fallback이고, 클라이언트가 `metadata.eventType + userId`로 현재 멤버 정보를 lookup해 본문을 재구성하는 게 권장. - 회원 탈퇴(PR #131) 도입으로 옛 닉네임이 그대로 박혀 보이는 비일관 문제가 발생 가능 — 렌더링 시점에 현재 멤버맵으로 다시 조립해 해결. ## 기대 동작 - `src/lib/chat.ts`의 SYSTEM 분기에서 `msg.metadata.eventType`에 따라 본문을 조립: - `MEMBER_JOINED` → "{nickname}님이 입장했어요" - `MEMBER_LEFT` → "{nickname}님이 방을 나갔어요" - `MEMBER_KICKED` → "{targetNickname}님이 추방되었어요" - `HOST_DELEGATED` → "방장이 {newHostNickname}님으로 변경되었어요" - 닉네임은 metadata의 userId(예: `previousHostUserId`, `newHostUserId`)로 현재 방 멤버맵을 lookup해 사용. - 멤버맵에 없으면 "(알 수 없음)" 폴백, 최종 폴백은 기존 `msg.content` 유지. - LEFT 멤버를 포함한 멤버맵을 사용하면 lookup 적중률이 올라가므로 후속 이슈(LEFT 응답 반영)와 함께 동작 확인. ## 참고 - 백엔드 PR: https://github.com/uttae/backend-server/pull/134 - 관련 파일: `src/lib/chat.ts:863`, `src/types/chat.ts` - 백엔드 ADR: `docs/ai/decisions/20260607-1636-system-message-metadata-rendering.md`
설명
content는 저장 시점 닉네임 fallback이고, 클라이언트가metadata.eventType + userId로 현재 멤버 정보를 lookup해 본문을 재구성하는 게 권장.기대 동작
src/lib/chat.ts의 SYSTEM 분기에서msg.metadata.eventType에 따라 본문을 조립:MEMBER_JOINED→ "{nickname}님이 입장했어요"MEMBER_LEFT→ "{nickname}님이 방을 나갔어요"MEMBER_KICKED→ "{targetNickname}님이 추방되었어요"HOST_DELEGATED→ "방장이 {newHostNickname}님으로 변경되었어요"previousHostUserId,newHostUserId)로 현재 방 멤버맵을 lookup해 사용.msg.content유지.참고
src/lib/chat.ts:863,src/types/chat.tsdocs/ai/decisions/20260607-1636-system-message-metadata-rendering.md