콘텐츠로 이동

SRS 변경 이력

docs/srs.md의 요구사항이 언제 왜 바뀌었는지를 시간순으로 남긴다. 본문에서 떼어낸 이유는 병합 충돌 때문이다. 모든 SRS 작업이 이 표 끝에 행을 하나씩 붙이는데, 브랜치 둘이 같은 자리에 쓰면 매번 충돌한다. 이 파일은 .gitattributes에서 union 병합으로 두어 양쪽 행이 모두 남는다.

추가만 한다. 기존 행을 고치거나 지우지 않는다. union 병합은 수정을 중복 행으로 남기므로, 이미 적은 이력이 틀렸으면 지우지 말고 정정하는 행을 새로 붙인다.

GitHub에서 충돌로 뜨면 로컬에서 푼다. union 병합은 로컬 git만 적용한다. GitHub의 서버 머지는 .gitattributes의 merge driver를 읽지 않아서, 브랜치 둘이 이 표에 행을 붙이면 PR 화면에는 매번 충돌로 나온다. 그때는 웹에서 손으로 합치지 말고 로컬에서 git merge origin/develop 후 푸시한다. union이 붙어 양쪽 행이 그대로 남는다. 2026-08-14에 같은 자리에서 두 번 걸렸다.

날짜 변경 사유
2026-08-10 초판. 기존 구현 역산으로 기능 요구 17영역 209건, 비기능 27건 등재. 위키 대조로 지도 홈 표현 정책(MAP) 신설, 미해결 8건과 정본 불일치 6건 식별 MSG-358
2026-08-10 문서 구조를 ISO/IEC/IEEE 29148(구 IEEE 830) 표준 목차로 재편. 서론, 전체 설명(제품 관점·기능 요약·사용자 특성·제약·가정과 의존성), 외부 인터페이스, 아키텍처, 추적성 매트릭스, 부록 추가. 용어집과 아키텍처는 기존 정본을 링크로 대체 MSG-358, 성민 지적
2026-08-10 FR-BADGE-12(미션 뱃지 종류별 지급)·FR-BADGE-13(뱃지 그림) 등재. FR-MISSION-07에 대체 예정 표시 docs/prd/MSG-363-prd.md 승인
2026-08-10 구현 반영. FR-BADGE-12를 구현됨으로, FR-MISSION-07을 폐기됨으로(FR-BADGE-12가 대체) 바꾸고 FR-BADGE-01의 활성 축 목록을 종류별 3축으로 정정. FR-BADGE-13은 그림 형식·버킷 미확정이라 계획 유지. FR-VIDEO-15에 공개범위 기본값 정정 근거 추가(요구·동작 불변) MSG-363 구현(V29·V30)
2026-08-10 확정 반영과 근거 정정. FR-MISSION-09의 스팟 5~8곳·완료 3곳을 시작안에서 확정으로 명시하고, FR-VIDEO-01에 30초 여유 허용 확정을 반영(FR-MEDIA-03에 실측 컷 충돌 표시, 허용 폭은 미해결 질문으로 등재). FR-GRID-04 근거의 MSG-193을 MSG-93으로 정정. FR-AUTH-11 상태를 구현됨에서 미충족으로 조정해 NFR-SEC-07과 맞췄다 2026-08-10 성민 확인, 코드 재확인
2026-08-10 미해결 정리. FR-AUTH-12(iOS 출시 시 애플 로그인) 신설로 미해결 질문의 Apple 항목을 닫고, FR-MISSION-13에 종류별 반경 방식 확정과 길찾기 버튼 미도입을 반영. 미해결 표의 미션 노출 항목은 방식이 정해졌으므로 값만 남기는 형태로 좁혔다 2026-08-10 성민 확정, MSG-368·MSG-369 발행
2026-08-11 FR-VIDEO-18 상태를 진행 중에서 구현됨으로 (PR 머지 반영) MSG-371
2026-08-11 FR-GRID-13(축소 뷰포트 행정 단위 집계) 등재. 구현·테스트가 이미 있는데 FR 행이 없던 역방향 갭 해소. 8장에 테스트 비대상 목록 신설(7건, 사유 명기)하고 rtm 생성 스크립트가 이 목록을 읽어 검증 공백에서 분리하게 함 MSG-375 (첫 전수 매핑 후속)
2026-08-13 NFR-OPS-08(영상 종결 지표는 같은 사건을 한 번만 집계) 등재. MSG-343 계측이 SRS 미등재로 들어와 지표 정확성 요구가 빠져 있던 것을 소급 등재 — 그 부재 속에 중복 집계 결함이 함께 들어온 것이 등재 계기 MSG-382 (Codex 리뷰 적발 후속)
2026-08-13 NFR-OPS-08 문장을 "같은 사건 한 번만 집계"에서 "종결 후 재도착 신호 차단"으로 좁힘. 지표 증가가 전이 커밋 앞이라 남는 커밋 실패 시 과대 집계는 MSG-343이 수용한 근사 오차라, 넓은 문장이 이를 요구 위반으로 만드는 것을 막는 범위 한정 MSG-382 후속 (PR #161 리뷰 반영)
2026-08-13 미션 지도 탐색 개편 반영. FR-MISSION-14~19 등재(목록 항목 구성, 마커·클러스터 표시와 선택 시 판정 범위, 미션 상세, 미션 영역 영상, 진행도, 이름 없는 경유점 폴백)와 NFR-DATA-07 등재(외부 이미지 보관·형식 통일). FR-MISSION-08은 축제 소스를 TourAPI로, FR-MISSION-10은 팝업 판정 범위를 반경 40m로 바꿔 진행 중으로 조정. FR-MISSION-02에 진행도 분리 조회 단서, FR-MISSION-13에 목록 위치가 플랫폼별로 다르다는 단서 추가. 미해결에 외부 데이터 출처 표기 조건 등재 docs/prd/mission-map-explore.md (2026-08-13 성민 승인)
2026-08-13 FR-MAP-10(지도 홈 기본 화면 사이드 패널 격자 카드 최신순 최대 20장) 등재. 클라이언트가 기존 행정동 격자 카드 조회의 정렬·개수 파라미터로 판정하는 화면 규칙이라 서버 변경 없음. FE 연동 가이드의 "카드 3장·조회수순" 안내를 대체 MSG-387, 2026-08-13 팀원 K 확정
2026-08-13 FR-MAP-10에 카드 주인 확정 반영(기본 화면 카드도 내 격자, 20장 스크롤 디자인 확인). FR-MAP-07 근거에 카드 목록 포함 확인을 추가. MSG-374가 남긴 카드 기준 섞임의 결정이 닫혔고, 내 것 기준 카드 조회는 서버에 없어 후속 티켓 전까지 전역 조회를 임시 사용 MSG-387 PRD 승인 (2026-08-13 팀원 K 답변 2건)
2026-08-13 FR-MAP-09(칩 활성 격자 선택의 활발한 시간대 차트) 등재. 노출 위치가 지도 홈 기본 패널에서 칩 활성 한정으로 좁혀진 확정과 함께, 집계 윈도우 전체 누적·24구간 고정 응답을 확정값으로 담았다 MSG-372, 2026-08-13 팀원 K 확정
2026-08-13 NFR-PERF-01 적용 범위를 격자 시간대 분포 조회까지 확장. 새 조회가 뷰포트 한정 SLO를 말없이 상속하던 추적성 공백을 닫았다(신선도 30초는 뷰포트 한정 명시). 측정 방법은 NFR-PERF-02 그대로 MSG-372 (Codex 리뷰 후속)
2026-08-13 FR-MAP-09 상태를 구현됨으로 갱신하고 시간대 집계·24구간 조립·HTTP 계약 테스트를 연결했다 MSG-372 구현 및 Codex 리뷰 후속
2026-08-14 FR-MISSION-13에서 칩 개수 배지와 "0이면 칩 숨김"을 폐기했다. 지도를 움직일 때마다 종류 넷의 개수를 다시 세어 칩 상태를 맞춰야 하는데 그 상태 관리 비용이 배지의 값어치보다 크다고 보았다. 칩은 종류를 고르는 역할만 하고 항상 표시된다. 같은 행의 구현 티켓 참조도 MSG-368에서 MSG-398로 옮겼다(368은 문서 등재만 하고 닫혔다) 2026-08-14 성민 확정, MSG-398
2026-08-14 FR-MISSION-17을 계획에서 진행 중으로 옮기고 후보 술어·페이징·HTTP 계약 테스트를 연결했다. 영상 목록 조회는 들어갔지만 총 영상 개수와 코스 스팟별 방문 여부·영상 수가 남아 구현됨으로 올리지 않았다. 그 둘은 미션 상세 조회(MSG-399) 몫으로 갈렸고, 개수 쿼리가 목록의 후보 술어와 술어 동등이어야 한다는 조건이 붙는다. 상태 변경이 머지(PR #168) 뒤로 밀린 것은 SRS 갱신을 마무리 절차에 넣지 않아서다 — 그 사이 rtm이 구현된 요구를 계획으로 싣고 있었다 MSG-390 구현 후속
2026-08-14 FR-MISSION-10의 포스터 요구를 충족으로 갱신했다. 팝가 상세의 og:image 원본을 JPEG로 변환해 우리 버킷에 두고 dev 활성 팝업 227건 전부에 포스터와 소개문이 찼다. 소개문 출처가 같은 페이지의 content로 확정돼 MSG-383이 남긴 미해결도 닫혔다. 반경 40m 축소가 MSG-385로 남아 행 상태는 진행 중을 유지한다 MSG-394
2026-08-14 NFR-DATA-07 적용 범위를 축제 한정에서 미션 세 종류로 넓혔다. 팝업 포스터와 코스 대표 사진까지 같은 규칙(JPEG 통일·우리 버킷 URL만 저장·리더 검증)으로 미러링한다. 객체 이름 문법 검증을 더해 URL 구분자로 래스터 제한을 우회하는 경로를 막았다. prod 버킷 정책이 남아 진행 중을 유지한다 MSG-394
2026-08-14 FR-MISSION-08의 실적재 상태를 갱신했다. 축제 dev 적재가 끝나 활성 222건에 이미지 221건이 찼고, 남은 것은 prod다. 요구 문장과 상태는 그대로다 MSG-394 (MSG-384 후속 확인)
2026-08-15 FR-MAP-06에서 사이드 패널 헤더의 "이 지역 격자 N개 · 영상 M개" 카운트 줄을 폐기했다. 헤더는 동 이름만 표시한다(웹 ver 13 지도 홈 실측과 일치). 집계 응답의 동 전체 내 격자 수·영상 수 필드는 서버 계약으로 유지하되 화면이 소비하지 않으며, 필드 제거 여부는 별도 논의로 남긴다. FR-MAP-07의 예시 문장에서도 헤더 카운트를 뺐다(내 것 기준 원칙 자체는 불변) 2026-08-15 확정, MSG-388 디자인 검증 중 발견
2026-08-15 FR-MAP-10을 계획에서 구현됨으로 올렸다. 내 것 기준 카드 조회를 MSG-388이 구현해(도감 갤러리 조회에 regionCode·sort·limit 확장, 카드 커버 영상 길이 동봉) 전역 조회 임시 사용의 서버 측 사유가 해소됐다. 검증 테스트는 CollectionGridsFilterRepositoryTest가 FR-MAP-10 마커로 연결된다. FE의 실제 전환은 연동 가이드 교체로 안내한다 MSG-388 구현 완료
2026-08-15 FR-USER-14(프로필 편집의 위치정보 사용 동의 토글) 등재. 동의 여부와 동의·철회 시각의 서버 보관, 프로필 조회 노출, 서버 무차단(집행은 클라이언트)을 확정값으로 담았다. 가입 시 동의 수취 여부는 PRD 몫으로 남김 웹 디자인 ver 13 노드 14599-3501, 2026-08-15 팀원 K 확정
2026-08-15 FR-USER-14 문장에 가입 시 필수 수취를 추가(동의 없이는 가입 미완료). 등재 때 PRD 몫으로 남겼던 질문이 같은 날 확정되어 요구로 승격, 신규 가입자는 on·배포 시점 기존 사용자는 off 시작은 PRD FR-7·8에 담김 PRD location-consent, 2026-08-15 팀원 K 확정
2026-08-15 FR-USER-14 수취 방식 확정 반영. "동의 없이는 가입 미완료"를 "첫 로그인 온보딩 필수 수취, 계정은 미동의로 생성, 진입 차단은 클라이언트"로 구체화. 카카오 동의 화면 동봉(카카오 싱크)은 비즈 앱 전제라 기각, 로그인 API 무수정 MSG-402, 2026-08-15 팀원 K 확정
2026-08-15 FR-USER-14에 기존 사용자 조항 추가(도입 시점 기존 사용자도 미동의 시작, 다음 로그인에서 같은 온보딩 통과). PRD FR-8에만 있고 전역 정본에 빠져 있던 것을 Codex 스펙 리뷰가 적발해 보완 MSG-402 (Codex 리뷰 1R 반영)
2026-08-15 FR-USER-14 상태를 계획에서 구현됨으로 갱신. 서버 몫(저장·조회·변경 API) 전 범위 구현과 검증 테스트 20건이 같은 브랜치에 들어갔다. 클라이언트 몫(온보딩 게이트·차단 목록)은 요구 문장대로 FE 담당 MSG-402 구현 완료
2026-08-15 FR-MISSION-15 문안을 갱신했다. 마커 묶음 기준을 팝업과 축제 500m, 코스 1km로 확정하고 묶는 일이 화면 몫임을 명시했다(서버는 뷰포트 안 개별 미션만 내려준다). 코스 표시를 줌별로 갈랐다. 가까운 줌은 경로선, 넓은 줌은 대표 마커로 1km 묶음이며 기존 "코스는 경로선" 서술은 가까운 줌 한정이 됐다. 상태는 계획 그대로다 2026-08-15 성민 확정, docs/prd/mission-map-explore.md 8절
2026-08-15 미션 목록 뷰포트 조회와 진행도 조회 반영. FR-MISSION-01을 "보이는 범위의 한 종류를 한 번의 호출로"로 좁히고 조회 가능 종류를 칩이 있는 셋(EVENT·POPUP·COURSE)으로 명시. FR-MISSION-18에 완료 여부를 함께 본다는 단서를 더하고 진행도 기준을 스탬프 판정과 같은 술어(기간 내 촬영 영상)로 확정 — 도감 점령 기준이면 미션 전에 찍어 둔 영상만으로 1/1이 되는데 스탬프가 없어 카드가 모순으로 보인다(2026-08-15 성민 확정, 팝업 판정 범위가 아직 9×9라 밀집 지역에서 흔한 상태였다). FR-MISSION-13·18은 서버만 끝나 진행 중으로 올리고 화면 잔여를 근거에 기재. FR-MISSION-14도 서버 재료 완료로 진행 중 승격(스펙은 "이미 진행 중"으로 알았으나 실제 SRS는 계획이었다 — 실측 정정). FR-MISSION-02는 요구 불변이고 근거에 뷰포트 도입만 추가 MSG-398 구현
2026-08-15 뱃지 그림 반영. FR-BADGE-13을 계획에서 진행 중으로 올렸다(서버 몫 완료). 미확정이던 그림 형식과 버킷이 png와 fillmap-static(환경 공용)으로 확정돼 icon_url 26행 전부를 채우고 NOT NULL을 걸었다. 은퇴 3종은 공유 레거시 메달을 쓴다는 확정된 예외를 요구 문안 근거에 남겼다. 미획득 흐리게 표시는 FE 잔여 MSG-405 구현
2026-08-15 미션 상세 조회 구현 반영. FR-MISSION-16을 계획에서 진행 중으로 올렸다(서버 상세 API 완료, 지도 얹기·화면 합성은 FE 잔여). FR-MISSION-17 근거의 "남은 것"이던 총 영상 개수와 코스 스팟별 방문 여부·영상 수가 구현으로 바뀌었다 — 개수는 MSG-390 후보 술어와 술어 동등(정합 테스트 고정), 방문 여부는 진행도와 같은 판정 술어. FR-MISSION-18 근거에 상세가 같은 findProgress를 재사용한다는 문장을 추가했다(진행도 뜻의 단일 지점 유지) MSG-399 구현
2026-08-15 FR-MISSION-10 상태를 진행 중에서 구현됨으로 갱신. 마지막 미착수분이던 판정 반경 40m 축소가 구현됐다. 신규 적재는 좌표 사방 40m가 걸치는 1~4칸이고, 기존 적재분은 시더 재실행의 차등 교체가 같은 규칙으로 맞추며, 좌표가 스냅샷에서 사라진 미종료 팝업은 중심 근사 셀 1칸으로 좁힌다(잘린 스냅샷이면 건너뛰는 완전성 가드 포함). 기발급 스탬프는 비회수 그대로다. dev 데이터 재산출 1회는 배포 후 시더 기동으로 남아 있다 MSG-385 구현
2026-08-15 FR-MISSION-12 문안을 갱신했다. 종전 문안은 스탬프북 전용 조회 화면과 API를 여는 것으로 읽혔는데, 2026-08-10 확정 결정은 별도 화면 없이 종류별 뱃지 상세에 스탬프 목록을 붙이는 것이다(뱃지는 집계, 스탬프는 원장). 상태는 계획 그대로이고 담당 티켓을 에픽 MSG-219에서 MSG-369로 바로잡았다 docs/prd/badge-streak-prd.md 4.6절, 2026-08-10 성민 확정
2026-08-19 FR-REGION-14를 계획으로 등재했다. 도감·프로필 헤더의 전국 탐험률("전체 지도 0.012% 탐험")과 시군구 탐험률("부산진구 52%" 진행바)이 디자인 ver 13 정본에 실렸는데 서버 재료가 없어 신규 요구로 세웠다. 2026-07-22 개인 도감 확정 설계가 미뤄 둔 시군구 상위 집계를 디자인 확정(2026-08-14)이 뒤집은 것이라 근거에 결정 변경을 남겼고, 시/도 집계는 여전히 범위 밖이라 FR-REGION-13은 그대로다 MSG-406, docs/prd/MSG-406-prd.md 초안
2026-08-19 FR-REGION-14 문안을 정정했다. 초안이 도감 헤더 진행바를 시군구 탐험률로 읽어 시군구 상위 집계 부활까지 담았는데, 같은 날 확정으로 진행바는 현재 위치 행정동 기준이고 그 재료는 기존 단건 조회(FR-REGION-07)가 이미 제공한다. 신규 요구는 전국 탐험률 재료(원값 분자와 분모) 하나로 좁아졌고, 2026-07-22 시군구 상위 집계 유예는 결과적으로 뒤집히지 않고 그대로다 MSG-406, 2026-08-19 팀원 K 정정
2026-08-19 FR-REGION-14 상태를 계획에서 구현됨으로 올렸다. GET /api/regions/stats/national 구현과 검증 테스트(// 검증: FR-REGION-14 주석 16건 부착)가 같은 브랜치에 들어 있다. 전체 빌드 1,811건 green MSG-406 구현
2026-08-18 알림 확장 3건 등재. FR-NOTI-14(친구 요청·수락 알림, 같은 상대 하루 1건 상한)가 FR-NOTI-13(친구 활동 알림 미도입)을 대체해 13은 폐기됨으로. FR-NOTI-15(블라인드 소유자 통지, MODERATION 카테고리는 수신 거부 불가), FR-NOTI-16(근접 미션 알림, 기기 판정형 위치 미수집, 축제·팝업만, 미션당 생애 1회) 신규. FR-NOTI-06과 FR-MOD-14 근거에 교차 참조 단서 추가 MSG-416~418 (2026-08-18 성민 확정), PRD 3건 docs/prd/MSG-416~418-prd.md
2026-08-18 FR-NOTI-15 문안 보강. 미확정으로 남겨 뒀던 해제 복구 알림을 포함으로 확정해 요구 문장에 편입했다(스펙 리뷰가 미확정 결정의 임의 편입을 지적해 사용자 확인으로 해소). 문의 채널 안내는 기능 부재로 문구에 넣지 않는다 MSG-417 (2026-08-18 성민 확정)
2026-08-18 FR-NOTI-14를 계획에서 구현됨으로 올렸다(친구 요청·수락 알림, 검증 테스트 연결). FR-NOTI-06 문안을 카테고리 6종으로, FR-NOTI-07 문안에 친구 상한(도착 같은 상대 하루 1건·수락 무제한)을 편입했다 MSG-416 구현
2026-08-18 FR-NOTI-15를 계획에서 구현됨으로 올렸다(블라인드 전환·해제 소유자 통지, MODERATION 카테고리는 설정 응답과 생성 스키마 양쪽에서 비노출, 검증 테스트 연결) MSG-417 구현
2026-08-18 FR-NOTI-16 문안 보강. FE 협의 결과 두 가지를 편입했다. 근접 알림 끄기 설정은 서버 알림 설정의 전용 카테고리(MISSION_NEARBY)로 저장해 기기 간 동기화하고(HOTZONE 재사용은 핫구역을 끈 사용자가 미션 알림까지 잃는 결합이라 기각), 미션 위치 조회는 기존 뷰포트 조회를 재사용한다(팝업도 BOX 형상 확인, 중심점은 기기가 4점 평균으로 계산) MSG-418 (2026-08-18 FE 협의·성민 확정)
2026-08-18 FR-NOTI-16의 미정 값 2건을 확정했다. 근접 반경은 미션 경계 기준 팝업 200m와 축제 500m(팝업은 도보 2~3분과 지오펜싱 실용 하한 사이, 축제는 목적지형이라 더 넓게), 하루 전체 상한은 5건(KST 자정 경계)이다. 둘 다 앱 상수라 출시 후 조정할 수 있다 MSG-418 (2026-08-18 성민 확정)
2026-08-18 FR-NOTI-16 위치 문언 정정. "사용자 위치는 기기 밖으로 나가지 않으며"를 "서버는 사용자 위치를 받아 판정하거나 수집·저장하지 않으며"로 바꿨다. 스펙 리뷰가 뷰포트 조회의 bbox 4좌표가 기기 위치 파생 값임을 지적했고, 구 문언대로면 기존 지도 화면의 조회부터 위반이라 약속 범위를 실질(판정·수집·저장 배제)로 정돈했다. bbox 격자 스냅 완화는 필수가 아니라 FE 계약 논의 항목이다 MSG-418 (2026-08-18 성민 확정, PRD FR-2 동시 정정)
2026-08-18 FR-NOTI-16을 계획에서 진행 중으로 올렸다(서버 몫 구현 — MISSION_NEARBY 설정 카테고리, V36 폭 확장과 CHECK 7종화, 설정 표면 문구 7종화, 검증 테스트 연결. 지오펜싱·발화 등 앱 몫 미착수). FR-NOTI-06 문안을 7종으로 넓히고 서버 발송형 6종과 기기 로컬형 1종(근접 미션)을 구분해 서술했다 — 기존 "끈 카테고리는 이벤트 기록은 남되 발송 단계에서 걸러진다"가 발송 경로 없는 카테고리에는 맞지 않아서다 MSG-418 구현
2026-08-19 FR-USER-15 신규 등재. 가입 동의 5항목(만 14세, 서비스 약관, 개인정보, 위치기반, 마케팅 선택)의 저장과 게이트 판별. 앱 디자인 ver 6 회원가입 화면과 MSG-422 전제를 서버가 못 받치는 갭으로 발견해 등재했다. 위치기반 항목은 FR-USER-14와 한 값 MSG-433 (2026-08-19 팀원 K 진행 확정)
2026-08-19 FR-USER-15의 시각 보관 문구를 정밀화했다. 철회가 없는 필수 3항목은 동의 시각을 증빙으로 보관하고, 철회할 수 있는 위치기반·마케팅은 현재 상태와 마지막 변경 시각을 보관한다(FR-USER-14 방식). 원 문구 "항목별 동의 시각 보관"은 철회 항목에서 변경 시각 덮어쓰기와 모순됐다 (Codex 교차 리뷰 1라운드 P2 수용) MSG-433
2026-08-19 FR-USER-15를 계획에서 구현됨으로 올렸다 (V37 users 컬럼 5개, GET/PUT /me/consents·PUT /me/marketing-consent, 게이트 생명주기 통합 시나리오 포함 47건 green. 검증 테스트 2파일에 // 검증: FR-USER-15 주석 연결) MSG-433 구현
2026-08-19 FR-USER-14 개정 — 위치기반서비스 동의를 철회 불가로 전환했다(팀 합의). 종전 "프로필에서 켜고 끌 수 있다"를 폐기하고 서버가 철회 요청을 400으로 거절한다. 위치가 서비스 핵심이라 철회 상태의 앱 이용을 두지 않기로 했고, MSG-433 게이트 판별과의 모순(철회하면 다음 로그인마다 게이트 재강제 = 사실상 철회 불가인데 문서만 철회 가능)도 이 개정으로 해소된다. 프로필·설정의 위치 토글은 디자인에서도 제거 MSG-433 (2026-08-19 팀 합의, 팀원 K 전달)
2026-08-19 FR-USER-15 문구 정합 — 철회 가능한 항목이 마케팅 수신 하나로 줄었다(위치가 FR-USER-14 개정으로 철회 불가 전환). 필수 4항목 전부 동의 사실과 시각이 증빙으로 남는다 MSG-433
2026-08-19 FR-NOTI-16 문구 정합 — 근접 알림이 멈추는 경로에서 "동의 회수"를 뺐다. 위치 동의가 FR-USER-14 개정으로 철회 불가가 되어 그 경로 자체가 소멸했고, OS 위치 권한 회수와 알림 설정 끄기만 유효하다. 선행 문서 3건(MSG-402 스펙·PRD, MSG-418 PRD)에도 개정 표기를 달았다 (Codex 델타 리뷰 P2·P3 수용) MSG-433
2026-08-19 FR-REGION-15 신규 등재. 검색 지역 필터용 시군구 목록과 격자 수 조회. 앱 디자인 ver 6 검색/지역 필터 화면 대조에서 발견해 등재했다. 격자 수의 정의는 미확정으로 남겼고, 시/도 수집률 집계 유예(FR-REGION-13)와는 별개 축이다 MSG-435 (2026-08-19 팀원 K 진행 확정)
2026-08-19 FR-REGION-15의 미확정 값을 확정했다. 격자 수는 그 구의 전체 격자 수(사용자 무관, 행정동 물질화 값 합)이고, 격자 수 0인 시군구는 목록에서 제외하며, 정렬은 이름순이다. 규모 검증은 마포구 면적 23.9km²가 100m 격자 약 2,400칸이라 화면의 2,841과 자릿수가 맞는 것으로 했다 MSG-435 (2026-08-19 팀원 K 확정, PRD 검토됨 승격)
2026-08-19 FR-REGION-15에 식별자 계약 문장을 보강했다. 응답의 시군구 식별자가 기존 행정동 코드 체계와 이어져 기존 시군구 필터 조회에 그대로 쓰인다는 것은 PRD FR-4의 Must 요구인데 SRS 행에 빠져 있었다 (Codex 교차 리뷰 1라운드 P3 지적 수용) MSG-435
2026-08-19 FR-REGION-15를 계획에서 구현됨으로 올렸다 (GET /api/regions/districts — 시군구 256개, 이름순 COLLATE "C", 격자 수 0 제외, EXPLAIN 9.5ms 실측. 검증 테스트 3파일에 // 검증: FR-REGION-15 주석 연결) MSG-435 구현
2026-08-19 FR-NOTI-17 신설(알림함). 알림 목록 최신순 페이지 조회, 개별·전체 읽음 처리(멱등), 안읽은 개수 조회, 발송 결과 무관 노출, 근접 미션 제외를 등재했다. FR-NOTI-12에서 이력·읽음 몫을 분리해 상세화한 것으로, FR-NOTI-12에는 딥링크만 남겨 MSG-432 몫으로 정돈했다 MSG-434 PRD (2026-08-19, 디자인 확정 반영)
2026-08-19 FR-NOTI-17 문안 확정 보강. 미확정으로 남겼던 두 값을 팀원 K 확정으로 반영했다. 노출 대상은 최근 30일 이내 알림(저장 기록은 유지, 정리 배치는 별도 티켓 후보), 수신 거부로 걸러진 알림은 숨김(전송률 상한으로 푸시만 억제된 알림은 노출). 딥링크용 대상 식별자는 이번 응답에 싣지 않고 MSG-432가 한꺼번에 정하는 것으로 접점을 닫았다. PRD 상태도 검토됨으로 올렸다 MSG-434 PRD (2026-08-19 팀원 K 확정 3건)
2026-08-19 FR-NOTI-17을 계획에서 구현됨으로 올렸다(알림함 서버 몫 — read_at 컬럼 V38, 목록 커서 조회·안읽음 개수·개별과 전체 읽음 API 4종, 수신 거부 스킵 숨김과 30일 창 판정. FE 화면은 미착수). 검증 테스트 24건 연결 MSG-434 구현 (2026-08-19)
2026-08-20 FR-MISSION-20을 등재하고 FR-MISSION-15를 갱신했다. 축제·팝업 핀의 축소 화면 묶음을 거리 기반(500m) 화면 묶음에서 도감 격자 집계(FR-GRID-13, MSG-356)와 같은 행정 단위 집계(동 250m~500m, 구 1km~8km, 시 16km~전체)로 교체했다. 표시는 도감 집계 버블과 같은 패턴에 색만 다르다. 코스의 1km 화면 묶음과 줌별 표시는 유지. 개별 조회의 뷰포트 0.5도 상한 때문에 시 축척 조회는 서버 몫 신설이 필요하다 팀원 K 확정 (2026-08-20, mission-map-explore 8절 결정 번복, MSG-437)
2026-08-20 FR-MISSION-20을 계획에서 진행 중으로 올렸다. 서버 몫(MSG-437) 구현 완료 — 미션 집계 조회 신설, 스냅숏 재계산 시 행정 귀속 판정과 메모이즈, 실패 분류(무귀속은 빈 결과·범위 밖만, 인프라 예외는 재계산 실패로 전파), 검증 테스트 연결. 마커 렌더링과 축척 전환은 FE 잔여 MSG-437 구현
2026-08-19 행사방 영역(EVENT)을 신설하고 FR-EVENT-01~06을 계획으로 등재했다. 디자인 ver 13 행사방 시안 3장(기본 지도 행사 칩, D-7 정보와 참여 준비, LIVE 실시간 현장 제보)을 PRD 초안으로 옮기며 ID를 부여한 것이라, 성민 승인 전이면 전 항목이 초안 기반이다. 범위 미확정 사항(MVP 편입, 제보 구조화, 신고 확장, Owner 판정 등)은 10장 미해결 표에 함께 올렸다 docs/prd/event-room.md 초안
2026-08-19 행사방 범위 축소를 반영했다. 동선(추천 경로) 글이 범위에서 빠져 FR-EVENT-03의 글 유형이 동행과 제보 둘이 됐고 FR-EVENT-04의 저장 반응이 사라졌다. FR-EVENT-01에는 등재와 칩 노출이 대형 행사만이라는 문장을 더했다 팀원 K 확정 (2026-08-19), docs/prd/event-room.md 비목표 갱신
2026-08-19 행사방 범위를 한 번 더 좁혔다. 동행 글도 빠져 사용자 글은 실시간 제보 하나가 됐다. FR-EVENT-03을 제보 중심으로 다시 썼고(참여 = 제보·댓글 자격), FR-EVENT-04의 대상을 글에서 제보로 바로잡았다. 영역 머리말도 같은 방향으로 갱신 팀원 K 확정 (2026-08-19), docs/prd/event-room.md 비목표 갱신
2026-08-19 행사방 제보를 주요 행사 장소 단위로 고정했다. 자유 격자 제보를 없애 FR-EVENT-03의 제보 대상이 주요 행사 장소 중 하나가 됐고, FR-EVENT-05의 지도 라벨과 영상 수 집계 단위도 격자에서 장소(격자 영역)로 바뀌었다. 행사와 무관한 곳으로 피드가 새는 것을 막는 결정 팀원 K 확정 (2026-08-19)
2026-08-19 행사방에서 공감(좋아요) 반응을 뺐다. FR-EVENT-04가 댓글만 남기는 문안으로 바뀌었다. 라벨 상태는 최신 제보가 정하므로 공감이 신뢰도 가중 같은 역할을 맡지 않았고, 반응 저장 구조 하나를 통째로 줄이는 결정 팀원 K 확정 (2026-08-19)
2026-08-19 행사방 제보를 행사 시작 전에도 열었다. FR-EVENT-03이 "기간 중에만 작성"에서 "시작 전에도 작성 가능, 상태 표시는 LIVE 중에만 필수"로 바뀌었고, FR-EVENT-05의 라벨 재료가 상태 있는 최신 제보로 좁혀졌다. 동행 유형을 되살리지 않고 사전 대화를 상태 없는 글과 댓글이 담당하게 하는 절충 팀원 K 확정 (2026-08-19)
2026-08-20 FR-EVENT-01에 위치 기반 노출을 편입했다. 행사 목록 조회가 지도 뷰포트 기준으로 확정돼, 행사마다 노출 영역을 갖고 뷰포트와 겹치는 행사만 칩에 담긴다(지도를 다른 도시로 옮기면 칩이 그 지역 행사로 바뀐다). 등재는 도시별(서울, 부산) 유명 행사 한두 개씩 수동 시드 선등재로 확정했고(행사방의 핵심인 파생 팝업과 연계 이벤트를 묶어 주는 API가 없어 TourAPI를 쓰지 않는다), 미션 축 연계는 비목표로 닫았다(같은 팝업의 POPUP 미션·행사방 장소 중복 등재는 공존 허용). PRD가 초안에서 검토됨으로 올라 전 FR-EVENT 근거를 갱신했다 팀원 K 확정 (2026-08-20, PRD 승인)
2026-08-20 FR-EVENT-01에 시 칩 묶음을 편입했다. 행사의 대상 지역이 시 단위 이름으로 확정돼 상단 칩을 시별로 묶는 기준이 되고(칩 행 = 시 칩 + 그 시의 행사 칩 나열, 디자인 노드 14981:3278 부근), 행사 추가는 시드 행 추가만으로 끝나는 확장 전제를 명시했다 팀원 K 확정 (2026-08-20, 상단 칩 디자인 편입)
2026-08-20 행사방 정본 전환. 텍스트 제보와 참여 모델(구 PRD event-room.md)을 폐기하고 위치별 영상 모델(정본 PRD event-room-location-videos.md, Codex 작성)로 확정했다. FR-EVENT-03~05(참여·제보·제보 라벨)를 폐기하고, 시리즈·회차 분리(FR-EVENT-07), 대표 격자 단일 저장과 격자 역조회(08), 위치별 영상 업로드·피드·댓글·도움돼요(09), 생명주기와 종료 후 30일 업로드 유예(10), 열람 인원 heartbeat 집계(11)를 신규 등재했다. FR-EVENT-01(뷰포트 칩)·02(공식 정보)는 승계 갱신, 06(알림)은 참여 전제를 빼고 종료 시 자동 해제를 편입했다. 세부 티켓 MSG-438~443 발행, 상위 MSG-436에 relates to 연결 팀원 K 확정 (2026-08-20)
2026-08-20 행사 등재 기준의 눈높이를 확정했다. FR-EVENT-01의 "대형 행사"를 "초대형 행사(눈높이 기준 BTS 부산 콘서트급)"로 보정했다. 등재 자격을 좁히는 보정이고 도시별 한두 개 수동 시드 전제는 그대로다. 정본 PRD 개요에도 같은 기준을 명시했다 팀원 K 확정 (2026-08-20)
2026-08-20 FR-EVENT-02에서 "일정과 프로그램 안내"를 삭제했다. 정본 PRD US-002에 없는 구 PRD(제보·참여 모델) 잔재로, MSG-439 스펙 리뷰가 적발해 미구현 처리했고 사용자 승인을 받아 문구를 정합시켰다 사용자 승인 (2026-08-20, MSG-438 문서 커밋 편승)
2026-08-20 FR-EVENT-09에 점령 생성을 보강했다. 행사 업로드는 그 위치의 대표 격자에 점령을 만든다(일반 업로드와 동일). 같은 날 확정했던 "점령 미생성"(위치 증거 부재 근거)을 사용자가 당일 번복한 것으로, 위치 증거 없이 점령이 생겨 안 가 본 격자가 도감에 칠해지는 트레이드오프를 인지한 채 도감 노출을 우선했다. 이에 따라 MSG-438 스펙의 삭제 경로 제외 계약과 도감 안티조인 4경로 계약이 소멸하고, 제외는 미션 비연계(안티조인 여섯 쿼리, MSG-450)만 남는다 사용자 확정 (2026-08-20 당일 번복, MSG-438 스펙 개정)
2026-08-21 FR-EVENT-01·02를 구현됨으로 올렸다(MSG-439 — 뷰포트 칩 목록·회차 상세·위치 목록·격자 역조회 API 4종, 비로그인 GET 공개). FR-EVENT-07·08은 조회 몫이 끝나 근거를 갱신하되 영상·피드 실데이터 검증이 MSG-440·441 몫이라 진행 중을 유지했다. 비로그인 조회 허용(웹 조회 4종 permitAll, 쓰기부터 로그인)·visibleFrom 2주 전·행사 이미지 없음은 2026-08-20 사용자 확정의 이행이다 MSG-439 구현 (2026-08-21)
2026-08-21 FR-EVENT-11을 구현됨으로 승격했다. heartbeat 수신과 열람 인원 조회 API가 MSG-443으로 구현돼 검증 테스트 23건과 같은 브랜치에 실렸다. 구현 확정 사항: 열람 계열은 비로그인 허용(웹 정책 정합, 익명은 X-Viewer-Session 헤더로 식별·64자 유계), 저장은 Redis Sorted Set 키 TTL 120초(활성 창 90초와 역할 분리), 캐시 장애는 인원 수만 숨김. occurrenceId 존재 검증은 행사 테이블(MSG-438) 연결 후속 팀원 K 확정 (2026-08-20 비로그인 허용, MSG-443 구현 커밋 동반)
2026-08-21 FR-EVENT-12를 신규 등재했다. 행사 영상의 미션 비연계(진행도, 완료 판정, 방문 스팟, 미션 영상 목록, 격자별 영상 수 전부 제외)는 2026-08-20 확정 후 미해결 표에만 언급돼 있어 요구사항 ID가 없었고, MSG-450 검증 테스트가 참조할 ID가 없어 RTM 추적이 끊기는 상태였다(MSG-450 스펙 Codex 리뷰 적발). 상태는 계획, 구현 MSG-450 등재 (2026-08-21, MSG-450 스펙 작성 동반)
2026-08-21 FR-EVENT-10 문안에 시작 전 행사 경유 업로드 차단을 추가했다(일반 격자 업로드는 무관하게 자유). PRD §4.2의 "정책상 허용 시 가능" 미결이 차단으로 해소된 것을 반영했고 PRD 상태 표도 함께 갱신됐다. FR-EVENT-06 비고에 발송 대상 확정(시작·일정 변경 두 종, 댓글 알림 미도입)을 반영하고 미해결 "행사방 알림 범위" 행을 종결했다 MSG-442 스펙 (2026-08-21 사용자 확정·오케스트레이터 판정)
2026-08-21 FR-EVENT-06을 구현됨으로 승격하고 FR-EVENT-10을 진행 중으로 올렸다(MSG-442). 06은 회차 단위 구독 토글·시작과 일정 변경 알림 발송·종료 시 자동 해제·EVENT 카테고리 편입까지 전부 구현돼 검증 테스트와 같은 브랜치에 실렸다. 10은 4단계 파생 상태와 공용 생명주기 가드(에러 코드 13410·13409·13422 — 초안의 13420·13421 은 같은 날 MSG-440 병합으로 440 기준에 통일)까지 구현했으나 그 가드를 거는 쓰기 경로가 댓글(MSG-441) 쪽은 아직 없어 구현됨이 아니라 진행 중으로 두고 남은 범위를 근거란에 적었다(업로드 경로는 같은 날 MSG-440 이 머지되며 이 가드 호출로 배선됐다). FR-NOTI-06 카테고리는 7종에서 8종(행사 추가)으로 갱신했다 MSG-442 구현 (2026-08-21)
2026-08-21 FR-EVENT-10에 예정 상태 업로드 불가를 보강했다. 시작 전(노출 중) 회차에서는 행사 영상 업로드를 거절해 행사 기록이 남지 않는다(일반 격자 업로드는 무관하게 가능). 정본 PRD §15에 미확정으로 남아 있던 항목을 사용자가 확정했고, 같은 날 영상 파일 규격(길이 30초·용량·코덱)의 기존 공통 업로드 정책 재사용과 멱등 보장 경계(대상 영상의 교체·삭제 전까지)도 함께 확정해 PRD §4.2·§10·§15를 정합시켰다 사용자 확정 (2026-08-21, MSG-440 스펙 확정 과정)
2026-08-21 FR-EVENT-08을 구현됨으로 승격하고 FR-EVENT-09·10을 진행 중으로 올렸다(MSG-440 — 업로드 확정 API·위치별 피드·영상 상세, 검증 테스트 47건 동반). 09의 남은 범위는 댓글·도움돼요(MSG-441), 10의 남은 범위는 댓글·도움돼요 잠금 강제(MSG-441)와 알림 자동 해제(MSG-442)다. FR-EVENT-07은 영상 실데이터의 회차 미혼합까지 끝나 근거만 갱신하고 댓글 몫(MSG-441)이 남아 진행 중을 유지했다 MSG-440 구현 (2026-08-21)
2026-08-21 FR-EVENT-07·09·10을 구현됨으로 승격했다(MSG-441 — 행사 영상 댓글 CRUD·목록 커서·도움돼요 추가와 취소, 검증 테스트 41건 동반). 09는 남아 있던 댓글·도움돼요가 채워졌고 두 반응 수가 영상 상세와 피드 카드에 같은 원천으로 실려 US-006의 수 일치가 성립했다. 10은 MSG-442가 만들어 두고 호출자가 없던 상호작용 잠금 가드를 변경 다섯 경로에 배선해 집행이 성립했고(조회 세 경로에는 걸지 않아 종료 후 조회는 그대로), 07은 반응 행이 행사 영상 연결을 참조하고 목록·집계가 전부 영상 단위 키라 회차 혼합 경로가 사라졌다. 댓글 알림은 이번에도 미도입이다(FR-EVENT-06 확정 그대로 — 도입하려면 요구 신설이 선행) MSG-441 구현 (2026-08-21)
2026-08-21 FR-EVENT-10의 댓글·도움돼요 잠금 시점을 행사 종료에서 아카이브 전환(종료 + 30일)으로 번복했다. 유예 기간은 "행사 다녀와서 나중에 올리기"를 위해 둔 구간인데 그 영상이 처음부터 아무도 반응할 수 없는 상태로 올라가면 유예를 둔 목적과 결과가 서로 깎인다는 지적이 근거다. 기존 근거였던 "종료 = 기록 확정"은 "아카이브 전환 = 기록 확정"으로 옮겨갔고, 이로써 업로드 창과 반응 창이 시작~종료+30일로 정렬돼 두 규칙이 한 정각에서 함께 닫힌다. PRD §4.2 상태 표·US-006·US-009·FR-13과 .claude/rules/glossary.md 도움돼요 항목, 가드·표시 파생·테스트를 같은 브랜치에서 함께 정합시켰다 팀원 K 확정 (2026-08-21, MSG-441 구현 중 번복)
2026-08-22 상단 칩 비로그인 개방을 반영했다(MSG-454). FR-HOTZONE-07과 FR-MISSION-01·16·17·20 근거에 비로그인 조회 허용을 달고, FR-MISSION-18에는 진행도 조회만 로그인 필수 유지를 명시했다. NFR-SEC-01 예외 목록에 비로그인 열람 계열 GET(행사 MSG-439·440·443, 핫구역·미션 MSG-454)을 현행화했다. 상태 승격은 없다 — 이미 구현된 조회의 인증 정책 변경이라 근거만 갱신했다. 정책 번복 정본은 docs/prd/mission-map-explore.md 8절 2026-08-22 항목이다 MSG-454 구현 (2026-08-22)
2026-08-23 FR-MISSION-21~26을 신규 등재했다(MSG-459 — 축제·팝업 미션 영상을 대표 격자에 올리기). 대표 격자 산출·저장(21), 미션 경유 업로드와 점령(22), 촬영 시각 가드(23), 성공 업로드의 스탬프 동반과 종료 미션 보존(24), 격자 역조회(25), 실패 응답의 존재 은닉(26)이다. 21·23·24·26은 서버로 완결돼 구현됨, 22·25는 서버 완료에 FE 화면(업로드 진입점·격자 상세 합성)이 남아 진행 중이다. FR-MISSION-05는 같은 브랜치에서 문구 정정됐다(스탬프가 아니라 업로드가 점령을 만든다는 구분 — 스펙 D-7) MSG-459 구현 (2026-08-23)
2026-08-22 FR-MEDIA-18 등재. 블러 처리를 하이라이트 추천과 독립으로 끄는 제어를 신설하고 기본 꺼짐으로 당분간 비활성 운영한다(재활성 조건 미정). 재생용 하이라이트 보관은 블러와 무관하게 유지한다 — 꺼진 상태에서는 인코딩 완료 시점에 따로 계산해 보관한다(null 수용안은 성민이 기각). 프라이버시 제약 행에 적용 유예를 명시하고 FR-MEDIA-04(비활성 주석), FR-MEDIA-05(전체 스위치와 구분), FR-MEDIA-09(보관 경로 두 가지), AI 서버 가정·인터페이스 행에 참조를 달았다 성민 확정 (2026-08-22), MSG-456, PRD docs/prd/MSG-456-prd.md
2026-08-22 FR-MEDIA-18을 계획에서 구현됨으로 올렸다. 블러 전용 플래그(기본 꺼짐), 폴러의 두 플래그 조건, READY 후행 하이라이트 계산 전용 워커, 가드 달린 저장까지 서버 몫 전 범위가 검증 테스트 3클래스와 같은 브랜치에 실렸다(컨벤션 리뷰 위반 0건, Codex 브랜치 리뷰 지적 0건). FR-MEDIA-09 문안을 보관 경로 두 가지 서술로 되돌렸다(구현 전 시제 보정의 원복). dev 실반영은 develop 머지 후 배포 시점이다 MSG-456 구현 (2026-08-22)
2026-08-22 ROUTE 영역 신설, FR-ROUTE-01~13 등재. 사용자가 자연어로 적은 요청을 받아 미션·행사·장소를 엮어 방문 순서를 돌려주는 기능이다. 자연어 해석과 추천 이유 문장화는 FillMap-AI가, 후보 선정과 순서 배열은 백엔드가 맡는 분담을 요구사항으로 못 박았다(FR-ROUTE-03·08) — 모델이 후보를 고르면 존재하지 않는 장소가 결과에 섞이기 때문이다. FR-MAP-02를 칩 4종에서 5종으로 갱신했다(기존 "코스추천"은 이름만 "코스"로, AI 경로추천 신설). 대체가 아니라 추가인 것은 코스 미션 148개의 목록 진입점이 사라지면 스탬프·뱃지가 걸린 데이터에 닿을 방법이 없어지기 때문이다. NFR-SEC-08(프롬프트 인젝션 내성)·09(외부 요청에 식별 정보 미포함) 등재, 2.2 기능 요약에 계획 축 추가, AI 서버 가정·인터페이스 행에 참조 추가. 발단은 같은 날 멘토 멘토링의 "AI가 억지로 붙어 있다" 지적이다 성민 확정 (2026-08-22), MSG-457(백엔드)·MSG-458(AI 서버), PRD docs/prd/MSG-457-prd.md
2026-08-22 MSG-460의 대상을 개인 도감 격자 목록이 아니라 검색 무입력 상태의 전체 지역 목록으로 정정했다. FR-COLLECT-13을 제거하고 FR-SEARCH-15를 등재했다. 전체 지역은 20개 커서 페이지이며, 사용자가 직접 최근 업로드한 지역을 먼저 보여 주고 나머지는 전역 공개 격자 수 내림차순으로 보여 준다 MSG-460 사용자 정정 (2026-08-22)
2026-08-22 FR-EVENT-12(행사 영상 미션 비연계)를 구현됨으로 올렸다. 미션 쿼리 여섯 곳에 event_videos 안티조인이 들어가 진행도·완료 판정·방문 스팟·미션 영상 목록·격자별 영상 수에서 행사 영상이 빠진다. 요구 문안은 그대로이고 상태만 바뀌었다 MSG-450 구현 (2026-08-22)
2026-08-24 FR-ROUTE-10 문구를 조정했다. 재현 보장을 "같은 요청을 짧은 간격으로 다시 보내면 같은 순서"로 한정하고, 해석과 후보 데이터가 같으면 순서가 흔들리지 않는다는 문장을 붙였다. 원문은 기간 단서가 후보 데이터뿐이라 무기한 재현을 약속하는데, 자연어 해석이 완전 결정적이지 않고 결과 저장이 PRD 비목표라 충족이 불가능함을 MSG-457 스펙 Codex 리뷰가 적발했다. 스펙은 해석 캐시 창 안의 재요청 재현으로 이행한다(구체 창은 스펙 정의) 성민 확정 (2026-08-24), MSG-457 스펙 docs/spec/MSG-457.md
2026-08-24 FR-ROUTE-03~10·12·13과 NFR-SEC-08·09를 구현됨으로, FR-ROUTE-01·02·11을 진행 중으로 올렸다. 백엔드 route 패키지(추천 API 한 벌: 후보 수집·순서 배열·AI 소비·요청 제한·해석 캐시)가 검증 테스트 42건과 같은 브랜치에 실렸고, 진행 중 3건은 서버가 끝났고 FE 화면(입력 패널·지도 렌더·출발 지점 토글)이 남은 항목이다. 구현 중 확정 2건이 스펙에 반영됐다: 장소 검색 실패(5502)는 장소 후보 0으로 취급(FR-ROUTE-07 근거), 미션 대표 좌표가 뷰포트 밖이면 후보 제외(FR-ROUTE-06 도출, 스펙 미기재였던 규칙을 테스트로 고정) MSG-457 구현 (2026-08-24)
2026-08-24 FR-REGION-02(역지오코딩)·FR-REGION-15(시군구 목록)에 "비로그인으로도 조회할 수 있다"를 붙이고 둘을 진행 중으로 내렸다. NFR-SEC-01 예외 목록에 행정동 역지오코딩·시군구 목록을 추가하고 같은 이유로 진행 중이다. 상단 칩 개방(MSG-454)이 핫구역·미션만 열어 같은 화면의 행정동 이름 로드만 401로 남은 비대칭의 해소이고, 두 조회는 사용자 무관 값이라 응답 계약은 그대로다 사용자 확정 (2026-08-24), MSG-467, 정본 docs/prd/mission-map-explore.md 8절
2026-08-24 FR-REGION-02·FR-REGION-15·NFR-SEC-01을 진행 중에서 구현됨으로 올렸다. SecurityConfig가 행정동 역지오코딩·시군구 목록 GET 2종을 익명에 열었고, 수집률 stats 4종의 로그인 필수와 GET 한정은 그대로다. 검증은 RegionPublicAccessHttpTest 5건이 같은 브랜치에 실렸다 MSG-467 구현 (2026-08-24)
2026-08-24 FR-HOTZONE-13 등재. 지도 축소 시 핫구역을 도감 격자·미션 핀과 같은 행정 단위(동·구·시)로 묶어 핫 격자 수·대표 좌표·지역 이름으로 내려준다. 이름 규칙과 축척 전환은 FR-GRID-13·FR-MISSION-20과 동일, 세는 대상은 개별 조회와 같은 핫 판정 집합, 뷰포트 한 변 상한은 미션 집계와 같다(동 1도, 구 4도, 시 10도). 마커 숫자는 핫 격자 수로 확정하고 핫스코어 합산은 싣지 않는다. 세 레이어(도감·미션·핫구역) 중 핫구역만 축소 화면에서 낱개 격자 마커로 남아 있던 갭의 해소다 사용자 확정 (2026-08-24), 티켓 미발행, PRD docs/prd/hotzone-region-aggregation.md
2026-08-24 FR-HOTZONE-13의 티켓이 MSG-466으로 발번됐다(직전 행 등재 시점엔 미발행). PRD 파일도 docs/prd/MSG-466-prd.md로 리네임했다 MSG-466 발번 (2026-08-24)
2026-08-24 FR-HOTZONE-13을 계획에서 진행 중으로 올렸다(서버 몫 구현 완료, 마커 렌더링·축척 전환은 FE 잔여 — FR-MISSION-20과 같은 기준). 집계 엔드포인트 하나가 신설됐고, 판정 파이프라인을 개별 조회와 공유해 두 조회가 같은 핫 판정 집합을 본다. 마커 렌더링과 축척 전환은 FE 잔여다. 검증은 서비스 15건·HTTP 17건이며 기존 개별 조회 테스트 green 유지가 B 소비처(핫구역 진입 알림) 회귀 가드다 MSG-466 구현 (2026-08-24)
2026-08-24 FR-HOTZONE-13을 구현됨에서 진행 중으로 정정했다. 서버 몫(집계 조회·검증 테스트)은 실렸지만 마커 렌더링과 축척 전환이 FE 잔여인 종단 요구라, 서버 완료·FE 잔여를 진행 중으로 두는 FR-MISSION-20 기준을 따른다. 직전 이력 행의 구현됨 표기는 이 행으로 정정된다 MSG-466 커밋 리뷰 지적 반영 (2026-08-24)
2026-08-24 FR-VIDEO-03과 FR-VIDEO-08의 문안에 확정 시점 내용 검증을 더했다. 상태는 둘 다 구현됨 그대로이고, 지금까지 코드가 클라이언트 선언값(확장자·Content-Type)만 봐서 "형식은 mp4와 mov뿐"이라는 기존 요구가 강제되지 않던 구멍을 메운 것이다. 확정이 파일 앞 4KB를 읽어 컨테이너 구조를 판별하고, 영상이 아니면 3428로 거부해 격자 점령·뱃지·스트릭·미션 스탬프가 발급되지 않는다. 새 요구가 아니라 기존 요구의 강제 수단 추가라 PRD는 면제였다 MSG-392 구현 (2026-08-24)
2026-08-25 FR-MEDIA-19 등재. 저장·표시되는 영상 길이를 서버 실측 기준으로 확정했다. 인코딩이 성공하면 실측을 정수 초로 반올림해 1~30초 범위로 저장하고, 여유 구간(30~31초)은 30초로 저장한다. 인코딩 성공 전과 실패 영상은 신고 값을 잠정 표시값으로 쓰며, 교체하면 새 원본 실측으로 갱신된다. 서버가 이미 재고 있던 값을 판정에만 쓰고 버려 화면 길이가 실제와 어긋나던 QA 결함의 해소다. 판정 규칙(FR-VIDEO-01·FR-MEDIA-03)은 불변이라 FR-VIDEO-01 근거에 "판정만 정한다, 저장은 FR-MEDIA-19"라는 경계를 병기했다 MSG-470 (2026-08-25), PRD docs/prd/MSG-470-prd.md
2026-08-25 FR-MEDIA-19를 계획에서 구현됨으로 올렸다. 인코딩 성공 전이(ENCODING→READY·ENCODING→BLURRING)가 ffprobe 실측을 정수 초로 반올림해 1~30 범위로 저장한다. 31초 초과 실패 판정은 클램프보다 앞에 두어 원값으로 끝나므로 FR-MEDIA-03은 회귀하지 않는다(길이_초과_판정은_클램프_전_원값으로_한다가 순서를 고정). 검증은 전이 3건·라이터 3건·인코더 5건이고, 스테일 가드 skip 시 길이 덮어쓰기도 함께 skip되는 대칭 케이스를 포함한다 MSG-470 구현 (2026-08-25)
2026-08-25 FR-ROUTE-14 등재. 사용자가 문장에 화면 밖 지역을 말하면 그 사실을 안내받고 그 지역으로 지도를 옮길 수 있다. 지금은 서울 지도에서 부산을 말해도 서울 결과 여덟 개가 안내 없이 정상 응답으로 나가는데(2026-08-24 dev 실측), 이 조용한 오답을 금지하는 요구다. 추천 기준 자체는 계속 화면 범위라 FR-ROUTE-06과 모순되지 않는다 MSG-468 (2026-08-24 발견), PRD docs/prd/MSG-468-prd.md 초안
2026-08-25 FR-ROUTE-14 문안 확장. 화면 밖 지역 언급만이 아니라, 화면이 언급 지역의 일부만 담게 뚜렷이 좁은 경우(부산역만 보며 "부산 놀거리"를 묻는 경우)도 안내 대상에 넣었다. 언급 지역과 화면이 어긋나는 같은 문제의 두 형태라 한 요구로 묶는다. 추천 기준이 화면 범위라는 점은 그대로다 성민 제기·확정 (2026-08-25), PRD docs/prd/MSG-468-prd.md 반영
2026-08-25 FR-ROUTE-14를 계획에서 진행 중으로 올렸다. 서버 몫이 구현돼 추천 응답에 언급 지역 신호(이동과 축소 두 종류, 이름·중심·외접 사각형은 서버 데이터 정식 표기)가 실리고 검증 테스트 18건이 연결됐다. 안내 UI와 지도 이동·축소 제안은 FE 잔여라, 서버 완료·FE 잔여를 진행 중으로 두는 FR-HOTZONE-13 기준을 따른다 MSG-468 구현 (2026-08-25)
2026-08-25 비로그인 열람 개방을 여섯 종 더 넓혔다. FR-ZONE-11·FR-SEARCH-01·FR-SEARCH-07·FR-MAP-09에 비로그인 허용 문구를 더하고, FR-VIDEO-17·18 근거에 격자 대표 영상과 격자 전역 영상 목록의 개방 사실을 적었으며, NFR-SEC-01 예외 목록을 여섯 종으로 확장했다. FR-SEARCH-06은 문안 자체가 바뀐 유일한 항목이다. 중복 제거 기준을 "같은 사용자"에서 "같은 검색자"로 넓혀 비로그인 방문자도 방문자 식별값 기준으로 같은 규칙을 받고, 식별값이 없거나 형식을 벗어나면 검색은 정상이되 집계에서 빠진다. 단일 격자 조회(FR-GRID-06)와 AI 경로 추천은 로그인 유지로 확정돼 손대지 않았다 사용자 확정 (2026-08-25), MSG-469, 정본 docs/prd/mission-map-explore.md 8절
2026-08-25 FR-FRIEND-14 등재. 친구 코드 미리보기 응답에 조회자와 코드 주인의 관계 상태 다섯 값(SELF, NONE, OUTGOING_PENDING, INCOMING_PENDING, FRIENDS)을 동봉한다. 미리보기가 닉네임만 줘서 자기 코드나 이미 친구인 상대에게도 요청 버튼이 활성화되고, 역방향 대기 상대에게 보내면 모르는 새 자동 수락되는 문제를 확인 단계에서 갈라주는 요구다. 요청 가능 여부의 최종 판정은 요청 API 유지라 FR-FRIEND-02와 모순되지 않는다 MSG-391 (2026-08-25 등재), PRD docs/prd/MSG-391-prd.md 초안
2026-08-25 FR-FRIEND-14를 계획에서 구현됨으로 올렸다. 미리보기 응답에 관계 상태 다섯 값이 실리고 판정은 조회 시점 실시간이며, 요청 API의 최종 판정과 기존 실패 계약은 그대로다. 요구 문안이 전부 서버 응답 계약이라 서버 구현 완료로 충족되고, 검증 테스트(FriendIntegrationTest 관계 5종과 정합, FriendControllerTest 직렬화)가 같은 브랜치에 함께 실렸다 MSG-391 구현 (2026-08-25)
2026-08-25 FR-VIDEO-03의 근거에 MSG-471을 덧붙였다. 문구·상태는 불변이다. 확정 시점 컨테이너 판별에 남아 있던 빈틈 둘을 막은 것으로, 브랜드가 들어갈 자리가 없는 8바이트 ftyp와 ftyp·moov를 한 번도 못 본 채 끝나는 파일이 통과하던 경로다. 후자는 MSG-392 절차 g의 "정확 종료 통과"를 뒤집는 번복이라 MSG-392 스펙 세 자리에 정정 블록을 병기했다(원문 삭제 없음). ftyp 최소 길이 비교는 포화된 오프셋이 아니라 선언 길이로 하며, 창이 짧을 때 정상 ftyp가 오거부되던 것을 회귀 테스트로 고정했다 MSG-471 구현 (2026-08-25)
2026-08-26 AI 경로추천 사용 흐름 자동화(MSG-487)를 반영했다. FR-ROUTE-11은 출발지 사용자 지정(토글)을 실행 시점 화면 자동 판정으로 개정하고 미확정이던 입력 방식을 입력 없음으로 닫았다. FR-ROUTE-14는 이동 제안(수락 후 이동, 재추천 수동)을 확인 없는 자동 이동과 자동 재추천으로 개정했다. 두 개정 모두 경쟁 서비스(Mindtrip·Layla)에서 자동 처리가 기본 동작이라는 실사용 비교가 근거다. FR-ROUTE-12에는 자동 이동 직후 재요청 1회 예외를 더해 구현됨에서 진행 중으로 내렸다(MSG-468 PRD의 "예외 없음" 확정 번복, 예외 서버 미구현). FR-ROUTE-15(실행 시점 화면 축척 1~2km 정규화)를 계획으로 신설했고, 축소 안내의 소비 방식은 축척 정규화와 자기모순이라 스펙으로 위임했다 MSG-487 (2026-08-26 성민 확정), PRD docs/prd/MSG-487-prd.md 검토됨
2026-08-26 MSG-487 스펙 Codex 리뷰가 적발한 문구 부정확성 두 건을 정정했다. FR-ROUTE-12의 "한 번의 실행이 쓰는 외부 호출은 최대 두 번"을 "추천 요청은 최대 두 번"으로 바꿨다. 추천 요청 1회가 해석·설명·장소 검색 외부 호출 최대 세 번을 동반해 문자 그대로는 거짓이었고, 제한이 실제로 강제하는 단위가 추천 요청이다. FR-ROUTE-15는 "대역을 벗어나면 맞춘다"를 "항상 목표 값(약 2km)으로 맞추고 1~2km 대역은 이산 줌 단계의 허용 범위"로 바꿨다. 대역 안 유지 해석이면 같은 자리·같은 문장의 동일 범위 요구가 성립하지 않기 때문이다. 두 건 모두 확정 의도의 표현 정정이라 요구 변경이 아니다 MSG-487 스펙 Codex 리뷰 3라운드 (2026-08-26), 스펙 docs/spec/MSG-487.md 결정 3
2026-08-26 MSG-487 스펙 Codex 리뷰 4라운드가 적발한 정합 누락 두 건을 정정했다. FR-ROUTE-14는 "좁은 화면 처리 미정"을 확정으로 바꿨다. 위임받은 스펙 결정 1이 축소 신호를 화면이 소비하지 않는 것(별도 안내 없음, 서버 신호 생성은 지표 실측 재료로 불변)으로 정했기 때문이다. 함께 PRD FR-6도 3라운드 정정(항상 목표 약 2km, 대역은 이산 줌 허용 범위)이 SRS FR-ROUTE-15에만 반영되고 PRD에 빠져 있던 것을 맞췄다 MSG-487 스펙 Codex 리뷰 4라운드 (2026-08-26), 스펙 docs/spec/MSG-487.md 결정 1·3
2026-08-26 FR-ROUTE-12를 진행 중에서 구현됨으로 올렸다. MSG-487 서버 구현으로 자동 이동 직후 재요청 1회 예외가 들어갔다. 요청 제한 맵을 사용자당 상태 하나(시도 시각과 예외 플래그)로 바꿔 판정과 기록을 원자 전이 한 번으로 묶었고, 부여는 원 요청의 기록 시각에 바인딩해 늦은 응답이 남의 창에 예외를 달지 못한다. 검증 테스트 9건이 같은 브랜치에 함께 실렸다. FR-ROUTE-07은 근거만 갱신했다(상태 불변) — 결과 부족 안내 문구가 자동 이동 흐름 기준으로 교체돼 지도 이동 제안 대신 문장과 지역 변경을 권한다 MSG-487 서버 구현 (2026-08-26)
2026-08-26 FR-SEARCH-16·17 등재, FR-SEARCH-02 개정. 검색이 지도 중심 좌표를 함께 받아 그 좌표 20km 안 장소를 주고, 근처에 결과가 없으면 위치 없는 검색과 같은 결과로 되돌아가며, 좌표 없는 요청은 종전 그대로다. 좌표 한쪽만 오거나 범위를 벗어나면 400(5400)이고 조용한 무시는 하지 않는다. FR-SEARCH-02는 정렬을 조건 없이 공급자 정확도순으로 못 박고 있어 위치 랭킹과 정면으로 어긋나 "위치 신호가 없는 검색은"으로 한정했다. 건수 상한 15건과 빈 검색어 규칙은 불변이다 MSG-481 등재 (2026-08-26 팀원 K 확정), PRD docs/prd/MSG-481-prd.md 검토됨
2026-08-26 FR-SEARCH-16·17을 계획에서 구현됨으로 올렸다. 문안은 불변이다. 서버 구현이 끝나 검색이 지도 중심 좌표를 받고, 근처 0건이면 위치 없이 재호출하며, 좌표 없는 요청은 종전 그대로이고, 좌표 형식 이탈은 400(5400)이다. 검증 테스트가 같은 브랜치에 함께 실렸다(검색 도메인 33 → 55건, 실패 0). 요구 문안이 전부 서버 응답 계약이라 서버 구현 완료로 충족된다. rtm도 같은 커밋에서 재생성했다 MSG-481 구현 (2026-08-26)
2026-08-26 FR-SEARCH-16의 근거에 실측 한계를 덧붙였다. 문안과 상태는 불변이다. 되돌아가는 조건이 "근처 0건"이라, 반경 안에 이름이 비슷한 다른 장소가 몇 건이라도 있으면 먼 곳의 고유명사는 끝내 나오지 않는다. 부산 좌표의 "제주공항" 검색에서 이름에 제주가 들어간 부산 업체 4건이 잡혀 제주국제공항이 빠지는 것을 실 카카오 키로 확인했다. 그대로 두기로 확정했고 반려한 대안(임계 완화·항상 두 번 호출)과 재검토 조건은 PRD §9가 정본이다 MSG-481 실측 (2026-08-26 팀원 K 확정)
2026-08-26 FR-ROUTE-16·17, NFR-SEC-10, NFR-OPS-09 등재, FR-ROUTE-05 개정. AI 경로 추천의 지점 연결선을 실제 보행로 좌표열로, 카드 거리 안내를 실제 걷는 거리로 바꾼다. MSG-457 스펙의 비목표(도보 경로 계산)를 뒤집는 요구사항 변경이다. 보행 경로는 추천 응답과 분리된 별도 조회라 추천 API 계약은 불변이고, 얻지 못한 구간은 직선 폴백으로 남아 추천은 죽지 않는다. 인증 키는 서버에만 두고, 외부 호출은 일 1,000건 한도 안에서 좌표쌍 캐시(24시간 상한, TMap 약관 원문 확인)로 방어한다. FR-ROUTE-05는 설명 속 직선거리 제거를 확정해 진행 중으로 내렸다. 제약 조건(외부 약관)·가정 및 의존성·소프트웨어 인터페이스에 도보 길찾기 공급자를 추가했다 MSG-483 등재 (2026-08-26 성민 확정), PRD docs/prd/MSG-483-prd.md 검토됨
2026-08-26 MSG-483 서버 구현 완료로 상태를 올렸다. NFR-SEC-10·NFR-OPS-09는 구현됨(서버로 완결 — appKey 서버 보관·기동 검증·Redis 한도 카운터·좌표쌍 캐시 24시간), FR-ROUTE-05도 구현됨(추천 이유에서 직선거리 항목 제거, STRICT 단언 연결). FR-ROUTE-16·17은 진행 중 — 조회 API·TMap 프록시·부분 실패 200·요청 내 단락은 서버에 들어갔고 FE 화면(실경로 선 렌더·실거리 카드·직선 폴백 렌더)이 남았다. 검증 테스트가 같은 브랜치에 함께 실렸다(route+가드 107건 green). 구현 중 스펙 정정 2건: 캐시·리미터 클래스 분리 신설(리뷰 수용), 요청 좌표 박싱 Double 전환(Jackson 3가 원시 double 누락에 파싱 실패를 던져 공통 400으로 새는 것을 TDD 실측 — 14402 수렴 우선) MSG-483 구현 (2026-08-26)
2026-08-27 FR-MISSION-19를 계획에서 진행 중으로 올렸다. 문안은 불변이다. 앞 문장("격자 표시명으로 대신 보여준다")은 서버 구현으로 충족됐다 — 시더가 적재 시점에 명소 이름·구역 표시명·행정동 이름 순으로 최종 문자열을 정해 저장하고 조회는 통과만 하며, 품는 행정동이 없는 해안 지점은 최근접 행정동으로 채운다. 뒤 문장("정식 명소가 아님을 구분한다")은 미충족이라 구현됨이 아니라 진행 중이다 — 이름 출처를 응답에 담지 않기로 확정했고(PRD 비목표, 스펙 D-3) 둘을 시각적으로 가를지는 디자인이 정하지 않아 별도 티켓이 필요하다. 검증 테스트가 같은 브랜치에 함께 실렸다. rtm도 같은 커밋에서 재생성했다 MSG-492 구현 (2026-08-27), PRD docs/prd/MSG-492-prd.md · 스펙 docs/spec/MSG-492.md
2026-08-27 NFR-PERF-08의 30초 목표를 동시 업로드 세 건, 3회 반복까지 넓히고 진행 중으로 바꿨다. dev 연속 업로드 실측에서 세 번째 영상이 30.4초로 목표를 넘긴 것이 근거다. NFR-OPS-10도 새로 등재해 두 실행 노드 사이의 작업 유실 0건, 중복 종결 0건과 READY 또는 FAILED 수렴을 요구한다. 기존 MSG-241·382는 늦은 결과만 막고 JVM 인메모리 큐가 재시작할 때의 작업 복구는 하지 못한다 MSG-494 (2026-08-27), PRD docs/prd/MSG-494-prd.md 초안
2026-08-27 MSG-494 PRD를 검토됨으로 올렸다. 두 실행 노드의 인코딩 분산, 동시 세 건의 30초 목표, 작업 유실과 중복 종결 0건을 승인했다. 실행 방식과 작업 대기 경로, 재처리 상한은 스펙에서 비교해 정한다 성민 승인 (2026-08-27), PRD docs/prd/MSG-494-prd.md 검토됨
2026-08-31 FR-ROUTE-18 등재, FR-ROUTE-05 개정. 관심사가 글자 겹침으로만 반영돼 문장을 바꿔도 결과가 그대로인 문제의 교정이다. 관심사는 표기가 달라도 뜻이 통하면 후보와 이어지고 이어진 후보가 먼저 뽑히며, 억지 이어짐은 금지다. FR-ROUTE-05에는 지점 고유 사실과 이어진 관심사 표기를 추가해 진행 중으로 내렸다. 판정 방식은 스펙에서 정하되 외부 호출 수 불변과 결정성이 제약이고, AI 계약(해석·이유 문장화)은 불변이라 FillMap-AI 배포가 없다. 사용자 원문의 이유 문장화 전달은 환각 방어 유지를 이유로 비목표 확정 MSG-514 등재 (2026-08-31 성민 확정), PRD docs/prd/MSG-514-prd.md 검토됨
2026-08-31 FR-ROUTE-18 문면 정정. 원 문면("각 관심사에 맞는 후보가 화면 안에 있는 한 결과가 달라진다")은 표기만 다르고 뜻이 같은 두 관심사가 같은 후보 집합에 걸리는 정당한 동치 케이스까지 위반으로 만들었다. MSG-514 스펙 Codex 리뷰 1라운드가 적발해 "서로 다른 후보 집합에 걸리는 한"을 조건으로 명시했고, 동치 케이스는 같은 동선에 지점별 이유의 관심사 표기만 다른 것이 옳은 동작으로 정의됐다. 상태는 계획 그대로다 MSG-514 스펙 리뷰 (2026-08-31 성민 승인), 스펙 docs/spec/MSG-514.md
2026-08-27 FR-REGION-10을 개정하고 계획 없이 진행 중으로 내렸다(구현됨이었으나 개정으로 재작업 발생). 무귀속 격자의 이름 공백을 단일 격자 조회에 한해 가장 가까운 행정동 이름으로 채우기로 했다. 표시 전용이라 수집률·탐험률 귀속은 변하지 않는다 — 바다 격자를 행정동에 귀속시키는 대안은 수집률 분자에만 들어가 100% 초과가 가능해지고(FR-REGION-04 위반 위험) 분모 정의(FR-REGION-01·14)까지 손봐야 해 기각했다. 뷰포트·핫구역 응답은 격자 번호를 노출하지 않아 종전대로 빈 이름을 유지한다 MSG-493 등재 (2026-08-27 팀원 K 확정), PRD docs/prd/MSG-493-prd.md 검토됨
2026-08-27 FR-REGION-10을 진행 중에서 구현됨으로 올리고 문안에 서비스 범위 한정을 더했다(범위 밖 좌표는 종전대로 빈 이름에 200 — 6400을 새로 새게 하지 않는 기존 가드 유지). 단일 격자 조회의 최근접 이름 폴백이 검증 테스트와 같은 브랜치에 실렸다. 함께 FR-REGION-11을 한정했다 — "어디서 보더라도 같다"는 행정동에 속하는 격자의 성질이고, 무귀속 격자는 단일 조회만 이름을 채워 경로별로 다른 것이 의도된 동작이다 MSG-493 구현 (2026-08-27)
2026-08-27 FR-REGION-10에 거리 상한 3km를 더했다(상태 불변). 초안의 상한 없음은 코스 경유 지점(검증된 972칸, 최대 2,189m) 전제를 지도 전체 격자에 그대로 옮긴 것이라, 바다 한가운데 격자를 누르면 90km 떨어진 동 이름이 붙었다. 3km는 실측 최댓값을 여유 있게 덮으면서 먼바다를 거른다. 코스 시더의 상한 없음(MSG-492 D-5)은 전제가 달라 그대로다 MSG-493 상한 확정 (2026-08-27 팀원 K)
2026-08-27 FR-AUTH-13·14, FR-EVENT-13~15 등재 (전부 계획). 행사 등재가 수동 시드에서 행사 운영자 콘솔 신청과 관리자 심사로 넓어지는 계획을 등재했다. 계정은 관리자 수동 발급(role=ORG, 자체 로그인), 신청은 유형 3종(지역축제·팝업스토어·행사방)과 격자 사각형 위치, 심사는 승인 시 기존 행사 도메인 생성과 기존 노출 채널 재사용이다. 구 행사방 PRD의 "운영자용 행사 등록 화면은 만들지 않는다"를 뒤집는 방향이라 FR-EVENT-01(수동 시드·BTS급 눈높이)과 FR-AUTH-11(이메일 로그인은 로컬 테스트 용도)의 근거에 재정의 예고를 달았다. 시안이 열린 판단으로 남긴 3건(승인 행사 노출 방식·위치당 영역 크기 상한·승인 후 일정 수정 정책)과 콘솔 세부 3건은 미해결 질문에 올렸다 PRD docs/prd/event-submission.md 초안 (2026-08-27, 웹 ver 13 시안 15473:3730)
2026-08-28 FR-AUTH-11을 재정의해 구현됨으로 올렸다(이메일 로그인은 역할 무관 프로덕션 경로, "로컬 테스트 용도로만" 폐기 — 행사 운영자·관리자 계정이 이 경로로 로그인한다. signup 운영 차단 여부는 MSG-360 별도 판단으로 분리). 같은 충돌로 NFR-SEC-07의 로그인 절을 좁혔다(소셜 전용은 일반 사용자 한정, 미충족 사유는 signup 개방만 잔존). FR-AUTH-14를 계획에서 구현됨으로 올렸다(ORG 역할값 V45, 로그인·프로필 응답의 role 노출, /api/org/** 인가와 catch-all의 USER·ADMIN 한정 — ORG의 일반 API 접근 차단은 2026-08-28 사용자 확정으로 FR-5를 문자 그대로 구현). FR-AUTH-13은 진행 중으로 올렸다(기존 로그인 경로 재사용 구간까지 구현, 계정 발급·메일 발송은 MSG-499, 첫 로그인 강제 변경은 MSG-497) MSG-496 구현 (2026-08-28), PRD docs/prd/event-submission.md 검토됨 승격(2026-08-28 승인) 반영
2026-08-28 FR-AUTH-15(첫 로그인 비밀번호 강제 변경, 건너뛰기 없음)·FR-AUTH-16(비밀번호 변경·재설정 — 링크 30분 1회용, 요청 응답의 계정 존재 은닉, 재설정 시 기존 세션 무효화)을 구현됨으로, FR-USER-16(행사 운영자 담당자 정보 자체 수정, 공식 이메일은 변경 요청 후 관리자 승인)을 진행 중으로 등재했다. 셋 다 PRD event-submission FR-21·22·23(피그마 댓글 #103 확정)의 SRS 편입이고 검증 테스트와 같은 브랜치에 실린다. FR-AUTH-13 근거의 첫 로그인 강제 변경 언급은 FR-AUTH-15 분리 참조로 바꿨다 MSG-497 구현 (2026-08-28)
2026-08-28 FR-EVENT-16 등재 (진행 중). 등록 유형 "이벤트"의 참여 대상인 승인 이벤트 목록 조회를 등재했다. 목록 범위는 이벤트 카테고리(지역축제와 팝업스토어 제외)의 종료 전 회차만으로 사용자 확정(시안 배지는 구판 잔재), 노출 시작 전 예정 회차도 콘솔에는 보인다. FR-EVENT-13의 세 번째 유형 서술(행사방)을 v2.1 이벤트 참여형으로 고치는 개정은 MSG-498 레인이 실을 몫이라 이번에 손대지 않았다 MSG-501 등재 (2026-08-28 사용자 확정), PRD docs/prd/event-submission.md FR-26 최소 개정
2026-08-28 FR-EVENT-16을 진행 중에서 구현됨으로 올렸다. 행사 운영자 콘솔의 승인 이벤트 목록 조회(GET /api/org/events)가 검증 테스트 25건과 같은 브랜치에 실렸다. 노출 조건은 종료 전 회차만이고 노출 시작 전 예정 회차도 콘솔에는 보인다(참여 신청 준비 기간 근거) MSG-501 구현 (2026-08-28)
2026-08-29 FR-AUTH-13을 진행 중에서 구현됨으로 올렸다. 문안은 불변이다. 행사 운영자 계정 발급 축이 서버에 전부 들어갔다 — 관리자 직접 발급과 발급 요청 승인이 같은 발급 코어를 쓰고(계정 생성·초기 비밀번호 생성·커밋 후 발송·발송 실패 격리), 초기 비밀번호 평문은 메일 본문 한 번 외에 응답·로그·DB 어디에도 남지 않는다(로그 캡처 단언, 발송 실패 예외를 로거에 넘기지 않는 것까지 회귀 테스트로 고정). 재생성은 재발급이라 새 비밀번호로 교체하고 이전 값을 즉시 무효화하며, 대상은 아직 초기 로그인을 마치지 않은 계정으로 한정한다(사용 중 계정에 재발급하면 발급자가 다시 비밀번호를 아는 상태가 되어 FR-AUTH-15의 목적이 무너진다). 검증 테스트 48건이 같은 브랜치에 실렸다. 계정이 없는 신청자의 공개 접수 폼과 관리자 큐(PRD FR-6)도 같은 티켓이 구현했으나 대응 SRS 행이 없어 등재 여부는 별도 판단으로 남긴다. FR-USER-16은 진행 중 그대로 두고 잔여 범위를 좁혔다 — 이번에 생긴 관리자 큐는 계정 발급 요청 전용이고 아이디 변경 요청의 검토·승인은 MSG-500 몫이다 MSG-499 구현 (2026-08-29), 스펙 docs/spec/MSG-499.md
2026-08-29 FR-EVENT-13·FR-EVENT-14를 계획에서 구현됨으로 올렸다. 행사 운영자 콘솔의 신청 제출(presign 포함)·내 목록·상세·반려본 재제출 API 5개가 검증 테스트와 같은 브랜치에 실렸다. 위치당 영역 상한은 사각형 합집합 기준 81칸으로 판정하고, 존재 은닉은 13430 단일 응답, 재제출 전이는 소유권 술어 포함 조건부 UPDATE로 원자화했다. 반려 행 쓰기와 승인 반영(FR-EVENT-15)은 MSG-500 몫으로 계획 유지 MSG-498 구현 (2026-08-29)
2026-08-30 FR-EVENT-15 문장을 재작성하고 계획에서 진행 중으로 올렸다. 승인 반영이 유형별 분기로 확정되어(지역축제는 축제 미션, 팝업스토어는 팝업 미션으로 칩 등재, 이벤트 참여형만 부모 이벤트 아래 행사 위치로 반영 + 참여 속성 부가 노출) 구 "행사 도메인에 시리즈·회차·위치 생성" 서술을 대체했다. 반려 항목 코드 4종 필수도 함께 등재했다. FR-EVENT-01 근거의 "등재 기준 재정의 대상" 예고는 이 확정으로 닫았다 — 행사 칩에 새 행사가 오르는 경로는 여전히 수동 시드뿐이다 2026-08-29 팀원 K 확정, PRD docs/prd/event-submission.md v2.2(MSG-502 브랜치 반영 중), 스펙 docs/spec/MSG-500.md
2026-08-30 FR-EVENT-17(관리자 노출 중지 — 사유 필수, 사용자 대면 전 경로 즉시 제외, 직접 접근 포함, 완료 기록·뱃지 비회수, 운영자 사유 통지)과 FR-EVENT-18(승인 행사 상태별 목록과 건수, 중지 식별)을 진행 중으로 등재했다. PRD FR-20·FR-25에 대응하는 SRS 행이 없어 MSG-500의 M4 테스트가 인용할 ID가 비어 있던 갭을 선등재로 닫았다(MSG-390의 소급 주석 교훈) MSG-500 구현 중 (2026-08-30), PRD docs/prd/event-submission.md FR-20·25
2026-08-30 MSG-500 구현 반영. FR-USER-16을 구현됨으로 올렸다(잔여였던 아이디 변경 요청의 관리자 검토·승인 처리 완료 — 승인은 요청 전이와 이메일 교체 한 트랜잭션, 검토 시점 가드, 새 이메일 통지). FR-EVENT-18도 구현됨(승인 행사 상태별 목록, KST 파생 탭). FR-EVENT-15·17은 진행 중 유지 — 미션 경로(심사·승인·반려·중지)는 구현됐지만 이벤트 참여형 승인 반영과 위치 숨김·노출 영역 재계산이 MSG-502(V50) 머지 후 잔여라서다. 검증 테스트는 같은 브랜치의 구현 커밋들에 동반된다 MSG-500 구현 (2026-08-30), 브랜치 feature/MSG-500-admin-review
2026-08-29 FR-EVENT-17 등재 (구현됨). 등록 유형 "이벤트"의 참여 신청 접수를 등재했다. 신규 엔드포인트 없이 MSG-498의 신청 API 5개가 EVENT 유형을 받는 구조라 접수 뒤 흐름(심사 중·신청 번호·내 목록·상세·재제출)은 세 유형이 같은 경로를 쓴다. 위치는 대표 위치 한 곳으로 한정했는데(FR-EVENT-13의 여러 위치 허용에 대한 예외이고 PRD v2.2가 FR-8에 예외 문장으로 명문화했다) 대표 격자 한 점만 받는 안은 기각했다 — 승인 결과가 회차 아래 위치 1행 + 격자 전개라 점 하나로는 승인 시점에 영역을 지어낼 수 없다. 종료 판정은 ends_at <= now로 FR-EVENT-16 노출 조건의 정확한 여집합이라 종료 정각에도 목록과 신청의 경계가 갈리지 않는다. 공개 기간이 부모 회차 기간 안에 들어야 한다는 교차 검증은 두지 않았다(부모는 UTC 시각, 신청은 KST 날짜 라벨이라 경계일 단정이 애매하고 타당성은 관리자 심사가 본다). FR-EVENT-13 문장에는 세 번째 유형의 상호참조를 달았다. 승인 반영(FR-EVENT-15)은 MSG-500 그대로 계획 유지 MSG-502 구현 (2026-08-29), 스펙 docs/spec/MSG-502.md
2026-08-30 FR-EVENT-15와 FR-EVENT-18을 구현됨으로 올렸다. MSG-502 머지 후 참여형 잔여(승인의 위치 전개·참여 속성 노출, 중지의 위치 숨김·노출 영역 재계산)가 같은 브랜치에서 완결돼 두 요구의 "승인 산출물 전부" 조건이 성립했다. 병합 과정에서 502가 develop에 선점한 FR-EVENT-17(참여형 접수)과 이 브랜치의 옛 17(중지)·18(목록)이 충돌해, 중지를 18로·목록을 19로 재번호하고 테스트 주석과 문서 참조를 함께 옮겼다(ID 불변 원칙은 develop 선점자 기준) MSG-500 M6 구현 (2026-08-30), 브랜치 feature/MSG-500-admin-review
2026-08-31 FR-ROUTE-18과 FR-ROUTE-05를 구현됨으로 올렸다. 관심사 판정이 글자 겹침에서 동의어 사전 기반으로 넓어졌고(개념 15, 근거어 94건 전부 dev 시드 실측 — 0회 근거어와 "업데이트" 부분 문자열 오탐을 리뷰에서 걸러냄), 추천 이유에 지점 고유 사실과 이어진 관심사가 실린다. 개선 전후 고정 입력 실측에서 관심사 일치 비율이 20.4%에서 30.0%로 올랐고 감소 셀은 없다. 검증 테스트가 같은 브랜치에 함께 실렸다 MSG-514 구현 (2026-08-31)
2026-08-31 FR-ROUTE-13을 개정하고 진행 중으로 내렸다. 총 이동 거리 상한(도보 환산 10km)과 초과 시 지점 축소 우선을 요구에 추가했다 — 기존 구현이 지점 수 상한(8)만 지키고 총량을 안 봐서 넓은 화면에서 하루에 다닐 수 없는 동선이 나오던 문제의 교정. 시간 모델 미도입, 축소 시 별도 안내 없음, 지점 수 상한 8 유지도 같은 날 확정됐다. 신규 ID 없이 기존 항목 세부화로 처리했다 MSG-515 PRD 승인 (2026-08-31), PRD docs/prd/MSG-515-prd.md
2026-08-31 FR-ROUTE-13을 구현됨으로 올렸다. 총 이동 거리 상한이 코드에 들어갔다 — 순서 규칙은 그대로 두고 확정된 방문 시퀀스를 앞에서부터 걸으며 보정 거리(하버사인 × 우회 계수 1.3)를 누적해 10km를 넘게 만드는 지점부터 버린다. 출발지가 있으면 첫 구간도 예산에 들고, 몰린 화면은 종전과 같은 결과다(기존 route 테스트가 픽스처 1건 재배치 외 무수정 통과). 지표에 잘린 지점 수(trimmed)가 남아 상한 10km의 실사용 발동 빈도를 실측할 수 있다. 검증 테스트 12건이 같은 브랜치에 함께 실렸다 MSG-515 구현 (2026-08-31)
2026-08-31 FR-ROUTE-19를 신규 등재했다(계획). 장소 방문 동선과 무관한 문장에는 동선 대신 빈 목록과 전용 안내가 온다 — 지금은 무관 문장도 빈 해석으로 돌아와 화면 안 후보 여덟 개가 그대로 나가던 구멍의 교정. 판정은 AI 해석 계약에 싣고(서버 추정안은 "볼 것이 없는 지역"과 구분 불가로 기각), 애매하면 추천 시도, 경계 문장(지역만·관심사만·정보 없는 여행 문장)은 정상 추천 유지가 같은 날 확정됐다. FR-ROUTE-06은 개정하지 않는다(빈 해석 유효 지위 불변, 관련성은 별도 축) MSG-513 PRD 승인 (2026-08-31), PRD docs/prd/MSG-513-prd.md
2026-08-31 FR-ROUTE-19를 진행 중으로 올렸다. 서버 몫이 코드에 들어갔다 — AI 해석의 관련성 판정(related)을 받아 무관 문장이면 후보 수집 전에 빈 목록과 전용 안내로 조기 반환하고, 구버전 AI 응답의 필드 부재는 true로 한시 수용한다(MSG-533 배포 후 필수 승격). 애매하면 추천 시도, 경계 문장(지역만·관심사만·정보 없는 여행 문장) 정상 추천, 요청 제한 소모가 검증 테스트 10건으로 같은 브랜치에 고정됐다. AI 계약 개정이 MSG-533에 남아 구현됨이 아니라 진행 중이다 MSG-513 서버 구현 (2026-08-31)
2026-09-01 FR-ROUTE-19를 구현됨으로 올렸다. AI 계약 개정(MSG-533)이 배포됐고(실영상 E2E green, dev 실호출에서 "롤 정글 동선 짜 줘"가 related=false) 서버의 related 한시 수용을 필수로 승격해 부재도 다른 키와 같은 형태 위반이 됐다. 무관 3문장과 경계 4문장의 실모델 판정 실측이 전건 기대값과 일치했다(FillMap-AI results/MSG-533-relevance.json) MSG-533 배포·승격 (2026-09-01)
2026-09-01 FR-ROUTE-20을 신규 등재했다(계획). 지점이 1개 이상 실리는 추천 응답에 동선 전체의 종합 추천 이유가 함께 온다 — 지점별 이유(FR-ROUTE-05)만으로는 사용자가 적은 문장과 동선 구성의 연결을 설명하는 자리가 없던 갭의 보완. 빈 해석에도 화면 범위 기준 설명이 오고, 결과에 실린 지점과 문장에서 확인되는 내용만 담기며, 빈 목록 응답에는 기존 안내가 그 자리를 맡는다. FR-ROUTE-05는 별개 축으로 불변이다 MSG-539 PRD 승인 (2026-09-01), PRD docs/prd/MSG-539-prd.md, AI 분리 티켓 MSG-540
2026-09-01 FR-ROUTE-20을 진행 중으로 올렸다. 서버 몫 1차가 코드에 들어갔다 — explain 응답의 종합 이유(summary)를 형태 검증(개행 없는 1~240자, 위반 14502) 후 채택하고 부재와 명시 null은 한시 수용하며, explain 요청 본문은 구계약 그대로다. 구계약 AI가 정의 밖 요청 필드를 거부해(extra="forbid" 실측) 서버가 먼저 보내면 전면 장애가 되기 때문으로, related 때와 반대 방향의 3단계 전환이다. 요청에 문장을 동봉하고 부재를 위반으로 승격하는 것은 MSG-540 완료 조건이라 구현됨이 아니라 진행 중이다. 검증 테스트 10건이 같은 브랜치에 고정됐다 MSG-539 서버 1차 구현 (2026-09-01)
2026-09-01 FR-AUTH-17을 신규 등재했다(계획). 첫 로그인 비밀번호 설정은 현재 비밀번호 입력 없이 새 비밀번호만으로 한다 — 기존 변경 API가 현재 비밀번호 필수라 웹 시안 1-3a(새 비밀번호 두 칸)를 부를 API가 없던 갭의 교정. 강제 변경 자체(FR-AUTH-15)와 기존 변경·재설정(FR-AUTH-16)은 불변이고 첫 설정의 입력 계약만 새로 규정했다. 설정 완료 계정의 재사용 거절과 초기 비밀번호 재사용 거절이 함께 확정됐다 MSG-537 PRD 승인 (2026-09-01), PRD docs/prd/MSG-537-prd.md
2026-09-01 FR-AUTH-17을 구현됨으로 올렸다. 첫 로그인 설정 전용 API가 코드에 들어갔다 — 새 비밀번호 하나로 설정하고, 성공 효과(플래그 해제·잔여 링크 폐기·세션 유지)는 기존 변경과 같으며, 설정 완료 계정 재요청은 전용 코드 2446으로 거절된다. 구현 중 Codex 리뷰가 재발송 인터리빙 우회(P1)를 적발해 재발송이 기존 세션을 끊도록 함께 고쳤다. 검증 테스트 11건이 같은 브랜치에 실렸다 MSG-537 구현 (2026-09-01)
2026-09-01 FR-ROUTE-20을 구현됨으로 올렸다. AI 계약 개정(MSG-540)이 배포됐고(실영상 E2E green, dev 실호출에서 text 동봉 요청에 summary가 실리고 문장 밖 사실을 지어내지 않는 것을 확인) BE를 승격해 explain 요청에 사용자 문장을 동봉하기 시작했으며 summary 부재와 명시 null도 형태 위반(14502)이 됐다. 실모델 실측 원자료는 FillMap-AI results/MSG-540-schema.json·MSG-540-explain.json MSG-540 배포·승격 (2026-09-01)
2026-09-01 FR-EVENT-02를 개정하고 진행 중으로 내렸다. 이벤트 헤더와 행사 위치 양쪽의 재료에 대표 이미지를 넣고, 이미지가 없으면 그 자리만 비운 채 나머지가 정상 표시된다는 조건을 명시했다. 정본 PRD US-002 판정문은 처음부터 "행사 이미지"를 포함했는데 이 행이 헤더 재료를 이름·기간·상태로만 옮겨 적었고, 구현이 이 행을 따라가면서 이미지가 통째로 빠진 채 상태만 구현됨으로 남아 갭이 드러나지 않았다. 실측으로 회차에는 이미지 컬럼 자체가 없고 위치는 컬럼이 있으나 참여형 승인(FR-EVENT-15)으로만 채워져 시드 위치 9곳이 비어 있다. 신규 ID 없이 기존 항목 세부화로 처리했다 MSG-538 등재 (2026-09-01), PRD docs/prd/event-room-location-videos.md US-002
2026-09-02 FR-EVENT-02를 구현됨으로 되올렸다. 2026-09-01에 이미지 미구현을 이유로 진행 중으로 내렸던 항목이다. 서버가 회차 상세와 위치 목록에 대표 이미지 주소를 담고, dev 배포와 버킷 공개까지 끝나 실제로 열리는 것을 실측했다(GET /api/event-occurrences/3 → imageUrl 200, 시드 이미지 13장 전부 200). 저작자 표시 자리 부재는 남아 있지만 요구 충족 여부와 다른 축이라 상태에 반영하지 않고 스펙 미해결 질문으로 남긴다. prod 버킷 정책·객체는 배포 시점 과제다 MSG-538 배포 확인 (2026-09-02), PR #259
2026-09-05 FR-AUTH-18을 신규 등재했다(진행 중). 행사 운영자 계정 발급 요청의 공개 접수·관리자 큐·승인·반려는 MSG-499가 구현했지만 SRS 행이 없던 갭(FR-AUTH-13 근거란 명시)을 닫으면서, 반려 통보를 수기에서 반려 사유를 담은 안내 메일 자동 발송으로 번복했다. 메일은 필맵 전용 서식이고 발송 실패는 반려를 뒤집지 않는다. 아이디 변경 요청 반려(MSG-500)는 범위 밖이다 MSG-575 사용자 지시 (2026-09-05)
2026-09-05 FR-AUTH-18을 구현됨으로 올렸다. 계정 발급 요청을 반려하면 요청자의 공식 이메일로 반려 사유를 담은 필맵 서식(HTML + 평문 대체본) 안내 메일이 커밋 뒤 자동 발송되고, 발송 실패는 반려를 뒤집지 않고 관리자 응답의 발송 실패 표시로만 드러난다. 검증 테스트 7건이 같은 브랜치에 실렸다 MSG-575 구현 (2026-09-05)
2026-09-08 FR-MOD-15~20을 신규 등재했다(계획). 사용자 차단(차단·해제·목록, 친구 관계 정리, 요청자를 아는 경로 6종의 상호 비노출, 작성자 식별자 계약, 차단 관계 친구 요청 거부, 탈퇴 시 정리)이다. 애플 앱스토어 심사 지침 1.2가 사용자 생성 콘텐츠 앱에 차단 수단을 요구해 MSG-194의 "MVP 범위 제외" 결정이 뒤집혔고, 그에 따라 FR-FRIEND-13에서 "차단"을 빼고 FR-FRIEND-04의 "(차단 미도입)" 단서를 지웠다(ID와 상태는 유지). 요청자를 받지 않는 전역 경로 필터와 관리자 블랙리스트는 범위 밖이다 MSG-569 PRD 초안 (2026-09-08)
2026-09-08 FR-MOD-19를 등재 당일 폐기했다. 차단 관계에서 상대의 친구 요청을 막는 요구는 티켓 범위 밖이고 친구 축은 이번에 건드리지 않기로 했다. FR-MOD-15에 차단 목록이 페이지 없이 전부 내려간다는 조건을 명시했다 MSG-569 사용자 결정 (2026-09-08)
2026-09-10 FR-MOD-15, 16, 17, 18, 20을 구현됨으로 올렸다. 사용자 차단 3종 API, 차단 시 친구 관계·대기 요청 삭제, 요청자를 아는 경로 6종의 양방향 상호 비노출(재생·상세·상호작용은 404), 영상 응답 4종의 작성자 식별자, 탈퇴 시 CASCADE 정리가 코드와 테스트로 들어갔다. 영상 수·댓글 수는 줄이지 않고 친구 축 가드는 범위 밖이다(FR-MOD-19 폐기 유지) MSG-569 구현 (2026-09-10)
2026-09-09 FR-EVENT-01을 개정하고 진행 중으로 내렸다. 지도 뷰포트 행사 목록에 업로드 유예(종료 후 30일 이내) 회차를 포함한다. 종전에는 예정과 진행 중만 담아 종료 정각에 칩에서 빠졌는데, 업로드와 댓글과 도움돼요는 30일 더 열려 있어 들어갈 입구만 없는 상태였다(서울세계불꽃축제 2026-09-05 종료 뒤 실측). 2026-08-21 반응 잠금을 아카이브 전환으로 옮긴 것과 같은 근거다. 아카이브 회차 제외와 시 이름 1차 정렬은 그대로다. 신규 ID 없이 기존 항목 개정으로 처리했다 MSG-586 팀원 K 확정 (2026-09-09), PRD docs/prd/event-room-location-videos.md §4.2·FR-23~25
2026-09-10 FR-EVENT-01을 구현됨으로 올렸다. 2026-09-09에 유예 회차 포함으로 개정하며 진행 중으로 내렸던 항목이다. 지도 뷰포트 행사 목록이 업로드 유예 회차를 담고 아카이브 회차만 빼며, 정렬과 존재 은닉은 그대로임을 경계 정각 케이스까지 테스트로 고정했다(event 444건, 전체 3,062건 green). 응답 상태 값 집합이 세 값으로 넓어진 것은 FE 생성 타입 기준 계약 확장이라 웹·모바일 레인에 공지가 필요하다 MSG-586 구현 (2026-09-10)