# 유저-크리에이터 채팅 날짜 구분선 PRD ## 문서 정보 | 항목 | 내용 | |---|---| | 문서 상태 | 구현 완료 / 실서버·접근성 QA 대기 | | 작성일 | 2026-10-16 | | 최종 수정일 | 2026-10-16 | | 대상 제품 | SodaLive iOS 유저-크리에이터 DM 채팅 | | 작성자·결정권자 | 작성: 에이전트 / 제품 결정: 사용자, 6차 인터뷰 완료 | | 관련 API Contract | 해당 없음. 기존 메시지 timestamp 활용을 전제로 하며 API 변경 요청 없음 | | 관련 구현 계획 | [plan-task.md](plan-task.md), P1-T1·T2 구현 완료, P1-GATE 외부 조건 대기 | | 관련 review | [Phase 1 리뷰](reviews/phase1-chat-date-separators.md) | ### 요구사항 상태 | 상태 | 의미 | |---|---| | 확정 | 사용자가 확인한 목표 또는 현재 코드에서 확인한 사실 | | 미결 | 인터뷰에서 결정해야 하며 임의로 구현 기준 삼지 않음 | | 제외 | 이번 문서 작성 세션의 제외 범위 | ## 1. 개요 유저-크리에이터 DM 대화에서 메시지 사이에 날짜 구분 항목을 표시해 사용자가 메시지가 오간 날짜를 파악할 수 있게 한다. 날짜 경계는 채팅을 보는 사람의 기기 현재 시간대를 따른다. 날짜 표기의 언어·지역은 앱 언어 설정에 대응하는 locale을 따르며, 항상 연·월·일·요일을 포함하고 오늘·어제 같은 상대 날짜 표현은 사용하지 않는다. ## 2. 문제와 배경 - **확정:** 유저-크리에이터 채팅에는 날짜 표시가 없어 메시지가 언제 오갔는지 파악하기 어렵다. - **확정:** 다른 채팅 앱과 같이 대화 중 날짜 구분선 또는 항목을 추가하는 것이 요청된 개선 방향이다. - **문서 작성 판단:** 별도 정량 계측 목표는 두지 않고, 날짜별 메시지 구분과 아래 기능 수용 사례로 해결 여부를 판정한다. 사용자가 별도 계측 기능을 요청한 것은 아니다. ## 3. 목표 ### 3.1 제품 목표 - 메시지 대화 흐름에서 날짜별 구분을 제공한다. - 날짜 표기는 앱 언어 설정의 locale을 따른다. 현재 앱 매핑인 한국어 `ko_KR`, 영어 `en_US`, 일본어 `ja_JP`에 맞는 순서와 표현으로 항상 연·월·일·요일을 표시한다. 오늘·어제로 대체하지 않는다. ### 3.2 사용자 경험 목표 - 대화 내 날짜 구분 항목으로 메시지의 날짜를 확인할 수 있다. - 기존 시간순 대화 열람과 이전 메시지 로드 흐름을 유지한다. ## 4. 이번 세션의 제외 범위 - 제품 코드, 테스트, 미리보기, 목업, UI 설계 변경을 하지 않는다. - 위 문서 전용 제한은 초기 인터뷰 당시 범위다. 후속 사용자의 `구현 진행` 요청에 따라 확정 계획 내 코드·테스트·프로젝트 등록 및 검증을 수행한다. 기존 기록은 당시 이력으로 보존한다. - 빌드, 의존성 변경, 커밋을 하지 않는다. - 초기 인터뷰 세션에서는 `plan-task.md`를 작성하지 않았다. 요구사항 확정 후 2026-10-16 사용자 요청에 따라 현재 PRD와 같은 폴더에 구현 계획만 추가한다. 기능 구현은 이번 범위에 포함하지 않는다. - API Contract 문서는 작성하지 않는다. API 변경 요청은 없고 기존 timestamp가 존재한다. - 기존 7월 DM 문서와 9월 수신자 문서는 별개 선행 기능 문서로 참조만 하며 수정하지 않는다. - 향후 기능 범위에서도 날짜 고정 헤더와 음성 메시지 표시 추가는 제외한다. 음성 표시 제외는 기존 TEXT 표시 범위를 유지하기 위한 에이전트의 최소 범위 판단이며, 사용자 별도 결정으로 간주하지 않는다. ## 5. 대상 사용자와 흐름 | 사용자 | 목표 | 주요 작업 | |---|---|---| | SodaLive 유저-크리에이터 DM 사용자 | 메시지가 오간 날짜 파악 | 대화 진입, 메시지와 날짜 구분 항목 열람, 과거 메시지 탐색 | ### 핵심 흐름 1. 사용자가 유저-크리에이터 DM 대화에 진입한다. 2. 메시지를 시간순으로 읽으며 각 날짜의 구분 항목을 확인한다. 3. 위로 스크롤해 과거 메시지를 로드하고 날짜별 흐름을 이어서 확인한다. ## 6. 현재 구현에서 확인한 사실 - 대화 화면은 `TEXT` 메시지만 표시하며 `createdAt` 기준 오름차순으로 정렬된 메시지 목록을 사용한다. - 가장 첫 메시지가 나타날 때 이전 페이지를 로드하고, 화면 높이보다 콘텐츠가 짧으면 추가 로드를 시도한다. - `UserCreatorChatDisplayMessage.createdAt`은 `Int64`이며 서버 메시지 timestamp를 보존한다. - 보류 메시지는 현재 epoch milliseconds로 생성되고, ACK 수신 시 서버 메시지로 교체된다. 실패한 보류 메시지도 존재할 수 있다. - 각 텍스트 메시지 항목은 `createdAt`을 epoch milliseconds로 해석해 시각을 표시한다. - 기존 메시지 시각은 `Date.convertDateFormat`을 통해 기기 현재 시간대와 자동 갱신 locale을 사용한다. 새 날짜 구분선은 기기 현재 시간대와 앱 언어 locale을 따르기로 확정했다. 기존 메시지별 시각의 locale까지 변경하기로 결정한 것은 아니다. - 앱 언어 설정은 별도로 존재하며 한국어 `ko_KR`, 영어 `en_US`, 일본어 `ja_JP` locale로 매핑한다. 새 날짜 구분선은 기기 언어·지역을 직접 따르는 대신 이 앱 언어 정책을 따른다. ## 7. 기능 요구사항 | ID | 상태 | 요구사항 | 수용 기준 | 추적 | |---|---|---|---|---| | DATE-001 | 확정 | 유저-크리에이터 DM 대화에 메시지 사이 날짜 구분 항목을 제공한다. | 대화에서 날짜 단위의 구분을 인식할 수 있으며, 삽입 위치는 DATE-005를 따른다. | 목표, OQ-004, DEC-009 | | DATE-002 | 확정 | 날짜 표기의 언어·지역은 앱 언어 설정의 locale을 따른다. | 한국어는 `ko_KR`, 영어는 `en_US`, 일본어는 `ja_JP` 형식으로 표시한다. 기기 설정과 앱 언어가 다르면 앱 언어를 우선하며 시스템 기본 선택도 기존 앱 언어 해석 정책을 따른다. 포함 필드는 DATE-004를 따른다. | OQ-002, OQ-003, DEC-007, DEC-008 | | DATE-003 | 확정 | 날짜 구분과 일자 경계는 채팅을 보는 사람의 기기 현재 시간대를 따른다. | 기기 현지 날짜가 바뀌면 서로 다른 날짜로 구분한다. 같은 메시지도 열람자의 시간대에 따라 다른 날짜에 속할 수 있으며 한국 시간으로 고정하지 않는다. | OQ-001, DEC-006 | | DATE-004 | 확정 | 날짜 구분 항목은 항상 연·월·일·요일을 표시한다. 오늘·어제 같은 상대 날짜 표현은 사용하지 않는다. | 한국어 예시는 `2026년 10월 16일 금요일`이다. 오늘과 어제에 해당하는 날짜도 같은 포함 필드를 유지하며, 영어·일본어는 동일 필드를 해당 locale의 순서와 표현으로 표시한다. 한국어 순서와 접미사를 다른 언어에 강제하지 않는다. | OQ-003, DEC-008 | | DATE-005 | 확정 | 현재 불러온 첫 메시지 위와 인접 메시지의 현지 날짜가 바뀌는 지점에 날짜 구분 항목을 표시한다. | 같은 날짜의 연속 메시지 사이에는 반복하지 않는다. 과거 페이지 병합 후 같은 날짜가 이어지면 페이지 경계의 구분선은 중복하지 않고 합쳐진 날짜 묶음의 첫 메시지 위에만 남긴다. 메시지가 없으면 날짜 항목도 표시하지 않는다. | OQ-004, DEC-009 | | DATE-006 | 확정 | 날짜 구분 항목은 대화 목록 안에서 메시지와 함께 스크롤된다. | 화면 밖으로 스크롤되면 보이지 않고, 화면 상단에 고정하거나 별도 날짜 헤더로 중복 표시하지 않는다. | OQ-005, DEC-010 | | DATE-007 | 확정 | 전송 중·실패 메시지는 로컬 생성 시각으로 날짜를 구분하고, 서버 메시지로 확정되면 서버 createdAt으로 날짜 구분을 갱신한다. | ACK 전후 현지 날짜가 달라지면 서버 날짜 묶음으로 이동한다. 이후 DATE-005를 다시 적용해 비어버린 날짜 항목과 중복 날짜 항목을 남기지 않는다. 실패 상태만으로는 로컬 생성 날짜를 바꾸지 않는다. | OQ-006, DEC-012 | | DATE-008 | 확정, 에이전트 범위 판단 | 기존 화면에 표시하는 TEXT 메시지를 대상으로 날짜 구분을 추가한다. | 표시하지 않는 VOICE 메시지만 있는 날짜에는 날짜 항목을 만들지 않는다. 날짜 구분을 위해 음성 표시 기능을 새로 추가하지 않는다. 보류·실패 TEXT의 날짜 처리는 DATE-007을 따른다. | OQ-007, DEC-011 | ## 8. 기술 제약과 확인 범위 - 현재 대화 화면 파일: `SodaLive/Sources/V2/Main/Chat/UserCreatorChat/UserCreatorChatRoomView.swift` - 표시 메시지 모델: `SodaLive/Sources/V2/Main/Chat/UserCreatorChat/Models/UserCreatorChatDisplayMessage.swift` - 정렬, pagination 병합, 보류 메시지 및 ACK 교체: `SodaLive/Sources/V2/Main/Chat/UserCreatorChat/UserCreatorChatRoomViewModel.swift` - 메시지별 시각 표시: `SodaLive/Sources/V2/Main/Chat/UserCreatorChat/Components/UserCreatorChatTextMessageItemView.swift` - 기존 날짜 formatter: `SodaLive/Sources/Extensions/DateExtension.swift` - 앱 언어 locale 정책: `SodaLive/Sources/Settings/Language/Services/LanguageService.swift` - 현재 확인된 timestamp는 milliseconds 단위다. 새 날짜 구분선은 기기 현재 시간대와 앱 언어 locale에 따라 항상 연·월·일·요일을 표시한다. 기존 메시지별 시각 formatter 변경으로 범위를 확장하지 않는다. - 초기 인터뷰에서는 기술 설계를 확정하지 않았다. 후속 구현 계획 요청에 따라 기술 구성과 검증 절차를 [plan-task.md](plan-task.md)에 정리했다. API 변경은 없으며 계획 작성은 기능 구현 착수 승인이 아니다. - 구현 시 세부 색상, 글꼴, 간격, 장식선 여부와 컴포넌트 분리는 기존 채팅 디자인 및 저장소 관례 안에서 구현자가 정한다. 이 문서는 해당 시각 상세를 사용자 확정 사항으로 간주하지 않으며, 목업이나 제품 코드를 만들지 않는다. ## 9. 성공 기준 ### 9.1 문서 완료 기준, 이번 세션 - [x] 초기 PRD가 샘플의 관련 구조를 따르고 확정 사실과 미결 결정을 구분한다. - [x] 요구사항, 기술 제약, 성공 기준, Open Questions, 추적성, Decision Log를 기록한다. - [x] 요청된 경로에 PRD 한 파일만 작성하고 계획 문서는 만들지 않는다. - [x] 인터뷰로 중요한 미결 사항을 해소하고 결정 근거를 누적한다. - [x] 확정 요구사항, 제외 범위, 수용 사례를 사용자가 확인할 수 있게 정리한다. 위 문서 완료 체크는 초기 인터뷰 세션의 이력이다. 후속 사용자 요청으로 구현 계획 문서를 추가한 현재 범위는 DEC-013과 `plan-task.md`를 따른다. ### 9.2 기능 수용 기준, 전체 사용자 흐름의 최종 QA 대기 - [ ] 확정된 날짜 경계에 따라 대화 중 날짜 구분 항목이 표시된다. (`DATE-001`, `DATE-003`, `DATE-005`) - [ ] 날짜 문자열이 합의된 locale 및 표시 형식을 따른다. (`DATE-002`, `DATE-004`) - [ ] 첫 메시지 위와 날짜 변경 지점에만 구분선이 표시되고, 같은 날짜의 과거 페이지를 붙이면 중복 날짜 항목이 남지 않는다. 빈 목록에는 날짜 항목이 없다. (`DATE-005`) - [ ] 초기 로드, 과거 페이지 추가, 보류 메시지의 ACK 교체를 포함해 합의한 메시지 범위에서 날짜 구분이 일관된다. (`DATE-005`~`DATE-008`) - [ ] 날짜 구분 항목은 메시지와 함께 스크롤되며 상단에 고정되지 않는다. 기존 화면에서 제외된 메시지 유형 때문에 빈 날짜 항목이 생기지 않는다. (`DATE-006`, `DATE-008`) 위 기능 수용 기준의 미완료 표시는 초기 문서 작성 이력 및 아직 남은 실제 대화 QA를 반영한다. 후속 구현에서 날짜 계산 자동 검사와 컴포넌트 렌더링·두 타깃 빌드는 통과했지만, 전체 대화 사용자 흐름의 수용 완료와 동일하게 처리하지 않는다. 현재 증거와 남은 항목은 계획 및 리뷰 문서에 기록한다. ### 9.3 기능 검증 사례 날짜 계산·formatter 스냅샷 자동 검사는 통과했다. 실제 DM의 페이지 로드·ACK·스크롤 상호작용은 인증된 테스트 방 부재로 대기하며, 원본 날짜 컴포넌트의 네이티브 렌더링만 별도 확인했다. | 사례 | 기대 결과 | 요구사항 | |---|---|---| | 빈 목록 / 메시지 1개 | 날짜 항목 없음 / 첫 메시지 위에 해당 날짜 항목 1개 | DATE-005 | | 같은 날 연속 메시지 / 현지 자정 전후 메시지 | 날짜 묶음당 첫 메시지 위에 1개 / 날짜 변경 시 새 항목 | DATE-003, DATE-005 | | 과거 페이지가 같은 날짜로 연결됨 / 다른 날짜로 연결됨 | 합쳐진 같은 날짜 묶음에는 1개만 유지 / 실제 날짜 경계에만 추가 | DATE-005 | | 앱 한국어·영어·일본어, 기기 언어·지역과 불일치 | 앱 locale 형식으로 연·월·일·요일 모두 표시, 기기 시간대로 날짜 판정 | DATE-002~004 | | 오늘·어제·과거 연도 메시지 | 상대 날짜로 대체하거나 연도·요일을 생략하지 않음 | DATE-004 | | 전송 중 / 실패 / 같은 날짜의 서버 확정 | 로컬 생성 날짜 유지 / 로컬 생성 날짜 유지 / 같은 날짜 묶음 유지 | DATE-007 | | 서버 확정 시 날짜가 변경됨 | 서버 createdAt 기준으로 다시 구분, 기존 날짜 묶음이 비면 항목 제거, 새 묶음의 날짜 항목 중복 없음 | DATE-005, DATE-007 | | 날짜 항목을 화면 밖으로 스크롤 / VOICE만 있는 날짜 | 상단 고정 표시 없음 / 빈 날짜 항목 생성 없음 | DATE-006, DATE-008 | ## 10. Open Questions | ID | 상태 | 결정 필요 사항 | 결정 시 확인할 내용 | 연결 요구사항 | |---|---|---|---|---| | OQ-001 | 해결 | 날짜 구분의 timezone 및 하루 경계는 무엇을 기준으로 할까? | 기기 현재 시간대 기준으로 확정. 첫 질문의 1번 선택, DEC-006 | DATE-003, DATE-005 | | OQ-002 | 해결 | locale은 기기 언어+지역과 앱 언어 중 무엇을 따를까? | 앱 언어 설정 기준으로 확정. 두 번째 질문의 1번 선택, DEC-007 | DATE-002 | | OQ-003 | 해결 | 날짜 문구에 연도·요일을 포함할까? 오늘·어제는 별도 표현할까? | 항상 연·월·일·요일을 표시하고 상대 날짜 표현은 사용하지 않기로 확정. 세 번째 질문의 1번 선택, DEC-008 | DATE-002, DATE-004 | | OQ-004 | 해결 | 구분 항목은 어떤 경계에 삽입할까? | 현재 불러온 첫 메시지 위와 날짜 변경 지점에 표시하고 같은 날짜의 페이지 경계 중복은 제거. 네 번째 질문의 1번 선택, DEC-009 | DATE-001, DATE-005 | | OQ-005 | 해결 | 구분 항목은 대화 안의 정적 항목인가, 스크롤 중 고정 표시인가? | 메시지와 함께 스크롤하고 상단에 고정하지 않기로 확정. 다섯 번째 질문의 1번 선택, DEC-010 | DATE-006 | | OQ-006 | 해결 | 보류·실패 메시지와 ACK 뒤 서버 timestamp가 달라 날짜가 바뀌면 어떻게 할까? | 전송 중·실패는 로컬 생성 시각, 전송 완료 후 서버 시각으로 날짜를 다시 구분. 여섯 번째 질문의 1번 선택, DEC-012 | DATE-007 | | OQ-007 | 해소, 에이전트 범위 판단 | 날짜 구분은 TEXT 이외의 메시지 유형에도 적용할까? | 기존 TEXT 표시 범위를 유지하고 VOICE 표시 추가는 제외한다. 요청하지 않은 신규 메시지 표시를 만들지 않는 최소 범위 판단이며 사용자 별도 결정 아님, DEC-011 | DATE-008 | 현재 열린 제품 결정은 없다. OQ-007의 범위 유지와 시각 상세의 구현자 위임은 사용자 답변과 구별된 에이전트 판단이다. 후속 사용자 요청으로 구현했으며, 현재 대기는 제품 결정이 아닌 실서버·접근성 QA 환경이다. ## 11. 요구사항 추적성 | 요구사항 | 근거 / 미결 결정 | 문서 완료 증거 | 기능 검증 | |---|---|---|---| | DATE-001 | 사용자 확인 목표, DEC-009 | 문제, 목표, 요구사항과 확정 삽입 규칙 기록 | P1-T2: 첫 메시지·날짜 변경 자동 검사와 컴포넌트 표시 확인, 실제 DM 대기 | | DATE-002 | OQ-002, DEC-007 | 앱 언어 locale 기준 반영 | P1-T1·T2: ko/en/ja 자동 검사 및 환경 주입 코드 확인, 실제 앱 System 설정 QA 대기 | | DATE-003 | OQ-001, DEC-006 | 열람자 기기 시간대 기준을 요구사항과 결정 기록에 반영 | P1-T1·T2: 서울/UTC 경계, LA DST 자동 검사 통과 | | DATE-004 | OQ-003, DEC-008 | 연·월·일·요일 필수 및 상대 날짜 표현 제외 반영 | P1-T1: 오늘·어제·과거 연도 전체 필드 검사 통과 | | DATE-005 | OQ-004, DEC-009 | 첫 메시지, 날짜 전환, 과거 페이지 중복 제거 규칙 반영 | P1-T2: 빈/단일/연속·prepend 스냅샷 검사 통과, 실제 paging 대기 | | DATE-006 | OQ-005, DEC-010 | 목록 내부에서 함께 스크롤하고 고정하지 않는 동작 반영 | P1-T2: 비고정 구조 코드 리뷰 승인, 실제 스크롤 제스처 QA 대기 | | DATE-007 | OQ-006, DEC-012 | 전송 상태별 시각 출처와 서버 확정 후 날짜 재구분 반영 | P1-T2: pending/failed/server 교체 스냅샷 검사 통과, 실제 ACK 대기 | | DATE-008 | OQ-007, DEC-011 | 기존 TEXT 표시 범위를 유지하는 에이전트 판단 명시 | P1-T2: VOICE-only·TEXT 혼합 날짜 검사 통과 | ## 12. Decision Log | 날짜 | ID | 상태 | 결정 또는 확인 사실 | 근거 | 영향 | |---|---|---|---|---|---| | 2026-10-16 | DEC-001 | 확정 | 유저-크리에이터 채팅에서 날짜가 없어 메시지 시점을 파악하기 어렵고, 대화에 날짜 구분 항목을 추가한다. | 사용자 확인 | DATE-001, DATE-002 | | 2026-10-16 | DEC-002 | 확정 | 이번 세션은 인터뷰와 문서 작성만 수행한다. 제품 코드, 빌드, 의존성, 커밋은 수행하지 않는다. 초기 PRD 이후 인터뷰 결과를 같은 문서에 보강하고, 계획 문서는 필요 시 요구사항 확정 후 작성한다. | 사용자의 문서 전용 지시, 저장소 문서 정책에 따른 에이전트 작업 방식 | 문서 상태 및 이번 세션 Non-Goals | | 2026-10-16 | DEC-003 | 확정 | 현 단계에서 별도 API Contract 문서는 만들지 않는다. 기존 timestamp가 있으며 API 변경이 요청되지 않아 최소 문서로 진행한다. | 확인된 모델과 저장소 최소 문서 정책에 따른 에이전트 판단, 사용자 별도 결정 아님 | 기술 제약 | | 2026-10-16 | DEC-004 | 확정 | 기존 7월 DM 문서와 9월 수신자 문서는 선행 기능 맥락으로 참조하고, 이번 신규 날짜 구분선 요구사항은 별도 PRD로 관리한다. | 기존 문서 범위 확인 및 에이전트 문서 구성 판단, 사용자 별도 결정 아님 | 이번 세션 Non-Goals | | 2026-10-16 | DEC-005 | 미결 | timezone, locale 출처, 날짜 필드와 표현, 삽입 경계, 고정 여부, ACK 처리, 메시지 유형 범위는 미확정이다. | 사용자 인터뷰 전 | OQ-001~007, DATE-003~008 | | 2026-10-16 | DEC-006 | 확정 | DEC-005 중 timezone 결정을 해소한다. 날짜 경계는 채팅을 보는 사람의 기기 현재 시간대를 따르고, 한국 시간으로 고정하지 않는다. locale 출처 등 나머지 사항은 미결이다. | 첫 인터뷰에서 사용자가 1번 선택 | DATE-003, OQ-001 | | 2026-10-16 | DEC-007 | 확정 | DEC-005와 DEC-006에 남은 locale 출처 결정을 해소한다. 날짜 구분선은 앱 언어 설정의 locale을 따른다. 현재 앱 정책인 한국어 `ko_KR`, 영어 `en_US`, 일본어 `ja_JP`를 적용한다. 기기 시간대 기준은 유지하며 포함 필드와 상대 날짜 표현은 아직 미결이다. | 두 번째 인터뷰에서 사용자가 1번 선택 | DATE-002, OQ-002 | | 2026-10-16 | DEC-008 | 확정 | DEC-005와 DEC-007에 남은 포함 필드와 상대 날짜 표현 결정을 해소한다. 항상 연·월·일·요일을 앱 언어 locale에 맞게 표시하고 오늘·어제 표현은 사용하지 않는다. 삽입 경계, 표시 방식, ACK 처리와 메시지 유형 범위는 아직 미결이다. | 세 번째 인터뷰에서 사용자가 1번 선택 | DATE-004, OQ-003 | | 2026-10-16 | DEC-009 | 확정 | DEC-005와 DEC-008에 남은 삽입 경계 결정을 해소한다. 현재 불러온 첫 메시지 위와 날짜가 바뀌는 지점에 표시하고 같은 날짜의 연속 메시지에는 반복하지 않는다. 과거 페이지를 붙여도 같은 날짜 구분선은 중복하지 않는다. 빈 목록에 날짜 항목을 만들지 않는 것은 이 규칙에 따른 에이전트의 파생 기준이다. | 네 번째 인터뷰에서 사용자가 1번 선택 | DATE-001, DATE-005, OQ-004 | | 2026-10-16 | DEC-010 | 확정 | DEC-005 등에 남은 고정 여부를 해소한다. 날짜 구분 항목은 메시지와 함께 스크롤되며 화면 상단에 고정하지 않는다. | 다섯 번째 인터뷰에서 사용자가 1번 선택 | DATE-006, OQ-005 | | 2026-10-16 | DEC-011 | 확정, 에이전트 범위 판단 | 기존 TEXT 표시 범위를 유지하며 VOICE 메시지 표시 추가는 제외한다. 날짜 그룹은 실제 표시 대상 메시지를 기준으로 하므로 숨겨진 메시지만 있는 날짜에 빈 날짜 항목을 만들지 않는다. 기존 화면의 표시 유형을 확장하라는 요청이 없어 해소한 항목으로, 사용자에게 별도 승인받은 결정은 아니다. | 기존 View의 TEXT 필터와 최소 변경 원칙 | DATE-008, OQ-007 | | 2026-10-16 | DEC-012 | 확정 | DEC-005 등에 남은 ACK 날짜 처리를 해소한다. 전송 중·실패는 로컬 생성 시각, 전송 완료 후는 서버 확정 시각을 사용한다. 날짜가 달라지면 날짜 묶음을 다시 계산하고 DATE-005에 따라 빈 날짜 및 중복 날짜 항목을 남기지 않는다. | 여섯 번째 인터뷰에서 사용자가 1번 선택 | DATE-005, DATE-007, OQ-006 | | 2026-10-16 | DEC-013 | 확정 | 앞선 문서 전용 인터뷰 세션의 계획 작성 보류(DEC-002)는 당시 범위의 기록으로 보존한다. 사용자의 최신 명시 요청에 따라 이번 범위는 `plan-task.md` 작성과 PRD 연결 및 추적성 갱신으로 변경하며, 기능 구현은 계속 제외한다. | 사용자 직접 요청, 문서 정책에 따른 인터뷰 완료 후 계획 작성 | `plan-task.md`, DATE-001~008 | | 2026-10-16 | DEC-014 | 확정 | 후속 사용자 요청 `구현 진행`, `ulw`에 따라 확정 계획 구현과 검증을 시작한다. 문서 전용 제한을 해제하되 제품 요구사항은 바꾸지 않는다. | 사용자 직접 요청 | P1-T1, P1-T2, P1-GATE | ## 13. 문서 검증 기록 - 2026-10-16: 문서 정책과 PRD 샘플을 읽고 초기 요구사항을 기록했다. 기존 대화 View, 표시 모델, ViewModel, 메시지 시각 컴포넌트, 날짜 extension과 언어 서비스의 해당 동작을 읽어 현재 사실과 신규 제품 결정을 분리했다. - 제품 코드와 프로젝트 설정은 수정하지 않았다. 문서만 작성하므로 빌드, 자동 테스트, 앱 실행 검증은 수행하지 않았다. 날짜 구분선 기능은 미구현이며 인터뷰 진행 중이다. - 2026-10-16, 인터뷰 1차: 사용자 답변 `1`을 기기 시간대 선택으로 반영했다. 개요, 현재 동작과 신규 결정 구분, DATE-003, OQ-001, 추적표, Decision Log의 일치 여부를 문서 검색으로 확인한다. 제품 코드는 변경하지 않는다. - 2026-10-16, 인터뷰 2차: 사용자 답변 `1`을 앱 언어 설정 선택으로 반영했다. 개요, 목표, 기존 동작과 신규 결정 구분, DATE-002, OQ-002, 기술 제약, 추적표, DEC-007의 정합성을 문서 검색으로 확인한다. 기존 메시지별 시각 표시 변경은 추가하지 않았다. - 2026-10-16, 인터뷰 3차: 사용자 답변 `1`을 항상 연·월·일·요일 표시로 반영했다. 개요, 목표, DATE-002·004, 기술 제약, OQ-003, 추적표와 DEC-008의 정합성을 문서 검색으로 확인한다. 코드 변경, 빌드 및 앱 실행 검증은 수행하지 않는다. - 2026-10-16, 인터뷰 4차: 사용자 답변 `1`을 첫 메시지 위와 날짜 변경 지점 표시 및 과거 페이지의 같은 날짜 중복 제거로 반영했다. DATE-001·005, 기능 수용 기준, OQ-004, 추적표와 DEC-009의 정합성을 문서 검색으로 확인한다. 표시 방식, ACK 처리, 메시지 유형 범위는 아직 미결이며 코드 변경 및 앱 검증은 수행하지 않는다. - 2026-10-16, 인터뷰 5차: 사용자 답변 `1`을 메시지와 함께 스크롤하고 상단에 고정하지 않는 방식으로 반영했다. 요청 범위를 확장하지 않도록 기존 TEXT 표시 유지도 에이전트 판단으로 구분해 기록했다. DATE-006·008, OQ-005·007, 추적표 및 DEC-010·011의 정합성을 문서 검색으로 확인한다. 남은 사용자 결정은 보류·실패 메시지와 서버 ACK의 날짜 처리다. 코드 변경 및 앱 검증은 수행하지 않는다. - 2026-10-16, 인터뷰 6차: 사용자 답변 `1`을 전송 완료 후 서버 확정 날짜로 갱신하는 규칙으로 반영했다. DATE-007, OQ-006, 추적표 및 DEC-012를 일치시키고 기능 검증 사례를 정리했다. 과거 미결 기록은 당시 이력으로 보존하고 현재 상태만 해소했다. 문서만 작성했으며 빌드, 테스트, 앱 실행은 하지 않았다. - 2026-10-16, 최종 문서 확인: 독립 검토자가 PRD만 읽고 향후 계획 수립에 중요한 미답변 질문이 없다고 판정했다(`nothing important left`). 최초 일반 검토자 실행은 지원되지 않는 모델 오류로 시작하지 못했으며 문서 전문 검토자로 재시도해 확인했다. 요구사항 8개, 질문 7개의 현재 상태와 DEC-006~012 연결을 `rg -n '^\| DATE-|^\| OQ-|DEC-012' docs/20261016_유저_크리에이터_채팅_날짜_구분선/prd.md`로 대조했다. 기능 테스트를 실행하거나 완료 처리한 것은 아니다. - 2026-10-16, 범위 변경 및 추적성 보강: 사용자 요청에 따라 [plan-task.md](plan-task.md)를 작성하고 DATE-001→P1-T2, DATE-002→P1-T1/P1-T2, DATE-003→P1-T1/P1-T2, DATE-004→P1-T1, DATE-005→P1-T2, DATE-006→P1-T2/P1-GATE, DATE-007→P1-T2, DATE-008→P1-T2로 연결했다. 이 기록은 문서 작업만 허용하며 제품 코드, 테스트 파일, 프로젝트 설정, 빌드 및 앱 실행은 허용하지 않는다. 계획의 모든 구현 체크박스는 미실행 상태다. ## 14. 인터뷰 종료 판단 | 항목 | 최종 판단 | |---|---| | Goal | 1.00: 메시지가 오간 날짜를 대화에서 확인 | | Scope | 0.95: 기존 DM의 표시 TEXT에 날짜 항목 추가, 이번 세션은 문서만 작성 | | Constraints | 1.00: 기기 시간대, 앱 locale, 연·월·일·요일, 비고정 표시, 서버 시각 확정 정책 결정 | | Success | 0.95: 삽입·병합·표기·전송 상태별 수용 사례를 명시, 실행 검증은 구현 이후 | | Context | 0.95: 기존 View·모델·병합·시각·언어 정책 확인, 시각 상세는 기존 관례 내 구현자 결정 | | 최종 모호성 | 0.03: 기존 코드베이스 가중식의 0.0275를 반올림한 주관적 점검값 | | 열린 질문 | 제품 결정 없음. 후속 구현 완료, 실서버·접근성 QA 대기 |