Appearance
[어드민] 소울 관리 PRD
Backlog grooming 단계의 산출물. 운영자가 자동 생성/발행된 소울을 조회하고, v1에서 필요한 최소 운영 상태를 관리하기 위한 요구사항을 정의한다. 화면별 컴포넌트·상태·인터랙션은 spec.md로 분리한다.
Status: draft
Created: 2026-06-10
Last updated: 2026-06-10
Linear Issue: DEE-368
Author: Dreamy
앱/웹/스튜디오: 어드민
Reversal Risk Summary
| Layer | R-level | Review focus |
|---|---|---|
| Policy / Rule | R2 | DM 불가 상태가 기존 Chat Thread를 숨기지 않고 읽기만 허용하는 정책을 출시 전 고정해야 한다. |
| Data / Backend | R2 | 차단 상태와 차단 사유 저장 위치, Published Chat Availability와 운영 차단 상태의 관계를 명확히 해야 한다. |
| User-facing Surface | R1 | 어드민 목록/상세의 필드 구성은 운영 피드백에 따라 출시 후 조정 가능하다. |
| Copy / Visual Presentation | R1 | 차단/DM 불가/성인 등급 표시 문구는 운영자가 이해 가능한 표현으로 빠르게 조정 가능하다. |
- R1 Low Reversal Risk: 출시 후 빠르게 조정 가능. 기본값 제안 후 진행 가능.
- R2 Medium Reversal Risk: 되돌릴 수 있지만 개발/데이터/운영 재작업 필요. 근거와 대안 기록 필요.
- R3 High Reversal Risk: 되돌림 비용이 크거나 정산/신뢰/계약/데이터 정합성에 영향. 별도 싱크/승인 필요.
1. 목표 및 배경
1.1 문제
- 사용자 정의 (segment): Frontia 운영자, CS/Trust & Safety 담당자, 콘텐츠 운영 담당자.
- 상황 (when, where): 자동 생성/발행된 소울 중 특정 소울의 채팅 가능 여부·연결 콘텐츠·제한 상태를 확인하거나 빠르게 DM 불가 처리해야 하는 상황.
- 불편 / 미충족 needs: 현재 소울을 운영 관점에서 조회·통제할 수 있는 어드민 화면이 부족해, 특정 소울의 상태 확인과 긴급 차단 판단이 파편화된다.
1.2 근거
- 시온 요구사항 확인 결과, v1은 소울을 어드민에서 직접 생성/수정하는 것이 아니라 소울과 엮인 기능을 Read 중심으로 확인하고, 필요 시 소울 차단을 수동 관리하는 범위로 정의됐다.
- Soul 도메인 기준, 소울은
EpisodeCharacter.soulMetaId로 에피소드 캐릭터와 연결되고, 채팅 가능 판단은 발행본 기준SoulMeta.chatAvailability/Published Chat Availability에 걸려 있다. - Chat 도메인 기준, Chat Thread는 한
(유저, Soul)쌍의 영속 1:1 채팅방이다. 따라서 DM 불가 상태에서도 기존 채팅방/대화 기록을 삭제하거나 숨기는 정책은 데이터·UX 영향이 크다.
1.3 아이디어 (해결 방향)
- v1은 어드민
[소울 관리]에서 목록 조회 → 닉네임 검색 → 상세 조회 → 소울 차단/DM 불가 상태 확인·변경 흐름을 제공한다. - 운영자가 직접 수정할 수 있는 상태는 우선
소울 차단 / DM 불가로 제한한다. DM 불가가 켜져도 기존 유저 채팅방은 목록과 대화 내용 조회를 유지하고, 신규/추가 채팅만 막는다.- 성인/미성년 접근 정책은 v1에서 자동 판정·제어하지 않고, 연결된 에피소드의
전체이용가/어른용여부를 확인 가능한 정보로 노출한다.
1.4 가설
- 운영자가 소울 상태·연결 콘텐츠·DM 가능 여부를 한 화면에서 확인하면, 특정 소울의 운영 리스크 대응 시간이 줄어든다.
- 소울 차단을 수동 관리하고 차단 사유를 남기면, 긴급 운영 대응 후 맥락 복원이 가능해진다.
- DM 불가 상태에서도 기존 대화 기록을 유지하면, 유저의 과거 관계/기록 손실 없이 신규 리스크만 차단할 수 있다.
1.5 성공 지표
| 지표 | 현재 | 목표 | 측정 방법 |
|---|---|---|---|
| 소울 조회 성공률 | 미정 | 운영자가 목록/검색/상세에서 대상 소울을 찾을 수 있음 | 어드민 QA 시나리오 |
| 차단 처리 완결률 | 미정 | 차단 상태와 차단 사유가 함께 저장·표시됨 | 어드민 QA 시나리오 |
| DM 불가 정책 정합성 | 미정 | 기존 Chat Thread 조회 가능 + 신규/추가 채팅 차단 | 앱/어드민 QA 시나리오 |
- 메인 지표: 특정 소울을 닉네임으로 검색해 상세 상태 확인 및 차단 처리까지 완료 가능한지.
- 가드레일 지표: DM 불가 처리 후 기존 Chat Thread/기존 대화 내용이 사라지지 않는지.
2. 타깃 사용자
2.1 주요 사용자
- 운영자 / CS / Trust & Safety
- 신고, 내부 검수, 긴급 대응 맥락에서 특정 소울의 현재 상태와 연결 콘텐츠를 확인한다.
- 특정 소울의 DM 가능 여부를 수동으로 제한하고, 차단 사유를 남긴다.
- 콘텐츠 운영 담당자
- 소울이 어떤 에피소드/캐릭터와 연결되어 있는지 확인한다.
- 연결 에피소드의 전체이용가/어른용 여부를 확인한다.
2.2 핵심 시나리오
- 운영자가 신고/검수 대상 소울의 닉네임을 검색해 상세 화면으로 진입하고, 현재 DM 가능 여부와 연결 에피소드 등급을 확인한다.
- 운영자가 특정 소울을 DM 불가 상태로 변경하고, 차단 사유를 입력해 이후 운영자가 같은 맥락을 확인할 수 있게 한다.
- 운영자가 DM 불가 처리 후에도 기존 유저 채팅방과 기존 대화 내용이 유지되는지 확인한다.
3. 핵심 기능 요구사항
3-1. 클라이언트 (앱/웹)
DM 불가 상태의 유저 채팅방 정책
- 주요 동작: 특정 소울이
DM 불가상태가 되어도 기존 유저의 Chat Thread는 목록에 남고, 기존 대화 내용은 조회 가능해야 한다. - 비즈니스 룰:
- 기존 Chat Thread 목록 유지.
- 기존 Chat Bubble / 대화 내용 조회 유지.
- 신규 DM 시작 차단.
- 기존 Chat Thread에서 유저의 새 메시지 전송 및 추가 응답 생성 차단.
DM 불가는 기존 기록 접근 차단이 아니라 신규/추가 채팅 차단 정책이다.
- 상태별 동작:
- 기존 thread 있음 + DM 불가: 목록과 대화 내용은 조회 가능, 입력/전송은 차단.
- 기존 thread 없음 + DM 불가: 신규 채팅방 생성/첫 발화 차단.
- DM 가능: 기존 Chat 정책 유지.
3-2. 어드민
[소울 관리] 전체 소울 목록 조회
- CRUD 범위: v1 목록은 Read only.
- 필수 표시 필드:
- 소울 프로필 이미지
- 소울 이름 / 닉네임 검색 대상 표시명
- 상태 메시지
- 현재 DM 가능 여부 /
Published Chat Availability - 차단 여부
- 연결 캐릭터/에피소드 존재 여부
- 연결 에피소드 등급 요약: 전체이용가 / 어른용
- 정렬/필터/페이지네이션:
- v1은 닉네임 검색 필수.
- 고급 필터, 복합 정렬, 대량 작업은 out of scope.
- 페이지네이션 방식은 spec/개발 설계에서 확정.
닉네임 검색
- 주요 동작: 운영자는 닉네임으로 소울을 검색할 수 있다.
- 비즈니스 룰:
- 검색 결과에서도 목록 기본 필드를 동일하게 표시한다.
- 부분 매칭/정확 매칭 기준은 spec 단계에서 확정한다.
- 상태별 동작:
- 검색 결과 없음: 빈 상태를 보여준다.
- 검색 오류: 재시도 가능한 오류 상태를 보여준다.
소울 개별 상세 조회
- CRUD 범위: v1 상세는 대부분 Read. 단, 차단/DM 불가 상태와 차단 사유는 운영자가 변경 가능하다.
- 필수 표시 필드:
- 프로필 이미지
- 이름
- 상태 메시지
- 소울 정보
- 채팅 상황 설정
- 소울 프로필 배경
- 현재 DM 가능 여부 /
Published Chat Availability - 차단 여부
- 차단 사유
- 연결된 캐릭터 목록
- 각 연결 캐릭터의 에피소드
- 에피소드에서의 캐릭터 이름
- 연결 에피소드의 전체이용가/어른용 여부
- 운영 흐름:
- 운영자가 목록 또는 검색 결과에서 소울 상세로 진입한다.
- 운영자가 소울 기본 정보, 채팅 설정, 연결 캐릭터/에피소드, 등급 정보를 확인한다.
- 필요 시 운영자가 소울을
DM 불가/차단 상태로 변경한다. - 차단 상태로 변경하는 경우 차단 사유를 입력한다.
- 상세 화면에서 현재 상태와 차단 사유를 확인할 수 있다.
소울 차단 / DM 불가 상태 관리
- CRUD 범위:
- 운영자는 소울 차단/DM 불가 상태를 변경할 수 있다.
- 차단 시 차단 사유를 저장할 수 있어야 한다.
- 필수 입력 필드:
- 차단 여부
- 차단 사유: 차단 상태일 때 필수
- 비즈니스 룰:
- 소울 차단은 v1에서 운영자 수동 제어로 관리한다.
- 시스템 자동 판정 차단/해제는 v1 범위가 아니다.
- 전체 변경 이력/변경자 로그는 v1 필수 요구사항이 아니다.
- 단, 차단 상태라면 현재 차단 사유는 남아 있어야 한다.
- 권한:
- 차단/해제 액션 권한은 spec 단계에서 운영자 role 기준으로 확정한다.
3-3. 백엔드 / 시스템 (필요시)
- 처리 룰:
- 어드민의 현재 DM 가능 여부 표시는 발행본 기준
Published Chat Availability를 기반으로 한다. - 운영 차단 상태가
Published Chat Availability와 별도 상태인지, 같은 상태를 변경하는지 개발 설계 전 확정해야 한다. - DM 불가 상태는 Chat Thread/Chat Bubble 삭제를 유발하지 않는다.
- DM 불가 상태는 신규 thread 생성 또는 기존 thread의 신규 user bubble 전송/응답 생성을 막는다.
- 어드민의 현재 DM 가능 여부 표시는 발행본 기준
- 성인/미성년 정책:
- v1은 연결 에피소드의 전체이용가/어른용 여부를 표시한다.
- v1은 성인/미성년 접근 정책을 새로 판정하거나 자동 차단하지 않는다.
3-4. 딥링크 / URL 구조 (해당하는 경우)
- 앱 유저-facing 신규 딥링크는 v1 PRD 범위가 아니다.
- 어드민 내부 URL 구조는 spec/개발 설계에서 확정한다.
- 참고: 앱에는 소울 프로필
/soul/:soulId, 챗 스레드/chat/threads?threadId=&soulId=딥링크가 존재하나, 본 PRD는 어드민 관리 화면이므로 신규 앱 딥링크를 정의하지 않는다.
3-5. Scope
포함 (In scope)
- 어드민
[소울 관리]진입점 - 전체 소울 목록 조회
- 닉네임 기반 검색
- 소울 상세 조회
- 상세 필드: 프로필 이미지, 이름, 상태 메시지, 소울 정보, 채팅 상황 설정, 소울 프로필 배경
- 연결 캐릭터/에피소드/에피소드 내 이름 표시
- 연결 에피소드의 전체이용가/어른용 여부 표시
- 현재 DM 가능 여부 / 차단 상태 표시
- 운영자 수동 소울 차단/DM 불가 변경
- 차단 사유 저장 및 표시
- DM 불가 상태에서 기존 Chat Thread/대화 내용 유지, 신규/추가 채팅 차단
제외 (Out of scope)
- 어드민에서 소울 직접 생성/저작/발행/삭제
- Studio SoulDraft 편집 플로우 변경
- 자동 차단/자동 해제 정책
- 전체 변경 이력/변경자/변경 시각 감사 로그 UI
- 변경 diff 조회
- 성인/미성년 접근 정책 신규 설계 또는 자동 판정
- 연결 에피소드/캐릭터 자체 수정
- 기존 Chat Thread 삭제/숨김/대화 내용 삭제
- 고급 필터, 복합 정렬, 대량 작업
- 신규 앱 딥링크/푸시 정책
4. 에러 처리 및 예외 상황
| 상황 | 처리 방향 |
|---|---|
| 검색 결과 없음 | 빈 상태를 보여주고 검색어 변경을 유도한다. |
| 소울이 삭제/비활성 상태 | 상세 조회 가능 여부와 표시 문구를 spec에서 확정한다. 단, soft-delete된 소울을 운영 조회에 포함할지는 결정 필요. |
| 연결 캐릭터 없음 | 연결 캐릭터 없음 상태를 표시한다. |
| 연결 에피소드 없음 | 연결 에피소드 없음 상태를 표시한다. |
| 연결 에피소드 등급 정보 없음 | 등급 정보 없음으로 표시하고, 자동 추정하지 않는다. |
| DM 불가 상태의 기존 thread 진입 | 기존 대화 내용은 보여주되, 신규 입력/전송은 차단한다. |
| DM 불가 상태의 신규 thread 생성 시도 | 생성/첫 발화를 차단하고 안내한다. 구체 문구는 spec에서 확정한다. |
| 차단 사유 없이 차단 저장 시도 | 차단 사유 입력을 요구한다. |
| 상태 저장 실패 | 상태가 변경되지 않았음을 안내하고 재시도 가능하게 한다. |
| 권한 없음 | 상태 변경 액션을 제한하고 권한 없음 안내를 보여준다. |
5. 데이터 분석
5.1 핵심 지표
- 소울 조회 성공률: 운영자가 목록/검색/상세에서 대상 소울을 찾고 필요한 상태를 확인할 수 있는지.
- 차단 처리 성공률: 운영자가 차단 상태와 차단 사유를 저장하고 다시 조회할 수 있는지.
- DM 불가 정책 정합성: DM 불가 처리 후 기존 Chat Thread 조회는 유지되고, 신규/추가 채팅은 차단되는지.
5.2 로깅 이벤트
어드민 운영 이벤트는 기존 이벤트 그룹 재사용 여부 확인이 필요하다. 신규 이벤트명은 event-docs 확인 후 spec 단계에서 확정한다.
| 타입 | 이름 | 용도 | 파라미터 | 그룹 | 상태 |
|---|---|---|---|---|---|
| Event | view_soul_admin_list | 운영자가 소울 관리 목록을 조회 | admin_user_id, query?, result_count | admin 또는 studio | 🆕 후보 |
| Event | view_soul_admin_detail | 운영자가 소울 상세를 조회 | admin_user_id, soul_meta_id | admin 또는 studio | 🆕 후보 |
| Event | update_soul_dm_availability | 운영자가 DM 가능/불가 상태를 변경 | admin_user_id, soul_meta_id, from_state, to_state, has_reason | admin 또는 studio | 🆕 후보 |
6. Ubiquitous Language
| Term | Korean | Definition | Do Not Confuse With | Primary Domain | 상태 |
|---|---|---|---|---|---|
| Soul | 소울 | 채팅 가능한 캐릭터 페르소나의 발행본. EpisodeCharacter.soulMetaId 링크로 캐릭터와 연결된다. | 에피소드 Character | Soul | 기존 |
| Character | 캐릭터 | 에피소드 콘텐츠와 플레이에 사용되는 이야기 속 인물. | 유저 프로필, Soul | Episode Content | 기존 |
| Episode | 에피소드 | 디렉터가 제작하고 플레이어가 플레이할 수 있는 스토리 콘텐츠 단위. | 특정 유저의 플레이 인스턴스 | Episode Content | 기존 |
| Chat Thread | 채팅방 | 한 (유저, Soul) 쌍의 영속 1:1 채팅방. 쌍당 1개. | 그룹/브로드캐스트 채팅 | Chat | 기존 |
| Published Chat Availability | 발행본 채팅 가능 여부 | SoulMeta 기준 현재 채팅 가능 여부. | SoulDraft.chatAvailability 설정값 | Soul | 기존 |
7. Open Questions
- [ ] 차단 상태와
Published Chat Availability의 관계 — 누구에게: BE/PM
운영 차단이SoulMeta.chatAvailability를 직접 바꾸는지, 운영 차단 상태를 별도 필드로 두고 최종 DM 가능 여부를 계산하는지 확정 필요. - [ ] 차단/해제 권한 role — 누구에게: PM/운영/BE
어떤 어드민 role이 소울 차단/해제를 수행할 수 있는지 확정 필요. - [ ] 차단 사유 입력 방식 — 누구에게: 운영/PM
자유 입력만 둘지, 사유 카테고리 + 자유 메모를 둘지 확정 필요. - [ ] soft-delete 소울 조회 포함 여부 — 누구에게: PM/BE
운영 목적상 삭제/비활성 소울까지 조회해야 하는지 확정 필요. - [ ] 기존 Chat Thread 조회 진입점 — 누구에게: PM/FE/BE
소울 상세에서 기존 유저별 채팅방 목록까지 바로 제공할지, 별도 Chat Admin 화면으로 연결할지 결정 필요. - [ ] 닉네임 검색 매칭 기준 — 누구에게: FE/BE
부분 매칭/정확 매칭, 대소문자/공백 처리, 검색 대상 필드 확정 필요. - [ ] 연결 에피소드 정렬 기준 — 누구에게: PM/FE
여러 에피소드에 연결된 경우 최신 발행순/이름순/상태순 등 표시 순서 확정 필요.
부록: 메타 정보
Required artifacts
- [x] Spec (
needs-spec) — 화면별 컴포넌트·상태·인터랙션 명세 - [x] Design (
needs-design) — Figma 화면 시안 - [x] QA scenarios (
needs-qa-scenarios) — 테스트 시나리오 - [ ] Migration plan (
needs-migration) — 데이터 구조 변경 시. 운영 차단 상태를 별도 저장한다면 필요할 수 있음. - [x] Tracking events (
needs-tracking) — 어드민 조회/상태 변경 이벤트 정의 필요 - [ ] 기타:
진행 패턴 (Refinement 단계 진입 후)
- [x] Pattern 1: Spec → Design
- [ ] Pattern 2: Design → Spec
- [ ] Pattern 3: Spec only
패턴은 Refinement 진입 시점의 가설이며, 진행 중 바뀔 수 있음. 모든 라벨이 떼지면 Refinement 종료.
Size & Risks
T-shirt Size
- Size: M
- Confidence: medium
- 추정 근거: 어드민 Read 화면은 범위가 작지만,
DM 불가가 앱 Chat Thread 생성/전송 정책과 연결되어 FE/BE/QA 영향이 있다.
주요 위험 요소
| 위험 | 영향 | 대응 |
|---|---|---|
| DM 불가를 기존 대화 접근 차단으로 구현 | 유저의 과거 관계/기록 접근 손상 | PRD와 spec에 “기존 thread/대화 조회 유지, 신규/추가 채팅 차단”을 명시 |
chatAvailability와 운영 차단 상태의 모델 혼동 | 상태 불일치, 앱/어드민 표시 불일치 | Open Question으로 분리 후 BE 설계에서 권위 필드 확정 |
| 변경 이력 미구현으로 감사 대응 부족 | 향후 Trust & Safety 확장 시 재작업 | v1은 현재 상태+차단 사유만, audit trail은 후속 범위로 명시 |
| 성인/미성년 정책을 v1에서 과도하게 자동화 | 범위 증가, 정책 검수 지연 | v1은 연결 에피소드 등급 표시만 포함 |
의존성
- 다른 작업: Chat Thread 생성/전송 차단 정책과 앱 채팅 입력 상태 처리
- 다른 팀: FE, BE, Design, QA
- 외부 요인: 없음
References
- 관련 데이터 대시보드: 없음
- 관련 위키 문서:
frontia-wiki/wiki/foundation/ubiquitous-language.mdfrontia-wiki/wiki/domains/soul/index.mdfrontia-wiki/wiki/domains/soul/capabilities.mdfrontia-wiki/wiki/domains/chat/capabilities.mdfrontia-wiki/wiki/client/navigation-routing-deeplinks.md
- 관련 Linear 이슈:
- Slack source:
- 시온 요구사항 답변 스레드
🔍 검토 필요
🚨 결정 필요 (큰 결정)
Published Chat Availability를 직접 변경할지, 운영 차단 상태를 별도 필드로 둘지 확정 필요.- DM 불가 상태에서 앱 채팅방 입력 영역/전송 버튼/안내 문구를 어떻게 처리할지 spec에서 확정 필요.
⚠️ 추정 (정보 부족하지만 진행)
- 어드민 진입점 라벨은
[소울 관리]로 가정했다. - 전체 소울 목록의 기본 정렬은 아직 정하지 않았다.
- 차단 사유는 v1에서 필수 자유 입력으로 가정했다.
❓ 외부 agent 호출 필요
- 코드 agent: 현재 SoulMeta/SoulDraft/chatAvailability 저장 구조와 어드민 API 유무 확인.
- 코드 agent: DM 불가 상태에서 Chat Thread 조회/생성/메시지 전송 차단 지점 확인.
- 디자이너 / Figma:
[소울 관리]목록/상세/차단 사유 입력 화면 설계.