Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
339 commits
Select commit Hold shift + click to select a range
19ccda7
MSG-121 fix: 역지오코딩 콜백 예외를 try 내부로 — R7 크래시 방어 완결 (리뷰 반영)
gyuhochoime Jul 22, 2026
5aef299
MSG-121 refactor: region 로딩 게이트 죽은 분기 제거 — memo nullability 원인 정리
gyuhochoime Jul 22, 2026
d686202
MSG-121 feat: 개인 도감(지도 탭) UI 구현
gyuhochoime Jul 22, 2026
3884c7a
MSG-122 feat: 개인 도감(갤러리 탭) UI 구현
gyuhochoime Jul 22, 2026
c74b3a0
MSG-122 feat: 최근 수집 행 → 지역 갤러리 진입 추가
gyuhochoime Jul 22, 2026
9a8201a
MSG-122 feat: 갤러리 뷰 전환·썸네일 영상 상세 시트, mock 부
gyuhochoime Jul 22, 2026
f0b31f9
MSG-122 fix: 리뷰 반영 - 지도 탭 재도달 시 갤러리 뷰 해제, mock SVG 라벨 이스케이프
gyuhochoime Jul 22, 2026
6260ebb
MSG-122 feat: 개인 도감(갤러리 탭) UI 구현
gyuhochoime Jul 22, 2026
62c8fb9
MSG-123 feat: 개인 도감(뱃지 탭) UI 구현
gyuhochoime Jul 22, 2026
9f5ad66
MSG-123 feat: 지도 우하단 카카오맵식 축척 바 추가
gyuhochoime Jul 22, 2026
e134c42
MSG-123 fix: 리뷰 반영 — 축척 NaN 방어, 뱃지 색 순환 관찰 기록
gyuhochoime Jul 22, 2026
b8c9788
MSG-123 feat: 개인 도감(뱃지 탭) UI 구현
gyuhochoime Jul 22, 2026
78b8ff4
MSG-124 feat: 프로필 페이지 UI 구현
gyuhochoime Jul 22, 2026
104aaf6
MSG-124 fix: 리뷰 반영 — 말줄임 이메일 title 부여, 가입일 포맷 형식 방어
gyuhochoime Jul 22, 2026
1ab50ff
MSG-124 feat: 프로필 페이지 UI 구현
gyuhochoime Jul 22, 2026
74c3234
MSG-125 feat: 프로필 편집 모달 UI 구현
gyuhochoime Jul 23, 2026
3e7959a
MSG-125 fix: 리뷰 반영 — AC8 리셋 스모크 고정, 변경 칩 aria-pressed 미노출, 아바타 fallba…
gyuhochoime Jul 23, 2026
042b8f4
MSG-125 feat: 프로필 편집 모달 UI 구현
gyuhochoime Jul 23, 2026
d5f0cd5
MSG-46 feat: 로그인 페이지 UI 구현
gyuhochoime Jul 23, 2026
cf131d3
MSG-46 feat: 로그인 진입을 모달로 전환 — 목 로그아웃 배선, /login 페이지 제거
gyuhochoime Jul 23, 2026
9ce3939
MSG-46 fix: 리뷰 반영 — /profile 인증 가드·DialogShell 추출·목 인증 영속화
gyuhochoime Jul 23, 2026
cc0d617
MSG-46 feat: 로그인 모달 UI 구현
gyuhochoime Jul 23, 2026
6fa8b28
MSG-255 chore: 구현 스킬에 단순성 우선 원칙 추가 — 카파시 4원칙 공백 보완
gyuhochoime Jul 29, 2026
1155c45
MSG-255 chore: TDD 침식 방지 보강 — RED 확인·테스트 무결성 감사·재현 테스트 특칙
gyuhochoime Jul 29, 2026
e47a6f0
MSG-255 setting: vitest allowOnly false — 로컬·CI 게이트 통일
gyuhochoime Jul 29, 2026
ed37ac9
MSG-255 chore: 리뷰 반영 — RED 재확인 루프백·테스트 이동 예외·RED 표기 통일
gyuhochoime Jul 29, 2026
f1fc446
MSG-255 feat: 프론트엔드 하네스 TDD 적용
gyuhochoime Jul 29, 2026
81851d4
MSG-254 feat: 지도 SDK 카카오맵 → 네이버 지도 마이그레이션
gyuhochoime Jul 29, 2026
f265012
MSG-254 fix: 리뷰 반영 — SDK 로드 타임아웃·줌 클램프 상수 단일화·에러 경계 로깅
gyuhochoime Jul 29, 2026
34e8186
MSG-254 setting: 하네스 지도 격리 규칙 네이버 SDK 기준으로 갱신
gyuhochoime Jul 29, 2026
87dcde5
MSG-254 feat: 지도 SDK 카카오맵 → 네이버 지도 마이그레이션
gyuhochoime Jul 29, 2026
f43357f
MSG-252 feat: 지도 홈 상단 테마 칩 + 칩별 오버레이·셀 상세 구현
gyuhochoime Jul 30, 2026
bb20b21
MSG-252 fix: 홈 이탈 시 테마 칩·오버레이·셀 상세 초기화
gyuhochoime Jul 30, 2026
c25b122
MSG-252 fix: 리뷰 반영 — 셀 상세 Escape의 입력 요소 타깃 가드
gyuhochoime Jul 30, 2026
7c9b27d
MSG-252 feat: 지도 홈 상단 테마 칩 + 칩별 오버레이·셀 상세 구현
gyuhochoime Jul 30, 2026
544a5db
MSG-253 feat: 좌측 패널 ver6 정리 — 요약 2열 썸네일 그리드 + 셀 상세 메타 정합
gyuhochoime Jul 30, 2026
424a2f6
MSG-253 feat: 좌측 패널 ver6 정리 — 요약 2열 썸네일 그리드 + 셀 상세 메타 정합
gyuhochoime Jul 30, 2026
c693350
MSG-263 feat: 격자 블럭 UI — 부산 행정경계 100m 점선 격자 오버레이
gyuhochoime Jul 30, 2026
e719ed5
MSG-263 feat: 격자 전 섹션 상시 표시 + 도감 500m 오버레이 제거
gyuhochoime Jul 30, 2026
a72acc9
MSG-263 style: 격자선 표시 임계 상향 — 축척 250m(줌 15)부터 표시
gyuhochoime Jul 31, 2026
a60060d
MSG-263 fix: 리뷰 반영 - MapShell 줌 게이트 주석을 GRID_MIN_ZOOM 상수 참조로 정정
gyuhochoime Jul 31, 2026
c0f0e38
MSG-263 feat: 격자 블럭 UI 추가
gyuhochoime Jul 31, 2026
e1bd20b
MSG-277 feat: 테마 칩 상세 패널 - 칩 클릭 즉시 1열 영상 피드
gyuhochoime Jul 31, 2026
9228edf
MSG-277 style: 리뷰 반영 - 피드 섹션 헤더 위계 강화 (fm-title·테마 도트·섹션 여백)
gyuhochoime Jul 31, 2026
ee51b7a
MSG-277 feat: 셀 디테일 패널 확장 - 지표 액션 행 위치 정보 시간대 그래프
gyuhochoime Jul 31, 2026
41b772e
MSG-277 feat: 영상 미니 디테일 패널 - 카드 클릭 재생·액션 행 primary 통일
gyuhochoime Jul 31, 2026
0903044
MSG-277 fix: 리뷰 반영 - 같은 셀 재탭 시 미니 패널 유지·소유 메타 공용 추출
gyuhochoime Aug 1, 2026
b987d3c
MSG-277 feat: 상세 패널 UI 추가
gyuhochoime Aug 1, 2026
e438a85
MSG-264 feat: 격자 채움 줌 게이트·클러스터 마커 전환 - 250m 초과 축척 그리드 클러스터링
gyuhochoime Aug 1, 2026
d05282c
MSG-264 fix: 리뷰 반영 - 배지 99+ 캡·클러스터 윈도 타입 추출·클램프 비율 상수화
gyuhochoime Aug 1, 2026
f9ebe2f
MSG-264 feat: 격자 채움 줌 게이트·클러스터 마커 전환
gyuhochoime Aug 1, 2026
7197543
MSG-289 setting: hey-api 코드젠 도입 - 명세 스냅샷·타입 생성 인프라
gyuhochoime Aug 1, 2026
8b341d4
MSG-289 refactor: 목 데이터 명세 정렬 - 생성 타입 satisfies 연결·필드명 치환
gyuhochoime Aug 1, 2026
2dd40ca
MSG-289 setting: hey-api 코드젠 도입
gyuhochoime Aug 1, 2026
6cefd7c
setting: Playwright E2E 지도 회귀 테스트 도입
gyuhochoime Aug 2, 2026
69ff580
setting: 코드 리뷰 반영 - e2e typecheck 커버리지·CI 캐싱·포크 시크릿 문서화
gyuhochoime Aug 2, 2026
1409688
setting: 코드 리뷰 반영 - CI 스텝 name 가독성 개선
gyuhochoime Aug 2, 2026
b61af5f
setting: Playwright E2E 지도 회귀 테스트 도입
gyuhochoime Aug 2, 2026
6b958d4
MSG-307 feat: apps/mobile 신설 + ui-native 공통 컴포넌트 18종 분리
gyuhochoime Aug 3, 2026
f02a7b1
MSG-307 setting: apps/mobile Expo Go 대신 dev client로 전환 - Storybook 크래…
gyuhochoime Aug 3, 2026
c87d817
MSG-307 fix: 코드 리뷰 반영 — avatar/thumbnail errored state src 반응, 미사용 @g…
gyuhochoime Aug 3, 2026
a013e91
MSG-307 setting: 코드 중복 감지(nose) CI 도입 - advisory 게이트 + 기존 중복 71건 base…
gyuhochoime Aug 3, 2026
a4b4791
MSG-307 setting: react-doctor 도입 - CI advisory 게이트 + pre-commit 훅 + C…
gyuhochoime Aug 3, 2026
1fc54e5
MSG-307 setting: oxlint + oxfmt 도입 - 빠른 린트/포맷 게이트 추가
gyuhochoime Aug 3, 2026
1f68c6d
MSG-307 setting: 코드 리뷰 반영 - nose baseline 재검토·react-doctor 액션 SHA 고정·…
gyuhochoime Aug 3, 2026
013229e
MSG-307 feat: apps/mobile 신설 + ui-native 공통 컴포넌트 18종 분리 + oxlint, oxf…
gyuhochoime Aug 3, 2026
8bdd8dc
MSG-292 feat: 모바일 온보딩 UI 구현 — 3장 인트로 + apps/mobile vitest 러너 신설
gyuhochoime Aug 3, 2026
29c2d01
MSG-292 fix: 리뷰 반영 — 스토리지 실패 폴백·Button pill 옵션·expo-image 전환
gyuhochoime Aug 4, 2026
40c246c
MSG-292 feat: 모바일 온보딩 UI 구현 — 3장 인트로 + apps/mobile vitest 러너 신설
gyuhochoime Aug 4, 2026
2881ea8
MSG-293 feat: 소셜 로그인 UI 구현 (apps/mobile)
gyuhochoime Aug 4, 2026
4e97d77
MSG-293 chore: develop 병합 - DECISIONS.md 충돌 해소
gyuhochoime Aug 4, 2026
9e87c94
MSG-293 test: 카카오 로그인 스텁 계약 테스트 추가 - __DEV__ 가드 수
gyuhochoime Aug 4, 2026
c40a94d
MSG-293 feat: 소셜 로그인 UI 구현 (apps/mobile)
gyuhochoime Aug 4, 2026
f4cef53
MSG-294 feat: 지도 홈 UI 구현 (apps/mobile)
gyuhochoime Aug 4, 2026
906f95d
MSG-294 feat: 4단계 드래그 바텀시트 및 칩 아이콘 리뷰 반영 (apps/mobile)
gyuhochoime Aug 4, 2026
1cb0f99
MSG-294 feat: 시트 콘텐츠 통일·스냅 반응성·내비 인셋 채움 리뷰 반영 (apps/mobile)
gyuhochoime Aug 4, 2026
f32222c
MSG-294 chore: nose 베이스라인에 격자 복제(D1) 의도 중복 등재
gyuhochoime Aug 4, 2026
90d1a4b
MSG-294 fix: 리뷰 반영 - 핸들 탭 a11y 경로(48px 목표)·grid-map 고아 정리·정렬
gyuhochoime Aug 4, 2026
dc302a4
MSG-294 style: home-sheet 포맷 정리 및 핸들 주석 정정
gyuhochoime Aug 4, 2026
a126c4e
MSG-294 feat: 지도 홈 UI 구현 (apps/mobile)
gyuhochoime Aug 4, 2026
ea494c8
MSG-297 feat: 검색 UI 구현 (apps/mobile)
gyuhochoime Aug 4, 2026
f7f72b1
MSG-296 feat: 격자 상세보기 UI 구현 (apps/mobile)
gyuhochoime Aug 4, 2026
c2ed4ba
MSG-296 fix: 리뷰 반영 - 스텁 아이콘 버튼 a11y 준비 중 힌트
gyuhochoime Aug 4, 2026
67fd7c3
MSG-296 feat: 격자 상세보기 UI 구현 (apps/mobile)
gyuhochoime Aug 4, 2026
5433f4d
MSG-297 Merge origin/develop (MSG-296) into feat/MSG-297-search-ui
gyuhochoime Aug 4, 2026
42a032e
MSG-297 fix: 리뷰 반영 - 유일 매칭 자동 이동·검색어 탭 동기화·NaN 가드·CI 게이트(포맷/중복 등재)
gyuhochoime Aug 4, 2026
a990597
MSG-297 fix: 딥링크 좌표 범위 검증 추가 (위도 ±90·경도 ±180)
gyuhochoime Aug 4, 2026
330a685
MSG-297 feat: 검색 UI 구현 (apps/mobile)
gyuhochoime Aug 4, 2026
55d347d
MSG-298 feat: 상단 테마 칩별 UI 구현 (apps/mobile)
gyuhochoime Aug 5, 2026
f57cca2
MSG-298 chore: CI 게이트 로컬 전진 — 포맷 정리·의도 중복 등재·훅 보강
gyuhochoime Aug 5, 2026
5f9dc33
MSG-298 fix: 리뷰 반영 — 오버레이 key 네임스페이스·베이스라인 승인분만 등재·싱글턴 테스트 주의
gyuhochoime Aug 5, 2026
f2867e2
MSG-298 style: pre-push 훅 성공 시 nose 출력 침묵
gyuhochoime Aug 5, 2026
0351d1c
MSG-298 feat: 상단 테마 칩별 UI 구현 (apps/mobile)
gyuhochoime Aug 5, 2026
f8e5053
MSG-299 feat: 개인 도감(지도 탭) UI 구현 (apps/mobile)
gyuhochoime Aug 5, 2026
e8314fb
MSG-300 feat: 도감 갤러리 화면 — 지역 스코프·전체 모드 (apps/mobile)
gyuhochoime Aug 5, 2026
70cf033
MSG-301 feat: 도감 뱃지 진열장 UI (apps/mobile)
gyuhochoime Aug 5, 2026
d824b13
MSG-299·300·301 feat: 개인 도감 모바일 — 지도 탭·갤러리·뱃지 진열장
gyuhochoime Aug 5, 2026
1942421
MSG-302 feat: 영상 업로드 플로우 모바일 — 업로드·AI 하이라이트·블러 확인·미리보기
gyuhochoime Aug 5, 2026
505afa6
MSG-302 fix: AI 추천 구간 3개 고정 (기획 변경 5개→3개)
gyuhochoime Aug 5, 2026
60cc995
MSG-302 setting: 중복 베이스라인 재등재 — 구간 3개 고정으로 바뀐 지문 갱신
gyuhochoime Aug 5, 2026
9fd8eef
MSG-302 fix: 리뷰 반영 — 권한 재시도 후 취소 시 거부 안내 잔존 해소, 구간 주석 정정
gyuhochoime Aug 5, 2026
88f73fc
MSG-302 feat: 영상 업로드 플로우 모바일 — 업로드·AI 하이라이트·블러 확인·미리보기
gyuhochoime Aug 5, 2026
ab1f2f6
MSG-306 feat: 프로필 UI 모바일 — 프로필/설정·편집·로그아웃 모달
gyuhochoime Aug 5, 2026
adcac0a
MSG-306 fix: 리뷰 반영 — 저장 시 닉네임 trim(스토어 단일 경로), Switch 접근성 라벨, ReactNo…
gyuhochoime Aug 5, 2026
01247f2
MSG-306 setting: 중복 베이스라인 재등재 — 스토어 trim 수정으로 바뀐 의도 중복 지문 갱신
gyuhochoime Aug 5, 2026
1a4e193
MSG-306 feat: 프로필 UI 모바일 — 프로필/설정·편집·로그아웃 모달
gyuhochoime Aug 5, 2026
dd6ce6d
MSG-317 setting: 명세 스냅샷 갱신 — 응답 required 도입 반영, 목·픽스처 정렬
gyuhochoime Aug 6, 2026
71a7421
MSG-317 feat: 격자 상세 더보기 메뉴 모바일 — 수정·삭제 확인·영상 신고 모달, 빈 격자 진입 차단
gyuhochoime Aug 6, 2026
18521f0
MSG-317 fix: 지도 홈 후속 — 중복 FAB 제거, 내 위치 무반응 해소(타임아웃·last-known 폴백·sing…
gyuhochoime Aug 6, 2026
5ee1b6e
MSG-317 feat: 홈 상단 아바타 탭 → 프로필 페이지 진입 배선
gyuhochoime Aug 6, 2026
f6b9a5e
MSG-317 style: 삭제하기 대비 AA 보정 — red-600 텍스트 토큰 신설, Figma 동기
gyuhochoime Aug 6, 2026
dc3d160
MSG-317 fix: 리뷰 반영 — 신고 토스트 타이머 카운터 키 재설정, 셀렉트 셰브런 펼침 회전
gyuhochoime Aug 6, 2026
53087aa
MSG-317 feat: 격자 상세 더보기 메뉴
gyuhochoime Aug 6, 2026
0dc57bb
MSG-322 setting: OpenAPI 명세 재동기화 — 27개 스키마 required 승격 반영, dex 목·테스트 …
gyuhochoime Aug 6, 2026
a62d583
MSG-322 setting: 백엔드 환류 반영 2차 재동기화 — 쿼리 필수 선언 5종·lon→lng 통일, LatLng 주…
gyuhochoime Aug 6, 2026
962a682
MSG-322 test: 리뷰 반영 — ProfileHeader email null 분기 단위 테스트 (변이 검증 완료)
gyuhochoime Aug 6, 2026
14a709b
MSG-322 setting: OpenAPI 명세 재동기화
gyuhochoime Aug 6, 2026
c5fd902
MSG-323 setting: 웹 API 클라이언트 기반 구축 — hey-api sdk·react-query 코드젠 확장, …
gyuhochoime Aug 6, 2026
3990af5
MSG-323 setting: 리뷰 반영 — react-doctor 설정 apps/web 미러 (CI 프로젝트 스캔 루트 설…
gyuhochoime Aug 6, 2026
85c93c5
MSG-323 fix: 리뷰 반영 — baseUrl 미설정 시 부트 시점 조기 실패 가드 (재현 테스트 RED→GREEN)
gyuhochoime Aug 6, 2026
9a2ab4b
MSG-323 setting: 리뷰·CI 반영 — e2e webServer에 API baseUrl 센티널 주입(백지 실패 복…
gyuhochoime Aug 6, 2026
82fc8e6
MSG-323 setting: 웹 API 클라이언트 기반 구축 — hey-api sdk·react-query 코드젠 확장, …
gyuhochoime Aug 6, 2026
5da68b6
MSG-324 feat: 웹 인증 연동 — 토큰 주입·401 single-flight 재발급 파이프라인
gyuhochoime Aug 7, 2026
60892e4
MSG-324 fix: auth 엔드포인트에 액세스 토큰 미주입 — 재발급이 필요한 순간에만 재발급이 실패하던 결함
gyuhochoime Aug 7, 2026
d1d0f41
MSG-324 fix: 리뷰 반영 — oauth 경로 토큰 미주입 누락, 로그인 시 쿼리 캐시 초기화, 연타 가드
gyuhochoime Aug 7, 2026
338a30c
MSG-324 fix: 리뷰 반영 — JSDoc 중복 정리, react-doctor 경고 수용 결정 기록
gyuhochoime Aug 7, 2026
d9105c1
MSG-324 feat: 웹 인증 연동 — 토큰 주입·401 single-flight 재발급 파이프라인
gyuhochoime Aug 7, 2026
d4721f2
MSG-325 chore: OpenAPI 스냅샷 재생성 — 격자 DTO에 zoneName·zoneCell 추가
gyuhochoime Aug 7, 2026
377ba41
MSG-325 fix: 격자 계산 규칙을 서버 정본으로 교체 (웹·모바일)
gyuhochoime Aug 7, 2026
5ef3439
MSG-325 feat: 지도 홈 API 연동 — 점령 격자·핫구역·격자 상세 실 API
gyuhochoime Aug 7, 2026
f3a780a
MSG-325 feat: 카카오 로그인 인가 리다이렉트·콜백 배선 (플래그 뒤, 기본 off)
gyuhochoime Aug 8, 2026
a790426
MSG-325 fix: 세션 만료가 로그인 모달을 열지 않게 — 줌마다 모달이 뜨던 결함
gyuhochoime Aug 8, 2026
2698759
MSG-325 fix: OAuth 콜백이 StrictMode에서 정상 인증을 실패로 판정하던 결함
gyuhochoime Aug 8, 2026
76148d7
MSG-325 feat: 카카오 로그인 완결 — 서버 진입점·코드 교환·X-Device-Id 재사용
gyuhochoime Aug 8, 2026
492592d
MSG-325 fix: 점령 격자 첫 페이지에 빈 cursor가 실려 400으로 거부되던 결함
gyuhochoime Aug 8, 2026
79e015c
MSG-325 feat: 로그아웃 시 즉시 홈으로 이동 — 사이드레일 활성 탭도 홈으로
gyuhochoime Aug 8, 2026
1d1ed53
MSG-325 fix: nose 베이스라인 전면 재작성으로 무관한 중복이 승인되던 문제 정정
gyuhochoime Aug 8, 2026
ecb83c7
MSG-325 test: 클러스터 줌 게이트 e2e를 API 스텁 기반으로 — 목 의존 제거
gyuhochoime Aug 8, 2026
44abff1
MSG-325 fix: 격자를 바꿔 탭하면 직전 격자 상세가 남던 결함 (리뷰 반영)
gyuhochoime Aug 8, 2026
0c20aa8
MSG-325 fix: 격자를 바꿔 탭할 때 상세가 요약 패널로 튀던 부작용 (리뷰 반영)
gyuhochoime Aug 8, 2026
dbdbe0c
MSG-325 fix: 격자 상세 조회 실패가 영구 로딩으로 표시되던 결함 (리뷰 반영)
gyuhochoime Aug 8, 2026
d76a95f
MSG-325 feat: 지도 홈 API 연동
gyuhochoime Aug 8, 2026
5d40e5f
MSG-352 feat: 개발용 로그인·업로드 위저드 Figma ver 10 정합
gyuhochoime Aug 10, 2026
aa04928
MSG-352 feat: 비로그인 업로드 게이트·로그인 후 위저드 자동 재개(카카오 포함)
gyuhochoime Aug 10, 2026
3f941c9
MSG-352 fix: dev 로그인 실패 시 입력 오류 상태·원인별 안내 (리뷰 반영)
gyuhochoime Aug 10, 2026
4b0b4d7
MSG-352 test: dev 로그인 스모크 준비 절차 중복 추출 (push 게이트 반영)
gyuhochoime Aug 10, 2026
c72f826
MSG-352 fix: 영상 업로드 UI 수정
gyuhochoime Aug 10, 2026
411e2d6
MSG-357 feat: 격자 계산을 위경도 근사에서 EPSG:5179 미터 좌표 기반으로 전환
gyuhochoime Aug 10, 2026
c6318f3
MSG-357 feat: 격자 표시를 축척 100m부터로 제한하고 250m부터 클러스터 전환
gyuhochoime Aug 10, 2026
55d0498
MSG-357 fix: 패널 접힘 상태에서 색칠 셀 탭 시 패널을 펼쳐 상세 표시
gyuhochoime Aug 10, 2026
1b7c5d3
MSG-357 refactor: 리뷰 반영 — 격자 디코드 중복 제거·핫구역 참조 안정화·고아 상수 정리
gyuhochoime Aug 11, 2026
69e5a5b
MSG-357 test: e2e 스텁·줌 게이트 기대값을 5179 체계와 게이트 16으로 재기준화
gyuhochoime Aug 11, 2026
ed94458
feat: 격자 계산을 위경도 근사에서 EPSG:5179 미터 좌표 기반으로 전환
gyuhochoime Aug 11, 2026
fe98410
MSG-329 feat: 프로필·영상 업로드 API 연동
gyuhochoime Aug 11, 2026
8995372
MSG-329 feat: 개발용 로그인 패널 이식
gyuhochoime Aug 11, 2026
978e43b
MSG-329 chore: develop 머지 — EPSG:5179 격자 대응 반영, 업로드 ver 11 유지 충돌 해소
gyuhochoime Aug 11, 2026
4237b6d
MSG-329 feat: 격자 고정 업로드 진입 — 격자 상세 [영상 추가]가 그 격자를 지목해 위치 태그·확정 좌표에 반영…
gyuhochoime Aug 11, 2026
15cee4a
MSG-329 fix: 목 id 셀 격자 고정 진입 시 NaN 좌표가 확정 400을 부르던 결함 — 유한 좌표 가드 + bo…
gyuhochoime Aug 11, 2026
4955b4f
MSG-329 feat: 대표 영상 재생을 미니 사이드패널로 — serverVideoId 선택 확장, playbackUrl …
gyuhochoime Aug 11, 2026
1b31212
MSG-329 fix: 블러 완료(READY) 전이 시 격자 쿼리 재무효화 — 완료 후 상세 대표 영상이 새로고침 없이 갱신
gyuhochoime Aug 11, 2026
42b1626
MSG-329 feat: 점령 격자 클릭 우선 라우팅 — 어느 탭·어떤 선택 상태에서든 격자 상세 우선 (셸 상시 층 + S…
gyuhochoime Aug 11, 2026
89ad40e
MSG-329 fix: 격자 상세 일괄 렌더 — 3개 조회 정착 후 한 번에, 선택 정보 지연은 3초 유예 후 격자 정보만 …
gyuhochoime Aug 11, 2026
9889ab8
MSG-329 fix: 리뷰 반영 — 재게시 시 옛 s3Key 확정 결함(resetFlow 누락), 폴링 타이머 경합, de…
gyuhochoime Aug 11, 2026
223b9fd
MSG-329 setting: react-doctor pre-commit을 React 패키지별 실행으로 — 루트 실행의 Re…
gyuhochoime Aug 11, 2026
f9e8c2d
MSG-329 fix: 리뷰 반영 2차 — AI 추천 clamp 우회·ffmpeg 실패 캐시 오염·트리밍 중 복귀 경쟁 수정…
gyuhochoime Aug 11, 2026
b3fac3d
MSG-329 feat: 프로필·영상 업로드 API 연동
gyuhochoime Aug 11, 2026
3e25e0c
MSG-378 feat: 프로필 이미지 업로드 API 연동 — presign·S3 PUT·확정 3단계와 기본 이미지 적용
gyuhochoime Aug 12, 2026
062d34a
MSG-378 feat: 프로필 조회를 getMe 실 API로 전환 — 새로고침 후 이미지 유지·가입일 KST 표기
gyuhochoime Aug 12, 2026
12fe648
MSG-326 feat: 격자 상세 영상 목록·미니 패널 재생 복원 — 실 API(목록 2종·재생) 연동
gyuhochoime Aug 12, 2026
0d99aaa
MSG-378 chore: develop 머지 — MSG-329 경쟁 구현 화해(프로필 getMe·모달 이중 배선·재생 쿼리…
gyuhochoime Aug 12, 2026
0efd3d8
MSG-378 fix: PR #51 리뷰 반영 — 저장 중 이미지 재선택 차단(업로드 레이스), 피드 카드 접근성 이름 유일…
gyuhochoime Aug 13, 2026
26336dc
MSG-378 fix: PR #51 리뷰 반영 — 저장 중 이미지 재선택 차단(업로드 레이스), 피드 카드 접근성 이름 유일…
gyuhochoime Aug 13, 2026
69d1db9
MSG-378 test: CI 해체 레이스 수정 — 매 테스트 후 cleanup+이벤트 루프 배수로 jsdom 해체 뒤 스케…
gyuhochoime Aug 13, 2026
6f8a8e5
MSG-378 프로필 이미지 수정 + MSG-326 격자 영상 재생 복원
gyuhochoime Aug 13, 2026
2c7553b
setting: 하네스 소요 시간 개선 — STATUS.md·문서 지도·게이트 단일화·검증 프로파일·codex 온디맨드·ta…
gyuhochoime Aug 13, 2026
e65728c
chore: typescript ~6.0.3 pnpm catalog 단일화 (7.x는 typescript-eslint 비호환…
gyuhochoime Aug 13, 2026
8dc47c6
setting: 하네스 소요 시간 개선 — STATUS.md·문서 지도·게이트 단일화·검증 프로파일·codex 온디맨드·ta…
gyuhochoime Aug 13, 2026
1c21fd1
setting: 린트 툴체인 oxlint 단일화 + TypeScript 7.0.2 상향 — eslint 계열 8종 제거, 토…
gyuhochoime Aug 13, 2026
3764536
setting: 티켓 브랜치 생성 전 기존 브랜치 조회 의무화 — 로컬·원격 *MSG-{번호}* 조회 후 존재 시 사용자 …
gyuhochoime Aug 13, 2026
a86cd0c
fix: CI openapi-ts 크래시 수리 — hey-api를 루트 devDep+TS 6.0.3 peer로 이전(워크스페…
gyuhochoime Aug 13, 2026
8f65147
MSG-386 fix: 리뷰 반영 — 토큰 규칙 v4 important 접미사 우회 차단(!?$), 템플릿 표현식 재귀 추가…
gyuhochoime Aug 13, 2026
894f6c8
setting: 린트 툴체인 oxlint 단일화 + TypeScript 7.0.2 상향 — eslint 계열 8종 제거, 토…
gyuhochoime Aug 13, 2026
7b1103e
docs: task-retro 산출 경로를 레포 밖(~/fillmaphtml)으로 변경 — 회고는 개인 학습 자산
gyuhochoime Aug 13, 2026
2df7345
feat: 탐색 페이지 제거 + 홈 좌측 패널 리디자인·지역/검색 API 5종 연동 — 비로그인은 쿼리 미발사+로그인 유도(…
gyuhochoime Aug 13, 2026
b6ac22c
fix: 비로그인 UX 보완 — 도감·검색창 즉시 로그인 모달(레일 G1 확장·포커스 차단), grids/hotzones 인…
gyuhochoime Aug 13, 2026
888999a
feat: 지역 패널 헤더 지도 이동 라이브 동기화(전체 보기 선택은 고정) + 격자 카드 클릭 시 첫 영상 미니 패널 자동 재생
gyuhochoime Aug 13, 2026
c3d9576
fix: 격자 카드 클릭 시 상세 열지 않고 미니 패널만 재생 — 지역 리스트 화면 유지, 빈 목록·실패는 토스트 안내
gyuhochoime Aug 13, 2026
3170cc0
fix: 격자 카드 클릭 시 지도 이동 제거 + 재생 격자 테두리 강조(채움색 보존, 저줌 클러스터 정본 오염 방지)
gyuhochoime Aug 13, 2026
c2c5829
MSG-328 fix: e2e 로그인 시딩으로 인증 게이트 대응 + 리뷰 반영 — explore 쿼리 내부 인증 게이트 통일…
gyuhochoime Aug 14, 2026
1324b5f
MSG-328 격자 카드 클릭 시 지도 이동 제거 + 재생 격자 테두리 강조(채움색 보존, 저줌 클러스터 정본 오염 방지)
gyuhochoime Aug 14, 2026
e293039
feat: 개인 도감 실 API 6종 연동 — 최근 수집을 동 단위로·뱃지를 실제 메달 아트로
gyuhochoime Aug 14, 2026
743fb3e
fix: 도감 헤더 보조 문구를 격자 수 + 영상 총합으로 교체
gyuhochoime Aug 14, 2026
7e085d8
refactor: 정적 리뷰 반영 — toSorted·Set 조회 전환, 무의미한 ?? null 제거
gyuhochoime Aug 14, 2026
0b702e5
MSG-327 개인 도감 실 API 6종 연동 — 최근 수집을 동 단위로·뱃지를 실제 메달 아트로
gyuhochoime Aug 14, 2026
2d4739b
MSG-395 feat: 상단 칩 4종 UI 개편 + 미션 API 실연동 — 핫구역을 동 요약으로·축제/팝업/코스를 실 데이터로
gyuhochoime Aug 14, 2026
86ec1cc
MSG-395 chore: 파비콘을 신규 로고로 교체 (투명 배경 32·512 + apple-touch 180)
gyuhochoime Aug 14, 2026
f27c113
MSG-395 chore: 하네스 보수 — 위임 불가 시 대체 경로 명문화 + 검증 리포트 pre-commit 게이트
gyuhochoime Aug 14, 2026
e520490
MSG-395 refactor: 정적 리뷰 8건 반영 — 페이지 분할·뷰포트 앵커·메모·실패 노출·줌 타이밍
gyuhochoime Aug 14, 2026
a912a70
MSG-395 fix: 수집 격자 실패가 미션 목록을 가리던 문제 — 목록 실패와 진행도 실패를 분리
gyuhochoime Aug 14, 2026
c73a985
MSG-395 fix: 진행도 조회 실패 시 상세·스팟·맥락 줄이 방문 여부를 주장하던 문제
gyuhochoime Aug 14, 2026
5936b80
MSG-395 fix: 코스 목록 카드도 진행도 실패 시 방문 수치·진행 바를 주장하지 않도록
gyuhochoime Aug 14, 2026
8dedf7d
MSG-395 feat: 상단 칩 4종 UI 개편 + 미션 API 실연동 — 핫구역을 동 요약으로·축제/팝업/코스를 실 데이터로
gyuhochoime Aug 14, 2026
e879f8a
MSG-403 chore: claude-review 완주 검증 — 미완 리뷰가 체크 통과로 가려지지 않게
gyuhochoime Aug 16, 2026
7e1a6dc
MSG-403 fix: 칩 표시 범위·갱신 시점 정정 + 미션 API 개편 이관
gyuhochoime Aug 16, 2026
0c4e85c
MSG-407 feat: 위치정보 동의 온보딩 게이트 + 프로필 동의 토글·이미지 삭제 실연동 — 미동의 로그인 사용자를 전…
gyuhochoime Aug 17, 2026
16d7ea8
MSG-408 feat: FCM 웹 푸시 기반 + 토큰 API 2종 실연동 — 프로필 알림 토글 옵트인·로그아웃 fcmTok…
gyuhochoime Aug 18, 2026
5e3a714
MSG-410 feat: 줌아웃 클러스터 서버 집계 전환 — FE 윈도 스냅 산술을 grids/aggregation 동/구/…
gyuhochoime Aug 18, 2026
b06f071
MSG-411 feat: 내 영상 삭제·공개 전환·신고 실연동 — 도감 카드·미니 패널 더보기 메뉴 신설, 중복 신고 114…
gyuhochoime Aug 18, 2026
fa144e9
MSG-412 feat: 격자 검색 실연동 — zones 세션 캐시 역파싱으로 "서면 A-14" 검색, 선택 시 이동+테두리…
gyuhochoime Aug 18, 2026
af138a0
MSG-409 feat: 알림 설정 실연동 — preferences GET/PATCH 낙관 전환·/profile/notifi…
gyuhochoime Aug 18, 2026
526a858
MSG-413 feat: 대표 뱃지 설정 실연동 — 도감 뱃지 탭 편집모드(최대 2개 토글·랭크 링·프로필 미리보기) + P…
gyuhochoime Aug 18, 2026
4b81727
MSG-415 feat: 영상 교체 실연동 — 더보기 메뉴 진입·업로드 위저드 교체 모드 재사용, PUT 좌표 생략으로 격자…
gyuhochoime Aug 18, 2026
ea055bc
MSG-414 feat: 도감 업로드 잔디 실연동(/dex/history 기록 탭+1년 모달) + 프로필·도감 헤더 대표 뱃…
gyuhochoime Aug 18, 2026
acc685a
MSG-419 feat: [모바일] API 기반 이식 — 생성 SDK 공유·RN Ky 어댑터·Query Provider·se…
gyuhochoime Aug 18, 2026
f60c010
MSG-420 feat: [모바일] ui-native 공통 컴포넌트 7종 보강 + 바텀 내비 친구 탭 교체 (#69)
gyuhochoime Aug 18, 2026
3b78187
MSG-422 feat: [모바일] 회원가입 약관 동의 게이트 — 카카오 로그인 직후 동의 저장 (#70)
gyuhochoime Aug 19, 2026
0027466
MSG-421 feat: [모바일] 온보딩 리뉴얼 — 3단 진행바·히어로 카드 구성으로 교체 (#71)
gyuhochoime Aug 19, 2026
d2dfd03
MSG-423 feat: [모바일] 지도 홈 시트 1열 전환·상단 칩 UI 개편 + 격자/영상 조회 연동 (#72)
gyuhochoime Aug 19, 2026
0530106
MSG-425 feat: [모바일] 도감 개편 1 — 3탭 셸·지도 탭 동 목록·동 갤러리 + 도감 API 5종 연동 (#73)
gyuhochoime Aug 19, 2026
34486b7
MSG-426 feat: [모바일] 프로필·설정 개편 — 알림 받기 토글·계정 삭제·기본 이미지 되돌리기 + preferen…
gyuhochoime Aug 19, 2026
6b74102
MSG-424 feat: [모바일] 업로드 플로우 개편 — 분석 로딩·AI 추천 3개·미리보기·완료 안내 + 업로드 API …
gyuhochoime Aug 19, 2026
f1a5779
MSG-428 feat: [모바일] 줌아웃 클러스터 마커 — 동·구 지역 집계 연동 (#76)
gyuhochoime Aug 19, 2026
30b737b
MSG-427 feat: [모바일] 테마 칩 상세 흐름 — 핫구역 동 요약·축제/팝업 미션·코스 스팟 + 미션 API (#77)
gyuhochoime Aug 20, 2026
e1bb8df
MSG-429 feat: [모바일] 블러 완료 알림 — 고아 확인 화면 알림 진입 재배치 + 폴링 인앱 통지 + FCM 푸시…
gyuhochoime Aug 20, 2026
95e1527
MSG-430 feat: [모바일] 도감 개편 2 — 뱃지 진열장·대표 뱃지 지정·기록 잔디 (#79)
gyuhochoime Aug 20, 2026
96e511d
MSG-430 fix: [모바일] 뱃지 아트 빈 iconUrl 폴백 + 스테일 주석 정정 (#80)
gyuhochoime Aug 20, 2026
34c4dfe
MSG-431 feat: [모바일] 내 영상 관리 — 도감·격자 상세 공용 영상 액션 메뉴 + 공개 범위·삭제·신고 실연동 …
gyuhochoime Aug 20, 2026
3c326a3
MSG-451 feat: 지도 홈·도감 잔손질 5건 + 웹 CD 도입 (#82)
gyuhochoime Aug 21, 2026
8b07d3d
MSG-444 feat: [모바일] 카카오 로그인 실연동 — 네이티브 SDK + ID 토큰 서버 교환 (#83)
gyuhochoime Aug 21, 2026
ffd2e6e
MSG-451 fix: PR #84 리뷰 반영 — 5초 미만 원본 트리머 시작 시각 음수 방어 + dev 스모크 화면 __D…
gyuhochoime Aug 21, 2026
fcf6f96
MSG-446 feat: [모바일] 영상 재생 화면 신설 — 카드 탭 목적지 부재 해소 (#85)
gyuhochoime Aug 21, 2026
eae2ca3
MSG-449 setting: [모바일] 하네스 모바일 검증 경로 추가 + dev client 빌드·실기 절차 정비 (#86)
gyuhochoime Aug 21, 2026
df7a8f1
MSG-463 chore: 서버 명세 재생성 — 행사·미션 API 반영 + 전체 지역 목록 커서 페이지 대응 (#87)
gyuhochoime Aug 23, 2026
4c95b48
MSG-448 feat: [모바일] 준비 중 화면 3종 실구현 — 위치정보 동의 관리·신고 관리·약관 전문 (#88)
gyuhochoime Aug 23, 2026
8203d8a
MSG-447 feat: [모바일] OS 권한 요청 흐름 — 위치·알림 런타임 권한 (#89)
gyuhochoime Aug 24, 2026
b56e253
MSG-462 feat: 지도 줌 속도 완화 + 축제·팝업 격자 클릭 시 행사 상세 열기 (#90)
gyuhochoime Aug 24, 2026
25732c8
MSG-464 fix: 로그인 로고 알파 자산 교체 + 썸네일 onError 폴백 ui-web Thumbnail 승격 (#91)
gyuhochoime Aug 24, 2026
7d14fbf
MSG-463 feat: 전체 지역 목록 커서 무한 스크롤 + 비로그인 칩 정보 노출 (#92)
gyuhochoime Aug 24, 2026
b079800
MSG-465 chore: claude-review 완주 검증 오탐 해소 — execution output 3단 판정 (#93)
gyuhochoime Aug 24, 2026
4639232
MSG-445 fix: [모바일] 실기 점검 결함 3건 + 진입 스플래시를 지도 타일 표시까지 유지 (#94)
gyuhochoime Aug 25, 2026
f958b3b
MSG-477 fix: [웹] QA 잔손질 4건 — 프로필 알림 항목 삭제·에러 화면 홈 이동 복구·100m 격자 전국 확장…
gyuhochoime Aug 25, 2026
08fe567
MSG-473 fix: 코스 미션 GeoJSON 객체 라인 수용 + 스팟 직선 폴백 제거 (#98)
gyuhochoime Aug 25, 2026
08e800a
MSG-476 feat: 업로드 공개 범위 선택 + 블러 안내·통지 경로 제거 (#99)
gyuhochoime Aug 26, 2026
f7a01cd
MSG-478 feat: [웹] SEO 기본 — 메타·OG·robots/sitemap·라우트별 title·시맨틱·에러 noi…
gyuhochoime Aug 26, 2026
965959f
MSG-475 feat: 줌아웃 집계 마커 Figma 말풍선 교체 + 핫구역 행정 단위 집계 (#101)
gyuhochoime Aug 26, 2026
8d3ff99
MSG-474 feat: 비로그인 지도 홈 개방 — 행정동 확정·장소 불러오기·칩 최근접·격자 상세 (#102)
gyuhochoime Aug 27, 2026
d61e1cc
MSG-488 feat: [웹] AI 경로추천 페이지 — 자연어 요청·결과 카드·지도 오버레이 (#104)
gyuhochoime Aug 28, 2026
0477869
MSG-489 feat: [웹] AI 경로추천 — 지역 자동 이동·1km 축척 고정·2차 자동 재요청·출발지 자동 판정 (#…
gyuhochoime Aug 29, 2026
0b2c355
MSG-490 feat: [웹] AI 경로추천 실보행 경로 — walk-paths 점진 렌더·세그먼트 폴백·실거리 표기 (#…
gyuhochoime Aug 30, 2026
ad3f681
Merge branch 'develop' into release/4th-deploy — AI 경로추천 추가 (MSG-488~…
gyuhochoime Aug 30, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions .claude/skills/page-verification/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,10 @@ pnpm openapi-ts && git diff --exit-code apps/web/src/shared/api/generated # 생
#### 3-A. 웹 (apps/web · packages/ui-web)

1. `pnpm dev`로 dev 서버 실행 (백그라운드)
1-1. **시간을 재기 전에 탭이 살아 있는지부터 확인한다** — 브라우저 자동화 탭은 기본적으로 백그라운드일 수 있고, 그러면 `requestAnimationFrame`이 초당 0.5~1회로 죽어 **지도 애니메이션·전이·디바운스 계측이 10~40배로 부풀려진다**. 계측형 기준(대기 시간·타임아웃·연속 호출 간격)이 하나라도 있으면 다음을 먼저 실측해 리포트에 남긴다:
- `document.visibilityState === "visible"`, 아니면 탭을 전면으로 올린 뒤 재확인 (`osascript -e 'tell application "Google Chrome" to activate'` 등)
- rAF 프레임률 1초 표본 — 60fps 이상이어야 계측이 유효하다
숨은 탭에서 잰 숫자는 **버리고 다시 잰다**. 지도가 `idle`을 내지 않아 뷰포트 스토어가 옛 값에 머무는 등 **동작 자체가 달라지는** 경로도 있다 (MSG-489 — "정규화 대기 14.2초"가 이 아티팩트였고, 같은 전이가 전면 탭에서 316ms였다. 그 오염된 숫자 뒤에 실제 결함이 숨어 있었다)
2. 화면형 수용 기준을 하나씩 브라우저에서 재현하고 관찰한다. 브라우저 자동화 도구가 있으면 스크린샷을 `_workspace/MSG-{번호}/screenshots/`에 남기고, 자동화가 불가하면 리포트에 "스크린샷 미보존(사유)"를 명시한다 — 조용히 생략하지 않는다
3. **Figma 대조**: 스펙에 Figma 노드가 있으면 해당 노드 스크린샷(`get_screenshot`)과 렌더 결과를 나란히 놓고 구조·간격·색·타이포를 비교한다. 스펙의 "오탐 방지/의도된 편차" 목록에 있는 차이는 결함이 아니다 — 목록에 없는 차이만 실패 후보로 올린다
4. **a11y 점검** (변경된 UI 범위만):
Expand Down
4 changes: 2 additions & 2 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,8 +28,8 @@ pnpm 모노레포 — apps/web(React 19 + Vite) + apps/mobile(Expo, 대부분
**변경 이력 (최근 5행 이내 — 전체는 `docs/HARNESS_CHANGELOG.md`, 밀려난 행은 그리로 이관):**
| 날짜 | 변경 내용 | 대상 | 사유 |
|------|----------|------|------|
| 2026-08-29 | 웹 실동작 검증(3-A)에 **탭 가시성·rAF 프레임률 전제 조건** 신설 — 계측형 기준이 있으면 `document.visibilityState`와 rAF 표본을 먼저 실측하고, 숨은 탭에서 잰 숫자는 버리고 다시 잰다 | skills/page-verification | MSG-489 후속 — 브라우저 자동화 탭이 백그라운드였고 rAF가 **0.5~1fps로 정지**해 있었다. 같은 줌 전이가 숨은 탭 11,162ms · 전면 탭 316ms로 **35배** 부풀려졌고, 그 값이 "정규화 대기 14.2초 무피드백"이라는 리포트 문장과 후속 티켓 권장까지 만들어 냈다. 더 나쁜 것은 **동작 자체가 달라진다**는 점이다 — 숨은 탭에서는 네이버 지도가 `idle`을 내지 않아 뷰포트 스토어가 옛 값에 머물고, 그 상태에서 D13 타임아웃이 발화해 정규화되지 않은 뷰포트(1.9°×4.7°)로 요청이 나가 서버 400(14401)이 재현됐다. 즉 오염된 계측이 실제 결함을 가리고 있었다. 계측 신뢰성은 검증자 개인의 주의력이 아니라 절차의 전제 조건으로 내린다 |
| 2026-08-28 | react-doctor `js-tosorted-immutable` 규칙 off 선언 + **규칙 설정이 v0.9.3 스캐너에 안 먹는다는 실측 기록** | doctor.config.json, CLAUDE.md | MSG-488 PR #104 리뷰 — **두 도구가 정반대를 지시하고 있었다**: react-doctor는 `[...arr].sort()`를 `toSorted()`로 바꾸라 하고, `.oxlintrc.json:84`는 `toSorted`를 error로 금지한다(Hermes 미구현 — MSG-427에서 지도 홈을 마운트 즉시 크래시시킨 그 API). oxlint 금지가 `apps/mobile`·`packages/ui-native` 한정이라 **웹 파일에서는 react-doctor만 말하고 게이트 6종이 아무것도 안 잡는다**. 비용은 실측된다: 웹 프로덕션 `toSorted` 6곳 중 모바일 이식본이 있는 **5곳 전부**가 손으로 `[...].sort()`로 되돌려져 Hermes 주석을 달고 있고(`hot-region-summary`·`course`·`use-multi-grid-videos-query`·`region-cluster-overlay`·`gallery-groups`), 뒤 둘은 MSG-427 사고로 지목된 바로 그 파일들이다(주석 2회로도 못 막혔던 자리). 지적 대상 `route-legs.ts:6`은 스스로 `(RN 재사용 대상)`이라 선언한다. 규칙의 근거도 사실과 다르다 — `toSorted()`도 새 배열을 할당하므로 "복사 없이 정렬"이 아니다. **단, 이 설정은 현재 무효다(실측)**: v0.9.3에서 `rules list`·`rules explain`은 `off`로 보고하고 공식 `react-doctor rules disable`이 쓴 것도 같은 내용인데, 스캐너는 규칙을 그대로 보고한다(레포 루트·`apps/web` cwd 양쪽, `ignore.tags`도 동일하게 무시). **기존 `js-combine-iterations: off`도 같은 이유로 무효였다.** 따라서 실효 방어선은 이 행의 기록이고, 설정은 도구가 고쳐지면 자동으로 듣도록 선언만 남긴다. **후속 후보**: oxlint 금지를 레포 전역으로 승격하면 이식 세금이 원천 제거되나 기존 웹 6곳 수정이 따르므로 별도 티켓 |
| 2026-08-24 | claude-review 완주 검증 판정을 **PR 코멘트 마커 grep → 액션 execution output 3단 판정**(① 파일 존재 → ② 마지막 result `is_error=false && subtype=success` → ③ 게시 도구 호출 증거: `gh pr comment` Bash 또는 `update_claude_comment`)으로 교체, 마커는 warning 강등(프롬프트 지시 존치·1줄 보정), 실패 사유별 구분 `::error::`+실측값 출력 | .github/workflows/claude-review.yml | MSG-465 — PR #89 af67beb 오탐: 리뷰가 정상 완주했는데 봇이 진행 코멘트에 요약을 이어 붙이며 SHA 마커를 생략해 검증 스텝이 실패 표시. 판정이 봇의 그때그때 코멘트 작성 방식에 좌우되던 것을 액션 산출물(전사) 기준으로 분리 — MSG-403 원 사고(정상 종료·요약 미게시, `is_error=false`·`num_turns=17` 실측이라 result 판정만으론 통과)는 ③ 게시 증거가 계속 잡는다. 잔여 창(체크리스트만 갱신 후 침묵 종료)은 마커 warning으로 관찰, 재발 실측 시 후속 조임 |
| 2026-08-21 | codex 리뷰 **실행 경로를 Bash companion 하나로 확정** + 시점을 커밋 직전 → **push 전**으로 이동 | skills/fillmap-page-dev | MSG-451 사고 — 종전 문구가 "`/codex:review` **또는** companion 서브커맨드"로 두 경로를 동등 나열해 세션마다 선택이 갈렸다. 8/17~19 세션은 companion으로 정상 실행했으나(워크트리 state 실측 15건), 이번 세션은 슬래시 커맨드를 시도했다가 `disable-model-invocation`에 막히자 **그대로 건너뛰어 커밋 4개가 리뷰 없이 진행**됐다. 선택지를 주면 막힌 쪽을 고른 세션이 스킵한다 — 명령줄을 스킬에 그대로 박았다. 시점은 커밋이 로컬이라 되돌리기 싸고 중간 커밋 리뷰가 곧 폐기될 코드를 반복해 보기 때문(MSG-451은 뒤 커밋이 앞 결정을 뒤집었다). **조사 과정 교훈**: 메인 레포 state만 보고 "8/13 이후 리뷰 0건"으로 단정했다가 워크트리별 state에서 15건을 발견해 정정 — 워크트리 병렬 작업에서는 저장소 단위 상태가 흩어진다 |
| 2026-08-21 | 검증 스킬 실동작 경로를 **대상 앱**으로 분기 — 3-A(웹 브라우저) / 3-B(모바일 Android dev client) 신설, 모바일 확인불가 판정 기준·리포트 형식 명문화, 실기 런북(`docs/MOBILE_RUNBOOK.md`)과 원커맨드 스크립트(`pnpm --filter mobile android:dev`) 신설 | skills/page-verification, skills/fillmap-page-dev, docs/MOBILE_RUNBOOK.md, apps/mobile/scripts | MSG-449 — 절차 3이 `pnpm dev` + 브라우저로만 쓰여 있어 모바일 티켓에 대응 절차가 없었고, 웨이브 0~3(MSG-419~431)이 전부 정적 게이트(vitest·typecheck·lint)만으로 통과했다. 2026-08-20 실기 시도에서 함정 6가지(임베디드 번들 로더·스킴 충돌·8081 콜드 스타트 복귀·페어링 포트 만료·`--device`는 모델명·새 네이티브 의존성 prebuild)에 순차로 걸렸는데 전부 재발할 문제라 문서가 아니라 검증 경로 자체로 내린다. 후속 모바일 티켓이 이 절차로 검증한다 |
| 2026-08-19 | 모바일 런타임(Hermes) 미구현 API 차단 규칙 신설 — `apps/mobile`·`packages/ui-native` 한정 `no-restricted-properties`(`toSorted`·`toReversed`·`toSpliced`·`Object.groupBy`·`Map.groupBy`·`Promise.withResolvers`) + `no-restricted-globals`(`structuredClone`) | .oxlintrc.json | MSG-427 실기 사고 — 웹에서 포팅한 `toSorted` 3곳이 지도 홈을 마운트 즉시 크래시시켰는데 **게이트 6종이 전부 통과**했다(vitest는 Node에서 돌아 메서드가 존재하고, typecheck는 `lib`에 ES2023이 있다). 같은 함정이 `gallery-groups.ts`·`region-cluster-overlay.ts`에 두 번 주석으로 문서화돼 있었는데도 재발해, 주석으로는 못 막는 것이 실증됐다. 웹→모바일 포팅이 계속되는 한(MSG-428 등) 재발 창이 열려 있어 기계 게이트로 내린다 (MSG-298·386 좌시프트 원칙) |
| 2026-08-19 | e2e apt 미러 고정(azure→archive) + Playwright 설치 스텝 timeout-minutes 8 | .github/workflows/ci.yml | PR #74 실측 — `azure.archive.ubuntu.com` 불통으로 apt가 저장소마다 재시도하다 21분·14분+ 멈춤(2회 재현). `playwright install --with-deps`로 바꾸라는 조언은 같은 apt 경로를 타므로 무효였고, 캐시 히트 경로에서 바이너리 재다운로드만 추가된다. 미러리스트를 정본으로 고정해 재시도 구간을 제거하고, 그래도 물리면 빨리 실패하도록 타임아웃을 건다 |
Original file line number Diff line number Diff line change
Expand Up @@ -145,6 +145,7 @@ describe("mergeProfileImage — 확정 응답 병합 (포팅 parity)", () => {
profileImageUrl: null,
createdAt: "2026-01-12T00:00:00",
locationConsent: true,
role: "USER" as const,
};
const confirmed = {
...prev,
Expand Down
1 change: 1 addition & 0 deletions apps/mobile/src/shared/api/reset-session-cache.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -129,6 +129,7 @@ describe("resetSessionCache — 로그인 직후 이전 세션 캐시 폐기 (AC
profileImageUrl: null,
createdAt: "2026-01-01T00:00:00Z",
locationConsent: true,
role: "USER",
},
});
// 비로그인 게이트는 enabled:false라 요청을 만들지 않는다 (AC 3)
Expand Down
2 changes: 1 addition & 1 deletion apps/web/openapi/api-docs.json

Large diffs are not rendered by default.

3 changes: 2 additions & 1 deletion apps/web/public/robots.txt
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
# FillMap 웹 (MSG-478) — 색인 대상은 비로그인으로 열리는 홈뿐이다.
# /dex·/profile은 로그인 뒤 화면, /oauth/는 카카오 콜백, /upload는 스텁(실제 업로드는 모달).
# /dex·/profile·/ai-route는 로그인 뒤 화면, /oauth/는 카카오 콜백, /upload는 스텁(실제 업로드는 모달).
User-agent: *
Allow: /
Disallow: /dex
Disallow: /profile
Disallow: /oauth/
Disallow: /upload
Disallow: /ai-route

Sitemap: https://fillmap.kr/sitemap.xml
11 changes: 11 additions & 0 deletions apps/web/src/app/router.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import { AppLayout } from "@/app/layouts/AppLayout";
import { RequireAuth } from "@/app/RequireAuth";
import { RouteErrorBoundary } from "@/app/RouteErrorBoundary";
import { KAKAO_CALLBACK_PATH, ROUTES } from "@/app/routes";
import { AiRoutePage } from "@/pages/ai-route/AiRoutePage";
import { DexPanel } from "@/pages/dex/DexPanel";
import { MapHomePage } from "@/pages/map-home/MapHomePage";
import { KakaoCallbackPage } from "@/pages/oauth-callback/KakaoCallbackPage";
Expand All @@ -25,6 +26,16 @@ export const router = createBrowserRouter([
children: [
{ path: ROUTES.home, element: <MapHomePage /> },
// /explore는 MSG-328에서 제거 — 직접 진입은 무매칭 404로 errorElement에 수렴한다 (AC 2)
// AI 경로추천(MSG-488) — 서버가 익명 POST를 401(2403)로 막아 로그인 전용이다.
// 레일 클릭은 SideRailNav가 모달로 막고, 이 래핑은 직접 URL 진입 방어다
{
path: ROUTES.aiRoute,
element: (
<RequireAuth>
<AiRoutePage />
</RequireAuth>
),
},
{ path: ROUTES.upload, element: <SectionPanel title="업로드" /> },
// 도감(MSG-121·122) — 탭은 URL 정본(/dex·/dex/badges), 무효 탭("gallery" 포함)은 지도 폴백(AC 2·21).
// 비로그인 진입은 프로필과 동일하게 홈+로그인 모달 (MSG-328 사용자 피드백)
Expand Down
27 changes: 27 additions & 0 deletions apps/web/src/app/routes.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ describe("getActiveNavKey", () => {
});

it("각 섹션 경로는 해당 네비 키를 반환한다", () => {
expect(getActiveNavKey(ROUTES.aiRoute)).toBe("aiRoute");
expect(getActiveNavKey(ROUTES.upload)).toBe("upload");
expect(getActiveNavKey(ROUTES.dex)).toBe("dex");
expect(getActiveNavKey(ROUTES.profile)).toBe("profile");
Expand All @@ -49,3 +50,29 @@ describe("getActiveNavKey", () => {
expect(getActiveNavKey("/explore")).toBeUndefined();
});
});

/**
* AI 경로추천 라우트 신설 (MSG-488 L11, 승인 Q1) — 티켓 가칭 `/route`가 아니라 `/ai-route`다.
* 기존 `route` 3중 동음이의(ROUTES · ThemeId "route" 코스 칩 · map-overlay-store.routes)를 피한다.
*/
describe("AI 경로추천 라우트 (MSG-488 L11)", () => {
it("네비 섹션은 홈·AI 경로추천·업로드·도감·프로필 5개다 (L11)", () => {
expect(Object.keys(ROUTES)).toEqual([
"home",
"aiRoute",
"upload",
"dex",
"profile",
]);
});

it('경로는 "/ai-route"이고 getActiveNavKey가 aiRoute를 반환한다 (L11)', () => {
expect(ROUTES.aiRoute).toBe("/ai-route");
expect(getActiveNavKey("/ai-route")).toBe("aiRoute");
});

it('티켓 가칭 "/route"는 미등록 경로다 — 라우터 404 폴백을 따른다 (L11, Q1)', () => {
expect("route" in ROUTES).toBe(false);
expect(getActiveNavKey("/route")).toBeUndefined();
});
});
4 changes: 4 additions & 0 deletions apps/web/src/app/routes.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,10 @@
*/
export const ROUTES = {
home: "/",
// AI 경로추천 (MSG-488) — 티켓 가칭 `/route`가 아니라 `/ai-route`다(승인 Q1):
// `route`는 코드베이스에서 이미 3중 의미(ROUTES · ThemeId "route" 코스 칩 ·
// map-overlay-store.routes)라 새 섹션까지 그 낱말을 쓰면 계속 섞인다
aiRoute: "/ai-route",
// explore는 MSG-328에서 제거 — 지역 탐색·검색이 홈 좌측 패널로 통합됐다. 재추가 금지.
upload: "/upload",
dex: "/dex",
Expand Down
9 changes: 8 additions & 1 deletion apps/web/src/app/seo-static.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -112,7 +112,14 @@ describe("public/robots.txt · sitemap.xml (B1·B2)", () => {

expect(text).toMatch(/^User-agent: \*$/m);
expect(text).toMatch(/^Allow: \/$/m);
expect(disallows()).toEqual(["/dex", "/profile", "/oauth/", "/upload"]);
// MSG-488: /ai-route는 로그인 전용 화면이라 색인 대상이 아니다 (L13)
expect(disallows()).toEqual([
"/dex",
"/profile",
"/oauth/",
"/upload",
"/ai-route",
]);
expect(text).toMatch(/^Sitemap: https:\/\/fillmap\.kr\/sitemap\.xml$/m);
});

Expand Down
99 changes: 99 additions & 0 deletions apps/web/src/features/ai-route/api/use-route-recommend.test.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
import { renderHook, waitFor } from "@testing-library/react";
import type { ReactNode } from "react";
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
import { envelopeResponse, errorEnvelope } from "@/test/envelope-response";
import { ROUTE_POINTS } from "@/test/route-points";
import { stubFetch } from "@/test/stub-fetch";
import { useAiRouteStore } from "../model/ai-route-store";
import { useRouteRecommend } from "./use-route-recommend";

const wrapper = ({ children }: { children: ReactNode }) => (
<QueryClientProvider
client={new QueryClient({ defaultOptions: { queries: { retry: false } } })}
>
{children}
</QueryClientProvider>
);

const BODY = {
text: "서면에서 밥 먹고 저녁 경기까지 동선 짜 줘",
viewport: {
minLat: 35.1521,
minLng: 129.0537,
maxLat: 35.1662,
maxLng: 129.0712,
},
};

/** 훅 마운트 → 1회 요청 — 세 시나리오가 공유하는 진입 동작 */
const mutateRecommend = (
callbacks?: Parameters<typeof useRouteRecommend>[0],
) => {
const { result } = renderHook(() => useRouteRecommend(callbacks), {
wrapper,
});
result.current.mutate(BODY);
};

describe("useRouteRecommend — 추천 1회 요청 배선 (L5·L7 배선)", () => {
beforeEach(() => {
useAiRouteStore.setState(useAiRouteStore.getInitialState(), true);
});

afterEach(() => {
vi.unstubAllGlobals();
});

it("응답 봉투를 벗겨 지점과 부족 안내를 스토어에 싣는다 (§4-3)", async () => {
const received = stubFetch(() =>
envelopeResponse({
points: ROUTE_POINTS,
notice: null,
mentionedArea: null,
}),
);
mutateRecommend();

await waitFor(() =>
expect(useAiRouteStore.getState().status).toBe("result"),
);
expect(useAiRouteStore.getState().points.map((p) => p.order)).toEqual([
1, 2, 3,
]);
expect(received[0].body).toEqual(BODY);
});

it("실패는 developCode 매핑 안내로 스토어에 실린다 — 입력 문장은 유지된다 (§1-4)", async () => {
stubFetch(() => errorEnvelope(14400, "뷰포트가 너무 넓습니다", 400));
useAiRouteStore.getState().setText(BODY.text);
const { result } = renderHook(() => useRouteRecommend(), { wrapper });

result.current.mutate(BODY);

await waitFor(() =>
expect(useAiRouteStore.getState().status).toBe("error"),
);
expect(useAiRouteStore.getState().errorNotice?.message).toBe(
"지도를 조금 더 확대하거나 다른 곳으로 옮긴 뒤 다시 시도해 주세요",
);
expect(useAiRouteStore.getState().text).toBe(BODY.text);
});

it("401(2403)이면 입력 대기로 되돌아가고 로그인 콜백이 호출된다 (§1-3)", async () => {
stubFetch(() => errorEnvelope(2403, "인증이 필요합니다", 401));
const onLoginRequired = vi.fn();
const { result } = renderHook(
() => useRouteRecommend({ onLoginRequired }),
{
wrapper,
},
);

result.current.mutate(BODY);

await waitFor(() => expect(onLoginRequired).toHaveBeenCalledTimes(1));
expect(useAiRouteStore.getState().status).toBe("idle");
expect(useAiRouteStore.getState().errorNotice).toBeNull();
});
});
Loading
Loading