이정수
6154826a82
docs(changes): edit-mode WebGL zip 비필수 표시 육안 확인 완료
...
admin 소유 게임이 dev 시드에 없어 DB에 임시 row를 직접 INSERT해
/game/{id}/edit 방문 확인 후 즉시 DELETE로 원복(잔존 0건). "게임 이름
*"는 유지, "WebGL zip"은 editMode에서 * 미표시 — 코드 로직과 일치
확인. needs_user_verification 항목 1건 해소.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011h6etRXJLx1xdfxmVcHjBg
2026-07-01 15:44:05 +09:00
이정수
64e91e4786
docs(dev): AskUserQuestion 사실전제 grep 선검증 규칙( #4 ) 등재 + \u 이스케이프 재발 기록
...
game-register.jsp 세션에서 orchestrator가 CSS 변수 대체 가능성을 grep
없이 옵션 전제로 제시했다가 재확인 왕복이 발생한 사례를 규칙 4로 명문화.
같은 세션에서 AskUserQuestion \u 이스케이프 손타이핑 실수(규칙 2)도
재발했음을 발원 사례에 추가 — 이번엔 스키마 검증에서 걸렸으나 항상
그렇게 걸리지는 않는다는 점을 명시.
세션 20260701-142000 report.md 기록.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011h6etRXJLx1xdfxmVcHjBg
2026-07-01 14:39:06 +09:00
이정수
4d0c2caceb
docs(graph): full scope 증분 재생성 — 486+251 고스트 중복 추가 제거
...
graph-refresh-checker partial-stale 판정(db/seed-dev.sql 로직 변경 +
game-detail.jsp 함수 구조 변경) 대응. .jsp는 graphify 스캔 범위 밖이라
game-register.jsp/game-detail.jsp 자체는 그래프에 반영되지 않으나,
db/seed-dev.sql + 이번 세션 신규 docs 10건은 반영. build_merge 병합
과정에서 기존 그래프의 고스트 중복 486 exact + 251 fuzzy 를 추가로
제거(2089→1477 노드).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011h6etRXJLx1xdfxmVcHjBg
2026-07-01 14:36:00 +09:00
이정수
86b052813d
feat(fe): game-register.jsp 리디자인 누락분 보강 + 재발방지 체크리스트
...
/game/new 가 2026-06-30 9단위 리디자인 목록에서 빠져 있던 것을 사용자가
지적해 발견. 실사용 스샷 대조 결과 레이아웃/토큰은 이미 sibling(recruit-form
등)과 일치해, 필수(*) 표시 2건 + 미리보기 eyebrow 라벨만 recruit-form.jsp
패턴 재사용으로 보강(단일 JSP, 로직 무변경). 로컬 CSS 토큰 전지역 통합은
sibling 관례와 갈라지므로 이번 세션 범위에서 제외, 별도 과제로 이월.
재발방지: frontend-redesign-coverage-checklist.md 신설(뷰 파일 23개 전수
상태표) + workflow-patterns.md 에 "전 페이지 반영 서술은 실제 파일 전수와
대조 필요" 패턴 등재.
L1 362/362 GREEN. L2 로그인 후 라이트/다크 육안 확인(known JSP stale
렌더링 함정 회피 위해 docker compose restart 후 재대조).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011h6etRXJLx1xdfxmVcHjBg
2026-07-01 14:25:47 +09:00
이정수
0205dca0f7
docs(dev): 사용자 의사결정/리포트 컨벤션 4건 workflow-patterns 로 이전 + 재발방지 규칙 등재
...
3개 독립 리뷰 서브에이전트(감사A/감사B/정책진단)의 수렴 결과에 따라:
- verification-strategies.md 에서 스코프 위반이 명확한 4개 항목(모호한 시각
결함 다축스캔 선행, 시각 디자인 결정 프리뷰 공동확인, needs_user_verification
결정분기 구조화, needs_user_verification 이월 시 known pitfall 교차인용)을
workflow-patterns.md 로 이전 — 전부 "사용자와 어떻게 합의하는가"이지 코드
정오 검증이 아님.
- design-advisor/orchestrator 운영 규율 성격 항목(SSR 영향맵, scope-fence,
트레이드오프 확정, multi-worker git diff 교차검증, Test.java 소유태그,
graphify 스캔범위)은 이번 라운드에서 보류 — ATP 메커니즘 성격이 강해
별도 판단 필요.
- document-category-classification.md 에 재발방지 규칙 추가: 기존 문서에
append 하기 전 그 문서의 자기선언 스코프와 먼저 대조하고, 같은 파일 안의
선례를 정당화 근거로 삼지 않는다.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011h6etRXJLx1xdfxmVcHjBg
2026-07-01 12:26:08 +09:00
이정수
15023c0373
docs(dev): freeze 근거확인 + frontend-design fork 위임 패턴도 workflow-patterns 로 이전
...
verification-strategies.md 에 남아있던 나머지 두 "작업 방식" 패턴
(freeze/동결 분류 판단절차, frontend-design 스킬 fork 위임)을
workflow-patterns.md 로 이전. index.md 목록 설명도 항목 위치에 맞게 정정.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011h6etRXJLx1xdfxmVcHjBg
2026-07-01 12:19:17 +09:00
이정수
4c54b9db38
docs(dev): 다중 UI 안 Artifact 시각비교 패턴을 verification 대신 workflow-patterns 로 재배치
...
검증 전략(verification-strategies.md)은 "코드가 옳은가" L1/L2/L3 판정
레지스트리 범위인데, 직전 커밋(810fa21 )에서 사용자 합의 수렴 절차(작업
진행 방식)를 그 안에 잘못 등재했다. 신규 docs/development/workflow-patterns.md
로 옮기고 index.md 목록도 정정.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011h6etRXJLx1xdfxmVcHjBg
2026-07-01 12:07:51 +09:00
이정수
810fa211a5
docs(dev): 다중 UI 안 Artifact 시각비교 → AskUserQuestion 선택 수렴 패턴 등재
...
game-detail.jsp 리뷰 레이아웃 세션(20260701-113509)에서 검증된 워크플로우
— 실제 CSS 토큰을 이식한 Artifact 로 후보 N안을 한 화면 비교 제시 →
AskUserQuestion 으로 확정 → 그 후에만 소스 반영 — 를 재사용 가능한
긍정 패턴으로 verification-strategies.md 에 기록하고 index.md 목록에 반영.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011h6etRXJLx1xdfxmVcHjBg
2026-07-01 12:05:32 +09:00
이정수
f086b12142
docs(dev): AskUserQuestion 비ASCII 리터럴 작성 + 복수대상 스코프확인 규약 추가
...
세션 회고 반영. 두 교훈 모두 이번 세션에서 실제 재질의 왕복 비용을
발생시킨 구조적 결함:
1. 한글을 \u 코드포인트로 수동 타이핑하다 오타로 2회 깨짐 → 리터럴
UTF-8 작성 규칙 명문화.
2. "각 그래프"(복수) 지적을 미터바 단수로 임의 축소 해석 → 사용자
정정("내가 말한건 육각 그래프였어") 발생 → 복수 표현 시 전체
후보 나열 규칙 명문화.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011h6etRXJLx1xdfxmVcHjBg
2026-07-01 11:26:31 +09:00
이정수
7572e86605
docs(dev): SQL data-only 검증레벨 표 등재 + needs_user_verification known-pitfall 교차인용 규약
...
retrospective-advisor 회고(세션 20260701-100731) 반영:
- "버그 범주 → L 레벨" 표에 'SQL data-only(DML)' 행 추가 — L1 해당없음
명시 + L2(API/DB 값 일치) 필수. 매 seed/백필 세션마다 즉흥 재정당화
하던 스킵 근거를 레지스트리에 고정.
- needs_user_verification 이월 시 최근 세션에 docs화된 렌더 관련
known pitfall(예: JSP stale 렌더링)과 경로가 겹치면 명시 인용하는
규약 추가. 직전 세션(20260701-093754)의 JSP 즉시반영 실패 교훈이
후속 세션에 인용 안 된 사례를 근거로 신설, 이번 report.md 에도
소급 적용.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0162BaZnrbiYgWc9JJMZ9Czb
2026-07-01 10:16:33 +09:00
이정수
e3890b3c6f
docs(dev): JSP 즉시반영 실패 사례 + 검증 방법 정정
...
카드 여백 수정 세션에서 JSP CSS 수정이 "저장 즉시 반영" 문서 설명과
달리 컴파일 캐시로 반영 안 되는 사례 발견. 브라우저 스크린샷만으로
검증한 1차 확인이 stale 렌더링을 보고 false pass를 냄(사용자가
재캡처 스샷 대조로 발견). docker compose restart app으로 해소.
향후 JSP 수정 검증 시 curl로 서빙 CSS/마크업을 파일과 직접 대조하는
단계를 local-dev-setup.md 함정 항목으로 추가.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Bn6vdHrUHqVzzUfC9da6fS
2026-07-01 09:55:51 +09:00
이정수
6b24386623
docs(dev): 시각 프리뷰 공동확인 + 정적 html charset 교훈
...
세션 20260701-083240 회고 반영.
- 시각 디자인 결정은 앱 정적경로(/css/) 프리뷰 서빙으로 사용자·에이전트 공동 확인
(텍스트 diff 예측 한계). 결정 후 프리뷰 삭제.
- 정적 .html(DefaultServlet)도 meta charset 필수 — §299 의 정적파일 짝.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0162BaZnrbiYgWc9JJMZ9Czb
2026-07-01 09:34:26 +09:00
이정수
661e570069
chore(graph): 클린 풀 재생성 메타 갱신 + 타세션 work-session 리포트 추적
...
- docs/graph/index.md: source_commit 360078a→20789a2, 2089노드/4719엣지/128커뮤니티,
고스트 중복(452 exact+244 fuzzy) 제거. "재생성 요청 중" 해소.
- ADR-0010: 직전 세션들(103443/105459/143405/160000/170024) 미커밋 work-session
리포트 추적 편입(housekeeping, 코드 변경 없음).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0162BaZnrbiYgWc9JJMZ9Czb
2026-06-30 19:24:58 +09:00
이정수
20789a2922
docs(changes): UI 다축평가 비율·가시성 수정 사례 추가
...
세션 20260630-175023 을 changes 사례로 문서화. 다축 멀티에이전트
평가(6 에이전트)로 모호 시각어휘를 13건 결함으로 확장한 패턴 기록.
verification-strategies.md 교훈과 양방향 교차링크. graphify-out/ gitignore.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0162BaZnrbiYgWc9JJMZ9Czb
2026-06-30 19:24:08 +09:00
이정수
c688aa67d8
docs(dev): 모호 시각어휘 다축 스캔 선행 교훈 + 세션 회고
...
세션 20260630-175023 회고 반영.
- verification-strategies.md: "모호 시각 결함 어휘는 단일 결정축 협소화
전 다축 스캔 선행" 레슨 추가 + §4.4 item5 선행게이트 강화 권고.
- work-session 보고서 + 회고 섹션.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0162BaZnrbiYgWc9JJMZ9Czb
2026-06-30 18:29:10 +09:00
이정수
cf1e7cea62
fix(redesign): 골드 토큰 통일·클래스 충돌 정리
...
리디자인 검토에서 발견된 디자인 일관성 결함 수정.
- bibimbap.css: --color-accent #D4A853→#e8a54b(light+dark),
--color-accent-press #C79A40→#d8973a. 앱 전역 브랜드 골드
(#e8a54b, header/footer/modal/26파일)와 어긋나 모든 페이지에
골드 2종이 공존하던 문제 해소. + .btn/.chip/.link/a focus-visible 링.
- profile.jsp: 페이지-로컬 .profile-* 를 source of truth 채택,
합집합으로 붙은 중복 bibimbap 유틸(btn/avatar/thumb/meta/game-row
/profile-head/card/section-*) 제거 → override 모호성 소멸.
- recruit-form.jsp: bibimbap 와 충돌하던 로컬 클래스(field/form-grid
/req/count/preview-card/form-actions) rf- prefix rename. ID·JS 무변경.
- index.jsp: 중복 <link bibimbap.css> 제거(theme-init 가 전역 로드).
L1 mvnw package exit 0. L2 dev bind-mount 라이브 스모크 /·/login
/signup/terms/recruit/posts/error HTTP 200 + JSP 에러 0. 인증 게이트
페이지(recruit-form/profile) 렌더는 needs_user_verification.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0162BaZnrbiYgWc9JJMZ9Czb
2026-06-30 17:46:32 +09:00
이정수
d379a1c353
docs(dev): 정적 include jspf pageEncoding 교훈 추가
...
브라우저 리뷰에서 빈상태 파편 mojibake 발견(fix a4d163d ). 정적
include 파편은 부모 pageEncoding 미상속 → 자체 UTF-8 선언 필수.
JSP 검증 섹션에 재현성 교훈 추가.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-30 16:56:00 +09:00
이정수
8d52b1082f
docs(dev): JSP 변경 런타임 스모크 의무 교훈 추가
...
회고 교훈 jsp-runtime-smoke-gate 반영. JSP 사전컴파일 미설정이라
WAR 빌드 PASS가 EL/taglib 오류를 은닉 → JSP 변경 시 런타임 스모크
의무 + 디자인 이식 stray taglib grep 체크. 근거: errer.jsp JSTL
taglib 결함(세션 20260630-160000).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-30 16:44:57 +09:00
이정수
f87aeee34b
docs(changes): 비주얼 레이어 리디자인 변경 로그
...
bibimbap.css 신설 + 9단위 JSP 비주얼 이식 결과·하드제약 준수·
L1/L2 검증·errer JSTL taglib 결함 수정·needs_user_verification 기록.
docs/changes/index.md 링크 추가.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-30 16:42:42 +09:00
이정수
8c86e8c4e1
docs(graph): index.md 메타 갱신 — source_commit 360078a
...
리디자인 비주얼 레이어 반영. 뷰 fragment 2종(posts-empty/recruit-empty
.jspf)·공유 bibimbap.css·docs 신규 노드 + posts-list/recruit-list
include 엣지 2건 반영. last_generated_at·Scopes 표 갱신.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-30 16:40:16 +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
이정수
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
이정수
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
이정수
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
이정수
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
이정수
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
이정수
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
이정수
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
이정수
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
이정수
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
이정수
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
이정수
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
이정수
305cc73860
feat(badge): W4 유저 배지/평판 — 리뷰어/테크니션 자동·수동 하이브리드 부여 + 평판 이벤트 감사
...
- badges/user_badges/reputation_events 3테이블: docs/badge-ddl.sql 권위 + db/schema.sql 동기, 멱등. badge_type/event_type CHECK + 부분유니크(ux_user_badges_active WHERE revoked_at IS NULL · ux_reputation_events_source WHERE source_ref IS NOT NULL) + FK→users
- BadgeKeys enum 단일정의처(REVIEWER 임계10/REVIEW_WRITTEN, TECHNICIAN 임계3/GAME_UPLOADED). BadgeCatalogSeeder ApplicationRunner ON CONFLICT DO NOTHING(신규 키만 시드)
- 자동부여: ReputationService.record(best-effort 훅, 리뷰작성/게임업로드 후단 try/catch) → BadgeService.evaluateAndSync(countActive>=임계 → insertIgnore 멱등). 임계초과 추가활동·동시성 1회만(ON CONFLICT 부분유니크)
- 수동 부여/회수: BadgeManageController /manage/users/{userId}/badges/{key}/(grant|revoke) — /admin/** 밖 경로 + permissionGate.has(BADGE_MANAGE) 게이트헬퍼(ADMIN 암묵+SUBADMIN 키). CSRF→401→403. revoke=revoked_at+reason, 회수후 재획득 가능
- 신규 권한키 BADGE_MANAGE(PermissionKeys 4번째) — PermissionCatalogVerifier values() 자동 시드(W1 카탈로그 3→4, 회귀 0)
- 표시: 리뷰 작성자 배지 배치 부착(listReviews userId 집합 IN 1쿼리, N+1 차단) + game-detail.jsp 칩(textContent)
- 신규 5매퍼 #{} only(${} 0). @MockBean 6
검증: 컨테이너 ./mvnw -o test 347/347 GREEN(신규 29: BadgeServiceTest 12·BadgeManageControllerTest 14·GameReviewControllerTest 회귀 3), 회귀 0. L2 격리 throwaway DB contract PASS(자동부여 멱등·회수후 재획득 부분유니크·reputation dedupe·countActive·배치 alias·CHECK/FK). W1 카탈로그 회귀 0. 실 dev DB 무접촉.
알려진 잔여(표시 deferral): 프로필 myBadges 컨트롤러 주입 + 게임카드 creator 배지 미구현(JSP 방어적 준비됨, 무렌더 — 설계 graceful-empty 정합). 배지 도메인 코어 + 리뷰작성자 표시는 완성. 두 표시면은 WebMvcController/SearchController(W3-1/3-4) 수정 필요라 별도 후속.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K3FeMrbtxfTScjrwUukyHD
2026-06-29 12:34:23 +09:00
이정수
08d191ff2e
feat(upload): W3-5 Unity WebGL 업로드 보안 보강 — zip-slip/심링크/zip bomb/포맷검증/권한게이트/자산 생명주기/감사
...
- ZipSecurity 추출 코어: validateEntryName 사전거부(절대/UNC/백슬래시/NUL/`..`/길이>255/깊이>32) + normalize startsWith 경계 + assertParentNotSymlink(부모 walk) + 쓰기후 toRealPath 재검증(zip-slip 심층방어). 기존 골격 보강(재작성 아님)
- zip bomb 3중 상한(엔트리당 256MB/누적 512MB/엔트리수 8000), 실제 읽은 바이트 누적(getCompressedSize 미사용). 포맷: 매직바이트 PK + MIME·확장자 AND + Unity 산출물(loader/framework/data/wasm + index.html, .br/.gz 변형 허용)
- 권한 게이트 통일: 진입부 PermissionGate.isAuthenticated(임시 role 직접체크 0, 신규 게이트 메서드 0) + mode=jam 시 GAME_JAM_MANAGE 옵션. 일반 업로드 개방 유지
- 원자적 교체: 임시추출(.tmp/{uuid})→검증→ATOMIC_MOVE swap(미지원 REPLACE 폴백 + finally 복원). replaceUuid 소유검증(UUID 정규화→LIKE 와일드카드 주입 차단, 불일치/비소유 403)
- 자산 생명주기: GameAssetCleanupService.purgeByWebglPath(경계검증) + GameController updateGame/deleteGame 훅(고아 정리)
- 감사: game_upload_audit_log(outcome CHECK·reject_reason 11코드 enum↔DDL 정합) docs/game-upload-ddl.sql 권위 + schema.sql 동기. GameUploadAuditMapper #{} only
- /game/** 서빙 현행 유지(GameAssetController 불변, 신설 안 함 — 조사 stale 정정)
검증: 컨테이너 ./mvnw -o test 318/318 GREEN(신규 31: ZipSecurityTest 20·GameUploadControllerSecurityTest 11), 회귀 0. L2 격리 throwaway DB contract PASS(insertAudit 8컬럼·outcome CHECK·FK·findGameByWebglUuid alias). adversarial zip-slip 감사 SOUND(심링크 TOCTOU 구조적 불가·경로탈출/유니코드/zipbomb/LIKE주입 전수 차단). 실 dev DB 무접촉.
알려진 잔여(배포 하드닝, LOW): 업로드 저장루트(static/game)가 WAR 정적 서빙트리 내 → 기본 classpath:/static/** 핸들러로 transient .tmp 노출 가능성. 저장루트를 서빙트리 밖으로 이전 권고(gameRoot 경로중첩 정합과 함께). transient+검증콘텐츠라 영향 제한.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K3FeMrbtxfTScjrwUukyHD
2026-06-29 12:10:55 +09:00
이정수
6047a39ca5
feat(board): W3-3 포스팅 보드 — 공지/블로그 + OG 미리보기(SSRF 방어) + 유니티 피드 감시
...
- posts/post_categories/unity_feed_sources/unity_feed_items 4테이블: docs/board-ddl.sql 권위 + db/schema.sql 동기, 멱등(IF NOT EXISTS/DO $$). FK·CHECK·부분 UNIQUE(unity_feed_items source_id,guid)
- 포스팅 CRUD: PostController 공개 목록(keyset 페이징 (created_at,id)) + 상세 + 작성/수정/삭제. POST_WRITE enforcement 연결(W1 PermissionGate, 임시 role 체크 0). 작성자무관 POST_WRITE 보유자 편집
- 마크다운 본문: PostMarkdownService commonmark 0.22.0 → jsoup 1.17.2 Safelist allowlist sanitize, 저장 시 1회 캐시(body_sanitized_html). script/on*/javascript:/iframe/object 제거(adversarial 감사 SOUND)
- ★SsrfSafeFetcher 공용 외부 fetch 관문: scheme allowlist + 전 resolved IP 공인검증(사설/루프백/링크로컬/메타데이터169.254.169.254 + CGNAT 100.64/10 + class-E/benchmarking/NAT64/6to4 차단) + 포트 allowlist{80/443/8080/8443} + hostname-connect(HTTPS SNI 정합) + 매홉 재검증(redirect NEVER, MAX 3) + peer 재검증(rebinding) + size cap + timeout + Content-Type + graceful
- OG 미리보기(OgPreviewService) + 유니티 피드 폴링(UnityFeedPoller @Scheduled, SchedulingConfig @EnableScheduling, FeedParser RSS/Atom XXE 방어 disallow-doctype) + guid dedupe(ON CONFLICT DO NOTHING)
- 카테고리/피드 운영: PostAdminController/UnityFeedAdminController /admin/** ADMIN 인터셉터 + CSRF 전수. 카테고리 삭제 FK 보호
- 신규 6매퍼 #{} only(${} 0). @MockBean 8. JSP 5(scriptlet+HtmlUtils.htmlEscape, JSTL 의존 부재 정합)
검증: 컨테이너 ./mvnw -o test 287/287 GREEN(신규 44), 회귀 0. L2 격리 throwaway DB contract PASS(keyset row-comparison·alias·insertIgnoreDup ON CONFLICT·FK 거부). adversarial SSRF 감사: rebinding/redirect/scheme/IP인코딩/IPv6 차단 실증, XSS sanitize SOUND. 실 dev DB 무접촉.
backward 보정(동일 커밋 통합): (1) Host restricted-header→fetch 전건 empty+테스트 vacuous → hostname-connect 전환(HTTPS SNI 정합, JVM 플래그 불요) (2) CGNAT 등 차단범위 확장 (3) FeedParser RFC1123 요일-날짜 불일치 robust 파싱.
알려진 잔여: option-b hostname-connect 는 connect 시 재resolve 로 rebinding TOCTOU 창 존재(DNS 캐시로 최소화). 위협모델상 LOW(fetch URL 제출자=ADMIN 피드등록/POST_WRITE OG). HTTPS 실 TLS = L3 스모크 권고.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K3FeMrbtxfTScjrwUukyHD
2026-06-29 11:46:28 +09:00
이정수
e28fa60ca6
feat(hub): W3-4 메인 허브 keyset 페이징 + 진행중 잼 배너 (단계1+2 통합)
...
- keyset 페이징: GamesMapper.listVisibleKeyset/searchVisibleKeyset 신규 — 커서 (sort_order,created_at,id) 3-튜플 OR 분해(혼합방향 ASC/DESC/DESC), LIMIT #{limit}, #{} only. 기존 getVisibleGames/searchVisibleGames 보존(회귀 0)
- WebMvcController: cursor 파라미터 + nextCursor 산정 + parseCursor/encodeCursor(형식오류→첫페이지 폴백, throw 0) + HubCursor record + HUB_PAGE_SIZE=24. 검색/비검색 동일 커서 규약(공통 헬퍼)
- 진행중 잼 배너(단계2): JamsMapper.listActive/countActive 신규(status IN RECRUIT/DEV/EVAL, is_visible). 최신 1건 + "외 N-1개" 라벨, N=0 미렌더. CTA → W3-1 /games/search?jam={slug}
- index.jsp: 더보기 링크(hasNextPage, q+cursor URLEncoder) + 잼 배너(title HtmlUtils.htmlEscape, slug URLEncoder). 기존 렌더루프+W3-1 태그 UI 보존
- docs/games-hub-ddl.sql: idx_games_visible_keyset 멱등(games 컬럼 0변경) + schema.sql 동기
- BibimbapApplicationTests 무변경(JamsMapper/GamesMapper @MockBean W2-1 기등록 재사용)
검증: 컨테이너 ./mvnw -o test 243/243 GREEN(신규 8: WebMvcControllerTest), 회귀 0. L2 격리 throwaway DB contract PASS(혼합방향 keyset 경계 무중복/무누락·동일 sort_order/created_at tie-break·검색 keyset·잼 status 필터). 정렬키 5곳 동일·${} 0. 실 dev DB 무접촉.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K3FeMrbtxfTScjrwUukyHD
2026-06-29 10:59:17 +09:00
이정수
35f1dc3de9
feat(search): W3-1 게임 태그 + 검색 확장 — tags/game_tags/jam_tags/game_views + 다중태그·정렬키·방문수·리뷰 정렬
...
- 신규 4테이블(tags/game_tags/jam_tags/game_views) + games.view_count ALTER: docs/tag-ddl.sql 권위 + db/schema.sql 동기 사본, 멱등(IF NOT EXISTS/DO $$ guard)
- 통합 태그 도메인: tag_type(GAME/JAM/COMMON) + 운영자 사전정의·사용자 pending→승인 하이브리드. slug/name UNIQUE
- 검색 확장 GamesMapper.searchGamesAdvanced(SearchCriteria): 태그 다중필터(AND HAVING==tagCount / OR IN) + 제작자 ILIKE + 정렬키 6(latest/likes/views/reviews/rating/relevance) + 잼 검색 라우트(/games/search?jam={slug}, jam_entries 조인). 기존 searchVisibleGames 보존(회귀 0)
- game_review_stats VIEW LEFT JOIN: avg_rating AS "avgRating"/review_count AS "reviewCount" 케이스폴딩 인용. NULLS LAST. 정렬키/tagMode 는 <choose> 내부 고정문자열
- 방문수: game_views 24h dedupe(interval) + games.view_count 비정규화 증분. GameController view 훅
- 태그 관리 API: TagController(생성/승인/비활성/부착) CSRF 전수 + /admin/tags CONTENT_MODERATE 게이트. TagSanitizer 길이2~20·화이트리스트·금칙어(banned-words.txt)
- 신규 4매퍼 #{} only(${} 0건). GameData nullable 박스필드(viewCount/avgRating/reviewCount) 확장. BibimbapApplicationTests @MockBean 4종
검증: 컨테이너 ./mvnw -o test 235/235 GREEN(신규 45: TagSanitizerTest 16·SearchControllerTest 10·TagControllerTest 19), 회귀 0. L2 격리 throwaway DB contract PASS(alias 케이스폴딩 인용/비인용 대조·NULLS LAST·AND⊆OR·ILIKE·interval dedupe). 집합전수 AC-1/2/4/5 PASS. 실 dev DB 무접촉.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K3FeMrbtxfTScjrwUukyHD
2026-06-29 10:44:23 +09:00