8.4 KiB
8.4 KiB
| schema_version | sid | resumed_from | started_at | ended_at | user_request |
|---|---|---|---|---|---|
| 2 | 20260622-170857 | 20260622-092800 | 2026-06-22T17:08:57+09:00 | W3-2 댓글/리뷰 고도화 검증 부채 해소 (검증 전용 — 신규 기능 추가 금지). 직전 세션 코드 L1 43/43 GREEN. 미검증분 3가지만 닫는다: (1) DDL 적용 + dev 스키마 4객체 검증 (2) L1 회귀 가드 (mvn test 43 GREEN 재확인) (3) L3 브라우저 스모크 (XSS 미실행·재방문 영속·다축평점·페이지네이션·키보드·UX·A2 마스킹) 완료 시 changes 문서 §검증결과 표 + security checklist B3 갱신. |
Summary
W3-2 댓글/리뷰 고도화 검증 부채(DDL 적용 / L1 회귀 / L3 브라우저 스모크) 전량 해소. 검증 중 서버 집계의 실버그 2건(뷰 fan-out, 매퍼 alias 케이스 폴딩) 발견·최소수정. L3 12개 항목 전수 PASS. 검증 데이터는 세션 종료 시 정리해 원본 시드 복귀.
핵심 결과:
- STEP1 DDL: dev 4객체 검증 PASS.
- STEP2 L1: mvn test 43/43 GREEN(버그 수정 후 재실행도 43/43, 무회귀).
- STEP3 L3: XSS 미실행·재방문 영속·다축6행·SVG레이더·집계·페이지네이션·키보드·C1/C2/C4·B2·A2 전부 PASS.
- 버그수정: GameReviewStatsMapper.java(alias 3개 quote), docs/game-reviews-ddl.sql + db/schema.sql(뷰 fan-out 수정), 실행 DB CREATE OR REPLACE 적용.
- 환경: 가동 중이던 stale spring-boot:run(목요일 기동, 구 JSP)을 현재 빌드로 재기동. claude-in-chrome computer 도구는 document_idle 차단으로 javascript_tool/curl/psql 조합 검증.
Advisor Invocation Decision Log
각 advisor 호출/스킵 판단 즉시 1줄 append
- advisor: requirements-advisor decision: skip rationale: '사용자가 STEP1/2/3 + 완료처리까지 정밀 명세. 요구 모호성 0.' checked_at: 2026-06-22T17:09:00+09:00
- advisor: graphify-lookup-advisor / research-advisor decision: skip rationale: '검증 전용. 신규 설계·외부조사 불요. 배경문서(changes/local-setup) 직독으로 충분.' checked_at: 2026-06-22T17:09:00+09:00
- advisor: design-advisor / implementation-advisor decision: skip rationale: '코드 변경 기본 없음(검증 전용). 버그 발견 시에만 최소수정 — 그때 재평가.' checked_at: 2026-06-22T17:09:00+09:00
- advisor: verification-advisor decision: call rationale: 'STEP1(DDL 멱등적용+4객체 psql 검증) + STEP2(mvn test 43 GREEN) Bash 검증 위임. 출력 verbose → 컨텍스트 격리 가치.' checked_at: 2026-06-22T17:09:30+09:00
Invocations
- advisor: verification-advisor phase: STEP1+STEP2 model_choice: { tier: medium, rationale: 'Bash 실행+AC 판정, 코드추론 불요' } result: PASS detail: | AC-1 game_review_axes PASS (score CHECK 1-5, axis_key CHECK 6종, UNIQUE는 INDEX ux_game_review_axes_review_axis 로 구현 — constraint 카탈로그 미표기지만 기능동등) AC-2 game_review_stats 뷰 9컬럼 PASS AC-3 game_comments.updated_at timestamptz NOT NULL, mismatched=0/total=3 PASS AC-4 game_reviews.is_rating_manual boolean DEFAULT false NOT NULL PASS AC-5 mvn test: Tests run 43 Failures 0 Errors 0 (GameComment17/GameReview20/Csrf5/App1) PASS concerns: 'AC-1 UNIQUE 구현형태=INDEX(not constraint). 기능동등, 비차단.'
Bug Findings (L3 실게임 검증 중 발견 — L1 mock 사각)
BUG-1 game_review_stats 뷰 fan-out (집계 왜곡)
- 근거: docs/game-reviews-ddl.sql:171-185 (수정전) —
LEFT JOIN game_review_axes직접 조인. - 증상: 리뷰에 axes 행이 존재하면 리뷰가 axes 행수(최대 6)만큼 복제 →
COUNT(*)=11(실제 6),AVG(rating)=2.8(실제 3.5). axes 0행일 땐 잠복(이전 "3.8(5)" 정상), 다축 리뷰 입력 순간 발현. - 수정: 축 평균을 서브쿼리에서 game 단위 선집계 후 LEFT JOIN(MAX), 리뷰 단위 집계는 game_reviews 단독. docs/game-reviews-ddl.sql + db/schema.sql 동기 + 실행 DB CREATE OR REPLACE 적용.
- 수정후 검증: 뷰 game3 → review_count=6, avg_rating=3.5 (실제값 일치). PASS.
BUG-2 GameReviewStatsMapper alias 케이스 폴딩 → summary 항상 null
- 근거: GameReviewStatsMapper.java:13-15 (수정전) —
AS gameId/avgRating/reviewCount(따옴표 없음). - 증상: Postgres가 따옴표 없는 alias 를 소문자(gameid/avgrating/reviewcount)로 폴딩 → MyBatis Map 키 소문자. buildSummary(GameReviewController.java:372-390) 가
stats.get("reviewCount")camelCase 조회 → null → reviewCount=0 → summary=null. JSP(game-detail.jsp:2188if(!summary||!summary.reviewCount))는 항상 "아직 평가 없음" 오표시. 서버집계 기능 전면 무력. - 왜 L1 통과: BibimbapApplicationTests/컨트롤러테스트가 매퍼를 @MockBean 으로 대체 → 실제 Postgres alias 폴딩 미발생. mock-vs-reality 갭.
- 수정: alias 3개 따옴표(
AS "gameId"/"avgRating"/"reviewCount"). axis alias 는 소문자=AXIS_KEYS 일치라 유지. - 수정후 검증: 앱 재기동 후 curl 재확인(아래 verified_by_me).
Decisions
- 버그 발견으로 "검증 전용·코드무수정 기본" 가정 반전 → task 의 "실제 버그 발견 시 최소수정" 사전승인 하에 수정. 수정 범위: 매퍼 alias 3개 + 뷰 정의(2파일) + 실행DB 재적용. 비파괴(CREATE OR REPLACE, alias quote).
- 회귀테스트: 두 버그 모두 DB-통합 계층(L1 mock 우회). 기존 단위 harness(@MockBean)로 재현 불가 → 자동 회귀 테스트는 별도 L2 contract(dev DB 연동) 인프라 필요. 본 세션은 L3 curl+브라우저 before/after(11/2.8/null → 6/3.5/정상)를 회귀 근거로 삼고, L2 contract 테스트 신설을 open_items 로 권고.
- DDL 적용은 §6 파괴 게이트 비해당: 멱등 CREATE TABLE/ALTER ADD/CREATE OR REPLACE VIEW (DROP/TRUNCATE/rollback 아님). changes 문서서 이미 일반 DDL 분류. → 사용자 재확인 불요.
- detail 라우트 = /game/{id} (numeric games.id). dev 가시게임 id=3.
- L3 브라우저 스모크는 claude-in-chrome 필요 → advisor 미보유 → orchestrator 직접 수행.
verified_by_me
- L1: unit+regression — mvn test 43/43 GREEN (GameComment17/GameReview20/Csrf5/App1), 버그수정 후 재실행도 43/43 (verification-advisor 2회 독립 판정).
- DDL: dev 스키마 4객체 psql 검증 (game_review_axes UNIQUE index+CHECK 6종+score 1~5 / game_review_stats 9컬럼 / game_comments.updated_at timestamptz NOT NULL / game_reviews.is_rating_manual boolean DEFAULT false NOT NULL).
- L3 (javascript_tool+curl+psql+JSP정적): XSS 미실행(alert 0회, textContent 텍스트노드) / 재방문 영속(쿠키없는 GET 서버데이터) / 다축 6행+overall 자동(false)·수동(true) / SVG레이더+aria 6축 / 집계 3.5·(6) / 페이지네이션 21건 page0=20 hasMore=true page1=1 / 키보드 roving+preventDefault / C1 disabled+aria-busy / C2 상대시각+title / C4 0/200·0/1000 / B2 2자→400 / A2 테스터·탈퇴마스킹.
- 버그수정 검증: BUG-1 뷰 review_count 11→6, avg 2.8→3.5. BUG-2 summary null→{avgRating:3.5,reviewCount:6,axes}.
- 로그 스캔: clean (앱 기동 로그 ERROR 0, 환경성 WARN만).
needs_user_verification
- (선택) claude-in-chrome computer/screenshot 도구가 본 dev 페이지에서 document_idle 미도달로 차단됨 — 시각적 스크린샷 증빙 없음(검증은 DOM/이벤트/서버계약으로 동치 수행). 원인이 WebGL iframe/page idle 휴리스틱인지 사용자 환경 확인 권장(비차단).
- 가동 앱: 본 세션이 stale spring-boot:run(구 JSP)을 현재 빌드로 재기동해 8080에서 실행 중. 사용자가 별도 기동 흐름이 있었다면 인지 필요.
graph_refresh
fresh → 후속 없음. graph-refresh-checker 판정: 변경분(매퍼 alias 따옴표 + 뷰 내부 집계로직)이 심볼 시그니처·뷰/테이블/컬럼 토폴로지를 바꾸지 않음(구조 시그널 0). 재생성·삭제 불필요. source_commit 메타 갱신은 선택(필수 아님) — 본 세션 미수행.
ended_at
2026-06-22T17:50:00+09:00
open_items
- L2 contract 테스트 신설 권고: game_review_stats 뷰 집계 정합 + GameReviewStatsMapper Map 키를 dev DB 연동으로 가드. BUG-1/2가 L1 @MockBean 사각으로 누출된 근본원인 차단용. (changes 문서 §범위밖/이월 + security checklist 연계)
- 미커밋 잔여 0 목표 — 본 작업 단위 커밋으로 마감.
user_signals
positive:
- quote: "dev 픽스처로 자동 로그인 (Recommended) 수락" note: 제안한 검증 경로/권장안을 1회에 수락(이견 없음). negative: []