Commit Graph

102 Commits

Author SHA1 Message Date
이정수 45fdfb640e feat(redesign): 빈상태 파편 2종 + 목록 페이지 include
fragments/posts-empty.jspf·recruit-empty.jspf 신설(.empty-state).
CTA href 실제 라우트로 교정(/posts/new·/recruit/new 단수).
posts-list·recruit-list 빈 분기에 include. recruit-list는 서버
초기 빈상태=파편 / 클라필터 0건=기존 #recruit-empty div 역할 분리,
필터 JS 무수정.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-30 16:13:52 +09:00
이정수 0390da6ae8 feat(redesign): 공유 bibimbap.css 도입 + theme-init 단일 link
리디자인 산출물 css를 src/main/webapp/css/bibimbap.css로 신설.
폰트는 system fallback 보강(외부 CDN 0, Pretendard 로컬 우선).
다크 오버라이드 블록 추가 — header.jsp data-theme=dark 토큰 차용해
body 컴포넌트와 header/footer 다크모드 정합.
theme-init.jsp(23개 페이지 공통 include)에 link 1줄 추가.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-30 16:07:25 +09:00
이정수 74e7ea1a32 docs(redesign): 클로드 디자인 산출물 반영 검토 + 새 세션용 핸드오프 프롬프트
외부 디자인 툴 산출물(리디자인 zip: 7 JSP + bibimbap.css + 3 jspf + error.jsp)을
전수 검토하고 우리 실제 코드와 design↔reality 매핑을 확정. 코드 변경 없음(검토 세션).

핵심: 산출물은 라우트(/games 복수 vs 실제 /game 단수), 폼 제출(classic POST vs
JSON API+AJAX), CSRF(전무 vs CsrfTokens/_csrf/window.BibimbapCsrf), contextPath
(${ctx} vs ${pageContext.request.contextPath}), include(common/ 가정 vs 평면),
에러(web.xml/error.jsp vs errer 뷰), css 디렉토리(없음) 가 모두 불일치 →
파일 통째 교체 금지, 공유 bibimbap.css 신설 + 비주얼 레이어 이식으로 결론.

산출물: artifacts/handoff-prompt.md (새 세션 작업 프롬프트 + 매핑표 + 하드 제약 + 순서).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0162BaZnrbiYgWc9JJMZ9Czb
2026-06-30 15:52:54 +09:00
이정수 925eb73a62 test(seed): 관리자 테스트 계정 추가 (admin@bibimbap.local)
기존 tester 계정은 USER 용으로 유지하고,
admin@bibimbap.local / test1234! (role=ADMIN) 를 seed-dev.sql 에 추가.
screenshot-guide.md 계정 표를 용도·role 포함 2행으로 확장.
teardown 은 %@bibimbap.local 전체 삭제라 수정 불필요.

Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0162BaZnrbiYgWc9JJMZ9Czb
2026-06-30 14:36:31 +09:00
이정수 aa55524191 docs(screenshot): 인증 흐름 추가 변경 기록 및 교차 링크
- docs/changes/2026-06-30-screenshot-guide-auth.md 신규 작성
- docs/changes/index.md 링크 추가
- docs/development/screenshot-guide.md 변경 이력 섹션 추가
- .atp/work-session/20260630-141415/ 세션 보고서 포함

Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0162BaZnrbiYgWc9JJMZ9Czb
2026-06-30 14:32:15 +09:00
이정수 872f51c91c docs(screenshot): 테스트 계정 정보 + 전체 실행 명령 추가
tester@bibimbap.local / test1234! — seed-dev.sql user3

Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0162BaZnrbiYgWc9JJMZ9Czb
2026-06-30 14:29:11 +09:00
이정수 6e6d6b2b46 fix(docs): 로그인 nav 감지 expect_navigation으로 교체 + 오류 stdout 출력
wait_for_url lambda → expect_navigation 컨텍스트 매니저로 교체.
로그인 실패 오류 메시지를 stderr 아닌 stdout에도 출력.

Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0162BaZnrbiYgWc9JJMZ9Czb
2026-06-30 14:26:07 +09:00
이정수 5dd639fd7a feat(docs): 스크린샷 가이드 — 인증 후 세부 화면 캡처 추가
로그인 전 7장만 캡처하던 스크립트를 확장:
- SCREENSHOT_EMAIL/PASSWORD env var로 인증 세션 획득
- 로그인 후 홈·프로필·게시글폼·모집폼 캡처
- game-detail 리뷰·댓글 composer hidden 제거 후 캡처
- AJAX 로그인 흐름(fetch + window.location) wait_for_url 대응

Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0162BaZnrbiYgWc9JJMZ9Czb
2026-06-30 14:22:20 +09:00
이정수 9098325e7c docs(dev): Playwright 헤드리스 스크린샷 가이드 추가
- screenshot-guide.py: 로컬 Chrome 헤드리스로 7개 주요 페이지 캡처
- 출력 경로: /tmp/bibimbap-screenshots/ (Claude Design 연동용)
- index.md 링크 추가

Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017mhnv7hDExHaXUmbaYAxZd
2026-06-30 14:10:34 +09:00
이정수 5eb6f3950e chore(atp): work-session 20260630-123347 보고서 2026-06-30 12:36:58 +09:00
이정수 a499fd9f33 docs(guidelines): 확실성 우선 원칙 추가 — 빠름보다 검증된 경로 선택 2026-06-30 12:36:30 +09:00
이정수 3726ce54f2 docs(retro): 세션 20260630-113258 회고 교훈 3건 docs 반영
- CLAUDE.md: 정적 CSS/JS Tomcat DefaultServlet 서빙 경로 규약 추가
- security-remediation-checklist: B5 recruit-form CSRF 폴백 갭 (P0) 추가
- verification-strategies: graphify 스캔 범위 JSP/CSS/JS 미포함 교훈 추가
- report.md: ended_at 기록

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K3FeMrbtxfTScjrwUukyHD
2026-06-30 12:11:04 +09:00
이정수 770d3922e2 docs(graph): full scope graphify 재생성 — frontend 분석 + PostsMapper 반영 (5e0f76b)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K3FeMrbtxfTScjrwUukyHD
2026-06-30 12:06:00 +09:00
이정수 5e0f76b7c1 docs(analysis): JSP 프론트엔드 컴포넌트 중복·유지보수 검토
- CSS 디자인 토큰 23개 파일 중복, JS 유틸 8중복,
  recruit-form CSRF 폴백 갭, 날짜 함수 편재 발견
- 권고: global.css 중앙화(P0), bibimbap-utils.js(P1),
  recruit-form CSRF 수정(P0-보안), bibimbap-date.js(P2)
- work-session 아티팩트: research + design recommendations 포함

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K3FeMrbtxfTScjrwUukyHD
2026-06-30 11:53:15 +09:00
이정수 327fe1df25 test(posts): null cursor 회귀 테스트 추가 (168671b)
listPublishedKeyset 에 cursor=null·categoryId=null 전달 시
posts-list 뷰 정상 반환 검증.
isNull() matcher 로 null 파라미터가 매퍼에 실제 전달됨을 명시.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K3FeMrbtxfTScjrwUukyHD
2026-06-30 11:31:23 +09:00
이정수 db816e10fc docs(dev): MyBatis null 캐스트 규약 + docker-compose override --build 함정 기록
verification-strategies.md: MyBatis annotation SQL에서 nullable 파라미터를
#{p} IS NULL 조건으로 사용 시 ::bigint/::timestamptz 명시 캐스트 필수 규약 추가.
컴파일·L1 MockBean 테스트로 탐지 불가 — 코드리뷰 rg 체크 항목 포함.

local-dev-setup.md: docker-compose.override.yml 존재 시 `docker compose up --build`
(base 명시 없이)는 override 의 build: !reset null 로 무효화된다는 경고 추가.
로컬 Java 변경 반영은 `docker compose restart app` 으로 충분함을 명시.

근거: 세션 20260630-105459 포스팅 500 버그 수정 회고.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K3FeMrbtxfTScjrwUukyHD
2026-06-30 11:23:24 +09:00
이정수 168671bc14 fix(posts): PostgreSQL untyped NULL 파라미터 500 + category_id UPDATE 누락
listPublishedKeyset SQL에서 #{categoryId}/#{cursorCreatedAt} IS NULL 조건 사용 시
PostgreSQL이 바인드 파라미터 타입을 결정하지 못해
PSQLException: could not determine data type of parameter $1 → 500 발생.
파라미터에 ::bigint / ::timestamptz 명시 캐스트 추가로 수정.

update() SQL에서 category_id = #{categoryId} 컬럼 누락 — 카테고리 변경이
DB에 반영되지 않는 데이터 정합성 버그 함께 수정.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K3FeMrbtxfTScjrwUukyHD
2026-06-30 11:16:52 +09:00
이정수 8a3eea54ce chore(dep): NVD API key 환경변수 연동 profile 추가
NVD_API_KEY 환경변수 존재 시 nvd-api-key 프로파일 활성화,
dependency-check에 키 전달 → rate limit 완화 (5 → 50 req/30s).
환경변수 없으면 프로파일 비활성 — 기존 동작 유지.
2026-06-30 10:44:55 +09:00
이정수 fa9a888c5b docs(graph): src+docs scope → full 단일 scope 통합
src↔docs 교차 엣지 단절 문제로 분리 scope 폐기.
merge-graphs로 2038노드/4685엣지 full 그래프 생성.
규모 비대화 시 재검토 노트 work-session에 기록.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K3FeMrbtxfTScjrwUukyHD
2026-06-30 10:32:51 +09:00
이정수 2c48184fa7 chore(atp): retrospective 섹션 + memory_candidates 기록
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K3FeMrbtxfTScjrwUukyHD
2026-06-29 19:24:33 +09:00
이정수 7047e06791 docs(verification): 회고 교훈 2건 반영 (20260629 세션)
- 버그범주 표: HTTP 상태/예외 매핑 변경 → L1 + 런타임 스모크 의무
- 구조교훈: HTTP 상태변경 런타임 스모크(전역 핸들러 가림 주의) + multi-worker advisor 산출 git diff 교차검증

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K3FeMrbtxfTScjrwUukyHD
2026-06-29 19:24:22 +09:00
이정수 f6617a951d chore(atp): report 종료섹션(검증/graph_refresh/user_signals)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K3FeMrbtxfTScjrwUukyHD
2026-06-29 19:19:17 +09:00
이정수 b5b2e6d5d3 docs(graph): src scope 재생성 메타 갱신 (source_commit 31dc2ff)
abstracts(4클래스)·GameCatalog 노드 제거 + GameController 404/ResponseStatusException
엣지·ApiExceptionControllerAdvice 핸들러 반영(1840노드/4403엣지/79커뮤니티).
docs scope 는 코드구조 무관·우선순위 낮음으로 차기 일괄 재생성 표기.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K3FeMrbtxfTScjrwUukyHD
2026-06-29 19:19:17 +09:00
이정수 31dc2ff964 chore(atp): work-session 20260629-175705 기록(B2·B4·FE 3트랙)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K3FeMrbtxfTScjrwUukyHD
2026-06-29 19:10:42 +09:00
이정수 aae7629562 docs: B2·B4·FE 반영 + OWASP/multipart 가이드·dev prefetch 노트
- security-remediation-checklist §B2·§B4 완료조건 [x] 갱신
- 신규: owasp-dependency-check-guide, multipart-size-risk, changes/work-log 기록
- local-dev-setup: SNAPSHOT→GA 후 online plugin prefetch 함정 노트
- analysis: 제거된 dead code(abstracts/GameCatalog/header.jspf) stale 정정

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K3FeMrbtxfTScjrwUukyHD
2026-06-29 19:10:42 +09:00
이정수 4f4811eb73 feat(ui): 검색영역 접이식 정리 + 다크모드 입력 대비·터치타깃 개선
- index: 고도화검색을 <details> 접이식으로(prefill 시 open) → 검색 진입점 위계 정리
- 다크모드 입력 테두리 대비 강화(border rgba(255,255,255,0.26)): login·signup·index·game-detail
- 체크박스 터치타깃 1.15rem(login·signup), summary 44px

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K3FeMrbtxfTScjrwUukyHD
2026-06-29 19:10:42 +09:00
이정수 e51ab0136c chore(deps): Spring Boot 3.5.16 고정 + 세션쿠키·로그 하드닝 + OWASP DC
- spring-boot 3.5.14-SNAPSHOT → 3.5.16(GA), spring-snapshots repo/pluginRepo 제거
- OWASP dependency-check-maven 12.2.2 plugin(executions 없음=빌드 phase 비bind)
- 세션쿠키: base http-only=true·same-site=lax / application-live.properties secure=true
- MyBatis 로그 TRACE→WARN(base), application-dev.properties 만 TRACE

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K3FeMrbtxfTScjrwUukyHD
2026-06-29 19:10:42 +09:00
이정수 d143a5cedd fix(game): 없는 게임 ID 404 전환 + 프로토타입 dead code 제거
- abstracts/(4파일)·GameCatalog·fragments/header.jspf 삭제(외부참조 0 확인)
- GameController.gameDetail(): GameCatalog fallback(redirect/정적뷰) 제거 →
  DB 미존재 게임 ID = HTTP 404(ResponseStatusException)
- ApiExceptionControllerAdvice: ResponseStatusException 핸들러 추가(404 status
  보존 — 기존 Exception 핸들러가 500으로 가리던 것 수정)
- 회귀 가드 gameDetailThrowsNotFoundWhenGameMissing 추가

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K3FeMrbtxfTScjrwUukyHD
2026-06-29 19:10:23 +09:00
이정수 5e8816ed4a fix(test): BibimbapApplicationTests에 GameLikesMapper @MockBean 보강
GameController 가 GameLikesMapper 를 주입받으나(B3 좋아요 영속화) 테스트
컨텍스트 @MockBean 목록에 누락돼 contextLoads 가 NoSuchBeanDefinitionException
으로 실패하던 사전결함 수정.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K3FeMrbtxfTScjrwUukyHD
2026-06-29 19:10:23 +09:00
이정수 4c16d16dd9 docs(game): game_likes UNIQUE 제약 dev DB 적용 완료 반영
중복 0 점검 후 ALTER TABLE ADD CONSTRAINT uq_game_likes_game_user UNIQUE(game_id,user_key)
를 dev DB(bibimbap-db/schema dev)에 적용, pg_constraint 검증. B3 체크리스트 [~]→[x].
별도 prod DB 는 배포 시 동일 마이그레이션 적용 필요.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K3FeMrbtxfTScjrwUukyHD
2026-06-29 17:42:46 +09:00
이정수 ee9487e118 docs(game): 좋아요 실환경 스모크 PASS 반영
사용자 검증: 로그인 좋아요 클릭 → 탐색 목록 카운트 반영 확인(docker compose dev).
changes/security 체크리스트의 "실환경 스모크 미수행" → 완료로 갱신.
잔여: game_likes UNIQUE 마이그레이션 운영 적용(사용자 확인 게이트).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K3FeMrbtxfTScjrwUukyHD
2026-06-29 17:38:20 +09:00
이정수 c7ea189c85 chore(dev): 로컬 도커 dev override 추가 (이미지 재빌드 없이 spring-boot:run)
로컬은 docker-compose.override.yml 로 app 을 소스 bind-mount + mvn spring-boot:run
(offline, 호스트 ~/.m2 캐시)으로 재정의 — JSP 즉시 반영, Java 는 restart.
배포 이미지는 base Dockerfile(WAR 굽기)로 분리: docker compose -f docker-compose.yml up --build.
devtools 는 컨테이너 spring-boot:run 에서 이득 적고 SNAPSHOT offline 불안정해 미도입.
가이드(local-dev-setup.md) 갱신.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K3FeMrbtxfTScjrwUukyHD
2026-06-29 17:36:22 +09:00
이정수 3405de4350 chore(atp): work-session 갱신 — dev 앱 docker 전환 기록 (sid 20260629-171042)
spring-boot:run(호스트) → docker compose app 컨테이너. 스모크 403/200 확인.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K3FeMrbtxfTScjrwUukyHD
2026-06-29 17:28:02 +09:00
이정수 2d1d58c8e5 chore(atp): work-session 갱신 — 재배포 수행/라이브 확인 (sid 20260629-171042)
spring-boot:run 재기동(PID 99638), POST /game/{id}/like 403 확인.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K3FeMrbtxfTScjrwUukyHD
2026-06-29 17:24:11 +09:00
이정수 189e34231c chore(atp): work-session 산출물 기록 (sid 20260629-171042)
좋아요 스모크 실패 진단 — 원인=미재배포(코드 결함 0).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K3FeMrbtxfTScjrwUukyHD
2026-06-29 17:18:08 +09:00
이정수 076085a7c9 docs(dev): 코드·JSP 변경 후 앱 재빌드·재시작 함정 가이드 추가
좋아요 수정이 "안 됨" = 돌던 앱이 구 버전(미재배포)이었던 사례.
local-dev-setup.md 에 구동방식별 재빌드·재시작 표 + 미재배포 증상 식별 추가.
핸드오프 시 재배포 단계 명시 교훈 memory 기록.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K3FeMrbtxfTScjrwUukyHD
2026-06-29 17:18:08 +09:00
이정수 6de9a646b3 chore(memory): subagent 재개 시 worker 완료 검증 교훈 기록
회고(sid 20260629-151216) memory_candidate 수용. orchestrator 가 재개 시
선행 worker 완료를 추정 단정하지 말고 관측으로 확인 후 dispatch 기술.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K3FeMrbtxfTScjrwUukyHD
2026-06-29 16:15:54 +09:00
이정수 fcfe8a8db8 chore(atp): work-session 산출물 기록 (sid 20260629-151216)
게임 좋아요 서버 영속화 — 근본원인/설계/검증/회고 기록.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K3FeMrbtxfTScjrwUukyHD
2026-06-29 16:15:42 +09:00
이정수 ef3dc64bd1 chore(graph): graphify src scope 재생성 메타 갱신 (9041bb7→fa6a301)
좋아요 토글 라우트/엣지 반영. AST 1857노드/4419엣지/92커뮤니티.
신규: GameController.toggleLike(POST /game/{id}/like), GameController→GameLikesMapper 주입 엣지,
GamesMapper.{incrementLikeCount,decrementLikeCount,getLikeCount} + GameLikesMapper.{findByGameAndUser,deleteByGameAndUser}.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K3FeMrbtxfTScjrwUukyHD
2026-06-29 16:12:30 +09:00
이정수 fa6a301fb5 fix(game): 좋아요 서버 영속화 — 상세 토글이 explore 카운트에 반영되도록
좋아요가 서버에 저장되지 않고 브라우저 localStorage 에만 토글되어
explore/상세가 읽는 games.like_count 컬럼이 갱신되지 않던 버그 수정.

- POST /game/{id}/like 토글 엔드포인트 신설 (CSRF→로그인→존재 게이트, @Transactional)
- GameLikesMapper: findByGameAndUser/deleteByGameAndUser 추가 (addGameLike 재사용)
- GamesMapper: incrementLikeCount/decrementLikeCount(GREATEST 0)/getLikeCount 추가
- game_likes row 변경 + games.like_count ±1 단일 트랜잭션 동기화
- 상세 addGameModel 이 로그인 사용자 기존 좋아요 여부(liked) 모델 주입
- game-detail.jsp 좋아요 버튼을 localStorage→fetch POST 로 교체
- explore 5개 조회 쿼리 무변경 (컬럼 갱신으로 자동 반영)
- game_likes UNIQUE(game_id,user_key) schema 반영 + 마이그레이션 작성 (DB 미적용)
- GameLikeControllerTest 7건 (회귀 AC-1 포함)

검증: L1 PASS (컴파일 + 7/7 + 컨트롤러 회귀 219/219). L2(dev DB) skip.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K3FeMrbtxfTScjrwUukyHD
2026-06-29 16:09:54 +09:00
이정수 e1790423e4 docs(dev): local-dev-setup 가이드 추가 (93525cb 보완)
선행 커밋(93525cb)에서 add 중단으로 누락된 문서 보완.

- docs/development/local-dev-setup.md 신설: 업로드 저장루트(~/.bibimbap/uploads)
  경로 규약 · @Value 기본값 유지 근거 · 자산 이전 이력 표 · SSRF DNS 캐시 운영 참고
- docs/development/index.md 목록 링크 추가

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K3FeMrbtxfTScjrwUukyHD
2026-06-29 15:06:27 +09:00
이정수 93525cb536 chore(upload): 기존 프로필 자산 신규 저장루트로 이전 + 로컬 dev setup 가이드
저장루트 static 트리 밖 이전(9041bb7) 후속 — 과거 tracked 자산을
신규 루트로 이동하고 dev 환경 가이드를 신설.

- src/main/resources/static/profile/8/* (user 8 프로필 2파일) →
  ~/.bibimbap/uploads/profile/8/ 이동(체크섬 대조 검증) + tracked 원본 제거
- docs/development/local-dev-setup.md 신설: 업로드 저장루트 경로 규약 ·
  @Value 기본값 유지 근거 · 자산 이전 이력 표 · SSRF DNS 캐시 운영 참고
- 테스트 자산 의존 0 → L1 영향 없음(코드 무변경)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K3FeMrbtxfTScjrwUukyHD
2026-06-29 15:05:52 +09:00
이정수 98fba1ec9b chore(atp): work-session 산출물 기록 (sid 20260629-142115)
직전 needs_user_verification 4건 처리 세션. resumed_from 20260629-100849.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K3FeMrbtxfTScjrwUukyHD
2026-06-29 15:01:27 +09:00
이정수 356a0d6a1d chore(graph): graphify src scope 재생성 메타 갱신 (305cc73→9041bb7)
배지표시 배선 엣지(UserBadgesQueryMapper→2컨트롤러) + SsrfSafeFetcher
initDnsCachePolicy 노드 반영. AST 1836노드/4330엣지/89커뮤니티.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K3FeMrbtxfTScjrwUukyHD
2026-06-29 15:01:27 +09:00
이정수 a4866b6420 docs(w4): 배지표시·하드닝 변경이력 + L3 배포후 체크리스트 + 회고 교훈 3건
- changes 2026-06-29-w3-w4: 후속 세션(배지 배선·하드닝 b1/b2·DDL 적용완료·L3 이월) 기록
- maintenance/post-deploy-verification-checklist.md 신설: L3 deferred 5기능 +
  b2 자산 수동이전 절차(static/profile/8 → ~/.bibimbap/uploads)
- verification-strategies: 교훈 3건(needs 결정분기 구조화·표시배선 후행 독립트랙
  실증·런타임 의존 L1/L3 레이어 분리)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K3FeMrbtxfTScjrwUukyHD
2026-06-29 15:01:27 +09:00
이정수 9041bb7c70 feat(security): SSRF rebinding 완화 + 업로드 저장루트 static 트리 밖 이전
W3 후속 하드닝 2건.

- b1: SsrfSafeFetcher @PostConstruct networkaddress.cache.ttl=30 고정
  — 검증~connect 동일 lookup 재사용으로 DNS rebinding TOCTOU 창 최소화.
  런타임 반영은 best-effort(InetAddressCachePolicy lazy init); 결정적
  보장은 JVM 레벨 java.security 가 정본임을 주석 명시.
- b2: app.upload.game-storage-path=${user.home}/.bibimbap/uploads
  — 업로드물을 static 서빙 트리 밖으로 이전(웹서버 직접 서빙 차단,
  컨트롤러 권한게이트 경유). gameRoot/profile 자연 정합, @Value 기본값은
  IDE 로컬 부작용 회피로 유지(명시 properties 오버라이드).
- 테스트 1건 신규(ttl 값 검증). L1 353/353 GREEN, 회귀 0

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K3FeMrbtxfTScjrwUukyHD
2026-06-29 14:45:53 +09:00
이정수 3d10449e67 feat(badge): W4 배지 표시면 배선 — 게임카드 creator 칩 + 프로필 myBadges 주입
GameReviewController authorBadges 정본 패턴 답습. UserBadgesQueryMapper
배치조회(listActiveBadgeKeysByUserIds) 재사용 — 신규 SQL 0.

- WebMvcController: UserBadgesQueryMapper 주입. profile→myBadges,
  indexModelAndView→creatorBadges(userId 그룹핑) 모델 주입
- SearchController: /games/search→creatorBadges 주입
- index.jsp: 게임카드 creator 배지 칩 렌더(badgeLabelIndex, HtmlUtils.htmlEscape)
- 테스트 5건 신규(그룹핑/빈맵/myBadges). L1 352/352 GREEN, 회귀 0

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K3FeMrbtxfTScjrwUukyHD
2026-06-29 14:37:00 +09:00
이정수 af298ce8a0 chore(atp): W3/W4 work-session 산출물 기록 (sid 20260629-100849)
잔여 5기능 구현 세션. report.md(invocations·decisions·verified_by_me·needs_user_verification·graph_refresh·회고) + 소유권맵·검증·문서화 산출물.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K3FeMrbtxfTScjrwUukyHD
2026-06-29 12:54:50 +09:00
이정수 029b6996d4 chore(graph): graphify 양 scope 재생성 메타 갱신 — W3/W4 (a74bf74→305cc73)
- src: AST 1825노드/4292엣지/79커뮤니티 (태그검색·허브keyset·게시판/SSRF/유니티피드·업로드보안 zip-slip·배지/평판 군집 신규)
- docs: semantic 198노드/282엣지/14커뮤니티 (DDL 5종 + W3/W4 변경이력 군집)
- 본체 .gitignore, index.md frontmatter(source_commit·last_generated) + Scopes 표 2행만 커밋

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K3FeMrbtxfTScjrwUukyHD
2026-06-29 12:54:50 +09:00
이정수 31554f8886 docs(w3-w4): W3(잔여)+W4 변경이력·구현추적 + 회고 교훈 4건 반영
- docs/changes/2026-06-29-w3-w4-features.md 신규 — W3-1/3-4/3-3/3-5/W4 5기능 변경(테이블·컨트롤러·매퍼·보안게이트·검증 347/347 + 커밋 35f1dc3~305cc73) + needs_user_verification
- docs/changes/index.md 링크 추가
- work-log 풀설계 요약 구현추적 갱신 — "W3(잔여)·W4 설계만(미구현)" → 11기능 전부 구현 완료 + 교차링크
- verification-strategies.md 회고 교훈 4건 append: (1) 보안 거부 테스트 차별 입증(vacuous 회피) (2) 보안핵심 verification+adversarial 병렬 (3) 표시면 의존 scope-fence 예외 (4) 설계 트레이드오프 1차 결론 못박기 + 프로토콜 개선 권고 5건

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K3FeMrbtxfTScjrwUukyHD
2026-06-29 12:54:50 +09:00