Skip to content

[어드민] 소울 관리 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

LayerR-levelReview focus
Policy / RuleR2DM 불가 상태가 기존 Chat Thread를 숨기지 않고 읽기만 허용하는 정책을 출시 전 고정해야 한다.
Data / BackendR2차단 상태와 차단 사유 저장 위치, Published Chat Availability와 운영 차단 상태의 관계를 명확히 해야 한다.
User-facing SurfaceR1어드민 목록/상세의 필드 구성은 운영 피드백에 따라 출시 후 조정 가능하다.
Copy / Visual PresentationR1차단/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 가설

  1. 운영자가 소울 상태·연결 콘텐츠·DM 가능 여부를 한 화면에서 확인하면, 특정 소울의 운영 리스크 대응 시간이 줄어든다.
  2. 소울 차단을 수동 관리하고 차단 사유를 남기면, 긴급 운영 대응 후 맥락 복원이 가능해진다.
  3. DM 불가 상태에서도 기존 대화 기록을 유지하면, 유저의 과거 관계/기록 손실 없이 신규 리스크만 차단할 수 있다.

1.5 성공 지표

지표현재목표측정 방법
소울 조회 성공률미정운영자가 목록/검색/상세에서 대상 소울을 찾을 수 있음어드민 QA 시나리오
차단 처리 완결률미정차단 상태와 차단 사유가 함께 저장·표시됨어드민 QA 시나리오
DM 불가 정책 정합성미정기존 Chat Thread 조회 가능 + 신규/추가 채팅 차단앱/어드민 QA 시나리오
  • 메인 지표: 특정 소울을 닉네임으로 검색해 상세 상태 확인 및 차단 처리까지 완료 가능한지.
  • 가드레일 지표: DM 불가 처리 후 기존 Chat Thread/기존 대화 내용이 사라지지 않는지.

2. 타깃 사용자

2.1 주요 사용자

  • 운영자 / CS / Trust & Safety
    • 신고, 내부 검수, 긴급 대응 맥락에서 특정 소울의 현재 상태와 연결 콘텐츠를 확인한다.
    • 특정 소울의 DM 가능 여부를 수동으로 제한하고, 차단 사유를 남긴다.
  • 콘텐츠 운영 담당자
    • 소울이 어떤 에피소드/캐릭터와 연결되어 있는지 확인한다.
    • 연결 에피소드의 전체이용가/어른용 여부를 확인한다.

2.2 핵심 시나리오

  1. 운영자가 신고/검수 대상 소울의 닉네임을 검색해 상세 화면으로 진입하고, 현재 DM 가능 여부와 연결 에피소드 등급을 확인한다.
  2. 운영자가 특정 소울을 DM 불가 상태로 변경하고, 차단 사유를 입력해 이후 운영자가 같은 맥락을 확인할 수 있게 한다.
  3. 운영자가 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
    • 차단 여부
    • 차단 사유
    • 연결된 캐릭터 목록
    • 각 연결 캐릭터의 에피소드
    • 에피소드에서의 캐릭터 이름
    • 연결 에피소드의 전체이용가/어른용 여부
  • 운영 흐름:
    1. 운영자가 목록 또는 검색 결과에서 소울 상세로 진입한다.
    2. 운영자가 소울 기본 정보, 채팅 설정, 연결 캐릭터/에피소드, 등급 정보를 확인한다.
    3. 필요 시 운영자가 소울을 DM 불가/차단 상태로 변경한다.
    4. 차단 상태로 변경하는 경우 차단 사유를 입력한다.
    5. 상세 화면에서 현재 상태와 차단 사유를 확인할 수 있다.

소울 차단 / 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 전송/응답 생성을 막는다.
  • 성인/미성년 정책:
    • 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 핵심 지표

  1. 소울 조회 성공률: 운영자가 목록/검색/상세에서 대상 소울을 찾고 필요한 상태를 확인할 수 있는지.
  2. 차단 처리 성공률: 운영자가 차단 상태와 차단 사유를 저장하고 다시 조회할 수 있는지.
  3. DM 불가 정책 정합성: DM 불가 처리 후 기존 Chat Thread 조회는 유지되고, 신규/추가 채팅은 차단되는지.

5.2 로깅 이벤트

어드민 운영 이벤트는 기존 이벤트 그룹 재사용 여부 확인이 필요하다. 신규 이벤트명은 event-docs 확인 후 spec 단계에서 확정한다.

타입이름용도파라미터그룹상태
Eventview_soul_admin_list운영자가 소울 관리 목록을 조회admin_user_id, query?, result_countadmin 또는 studio🆕 후보
Eventview_soul_admin_detail운영자가 소울 상세를 조회admin_user_id, soul_meta_idadmin 또는 studio🆕 후보
Eventupdate_soul_dm_availability운영자가 DM 가능/불가 상태를 변경admin_user_id, soul_meta_id, from_state, to_state, has_reasonadmin 또는 studio🆕 후보

6. Ubiquitous Language

TermKoreanDefinitionDo Not Confuse WithPrimary Domain상태
Soul소울채팅 가능한 캐릭터 페르소나의 발행본. EpisodeCharacter.soulMetaId 링크로 캐릭터와 연결된다.에피소드 CharacterSoul기존
Character캐릭터에피소드 콘텐츠와 플레이에 사용되는 이야기 속 인물.유저 프로필, SoulEpisode 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.md
    • frontia-wiki/wiki/domains/soul/index.md
    • frontia-wiki/wiki/domains/soul/capabilities.md
    • frontia-wiki/wiki/domains/chat/capabilities.md
    • frontia-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: [소울 관리] 목록/상세/차단 사유 입력 화면 설계.