Compare commits

...

10 Commits

Author SHA1 Message Date
이정수 e67996e5f3 docs(webgl): 화면 대응과 로컬 확인 결과 상세 기록
구현 결정, 검증 증거, 로컬 DB 적용과 게임 등록, 사용자 긍정 의견 및 남은 확인을 기록한다. 스크린샷 15장과 갤러리를 보존하고 링크와 이미지 해시를 검증했다.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-10-14 17:20:43 +09:00
이정수 90af59939c docs(atp): WebGL 해상도 대응 검증 세션 종료 기록
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-10-14 10:02:57 +09:00
이정수 ddd9abfe41 feat(webgl): 업로드 빌드별 화면 비율 대응 및 확대 지원
게임별 기준 크기를 정적 감지·저장하고 작성자 직접 지정과 기존 게임 fallback을 제공한다.
비율을 유지한 양축 크기 조정 및 동일 iframe의 확대·전체화면을 지원한다.

검증: Java 377 실패 0, Node 11/11, 격리 PostgreSQL L2 통과.
JSP 5경로 200, 빌드 3종 화면 12조합, 실제 Unity trusted touch 메뉴 전환 통과.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-10-14 10:02:28 +09:00
이정수 da82edf6ec docs(security): 최신 의존성 권고와 NVD 실시간 대조 결과 기록
WAR 43개 JAR의 81개 좌표 조회와 NVD 28 CVE 대조. 실제 악용 조건과 영향 버전을 구분하고 캐시 0건을 출시 근거에서 제외.

Co-Authored-By: Codex <noreply@openai.com>
2026-09-22 11:59:50 +09:00
이정수 16ccad7867 docs(analysis): 출시 준비 검증과 배포 차단 요인 기록
362개 테스트 및 live WAR 빌드, 공개 화면 16회와 격리 DB 인증·모집글 흐름 검증. 운영 설정 패키징 누락과 신규 DB 시드 공백에 따라 라이브 출시 보류.

Co-Authored-By: Codex <noreply@openai.com>
2026-09-22 11:50:01 +09:00
이정수 184839434c docs(changes): 포스트 카테고리 시드/뷰 재설계 기록 + 세션 회고 교훈 반영
- docs/changes: 2026-07-24 포스트 카테고리 시드+뷰 재설계 문서 신규 + index/coverage-checklist/이전 리디자인 문서 교차링크.
- 회고 교훈 2건 docs-first 반영: verification-strategies(기존 컨트롤러 시그니처 변경도 full test 의무 — baseline RED 방지), workflow-patterns(도메인/상호작용 모델은 UI taxonomy 가정 전 permission enum·work-log 로 접지).
- ATP 세션 산출물(report/설계도/검증/문서화) 동봉.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UqyLwTxF3FmW1eJCWN8yAo
2026-07-24 17:25:13 +09:00
이정수 0b8da9d19f feat(posts): 기본 카테고리 5종 시드 + 카테고리별 목록 뷰 재설계
포스트 보드는 편집형 일방 발행 모델(Unity 블로그 참조)이나 post_categories 시드가 0건이라 목록 탭이 '전체' 하나만 렌더됐다. 기본 카테고리 5종(공지/개발일지/쇼케이스/자료·튜토리얼/업계 소식)을 멱등 마이그레이션(ON CONFLICT DO NOTHING)으로 시드하고, 목록 카테고리별 뷰 표현층을 재설계했다.

- 카테고리 탭: '편집 마스트헤드 인덱스'로 재설계 — 서수 01~05(sort_order 근거) + 카테고리 hue 밑줄 rule + 로드 staggered reveal. 오버플로는 가로 스크롤(단일행 signature 보존), :focus-visible 링, aria-current='page' 추가.
- 카드 뱃지: 전 카드 동일 amber pill 제거 → 카테고리 hue dot + 조용한 대문자 라벨.
- 카테고리 hue 5색 토큰(저채도 인쇄물 팔레트, light/dark). slug는 catToken() 화이트리스트로 방출(임의 slug의 CSS 주입 차단).
- 빈상태 2종 split: posts-empty-nocats(카테고리 0개)/posts-empty-noposts(특정 카테고리 글 0개). 편집 톤 카피, 소비자에겐 글쓰기 CTA 미노출(일방 발행 정합). 구 posts-empty.jspf 삭제.
- 기능 로직(categoryId 필터·keyset 페이지네이션) 불변. JSP escape 유지, bibimbap.css 0변경, prefers-reduced-motion 존중.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UqyLwTxF3FmW1eJCWN8yAo
2026-07-24 17:12:58 +09:00
이정수 727b121888 fix(posts): PostControllerTest list() 콜사이트 categoryId 시그니처 정합
feat/v2 HEAD의 PostController.list가 categoryId(5인자)로 성장했으나 PostControllerTest 3개 콜사이트가 구 4인자 호출로 남아 test-compile이 RED였다. 이번 카테고리 시드/뷰 작업과 무관한 선재 결함으로, null 인자 1개를 추가해 무필터·무커서 의도를 보존하며 시그니처를 정합시켰다. 컨테이너 mvn test 362 GREEN 확인.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UqyLwTxF3FmW1eJCWN8yAo
2026-07-24 17:12:37 +09:00
이정수 c2daee8e6d docs(graph): JSP/JSPF graphify 스캔 범위 밖 알려진 한계 절 등재
Scopes 표는 재생성 때마다 덮어써져 이 사실이 매번 사라짐 —
20260701/20260724 두 세션에서 재확인된 재발 이슈라 영속 절로 분리.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UqyLwTxF3FmW1eJCWN8yAo
2026-07-24 09:47:52 +09:00
이정수 02a1b758a0 feat(posts): 글쓰기 진입점 POST_WRITE 권한 조건부 노출
포스팅 목록 헤더 링크·빈 상태 버튼을 canWrite 로 감싸 권한 없는 세션엔
노출되지 않도록 함. 신규 권한 로직 없이 create()/edit 에서 이미 쓰던
gate.has(session, PermissionKeys.POST_WRITE) 를 list() 에서도 재사용.

docs/graph/index.md: PostController.java 변경분 incremental 반영
(1477→1507 노드). JSP 는 여전히 그래프 스캔 범위 밖(기존 한계).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UqyLwTxF3FmW1eJCWN8yAo
2026-07-24 09:44:32 +09:00
134 changed files with 21830 additions and 60 deletions

View File

@ -0,0 +1,105 @@
# Work Session Report
schema_version: 2
sid: 20260724-092601
started_at: 2026-07-24T09:26:01+09:00
user_request: "포스팅은 권한있는 사람만 작성 가능한거니까 글쓰기는 권한있는 사람만 나타나게해줘"
# Advisor Invocation Decision Log
# 각 advisor 호출/스킵 판단 즉시 1줄 append
- advisor: requirements-advisor
decision: skip
rationale: '요구 명확 — 기존 POST_WRITE 서버측 게이트를 뷰에 그대로 반영하는 단순 UI 노출 조건'
checked_at: 2026-07-24T09:26:01+09:00
- advisor: research-advisor
decision: skip
rationale: 'PostController.requireWritePermission/gate.has(session, PermissionKeys.POST_WRITE) 기존 코드로 충분 — 신규 조사 불필요'
checked_at: 2026-07-24T09:26:01+09:00
- advisor: design-advisor
decision: skip
rationale: '영향 파일 3개(PostController.java, posts-list.jsp, posts-empty.jspf) 확정, 계약(canWrite model attr) 자명 — 마이크로 스코프'
checked_at: 2026-07-24T09:26:01+09:00
- advisor: implementation-advisor
decision: skip
rationale: '파일 3개·경합 없음, orchestrator 직접 구현 (SKILL §5.1 마이크로 편집 예외)'
checked_at: 2026-07-24T09:26:01+09:00
## Invocations
[]
## Summary
포스팅 목록(`/posts`) 글쓰기 진입점 2곳(헤더 링크, 빈 상태 버튼)을 `canWrite` 조건부로 감싸
POST_WRITE 권한 없는 세션엔 노출되지 않도록 변경. 서버측 신규 게이트 로직 없음 —
기존 `PostController.requireWritePermission`/`create()`가 쓰던
`gate.has(session, PermissionKeys.POST_WRITE.name())`를 `list()`에서도 재사용해
`canWrite` model attribute로 view에 전달.
## Decisions
- canWrite 판정은 `PermissionGate.has(session, PermissionKeys.POST_WRITE.name())` 재사용 (신규 로직 없음)
- posts-empty.jspf 는 `<%@ include %>` static include라 posts-list.jsp 스크립틀릿 변수(canWrite)가
그대로 보임 — 별도 request attribute 전달/재계산 불필요
## Verified_by_me
- L1 typecheck: `docker compose exec app mvn -o -P dev -DskipTests compile` → BUILD SUCCESS
- 통합 스모크(수동, 실행 중인 dev 앱 대상):
- 익명 세션 `GET /posts` → "글쓰기" 텍스트 0건 (헤더 링크·빈상태 버튼 모두 미노출)
- `admin@bibimbap.local` 로그인 세션 `GET /posts` → 헤더 `<a class="posts-write">글쓰기</a>` +
빈상태 `+ 글쓰기` 버튼 둘 다 노출
- L2: skip (외부 의존 계약 변경 없음)
## Needs_user_verification
- (없음) — dev 컨테이너 재시작으로 즉시 반영 확인 완료. 운영 배포 시엔 일반 배포 절차(재빌드/재시작)만 필요.
## user_signals
positive: []
negative: []
## graph_refresh
decision: handled_inline
judgment: partial-stale
scopes_processed: [full]
reason: '변경 4파일(≤5) → B-1 인스턴스 내 즉시 처리. incremental update로 1477→1507 노드(고스트 중복 20 exact+11 fuzzy 제거), 76 커뮤니티 불변이라 기존 라벨 재사용. docs/graph/index.md 메타 갱신 완료. JSP/JSPF 확장자는 graphify 스캔 범위 밖이라 posts-list.jsp/posts-empty.jspf 변경은 그래프 미반영(기존 한계, 이번 세션 이슈 아님).'
## Retrospective
```yaml
Retrospective:
signals:
positive: []
negative: []
what_went_well:
- '요구 명확성 판정이 정확했다 — 4개 advisor 전원 스킵(요구/조사/설계/구현) 근거가 각각 자명했고(기존 POST_WRITE 게이트 재사용, 영향 파일 3개 확정, 신규 로직 0), SKILL §5.1 마이크로 편집 예외 조건(파일 수 소규모·경합 없음)에 부합 — 결과적으로 L1 compile GREEN + 수동 스모크 2건(익명 미노출/admin 노출) 1라운드 통과, 재작업 0.'
- 'graph_refresh 가 변경 파일 중 posts-list.jsp/posts-empty.jspf 가 그래프에 반영되지 않는다는 사실을 숨기지 않고 reason 필드에 명시 — "판정 근거를 투명하게 남긴다" 원칙에 부합.'
what_to_improve:
- 'JSP/JSPF 가 graphify 스캔 범위 밖이라는 사실이 세션 20260701-083240(§285 인용)에 이어 이번 세션(20260724-092601)까지 최소 2회 재확인됐으나, 두 번 다 해당 세션의 report.md 및 docs/graph/index.md "Scopes" 표(매 graphify 실행마다 덮어써짐)에만 1회성으로 기록됐다 — 영속 위치에 없어 다음 JSP 변경 세션이 또 한 번 관찰/재확인 비용을 치를 가능성이 높다.'
memory_candidates:
- name: graphify-jsp-scan-gap
type: reference
description: 'graphify 는 .jsp/.jspf 를 code 확장자로 인식하지 않아 JSP 기반 뷰 변경이 그래프에 구조적으로 반영되지 않음 (2회 재확인: 20260701-083240, 20260724-092601)'
body_draft: |
Why: graphify SKILL.md 의 code_only 판정 목록(`--update` 절, code_exts 셋)은
`.py .ts .js .go .rs .java .cpp .c .rb .swift .kt .cs .scala .php ...` 등
고정 확장자만 code 로 인식한다. `.jsp`/`.jspf`는 이 목록에 없어 AST 추출 대상이
아니고, semantic(LLM) 청크로도 code 파일 취급되지 않는다. bibimbap 은 뷰 레이어가
JSP 라서 화면 로직 변경(예: canWrite 조건부 렌더)은 구조적으로 그래프에 반영될 수
없다 — 세션마다 새로 관찰하는 대신 알고 시작해야 하는 사실.
How to apply:
1. graph_refresh 판단 시 변경 파일이 JSP/JSPF **뿐**이면 incremental 재추출을
시도하지 말고 "그래프 미반영(알려진 한계)"로 즉시 판정 — no-scope-change 취급.
2. 뷰 레이어 구조(컨트롤러↔JSP 매핑, `<%@ include %>` 관계 등)를 그래프로 질의하지
않는다 — grep/Read 로 직접 확인.
3. docs/graph/index.md 에 "Scopes" 표(매 실행마다 덮어써짐)와 분리된 영속
"알려진 한계" 절을 두어 이 사실이 재생성 때마다 사라지지 않게 한다.
rationale_for_saving: '23일 간격으로 2회 재발(재현성 확인), 코드/git log만으로는 유도 불가(그래프 산출물을 직접 열어봐야 드러남), 어디에도 영속 기록이 없음(ephemeral report.md·매회 덮어써지는 Scopes 표에만 산발).'
signal_source: observation
docs_sync_target: /Users/wemadeplay/workspace/stz/bibimbap/docs/graph/index.md
memory_optional: true
protocol_feedback:
- 'graph_refresh 판단 절차(§graph_refresh)에 "변경 파일 전체가 graphify 미인식 확장자(JSP/JSPF 등 템플릿 계열)일 때 incremental 추출을 생략하고 즉시 no-scope-change 로 판정" 하는 명시적 fast-path 를 추가 제안 — 이번 세션은 코드(PostController.java)가 섞여 있어 낭비가 없었지만, 순수 JSP-only 변경 세션에서는 매번 동일 관찰을 반복할 위험.'
- 'docs/graph/index.md 템플릿(atp-graphify add-on 산출물 규약)에 "Scopes" 표와 별도로 영속되는 "알려진 한계"(Known limitations) 절 슬롯을 표준 포함 제안 — 표는 매 재생성 때 덮어써지므로 도구 경계에 대한 사실은 다른 곳에 살아야 한다.'
applied_changes:
- 'docs/graph/index.md 에 "알려진 한계" 영속 절 신설 — JSP/JSPF graphify 스캔 범위 밖 사실 기록(docs-first, memory 는 사용자 설정 미확인이라 미기재)'
```
ended_at: 2026-07-24T09:52:00+09:00

View File

@ -0,0 +1,344 @@
---
phase: design
agent: design-advisor
agent_version: 1
generated_at: 2026-07-24T10:04:14+09:00
concerns:
- "폰트 불일치(설계 미해결이 아니라 명시적 유지): bibimbap.css는 body에 Pretendard(--font-sans)를 지정하나 posts-list.jsp 인라인 <style>의 body{font-family:system-ui...}가 소스 순서상 뒤에 와서 승리 → posts 페이지는 system-ui. 사용자 확정 제약이 system-ui 유지·전체 폰트 교체 금지이므로 그대로 둔다. 사이트 다른 페이지(Pretendard)와 미세 톤 차이 존재하나 의도된 현상태 보존."
- "탭 오버플로를 가로 스크롤로 선택 → 좁은 모바일에서 우측 카테고리가 화면 밖으로 밀릴 수 있음. edge fade 마스크 + scroll-snap 으로 완화하나 '스크롤 가능' 어포던스가 시각장애/저시력 사용자에게 약할 수 있음. 카테고리 6개(전체+5) 기준 대부분 뷰포트에서 스크롤 미발생이라 실사용 리스크는 낮음. 카테고리가 8~10개로 증가하면 재평가 필요."
- "notice(공지) 라이트 hue #B0741A 는 크림 배경 대비 ~3.5:1 로 소형 본문 텍스트 4.5:1 미달. 완화책: hue는 마커(dot)·섹션 rule·서수(UI 요소, 3:1 기준 충족)에만 쓰고, 뱃지/탭의 실제 라벨 텍스트는 --text(고대비 잉크)로 유지. 라벨 색을 hue로 물들이지 않는다. 이 규율을 §2/§4 에 명시."
- "카테고리 hue 는 고정 5-slug 화이트리스트. 운영자가 신규 slug 카테고리를 추가하면 hue 매핑이 없어 중립(잉크/앰버) 폴백된다(graceful). 단 신규 카테고리에 색을 주려면 CSS 토큰 + 화이트리스트 helper 두 곳을 함께 갱신해야 하는 유지 결합이 있음. §검증 AC 가 두 집합 동수 불변식으로 누락을 검출."
- "(b) 빈상태에서 활성 카테고리명 표기는 categories 리스트를 categoryId 로 스캔해 얻음. 해당 카테고리가 비활성화(listActive 미포함)면 이름 조회 실패 → 일반 문구로 폴백. 정상 흐름에선 발생하지 않음(필터 링크는 활성 카테고리에서만 생성)."
concerns_checked: true
references:
requirements: null
research: null
adrs: []
source_files:
- src/main/webapp/WEB-INF/views/posts-list.jsp
- src/main/webapp/WEB-INF/views/fragments/posts-empty.jspf
- src/main/webapp/css/bibimbap.css
- src/main/webapp/WEB-INF/views/theme-init.jsp
- src/main/java/com/pandoli365/bibimbap/data/PostData.java
- src/main/java/com/pandoli365/bibimbap/data/PostCategoryData.java
- src/main/java/com/pandoli365/bibimbap/mapper/PostCategoriesMapper.java
- src/main/java/com/pandoli365/bibimbap/controller/PostController.java
- /Users/wemadeplay/.claude/plugins/cache/claude-plugins-official/frontend-design/unknown/skills/frontend-design/SKILL.md
---
# 설계: 포스트 보드 "카테고리별 목록 뷰" 표현층 재설계
## 목표 / 비목표
**목표**
- 편집형 일방 발행(Unity 블로그 모델) 세계관에 맞는 목록 뷰 표현층. 상호작용(댓글 유도) 축이 아니라 편집/매거진 톤.
- 카테고리 탭 네비를 이 화면의 단 하나의 signature 로 만든다 — "편집 섹션 인덱스(masthead index)". 나머지(카드/뱃지/빈상태)는 절제.
- 5개 카테고리를 slug 기반 절제된 편집 팔레트로 시각 코딩(무지개 회피, 크림+amber 와 harmonize, light/dark 양쪽 대비 확보).
- 접근성 결손 3종 보강: `:focus-visible` 포커스 링, `aria-current="page"`, 탭 오버플로 처리.
- 빈상태를 편집형 목소리 2종으로 분기(카테고리 미생성 / 특정 카테고리 글 0). 현재 peer-forum 문구("커뮤니티의 첫 글을 남겨보세요")를 발행 톤으로 교정.
- 로드 시 signature(탭 인덱스)에 고임팩트 모션 1곳. `prefers-reduced-motion: reduce` 존중.
**비목표**
- 기능 로직 불변: 필터 쿼리(categoryId), keyset 페이지네이션(cursorCreatedAt/cursorId + categoryId), 컨트롤러/매퍼/SQL — 절대 미변경.
- 전역 폰트 교체 금지(header/footer/타 페이지 정합). 시그니처는 weight/tracking/letter-spacing/크기 대비로만.
- bibimbap.css 수정 금지(§7 근거). resources/static 신규 자원 금지.
- 카드 상세/작성 폼/권한 게이트 미변경.
- 신규 색은 "editorial 섹션 액센트"로 제한 — 퍼플 그라디언트·Inter 교체·브로드시트 클리셰 금지.
## 개요
현재 목록 뷰의 문제는 (1) 탭이 generic amber pill 이고 카테고리 구분 없음, (2) 카드 뱃지가 전 카테고리 동일 amber 라 "모든 카드가 같은 색으로 소리침"(정보 0, 노이즈 1), (3) 빈상태가 단일·peer-forum 톤, (4) focus/aria/overflow 결손이다.
재설계 방향은 **"편집 섹션 인덱스"** 하나에 대담함을 집중한다. 탭 네비를 잡지 목차(masthead index)처럼 — 각 탭에 sort_order 기반 편집 서수(`01`~`05`) + 라벨 + 활성 시 카테고리 hue 의 **섹션 rule(밑줄)** 로 표현한다. 서수는 sort_order 라는 실제 편집 우선순위가 있으므로 정당하다(전체 탭은 서수 없음 = masthead 자체/브랜드 중립). 카드 뱃지는 "액세서리 하나 빼기" — 채워진 amber pill 배경을 제거하고 **hue dot + 저채도 대문자 라벨**로 축소해 카드 노이즈를 줄이면서 오히려 카테고리 정보를 추가한다. 모든 신규 스타일은 기존 패턴대로 posts-list.jsp 인라인 `<style>` 안에서 완결(자체 토큰 네임스페이스), bibimbap.css 는 건드리지 않는다.
## 플로우
진입점: `GET /posts` (또는 `?categoryId=N`, `?cursor...`).
컨트롤러(PostController#list, 미변경)가 model 에 `posts, categories(listActive 정렬됨), categoryId, hasNext, canWrite, nextCursor*` 를 제공.
렌더 분기(posts-list.jsp):
1. 헤더/hero(미변경) 렌더. canWrite 시 글쓰기 버튼.
2. **탭 인덱스 nav** 렌더:
- "전체" 탭: `categoryId == null ? is-active`, 서수 없음, 활성 시 잉크 라벨 + amber rule.
- `categories` 순회(=sort_order 순): 서수 `%02d`(index+1), 라벨(htmlEscape name), `data-cat=<catToken(slug)>`, `categoryId.equals(cat.id) ? is-active + aria-current="page"`.
3. `posts.isEmpty()` 분기:
- `categories.isEmpty()` → **빈상태 (a)** `posts-empty-nocats.jspf` include (운영자 미생성).
- else → **빈상태 (b)** `posts-empty-noposts.jspf` include (글 0). 직전에 `activeCategoryName` 을 categories 에서 categoryId 로 스캔·resolve.
4. else → `posts-grid` 렌더. 각 카드: 썸네일(옵션) + `data-cat=<catToken(post.slug)>` 뱃지(dot + 라벨) + 제목 + 저자.
5. `hasNext` → 더보기 링크(moreUrl 에 categoryId·cursor 유지, **문자열 조립 로직 미변경**).
종단: 정적 HTML. 신규 JS는 도입하지 않는다(스크롤/포커스/모션 전부 CSS-only). 진입 시 CSS 애니메이션이 탭 인덱스를 좌→우 staggered reveal.
## 데이터 모델 (해당 시)
DB/DTO 스키마 변경 없음. 기존 필드 재사용만:
- `PostCategoryData.getSlug()`, `getName()`, `getId()`, `getSortOrder()` — 탭.
- `PostData.getCategorySlug()`, `getCategoryName()`, `getCategoryId()` — 카드 뱃지.
slug 는 시각코딩 키로만 재사용하며 **CSS 에 원시 slug 를 주입하지 않는다**(§외부 계약·§7 XSS 규율).
## 외부 계약 (해당 시)
HTTP/RPC/메시지 인터페이스 변화 없음. URL·쿼리 파라미터·응답 계약 전부 동일. 순수 표현층(마크업 구조 + 인라인 CSS + 프래그먼트 분할)만 변경.
---
## 1. 토큰계획
**brief (1문단)**: 인디게임 제작자 플랫폼의 편집형 발행 보드. 세계관은 "제작 현장의 편집 데스크" — 따뜻한 종이(크림) 위에 골드 마스트헤드, 섹션마다 잉크/테라코타/세이지/더스티블루의 인쇄물 섹션 색. 대담함은 마스트헤드 인덱스(탭) 한 곳. AI-slop(퍼플 그라디언트·폰트 교체·브로드시트 세리프 클리셰)을 피하고, 기존 크림+amber 프로젝트 고유 언어를 유지하되 "크림+세리프+테라코타 기본형"에 안주하지 않고 편집 섹션 팔레트로 구체화한다.
**코어 색 토큰(기존 유지·재확인, light / dark)** — posts-list.jsp 인라인 네임스페이스(`--surface` 계열)에 이미 존재, 그대로 사용:
| 토큰 | 역할 | light | dark |
|---|---|---|---|
| `--surface` | 페이지 종이 배경 | `#faf8f5` | `#121212` |
| `--card-bg` | 카드/탭 표면 | `#ffffff` | `#1e1e1e` |
| `--text` | 잉크 본문(라벨·서수 고대비) | `#1a1a1a` | `#ece8e1` |
| `--text-muted` | 보조/비활성 | `#5c5c5c` | `#a39e96` |
| `--accent` | 브랜드 골드(전체 탭 rule·호버) | `#e8a54b` | `#e8a54b` |
| `--border` | 보더 | `rgba(0,0,0,.08)` | `rgba(255,255,255,.1)` |
신규 구조 토큰 1개(섹션 rule 두께 상수는 CSS 리터럴로 충분하므로 색 토큰만 추가):
- 카테고리 hue 세트는 §2 에 정의(코어 6개와 분리해 "섹션 액센트 세트"로 관리). 코어 팔레트는 6개 유지 → brief 의 "4~6개" 충족.
**type 2역할** (폰트 교체 없이 weight/tracking/size 대비로):
- **Index/Display 역할**: 탭 서수 + hero eyebrow. `font-weight: 800`, `letter-spacing: .14em`, `font-variant-numeric: tabular-nums`, 소형(0.7rem), 대문자/서수. → 마스트헤드 "인쇄 번호" 느낌.
- **Label/Body 역할**: 카드 제목·탭 라벨·본문. `font-weight: 700`(라벨)~`900`(제목 강조), 표준 tracking. → 콘텐츠 가독.
시그니처 대비 = Index 역할의 넓은 tracking·tabular 서수 vs Label 역할의 조밀 tracking.
**layout**: 컨테이너 `max-width: 72rem`(유지). 그리드 3열→2열(≤900px)→1열(≤640px, 유지). 탭 = 단일 행 가로 스크롤 인덱스(§3). hero = space-between(유지).
**signature (1개)**: 편집 섹션 인덱스 탭 — 서수 + hue 섹션 rule + 로드 staggered reveal. 이 화면에서 기억에 남는 단 하나.
## 2. 카테고리 시각코딩 맵
원칙: **저채도 인쇄물 섹션 색**만 사용(무지개 회피). 전부 흙빛/탁색이라 크림+amber 와 harmonize. hue 는 **마커(dot)·섹션 rule·서수**에만 적용하고, 라벨 텍스트 자체는 `--text` 잉크 유지(대비 안전, concerns #3). "전체"는 색 없는 중립(브랜드 amber rule + 잉크 라벨) = 마스트헤드 자체.
| slug | 라벨 | 의미 | hue-light | hue-dark | 아이콘 처리 |
|---|---|---|---|---|---|
| `notice` | 공지 | 하우스 권위/공지 | `#B0741A` | `#E8A54B` | dot(원) — 골드, 브랜드 권위 |
| `devlog` | 개발일지 | 작업 노트/과정 | `#4C5A6E` | `#A9B8CC` | dot — 잉크 슬레이트, 연필 톤 |
| `showcase` | 쇼케이스 | 축하/스포트라이트 | `#BC5730` | `#E58A62` | dot — 테라코타 |
| `resources` | 자료·튜토리얼 | 차분한 레퍼런스 | `#5A7150` | `#93B187` | dot — 세이지/올리브 |
| `industry` | 업계 소식 | 외부 세계/뉴스 | `#3F5F8A` | `#8FA9CE` | dot — 더스티 블루 |
| (전체) | 전체 | 마스트헤드/브랜드 | `--accent` amber | `--accent` amber | 서수·dot 없음 |
- 아이콘은 **색 dot 하나로 통일**(카테고리별 이모지/일러스트 도입 안 함 — AI-slop·산만함 회피). dot = 6px 원, hue 채움.
- CSS 표현: 카테고리 hue 를 커스텀 프로퍼티로 정의하고 `[data-cat="slug"]` 속성 선택자로 dot/rule/서수 색을 물린다.
```
html { --cat-notice:#B0741A; --cat-devlog:#4C5A6E; --cat-showcase:#BC5730;
--cat-resources:#5A7150; --cat-industry:#3F5F8A; }
html[data-theme="dark"] { --cat-notice:#E8A54B; --cat-devlog:#A9B8CC; --cat-showcase:#E58A62;
--cat-resources:#93B187; --cat-industry:#8FA9CE; }
.posts-tab[data-cat="notice"].is-active { --hue: var(--cat-notice); }
...(5종)
```
`.is-active` 공통 규칙이 `var(--hue)` 로 rule/서수/라벨 강조를 그린다(라벨은 §3 참조: 활성 라벨은 hue 로 살짝 물들이되 최소 700 weight + 소형 아님이라 3:1 충족, 소형 서수도 UI 요소 3:1 기준).
- 대비 확보: light hue 는 크림(#faf8f5)에 대해 dot/rule(3:1 UI 기준) 충족. dark hue 는 #121212 대비 밝은 값으로 상향. notice light 만 소형 텍스트 4.5:1 미달이라 라벨 잉크 유지 규율 적용(concerns #3).
## 3. 탭 네비 재설계 스펙
**개념**: `<nav class="posts-tabs">` = 편집 섹션 인덱스(마스트헤드). 각 탭 = `[서수] 라벨` + 활성 하단 rule.
**마크업 구조 변경** (현재 :236~243):
```
<nav class="posts-tabs" aria-label="카테고리">
<a class="posts-tab <%= categoryId==null?"is-active":"" %>"
href="<%= ctx %>/posts"
<%= categoryId==null?"aria-current=\"page\"":"" %>>
<span class="posts-tab__label">전체</span>
</a>
<% int i=0; for (PostCategoryData cat : categories) { i++;
boolean on = categoryId!=null && categoryId.equals(cat.getId());
String tok = catToken(cat.getSlug()); %>
<a class="posts-tab <%= on?"is-active":"" %>"
<% if(!tok.isEmpty()){ %>data-cat="<%= tok %>"<% } %>
href="<%= ctx %>/posts?categoryId=<%= cat.getId() %>"
<%= on?"aria-current=\"page\"":"" %>>
<span class="posts-tab__ordinal" aria-hidden="true"><%= String.format("%02d", i) %></span>
<span class="posts-tab__label"><%= HtmlUtils.htmlEscape(cat.getName()==null?"":cat.getName()) %></span>
</a>
<% } %>
</nav>
```
- `catToken(slug)` = 화이트리스트 헬퍼(§7). data-cat 은 허용 5-slug 통과 값만 방출(XSS 안전).
- 서수 span 은 `aria-hidden="true"`(장식/편집 넘버링, 스크린리더 중복 방지). 라벨이 접근가능 이름.
- **anchor 유지**: `<nav>` + 링크. `role="tablist"` 등 ARIA 탭 위젯 시맨틱은 **도입하지 않음** — 실제로 페이지 전환 링크이므로 tab 위젯 대비 시맨틱 불일치를 야기함. `aria-current="page"` 로 현재 섹션 표시.
**시각 스펙**:
- inactive: 라벨 `--text-muted`, 서수 더 옅게(`--text-muted` + opacity .6), 배경 투명, 하단 rule 없음, 좌우 패딩 .1rem 세로 .5rem. (기존 pill 테두리/배경 제거 → 인덱스 텍스트만.)
- active(`.is-active`): 라벨 `var(--hue, var(--accent))` + weight 800, 서수 동 hue, **하단 2px rule**(`box-shadow: inset 0 -2px 0 var(--hue, var(--accent))` 또는 `border-bottom`) 노출. 전체 탭은 `--hue` 미정의 → `var(--accent)` 폴백(amber rule + 앰버 라벨). 라벨은 소형 아님(0.875rem, 700+) → 3:1 충족.
- hover(비활성): 라벨 `--text` 로 진해지고 rule 40% 프리뷰(`transition: .12s`).
- **focus-visible**: `.posts-tab:focus-visible { outline: 2px solid var(--hue, var(--accent)); outline-offset: 3px; border-radius: 6px; }` — 마우스 클릭엔 미표시, 키보드 탐색에만. bibimbap.css a:focus-visible 패턴과 정합(색만 hue 화).
**오버플로 처리 — 가로 스크롤 채택**:
- `.posts-tabs { display:flex; flex-wrap:nowrap; overflow-x:auto; scroll-snap-type:x proximity; gap:1.25rem; -webkit-overflow-scrolling:touch; scrollbar-width:none; }` + `.posts-tabs::-webkit-scrollbar{display:none}`.
- 각 탭 `scroll-snap-align:start; white-space:nowrap;`.
- 우측 스크롤 어포던스: 컨테이너에 우측 edge fade 마스크(`mask-image: linear-gradient(90deg,#000 85%,transparent)` 는 스크롤 끝 감지 없이 항상 적용되면 마지막 탭이 흐려짐 → 대신 `.posts-tabs` 부모 wrapper 에 `::after` 그라디언트 오버레이를 두되 `posts-tabs` 가 스크롤되면 자연 노출). 구현 단순화를 위해 wrapper `<div class="posts-tabs-scroll">` 로 감싸고 `::after` 로 우측 페이드.
- **wrap 대비 근거**: 마스트헤드/편집 인덱스 metaphor 는 "한 줄 목차"가 signature 의 핵심. wrap 시 2줄로 깨지면 섹션 rule 정렬이 흐트러지고 인덱스 질서가 사라진다. 가로 스크롤은 카테고리 N 증가에도 단일 행 signature 를 보존하고 모바일에서 스와이프 인덱스로 자연스럽다. 6개(전체+5)는 대부분 뷰포트에서 스크롤 미발생 → 데스크톱 손실 0, 모바일/확장 대비 이득.
**signature 모션(고임팩트 1곳)**: 로드 시 탭 인덱스 좌→우 staggered reveal.
```
@keyframes tabIn { from { opacity:0; transform: translateY(6px); } to { opacity:1; transform:none; } }
.posts-tab { animation: tabIn .38s ease both; }
.posts-tab:nth-child(1){animation-delay:.00s} ... :nth-child(6){animation-delay:.20s} /* +.04s 씩 */
@media (prefers-reduced-motion: reduce){ .posts-tab{ animation:none; } }
```
카드는 경쟁 방지 위해 모션 최소(집합 fade 없음 또는 0.2s 단일 fade). 고임팩트는 탭 한 곳으로 집중.
## 4. 카드 뱃지 재설계
**"액세서리 하나 빼기" = 채워진 amber pill 배경 제거**. 현재 `.post-card__category`(:154~165)는 `background: var(--accent-soft); color: var(--accent);` 채움 pill — 전 카드 동일색이라 정보 0·노이즈 1.
- **빼는 것**: 채워진 배경 pill(`background`, pill 형태, `min-height`/`border-radius`).
- **남기는 것**: 카테고리 라벨 텍스트(htmlEscape name).
- **더하는 것(순증 아님, pill 제거로 상쇄되는 미니멀 마커)**: 6px hue dot(카테고리 구분) + 대문자·tracking 라벨.
- 결과 마크업(:254~257):
```
<% String pTok = catToken(post.getCategorySlug());
if (post.getCategoryName()!=null && !post.getCategoryName().isBlank()) { %>
<span class="post-card__category" <% if(!pTok.isEmpty()){ %>data-cat="<%= pTok %>"<% } %>>
<span class="post-card__dot" aria-hidden="true"></span>
<%= HtmlUtils.htmlEscape(post.getCategoryName()) %>
</span>
<% } %>
```
- CSS:
```
.post-card__category { display:inline-flex; align-items:center; gap:.4rem; align-self:flex-start;
background:none; padding:0; color:var(--text-muted);
font-size:.68rem; font-weight:800; letter-spacing:.06em; text-transform:uppercase; }
.post-card__dot { width:6px; height:6px; border-radius:50%;
background: var(--cat-notice); /* 기본 폴백 amber 로 대체 */ }
.post-card__category[data-cat="notice"] .post-card__dot{ background:var(--cat-notice); }
... (5종). data-cat 없으면 dot 을 var(--accent) 폴백.
```
- 라벨 텍스트는 `--text-muted`(잉크 계열) 유지 → 대비 안전(concerns #3: hue 를 저대비 텍스트에 쓰지 않음). 색 구분은 dot 이 담당.
- 효과: 모든 카드가 앰버로 소리치던 노이즈 제거 → 조용한 카드 + dot 색으로 카테고리 식별. 카드 hover(:136~140)는 유지.
## 5. 빈상태 2종
posts-empty.jspf(단일) 를 **2개 프래그먼트로 split**. posts-list.jsp 의 `posts.isEmpty()` 분기에서 `categories.isEmpty()` 로 선택.
**split 방식/조건**:
```
<% if (posts.isEmpty()) {
if (categories.isEmpty()) { %>
<%@ include file="fragments/posts-empty-nocats.jspf" %>
<% } else {
String activeCategoryName = null;
if (categoryId != null) {
for (PostCategoryData c : categories) {
if (categoryId.equals(c.getId())) { activeCategoryName = c.getName(); break; }
}
} %>
<%@ include file="fragments/posts-empty-noposts.jspf" %>
<% }
} else { ... 그리드 ... } %>
```
- `activeCategoryName` 은 posts-list.jsp 페이지 스코프 변수 → include 되는 jspf 에서 그대로 참조 가능. htmlEscape 로 출력.
- 두 프래그먼트 모두 bibimbap.css `.empty-state / .btn.btn-primary / .empty-actions` 재사용(신규 CSS 0).
**(a) posts-empty-nocats.jspf — 카테고리 0개(운영자 미생성)**
- 사유: 아직 발행 섹션이 준비되지 않음.
- 인터페이스 목소리(편집 톤):
- `canWrite`(운영/스태프): h3 "발행 섹션을 먼저 만들어 주세요" / p "카테고리를 등록하면 이곳에 편집 섹션이 열립니다." / CTA `.btn.btn-primary` → 카테고리 관리 경로. (경로: PostAdminController 관할. 정확 URL 은 구현 시 admin 라우트 확인 — 존재 안 하면 CTA 생략하고 안내문만.)
- 소비자: h3 "곧 새 소식으로 찾아뵙겠습니다" / p "편집팀이 첫 섹션을 준비하고 있어요." / CTA 없음.
- SVG: 기존 크림+골드 문서 아이콘 재사용(프로젝트 언어 유지).
**(b) posts-empty-noposts.jspf — 글 0개(전체 또는 특정 카테고리)**
- 사유: 섹션은 있으나 아직 발행된 편이 없음.
- 목소리:
- `activeCategoryName != null`(특정 카테고리): h3 `"'{카테고리명}' 섹션의 첫 편을 준비 중입니다"` (htmlEscape) / p 는 아래 권한 분기.
- `activeCategoryName == null`(전체, categoryId null): h3 "아직 발행된 글이 없습니다".
- `canWrite`: p "이 섹션의 첫 편을 발행해 보세요." / CTA `.btn.btn-primary` "+ 새 글 발행" → `${ctx}/posts/new`.
- 소비자: p "편집팀의 첫 발행을 기다려 주세요." / CTA 없음.
- **톤 교정**: 기존 "커뮤니티의 첫 글을 남겨보세요"(peer-forum) → "발행"(편집 일방) 동사로 교체. 소비자에겐 write CTA 노출 안 함(모델 정합).
## 6. 반응형
기존 900/640 브레이크포인트 정합 유지 + 탭/뱃지 추가 규칙.
- **그리드**: 3열 → `≤900px` 2열 → `≤640px` 1열 (기존 :203~219 유지, 미변경).
- **탭 인덱스**: 모든 폭에서 단일 행 가로 스크롤(§3). 데스크톱 6탭 = 스크롤 없음. 모바일(≤640) 은 스와이프 스크롤 + 우측 edge fade 로 추가 카테고리 암시. 서수/라벨 크기 고정(모바일에서 축소 불필요, 이미 소형). `gap` 을 ≤640 에서 1rem 로 소폭 축소(탭 밀도).
- **hero**: `≤640px` 세로 스택 + 글쓰기 full-width(기존 :208~216 유지).
- **뱃지 dot**: 크기 폭 무관 6px 고정. 라벨 uppercase tracking 유지.
- **모션**: 가로 스크롤/스냅은 모바일 터치 친화. `prefers-reduced-motion: reduce` 는 로드 애니메이션만 무효화(스크롤/스냅은 사용자 제스처라 유지).
## 7. 정확한 변경 맵
**bibimbap.css 수정 여부: 안 함(0 라인).**
근거: (1) 기존 패턴 — posts-list.jsp 는 자체 인라인 `<style>` + 독립 토큰 네임스페이스(`--surface` 계열)로 완결되어 있고, bibimbap.css 는 전역 공유(홈/게임/약관/프로필 등)라 카테고리 hue 를 넣으면 전역 오염. (2) 빈상태 프래그먼트가 쓰는 `.empty-state/.btn/.empty-actions` 는 이미 bibimbap.css 에 존재 → 재사용만. (3) 신규 CSS 파일도 만들지 않음(인라인 완결이 기존 관례, HTTP 요청 추가 회피). 신규 파일이 불가피했다면 `src/main/webapp/css/` 에 두고 resources/static 금지였겠으나 불필요.
**posts-list.jsp `<style>` (30~221) 변경 셀렉터/블록**:
| 위치 | 현재 | 변경 |
|---|---|---|
| `html {}` (31~41) | 코어 토큰 | 뒤에 `--cat-*` 5개(light) 추가 |
| `html[data-theme="dark"]{}` (42~50) | 다크 토큰 | 뒤에 `--cat-*` 5개(dark) 추가 |
| `.posts-tabs` (96~101) | flex-wrap:wrap pill 컨테이너 | flex-nowrap 가로 스크롤 인덱스 + 스냅 + 스크롤바 숨김. wrapper `.posts-tabs-scroll::after` edge fade 추가 |
| `.posts-tab` (102~114) | pill(border/bg/radius) | 인덱스 항목(투명, 서수+라벨), `:focus-visible`, load `tabIn` 애니메이션 + `:nth-child` delay |
| `.posts-tab.is-active` (115~119) | amber pill fill | hue 라벨/서수 + 하단 2px rule, `[data-cat="x"].is-active{--hue:...}` 5종 |
| (신규) | — | `.posts-tab__ordinal`, `.posts-tab__label` |
| `.post-card__category` (154~165) | amber 채움 pill | 배경 제거, dot+대문자 라벨, `[data-cat]` dot 색 5종, `.post-card__dot` |
| (신규) | — | `@media (prefers-reduced-motion: reduce)` 블록 |
| `.posts-grid/.post-card*/.posts-more/.posts-empty/@media 900·640` | — | **미변경**(그리드/카드/더보기/브레이크포인트 보존) |
**posts-list.jsp 마크업/스크립틀릿 변경 라인**:
| 위치 | 변경 |
|---|---|
| 상단 스크립틀릿(9~22) | private 헬퍼 `catToken(String slug)` 추가(화이트리스트). `<%!` 선언 블록 |
| nav (236~243) | 탭 구조 재작성(서수 span + 라벨 span + data-cat + aria-current). §3 마크업 |
| 빈상태 include (245~246) | 단일 include → `categories.isEmpty()` 2분기 include + `activeCategoryName` resolve. §5 |
| 카드 뱃지 (254~257) | data-cat + dot + 라벨 구조. §4 마크업 |
| 더보기 (265~274) | **미변경**(moreUrl·cursor·categoryId 로직 보존) |
**catToken 헬퍼(시그니처 — 최소 인자)**:
```
<%!
// slug: 서버가 준 카테고리 slug. 화이트리스트 통과 시 data-cat 값으로 반환, 미허용/ null 시 "" 반환(CSS 미주입).
private String catToken(String slug) {
if (slug == null) return "";
switch (slug) {
case "notice": case "devlog": case "showcase": case "resources": case "industry":
return slug;
default: return "";
}
}
%>
```
인자 1개(slug), 반환값 즉시 사용 — inflate 없음. XSS: 반환은 5개 고정 리터럴 중 하나 또는 ""; 임의 slug 가 CSS/속성에 들어가지 않음.
**프래그먼트 split**:
- `fragments/posts-empty.jspf` → 삭제(또는 미사용화). 대체:
- 신규 `fragments/posts-empty-nocats.jspf` (a)
- 신규 `fragments/posts-empty-noposts.jspf` (b)
- 두 파일 모두 `canWrite` 페이지 변수 + (b는 `activeCategoryName`) 참조, bibimbap.css 클래스 재사용, htmlEscape 출력.
## 8. brief 대비 자가비평
- **AI-slop 체크**: 통과. 퍼플 그라디언트/Inter·Space Grotesk 교체/브로드시트 세리프 없음. 크림+amber 고유 언어 유지. 신규 색은 저채도 인쇄물 섹션 팔레트(잉크/테라코타/세이지/더스티블루)로 context-specific — generic 아님. 폰트 교체 없이 서수·tracking 대비로 signature 확보(제약 정합).
- **signature 가 대담함을 정당화하나**: 예. 대담함을 탭 인덱스 한 곳에 집중(masthead + 편집 서수 + hue rule + 로드 stagger). 서수는 sort_order 라는 실제 편집 우선순위가 근거(임의 넘버링 아님). 나머지(카드/뱃지/빈상태)는 절제 — 뱃지는 오히려 pill 을 빼서 조용하게. "기억에 남는 하나" 원칙 충족.
- **기존 언어와 일관되나**: 예. 인라인 토큰 네임스페이스 유지, amber accent 보존, bibimbap.css 미변경, 빈상태 SVG 재사용. 단 폰트가 사이트(Pretendard) vs posts(system-ui) 불일치는 **기존 현상태**이며 제약상 유지(concerns #1) — 신규 도입 불일치 아님.
- **접근성(대비·focus·aria)**: focus-visible 링 추가(결손 해소), aria-current="page" 추가(결손 해소), 서수 aria-hidden(중복 방지), 탭 라벨이 접근가능 이름. 대비: hue 를 저대비 소형 텍스트에 쓰지 않고 dot/rule/UI 요소(3:1)에 국한, 라벨은 잉크 유지 → WCAG 준수. **미흡점**: (1) 가로 스크롤 어포던스가 저시력 사용자에게 약함(concerns #2, edge fade 로 완화). (2) notice light hue 소형 4.5:1 미달을 라벨 잉크 유지로 우회 — 완전 해소가 아니라 회피이므로 hue 를 라벨에 직접 쓰는 구현 실수를 검증 AC 로 차단(§검증). 그 외 결정적 미흡 없음.
---
## 검증 포인트 (verification-advisor 점검용)
정식화 self-audit 반영: 카테고리 집합은 제품 확정 5개로 **시간 안정**(설계~검증 사이 불변). 표현 견고성은 리터럴 단일 grep 대신 열거·정규식·두 집합 동수 불변식 사용.
- **AC-1 (카테고리 hue 집합 전수 5 — 불변식)**: posts-list.jsp 의 `--cat-*` 고유 토큰명 수 == 5.
`grep -oE '\-\-cat-[a-z]+' src/main/webapp/WEB-INF/views/posts-list.jsp | sort -u | wc -l` == 5.
(light/dark 중복 방출돼도 sort -u 로 고유명 5 검증 → 추가·삭제 동시 커버.)
- **AC-2 (화이트리스트 ↔ hue 두 집합 동수 불변식)**: `catToken` switch 의 case 라벨 수 == AC-1 고유 hue 수 == 5.
`grep -c 'case "' `(catToken 블록 범위 내) == 5. 발산 시 신규/삭제 카테고리 누락 검출.
- **AC-3 (탭 서수 편집순 정합)**: 탭 서수는 `listActive()` 반복 순(=sort_order ASC)으로 `%02d` 방출 — 수동: 렌더 HTML 에서 서수 01,02,... 가 카테고리 sort_order 순과 일치. (grep 불가, 육안/DOM 판정.)
- **AC-4 (focus-visible 존재)**: `grep -c ':focus-visible' posts-list.jsp` >= 1 (`.posts-tab:focus-visible`).
- **AC-5 (aria-current 존재)**: `grep -c 'aria-current="page"' posts-list.jsp` >= 1, 활성 탭에만 조건부 방출(수동: 비활성 탭에 미부착).
- **AC-6 (reduced-motion 존중)**: `grep -c 'prefers-reduced-motion' posts-list.jsp` >= 1, 해당 블록이 `.posts-tab` 로드 애니메이션 무효화.
- **AC-7 (빈상태 2 프래그먼트 존재)**: `fragments/posts-empty-nocats.jspf` 와 `fragments/posts-empty-noposts.jspf` 둘 다 존재(ls/glob 매치 2건). posts-list.jsp 에 두 include 모두 참조(`grep -c 'posts-empty-.*\.jspf' posts-list.jsp` == 2).
- **AC-8 (편집 톤 교정 — 앵커/의미 판정)**: (b) 프래그먼트에 "발행" 동사 존재, 소비자 분기에 write CTA(`/posts/new` 링크) 부재. 리터럴 단일 grep 대신 의미 판정: peer-forum 문구("첫 글을 남겨") 잔존 0 + 소비자(!canWrite) 경로에 `.btn-primary` href `/posts/new` 없음(수동 코드 리뷰).
- **AC-9 (뱃지 pill 제거 — 노이즈 감소)**: `.post-card__category` 규칙에 `background: none`(또는 배경 미지정) + `.post-card__dot` 존재. 채워진 `--accent-soft` pill 배경 잔존 0(수동/grep `background: var(--accent-soft)` 가 `.post-card__category` 블록에 없음).
- **AC-10 (기능 로직 불변 — 회귀 가드)**: keyset 더보기 URL 조립(cursorCreatedAt/cursorId/categoryId) 라인 미변경. `git diff` 에서 265~274 로직 동일. 컨트롤러/매퍼/PostData·PostCategoryData `git diff` 공백.
- **AC-11 (bibimbap.css 미변경 불변식)**: `git diff --stat src/main/webapp/css/bibimbap.css` 공백(0 라인). 신규 CSS 파일 `src/main/webapp/css/` 외 자원(resources/static) 추가 0.
- **AC-12 (XSS — slug 원시 미주입)**: data-cat 방출은 `catToken` 반환값만 사용(원시 `getSlug()`/`getCategorySlug()` 직접 속성 방출 0). `grep` 로 `data-cat="<%= .*getSlug` 또는 `getCategorySlug` 직접 방출 부재 확인. 카테고리명 출력은 전부 `HtmlUtils.htmlEscape` 경유(육안: name/activeCategoryName 출력 지점 escape).

View File

@ -0,0 +1,106 @@
---
phase: verification
agent: verification-advisor
agent_version: 1
generated_at: 2026-07-24T07:51:09Z
concerns:
- "L1 BUILD FAILURE — 원인은 src/test/java/.../PostControllerTest.java 와 PostController.list 시그니처 불일치(test-compile 단계). 이번 세션 git diff/status 에 src/main/java, src/test/java 파일 변경 0건(둘 다 HEAD 상태, PostController.java 최종 수정 커밋 02a1b75) — 이번 posts-categories 작업(JSP+SQL seed only) 이전에 이미 존재하던 베이스라인 컴파일 브레이크로 판단됨. 즉 회귀 0 기대값 전제(Java 소스 0파일 변경) 자체는 grep으로 확인되었으나, 저장소가 이미 RED 상태였음."
- "L2 skipped: 이 세션 전략 레지스트리에 posts-list.jsp 도메인 전용 live-contract 전략(worker 포함 통합 verify 스크립트)이 등록돼 있지 않음 — L1(mvn test)과 grep 기반 정적 AC만 실행 가능. seed SQL(db/migrations/20260724-post-categories-seed.sql) 미적용 여부 확인은 DB 연결 계약 전략 부재로 L1 판정 범위 밖."
- "AC 모호: 없음 — 정적 AC 9개 전부 grep 명령이 명시돼 실행 가능했음."
concerns_checked: true
---
# 검증 결과
## Acceptance Criteria (입력 받은 그대로 인용)
### L1 (필수 — 회귀 0)
`./mvnw -o test` 실행. `-o`(offline) 가 의존성 미캐시로 실패하면 `./mvnw test` 재시도.
판정: BUILD SUCCESS, `Tests run: N, Failures: 0, Errors: 0`. 실패 시 실패 테스트명·메시지 원문 인용.
컨텍스트: 이번 변경은 JSP(표현층) + SQL seed 마이그레이션(미적용 DML)만이며 Java 소스 0파일 변경이라 회귀 0 이 기대값. GREEN 아니면 원인 규명.
주의: JSP 런타임 컴파일 에러는 mvn test 로 탐지 안 됨 → needs_user_verification.
### 정적 AC (grep, posts-list.jsp)
AC-1(`--cat-*` 5개 고유) / AC-2(catToken switch case 5개 고유) / AC-4(`:focus-visible` >=1) / AC-5(`aria-current` >=1) / AC-6(`prefers-reduced-motion` >=1) / AC-7(신구 fragment 존재/부재 + include 2회) / AC-9(`.post-card__category` background 없음) / AC-11(bibimbap.css diff 0, static/ 신규 css 없음) / AC-12(data-cat 은 catToken 반환값만, 카테고리명은 htmlEscape 경유)
### 코드리뷰 AC (의미 판정)
AC-8(빈상태 문구 원칙: (b) "발행" 동사 + 소비자경로 CTA 부재 + peer-forum 문구 잔존 0, (a) 동일 원칙) / AC-10(더보기 URL 조립 라인 미변경 + src/main/java 무변경)
### 런타임 AC (grep 불가 — needs_user_verification)
AC-3(탭 서수 sort_order 일치) / JSP 런타임 컴파일 성공 / 시각 확인(탭 다수·필터·빈상태 2종·모바일·포커스링)
## 실행된 전략
레지스트리(`docs/development/verification-strategies.md`)에 이 프로젝트 전용 통합 `verify-all` 스크립트가 등록돼 있지 않아(§39 "권장" 단계, 미도입), L1(`./mvnw -o test`)과 AC 명시 grep 명령을 개별 실행했다.
| id | cmd | exit | severity | 결과 |
|---|---|---|---|---|
| L1-test | `./mvnw -o test` (JAVA_HOME=homebrew openjdk@21 수동 설정 후 실행 — 기본 PATH 에 java 없어 환경 보정) | 1 | blocker | **FAIL** — test-compile 단계 COMPILATION ERROR |
| static-grep (AC-1,2,4,5,6,7,9,11,12) | 각 AC 원문 `grep`/`ls`/`git diff --stat` 명령 | 0 (전부) | blocker(집합전수 AC) | pass 9/9 |
| codereview (AC-8,10) | `cat` fragments + `git diff` 대조 | - | blocker | pass 2/2 |
| 단계 | 결과 |
|---|---|
| L1 typecheck+compile (test-compile) | **FAIL** — 3 errors |
| L1 unit+regression | 미실행 (test-compile 실패로 테스트 자체가 0건 수행됨, `Tests run:` 라인 없음) |
| L2 contract | skip (전략 미등록/미구축 — 레지스트리 L37 "L2 harness 미구축" open item과 일치) |
| 로그 스캔 | n/a (verify-all 스크립트 부재로 통합 로그 스캔 단계 없음) |
## 실패 상세
### L1 (test-compile)
- 실패 지점:
`src/test/java/com/pandoli365/bibimbap/controller/PostControllerTest.java:[208,33]`
`src/test/java/com/pandoli365/bibimbap/controller/PostControllerTest.java:[227,19]`
`src/test/java/com/pandoli365/bibimbap/controller/PostControllerTest.java:[245,33]`
메시지 원문:
```
[ERROR] method list in class com.pandoli365.bibimbap.controller.PostController cannot be applied to given types;
required: java.lang.Long,java.lang.String,java.lang.Long,jakarta.servlet.http.HttpSession,org.springframework.ui.Model
found: <nulltype>,<nulltype>,<nulltype>,org.springframework.ui.Model
reason: actual and formal argument lists differ in length
[INFO] 3 errors
[INFO] BUILD FAILURE
```
- 재현: `./mvnw -o test` (또는 `./mvnw -o -Dtest=PostControllerTest test-compile`)
- 범위 확인 근거(구현 코드 내용은 열람하지 않고 git 메타데이터로만 확인):
- `git status --short -- 'src/main/java/**' 'src/test/java/**'` → 출력 없음 (이번 세션 미변경, 둘 다 HEAD 상태)
- `git diff --stat -- src/main/java/com/pandoli365/bibimbap/controller/PostController.java src/test/java/com/pandoli365/bibimbap/controller/PostControllerTest.java` → 출력 없음
- `git log --oneline -3 -- .../PostController.java` 최상단 = `02a1b75`(feat/v2 현재 tip, 이번 posts-categories 작업 직전 커밋)
- → 이 컴파일 브레이크는 이번 세션의 JSP/SQL 변경으로 유발된 것이 아니라 **이미 커밋된 베이스라인 상태**다.
## 종합 판정
overall: **fail** (L1 blocker FAIL — BUILD FAILURE, 테스트 0건 수행)
rollback_signal: **none** (이번 세션은 Java 소스를 전혀 변경하지 않았고 파괴적 조작도 없었음. 실패 원인은 세션 진입 이전부터 존재하던 베이스라인 test-compile 브레이크로, 이번 diff 되돌리기와 무관. orchestrator 판단: 이번 posts-categories 변경분에 대한 rollback 필요성 없음 — 단, 저장소 자체가 `./mvnw test` RED 상태임은 별도 이슈로 인지 필요)
## Acceptance 매칭
| criterion | 매칭 전략 | 판정 |
|---|---|---|
| L1 (BUILD SUCCESS + 회귀0) | `./mvnw -o test` | **FAIL** — BUILD FAILURE(test-compile), 베이스라인 기존 브레이크(세션 diff 무관, 근거 상단) |
| AC-1 (`--cat-*` 5개 고유) | `grep -oE -- '--cat-[a-z]+' posts-list.jsp \| sort -u \| wc -l` | pass (5: devlog/industry/notice/resources/showcase) |
| AC-2 (catToken switch 5개 고유 case) | `grep -n 'case "' posts-list.jsp` | pass (`case "notice": case "devlog": case "showcase": case "resources": case "industry":`, 1줄에 5개) |
| AC-4 (`:focus-visible` >=1) | `grep -c` | pass (1) |
| AC-5 (`aria-current` >=1) | `grep -c` | pass (2) |
| AC-6 (`prefers-reduced-motion` >=1) | `grep -c` | pass (1) |
| AC-7 (fragment 신구 존재/부재 + include 2회) | `ls` + `grep -c` + git status | pass — `posts-empty-nocats.jspf`/`posts-empty-noposts.jspf` 존재, 구 `posts-empty.jspf` 는 git status `D`(삭제 스테이지 전, 워킹트리에도 부재 확인), include 참조 정확히 2건(라인 386, 395) |
| AC-9 (`.post-card__category` background 없음) | grep + 블록 육안 대조(260~271행) | pass — `background: none`, `var(--accent-soft)` 미검출 |
| AC-11 (bibimbap.css 무변경, static/ 신규 css 없음) | `git diff --stat` + `git status` | pass — 둘 다 빈 출력(static/ 디렉터리 자체가 미존재) |
| AC-12 (data-cat = catToken 반환값만, 카테고리명 htmlEscape) | grep `data-cat`/`getSlug()`/`getCategorySlug()`/`htmlEscape` | pass — `data-cat` 은 `catTok`/`pCatTok`(catToken() 반환) 만 사용, `getSlug()`/`getCategorySlug()` 는 catToken() 인자로만 등장(라인 373, 405), 카테고리명 출력 2곳(라인 378, 409) 전부 `HtmlUtils.htmlEscape` 경유, `activeCategoryName` 도 fragment 내 `htmlEscape` 경유 |
| AC-8 (빈상태 문구 원칙) | fragments 전문 대조 | pass — (b) canWrite="발행"동사+CTA(`/posts/new`), !canWrite="편집팀의 첫 발행을 기다려 주세요"(CTA 없음); (a) canWrite=CTA(관리 링크), !canWrite=텍스트만(CTA 없음); "첫 글을 남겨" 잔존 0건 |
| AC-10 (더보기 URL 조립 미변경 + java 무변경) | `git diff` 라인 대조 + `git diff --stat src/main/java/` | pass — moreUrl/cursorCreatedAt/cursorId/categoryId 조립 블록(라인 420~424) diff에 미출현, src/main/java 전체 diff 빈 출력 |
| AC-3 (탭 서수-sort_order 일치) | — | needs_user_verification (grep 불가, listActive() 정렬 실화면 대조 필요) |
| JSP 런타임 컴파일 성공 | — | needs_user_verification (Tomcat 런타임 컴파일 — mvn test 로 미탐지, 앱 기동+curl 필요) |
| 시각(탭 다수/필터/빈상태2종/모바일/포커스링) | — | needs_user_verification (브라우저 육안 확인 필요) |
## 요약
- **L1**: FAIL — `PostControllerTest.java` ↔ `PostController.list` 시그니처 불일치로 test-compile 단계에서 BUILD FAILURE, 3 errors, 테스트 0건 실행(`Tests run:` 라인 자체가 없음). 세션 diff 는 Java 파일을 전혀 건드리지 않았으므로(git status/log 로 확인) 이는 이번 posts-categories 변경이 유발한 회귀가 아니라 **베이스라인에 이미 존재하던 컴파일 브레이크**로 보임. 다만 AC 요구사항인 "BUILD SUCCESS" 는 충족되지 않았으므로 L1 항목 자체는 FAIL 로 판정.
- **정적 AC 집계**: 9/9 pass (AC-1, 2, 4, 5, 6, 7, 9, 11, 12)
- **코드리뷰 AC 집계**: 2/2 pass (AC-8, 10)
- **needs_user_verification**: AC-3(탭 서수 정렬), JSP 런타임 컴파일(앱 기동 스모크), 시각 확인 4항목(탭 다수 렌더/탭 클릭 필터/빈상태 2종/모바일 폭/키보드 포커스 링) — 이 프로젝트 특성상(JSP 런타임 컴파일 + Tomcat) grep/mvn test 로 커버 불가, 별도 런타임 스모크·브라우저 확인 의무.

View File

@ -0,0 +1,40 @@
---
phase: documentation
agent: documentation-advisor
agent_version: 1
generated_at: 2026-07-24T10:40:00+09:00
concerns: []
concerns_checked: true
---
# 문서화 보고
## 작성/수정된 문서
| 경로 | 카테고리 | 유형 | 링크 추가한 index | 교차 링크 |
|---|---|---|---|---|
| `docs/changes/2026-07-24-post-categories-seed-list-redesign.md` | changes | 신규 | `docs/changes/index.md` 에 한 줄 추가 | 관련 문서 4개(W3-3 원설계, 2026-06-30 visual-redesign, frontend-redesign-coverage-checklist, document-category-classification) |
| `docs/changes/index.md` | changes | 기존 갱신 | — (index 자신) | — |
| `docs/development/frontend-redesign-coverage-checklist.md` | development | 기존 갱신(스코프 정합 확인 후 append) | 해당 없음(신규 문서 아님) | `posts-list.jsp` 행 근거 열에 새 문서로의 링크 추가 |
| `docs/changes/2026-06-30-visual-redesign-bibimbap-css.md` | changes | 기존 갱신(스코프 정합 확인 후 append) | 해당 없음(신규 문서 아님) | "관련 문서" 절에 새 문서로의 후속 링크 추가(단위2 fragment 대체 사실 명시) |
## 카테고리 판별 근거
`document-category-classification.md` "빠른 결정 순서" 적용: 아키텍처 원칙에 대한 되돌리기 어려운 결정이 아니고(카테고리 세트·시드 위치는 제품 taxonomy 확정일 뿐 레이어/기술 선택 아님), 운영 장애가 아니고, 실제 코드(`posts-list.jsp`, 신규 fragment 2개, `PostControllerTest.java`)와 소비 데이터(`post_categories` DML 시드)가 실제로 바뀌어 런타임 동작이 달라졌다 → `changes/`.
ADR 후보 여부 재검토: "편집형 일방 발행 모델" 정정은 이미 `POST_WRITE` 권한 게이트로 W3-3 설계 당시 확정된 기존 전제의 재확인이며 이번 세션이 새로 뒤집은 아키텍처 결정이 아니다(세션 내부 orchestrator 가정 오류의 정정일 뿐, 코드/스키마 차원의 기존 결정 변경 아님) → 신규 ADR 불필요로 판단.
## 기존 파일 append 전 스코프 대조 (수행 근거)
- `docs/development/frontend-redesign-coverage-checklist.md`: 첫 단락 스코프 선언 "`WEB-INF/views/*.jsp` 전체... 클로드 디자인 리디자인의 '마크업·클래스 이식' 단위 반영 여부를 추적" + 사용 규칙 "세션 종료 시: 이번 세션에서 다룬 파일의 상태 열을 갱신하고, 다룬 근거 커밋/문서 링크를 채운다" — 이번 세션이 `posts-list.jsp` 를 다뤘고 근거 열 갱신은 선언된 스코프 내 정규 사용법이므로 append 적합 판정.
- `docs/changes/2026-06-30-visual-redesign-bibimbap-css.md`: 첫 단락 스코프는 "9단위 비주얼 리디자인 changelog" 고정 스냅샷. 본문 서술은 수정하지 않고 "관련 문서" 절(이미 선행 작업 링크 1건 존재하는 인덱스성 절)에 후속 링크 1줄만 추가 — 선례(`2026-06-18-w3-2-comments-reviews.md` 가 `2026-06-22` 고도화 문서로 "해소" 링크를 사후 추가한 패턴)와 동형. 이월 항목이 아닌 완료 유닛(단위2)이 사후에 대체됐다는 사실 포인터이므로 스코프 위반 아님으로 판정.
## 의사결정 기록 위치
- D1(카테고리 세트)/D2(시드 위치)/D3(모델 정정): `.atp/work-session/20260724-100414/report.md` `# Decisions` 섹션(원본 소스), `docs/changes/2026-07-24-post-categories-seed-list-redesign.md` "결정" 절에 요약 이관.
- 설계 상세(토큰계획·카테고리 hue 맵·탭 마크업·AC 12개 근거): `.atp/work-session/20260724-100414/artifacts/design-posts-categories.md` (design-advisor 산출, 원본 유지 — 이번 문서화 단계에서 복제하지 않고 링크만 인용).
- 검증 상세(L1 FAIL→복구 경위, AC 매칭 표): `.atp/work-session/20260724-100414/artifacts/verification-posts-categories.md`.
## 추후 문서화가 필요한 항목
- 모바일 좁은 폭 육안 확인, 라이트 테마 육안 확인, 카드 뱃지 dot 실물 확인, 운영 스키마 시드 반영(운영자) — 4건 모두 needs_user_verification 으로 `changes/2026-07-24-post-categories-seed-list-redesign.md` 에 이미 명시. 완료 시 해당 문서에 결과 append 필요(신규 문서 불요, 기존 문서 갱신).
- graph-refresh `partial-stale` open item(근본원인 선행 커밋 `02a1b75`, JSP/JSPF graphify 스캔범위 밖) — 별도 graph 부채로 이월됨. graphify-update-advisor 소관이라 이번 문서화 단계에서 손대지 않음.

View File

@ -0,0 +1,205 @@
---
schema_version: 2
sid: 20260724-100414
started_at: 2026-07-24T10:04:14+09:00
ended_at: 2026-07-24T17:24:31+09:00
branch: feat/v2
user_request: |
포스트 보드 카테고리 정비 + 목록 카테고리별 뷰 디자인 재설계.
A. 기본 카테고리 세트 확정(4~6) + 멱등 시드(위치 택1: seed-dev / migrations / 없음).
B. posts-list.jsp 탭/뱃지/빈상태 디자인 재설계(frontend-design). 기능 로직 불변, 표현층만.
제약: JSP escape 유지, CSRF, MyBatis #{}, static은 webapp/css·js, textContent 우선.
검증: L1 회귀 0, /posts 실화면(탭 다수/필터/빈상태/모바일/키보드).
---
# Summary
포스트 보드(편집형 일방 발행) 기본 카테고리 5종(Unity 5-mirror)을 멱등 운영 마이그레이션으로 시드하고,
목록 카테고리별 뷰 표현층을 frontend-design 규율로 재설계했다. signature = "편집 마스트헤드 인덱스" 탭
(서수 01~05 + 카테고리 hue 밑줄 rule + 가로스크롤 + focus-visible + aria-current), 카드 뱃지는 amber pill
제거 후 hue dot화, 빈상태 2종 split(편집 톤·소비자 CTA 미노출). 기능 로직 불변. 착수 시 orchestrator의
peer-forum 가정이 사용자 정정으로 뒤집혀(일방 발행) 카테고리 축을 편집 taxonomy로 재설계(plan-gate 1회).
검증: L1 362 GREEN(베이스라인 스테일 테스트 최소수정으로 복구), 정적 AC 9/9, 실화면 전건(탭/필터/빈상태/
서수/hue/focus/컴파일). dev DB 시드 적용 완료.
# Invocations
- agent: design-advisor
model: opus (large)
model_choice: { rationale: 'signature 창의 판단 코어 — 토큰계획+마스트헤드 인덱스 설계' }
outcome: '8절 설계도 확정(오픈질문 0). artifacts/design-posts-categories.md'
- agent: verification-advisor
model: sonnet (medium)
model_choice: { rationale: 'L1 실행+AC 판정 기계적' }
outcome: 'L1 초기 FAIL(베이스라인 스테일 감지) + 정적 AC 9/9. 회귀 아님 판정'
- agent: graph-refresh-checker
model: haiku (small)
model_choice: { rationale: 'staleness 판정 경량' }
outcome: 'partial-stale(근본원인 선재 02a1b75, 이 세션 JSP/DML graph 범위 밖)'
- agent: documentation-advisor
model: sonnet (medium)
model_choice: { rationale: '문서 카테고리 판별+작성' }
outcome: 'docs/changes/2026-07-24-post-categories-seed-list-redesign.md + index/coverage 링크'
# Advisor Invocation Decision Log
# 각 advisor 호출/스킵 판단 즉시 1줄 append
- advisor: requirements-advisor
decision: skip
rationale: '요구 명확. 오픈 결정 2개(카테고리 세트·시드 위치)만 orchestrator AskUserQuestion 직접 해소'
checked_at: 2026-07-24T10:05:00+09:00
- advisor: graphify-lookup-advisor
decision: skip
rationale: '배경 file:line 사실을 live 코드로 직접 전수 재검증 완료(그래프보다 authoritative). 사실탐색 목적 lookup 불요'
checked_at: 2026-07-24T10:05:00+09:00
- advisor: research-advisor
decision: skip
rationale: '드리프트 우려 사실 전건 재확인 통과. seed 멱등 패턴·JSP CSS 언어 파악 완료. 외부조사 불요'
checked_at: 2026-07-24T10:05:00+09:00
- advisor: design-advisor (frontend-design)
decision: call
rationale: '작업 B(탭/뱃지/빈상태 재설계)는 토큰계획+signature 요구. frontend-design 원칙 적용 설계도 필요'
checked_at: 2026-07-24T10:05:00+09:00
# Decisions
- id: D1
decision: '카테고리 세트 = Unity 5-mirror 편집 taxonomy'
detail: '공지/개발일지/쇼케이스/자료·튜토리얼/업계 소식. slug=notice,devlog,showcase,resources,industry (sort_order 1..5). is_active=true'
by: user (AskUserQuestion)
- id: D2
decision: '시드 위치 = db/migrations/ 운영 반영'
detail: '멱등 INSERT(ON CONFLICT/WHERE NOT EXISTS). 프로덕션 런칭 시 기본 탭 제공. 운영자 이후 CRUD 가능'
by: user (AskUserQuestion)
- id: D3
decision: '포스트 보드 모델 = 편집형 일방 발행(Unity 블로그). peer-to-peer 아님'
detail: 'POST_WRITE 권한게이트 근거. 카테고리는 편집 taxonomy, 상호작용축(피드백/자유) 배제'
by: user (정정)
# verified_by_me
- 'L1: unit+regression — 컨테이너 `mvn -o -P dev test` → Tests run: 362, Failures: 0, Errors: 0, BUILD SUCCESS. (베이스라인 RED[PostControllerTest 스테일] 최소수정으로 복구: list() 3콜사이트 null 1개 추가)'
- '정적 AC 9/9 pass: AC-1(--cat-* 5) AC-2(catToken case 5) AC-4(:focus-visible) AC-5(aria-current) AC-6(prefers-reduced-motion) AC-7(빈상태 2 fragment) AC-9(뱃지 pill 제거) AC-11(bibimbap.css 불변) AC-12(원시 slug 무주입). 코드리뷰 AC-8/AC-10 pass.'
- '실화면(localhost:8080/posts, dev DB 시드 5건 적용후): 탭 6개 마스트헤드 인덱스 렌더(서수 01~05=sort_order순, AC-3) / 탭클릭 필터(?categoryId=2 → is-active+aria-current 개발일지 이동) / 빈상태 noposts 편집톤(활성 카테고리명 + 소비자 CTA없음) / 카테고리 활성 hue rule / focus-visible amber ring / JSP 런타임 컴파일 200. 스크린샷 자가비평 완료.'
- 'L2(seed DML contract): dev.post_categories 5행 slug/sort_order/is_active 정합 확인(psql SELECT).'
# needs_user_verification
- '모바일 폭 픽셀 시각확인: 반응형 CSS(탭 nowrap 가로스크롤+edge fade, 900/640 그리드 브레이크포인트)는 정적 검증됨. 브라우저 resize_window 가 스크린샷 뷰포트에 미반영(툴 한계)이라 실기기/좁은 폭 육안 1회 권장.'
- '라이트 테마 시각: 다크 테마만 스크린샷 확인. 라이트 hue 토큰은 코드 존재(대비 규율 준수), 육안 확인 시 라이트 모드 토글 1회.'
- '카드 뱃지 dot 시각: 현재 게시글 0건이라 카드 미표시. 글 1건 발행 후 dot+라벨 육안 확인(선택).'
- '운영 반영: db/migrations/20260724-post-categories-seed.sql 은 dev DB 에만 적용됨. 운영 스키마 반영은 운영자가 동일 psql 명령으로 수행(파일 헤더 참조).'
# graph_refresh
verdict: partial-stale
handled: 'flag-only(open_item)'
rationale: |
체커 판정 partial-stale 이나 근본 원인은 선재 커밋 02a1b75(PostController HttpSession+canWrite,
이 세션 이전)로 graph frontmatter source_commit(6154826) 미갱신 상태. 이 세션 변경은
JSP/JSPF(graph 스캔 범위 밖 — c2daee8 등재 한계) + DML seed + test 시그니처 정합뿐이라
graph 노드 0 추가. 무관한 선재 부채의 full 재생성은 본 기능 태스크 스코프 밖 + graph 산출물
다수 gitignore. open_items 에 선재 graph 부채로 명시, 강제 재생성 안 함.
# user_signals
positive:
- quote: '카테고리 세트/시드위치/시그니처방향/베이스라인fix/실화면검증 전부 Recommended 옵션 1샷 수락'
note: 'AskUserQuestion Recommended 선택이 반복 수락됨 — framing+근거 제시가 사용자 판단과 정합. 특히 signature 방향(마스트헤드 인덱스) 대안 2개 제시에도 Recommended 채택'
negative:
- quote: '포스트는 제작자끼리 주고받는거 아니야. 일방적으로 소비하도록 만드는 개념'
structural: true
note: 'orchestrator 초기 가정(peer-to-peer 커뮤니티 보드) 오류. 실제=편집형 일방 발행(Unity 블로그 모델). POST_WRITE 권한게이트가 근거. §2.7 plan-gate 발동 → 카테고리 축 재설계(상호작용축 제거, 편집 taxonomy 채택)'
# assumption_reversals
- at: 2026-07-24T10:12:00+09:00
old: '포스트 보드 = 제작자 peer-to-peer 커뮤니티 → 피드백요청/자유 등 상호작용 카테고리'
new: '포스트 보드 = 편집형 일방 발행(Unity 블로그 모델) → 공지/개발일지/쇼케이스/자료/업계 등 편집 taxonomy'
trigger: '사용자 정정'
# lessons_applied (docs-first, memory 미설정 → docs 단독)
- '#1 도메인/상호작용 모델 접지 → docs/development/workflow-patterns.md 신규 섹션 추가(수용)'
- '#2 기존 컨트롤러 시그니처 변경 full test 의무 → docs/development/verification-strategies.md 스코프 확장 클로즈(수용)'
- '#3 JSP no-reload 트러블슈팅 → 스킵. local-dev-setup.md + workflow-patterns.md:72 에 이미 상세 문서화됨. content 갭 아닌 소비 갭이라 신규 doc 불필요.'
- 'protocol_feedback 2건(§9 무관 baseline RED 처리 절차·ad hoc 커밋 graph staleness 감지)은 atp 번들 대상 — 이 프로젝트 파일 밖이라 report 기록만.'
# open_items
- '선재 graph 부채: docs/graph frontmatter source_commit(6154826) 이 02a1b75(PostController HttpSession/canWrite) 미반영. 별도 세션에서 `/graphify src/ docs/` full 재생성 + 메타 갱신 권장. (이 세션 변경은 graph 스캔 범위 밖이라 무기여)'
- '이전 세션 잔여: .atp/work-session/20260724-095414/ (untracked, 09:54 별도 /atp 세션 산출물, 이 작업단위 아님). 커밋 미포함 — 소유 세션이 정리/커밋할 대상.'
- 'db/migrations/20260724-post-categories-seed.sql 운영 스키마 반영 미수행(dev DB 만 적용). 운영자 psql 실행 필요.'
# Retrospective
signals:
positive:
- quote_or_paraphrase: '카테고리 세트/시드위치/시그니처방향/베이스라인fix/실화면검증 전부 Recommended 옵션 1샷 수락'
about: 'AskUserQuestion Recommended 프레이밍(근거 명시) — signature 대안 2개 제시에도 Recommended(마스트헤드 인덱스) 채택. 이미 여러 이전 세션(20260701-113509 등)에서 검증된 패턴의 재확인이라 신규 교훈 후보로는 채택하지 않음(기존 workflow-patterns.md 패턴과 중복).'
negative:
- quote_or_paraphrase: '포스트는 제작자끼리 주고받는거 아니야. 일방적으로 소비하도록 만드는 개념'
about: 'orchestrator 초기 가정(peer-to-peer 커뮤니티 보드) 오류 정정. 실제=편집형 일방 발행. §2.7 plan-gate 발동 → AskUserQuestion 3회 왕복 재설계.'
structural: true
what_went_well:
- '§2.7 plan-gate 가 사용자 정정 시점에 정확히 발동 — 카테고리 축(피드백요청/자유 등 상호작용축)을 즉시 폐기하고 편집 taxonomy 로 재설계. 잘못된 방향으로 구현까지 진행되지 않고 design 단계에서 저지.'
- 'verification-advisor 가 베이스라인 RED(PostControllerTest 스테일)를 이 세션 변경(JSP+DML)과 명확히 분리 판정(git status/log 메타데이터 근거) — rollback 오판 없이 최소수정으로 복구.'
- 'AskUserQuestion Recommended-옵션 프레이밍이 카테고리/시드/시그니처/베이스라인fix/실화면검증 5개 결정 전부 1라운드 수렴.'
- 'design-advisor 가 정적 grep 실행 가능한 "집합 전수 AC"(hue 5종·catToken case 5종 등 동수 불변식)로 검증 포인트를 작성해 verification-advisor 가 9/9 기계적 판정 가능 — 프론트엔드 표현층임에도 애매한 육안판정 의존을 최소화.'
what_to_improve:
- '착수 시 도메인/상호작용 모델을 가정하기 전에 관련 permission enum(`PermissionKeys.java`)과 `docs/work-log/index.md` 의 기존 골자문서를 먼저 확인했어야 함 — POST_WRITE 게이트와 `docs/work-log/2026-06-17-w3-feature-skeletons.md`(“포스터 권한자만 작성, 일반 유저 읽기만(댓글 없음)”)에 이미 편집형 일방 발행 모델이 W3-3 설계 시점(2026-06-23)에 확정돼 있었다. documentation-advisor 도 이 사실을 근거로 “세션이 새로 뒤집은 결정이 아니라 orchestrator 가정 오류의 재확인”이라 판정함 — 즉 이번 정정은 사용자만 알 수 있는 신규 정보가 아니라 docs-first 로 조기 포착 가능했다.'
- '02a1b75(선재 커밋, PostController 시그니처에 categoryId/HttpSession 추가)가 PostControllerTest 콜사이트 3곳을 갱신하지 않은 채 커밋돼 저장소가 test-compile RED 상태로 방치됨 — 이번 무관 세션의 verification-advisor 가 우연히 잡아냈다. verification-strategies.md 의 “신규 컨트롤러/매퍼 의존 변경 시 full test 의무” 조항은 문구상 “신규” 컨트롤러 추가만 명시해 기존 컨트롤러의 시그니처 변경 커밋에는 명확히 적용되지 않는 스코프 공백이 있다.'
- '(런처 제공 컨텍스트) JSP 화면 미반영 증상 트러블슈팅 시 work-dir/target 직접 조작을 먼저 시도 — `docs/development/local-dev-setup.md` 에 동일 함정과 해법(재시작/`docker compose restart app`)이 이미 상세히 문서화돼 있음에도 소비되지 않음. `workflow-patterns.md` 자체에도 “known pitfall 교차인용 누락” 유사사례(세션 20260701-100731)가 이미 기록돼 있어, 문서 존재와 실제 소비 사이 갭이 반복되는 정황.'
- '선재 커밋 02a1b75(PostController.java, graph 스캔 범위 내)가 그래프 재생성을 트리거하지 않고 넘어가 partial-stale 이 누적 — ad hoc(비-ATP) 커밋 경로에는 graph-refresh-checker 가 개입하지 않아, 다음 ATP 세션이 우연히 발견할 때까지 부채가 조용히 쌓이는 구조.'
memory_candidates:
- name: domain-model-grounding-before-ui-taxonomy-assumption
type: feedback
description: '기능의 상호작용/도메인 모델을 가정하기 전 permission enum + 기존 work-log 골자문서로 이미 확정된 모델을 먼저 확인한다.'
body_draft: |
Why: PostController 가 POST_WRITE 권한게이트를 이미 구현 중이었고, docs/work-log/2026-06-17-w3-feature-skeletons.md
에 "포스터 권한자만 작성, 일반 유저 읽기만(댓글 없음)"이 W3-3 설계 시점(2026-06-23)에 이미 명문화돼 있었다.
그럼에도 orchestrator 가 "포스트 보드=P2P 커뮤니티"로 가정하고 카테고리 축(피드백요청/자유 등)까지 설계
진입 직전까지 진행했다가 사용자 정정으로 plan-gate 발동 → AskUserQuestion 3회 왕복 재설계가 발생했다.
How to apply: 신규 기능(특히 이미 부분 구현된 기능)의 UI/카테고리 설계에 들어가기 전,
(1) 관련 permission key(`PermissionKeys.java` 등)를 grep 해 "누가 쓰고 누가 읽는가"를 코드 사실로 먼저 확정하고,
(2) `docs/work-log/index.md` 에서 해당 기능명으로 이미 존재하는 골자/설계 문서를 열람해 상호작용 모델이
이미 결정돼 있는지 확인한다. 두 단계를 거치면 착수 시점에 가정 오류를 차단할 수 있다.
(`freeze/동결 분류는 근거 문서 확인 선행` 패턴의 도메인모델 버전.)
rationale_for_saving: '재현 가능(신규 세션마다 "이미 결정된 도메인모델을 재설계 직전까지 못 보고 진행" 패턴 반복 가능). 코드/git log 만으로 유도 불가 — 관찰 기반 교훈.'
signal_source: negative
docs_sync_target: docs/development/workflow-patterns.md
memory_optional: true
- name: existing-controller-signature-change-requires-test-before-commit
type: feedback
description: '기존 컨트롤러 메서드 시그니처 변경(파라미터 추가 등) 커밋 전 최소 `mvn -o test-compile` 실행 의무 — "신규 컨트롤러" 조항의 스코프 공백 보완.'
body_draft: |
Why: 02a1b75(PostController 에 categoryId/HttpSession 파라미터 추가)가 PostControllerTest 3개 콜사이트를
갱신하지 않은 채 커밋됐고, 다음 세션(20260724-100414) verification 단계에서야 test-compile BUILD FAILURE 로
발견됐다(무관한 JSP 작업 세션의 verification-advisor 가 우연히 포착). verification-strategies.md 의 기존
규칙("신규 컨트롤러/매퍼 의존 변경 시 full test 의무")은 문구상 "신규" 컨트롤러 추가에 한정돼 기존 컨트롤러의
시그니처 변경에는 적용 여부가 애매했다.
How to apply: 기존 컨트롤러 public 메서드의 파라미터를 추가/제거/순서변경하면, 다른 스코프(JSP 등) 작업이어도
커밋 전 `./mvnw -o test-compile`(최소) 을 실행해 그 컨트롤러의 테스트 파일이 시그니처와 정합한지 확인한다.
/atp:task 세션 여부와 무관하게(CLAUDE.md 상 비-메인스트림 브랜치 즉흥 커밋도 표준 승인) 동일 적용.
rationale_for_saving: '재현 가능한 패턴(시그니처 변경 시 테스트 콜사이트 누락). 기존 규칙 문구가 "신규"로 한정돼 스코프 공백이 문서 정독만으로 드러나지 않음(실제 발생으로 관찰됨).'
signal_source: observation
docs_sync_target: docs/development/verification-strategies.md
memory_optional: true
- name: jsp-noreload-troubleshoot-check-docs-before-workdir-manipulation
type: feedback
description: 'JSP 화면 미반영 증상 시 target/work-dir 직접 조작 전에 local-dev-setup.md 재시작 절차부터 확인 — 이미 문서화된 함정의 재발.'
body_draft: |
Why: docs/development/local-dev-setup.md 에 "JSP 변경도 재기동으로 확실히 반영"·"저장 즉시 반영 안 되는
사례 확인됨 → curl 로 대조, docker compose restart app 으로 강제확인"이 이미 상세히 명시돼 있다.
workflow-patterns.md 에도 유사 계열(known pitfall 교차인용 누락, 세션 20260701-100731)이 이미 기록돼
있음에도, 문서 소비 없이 work-dir/target 직접 조작을 먼저 시도하는 패턴이 반복된 정황이 있다.
How to apply: JSP/컨트롤러 편집 후 "저장했는데 화면이 안 바뀐다" 증상을 만나면, work-dir/target 파일을
직접 조작하기 전에 반드시 `docs/development/local-dev-setup.md` "코드·JSP 변경 후 반드시 앱 재빌드·재시작"
섹션을 먼저 열람하고 거기 명시된 재시작 절차(IDE: Stop→rebuild→Run / docker: restart app)를 1차 시도로
삼는다.
rationale_for_saving: '문서는 이미 존재하나 소비되지 않아 재발 — "문서 존재"와 "문서 소비" 사이 갭이 구조적. 재현 가능성 높음(트러블슈팅 시 직관적으로 파일 조작을 먼저 시도하는 경향).'
signal_source: observation
docs_sync_target: docs/development/local-dev-setup.md
memory_optional: true
protocol_feedback:
- 'ad hoc(비-/atp:task) 커밋이 graph 스캔범위(src/main/java 등) 파일을 변경해도 graph-refresh-checker 가 개입할 경로가 없어, staleness 가 조용히 누적되다가 무관한 다음 ATP 세션이 우연히 발견하는 구조다(이번 세션: 02a1b75 가 원인, 이 세션의 checker 가 우연히 partial-stale 포착). 프로토콜 차원에서 "비-ATP 직접 커밋도 graph 스캔범위 변경 시 최소 staleness 플래그를 남기는" 경량 장치(예: 커밋 트레일러 관례, 또는 CLAUDE.md 작업원칙에 1줄 추가) 검토 권고.'
- '§9 종료조건의 "L1 통합검증 통과"가 이번처럼 "이 세션과 무관한 베이스라인 RED"를 만났을 때의 표준 처리 절차(최소수정 즉시 복구 vs open_item 만 남기고 진행 가능 여부)가 명문화돼 있지 않다. 이번엔 verification-advisor 의 grounded 판단(git log/status 메타데이터로 무관 확정)으로 안전하게 최소수정 복구했으나, 이 판단 절차 자체(무관 확정 방법 + 최소수정 허용 범위)를 프로토콜에 명시하면 재현성이 높아진다.'
applied_changes: []

View File

@ -0,0 +1,146 @@
[
{
"viewport": 1440,
"path": "/",
"status": 200,
"title": "bibimbap",
"horizontal_overflow": false,
"js_errors": [],
"failed_responses": []
},
{
"viewport": 1440,
"path": "/posts",
"status": 200,
"title": "포스팅 | bibimbap",
"horizontal_overflow": false,
"js_errors": [],
"failed_responses": []
},
{
"viewport": 1440,
"path": "/recruit",
"status": 200,
"title": "팀원 모집 | bibimbap",
"horizontal_overflow": false,
"js_errors": [],
"failed_responses": []
},
{
"viewport": 1440,
"path": "/jams",
"status": 200,
"title": "게임잼 | bibimbap",
"horizontal_overflow": false,
"js_errors": [],
"failed_responses": []
},
{
"viewport": 1440,
"path": "/login",
"status": 200,
"title": "로그인 | bibimbap",
"horizontal_overflow": false,
"js_errors": [],
"failed_responses": []
},
{
"viewport": 1440,
"path": "/signup",
"status": 200,
"title": "회원가입 | bibimbap",
"horizontal_overflow": false,
"js_errors": [],
"failed_responses": []
},
{
"viewport": 1440,
"path": "/terms",
"status": 200,
"title": "이용약관 - bibimbap",
"horizontal_overflow": false,
"js_errors": [],
"failed_responses": []
},
{
"viewport": 1440,
"path": "/operation-policy",
"status": 200,
"title": "운영정책 - bibimbap",
"horizontal_overflow": false,
"js_errors": [],
"failed_responses": []
},
{
"viewport": 390,
"path": "/",
"status": 200,
"title": "bibimbap",
"horizontal_overflow": false,
"js_errors": [],
"failed_responses": []
},
{
"viewport": 390,
"path": "/posts",
"status": 200,
"title": "포스팅 | bibimbap",
"horizontal_overflow": false,
"js_errors": [],
"failed_responses": []
},
{
"viewport": 390,
"path": "/recruit",
"status": 200,
"title": "팀원 모집 | bibimbap",
"horizontal_overflow": false,
"js_errors": [],
"failed_responses": []
},
{
"viewport": 390,
"path": "/jams",
"status": 200,
"title": "게임잼 | bibimbap",
"horizontal_overflow": false,
"js_errors": [],
"failed_responses": []
},
{
"viewport": 390,
"path": "/login",
"status": 200,
"title": "로그인 | bibimbap",
"horizontal_overflow": false,
"js_errors": [],
"failed_responses": []
},
{
"viewport": 390,
"path": "/signup",
"status": 200,
"title": "회원가입 | bibimbap",
"horizontal_overflow": false,
"js_errors": [],
"failed_responses": []
},
{
"viewport": 390,
"path": "/terms",
"status": 200,
"title": "이용약관 - bibimbap",
"horizontal_overflow": false,
"js_errors": [],
"failed_responses": []
},
{
"viewport": 390,
"path": "/operation-policy",
"status": 200,
"title": "운영정책 - bibimbap",
"horizontal_overflow": false,
"js_errors": [],
"failed_responses": []
}
]

View File

@ -0,0 +1,455 @@
[INFO] Scanning for projects...
[INFO]
[INFO] ----------------------< com.pandoli365:bibimbap >-----------------------
[INFO] Building bibimbap 0.0.1-SNAPSHOT
[INFO] from pom.xml
[INFO] --------------------------------[ war ]---------------------------------
[INFO]
[INFO] --- resources:3.3.1:resources (default-resources) @ bibimbap ---
[INFO] Copying 1 resource from src/main/resources to target/classes
[INFO] Copying 2 resources from src/main/resources to target/classes
[INFO]
[INFO] --- compiler:3.14.1:compile (default-compile) @ bibimbap ---
[INFO] Recompiling the module because of changed source code.
[INFO] Compiling 121 source files with javac [debug release 21] to target/classes
[INFO]
[INFO] --- resources:3.3.1:testResources (default-testResources) @ bibimbap ---
[INFO] skip non existing resourceDirectory /tmp/bibimbap-readiness-20260922/src/test/resources
[INFO]
[INFO] --- compiler:3.14.1:testCompile (default-testCompile) @ bibimbap ---
[INFO] Recompiling the module because of changed dependency.
[INFO] Compiling 32 source files with javac [debug release 21] to target/test-classes
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[61,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[61,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[61,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[61,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[61,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[65,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[65,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[65,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[65,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[65,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[68,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[68,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[68,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[68,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[68,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[71,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[71,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[71,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[71,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[71,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[74,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[74,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[74,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[74,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[74,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[77,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[77,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[77,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[77,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[77,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[80,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[80,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[80,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[80,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[80,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[83,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[83,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[83,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[83,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[83,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[86,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[86,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[86,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[86,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[86,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[89,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[89,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[89,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[89,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[89,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[92,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[92,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[92,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[92,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[92,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[95,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[95,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[95,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[95,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[95,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[98,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[98,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[98,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[98,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[98,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[101,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[101,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[101,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[101,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[101,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[104,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[104,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[104,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[104,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[104,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[107,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[107,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[107,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[107,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[107,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[110,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[110,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[110,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[110,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[110,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[113,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[113,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[113,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[113,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[113,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[116,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[116,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[116,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[116,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[116,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[119,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[119,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[119,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[119,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[119,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[INFO] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/controller/api/GameLikeControllerTest.java: /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/controller/api/GameLikeControllerTest.java uses or overrides a deprecated API.
[INFO] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/controller/api/GameLikeControllerTest.java: Recompile with -Xlint:deprecation for details.
[INFO] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java: /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java has additional uses or overrides of a deprecated API that is marked for removal.
[INFO]
[INFO] --- surefire:3.5.5:test (default-test) @ bibimbap ---
[INFO] Using auto detected provider org.apache.maven.surefire.junitplatform.JUnitPlatformProvider
[INFO]
[INFO] -------------------------------------------------------
[INFO] T E S T S
[INFO] -------------------------------------------------------
[INFO] Running com.pandoli365.bibimbap.BibimbapApplicationTests
02:41:31.807 [main] INFO org.springframework.test.context.support.AnnotationConfigContextLoaderUtils -- Could not detect default configuration classes for test class [com.pandoli365.bibimbap.BibimbapApplicationTests]: BibimbapApplicationTests does not declare any static, non-private, non-final, nested classes annotated with @Configuration.
02:41:31.866 [main] INFO org.springframework.boot.test.context.SpringBootTestContextBootstrapper -- Found @SpringBootConfiguration com.pandoli365.bibimbap.BibimbapApplication for test class com.pandoli365.bibimbap.BibimbapApplicationTests
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v3.5.16)
2026-09-22T02:41:32.025Z INFO 206 --- [bibimbap] [ main] c.p.bibimbap.BibimbapApplicationTests : Starting BibimbapApplicationTests using Java 21.0.11 with PID 206 (started by root in /tmp/bibimbap-readiness-20260922)
2026-09-22T02:41:32.026Z INFO 206 --- [bibimbap] [ main] c.p.bibimbap.BibimbapApplicationTests : The following 1 profile is active: "dev"
Mockito is currently self-attaching to enable the inline-mock-maker. This will no longer work in future releases of the JDK. Please add Mockito as an agent to your build as described in Mockito's documentation: https://javadoc.io/doc/org.mockito/mockito-core/latest/org.mockito/org/mockito/Mockito.html#0.3
OpenJDK 64-Bit Server VM warning: Sharing is only supported for boot loader classes because bootstrap classpath has been appended
WARNING: A Java agent has been loaded dynamically (/root/.m2/repository/net/bytebuddy/byte-buddy-agent/1.17.8/byte-buddy-agent-1.17.8.jar)
WARNING: If a serviceability tool is in use, please run with -XX:+EnableDynamicAgentLoading to hide this warning
WARNING: If a serviceability tool is not in use, please run with -Djdk.instrument.traceUsage for more information
WARNING: Dynamic loading of agents will be disallowed by default in a future release
2026-09-22T02:41:33.341Z INFO 206 --- [bibimbap] [ main] o.s.b.a.w.s.WelcomePageHandlerMapping : Adding welcome page template: index
2026-09-22T02:41:33.407Z WARN 206 --- [bibimbap] [ main] o.s.w.s.resource.ResourceHandlerUtils : Appended trailing slash to static resource location: file:///app/uploads/game/profile/
2026-09-22T02:41:33.460Z INFO 206 --- [bibimbap] [ main] c.p.bibimbap.BibimbapApplicationTests : Started BibimbapApplicationTests in 1.546 seconds (process running for 2.035)
2026-09-22T02:41:33.464Z INFO 206 --- [bibimbap] [ main] c.p.b.config.PermissionCatalogVerifier : [RBAC] 권한 카탈로그 시드 완료: 4 키
2026-09-22T02:41:33.465Z INFO 206 --- [bibimbap] [ main] c.p.bibimbap.config.BadgeCatalogSeeder : [BADGE] 배지 카탈로그 시드 완료: 2 종
[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 1.743 s -- in com.pandoli365.bibimbap.BibimbapApplicationTests
[INFO] Running com.pandoli365.bibimbap.controller.WebMvcControllerTest
[INFO] Tests run: 11, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.077 s -- in com.pandoli365.bibimbap.controller.WebMvcControllerTest
[INFO] Running com.pandoli365.bibimbap.controller.TagControllerTest
[INFO] Tests run: 19, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.023 s -- in com.pandoli365.bibimbap.controller.TagControllerTest
[INFO] Running com.pandoli365.bibimbap.controller.AdminConsoleControllerTest
[INFO] Tests run: 13, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.014 s -- in com.pandoli365.bibimbap.controller.AdminConsoleControllerTest
[INFO] Running com.pandoli365.bibimbap.controller.SearchControllerTest
[INFO] Tests run: 12, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.010 s -- in com.pandoli365.bibimbap.controller.SearchControllerTest
[INFO] Running com.pandoli365.bibimbap.controller.JamAwardControllerTest
[INFO] Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.008 s -- in com.pandoli365.bibimbap.controller.JamAwardControllerTest
[INFO] Running com.pandoli365.bibimbap.controller.JamScoringControllerTest
[INFO] Tests run: 19, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.021 s -- in com.pandoli365.bibimbap.controller.JamScoringControllerTest
[INFO] Running com.pandoli365.bibimbap.controller.PostControllerTest
[INFO] Tests run: 10, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.011 s -- in com.pandoli365.bibimbap.controller.PostControllerTest
[INFO] Running com.pandoli365.bibimbap.controller.JamControllerTest
[INFO] Tests run: 14, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.015 s -- in com.pandoli365.bibimbap.controller.JamControllerTest
[INFO] Running com.pandoli365.bibimbap.controller.JamAdminControllerTest
[INFO] Tests run: 10, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.027 s -- in com.pandoli365.bibimbap.controller.JamAdminControllerTest
[INFO] Running com.pandoli365.bibimbap.controller.JamVoteControllerTest
[INFO] Tests run: 23, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.013 s -- in com.pandoli365.bibimbap.controller.JamVoteControllerTest
[INFO] Running com.pandoli365.bibimbap.controller.JamJudgeAdminControllerTest
[INFO] Tests run: 14, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.014 s -- in com.pandoli365.bibimbap.controller.JamJudgeAdminControllerTest
[INFO] Running com.pandoli365.bibimbap.controller.api.GameLikeControllerTest
[INFO] Tests run: 8, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.017 s -- in com.pandoli365.bibimbap.controller.api.GameLikeControllerTest
[INFO] Running com.pandoli365.bibimbap.controller.api.UserControllerCsrfTest
[INFO] Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.283 s -- in com.pandoli365.bibimbap.controller.api.UserControllerCsrfTest
[INFO] Running com.pandoli365.bibimbap.controller.api.GameUploadControllerSecurityTest
2026-09-22T02:41:34.050Z INFO 206 --- [bibimbap] [ main] c.p.b.c.api.GameUploadController : WebGL zip upload request received. fileName=build.zip, size=701, contentType=application/zip
2026-09-22T02:41:34.053Z INFO 206 --- [bibimbap] [ main] c.p.b.c.api.GameUploadController : WebGL zip upload completed. gameUuid=2b520de2-3dc1-46d6-a932-67aed5056a4d, webglPath=/game/2b520de2-3dc1-46d6-a932-67aed5056a4d/index.html, entryCount=5, extractedBytes=56
2026-09-22T02:41:34.054Z INFO 206 --- [bibimbap] [ main] c.p.b.c.api.GameUploadController : WebGL zip upload request received. fileName=build.zip, size=701, contentType=application/zip
2026-09-22T02:41:34.055Z INFO 206 --- [bibimbap] [ main] c.p.b.c.api.GameUploadController : WebGL zip upload request received. fileName=build.txt, size=701, contentType=text/plain
2026-09-22T02:41:34.056Z INFO 206 --- [bibimbap] [ main] c.p.b.c.api.GameUploadController : WebGL zip upload request received. fileName=build.zip, size=701, contentType=application/zip
2026-09-22T02:41:34.058Z INFO 206 --- [bibimbap] [ main] c.p.b.c.api.GameUploadController : WebGL zip upload request received. fileName=build.zip, size=537919488, contentType=application/zip
2026-09-22T02:41:34.059Z INFO 206 --- [bibimbap] [ main] c.p.b.c.api.GameUploadController : WebGL zip upload request received. fileName=build.zip, size=701, contentType=application/zip
2026-09-22T02:41:34.060Z INFO 206 --- [bibimbap] [ main] c.p.b.c.api.GameUploadController : WebGL zip upload completed. gameUuid=cf77c6c7-139d-49ab-9c2d-41143613c3fd, webglPath=/game/cf77c6c7-139d-49ab-9c2d-41143613c3fd/index.html, entryCount=5, extractedBytes=56
2026-09-22T02:41:34.061Z INFO 206 --- [bibimbap] [ main] c.p.b.c.api.GameUploadController : WebGL zip upload request received. fileName=build.zip, size=9, contentType=application/zip
2026-09-22T02:41:34.062Z INFO 206 --- [bibimbap] [ main] c.p.b.c.api.GameUploadController : WebGL zip upload request received. fileName=build.zip, size=701, contentType=application/zip
[INFO] Tests run: 11, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.027 s -- in com.pandoli365.bibimbap.controller.api.GameUploadControllerSecurityTest
[INFO] Running com.pandoli365.bibimbap.controller.api.GameCommentControllerTest
[INFO] Tests run: 18, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.011 s -- in com.pandoli365.bibimbap.controller.api.GameCommentControllerTest
[INFO] Running com.pandoli365.bibimbap.controller.api.GameReviewControllerTest
2026-09-22T02:41:34.082Z WARN 206 --- [bibimbap] [ main] c.p.b.c.api.GameReviewController : [BADGE] 리뷰 평판 훅 실패 userId=7 reviewId=50
java.lang.RuntimeException: boom
at com.pandoli365.bibimbap.badge.ReputationService.record(ReputationService.java:22) ~[classes/:na]
at com.pandoli365.bibimbap.controller.api.GameReviewController.createReview(GameReviewController.java:222) ~[classes/:na]
at com.pandoli365.bibimbap.controller.api.GameReviewControllerTest.createReview(GameReviewControllerTest.java:525) ~[test-classes/:na]
at com.pandoli365.bibimbap.controller.api.GameReviewControllerTest.createReviewSucceedsEvenWhenReputationHookThrows(GameReviewControllerTest.java:447) ~[test-classes/:na]
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) ~[na:na]
at java.base/java.lang.reflect.Method.invoke(Method.java:580) ~[na:na]
at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:775) ~[junit-platform-commons-1.12.2.jar:1.12.2]
at org.junit.platform.commons.support.ReflectionSupport.invokeMethod(ReflectionSupport.java:479) ~[junit-platform-commons-1.12.2.jar:1.12.2]
at org.junit.jupiter.engine.execution.MethodInvocation.proceed(MethodInvocation.java:60) ~[junit-jupiter-engine-5.12.2.jar:5.12.2]
at org.junit.jupiter.engine.execution.InvocationInterceptorChain$ValidatingInvocation.proceed(InvocationInterceptorChain.java:131) ~[junit-jupiter-engine-5.12.2.jar:5.12.2]
at org.junit.jupiter.engine.extension.TimeoutExtension.intercept(TimeoutExtension.java:161) ~[junit-jupiter-engine-5.12.2.jar:5.12.2]
at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestableMethod(TimeoutExtension.java:152) ~[junit-jupiter-engine-5.12.2.jar:5.12.2]
at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestMethod(TimeoutExtension.java:91) ~[junit-jupiter-engine-5.12.2.jar:5.12.2]
at org.junit.jupiter.engine.execution.InterceptingExecutableInvoker$ReflectiveInterceptorCall.lambda$ofVoidMethod$0(InterceptingExecutableInvoker.java:112) ~[junit-jupiter-engine-5.12.2.jar:5.12.2]
at org.junit.jupiter.engine.execution.InterceptingExecutableInvoker.lambda$invoke$0(InterceptingExecutableInvoker.java:94) ~[junit-jupiter-engine-5.12.2.jar:5.12.2]
at org.junit.jupiter.engine.execution.InvocationInterceptorChain$InterceptedInvocation.proceed(InvocationInterceptorChain.java:106) ~[junit-jupiter-engine-5.12.2.jar:5.12.2]
at org.junit.jupiter.engine.execution.InvocationInterceptorChain.proceed(InvocationInterceptorChain.java:64) ~[junit-jupiter-engine-5.12.2.jar:5.12.2]
at org.junit.jupiter.engine.execution.InvocationInterceptorChain.chainAndInvoke(InvocationInterceptorChain.java:45) ~[junit-jupiter-engine-5.12.2.jar:5.12.2]
at org.junit.jupiter.engine.execution.InvocationInterceptorChain.invoke(InvocationInterceptorChain.java:37) ~[junit-jupiter-engine-5.12.2.jar:5.12.2]
at org.junit.jupiter.engine.execution.InterceptingExecutableInvoker.invoke(InterceptingExecutableInvoker.java:93) ~[junit-jupiter-engine-5.12.2.jar:5.12.2]
at org.junit.jupiter.engine.execution.InterceptingExecutableInvoker.invoke(InterceptingExecutableInvoker.java:87) ~[junit-jupiter-engine-5.12.2.jar:5.12.2]
at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$7(TestMethodTestDescriptor.java:216) ~[junit-jupiter-engine-5.12.2.jar:5.12.2]
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.12.2.jar:1.12.2]
at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:212) ~[junit-jupiter-engine-5.12.2.jar:5.12.2]
at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:137) ~[junit-jupiter-engine-5.12.2.jar:5.12.2]
at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:69) ~[junit-jupiter-engine-5.12.2.jar:5.12.2]
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:156) ~[junit-platform-engine-1.12.2.jar:1.12.2]
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.12.2.jar:1.12.2]
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:146) ~[junit-platform-engine-1.12.2.jar:1.12.2]
at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) ~[junit-platform-engine-1.12.2.jar:1.12.2]
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:144) ~[junit-platform-engine-1.12.2.jar:1.12.2]
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.12.2.jar:1.12.2]
at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:143) ~[junit-platform-engine-1.12.2.jar:1.12.2]
at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:100) ~[junit-platform-engine-1.12.2.jar:1.12.2]
at java.base/java.util.ArrayList.forEach(ArrayList.java:1596) ~[na:na]
at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41) ~[junit-platform-engine-1.12.2.jar:1.12.2]
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:160) ~[junit-platform-engine-1.12.2.jar:1.12.2]
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.12.2.jar:1.12.2]
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:146) ~[junit-platform-engine-1.12.2.jar:1.12.2]
at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) ~[junit-platform-engine-1.12.2.jar:1.12.2]
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:144) ~[junit-platform-engine-1.12.2.jar:1.12.2]
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.12.2.jar:1.12.2]
at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:143) ~[junit-platform-engine-1.12.2.jar:1.12.2]
at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:100) ~[junit-platform-engine-1.12.2.jar:1.12.2]
at java.base/java.util.ArrayList.forEach(ArrayList.java:1596) ~[na:na]
at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41) ~[junit-platform-engine-1.12.2.jar:1.12.2]
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:160) ~[junit-platform-engine-1.12.2.jar:1.12.2]
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.12.2.jar:1.12.2]
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:146) ~[junit-platform-engine-1.12.2.jar:1.12.2]
at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) ~[junit-platform-engine-1.12.2.jar:1.12.2]
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:144) ~[junit-platform-engine-1.12.2.jar:1.12.2]
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.12.2.jar:1.12.2]
at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:143) ~[junit-platform-engine-1.12.2.jar:1.12.2]
at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:100) ~[junit-platform-engine-1.12.2.jar:1.12.2]
at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:35) ~[junit-platform-engine-1.12.2.jar:1.12.2]
at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57) ~[junit-platform-engine-1.12.2.jar:1.12.2]
at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:54) ~[junit-platform-engine-1.12.2.jar:1.12.2]
at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:201) ~[junit-platform-launcher-1.12.2.jar:1.12.2]
at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:170) ~[junit-platform-launcher-1.12.2.jar:1.12.2]
at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:94) ~[junit-platform-launcher-1.12.2.jar:1.12.2]
at org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:59) ~[junit-platform-launcher-1.12.2.jar:1.12.2]
at org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:142) ~[junit-platform-launcher-1.12.2.jar:1.12.2]
at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:58) ~[junit-platform-launcher-1.12.2.jar:1.12.2]
at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:103) ~[junit-platform-launcher-1.12.2.jar:1.12.2]
at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:85) ~[junit-platform-launcher-1.12.2.jar:1.12.2]
at org.junit.platform.launcher.core.DelegatingLauncher.execute(DelegatingLauncher.java:47) ~[junit-platform-launcher-1.12.2.jar:1.12.2]
at org.junit.platform.launcher.core.InterceptingLauncher.lambda$execute$1(InterceptingLauncher.java:39) ~[junit-platform-launcher-1.12.2.jar:1.12.2]
at org.junit.platform.launcher.core.ClasspathAlignmentCheckingLauncherInterceptor.intercept(ClasspathAlignmentCheckingLauncherInterceptor.java:25) ~[junit-platform-launcher-1.12.2.jar:1.12.2]
at org.junit.platform.launcher.core.InterceptingLauncher.execute(InterceptingLauncher.java:38) ~[junit-platform-launcher-1.12.2.jar:1.12.2]
at org.junit.platform.launcher.core.DelegatingLauncher.execute(DelegatingLauncher.java:47) ~[junit-platform-launcher-1.12.2.jar:1.12.2]
at org.apache.maven.surefire.junitplatform.LauncherAdapter.executeWithoutCancellationToken(LauncherAdapter.java:60) ~[surefire-junit-platform-3.5.5.jar:3.5.5]
at org.apache.maven.surefire.junitplatform.LauncherAdapter.execute(LauncherAdapter.java:52) ~[surefire-junit-platform-3.5.5.jar:3.5.5]
at org.apache.maven.surefire.junitplatform.JUnitPlatformProvider.execute(JUnitPlatformProvider.java:203) ~[surefire-junit-platform-3.5.5.jar:3.5.5]
at org.apache.maven.surefire.junitplatform.JUnitPlatformProvider.invokeAllTests(JUnitPlatformProvider.java:168) ~[surefire-junit-platform-3.5.5.jar:3.5.5]
at org.apache.maven.surefire.junitplatform.JUnitPlatformProvider.invoke(JUnitPlatformProvider.java:136) ~[surefire-junit-platform-3.5.5.jar:3.5.5]
at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:385) ~[surefire-booter-3.5.5.jar:3.5.5]
at org.apache.maven.surefire.booter.ForkedBooter.execute(ForkedBooter.java:162) ~[surefire-booter-3.5.5.jar:3.5.5]
at org.apache.maven.surefire.booter.ForkedBooter.run(ForkedBooter.java:507) ~[surefire-booter-3.5.5.jar:3.5.5]
at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:495) ~[surefire-booter-3.5.5.jar:3.5.5]
[INFO] Tests run: 24, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.020 s -- in com.pandoli365.bibimbap.controller.api.GameReviewControllerTest
[INFO] Running com.pandoli365.bibimbap.controller.JamAwardAdminControllerTest
[INFO] Tests run: 7, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.016 s -- in com.pandoli365.bibimbap.controller.JamAwardAdminControllerTest
[INFO] Running com.pandoli365.bibimbap.controller.BadgeManageControllerTest
[INFO] Tests run: 14, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.007 s -- in com.pandoli365.bibimbap.controller.BadgeManageControllerTest
[INFO] Running com.pandoli365.bibimbap.util.TagSanitizerTest
[INFO] Tests run: 16, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.004 s -- in com.pandoli365.bibimbap.util.TagSanitizerTest
[INFO] Running com.pandoli365.bibimbap.jam.JamLifecycleTest
[INFO] Tests run: 8, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.008 s -- in com.pandoli365.bibimbap.jam.JamLifecycleTest
[INFO] Running com.pandoli365.bibimbap.jam.JamAwardServiceTest
[INFO] Tests run: 7, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.012 s -- in com.pandoli365.bibimbap.jam.JamAwardServiceTest
[INFO] Running com.pandoli365.bibimbap.jam.JamEvalWindowTest
[INFO] Tests run: 10, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.002 s -- in com.pandoli365.bibimbap.jam.JamEvalWindowTest
[INFO] Running com.pandoli365.bibimbap.service.PostMarkdownServiceTest
[INFO] Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.034 s -- in com.pandoli365.bibimbap.service.PostMarkdownServiceTest
[INFO] Running com.pandoli365.bibimbap.service.FeedParserTest
[Fatal Error] :1:1: Content is not allowed in prolog.
[Fatal Error] :2:10: DOCTYPE is disallowed when the feature "http://apache.org/xml/features/disallow-doctype-decl" set to true.
[INFO] Tests run: 7, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.022 s -- in com.pandoli365.bibimbap.service.FeedParserTest
[INFO] Running com.pandoli365.bibimbap.service.BadgeServiceTest
[INFO] Tests run: 12, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.005 s -- in com.pandoli365.bibimbap.service.BadgeServiceTest
[INFO] Running com.pandoli365.bibimbap.service.UnityFeedPollerTest
[INFO] Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.015 s -- in com.pandoli365.bibimbap.service.UnityFeedPollerTest
[INFO] Running com.pandoli365.bibimbap.security.SsrfSafeFetcherTest
[INFO] Tests run: 20, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 7.126 s -- in com.pandoli365.bibimbap.security.SsrfSafeFetcherTest
[INFO] Running com.pandoli365.bibimbap.security.JamRoleGateTest
[INFO] Tests run: 8, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.006 s -- in com.pandoli365.bibimbap.security.JamRoleGateTest
[INFO] Running com.pandoli365.bibimbap.security.PermissionGateTest
[INFO] Tests run: 7, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.006 s -- in com.pandoli365.bibimbap.security.PermissionGateTest
[INFO] Running com.pandoli365.bibimbap.security.ZipSecurityTest
[INFO] Tests run: 20, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 4.656 s -- in com.pandoli365.bibimbap.security.ZipSecurityTest
[INFO]
[INFO] Results:
[INFO]
[INFO] Tests run: 362, Failures: 0, Errors: 0, Skipped: 0
[INFO]
[INFO]
[INFO] --- resources:3.3.1:resources (default-resources) @ bibimbap ---
[INFO] Copying 1 resource from src/main/resources to target/classes
[INFO] Copying 2 resources from src/main/resources to target/classes
[INFO]
[INFO] --- compiler:3.14.1:compile (default-compile) @ bibimbap ---
[INFO] Nothing to compile - all classes are up to date.
[INFO]
[INFO] --- resources:3.3.1:testResources (default-testResources) @ bibimbap ---
[INFO] skip non existing resourceDirectory /tmp/bibimbap-readiness-20260922/src/test/resources
[INFO]
[INFO] --- compiler:3.14.1:testCompile (default-testCompile) @ bibimbap ---
[INFO] Recompiling the module because of changed dependency.
[INFO] Compiling 32 source files with javac [debug release 21] to target/test-classes
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[61,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[61,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[61,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[61,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[61,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[65,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[65,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[65,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[65,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[65,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[68,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[68,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[68,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[68,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[68,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[71,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[71,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[71,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[71,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[71,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[74,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[74,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[74,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[74,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[74,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[77,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[77,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[77,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[77,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[77,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[80,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[80,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[80,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[80,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[80,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[83,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[83,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[83,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[83,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[83,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[86,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[86,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[86,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[86,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[86,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[89,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[89,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[89,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[89,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[89,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[92,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[92,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[92,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[92,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[92,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[95,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[95,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[95,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[95,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[95,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[98,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[98,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[98,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[98,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[98,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[101,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[101,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[101,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[101,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[101,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[104,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[104,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[104,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[104,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[104,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[107,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[107,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[107,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[107,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[107,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[110,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[110,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[110,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[110,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[110,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[113,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[113,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[113,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[113,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[113,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[116,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[116,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[116,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[116,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[116,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[119,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[119,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[119,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[119,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[119,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[INFO] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/controller/api/GameLikeControllerTest.java: /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/controller/api/GameLikeControllerTest.java uses or overrides a deprecated API.
[INFO] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/controller/api/GameLikeControllerTest.java: Recompile with -Xlint:deprecation for details.
[INFO] /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java: /tmp/bibimbap-readiness-20260922/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java has additional uses or overrides of a deprecated API that is marked for removal.
[INFO]
[INFO] --- surefire:3.5.5:test (default-test) @ bibimbap ---
[INFO] Skipping execution of surefire because it has already been run for this configuration
[INFO]
[INFO] --- war:3.4.0:war (default-war) @ bibimbap ---
[INFO] Packaging webapp
[INFO] Assembling webapp [bibimbap] in [/tmp/bibimbap-readiness-20260922/target/bibimbap-0.0.1-SNAPSHOT]
[INFO] Processing war project
[INFO] Copying webapp resources [/tmp/bibimbap-readiness-20260922/src/main/webapp]
[INFO] Building war: /tmp/bibimbap-readiness-20260922/target/bibimbap-0.0.1-SNAPSHOT.war
[INFO]
[INFO] --- spring-boot:3.5.16:repackage (default-cli) @ bibimbap ---
[INFO] Replacing main artifact /tmp/bibimbap-readiness-20260922/target/bibimbap-0.0.1-SNAPSHOT.war with repackaged archive, adding nested dependencies in BOOT-INF/.
[INFO] The original artifact has been renamed to /tmp/bibimbap-readiness-20260922/target/bibimbap-0.0.1-SNAPSHOT.war.original
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 19.193 s
[INFO] Finished at: 2026-09-22T02:41:47Z
[INFO] ------------------------------------------------------------------------

View File

@ -0,0 +1,2 @@
Existing local dev: 35 tables/views; game_likes UNIQUE(game_id,user_key) present; active feed sources=0; post_categories slugs=notice,devlog,showcase,resources,industry. Local live schema has no tables; this is not evidence about production.
Isolated PostgreSQL 16 with db/schema.sql: post_categories count=0. New user and recruit persisted via HTTP in isolated DB only.

View File

@ -0,0 +1,41 @@
[INFO] Scanning for projects...
[INFO]
[INFO] ----------------------< com.pandoli365:bibimbap >-----------------------
[INFO] Building bibimbap 0.0.1-SNAPSHOT
[INFO] from pom.xml
[INFO] --------------------------------[ war ]---------------------------------
[INFO]
[INFO] --- dependency-check:12.2.2:check (default-cli) @ bibimbap ---
[INFO]
Dependency-Check is an open source tool performing a best effort analysis of 3rd party dependencies; false positives and false negatives may exist in the analysis performed by the tool. Use of the tool and the reporting provided constitutes acceptance for use in an AS IS condition, and there are NO warranties, implied or otherwise, with regard to the analysis or its use. Any use of the tool and the reporting provided is at the user's risk. In no event shall the copyright holder or OWASP be held liable for any damages whatsoever arising out of or in connection with the use of this tool, the analysis performed, or the resulting report.
About ODC: https://dependency-check.github.io/DependencyCheck/general/internals.html
False Positives: https://dependency-check.github.io/DependencyCheck/general/suppression.html
[INFO] Analysis Started
[INFO] Finished Archive Analyzer (0 seconds)
[INFO] Finished File Name Analyzer (0 seconds)
[INFO] Finished Jar Analyzer (0 seconds)
[INFO] Finished Dependency Merging Analyzer (0 seconds)
[INFO] Finished Hint Analyzer (0 seconds)
[INFO] Finished Version Filter Analyzer (0 seconds)
[INFO] Created CPE Index (0 seconds)
[INFO] Finished CPE Analyzer (1 seconds)
[INFO] Finished False Positive Analyzer (0 seconds)
[INFO] Finished NVD CVE Analyzer (0 seconds)
[WARNING] Sonatype OSS Index Analyzer disabled due to missing credentials. Authentication with token is now required, and OSS Index is migrating to Sonatype Guide. See https://dependency-check.github.io/DependencyCheck/analyzers/oss-index-analyzer.html for more information on authentication with Sonatype Guide OSS Index.
[INFO] Finished Vulnerability Suppression Analyzer (0 seconds)
[INFO] Finished Known Exploited Vulnerability Analyzer (0 seconds)
[INFO] Finished Dependency Bundling Analyzer (0 seconds)
[INFO] Finished Unused Suppression Rule Analyzer (0 seconds)
[INFO] Analysis Complete (1 seconds)
[INFO] Writing HTML report to: /tmp/bibimbap-readiness-20260922/target/dependency-check-report.html
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 4.628 s
[INFO] Finished at: 2026-09-22T02:43:03Z
[INFO] ------------------------------------------------------------------------

View File

@ -0,0 +1,80 @@
The following files have been resolved:
org.springframework.boot:spring-boot-starter-web:jar:3.5.16:compile -- module spring.boot.starter.web [auto]
org.springframework.boot:spring-boot-starter:jar:3.5.16:compile -- module spring.boot.starter [auto]
org.springframework.boot:spring-boot:jar:3.5.16:compile -- module spring.boot [auto]
org.springframework.boot:spring-boot-autoconfigure:jar:3.5.16:compile -- module spring.boot.autoconfigure [auto]
org.springframework.boot:spring-boot-starter-logging:jar:3.5.16:compile -- module spring.boot.starter.logging [auto]
ch.qos.logback:logback-classic:jar:1.5.34:compile -- module ch.qos.logback.classic
ch.qos.logback:logback-core:jar:1.5.34:compile -- module ch.qos.logback.core
org.apache.logging.log4j:log4j-to-slf4j:jar:2.24.3:compile -- module org.apache.logging.log4j.to.slf4j
org.apache.logging.log4j:log4j-api:jar:2.24.3:compile -- module org.apache.logging.log4j
org.slf4j:jul-to-slf4j:jar:2.0.18:compile -- module jul.to.slf4j
org.yaml:snakeyaml:jar:2.4:compile -- module org.yaml.snakeyaml
org.springframework.boot:spring-boot-starter-json:jar:3.5.16:compile -- module spring.boot.starter.json [auto]
com.fasterxml.jackson.core:jackson-databind:jar:2.21.4:compile -- module com.fasterxml.jackson.databind
com.fasterxml.jackson.core:jackson-annotations:jar:2.21:compile -- module com.fasterxml.jackson.annotation
com.fasterxml.jackson.core:jackson-core:jar:2.21.4:compile -- module com.fasterxml.jackson.core
com.fasterxml.jackson.datatype:jackson-datatype-jdk8:jar:2.21.4:compile -- module com.fasterxml.jackson.datatype.jdk8
com.fasterxml.jackson.datatype:jackson-datatype-jsr310:jar:2.21.4:compile -- module com.fasterxml.jackson.datatype.jsr310
com.fasterxml.jackson.module:jackson-module-parameter-names:jar:2.21.4:compile -- module com.fasterxml.jackson.module.paramnames
org.springframework:spring-web:jar:6.2.19:compile -- module spring.web [auto]
org.springframework:spring-beans:jar:6.2.19:compile -- module spring.beans [auto]
io.micrometer:micrometer-observation:jar:1.15.12:compile -- module micrometer.observation [auto]
io.micrometer:micrometer-commons:jar:1.15.12:compile -- module micrometer.commons [auto]
org.springframework:spring-webmvc:jar:6.2.19:compile -- module spring.webmvc [auto]
org.springframework:spring-aop:jar:6.2.19:compile -- module spring.aop [auto]
org.springframework:spring-context:jar:6.2.19:compile -- module spring.context [auto]
org.springframework:spring-expression:jar:6.2.19:compile -- module spring.expression [auto]
org.mybatis.spring.boot:mybatis-spring-boot-starter:jar:3.0.5:compile -- module org.mybatis.spring.boot.starter [auto]
org.springframework.boot:spring-boot-starter-jdbc:jar:3.5.16:compile -- module spring.boot.starter.jdbc [auto]
com.zaxxer:HikariCP:jar:6.3.3:compile -- module com.zaxxer.hikari
org.springframework:spring-jdbc:jar:6.2.19:compile -- module spring.jdbc [auto]
org.springframework:spring-tx:jar:6.2.19:compile -- module spring.tx [auto]
org.mybatis.spring.boot:mybatis-spring-boot-autoconfigure:jar:3.0.5:compile -- module org.mybatis.spring.boot.autoconfigure [auto]
org.mybatis:mybatis:jar:3.5.19:compile -- module org.mybatis [auto]
org.mybatis:mybatis-spring:jar:3.0.5:compile -- module org.mybatis.spring [auto]
org.postgresql:postgresql:jar:42.7.11:runtime -- module org.postgresql.jdbc [auto]
org.apache.tomcat.embed:tomcat-embed-jasper:jar:10.1.55:compile -- module org.apache.tomcat.embed.jasper
org.apache.tomcat.embed:tomcat-embed-core:jar:10.1.55:compile -- module org.apache.tomcat.embed.core
org.apache.tomcat:tomcat-annotations-api:jar:10.1.55:compile -- module jakarta.annotation
org.apache.tomcat.embed:tomcat-embed-el:jar:10.1.55:compile -- module org.apache.tomcat.embed.el
org.eclipse.jdt:ecj:jar:3.33.0:compile -- module org.eclipse.jdt.core.compiler.batch [auto]
org.projectlombok:lombok:jar:1.18.46:compile (optional) -- module lombok
org.springframework.boot:spring-boot-starter-tomcat:jar:3.5.16:provided -- module spring.boot.starter.tomcat [auto]
jakarta.annotation:jakarta.annotation-api:jar:2.1.1:compile -- module jakarta.annotation
org.apache.tomcat.embed:tomcat-embed-websocket:jar:10.1.55:provided -- module org.apache.tomcat.embed.websocket
org.springframework.boot:spring-boot-starter-test:jar:3.5.16:test -- module spring.boot.starter.test [auto]
org.springframework.boot:spring-boot-test:jar:3.5.16:test -- module spring.boot.test [auto]
org.springframework.boot:spring-boot-test-autoconfigure:jar:3.5.16:test -- module spring.boot.test.autoconfigure [auto]
com.jayway.jsonpath:json-path:jar:2.9.0:test -- module json.path [auto]
org.slf4j:slf4j-api:jar:2.0.18:compile -- module org.slf4j
jakarta.xml.bind:jakarta.xml.bind-api:jar:4.0.5:test -- module jakarta.xml.bind
jakarta.activation:jakarta.activation-api:jar:2.1.4:test -- module jakarta.activation
net.minidev:json-smart:jar:2.5.2:test -- module json.smart (auto)
net.minidev:accessors-smart:jar:2.5.2:test -- module accessors.smart (auto)
org.ow2.asm:asm:jar:9.7.1:test -- module org.objectweb.asm
org.assertj:assertj-core:jar:3.27.7:test -- module org.assertj.core
net.bytebuddy:byte-buddy:jar:1.17.8:test -- module net.bytebuddy
org.awaitility:awaitility:jar:4.2.2:test -- module awaitility (auto)
org.hamcrest:hamcrest:jar:3.0:test -- module org.hamcrest [auto]
org.junit.jupiter:junit-jupiter:jar:5.12.2:test -- module org.junit.jupiter
org.junit.jupiter:junit-jupiter-api:jar:5.12.2:test -- module org.junit.jupiter.api
org.opentest4j:opentest4j:jar:1.3.0:test -- module org.opentest4j
org.junit.platform:junit-platform-commons:jar:1.12.2:test -- module org.junit.platform.commons
org.apiguardian:apiguardian-api:jar:1.1.2:test -- module org.apiguardian.api
org.junit.jupiter:junit-jupiter-params:jar:5.12.2:test -- module org.junit.jupiter.params
org.junit.jupiter:junit-jupiter-engine:jar:5.12.2:test -- module org.junit.jupiter.engine
org.junit.platform:junit-platform-engine:jar:1.12.2:test -- module org.junit.platform.engine
org.mockito:mockito-core:jar:5.17.0:test -- module org.mockito
net.bytebuddy:byte-buddy-agent:jar:1.17.8:test -- module net.bytebuddy.agent
org.objenesis:objenesis:jar:3.3:test -- module org.objenesis [auto]
org.mockito:mockito-junit-jupiter:jar:5.17.0:test -- module org.mockito.junit.jupiter
org.skyscreamer:jsonassert:jar:1.5.3:test -- module jsonassert (auto)
com.vaadin.external.google:android-json:jar:0.0.20131108.vaadin1:test -- module android.json (auto)
org.springframework:spring-core:jar:6.2.19:compile -- module spring.core [auto]
org.springframework:spring-jcl:jar:6.2.19:compile -- module spring.jcl [auto]
org.springframework:spring-test:jar:6.2.19:test -- module spring.test [auto]
org.xmlunit:xmlunit-core:jar:2.10.4:test -- module org.xmlunit [auto]
org.commonmark:commonmark:jar:0.22.0:compile -- module org.commonmark
org.jsoup:jsoup:jar:1.17.2:compile -- module org.jsoup

View File

@ -0,0 +1 @@
dependency-check:check BUILD SUCCESS. autoUpdate=false; 50 dependencies (40 unique), 0 reported vulnerabilities. OSS Index disabled due to missing credentials. NVD freshness not verified. Provided scope excluded by pom. Not current-CVE clearance.

View File

@ -0,0 +1,31 @@
[
{
"path": "/posts?categoryId=abc",
"status": 500
},
{
"path": "/posts?categoryId=9223372036854775808",
"status": 500
},
{
"path": "/games/search?sort=invalid",
"status": 200
},
{
"path": "/posts/99999",
"status": 200
},
{
"path": "/recruit/99999",
"status": 200
},
{
"path": "/jams/nonexistent-readiness",
"status": 200
},
{
"path": "/recruit/1",
"status": 200,
"persisted_title_rendered": true
}
]

View File

@ -0,0 +1,149 @@
[
{
"path": "/signup",
"method": "GET",
"csrf": false,
"status": 200,
"expected": 200,
"passed": true,
"cookie_secure": [
false
]
},
{
"path": "/signup",
"method": "POST",
"csrf": false,
"status": 403,
"expected": 403,
"passed": true,
"cookie_secure": [
false
]
},
{
"path": "/signup",
"method": "POST",
"csrf": true,
"status": 200,
"expected": 200,
"passed": true,
"cookie_secure": [
false
]
},
{
"path": "/login",
"method": "POST",
"csrf": false,
"status": 403,
"expected": 403,
"passed": true,
"cookie_secure": [
false
]
},
{
"path": "/login",
"method": "POST",
"csrf": true,
"status": 200,
"expected": 200,
"passed": true,
"cookie_secure": [
false
]
},
{
"check": "login_session_id_rotated",
"passed": true
},
{
"path": "/profile",
"method": "GET",
"csrf": false,
"status": 200,
"expected": 200,
"passed": true,
"cookie_secure": [
false
]
},
{
"path": "/posts/new",
"method": "GET",
"csrf": false,
"status": 403,
"expected": 403,
"passed": true,
"cookie_secure": [
false
]
},
{
"path": "/recruit/new",
"method": "GET",
"csrf": false,
"status": 200,
"expected": 200,
"passed": true,
"cookie_secure": [
false
]
},
{
"path": "/recruit/new",
"method": "POST",
"csrf": false,
"status": 403,
"expected": 403,
"passed": true,
"cookie_secure": [
false
]
},
{
"path": "/recruit/new",
"method": "POST",
"csrf": true,
"status": 200,
"expected": 200,
"passed": true,
"cookie_secure": [
false
]
},
{
"path": "/recruit/1",
"method": "GET",
"csrf": false,
"status": 200,
"expected": 200,
"passed": true,
"cookie_secure": [
false
]
},
{
"path": "/logout",
"method": "POST",
"csrf": true,
"status": 302,
"expected": 302,
"passed": true,
"cookie_secure": [
false
]
},
{
"path": "/profile",
"method": "GET",
"csrf": false,
"status": 302,
"expected": 302,
"passed": true,
"cookie_secure": [
false
]
}
]

Binary file not shown.

After

Width:  |  Height:  |  Size: 90 KiB

View File

@ -0,0 +1,138 @@
[
{
"path": "/",
"status": 200,
"bytes": 44884,
"location": null,
"content_type": "text/html;charset=UTF-8",
"cookie_flags": [
" Path=/; HttpOnly; SameSite=Lax"
]
},
{
"path": "/explore",
"status": 302,
"bytes": 0,
"location": "http://localhost:8080/error;jsessionid=[redacted]",
"content_type": null,
"cookie_flags": [
" Path=/; HttpOnly; SameSite=Lax"
]
},
{
"path": "/games/search",
"status": 200,
"bytes": 44884,
"location": null,
"content_type": "text/html;charset=UTF-8",
"cookie_flags": [
" Path=/; HttpOnly; SameSite=Lax"
]
},
{
"path": "/posts",
"status": 200,
"bytes": 30369,
"location": null,
"content_type": "text/html;charset=UTF-8",
"cookie_flags": [
" Path=/; HttpOnly; SameSite=Lax"
]
},
{
"path": "/posts?categoryId=1",
"status": 200,
"bytes": 30394,
"location": null,
"content_type": "text/html;charset=UTF-8",
"cookie_flags": [
" Path=/; HttpOnly; SameSite=Lax"
]
},
{
"path": "/recruit",
"status": 200,
"bytes": 29850,
"location": null,
"content_type": "text/html;charset=UTF-8",
"cookie_flags": [
" Path=/; HttpOnly; SameSite=Lax"
]
},
{
"path": "/jams",
"status": 200,
"bytes": 21485,
"location": null,
"content_type": "text/html;charset=UTF-8",
"cookie_flags": [
" Path=/; HttpOnly; SameSite=Lax"
]
},
{
"path": "/login",
"status": 200,
"bytes": 28549,
"location": null,
"content_type": "text/html;charset=UTF-8",
"cookie_flags": [
" Path=/; HttpOnly; SameSite=Lax"
]
},
{
"path": "/signup",
"status": 200,
"bytes": 30780,
"location": null,
"content_type": "text/html;charset=UTF-8",
"cookie_flags": [
" Path=/; HttpOnly; SameSite=Lax"
]
},
{
"path": "/profile",
"status": 302,
"bytes": 0,
"location": "http://localhost:8080/login;jsessionid=[redacted]",
"content_type": null,
"cookie_flags": [
" Path=/; HttpOnly; SameSite=Lax"
]
},
{
"path": "/admin",
"status": 401,
"bytes": 56,
"location": null,
"content_type": "application/json;charset=UTF-8",
"cookie_flags": []
},
{
"path": "/posts/new",
"status": 302,
"bytes": 0,
"location": "http://localhost:8080/login;jsessionid=[redacted]",
"content_type": null,
"cookie_flags": [
" Path=/; HttpOnly; SameSite=Lax"
]
},
{
"path": "/game/99999",
"status": 404,
"bytes": 36,
"location": null,
"content_type": "application/json",
"cookie_flags": [
" Path=/; HttpOnly; SameSite=Lax"
]
},
{
"path": "/css/common.css",
"status": 500,
"bytes": 39,
"location": null,
"content_type": "application/json",
"cookie_flags": []
}
]

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,624 @@
{
"checked_at": "2026-09-22T02:53:22.121058+00:00",
"source": "https://api.osv.dev/v1/querybatch",
"packages": [
{
"name": "org.springframework.boot:spring-boot-starter-web",
"version": "3.5.16",
"scope": "compile",
"in_war": false,
"result": {}
},
{
"name": "org.springframework.boot:spring-boot-starter",
"version": "3.5.16",
"scope": "compile",
"in_war": false,
"result": {}
},
{
"name": "org.springframework.boot:spring-boot",
"version": "3.5.16",
"scope": "compile",
"in_war": true,
"result": {}
},
{
"name": "org.springframework.boot:spring-boot-autoconfigure",
"version": "3.5.16",
"scope": "compile",
"in_war": true,
"result": {}
},
{
"name": "org.springframework.boot:spring-boot-starter-logging",
"version": "3.5.16",
"scope": "compile",
"in_war": false,
"result": {}
},
{
"name": "ch.qos.logback:logback-classic",
"version": "1.5.34",
"scope": "compile",
"in_war": true,
"result": {}
},
{
"name": "ch.qos.logback:logback-core",
"version": "1.5.34",
"scope": "compile",
"in_war": true,
"result": {}
},
{
"name": "org.apache.logging.log4j:log4j-to-slf4j",
"version": "2.24.3",
"scope": "compile",
"in_war": true,
"result": {}
},
{
"name": "org.apache.logging.log4j:log4j-api",
"version": "2.24.3",
"scope": "compile",
"in_war": true,
"result": {
"vulns": [
{
"id": "GHSA-qv9r-c865-cp47",
"modified": "2026-09-10T03:50:52.972700Z"
}
]
}
},
{
"name": "org.slf4j:jul-to-slf4j",
"version": "2.0.18",
"scope": "compile",
"in_war": true,
"result": {}
},
{
"name": "org.yaml:snakeyaml",
"version": "2.4",
"scope": "compile",
"in_war": true,
"result": {}
},
{
"name": "org.springframework.boot:spring-boot-starter-json",
"version": "3.5.16",
"scope": "compile",
"in_war": false,
"result": {}
},
{
"name": "com.fasterxml.jackson.core:jackson-databind",
"version": "2.21.4",
"scope": "compile",
"in_war": true,
"result": {
"vulns": [
{
"id": "GHSA-5gvw-p9qm-jgwh",
"modified": "2026-09-10T03:51:10.658074Z"
},
{
"id": "GHSA-5jmj-h7xm-6q6v",
"modified": "2026-09-10T03:51:08.069993Z"
},
{
"id": "GHSA-mhm7-754m-9p8w",
"modified": "2026-09-10T03:50:52.852212Z"
}
]
}
},
{
"name": "com.fasterxml.jackson.core:jackson-annotations",
"version": "2.21",
"scope": "compile",
"in_war": true,
"result": {}
},
{
"name": "com.fasterxml.jackson.core:jackson-core",
"version": "2.21.4",
"scope": "compile",
"in_war": true,
"result": {}
},
{
"name": "com.fasterxml.jackson.datatype:jackson-datatype-jdk8",
"version": "2.21.4",
"scope": "compile",
"in_war": true,
"result": {}
},
{
"name": "com.fasterxml.jackson.datatype:jackson-datatype-jsr310",
"version": "2.21.4",
"scope": "compile",
"in_war": true,
"result": {}
},
{
"name": "com.fasterxml.jackson.module:jackson-module-parameter-names",
"version": "2.21.4",
"scope": "compile",
"in_war": true,
"result": {}
},
{
"name": "org.springframework:spring-web",
"version": "6.2.19",
"scope": "compile",
"in_war": true,
"result": {}
},
{
"name": "org.springframework:spring-beans",
"version": "6.2.19",
"scope": "compile",
"in_war": true,
"result": {}
},
{
"name": "io.micrometer:micrometer-observation",
"version": "1.15.12",
"scope": "compile",
"in_war": true,
"result": {}
},
{
"name": "io.micrometer:micrometer-commons",
"version": "1.15.12",
"scope": "compile",
"in_war": true,
"result": {}
},
{
"name": "org.springframework:spring-webmvc",
"version": "6.2.19",
"scope": "compile",
"in_war": true,
"result": {}
},
{
"name": "org.springframework:spring-aop",
"version": "6.2.19",
"scope": "compile",
"in_war": true,
"result": {}
},
{
"name": "org.springframework:spring-context",
"version": "6.2.19",
"scope": "compile",
"in_war": true,
"result": {}
},
{
"name": "org.springframework:spring-expression",
"version": "6.2.19",
"scope": "compile",
"in_war": true,
"result": {}
},
{
"name": "org.mybatis.spring.boot:mybatis-spring-boot-starter",
"version": "3.0.5",
"scope": "compile",
"in_war": true,
"result": {}
},
{
"name": "org.springframework.boot:spring-boot-starter-jdbc",
"version": "3.5.16",
"scope": "compile",
"in_war": false,
"result": {}
},
{
"name": "com.zaxxer:HikariCP",
"version": "6.3.3",
"scope": "compile",
"in_war": true,
"result": {}
},
{
"name": "org.springframework:spring-jdbc",
"version": "6.2.19",
"scope": "compile",
"in_war": true,
"result": {}
},
{
"name": "org.springframework:spring-tx",
"version": "6.2.19",
"scope": "compile",
"in_war": true,
"result": {}
},
{
"name": "org.mybatis.spring.boot:mybatis-spring-boot-autoconfigure",
"version": "3.0.5",
"scope": "compile",
"in_war": true,
"result": {}
},
{
"name": "org.mybatis:mybatis",
"version": "3.5.19",
"scope": "compile",
"in_war": true,
"result": {}
},
{
"name": "org.mybatis:mybatis-spring",
"version": "3.0.5",
"scope": "compile",
"in_war": true,
"result": {}
},
{
"name": "org.postgresql:postgresql",
"version": "42.7.11",
"scope": "runtime",
"in_war": true,
"result": {
"vulns": [
{
"id": "GHSA-j92g-9f8w-j867",
"modified": "2026-09-10T03:50:12.377062Z"
}
]
}
},
{
"name": "org.apache.tomcat.embed:tomcat-embed-jasper",
"version": "10.1.55",
"scope": "compile",
"in_war": true,
"result": {}
},
{
"name": "org.apache.tomcat.embed:tomcat-embed-core",
"version": "10.1.55",
"scope": "compile",
"in_war": true,
"result": {
"vulns": [
{
"id": "GHSA-9xv2-5v5q-p794",
"modified": "2026-09-11T08:25:52.825871Z"
},
{
"id": "GHSA-gcx9-497g-6cp6",
"modified": "2026-09-11T08:25:41.300012Z"
},
{
"id": "GHSA-h3x4-894j-xpx5",
"modified": "2026-09-11T08:25:40.118635Z"
}
]
}
},
{
"name": "org.apache.tomcat:tomcat-annotations-api",
"version": "10.1.55",
"scope": "compile",
"in_war": true,
"result": {}
},
{
"name": "org.apache.tomcat.embed:tomcat-embed-el",
"version": "10.1.55",
"scope": "compile",
"in_war": true,
"result": {}
},
{
"name": "org.eclipse.jdt:ecj",
"version": "3.33.0",
"scope": "compile",
"in_war": true,
"result": {}
},
{
"name": "org.projectlombok:lombok",
"version": "1.18.46",
"scope": "compile",
"in_war": false,
"result": {}
},
{
"name": "org.springframework.boot:spring-boot-starter-tomcat",
"version": "3.5.16",
"scope": "provided",
"in_war": false,
"result": {}
},
{
"name": "jakarta.annotation:jakarta.annotation-api",
"version": "2.1.1",
"scope": "compile",
"in_war": true,
"result": {}
},
{
"name": "org.apache.tomcat.embed:tomcat-embed-websocket",
"version": "10.1.55",
"scope": "provided",
"in_war": true,
"result": {}
},
{
"name": "org.springframework.boot:spring-boot-starter-test",
"version": "3.5.16",
"scope": "test",
"in_war": false,
"result": {}
},
{
"name": "org.springframework.boot:spring-boot-test",
"version": "3.5.16",
"scope": "test",
"in_war": false,
"result": {}
},
{
"name": "org.springframework.boot:spring-boot-test-autoconfigure",
"version": "3.5.16",
"scope": "test",
"in_war": false,
"result": {}
},
{
"name": "com.jayway.jsonpath:json-path",
"version": "2.9.0",
"scope": "test",
"in_war": false,
"result": {}
},
{
"name": "org.slf4j:slf4j-api",
"version": "2.0.18",
"scope": "compile",
"in_war": true,
"result": {}
},
{
"name": "jakarta.xml.bind:jakarta.xml.bind-api",
"version": "4.0.5",
"scope": "test",
"in_war": false,
"result": {}
},
{
"name": "jakarta.activation:jakarta.activation-api",
"version": "2.1.4",
"scope": "test",
"in_war": false,
"result": {}
},
{
"name": "net.minidev:json-smart",
"version": "2.5.2",
"scope": "test",
"in_war": false,
"result": {}
},
{
"name": "net.minidev:accessors-smart",
"version": "2.5.2",
"scope": "test",
"in_war": false,
"result": {}
},
{
"name": "org.ow2.asm:asm",
"version": "9.7.1",
"scope": "test",
"in_war": false,
"result": {}
},
{
"name": "org.assertj:assertj-core",
"version": "3.27.7",
"scope": "test",
"in_war": false,
"result": {}
},
{
"name": "net.bytebuddy:byte-buddy",
"version": "1.17.8",
"scope": "test",
"in_war": false,
"result": {}
},
{
"name": "org.awaitility:awaitility",
"version": "4.2.2",
"scope": "test",
"in_war": false,
"result": {}
},
{
"name": "org.hamcrest:hamcrest",
"version": "3.0",
"scope": "test",
"in_war": false,
"result": {}
},
{
"name": "org.junit.jupiter:junit-jupiter",
"version": "5.12.2",
"scope": "test",
"in_war": false,
"result": {}
},
{
"name": "org.junit.jupiter:junit-jupiter-api",
"version": "5.12.2",
"scope": "test",
"in_war": false,
"result": {}
},
{
"name": "org.opentest4j:opentest4j",
"version": "1.3.0",
"scope": "test",
"in_war": false,
"result": {}
},
{
"name": "org.junit.platform:junit-platform-commons",
"version": "1.12.2",
"scope": "test",
"in_war": false,
"result": {}
},
{
"name": "org.apiguardian:apiguardian-api",
"version": "1.1.2",
"scope": "test",
"in_war": false,
"result": {}
},
{
"name": "org.junit.jupiter:junit-jupiter-params",
"version": "5.12.2",
"scope": "test",
"in_war": false,
"result": {}
},
{
"name": "org.junit.jupiter:junit-jupiter-engine",
"version": "5.12.2",
"scope": "test",
"in_war": false,
"result": {}
},
{
"name": "org.junit.platform:junit-platform-engine",
"version": "1.12.2",
"scope": "test",
"in_war": false,
"result": {}
},
{
"name": "org.mockito:mockito-core",
"version": "5.17.0",
"scope": "test",
"in_war": false,
"result": {}
},
{
"name": "net.bytebuddy:byte-buddy-agent",
"version": "1.17.8",
"scope": "test",
"in_war": false,
"result": {}
},
{
"name": "org.objenesis:objenesis",
"version": "3.3",
"scope": "test",
"in_war": false,
"result": {}
},
{
"name": "org.mockito:mockito-junit-jupiter",
"version": "5.17.0",
"scope": "test",
"in_war": false,
"result": {}
},
{
"name": "org.skyscreamer:jsonassert",
"version": "1.5.3",
"scope": "test",
"in_war": false,
"result": {}
},
{
"name": "com.vaadin.external.google:android-json",
"version": "0.0.20131108.vaadin1",
"scope": "test",
"in_war": false,
"result": {}
},
{
"name": "org.springframework:spring-core",
"version": "6.2.19",
"scope": "compile",
"in_war": true,
"result": {}
},
{
"name": "org.springframework:spring-jcl",
"version": "6.2.19",
"scope": "compile",
"in_war": true,
"result": {}
},
{
"name": "org.springframework:spring-test",
"version": "6.2.19",
"scope": "test",
"in_war": false,
"result": {}
},
{
"name": "org.xmlunit:xmlunit-core",
"version": "2.10.4",
"scope": "test",
"in_war": false,
"result": {}
},
{
"name": "org.commonmark:commonmark",
"version": "0.22.0",
"scope": "compile",
"in_war": true,
"result": {}
},
{
"name": "org.jsoup:jsoup",
"version": "1.17.2",
"scope": "compile",
"in_war": true,
"result": {
"vulns": [
{
"id": "GHSA-pmhh-3w7g-xqp8",
"modified": "2026-09-10T03:50:53.809983Z"
}
]
}
},
{
"name": "ognl:ognl",
"version": "3.4.4",
"scope": "shaded",
"in_war": true,
"result": {}
},
{
"name": "org.javassist:javassist",
"version": "3.30.2-GA",
"scope": "shaded",
"in_war": true,
"result": {}
},
{
"name": "org.springframework.boot:spring-boot-jarmode-tools",
"version": "3.5.16",
"scope": "packaged-tool",
"in_war": true,
"result": {}
}
]
}

View File

@ -0,0 +1,56 @@
[
{
"path": "/",
"status": 200,
"bytes": 44240,
"cookie_flags": [
" Path=/; HttpOnly; SameSite=Lax"
]
},
{
"path": "/posts",
"status": 200,
"bytes": 28906,
"cookie_flags": [
" Path=/; HttpOnly; SameSite=Lax"
]
},
{
"path": "/recruit",
"status": 200,
"bytes": 29850,
"cookie_flags": [
" Path=/; HttpOnly; SameSite=Lax"
]
},
{
"path": "/jams",
"status": 200,
"bytes": 21485,
"cookie_flags": [
" Path=/; HttpOnly; SameSite=Lax"
]
},
{
"path": "/login",
"status": 200,
"bytes": 28549,
"cookie_flags": [
" Path=/; HttpOnly; SameSite=Lax"
]
},
{
"path": "/signup",
"status": 200,
"bytes": 30780,
"cookie_flags": [
" Path=/; HttpOnly; SameSite=Lax"
]
},
{
"path": "/css/readiness-missing.css",
"status": 500,
"bytes": 39,
"cookie_flags": []
}
]

View File

@ -0,0 +1,209 @@
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v3.5.16)
2026-09-22T02:44:37.039Z INFO 1 --- [bibimbap] [ main] c.p.bibimbap.BibimbapApplication : Starting BibimbapApplication using Java 21.0.11 with PID 1 (/app/app.war started by root in /)
2026-09-22T02:44:37.040Z INFO 1 --- [bibimbap] [ main] c.p.bibimbap.BibimbapApplication : The following 1 profile is active: "live"
2026-09-22T02:44:37.522Z INFO 1 --- [bibimbap] [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port 8080 (http)
2026-09-22T02:44:37.528Z INFO 1 --- [bibimbap] [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat]
2026-09-22T02:44:37.528Z INFO 1 --- [bibimbap] [ main] o.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/10.1.55]
2026-09-22T02:44:37.800Z INFO 1 --- [bibimbap] [ main] org.apache.jasper.servlet.TldScanner : At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time.
2026-09-22T02:44:37.851Z INFO 1 --- [bibimbap] [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
2026-09-22T02:44:37.852Z INFO 1 --- [bibimbap] [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 793 ms
2026-09-22T02:44:38.182Z INFO 1 --- [bibimbap] [ main] o.s.b.a.w.s.WelcomePageHandlerMapping : Adding welcome page template: index
2026-09-22T02:44:38.242Z WARN 1 --- [bibimbap] [ main] o.s.w.s.resource.ResourceHandlerUtils : Appended trailing slash to static resource location: file:///tmp/readiness-uploads/profile/
2026-09-22T02:44:38.311Z INFO 1 --- [bibimbap] [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port 8080 (http) with context path '/'
2026-09-22T02:44:38.318Z INFO 1 --- [bibimbap] [ main] c.p.bibimbap.BibimbapApplication : Started BibimbapApplication in 1.482 seconds (process running for 1.737)
2026-09-22T02:44:38.323Z INFO 1 --- [bibimbap] [ scheduling-1] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting...
2026-09-22T02:44:38.391Z INFO 1 --- [bibimbap] [ scheduling-1] com.zaxxer.hikari.pool.HikariPool : HikariPool-1 - Added connection org.postgresql.jdbc.PgConnection@2ff9d0ed
2026-09-22T02:44:38.392Z INFO 1 --- [bibimbap] [ scheduling-1] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed.
2026-09-22T02:44:38.405Z INFO 1 --- [bibimbap] [ main] c.p.b.config.PermissionCatalogVerifier : [RBAC] 권한 카탈로그 시드 완료: 4 키
2026-09-22T02:44:38.407Z INFO 1 --- [bibimbap] [ main] c.p.bibimbap.config.BadgeCatalogSeeder : [BADGE] 배지 카탈로그 시드 완료: 2 종
2026-09-22T02:45:02.467Z INFO 1 --- [bibimbap] [0.0-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet'
2026-09-22T02:45:02.467Z INFO 1 --- [bibimbap] [0.0-8080-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet'
2026-09-22T02:45:02.468Z INFO 1 --- [bibimbap] [0.0-8080-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 1 ms
2026-09-22T02:45:03.304Z ERROR 1 --- [bibimbap] [0.0-8080-exec-7] c.p.b.c.a.ApiExceptionControllerAdvice : API request failed
org.springframework.web.servlet.resource.NoResourceFoundException: No static resource css/readiness-missing.css.
at org.springframework.web.servlet.resource.ResourceHttpRequestHandler.handleRequest(ResourceHttpRequestHandler.java:585) ~[spring-webmvc-6.2.19.jar!/:6.2.19]
at org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter.handle(HttpRequestHandlerAdapter.java:52) ~[spring-webmvc-6.2.19.jar!/:6.2.19]
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089) ~[spring-webmvc-6.2.19.jar!/:6.2.19]
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979) ~[spring-webmvc-6.2.19.jar!/:6.2.19]
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014) ~[spring-webmvc-6.2.19.jar!/:6.2.19]
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:903) ~[spring-webmvc-6.2.19.jar!/:6.2.19]
at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:564) ~[tomcat-embed-core-10.1.55.jar!/:na]
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885) ~[spring-webmvc-6.2.19.jar!/:6.2.19]
at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658) ~[tomcat-embed-core-10.1.55.jar!/:na]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-10.1.55.jar!/:na]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:138) ~[tomcat-embed-core-10.1.55.jar!/:na]
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51) ~[tomcat-embed-websocket-10.1.55.jar!/:na]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-10.1.55.jar!/:na]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:138) ~[tomcat-embed-core-10.1.55.jar!/:na]
at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-6.2.19.jar!/:6.2.19]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.2.19.jar!/:6.2.19]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-10.1.55.jar!/:na]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:138) ~[tomcat-embed-core-10.1.55.jar!/:na]
at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-6.2.19.jar!/:6.2.19]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.2.19.jar!/:6.2.19]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-10.1.55.jar!/:na]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:138) ~[tomcat-embed-core-10.1.55.jar!/:na]
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-6.2.19.jar!/:6.2.19]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.2.19.jar!/:6.2.19]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-10.1.55.jar!/:na]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:138) ~[tomcat-embed-core-10.1.55.jar!/:na]
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:165) ~[tomcat-embed-core-10.1.55.jar!/:na]
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:88) ~[tomcat-embed-core-10.1.55.jar!/:na]
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:492) ~[tomcat-embed-core-10.1.55.jar!/:na]
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:113) ~[tomcat-embed-core-10.1.55.jar!/:na]
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:83) ~[tomcat-embed-core-10.1.55.jar!/:na]
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:72) ~[tomcat-embed-core-10.1.55.jar!/:na]
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342) ~[tomcat-embed-core-10.1.55.jar!/:na]
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:399) ~[tomcat-embed-core-10.1.55.jar!/:na]
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63) ~[tomcat-embed-core-10.1.55.jar!/:na]
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:1272) ~[tomcat-embed-core-10.1.55.jar!/:na]
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1797) ~[tomcat-embed-core-10.1.55.jar!/:na]
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) ~[tomcat-embed-core-10.1.55.jar!/:na]
at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:973) ~[tomcat-embed-core-10.1.55.jar!/:na]
at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:491) ~[tomcat-embed-core-10.1.55.jar!/:na]
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63) ~[tomcat-embed-core-10.1.55.jar!/:na]
at java.base/java.lang.Thread.run(Thread.java:1583) ~[na:na]
2026-09-22T02:46:05.823Z ERROR 1 --- [bibimbap] [0.0-8080-exec-1] c.p.b.c.a.ApiExceptionControllerAdvice : API request failed
org.springframework.web.method.annotation.MethodArgumentTypeMismatchException: Method parameter 'categoryId': Failed to convert value of type 'java.lang.String' to required type 'java.lang.Long'; For input string: "abc"
at org.springframework.web.method.annotation.AbstractNamedValueMethodArgumentResolver.convertIfNecessary(AbstractNamedValueMethodArgumentResolver.java:301) ~[spring-web-6.2.19.jar!/:6.2.19]
at org.springframework.web.method.annotation.AbstractNamedValueMethodArgumentResolver.resolveArgument(AbstractNamedValueMethodArgumentResolver.java:136) ~[spring-web-6.2.19.jar!/:6.2.19]
at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:122) ~[spring-web-6.2.19.jar!/:6.2.19]
at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:227) ~[spring-web-6.2.19.jar!/:6.2.19]
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:181) ~[spring-web-6.2.19.jar!/:6.2.19]
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:118) ~[spring-webmvc-6.2.19.jar!/:6.2.19]
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:991) ~[spring-webmvc-6.2.19.jar!/:6.2.19]
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:896) ~[spring-webmvc-6.2.19.jar!/:6.2.19]
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-6.2.19.jar!/:6.2.19]
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089) ~[spring-webmvc-6.2.19.jar!/:6.2.19]
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979) ~[spring-webmvc-6.2.19.jar!/:6.2.19]
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014) ~[spring-webmvc-6.2.19.jar!/:6.2.19]
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:903) ~[spring-webmvc-6.2.19.jar!/:6.2.19]
at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:564) ~[tomcat-embed-core-10.1.55.jar!/:na]
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885) ~[spring-webmvc-6.2.19.jar!/:6.2.19]
at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658) ~[tomcat-embed-core-10.1.55.jar!/:na]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-10.1.55.jar!/:na]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:138) ~[tomcat-embed-core-10.1.55.jar!/:na]
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51) ~[tomcat-embed-websocket-10.1.55.jar!/:na]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-10.1.55.jar!/:na]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:138) ~[tomcat-embed-core-10.1.55.jar!/:na]
at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-6.2.19.jar!/:6.2.19]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.2.19.jar!/:6.2.19]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-10.1.55.jar!/:na]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:138) ~[tomcat-embed-core-10.1.55.jar!/:na]
at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-6.2.19.jar!/:6.2.19]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.2.19.jar!/:6.2.19]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-10.1.55.jar!/:na]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:138) ~[tomcat-embed-core-10.1.55.jar!/:na]
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-6.2.19.jar!/:6.2.19]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.2.19.jar!/:6.2.19]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-10.1.55.jar!/:na]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:138) ~[tomcat-embed-core-10.1.55.jar!/:na]
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:165) ~[tomcat-embed-core-10.1.55.jar!/:na]
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:88) ~[tomcat-embed-core-10.1.55.jar!/:na]
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:492) ~[tomcat-embed-core-10.1.55.jar!/:na]
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:113) ~[tomcat-embed-core-10.1.55.jar!/:na]
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:83) ~[tomcat-embed-core-10.1.55.jar!/:na]
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:72) ~[tomcat-embed-core-10.1.55.jar!/:na]
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342) ~[tomcat-embed-core-10.1.55.jar!/:na]
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:399) ~[tomcat-embed-core-10.1.55.jar!/:na]
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63) ~[tomcat-embed-core-10.1.55.jar!/:na]
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:1272) ~[tomcat-embed-core-10.1.55.jar!/:na]
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1797) ~[tomcat-embed-core-10.1.55.jar!/:na]
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) ~[tomcat-embed-core-10.1.55.jar!/:na]
at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:973) ~[tomcat-embed-core-10.1.55.jar!/:na]
at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:491) ~[tomcat-embed-core-10.1.55.jar!/:na]
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63) ~[tomcat-embed-core-10.1.55.jar!/:na]
at java.base/java.lang.Thread.run(Thread.java:1583) ~[na:na]
Caused by: java.lang.NumberFormatException: For input string: "abc"
at java.base/java.lang.NumberFormatException.forInputString(NumberFormatException.java:67) ~[na:na]
at java.base/java.lang.Long.parseLong(Long.java:709) ~[na:na]
at java.base/java.lang.Long.valueOf(Long.java:1157) ~[na:na]
at org.springframework.util.NumberUtils.parseNumber(NumberUtils.java:204) ~[spring-core-6.2.19.jar!/:6.2.19]
at org.springframework.beans.propertyeditors.CustomNumberEditor.setAsText(CustomNumberEditor.java:115) ~[spring-beans-6.2.19.jar!/:6.2.19]
at org.springframework.beans.TypeConverterDelegate.doConvertTextValue(TypeConverterDelegate.java:439) ~[spring-beans-6.2.19.jar!/:6.2.19]
at org.springframework.beans.TypeConverterDelegate.doConvertValue(TypeConverterDelegate.java:412) ~[spring-beans-6.2.19.jar!/:6.2.19]
at org.springframework.beans.TypeConverterDelegate.convertIfNecessary(TypeConverterDelegate.java:161) ~[spring-beans-6.2.19.jar!/:6.2.19]
at org.springframework.beans.TypeConverterSupport.convertIfNecessary(TypeConverterSupport.java:80) ~[spring-beans-6.2.19.jar!/:6.2.19]
at org.springframework.beans.TypeConverterSupport.convertIfNecessary(TypeConverterSupport.java:53) ~[spring-beans-6.2.19.jar!/:6.2.19]
at org.springframework.validation.DataBinder.convertIfNecessary(DataBinder.java:868) ~[spring-context-6.2.19.jar!/:6.2.19]
at org.springframework.web.method.annotation.AbstractNamedValueMethodArgumentResolver.convertIfNecessary(AbstractNamedValueMethodArgumentResolver.java:293) ~[spring-web-6.2.19.jar!/:6.2.19]
... 48 common frames omitted
2026-09-22T02:46:05.827Z ERROR 1 --- [bibimbap] [0.0-8080-exec-2] c.p.b.c.a.ApiExceptionControllerAdvice : API request failed
org.springframework.web.method.annotation.MethodArgumentTypeMismatchException: Method parameter 'categoryId': Failed to convert value of type 'java.lang.String' to required type 'java.lang.Long'; For input string: "9223372036854775808"
at org.springframework.web.method.annotation.AbstractNamedValueMethodArgumentResolver.convertIfNecessary(AbstractNamedValueMethodArgumentResolver.java:301) ~[spring-web-6.2.19.jar!/:6.2.19]
at org.springframework.web.method.annotation.AbstractNamedValueMethodArgumentResolver.resolveArgument(AbstractNamedValueMethodArgumentResolver.java:136) ~[spring-web-6.2.19.jar!/:6.2.19]
at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:122) ~[spring-web-6.2.19.jar!/:6.2.19]
at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:227) ~[spring-web-6.2.19.jar!/:6.2.19]
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:181) ~[spring-web-6.2.19.jar!/:6.2.19]
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:118) ~[spring-webmvc-6.2.19.jar!/:6.2.19]
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:991) ~[spring-webmvc-6.2.19.jar!/:6.2.19]
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:896) ~[spring-webmvc-6.2.19.jar!/:6.2.19]
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-6.2.19.jar!/:6.2.19]
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089) ~[spring-webmvc-6.2.19.jar!/:6.2.19]
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979) ~[spring-webmvc-6.2.19.jar!/:6.2.19]
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014) ~[spring-webmvc-6.2.19.jar!/:6.2.19]
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:903) ~[spring-webmvc-6.2.19.jar!/:6.2.19]
at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:564) ~[tomcat-embed-core-10.1.55.jar!/:na]
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885) ~[spring-webmvc-6.2.19.jar!/:6.2.19]
at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658) ~[tomcat-embed-core-10.1.55.jar!/:na]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-10.1.55.jar!/:na]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:138) ~[tomcat-embed-core-10.1.55.jar!/:na]
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51) ~[tomcat-embed-websocket-10.1.55.jar!/:na]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-10.1.55.jar!/:na]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:138) ~[tomcat-embed-core-10.1.55.jar!/:na]
at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-6.2.19.jar!/:6.2.19]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.2.19.jar!/:6.2.19]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-10.1.55.jar!/:na]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:138) ~[tomcat-embed-core-10.1.55.jar!/:na]
at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-6.2.19.jar!/:6.2.19]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.2.19.jar!/:6.2.19]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-10.1.55.jar!/:na]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:138) ~[tomcat-embed-core-10.1.55.jar!/:na]
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-6.2.19.jar!/:6.2.19]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.2.19.jar!/:6.2.19]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-10.1.55.jar!/:na]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:138) ~[tomcat-embed-core-10.1.55.jar!/:na]
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:165) ~[tomcat-embed-core-10.1.55.jar!/:na]
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:88) ~[tomcat-embed-core-10.1.55.jar!/:na]
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:492) ~[tomcat-embed-core-10.1.55.jar!/:na]
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:113) ~[tomcat-embed-core-10.1.55.jar!/:na]
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:83) ~[tomcat-embed-core-10.1.55.jar!/:na]
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:72) ~[tomcat-embed-core-10.1.55.jar!/:na]
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342) ~[tomcat-embed-core-10.1.55.jar!/:na]
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:399) ~[tomcat-embed-core-10.1.55.jar!/:na]
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63) ~[tomcat-embed-core-10.1.55.jar!/:na]
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:1272) ~[tomcat-embed-core-10.1.55.jar!/:na]
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1797) ~[tomcat-embed-core-10.1.55.jar!/:na]
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) ~[tomcat-embed-core-10.1.55.jar!/:na]
at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:973) ~[tomcat-embed-core-10.1.55.jar!/:na]
at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:491) ~[tomcat-embed-core-10.1.55.jar!/:na]
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63) ~[tomcat-embed-core-10.1.55.jar!/:na]
at java.base/java.lang.Thread.run(Thread.java:1583) ~[na:na]
Caused by: java.lang.NumberFormatException: For input string: "9223372036854775808"
at java.base/java.lang.NumberFormatException.forInputString(NumberFormatException.java:67) ~[na:na]
at java.base/java.lang.Long.parseLong(Long.java:713) ~[na:na]
at java.base/java.lang.Long.valueOf(Long.java:1157) ~[na:na]
at org.springframework.util.NumberUtils.parseNumber(NumberUtils.java:204) ~[spring-core-6.2.19.jar!/:6.2.19]
at org.springframework.beans.propertyeditors.CustomNumberEditor.setAsText(CustomNumberEditor.java:115) ~[spring-beans-6.2.19.jar!/:6.2.19]
at org.springframework.beans.TypeConverterDelegate.doConvertTextValue(TypeConverterDelegate.java:439) ~[spring-beans-6.2.19.jar!/:6.2.19]
at org.springframework.beans.TypeConverterDelegate.doConvertValue(TypeConverterDelegate.java:412) ~[spring-beans-6.2.19.jar!/:6.2.19]
at org.springframework.beans.TypeConverterDelegate.convertIfNecessary(TypeConverterDelegate.java:161) ~[spring-beans-6.2.19.jar!/:6.2.19]
at org.springframework.beans.TypeConverterSupport.convertIfNecessary(TypeConverterSupport.java:80) ~[spring-beans-6.2.19.jar!/:6.2.19]
at org.springframework.beans.TypeConverterSupport.convertIfNecessary(TypeConverterSupport.java:53) ~[spring-beans-6.2.19.jar!/:6.2.19]
at org.springframework.validation.DataBinder.convertIfNecessary(DataBinder.java:868) ~[spring-context-6.2.19.jar!/:6.2.19]
at org.springframework.web.method.annotation.AbstractNamedValueMethodArgumentResolver.convertIfNecessary(AbstractNamedValueMethodArgumentResolver.java:293) ~[spring-web-6.2.19.jar!/:6.2.19]
... 48 common frames omitted

View File

@ -0,0 +1,503 @@
[INFO] Scanning for projects...
[INFO]
[INFO] ----------------------< com.pandoli365:bibimbap >-----------------------
[INFO] Building bibimbap 0.0.1-SNAPSHOT
[INFO] from pom.xml
[INFO] --------------------------------[ war ]---------------------------------
[INFO]
[INFO] --- dependency-check:12.2.2:check (default-cli) @ bibimbap ---
[INFO] Checking for updates
[WARNING] An NVD API Key was not provided - it is highly recommended to use an NVD API key as the update can take a VERY long time without an API Key
[WARNING] Retrying request /rest/json/cves/2.0?resultsPerPage=2000&startIndex=0 : 2nd time
[WARNING] Retrying request /rest/json/cves/2.0?resultsPerPage=2000&startIndex=0 : 3rd time
[WARNING] Retrying request /rest/json/cves/2.0?resultsPerPage=2000&startIndex=0 : 4th time
[WARNING] Retrying request /rest/json/cves/2.0?resultsPerPage=2000&startIndex=0 : 5th time
[WARNING] Retrying request /rest/json/cves/2.0?resultsPerPage=2000&startIndex=0 : 6th time
[WARNING] Retrying request /rest/json/cves/2.0?resultsPerPage=2000&startIndex=0 : 7th time
[WARNING] Retrying request /rest/json/cves/2.0?resultsPerPage=2000&startIndex=0 : 8th time
[WARNING] Retrying request /rest/json/cves/2.0?resultsPerPage=2000&startIndex=0 : 9th time
[WARNING] Retrying request /rest/json/cves/2.0?resultsPerPage=2000&startIndex=0 : 10th time
[WARNING] Retrying request /rest/json/cves/2.0?resultsPerPage=2000&startIndex=0 : 11th time
[WARNING] Retrying request /rest/json/cves/2.0?resultsPerPage=2000&startIndex=0 : 12th time
[WARNING] Retrying request /rest/json/cves/2.0?resultsPerPage=2000&startIndex=0 : 13th time
[WARNING] Retrying request /rest/json/cves/2.0?resultsPerPage=2000&startIndex=0 : 14th time
[WARNING] NVD API request failures are occurring; retrying request for the 15th time
[WARNING] NVD API request failures are occurring; retrying request for the 16th time
[WARNING] NVD API request failures are occurring; retrying request for the 17th time
[WARNING] NVD API request failures are occurring; retrying request for the 18th time
[WARNING] NVD API request failures are occurring; retrying request for the 19th time
[WARNING] NVD API request failures are occurring; retrying request for the 20th time
[WARNING] NVD API request failures are occurring; retrying request for the 21st time
[WARNING] NVD API request failures are occurring; retrying request for the 22nd time
[WARNING] NVD API request failures are occurring; retrying request for the 23rd time
[WARNING] NVD API request failures are occurring; retrying request for the 24th time
[WARNING] NVD API request failures are occurring; retrying request for the 25th time
[WARNING] NVD API request failures are occurring; retrying request for the 26th time
[WARNING] NVD API request failures are occurring; retrying request for the 27th time
[WARNING] NVD API request failures are occurring; retrying request for the 28th time
[WARNING] NVD API request failures are occurring; retrying request for the 29th time
[WARNING] NVD API request failures are occurring; retrying request for the 30th time
[WARNING] NVD API request failures are occurring; retrying request for the 31st time
[WARNING] Retrying request /rest/json/cves/2.0?resultsPerPage=2000&startIndex=0 : 2nd time
[WARNING] Retrying request /rest/json/cves/2.0?resultsPerPage=2000&startIndex=0 : 3rd time
[WARNING] Retrying request /rest/json/cves/2.0?resultsPerPage=2000&startIndex=0 : 4th time
[WARNING] Retrying request /rest/json/cves/2.0?resultsPerPage=2000&startIndex=0 : 5th time
[WARNING] Retrying request /rest/json/cves/2.0?resultsPerPage=2000&startIndex=0 : 6th time
[WARNING] Retrying request /rest/json/cves/2.0?resultsPerPage=2000&startIndex=0 : 7th time
[WARNING] Retrying request /rest/json/cves/2.0?resultsPerPage=2000&startIndex=0 : 8th time
[WARNING] Retrying request /rest/json/cves/2.0?resultsPerPage=2000&startIndex=0 : 9th time
[WARNING] Retrying request /rest/json/cves/2.0?resultsPerPage=2000&startIndex=0 : 10th time
[WARNING] Retrying request /rest/json/cves/2.0?resultsPerPage=2000&startIndex=0 : 11th time
[WARNING] Retrying request /rest/json/cves/2.0?resultsPerPage=2000&startIndex=0 : 12th time
[WARNING] Retrying request /rest/json/cves/2.0?resultsPerPage=2000&startIndex=0 : 13th time
[WARNING] Retrying request /rest/json/cves/2.0?resultsPerPage=2000&startIndex=0 : 14th time
[WARNING] NVD API request failures are occurring; retrying request for the 15th time
[WARNING] NVD API request failures are occurring; retrying request for the 16th time
[WARNING] NVD API request failures are occurring; retrying request for the 17th time
[WARNING] NVD API request failures are occurring; retrying request for the 18th time
[WARNING] NVD API request failures are occurring; retrying request for the 19th time
[WARNING] NVD API request failures are occurring; retrying request for the 20th time
[WARNING] NVD API request failures are occurring; retrying request for the 21st time
[WARNING] NVD API request failures are occurring; retrying request for the 22nd time
[WARNING] NVD API request failures are occurring; retrying request for the 23rd time
[WARNING] NVD API request failures are occurring; retrying request for the 24th time
[WARNING] NVD API request failures are occurring; retrying request for the 25th time
[WARNING] NVD API request failures are occurring; retrying request for the 26th time
[WARNING] NVD API request failures are occurring; retrying request for the 27th time
[WARNING] NVD API request failures are occurring; retrying request for the 28th time
[WARNING] NVD API request failures are occurring; retrying request for the 29th time
[WARNING] NVD API request failures are occurring; retrying request for the 30th time
[WARNING] NVD API request failures are occurring; retrying request for the 31st time
[WARNING] Retrying request /rest/json/cves/2.0?resultsPerPage=2000&startIndex=0 : 2nd time
[WARNING] Retrying request /rest/json/cves/2.0?resultsPerPage=2000&startIndex=0 : 3rd time
[WARNING] Retrying request /rest/json/cves/2.0?resultsPerPage=2000&startIndex=0 : 4th time
[WARNING] Retrying request /rest/json/cves/2.0?resultsPerPage=2000&startIndex=0 : 5th time
[WARNING] Retrying request /rest/json/cves/2.0?resultsPerPage=2000&startIndex=0 : 6th time
[WARNING] Retrying request /rest/json/cves/2.0?resultsPerPage=2000&startIndex=0 : 7th time
[WARNING] Retrying request /rest/json/cves/2.0?resultsPerPage=2000&startIndex=0 : 8th time
[WARNING] Retrying request /rest/json/cves/2.0?resultsPerPage=2000&startIndex=0 : 9th time
[WARNING] Retrying request /rest/json/cves/2.0?resultsPerPage=2000&startIndex=0 : 10th time
[WARNING] Retrying request /rest/json/cves/2.0?resultsPerPage=2000&startIndex=0 : 11th time
[WARNING] Retrying request /rest/json/cves/2.0?resultsPerPage=2000&startIndex=0 : 12th time
[WARNING] Retrying request /rest/json/cves/2.0?resultsPerPage=2000&startIndex=0 : 13th time
[WARNING] Retrying request /rest/json/cves/2.0?resultsPerPage=2000&startIndex=0 : 14th time
[WARNING] NVD API request failures are occurring; retrying request for the 15th time
[WARNING] NVD API request failures are occurring; retrying request for the 16th time
[WARNING] NVD API request failures are occurring; retrying request for the 17th time
[WARNING] NVD API request failures are occurring; retrying request for the 18th time
[WARNING] NVD API request failures are occurring; retrying request for the 19th time
[WARNING] NVD API request failures are occurring; retrying request for the 20th time
[WARNING] NVD API request failures are occurring; retrying request for the 21st time
[WARNING] NVD API request failures are occurring; retrying request for the 22nd time
[WARNING] NVD API request failures are occurring; retrying request for the 23rd time
[WARNING] NVD API request failures are occurring; retrying request for the 24th time
[WARNING] NVD API request failures are occurring; retrying request for the 25th time
[WARNING] NVD API request failures are occurring; retrying request for the 26th time
[WARNING] NVD API request failures are occurring; retrying request for the 27th time
[WARNING] NVD API request failures are occurring; retrying request for the 28th time
[WARNING] NVD API request failures are occurring; retrying request for the 29th time
[WARNING] NVD API request failures are occurring; retrying request for the 30th time
[WARNING] NVD API request failures are occurring; retrying request for the 31st time
[WARNING] Retrying request /rest/json/cves/2.0?resultsPerPage=2000&startIndex=0 : 2nd time
[WARNING] Retrying request /rest/json/cves/2.0?resultsPerPage=2000&startIndex=0 : 3rd time
[WARNING] Retrying request /rest/json/cves/2.0?resultsPerPage=2000&startIndex=0 : 4th time
[WARNING] Retrying request /rest/json/cves/2.0?resultsPerPage=2000&startIndex=0 : 5th time
[WARNING] Retrying request /rest/json/cves/2.0?resultsPerPage=2000&startIndex=0 : 6th time
[WARNING] Retrying request /rest/json/cves/2.0?resultsPerPage=2000&startIndex=0 : 7th time
[WARNING] Retrying request /rest/json/cves/2.0?resultsPerPage=2000&startIndex=0 : 8th time
[WARNING] Retrying request /rest/json/cves/2.0?resultsPerPage=2000&startIndex=0 : 9th time
[WARNING] Retrying request /rest/json/cves/2.0?resultsPerPage=2000&startIndex=0 : 10th time
[WARNING] Retrying request /rest/json/cves/2.0?resultsPerPage=2000&startIndex=0 : 11th time
[WARNING] Retrying request /rest/json/cves/2.0?resultsPerPage=2000&startIndex=0 : 12th time
[WARNING] Retrying request /rest/json/cves/2.0?resultsPerPage=2000&startIndex=0 : 13th time
[WARNING] Retrying request /rest/json/cves/2.0?resultsPerPage=2000&startIndex=0 : 14th time
[WARNING] NVD API request failures are occurring; retrying request for the 15th time
[WARNING] NVD API request failures are occurring; retrying request for the 16th time
[WARNING] NVD API request failures are occurring; retrying request for the 17th time
[WARNING] NVD API request failures are occurring; retrying request for the 18th time
[WARNING] NVD API request failures are occurring; retrying request for the 19th time
[WARNING] NVD API request failures are occurring; retrying request for the 20th time
[WARNING] NVD API request failures are occurring; retrying request for the 21st time
[WARNING] NVD API request failures are occurring; retrying request for the 22nd time
[WARNING] NVD API request failures are occurring; retrying request for the 23rd time
[WARNING] NVD API request failures are occurring; retrying request for the 24th time
[WARNING] NVD API request failures are occurring; retrying request for the 25th time
[WARNING] NVD API request failures are occurring; retrying request for the 26th time
[WARNING] NVD API request failures are occurring; retrying request for the 27th time
[WARNING] NVD API request failures are occurring; retrying request for the 28th time
[WARNING] NVD API request failures are occurring; retrying request for the 29th time
[WARNING] NVD API request failures are occurring; retrying request for the 30th time
[WARNING] NVD API request failures are occurring; retrying request for the 31st time
[WARNING] Retrying request /rest/json/cves/2.0?resultsPerPage=2000&startIndex=0 : 2nd time
[WARNING] Retrying request /rest/json/cves/2.0?resultsPerPage=2000&startIndex=0 : 3rd time
[WARNING] Retrying request /rest/json/cves/2.0?resultsPerPage=2000&startIndex=0 : 4th time
[WARNING] Retrying request /rest/json/cves/2.0?resultsPerPage=2000&startIndex=0 : 5th time
[WARNING] Retrying request /rest/json/cves/2.0?resultsPerPage=2000&startIndex=0 : 6th time
[WARNING] Retrying request /rest/json/cves/2.0?resultsPerPage=2000&startIndex=0 : 7th time
[WARNING] Retrying request /rest/json/cves/2.0?resultsPerPage=2000&startIndex=0 : 8th time
[WARNING] Retrying request /rest/json/cves/2.0?resultsPerPage=2000&startIndex=0 : 9th time
[WARNING] Retrying request /rest/json/cves/2.0?resultsPerPage=2000&startIndex=0 : 10th time
[WARNING] Retrying request /rest/json/cves/2.0?resultsPerPage=2000&startIndex=0 : 11th time
[WARNING] Retrying request /rest/json/cves/2.0?resultsPerPage=2000&startIndex=0 : 12th time
[WARNING] Retrying request /rest/json/cves/2.0?resultsPerPage=2000&startIndex=0 : 13th time
[WARNING] Retrying request /rest/json/cves/2.0?resultsPerPage=2000&startIndex=0 : 14th time
[WARNING] NVD API request failures are occurring; retrying request for the 15th time
[WARNING] NVD API request failures are occurring; retrying request for the 16th time
[WARNING] NVD API request failures are occurring; retrying request for the 17th time
[WARNING] NVD API request failures are occurring; retrying request for the 18th time
[WARNING] NVD API request failures are occurring; retrying request for the 19th time
[WARNING] NVD API request failures are occurring; retrying request for the 20th time
[WARNING] NVD API request failures are occurring; retrying request for the 21st time
[WARNING] NVD API request failures are occurring; retrying request for the 22nd time
[WARNING] NVD API request failures are occurring; retrying request for the 23rd time
[WARNING] NVD API request failures are occurring; retrying request for the 24th time
[WARNING] NVD API request failures are occurring; retrying request for the 25th time
[WARNING] NVD API request failures are occurring; retrying request for the 26th time
[WARNING] NVD API request failures are occurring; retrying request for the 27th time
[WARNING] NVD API request failures are occurring; retrying request for the 28th time
[WARNING] NVD API request failures are occurring; retrying request for the 29th time
[WARNING] NVD API request failures are occurring; retrying request for the 30th time
[WARNING] NVD API request failures are occurring; retrying request for the 31st time
[WARNING] Retrying request /rest/json/cves/2.0?resultsPerPage=2000&startIndex=0 : 2nd time
[WARNING] Retrying request /rest/json/cves/2.0?resultsPerPage=2000&startIndex=0 : 3rd time
[WARNING] Retrying request /rest/json/cves/2.0?resultsPerPage=2000&startIndex=0 : 4th time
[WARNING] Retrying request /rest/json/cves/2.0?resultsPerPage=2000&startIndex=0 : 5th time
[WARNING] Retrying request /rest/json/cves/2.0?resultsPerPage=2000&startIndex=0 : 6th time
[WARNING] Retrying request /rest/json/cves/2.0?resultsPerPage=2000&startIndex=0 : 7th time
[WARNING] Retrying request /rest/json/cves/2.0?resultsPerPage=2000&startIndex=0 : 8th time
[WARNING] Retrying request /rest/json/cves/2.0?resultsPerPage=2000&startIndex=0 : 9th time
[WARNING] Retrying request /rest/json/cves/2.0?resultsPerPage=2000&startIndex=0 : 10th time
[WARNING] Retrying request /rest/json/cves/2.0?resultsPerPage=2000&startIndex=0 : 11th time
[WARNING] Retrying request /rest/json/cves/2.0?resultsPerPage=2000&startIndex=0 : 12th time
[WARNING] Retrying request /rest/json/cves/2.0?resultsPerPage=2000&startIndex=0 : 13th time
[WARNING] Retrying request /rest/json/cves/2.0?resultsPerPage=2000&startIndex=0 : 14th time
[WARNING] NVD API request failures are occurring; retrying request for the 15th time
[WARNING] NVD API request failures are occurring; retrying request for the 16th time
[WARNING] NVD API request failures are occurring; retrying request for the 17th time
[WARNING] NVD API request failures are occurring; retrying request for the 18th time
[WARNING] NVD API request failures are occurring; retrying request for the 19th time
[WARNING] NVD API request failures are occurring; retrying request for the 20th time
[WARNING] NVD API request failures are occurring; retrying request for the 21st time
[WARNING] NVD API request failures are occurring; retrying request for the 22nd time
[WARNING] NVD API request failures are occurring; retrying request for the 23rd time
[WARNING] NVD API request failures are occurring; retrying request for the 24th time
[WARNING] NVD API request failures are occurring; retrying request for the 25th time
[WARNING] NVD API request failures are occurring; retrying request for the 26th time
[WARNING] NVD API request failures are occurring; retrying request for the 27th time
[WARNING] NVD API request failures are occurring; retrying request for the 28th time
[WARNING] NVD API request failures are occurring; retrying request for the 29th time
[WARNING] NVD API request failures are occurring; retrying request for the 30th time
[WARNING] NVD API request failures are occurring; retrying request for the 31st time
[ERROR] Error updating the NVD Data
org.owasp.dependencycheck.data.update.exception.UpdateException: Error updating the NVD Data
at org.owasp.dependencycheck.data.update.NvdApiDataSource.processApi (NvdApiDataSource.java:387)
at org.owasp.dependencycheck.data.update.NvdApiDataSource.update (NvdApiDataSource.java:128)
at org.owasp.dependencycheck.Engine.doUpdates (Engine.java:887)
at org.owasp.dependencycheck.Engine.initializeAndUpdateDatabase (Engine.java:692)
at org.owasp.dependencycheck.Engine.analyzeDependencies (Engine.java:619)
at org.owasp.dependencycheck.maven.BaseDependencyCheckMojo.runCheck (BaseDependencyCheckMojo.java:2093)
at org.owasp.dependencycheck.maven.BaseDependencyCheckMojo.execute (BaseDependencyCheckMojo.java:1291)
at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo (DefaultBuildPluginManager.java:126)
at org.apache.maven.lifecycle.internal.MojoExecutor.doExecute2 (MojoExecutor.java:328)
at org.apache.maven.lifecycle.internal.MojoExecutor.doExecute (MojoExecutor.java:316)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:212)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:174)
at org.apache.maven.lifecycle.internal.MojoExecutor.access$000 (MojoExecutor.java:75)
at org.apache.maven.lifecycle.internal.MojoExecutor$1.run (MojoExecutor.java:162)
at org.apache.maven.plugin.DefaultMojosExecutionStrategy.execute (DefaultMojosExecutionStrategy.java:39)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:159)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:105)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:73)
at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build (SingleThreadedBuilder.java:53)
at org.apache.maven.lifecycle.internal.LifecycleStarter.execute (LifecycleStarter.java:118)
at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:261)
at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:173)
at org.apache.maven.DefaultMaven.execute (DefaultMaven.java:101)
at org.apache.maven.cli.MavenCli.execute (MavenCli.java:919)
at org.apache.maven.cli.MavenCli.doMain (MavenCli.java:285)
at org.apache.maven.cli.MavenCli.main (MavenCli.java:207)
at jdk.internal.reflect.DirectMethodHandleAccessor.invoke (DirectMethodHandleAccessor.java:103)
at java.lang.reflect.Method.invoke (Method.java:580)
at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced (Launcher.java:255)
at org.codehaus.plexus.classworlds.launcher.Launcher.launch (Launcher.java:201)
at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode (Launcher.java:362)
at org.codehaus.plexus.classworlds.launcher.Launcher.main (Launcher.java:314)
Caused by: io.github.jeremylong.openvulnerability.client.nvd.NvdApiRetryExceededException: NVD Update Failed: attempted to retrieve data from the NVD unsuccessfully five times.
at io.github.jeremylong.openvulnerability.client.nvd.NvdCveClient._next (NvdCveClient.java:361)
at io.github.jeremylong.openvulnerability.client.nvd.NvdCveClient._next (NvdCveClient.java:456)
at io.github.jeremylong.openvulnerability.client.nvd.NvdCveClient._next (NvdCveClient.java:456)
at io.github.jeremylong.openvulnerability.client.nvd.NvdCveClient._next (NvdCveClient.java:456)
at io.github.jeremylong.openvulnerability.client.nvd.NvdCveClient._next (NvdCveClient.java:456)
at io.github.jeremylong.openvulnerability.client.nvd.NvdCveClient._next (NvdCveClient.java:456)
at io.github.jeremylong.openvulnerability.client.nvd.NvdCveClient._next (NvdCveClient.java:456)
at io.github.jeremylong.openvulnerability.client.nvd.NvdCveClient.next (NvdCveClient.java:356)
at org.owasp.dependencycheck.data.update.NvdApiDataSource.processApi (NvdApiDataSource.java:343)
at org.owasp.dependencycheck.data.update.NvdApiDataSource.update (NvdApiDataSource.java:128)
at org.owasp.dependencycheck.Engine.doUpdates (Engine.java:887)
at org.owasp.dependencycheck.Engine.initializeAndUpdateDatabase (Engine.java:692)
at org.owasp.dependencycheck.Engine.analyzeDependencies (Engine.java:619)
at org.owasp.dependencycheck.maven.BaseDependencyCheckMojo.runCheck (BaseDependencyCheckMojo.java:2093)
at org.owasp.dependencycheck.maven.BaseDependencyCheckMojo.execute (BaseDependencyCheckMojo.java:1291)
at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo (DefaultBuildPluginManager.java:126)
at org.apache.maven.lifecycle.internal.MojoExecutor.doExecute2 (MojoExecutor.java:328)
at org.apache.maven.lifecycle.internal.MojoExecutor.doExecute (MojoExecutor.java:316)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:212)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:174)
at org.apache.maven.lifecycle.internal.MojoExecutor.access$000 (MojoExecutor.java:75)
at org.apache.maven.lifecycle.internal.MojoExecutor$1.run (MojoExecutor.java:162)
at org.apache.maven.plugin.DefaultMojosExecutionStrategy.execute (DefaultMojosExecutionStrategy.java:39)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:159)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:105)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:73)
at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build (SingleThreadedBuilder.java:53)
at org.apache.maven.lifecycle.internal.LifecycleStarter.execute (LifecycleStarter.java:118)
at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:261)
at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:173)
at org.apache.maven.DefaultMaven.execute (DefaultMaven.java:101)
at org.apache.maven.cli.MavenCli.execute (MavenCli.java:919)
at org.apache.maven.cli.MavenCli.doMain (MavenCli.java:285)
at org.apache.maven.cli.MavenCli.main (MavenCli.java:207)
at jdk.internal.reflect.DirectMethodHandleAccessor.invoke (DirectMethodHandleAccessor.java:103)
at java.lang.reflect.Method.invoke (Method.java:580)
at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced (Launcher.java:255)
at org.codehaus.plexus.classworlds.launcher.Launcher.launch (Launcher.java:201)
at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode (Launcher.java:362)
at org.codehaus.plexus.classworlds.launcher.Launcher.main (Launcher.java:314)
[WARNING] Failed to update hosted suppressions file, results may contain false positives already resolved by the DependencyCheck project
org.owasp.dependencycheck.data.update.exception.UpdateException: Failed to update the hosted suppressions file
at org.owasp.dependencycheck.data.update.HostedSuppressionsDataSource.fetchHostedSuppressions (HostedSuppressionsDataSource.java:137)
at org.owasp.dependencycheck.data.update.HostedSuppressionsDataSource.update (HostedSuppressionsDataSource.java:78)
at org.owasp.dependencycheck.Engine.doUpdates (Engine.java:887)
at org.owasp.dependencycheck.Engine.initializeAndUpdateDatabase (Engine.java:692)
at org.owasp.dependencycheck.Engine.analyzeDependencies (Engine.java:619)
at org.owasp.dependencycheck.maven.BaseDependencyCheckMojo.runCheck (BaseDependencyCheckMojo.java:2093)
at org.owasp.dependencycheck.maven.BaseDependencyCheckMojo.execute (BaseDependencyCheckMojo.java:1291)
at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo (DefaultBuildPluginManager.java:126)
at org.apache.maven.lifecycle.internal.MojoExecutor.doExecute2 (MojoExecutor.java:328)
at org.apache.maven.lifecycle.internal.MojoExecutor.doExecute (MojoExecutor.java:316)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:212)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:174)
at org.apache.maven.lifecycle.internal.MojoExecutor.access$000 (MojoExecutor.java:75)
at org.apache.maven.lifecycle.internal.MojoExecutor$1.run (MojoExecutor.java:162)
at org.apache.maven.plugin.DefaultMojosExecutionStrategy.execute (DefaultMojosExecutionStrategy.java:39)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:159)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:105)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:73)
at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build (SingleThreadedBuilder.java:53)
at org.apache.maven.lifecycle.internal.LifecycleStarter.execute (LifecycleStarter.java:118)
at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:261)
at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:173)
at org.apache.maven.DefaultMaven.execute (DefaultMaven.java:101)
at org.apache.maven.cli.MavenCli.execute (MavenCli.java:919)
at org.apache.maven.cli.MavenCli.doMain (MavenCli.java:285)
at org.apache.maven.cli.MavenCli.main (MavenCli.java:207)
at jdk.internal.reflect.DirectMethodHandleAccessor.invoke (DirectMethodHandleAccessor.java:103)
at java.lang.reflect.Method.invoke (Method.java:580)
at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced (Launcher.java:255)
at org.codehaus.plexus.classworlds.launcher.Launcher.launch (Launcher.java:201)
at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode (Launcher.java:362)
at org.codehaus.plexus.classworlds.launcher.Launcher.main (Launcher.java:314)
Caused by: org.owasp.dependencycheck.utils.DownloadFailedException: Download failed, unable to copy 'https://dependency-check.github.io/DependencyCheck/suppressions/publishedSuppressions.xml' to '/root/.m2/repository/org/owasp/dependency-check-utils/12.2.2/../../dependency-check-data/11.0/publishedSuppressions.xml'; Network is unreachable
at org.owasp.dependencycheck.utils.Downloader.fetchFile (Downloader.java:425)
at org.owasp.dependencycheck.utils.Downloader.fetchFile (Downloader.java:384)
at org.owasp.dependencycheck.data.update.HostedSuppressionsDataSource.fetchHostedSuppressions (HostedSuppressionsDataSource.java:135)
at org.owasp.dependencycheck.data.update.HostedSuppressionsDataSource.update (HostedSuppressionsDataSource.java:78)
at org.owasp.dependencycheck.Engine.doUpdates (Engine.java:887)
at org.owasp.dependencycheck.Engine.initializeAndUpdateDatabase (Engine.java:692)
at org.owasp.dependencycheck.Engine.analyzeDependencies (Engine.java:619)
at org.owasp.dependencycheck.maven.BaseDependencyCheckMojo.runCheck (BaseDependencyCheckMojo.java:2093)
at org.owasp.dependencycheck.maven.BaseDependencyCheckMojo.execute (BaseDependencyCheckMojo.java:1291)
at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo (DefaultBuildPluginManager.java:126)
at org.apache.maven.lifecycle.internal.MojoExecutor.doExecute2 (MojoExecutor.java:328)
at org.apache.maven.lifecycle.internal.MojoExecutor.doExecute (MojoExecutor.java:316)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:212)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:174)
at org.apache.maven.lifecycle.internal.MojoExecutor.access$000 (MojoExecutor.java:75)
at org.apache.maven.lifecycle.internal.MojoExecutor$1.run (MojoExecutor.java:162)
at org.apache.maven.plugin.DefaultMojosExecutionStrategy.execute (DefaultMojosExecutionStrategy.java:39)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:159)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:105)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:73)
at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build (SingleThreadedBuilder.java:53)
at org.apache.maven.lifecycle.internal.LifecycleStarter.execute (LifecycleStarter.java:118)
at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:261)
at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:173)
at org.apache.maven.DefaultMaven.execute (DefaultMaven.java:101)
at org.apache.maven.cli.MavenCli.execute (MavenCli.java:919)
at org.apache.maven.cli.MavenCli.doMain (MavenCli.java:285)
at org.apache.maven.cli.MavenCli.main (MavenCli.java:207)
at jdk.internal.reflect.DirectMethodHandleAccessor.invoke (DirectMethodHandleAccessor.java:103)
at java.lang.reflect.Method.invoke (Method.java:580)
at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced (Launcher.java:255)
at org.codehaus.plexus.classworlds.launcher.Launcher.launch (Launcher.java:201)
at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode (Launcher.java:362)
at org.codehaus.plexus.classworlds.launcher.Launcher.main (Launcher.java:314)
Caused by: java.net.SocketException: Network is unreachable
at sun.nio.ch.Net.connect0 (Native Method)
at sun.nio.ch.Net.connect (Net.java:601)
at sun.nio.ch.Net.connect (Net.java:590)
at sun.nio.ch.NioSocketImpl.connect (NioSocketImpl.java:583)
at java.net.SocksSocketImpl.connect (SocksSocketImpl.java:327)
at java.net.Socket.connect (Socket.java:751)
at org.apache.hc.client5.http.impl.io.DefaultHttpClientConnectionOperator.connect (DefaultHttpClientConnectionOperator.java:219)
at org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManager.connect (PoolingHttpClientConnectionManager.java:547)
at org.apache.hc.client5.http.impl.classic.InternalExecRuntime.connectEndpoint (InternalExecRuntime.java:164)
at org.apache.hc.client5.http.impl.classic.InternalExecRuntime.connectEndpoint (InternalExecRuntime.java:174)
at org.apache.hc.client5.http.impl.classic.ConnectExec.execute (ConnectExec.java:144)
at org.apache.hc.client5.http.impl.classic.ExecChainElement.execute (ExecChainElement.java:51)
at org.apache.hc.client5.http.impl.classic.ProtocolExec.execute (ProtocolExec.java:192)
at org.apache.hc.client5.http.impl.classic.ExecChainElement.execute (ExecChainElement.java:51)
at org.apache.hc.client5.http.impl.classic.ContentCompressionExec.execute (ContentCompressionExec.java:138)
at org.apache.hc.client5.http.impl.classic.ExecChainElement.execute (ExecChainElement.java:51)
at org.apache.hc.client5.http.impl.classic.HttpRequestRetryExec.execute (HttpRequestRetryExec.java:112)
at org.apache.hc.client5.http.impl.classic.ExecChainElement.execute (ExecChainElement.java:51)
at org.apache.hc.client5.http.impl.classic.RedirectExec.execute (RedirectExec.java:110)
at org.apache.hc.client5.http.impl.classic.ExecChainElement.execute (ExecChainElement.java:51)
at org.apache.hc.client5.http.impl.classic.InternalHttpClient.doExecute (InternalHttpClient.java:185)
at org.apache.hc.client5.http.impl.classic.CloseableHttpClient.execute (CloseableHttpClient.java:245)
at org.apache.hc.client5.http.impl.classic.CloseableHttpClient.execute (CloseableHttpClient.java:188)
at org.owasp.dependencycheck.utils.Downloader.fetchFile (Downloader.java:410)
at org.owasp.dependencycheck.utils.Downloader.fetchFile (Downloader.java:384)
at org.owasp.dependencycheck.data.update.HostedSuppressionsDataSource.fetchHostedSuppressions (HostedSuppressionsDataSource.java:135)
at org.owasp.dependencycheck.data.update.HostedSuppressionsDataSource.update (HostedSuppressionsDataSource.java:78)
at org.owasp.dependencycheck.Engine.doUpdates (Engine.java:887)
at org.owasp.dependencycheck.Engine.initializeAndUpdateDatabase (Engine.java:692)
at org.owasp.dependencycheck.Engine.analyzeDependencies (Engine.java:619)
at org.owasp.dependencycheck.maven.BaseDependencyCheckMojo.runCheck (BaseDependencyCheckMojo.java:2093)
at org.owasp.dependencycheck.maven.BaseDependencyCheckMojo.execute (BaseDependencyCheckMojo.java:1291)
at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo (DefaultBuildPluginManager.java:126)
at org.apache.maven.lifecycle.internal.MojoExecutor.doExecute2 (MojoExecutor.java:328)
at org.apache.maven.lifecycle.internal.MojoExecutor.doExecute (MojoExecutor.java:316)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:212)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:174)
at org.apache.maven.lifecycle.internal.MojoExecutor.access$000 (MojoExecutor.java:75)
at org.apache.maven.lifecycle.internal.MojoExecutor$1.run (MojoExecutor.java:162)
at org.apache.maven.plugin.DefaultMojosExecutionStrategy.execute (DefaultMojosExecutionStrategy.java:39)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:159)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:105)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:73)
at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build (SingleThreadedBuilder.java:53)
at org.apache.maven.lifecycle.internal.LifecycleStarter.execute (LifecycleStarter.java:118)
at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:261)
at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:173)
at org.apache.maven.DefaultMaven.execute (DefaultMaven.java:101)
at org.apache.maven.cli.MavenCli.execute (MavenCli.java:919)
at org.apache.maven.cli.MavenCli.doMain (MavenCli.java:285)
at org.apache.maven.cli.MavenCli.main (MavenCli.java:207)
at jdk.internal.reflect.DirectMethodHandleAccessor.invoke (DirectMethodHandleAccessor.java:103)
at java.lang.reflect.Method.invoke (Method.java:580)
at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced (Launcher.java:255)
at org.codehaus.plexus.classworlds.launcher.Launcher.launch (Launcher.java:201)
at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode (Launcher.java:362)
at org.codehaus.plexus.classworlds.launcher.Launcher.main (Launcher.java:314)
[INFO] Updating CISA Known Exploited Vulnerability list: https://www.cisa.gov/sites/default/files/feeds/known_exploited_vulnerabilities.json
[ERROR] java.net.SocketException: Network is unreachable
org.owasp.dependencycheck.data.update.exception.UpdateException: java.net.SocketException: Network is unreachable
at org.owasp.dependencycheck.data.update.KnownExploitedDataSource.update (KnownExploitedDataSource.java:106)
at org.owasp.dependencycheck.Engine.doUpdates (Engine.java:887)
at org.owasp.dependencycheck.Engine.initializeAndUpdateDatabase (Engine.java:692)
at org.owasp.dependencycheck.Engine.analyzeDependencies (Engine.java:619)
at org.owasp.dependencycheck.maven.BaseDependencyCheckMojo.runCheck (BaseDependencyCheckMojo.java:2093)
at org.owasp.dependencycheck.maven.BaseDependencyCheckMojo.execute (BaseDependencyCheckMojo.java:1291)
at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo (DefaultBuildPluginManager.java:126)
at org.apache.maven.lifecycle.internal.MojoExecutor.doExecute2 (MojoExecutor.java:328)
at org.apache.maven.lifecycle.internal.MojoExecutor.doExecute (MojoExecutor.java:316)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:212)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:174)
at org.apache.maven.lifecycle.internal.MojoExecutor.access$000 (MojoExecutor.java:75)
at org.apache.maven.lifecycle.internal.MojoExecutor$1.run (MojoExecutor.java:162)
at org.apache.maven.plugin.DefaultMojosExecutionStrategy.execute (DefaultMojosExecutionStrategy.java:39)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:159)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:105)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:73)
at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build (SingleThreadedBuilder.java:53)
at org.apache.maven.lifecycle.internal.LifecycleStarter.execute (LifecycleStarter.java:118)
at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:261)
at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:173)
at org.apache.maven.DefaultMaven.execute (DefaultMaven.java:101)
at org.apache.maven.cli.MavenCli.execute (MavenCli.java:919)
at org.apache.maven.cli.MavenCli.doMain (MavenCli.java:285)
at org.apache.maven.cli.MavenCli.main (MavenCli.java:207)
at jdk.internal.reflect.DirectMethodHandleAccessor.invoke (DirectMethodHandleAccessor.java:103)
at java.lang.reflect.Method.invoke (Method.java:580)
at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced (Launcher.java:255)
at org.codehaus.plexus.classworlds.launcher.Launcher.launch (Launcher.java:201)
at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode (Launcher.java:362)
at org.codehaus.plexus.classworlds.launcher.Launcher.main (Launcher.java:314)
Caused by: java.net.SocketException: Network is unreachable
at sun.nio.ch.Net.connect0 (Native Method)
at sun.nio.ch.Net.connect (Net.java:601)
at sun.nio.ch.Net.connect (Net.java:590)
at sun.nio.ch.NioSocketImpl.connect (NioSocketImpl.java:583)
at java.net.SocksSocketImpl.connect (SocksSocketImpl.java:327)
at java.net.Socket.connect (Socket.java:751)
at org.apache.hc.client5.http.impl.io.DefaultHttpClientConnectionOperator.connect (DefaultHttpClientConnectionOperator.java:219)
at org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManager.connect (PoolingHttpClientConnectionManager.java:547)
at org.apache.hc.client5.http.impl.classic.InternalExecRuntime.connectEndpoint (InternalExecRuntime.java:164)
at org.apache.hc.client5.http.impl.classic.InternalExecRuntime.connectEndpoint (InternalExecRuntime.java:174)
at org.apache.hc.client5.http.impl.classic.ConnectExec.execute (ConnectExec.java:144)
at org.apache.hc.client5.http.impl.classic.ExecChainElement.execute (ExecChainElement.java:51)
at org.apache.hc.client5.http.impl.classic.ProtocolExec.execute (ProtocolExec.java:192)
at org.apache.hc.client5.http.impl.classic.ExecChainElement.execute (ExecChainElement.java:51)
at org.apache.hc.client5.http.impl.classic.ContentCompressionExec.execute (ContentCompressionExec.java:138)
at org.apache.hc.client5.http.impl.classic.ExecChainElement.execute (ExecChainElement.java:51)
at org.apache.hc.client5.http.impl.classic.HttpRequestRetryExec.execute (HttpRequestRetryExec.java:112)
at org.apache.hc.client5.http.impl.classic.ExecChainElement.execute (ExecChainElement.java:51)
at org.apache.hc.client5.http.impl.classic.RedirectExec.execute (RedirectExec.java:110)
at org.apache.hc.client5.http.impl.classic.ExecChainElement.execute (ExecChainElement.java:51)
at org.apache.hc.client5.http.impl.classic.InternalHttpClient.doExecute (InternalHttpClient.java:185)
at org.apache.hc.client5.http.impl.classic.CloseableHttpClient.execute (CloseableHttpClient.java:245)
at org.apache.hc.client5.http.impl.classic.CloseableHttpClient.execute (CloseableHttpClient.java:188)
at org.owasp.dependencycheck.utils.Downloader.fetchAndHandle (Downloader.java:732)
at org.owasp.dependencycheck.utils.Downloader.fetchAndHandle (Downloader.java:701)
at org.owasp.dependencycheck.utils.Downloader.fetchAndHandle (Downloader.java:653)
at org.owasp.dependencycheck.data.update.KnownExploitedDataSource.update (KnownExploitedDataSource.java:96)
at org.owasp.dependencycheck.Engine.doUpdates (Engine.java:887)
at org.owasp.dependencycheck.Engine.initializeAndUpdateDatabase (Engine.java:692)
at org.owasp.dependencycheck.Engine.analyzeDependencies (Engine.java:619)
at org.owasp.dependencycheck.maven.BaseDependencyCheckMojo.runCheck (BaseDependencyCheckMojo.java:2093)
at org.owasp.dependencycheck.maven.BaseDependencyCheckMojo.execute (BaseDependencyCheckMojo.java:1291)
at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo (DefaultBuildPluginManager.java:126)
at org.apache.maven.lifecycle.internal.MojoExecutor.doExecute2 (MojoExecutor.java:328)
at org.apache.maven.lifecycle.internal.MojoExecutor.doExecute (MojoExecutor.java:316)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:212)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:174)
at org.apache.maven.lifecycle.internal.MojoExecutor.access$000 (MojoExecutor.java:75)
at org.apache.maven.lifecycle.internal.MojoExecutor$1.run (MojoExecutor.java:162)
at org.apache.maven.plugin.DefaultMojosExecutionStrategy.execute (DefaultMojosExecutionStrategy.java:39)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:159)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:105)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:73)
at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build (SingleThreadedBuilder.java:53)
at org.apache.maven.lifecycle.internal.LifecycleStarter.execute (LifecycleStarter.java:118)
at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:261)
at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:173)
at org.apache.maven.DefaultMaven.execute (DefaultMaven.java:101)
at org.apache.maven.cli.MavenCli.execute (MavenCli.java:919)
at org.apache.maven.cli.MavenCli.doMain (MavenCli.java:285)
at org.apache.maven.cli.MavenCli.main (MavenCli.java:207)
at jdk.internal.reflect.DirectMethodHandleAccessor.invoke (DirectMethodHandleAccessor.java:103)
at java.lang.reflect.Method.invoke (Method.java:580)
at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced (Launcher.java:255)
at org.codehaus.plexus.classworlds.launcher.Launcher.launch (Launcher.java:201)
at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode (Launcher.java:362)
at org.codehaus.plexus.classworlds.launcher.Launcher.main (Launcher.java:314)
[WARNING] Unable to update 1 or more Cached Web DataSource, using local data instead. Results may not include recent vulnerabilities.
[ERROR] Unable to continue dependency-check analysis.
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 01:33 min
[INFO] Finished at: 2026-09-22T02:53:12Z
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.owasp:dependency-check-maven:12.2.2:check (default-cli) on project bibimbap: Fatal exception(s) analyzing bibimbap: One or more exceptions occurred during analysis:
[ERROR] UpdateException: java.net.SocketException: Network is unreachable
[ERROR] caused by SocketException: Network is unreachable
[ERROR] NoDataException: No documents exist
[ERROR] -> [Help 1]
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException

View File

@ -0,0 +1,99 @@
[INFO] Scanning for projects...
[INFO]
[INFO] ----------------------< com.pandoli365:bibimbap >-----------------------
[INFO] Building bibimbap 0.0.1-SNAPSHOT
[INFO] from pom.xml
[INFO] --------------------------------[ war ]---------------------------------
[INFO]
[INFO] --- dependency-check:12.2.2:check (default-cli) @ bibimbap ---
[INFO] Checking for updates
[WARNING] An NVD API Key was not provided - it is highly recommended to use an NVD API key as the update can take a VERY long time without an API Key
[INFO] NVD API has 395,957 records in this update
[ERROR] Error updating the NVD Data
org.owasp.dependencycheck.data.update.exception.UpdateException: Error updating the NVD Data
at org.owasp.dependencycheck.data.update.NvdApiDataSource.processApi (NvdApiDataSource.java:387)
at org.owasp.dependencycheck.data.update.NvdApiDataSource.update (NvdApiDataSource.java:128)
at org.owasp.dependencycheck.Engine.doUpdates (Engine.java:887)
at org.owasp.dependencycheck.Engine.initializeAndUpdateDatabase (Engine.java:692)
at org.owasp.dependencycheck.Engine.analyzeDependencies (Engine.java:619)
at org.owasp.dependencycheck.maven.BaseDependencyCheckMojo.runCheck (BaseDependencyCheckMojo.java:2093)
at org.owasp.dependencycheck.maven.BaseDependencyCheckMojo.execute (BaseDependencyCheckMojo.java:1291)
at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo (DefaultBuildPluginManager.java:126)
at org.apache.maven.lifecycle.internal.MojoExecutor.doExecute2 (MojoExecutor.java:328)
at org.apache.maven.lifecycle.internal.MojoExecutor.doExecute (MojoExecutor.java:316)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:212)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:174)
at org.apache.maven.lifecycle.internal.MojoExecutor.access$000 (MojoExecutor.java:75)
at org.apache.maven.lifecycle.internal.MojoExecutor$1.run (MojoExecutor.java:162)
at org.apache.maven.plugin.DefaultMojosExecutionStrategy.execute (DefaultMojosExecutionStrategy.java:39)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:159)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:105)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:73)
at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build (SingleThreadedBuilder.java:53)
at org.apache.maven.lifecycle.internal.LifecycleStarter.execute (LifecycleStarter.java:118)
at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:261)
at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:173)
at org.apache.maven.DefaultMaven.execute (DefaultMaven.java:101)
at org.apache.maven.cli.MavenCli.execute (MavenCli.java:919)
at org.apache.maven.cli.MavenCli.doMain (MavenCli.java:285)
at org.apache.maven.cli.MavenCli.main (MavenCli.java:207)
at jdk.internal.reflect.DirectMethodHandleAccessor.invoke (DirectMethodHandleAccessor.java:103)
at java.lang.reflect.Method.invoke (Method.java:580)
at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced (Launcher.java:255)
at org.codehaus.plexus.classworlds.launcher.Launcher.launch (Launcher.java:201)
at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode (Launcher.java:362)
at org.codehaus.plexus.classworlds.launcher.Launcher.main (Launcher.java:314)
Caused by: io.github.jeremylong.openvulnerability.client.nvd.NvdApiRetryExceededException: NVD Update Failed: attempted to retrieve data from the NVD unsuccessfully five times.
at io.github.jeremylong.openvulnerability.client.nvd.NvdCveClient._next (NvdCveClient.java:361)
at io.github.jeremylong.openvulnerability.client.nvd.NvdCveClient._next (NvdCveClient.java:456)
at io.github.jeremylong.openvulnerability.client.nvd.NvdCveClient._next (NvdCveClient.java:456)
at io.github.jeremylong.openvulnerability.client.nvd.NvdCveClient._next (NvdCveClient.java:456)
at io.github.jeremylong.openvulnerability.client.nvd.NvdCveClient._next (NvdCveClient.java:456)
at io.github.jeremylong.openvulnerability.client.nvd.NvdCveClient._next (NvdCveClient.java:456)
at io.github.jeremylong.openvulnerability.client.nvd.NvdCveClient._next (NvdCveClient.java:456)
at io.github.jeremylong.openvulnerability.client.nvd.NvdCveClient.next (NvdCveClient.java:356)
at org.owasp.dependencycheck.data.update.NvdApiDataSource.processApi (NvdApiDataSource.java:343)
at org.owasp.dependencycheck.data.update.NvdApiDataSource.update (NvdApiDataSource.java:128)
at org.owasp.dependencycheck.Engine.doUpdates (Engine.java:887)
at org.owasp.dependencycheck.Engine.initializeAndUpdateDatabase (Engine.java:692)
at org.owasp.dependencycheck.Engine.analyzeDependencies (Engine.java:619)
at org.owasp.dependencycheck.maven.BaseDependencyCheckMojo.runCheck (BaseDependencyCheckMojo.java:2093)
at org.owasp.dependencycheck.maven.BaseDependencyCheckMojo.execute (BaseDependencyCheckMojo.java:1291)
at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo (DefaultBuildPluginManager.java:126)
at org.apache.maven.lifecycle.internal.MojoExecutor.doExecute2 (MojoExecutor.java:328)
at org.apache.maven.lifecycle.internal.MojoExecutor.doExecute (MojoExecutor.java:316)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:212)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:174)
at org.apache.maven.lifecycle.internal.MojoExecutor.access$000 (MojoExecutor.java:75)
at org.apache.maven.lifecycle.internal.MojoExecutor$1.run (MojoExecutor.java:162)
at org.apache.maven.plugin.DefaultMojosExecutionStrategy.execute (DefaultMojosExecutionStrategy.java:39)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:159)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:105)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:73)
at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build (SingleThreadedBuilder.java:53)
at org.apache.maven.lifecycle.internal.LifecycleStarter.execute (LifecycleStarter.java:118)
at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:261)
at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:173)
at org.apache.maven.DefaultMaven.execute (DefaultMaven.java:101)
at org.apache.maven.cli.MavenCli.execute (MavenCli.java:919)
at org.apache.maven.cli.MavenCli.doMain (MavenCli.java:285)
at org.apache.maven.cli.MavenCli.main (MavenCli.java:207)
at jdk.internal.reflect.DirectMethodHandleAccessor.invoke (DirectMethodHandleAccessor.java:103)
at java.lang.reflect.Method.invoke (Method.java:580)
at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced (Launcher.java:255)
at org.codehaus.plexus.classworlds.launcher.Launcher.launch (Launcher.java:201)
at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode (Launcher.java:362)
at org.codehaus.plexus.classworlds.launcher.Launcher.main (Launcher.java:314)
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 02:46 min
[INFO] Finished at: 2026-09-22T02:56:40Z
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.owasp:dependency-check-maven:12.2.2:check (default-cli) on project bibimbap: Execution default-cli of goal org.owasp:dependency-check-maven:12.2.2:check failed: Shutdown in progress -> [Help 1]
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/PluginExecutionException

Binary file not shown.

After

Width:  |  Height:  |  Size: 54 KiB

View File

@ -0,0 +1,218 @@
[
{
"jar": "WEB-INF/lib/commonmark-0.22.0.jar",
"coordinates": [
"org.commonmark:commonmark:0.22.0"
]
},
{
"jar": "WEB-INF/lib/micrometer-commons-1.15.12.jar",
"coordinates": []
},
{
"jar": "WEB-INF/lib/log4j-to-slf4j-2.24.3.jar",
"coordinates": [
"org.apache.logging.log4j:log4j-to-slf4j:2.24.3"
]
},
{
"jar": "WEB-INF/lib/HikariCP-6.3.3.jar",
"coordinates": [
"com.zaxxer:HikariCP:6.3.3"
]
},
{
"jar": "WEB-INF/lib/log4j-api-2.24.3.jar",
"coordinates": [
"org.apache.logging.log4j:log4j-api:2.24.3"
]
},
{
"jar": "WEB-INF/lib/logback-core-1.5.34.jar",
"coordinates": [
"ch.qos.logback:logback-core:1.5.34"
]
},
{
"jar": "WEB-INF/lib/spring-core-6.2.19.jar",
"coordinates": []
},
{
"jar": "WEB-INF/lib/spring-context-6.2.19.jar",
"coordinates": []
},
{
"jar": "WEB-INF/lib/spring-webmvc-6.2.19.jar",
"coordinates": []
},
{
"jar": "WEB-INF/lib/jackson-databind-2.21.4.jar",
"coordinates": [
"com.fasterxml.jackson.core:jackson-databind:2.21.4"
]
},
{
"jar": "WEB-INF/lib/spring-aop-6.2.19.jar",
"coordinates": []
},
{
"jar": "WEB-INF/lib/logback-classic-1.5.34.jar",
"coordinates": [
"ch.qos.logback:logback-classic:1.5.34"
]
},
{
"jar": "WEB-INF/lib/spring-boot-3.5.16.jar",
"coordinates": []
},
{
"jar": "WEB-INF/lib/jackson-datatype-jsr310-2.21.4.jar",
"coordinates": [
"com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.21.4"
]
},
{
"jar": "WEB-INF/lib/tomcat-embed-jasper-10.1.55.jar",
"coordinates": []
},
{
"jar": "WEB-INF/lib/spring-expression-6.2.19.jar",
"coordinates": []
},
{
"jar": "WEB-INF/lib/jackson-datatype-jdk8-2.21.4.jar",
"coordinates": [
"com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.21.4"
]
},
{
"jar": "WEB-INF/lib/jackson-core-2.21.4.jar",
"coordinates": [
"com.fasterxml.jackson.core:jackson-core:2.21.4"
]
},
{
"jar": "WEB-INF/lib/jakarta.annotation-api-2.1.1.jar",
"coordinates": [
"jakarta.annotation:jakarta.annotation-api:2.1.1"
]
},
{
"jar": "WEB-INF/lib/spring-jdbc-6.2.19.jar",
"coordinates": []
},
{
"jar": "WEB-INF/lib/jackson-module-parameter-names-2.21.4.jar",
"coordinates": [
"com.fasterxml.jackson.module:jackson-module-parameter-names:2.21.4"
]
},
{
"jar": "WEB-INF/lib/micrometer-observation-1.15.12.jar",
"coordinates": []
},
{
"jar": "WEB-INF/lib/spring-beans-6.2.19.jar",
"coordinates": []
},
{
"jar": "WEB-INF/lib/spring-tx-6.2.19.jar",
"coordinates": []
},
{
"jar": "WEB-INF/lib/postgresql-42.7.11.jar",
"coordinates": []
},
{
"jar": "WEB-INF/lib/jackson-annotations-2.21.jar",
"coordinates": [
"com.fasterxml.jackson.core:jackson-annotations:2.21"
]
},
{
"jar": "WEB-INF/lib/jsoup-1.17.2.jar",
"coordinates": [
"org.jsoup:jsoup:1.17.2"
]
},
{
"jar": "WEB-INF/lib/ecj-3.33.0.jar",
"coordinates": []
},
{
"jar": "WEB-INF/lib/tomcat-annotations-api-10.1.55.jar",
"coordinates": []
},
{
"jar": "WEB-INF/lib/mybatis-spring-boot-starter-3.0.5.jar",
"coordinates": [
"org.mybatis.spring.boot:mybatis-spring-boot-starter:3.0.5"
]
},
{
"jar": "WEB-INF/lib/slf4j-api-2.0.18.jar",
"coordinates": [
"org.slf4j:slf4j-api:2.0.18"
]
},
{
"jar": "WEB-INF/lib/mybatis-3.5.19.jar",
"coordinates": [
"org.mybatis:mybatis:3.5.19",
"ognl:ognl:3.4.4",
"org.javassist:javassist:3.30.2-GA"
]
},
{
"jar": "WEB-INF/lib/mybatis-spring-3.0.5.jar",
"coordinates": [
"org.mybatis:mybatis-spring:3.0.5"
]
},
{
"jar": "WEB-INF/lib/spring-boot-autoconfigure-3.5.16.jar",
"coordinates": []
},
{
"jar": "WEB-INF/lib/jul-to-slf4j-2.0.18.jar",
"coordinates": [
"org.slf4j:jul-to-slf4j:2.0.18"
]
},
{
"jar": "WEB-INF/lib/snakeyaml-2.4.jar",
"coordinates": [
"org.yaml:snakeyaml:2.4"
]
},
{
"jar": "WEB-INF/lib/tomcat-embed-core-10.1.55.jar",
"coordinates": []
},
{
"jar": "WEB-INF/lib/tomcat-embed-el-10.1.55.jar",
"coordinates": []
},
{
"jar": "WEB-INF/lib/spring-web-6.2.19.jar",
"coordinates": []
},
{
"jar": "WEB-INF/lib/spring-jcl-6.2.19.jar",
"coordinates": []
},
{
"jar": "WEB-INF/lib/mybatis-spring-boot-autoconfigure-3.0.5.jar",
"coordinates": [
"org.mybatis.spring.boot:mybatis-spring-boot-autoconfigure:3.0.5"
]
},
{
"jar": "WEB-INF/lib-provided/tomcat-embed-websocket-10.1.55.jar",
"coordinates": []
},
{
"jar": "WEB-INF/lib/spring-boot-jarmode-tools-3.5.16.jar",
"coordinates": []
}
]

View File

@ -0,0 +1 @@
848570a66ba1ea1aaa9753d54394b843839d31fb01df4f67bc7468c201d9d2e5 bibimbap-0.0.1-SNAPSHOT.war

View File

@ -0,0 +1,99 @@
---
schema_version: 2
profile: research-lite
session_id: 20260922-114058
started_at: 2026-09-22T11:40:58.902204+09:00
ended_at: 2026-09-22T11:59:50.675179+09:00
user_request: 지금까지 작업된 결과물들 검증과 라이브 출시 준비 상태 판정
---
# Summary
검증 완료: 현재 HEAD 1848394의 라이브 출시는 NO-GO. 전체 테스트 362/362와 live WAR 빌드, 공개 화면 16회, 독립 DB 인증/모집글 흐름은 통과했다. 운영 설정 파일이 WAR에서 제외되고, 기본 배포 이미지가 dev 프로필이며, 새 DB에는 포스트 카테고리 시드가 없다.
상세 보고서: [release-readiness](../../../docs/analysis/2026-09-22-release-readiness.md). (프로젝트 루트 기준 docs/analysis/2026-09-22-release-readiness.md)
# Invocations
- id: inv-001
layer: orchestrator
name: sequential-readiness-self-check
parent_invocation_id: null
input_digest: 전체 결과물 검증 및 라이브 적합성 판정
output_digest: 362 tests PASS; build PASS; release NO-GO
artifacts: [artifacts/build.log, artifacts/browser.json, artifacts/flow.json, artifacts/live-http.json, artifacts/edge.json, research/graph-query.txt]
concerns: [운영 설정 패키징 누락, dev 고정 이미지, 새 DB 카테고리 시드 누락, 운영 L3 미완료]
model_choice: {tier: large, rationale: 다수 기능과 배포 산출물의 실행 증거 대조}
# Advisor Invocation Decision Log
- advisor: all
decision: skip
rationale: 'skip: no-codex-hooks; tier_b_sequential self-check'
checked_at: 2026-09-22T11:40:58.902204+09:00
# Decisions
- general_task; tier_b_sequential; 독립 advisor 검토 아님.
- 검증 범위: 전체 Maven 테스트/WAR, 배포 구성/DB 계약, 가능한 로컬 런타임, 미완료 출시 조건.
- 소스 코드 변경 없음. graphify는 기존 그래프 가용성과 최신성을 확인하고 근거는 현재 소스와 대조.
# Open Items
- 선재 untracked: .atp/work-session/20260724-095414/, .atp/work-session/20260826-093449/, ~/
# Phase self-checklist
- 요구: 현재 커밋의 품질 검증과 라이브 Go/No-Go; 수정/배포 요청 아님.
- 조사: docs-first, 기존 graph 어휘 확장+BFS로 보조 탐색 후 현재 소스 대조.
- 설계: 검증 표에 성공/실패/미검증을 분리; 새 임시 DB에만 테스트 쓰기. AC self-audit: 전체 테스트 성공과 운영 출시 승인을 독립 판정; 미검증을 PASS로 취급하지 않음.
- 구현: 제품 코드 0줄 변경. 분석 문서/증거만 생성하여 코드 수정 전 계획 승인 게이트 대상 없음.
- 검증: L1 PASS, L2 실행한 실제 PostgreSQL 경로 PASS/초기화 공백 별도 기록, L3 부분 PASS. 출시 게이트 FAIL을 숨기지 않음.
- 문서화: docs/analysis 보고서 및 index 연결.
# verified_by_me
- L1: JDK 21; mvn -o -B -P live test package spring-boot:repackage; 362 tests, failures/errors/skipped 0; 실행형 WAR PASS.
- L2: local PostgreSQL 16 runtime contracts PASS (signup/login/recruit and local constraint/category reads). 전체 mapper 계약은 skipped: harness 없음, 전수 시드/범위 미정.
- L3: 공개 화면 8개 × desktop/mobile PASS; 독립 live WAR auth/recruit HTTP scenario PASS. 전체 출시 게이트는 미완료.
- 로그 스캔: warn: 컴파일 WARNING 200줄(중복 포함), 의존성 OSS Index 제외 경고 1건; runtime은 정적 경로 안내 WARN과 의도적으로 재현한 오류 입력의 ERROR 3건. clean으로 판정하지 않음.
- 운영 Secure 설정 패키징 누락과 세션 Secure=false 실측 확인.
# needs_user_verification
- 실제 배포 환경 지정 후 운영 이미지/HTTPS/domain/프록시/DB schema·migration 증거 확보.
- staging 실제 Unity 빌드 업로드·실행·교체/좋아요/리뷰/배지/잼/관리자 전체 시나리오.
- 최신 CVE 데이터 기반 mvn dependency-check:check 결과와 백업/복구/부하/운영 모니터링.
- 프로젝트 게이트: docs/maintenance/post-deploy-verification-checklist.md 전항목 검증. 해당 환경 미지정으로 원격 실행하지 않음.
# graph_refresh
skip: 제품 코드 변경 0; 기존 graph는 탐색 보조로만 사용. 재생성 없음.
# user_signals
positive: []
negative: []
# Retrospective
순차 self-check로 완료했으며 독립 advisor 회고가 아니다. 단위 테스트 362개 통과와 live WAR 빌드 성공은 설정 파일 포함/운영 쿠키 정책을 보장하지 않았다. 새 DB로 시작하는 검증은 기존 dev 데이터가 가리는 시드 누락을 드러냈다. 이 교훈은 이번 analysis의 재검증 순서에 기록하고 제품 코드/정책 확대 변경은 하지 않았다.
# Additional Decisions
- 독립 임시 환경은 로컬에 생성하고 검증 종료 시 정리한다. 기존 bibimbap-app/db는 재시작/데이터 변경하지 않는다.
- 부족한 L3 증거는 출시 보류 이유이며 분석 작업 자체의 미완료로 감추지 않는다.
- 커밋은 CLAUDE.md의 feat/* 표준 승인에 따라 문서·증거만 수행. push 없음.
- 임시 app/db 컨테이너·해당 익명 볼륨·네트워크 정리 완료. WAR/전체 브라우저 캡처/의존성 HTML은 /tmp/bibimbap-readiness-*에 남김(검증 참고용).
- 저장한 로그는 줄끝 공백만 정규화했다. HTTP 관측의 세션 ID는 삭제했다.
## Phase 2 — 최신 의존성 취약점 검증
### Decisions
- 사용자 후속 요청: 최신 취약점은 확실히 해야겠네. NVD 데이터 갱신 및 배포 WAR의 provided 의존성 포함 재검증. 제품 소스 수정 없이 기존 격리 복사본의 검증용 POM만 수정한다.
- tier_b_sequential 유지; 독립 advisor 미사용.
### Invocations
- orchestrator: 완료. OSV 온라인 81 좌표, WAR 43/43 JAR 대응, NVD 실시간 28/28 CVE 및 공급자 권고 대조. 제품 수정 없음.
### Summary
최신 공개 권고의 영향 버전에 배포 구성요소 6종이 포함된다. 28개 CVE + 1개 GHSA는 버전/권고 검토 집합이며, 실제 악용 입증 건수가 아니다. jsoup/Jackson/Log4j/Spring 일부 조건은 현재 소스에 없고 Tomcat/DB 외부 운영 설정은 미확인이다. 이전 캐시 0건은 출시 근거에서 제외한다.
### verified_by_me
- OSV: 온라인 응답 9 unique advisory, 5 runtime packages; pagination 없음. 모든 WAR JAR의 Maven 좌표 포함 확인.
- 공급자 추가 대조: Tomcat 19 CVE, Spring 4 CVE; 총 28 CVE + 1 GHSA. NVD API 28 requested/28 returned, timestamp 2026-09-22T02:56:02.312 UTC.
- NVD bulk: 최초 실패(exit 1); 실행 전용 CA truststore+IPv4 재시도 후 395,957건 전체 초기 복제 진입. 대상 실시간 조회 완료 뒤 이 세션의 PID 824에 TERM 전송, exit 143 확인. bulk scan PASS 아님.
- TLS 검증 비활성화 0; 사용자 전역 truststore 변경 0; 코드 변경 0, 전체 L1 반복 불필요.
- 문서 링크/JSON 대상 수/버전 목록·WAR 커버리지 일치 확인.
### needs_user_verification
- 실제 운영 HTTP/2/Realm/Valve/TLS/DB channel binding 정책.
- 지원 Boot 계열로 이전할지 상용 Spring 패치 경로를 사용할지 결정 후 구현·회귀검증.
- NVD bulk cache 갱신 미완료; 향후 Dependency-Check는 갱신 완료 시각과 데이터 존재를 먼저 확인.
### Retrospective
이전 scan 성공+0건은 최신성의 증거가 아니었다. 공급자 권고와 OSV에는 매핑/수록 차이가 있어 양쪽 대조가 필요하다. Tomcat fixed=10.1.58은 공개 릴리스가 아니므로 실제 배포 수정본 10.1.59로 구분했다. 실행 가이드의 autoUpdate=false에서도 온라인 갱신된다는 오해를 문서에서 정정했다. 독립 advisor 검토 아님.

View File

@ -0,0 +1,33 @@
Graph vocabulary expansion: test, verification, deploy, security, upload, mapper, session
BFS depth=2; roots=['ZipSecurityTest', 'GameUploadAuditMapper', 'post-deploy-verification-checklist.md']
Reached nodes=54
{'label': 'GameUploadAuditMapper', 'source_file': 'src/main/java/com/pandoli365/bibimbap/mapper/GameUploadAuditMapper.java', 'source_location': 'L10'}
{'label': 'post-deploy-verification-checklist.md', 'source_file': 'docs/development/local-dev-setup.md', 'source_location': '113'}
{'label': 'ZipSecurityTest', 'source_file': 'src/test/java/com/pandoli365/bibimbap/security/ZipSecurityTest.java', 'source_location': 'L31'}
{'label': '.uploadWebglZip()', 'source_file': 'src/main/java/com/pandoli365/bibimbap/controller/api/GameUploadController.java', 'source_location': 'L113'}
{'label': 'GameUploadController', 'source_file': 'docs/development/local-dev-setup.md', 'source_location': '89,93'}
{'label': '.writeEntry()', 'source_file': 'src/test/java/com/pandoli365/bibimbap/security/ZipSecurityTest.java', 'source_location': 'L362'}
{'label': '.extractZip_rejectsBackslash()', 'source_file': 'src/test/java/com/pandoli365/bibimbap/security/ZipSecurityTest.java', 'source_location': 'L62'}
{'label': 'SSRF DNS 캐시 운영 참고 (networkaddress.cache.ttl=30)', 'source_file': 'docs/development/local-dev-setup.md', 'source_location': '111-113'}
{'label': '.webglZip_returns403_whenReplaceUuidNotOwned()', 'source_file': 'src/test/java/com/pandoli365/bibimbap/controller/api/GameUploadControllerSecurityTest.java', 'source_location': 'L256'}
{'label': '.webglZip_returns403_whenJamModeWithoutPermission()', 'source_file': 'src/test/java/com/pandoli365/bibimbap/controller/api/GameUploadControllerSecurityTest.java', 'source_location': 'L151'}
{'label': '.webglZip_allowsReplace_whenOwner()', 'source_file': 'src/test/java/com/pandoli365/bibimbap/controller/api/GameUploadControllerSecurityTest.java', 'source_location': 'L279'}
{'label': '.extractZip_rejectsNulByte()', 'source_file': 'src/test/java/com/pandoli365/bibimbap/security/ZipSecurityTest.java', 'source_location': 'L82'}
{'label': '.makeLargeSingleEntryZip()', 'source_file': 'src/test/java/com/pandoli365/bibimbap/security/ZipSecurityTest.java', 'source_location': 'L311'}
{'label': '.extractZip_rejectsTooLongName()', 'source_file': 'src/test/java/com/pandoli365/bibimbap/security/ZipSecurityTest.java', 'source_location': 'L92'}
{'label': '.insertAudit()', 'source_file': 'src/main/java/com/pandoli365/bibimbap/mapper/GameUploadAuditMapper.java', 'source_location': 'L13'}
{'label': '.putEntry()', 'source_file': 'src/test/java/com/pandoli365/bibimbap/controller/api/GameUploadControllerSecurityTest.java', 'source_location': 'L108'}
{'label': '.webglZip_returns413_whenOriginalTooLarge()', 'source_file': 'src/test/java/com/pandoli365/bibimbap/controller/api/GameUploadControllerSecurityTest.java', 'source_location': 'L228'}
{'label': '.assertZipType_acceptsNullMimeWithZipExt()', 'source_file': 'src/test/java/com/pandoli365/bibimbap/security/ZipSecurityTest.java', 'source_location': 'L223'}
{'label': '.assertMagic_rejectsNonZipMagic()', 'source_file': 'src/test/java/com/pandoli365/bibimbap/security/ZipSecurityTest.java', 'source_location': 'L230'}
{'label': '.extractZip_rejectsDriveLetter()', 'source_file': 'src/test/java/com/pandoli365/bibimbap/security/ZipSecurityTest.java', 'source_location': 'L72'}
{'label': '.audit()', 'source_file': 'src/main/java/com/pandoli365/bibimbap/controller/api/GameUploadController.java', 'source_location': 'L344'}
{'label': '.makeZip()', 'source_file': 'src/test/java/com/pandoli365/bibimbap/security/ZipSecurityTest.java', 'source_location': 'L287'}
{'label': 'SsrfSafeFetcher', 'source_file': '', 'source_location': ''}
{'label': '.assertMagic()', 'source_file': 'src/main/java/com/pandoli365/bibimbap/security/ZipSecurity.java', 'source_location': 'L90'}
{'label': '.assertUnityBuild()', 'source_file': 'src/main/java/com/pandoli365/bibimbap/security/ZipSecurity.java', 'source_location': 'L171'}
{'label': '.extractZip_rejectsEmptyZip()', 'source_file': 'src/test/java/com/pandoli365/bibimbap/security/ZipSecurityTest.java', 'source_location': 'L115'}
{'label': 'Local Dev Setup — 로컬 개발 환경 설정', 'source_file': 'docs/development/local-dev-setup.md', 'source_location': '1-3'}
{'label': '.makeMultiLargeEntryZip()', 'source_file': 'src/test/java/com/pandoli365/bibimbap/security/ZipSecurityTest.java', 'source_location': 'L329'}
{'label': '.assertMagic_acceptsValidZip()', 'source_file': 'src/test/java/com/pandoli365/bibimbap/security/ZipSecurityTest.java', 'source_location': 'L238'}
{'label': '.webglZip_passesGate_whenAuthenticatedNonJam()', 'source_file': 'src/test/java/com/pandoli365/bibimbap/controller/api/GameUploadControllerSecurityTest.java', 'source_location': 'L166'}

View File

@ -0,0 +1,2 @@
{"event": "await_capability_checked", "at": "2026-09-22T11:40:58.902204+09:00", "formal_adapter_enabled": false, "host_managed_subagent_orchestration": "unsupported", "selected_mode": "tier_b_sequential", "profile_ref": "codex-team/SKILL.md \u00a71/7", "reason": "skip: no-codex-hooks"}
{"event": "wait_wakeup_capability_unavailable", "at": "2026-09-22T11:40:58.902204+09:00", "formal_adapter_enabled": false, "host_managed_subagent_orchestration": "unsupported", "selected_mode": "tier_b_sequential", "profile_ref": "codex-team/SKILL.md \u00a71/7", "reason": "skip: no-codex-hooks"}

View File

@ -0,0 +1,4 @@
# Preserve verbatim test/runtime stdout as evidence.
artifacts/*.log -whitespace
artifacts/**/*.log -whitespace
artifacts/runtime-*.txt -whitespace

View File

@ -0,0 +1,3 @@
# Local input copies and transient browser fixtures are reproducible.
*.zip
runtime-login.html

View File

@ -0,0 +1,13 @@
## 검증 포인트
AC self-audit: 기대값은 metadata/DOM/DB 행위 불변식에 고정하고 work-session 산출물 개수에 의존하지 않는다. 표현은 literal grep 대신 typed parser/HTTP/DB/DOM assertions; 파일 집합만 아래 명시 목록 전수 확인한다.
- AC-1 parser fixture 집합 전수: portrait, landscape, square, nested index+adjacent info, HTML attrs, Unity literal CSS, conflicting precedence, no metadata, 300×150 default, malformed JSON, invalid pair/range, multiple ambiguous canvas, malicious script/nonliteral, oversize inputs. 각 named fixture 검증 및 product에서 JS 실행 0건; metadata 없는 정상 ZIP HTTP 200.
- AC-2 실제 uploaded game: 제공 ZIP은 390×844 반환; 다른 이름의 1280×720 및 800×800 ZIP도 자신의 값 반환. filename/게임명 상수 없이 동일 계약.
- AC-3 등록→DB→상세/수정 round trip; auto/custom/legacy path 전수 분기, manual 우선, 새 ZIP metadata 업데이트, 구 edit omission 보존, unknown nullable & fallback. 두 숫자 invalid는 400, CSRF/auth/owner unchanged.
- AC-4 isolated PostgreSQL mapper 계약: migration 기존 row 유지/NULL fallback, 재실행 가능; 모든 GameData SELECT 및 INSERT/UPDATE dimensions/source 정합. fresh schema와 migrated schema 동일. L2 remote/seed 미지정만 skip 가능; 알려진 healthy DB에서 가능한 isolated 검증을 우선한다.
- AC-5 stage viewport 집합 전수: 320×844, 1440×900, 844×390, 640×300에서 portrait/landscape/square 모두 iframe 양축 boundary 이내/ratio 오차 ≤1px. 현재 16:9/max520 구현에서 portrait 회귀는 실패하고 수정 후 통과함을 확보한다.
- AC-6 resize/overlay/fullscreen 진입·해제/실패 fallback에서 exact same iframe DOM, src, load count, 게임 state 유지; Esc/닫기/focus/scroll 복원. asset-origin 다른 origin에서도 parent canvas DOM access 없이 지원.
- AC-7 실제 ZIP runtime: 준비 후 CSS client size와 drawing buffer를 별도로 기록; 정상/expanded/fullscreen(지원 브라우저) resize, 상하단 UI 표시, 버튼 좌표/클릭, 모바일 터치 입력 점검. 원본 ZIP 및 served uploaded HTML hash 미변경.
- AC-8 full `./mvnw -o test` 및 WAR package 통과; isolated 최신 앱에서 detail/register/edit 변경 JSP 전수 HTTP 200(인증 포함). runtime stacktrace 및 console error scan. 새 constructor 의존이 생기면 contextLoads mocks 갱신. screenshot은 desktop/mobile 묶음 한 번+필요 fix 한 번; Impeccable detect changed UI 대상 한 번 실행.
- AC-9 파일 영향맵의 신규 산출물은 전수 존재하되 conditional 경로는 조건 성립시에만 변경; docs 계약/사용/변경 3개와 해당 index 링크 모두 확인. verification-advisor는 테스트를 작성하지 않고 실행만 수행.

View File

@ -0,0 +1,16 @@
TAP version 13
# Subtest: SSR player ships the stored ratio and responsive stage without the old hard limit
ok 1 - SSR player ships the stored ratio and responsive stage without the old hard limit
---
duration_ms: 0.93375
type: 'test'
...
1..1
# tests 1
# suites 0
# pass 1
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 44.434208

View File

@ -0,0 +1,53 @@
---
phase: documentation
agent: documentation-advisor
agent_version: 1
report_invocation_id: inv-005
generated_at: 2026-10-14T09:54:53.525775+09:00
concerns_checked: true
concerns:
- Existing usage index setup-checklist.md and faq.md links have no target; unrelated to feature.
- Trusted touchscreen and named Unity button outcome remain unverified.
- Baseline failure evidence is SSR markup regression; previous browser geometry was not replayed.
---
# Final documentation and scoped UI audit
Implementation integrity verdict: PASS for the changed upload sizing/player surfaces within the evidence below. No new UI bug was observed. This is a bounded source/screenshot audit, not a full WCAG certification or performance benchmark.
## Documentation
- Corrected docs/usage/webgl-display.md: current WAR has no Main manifest. Replaced java -jar with the successful Java 21 Maven spring-boot:run command, parameterizing isolated DB port. Added explicit macOS Homebrew Java 21 environment for the test launcher that failed under default Java.
- Updated docs/changes/2026-10-14-webgl-display.md with actual 377 Java (0 failures/errors, ordinary opt-in L2 skip 1), Node 11/11, package pass, separately enabled actual L2 1/1, authenticated JSP 5-path HTTP 200, 3-build × 4-viewport boundary/ratio pass, ready Unity/CSS-buffer/state/fullscreen/hash evidence and explicit incomplete input verification.
- Read contract, usage, change documents, design and implementation reports, verification, document-category-classification, and documentation-advisor definition. documentation-guidelines.md is absent; category and advisor checklists were applied instead.
- AC9: all 21 unconditional paths from the complete design file impact map exist (including three index files). Conditional constructor-fixture changes were not triggered per implementation report. contracts/index.md, usage/index.md, changes/index.md contain their required links. All relative links in the three feature docs resolve, and all three new feature index links resolve. Full category-index scan also found pre-existing missing usage/setup-checklist.md and usage/faq.md targets (each linked twice). These unrelated index defects were reported without expanding edits. Cross-links connect contract, usage, change and verification strategy.
## Single final UI detect
Impeccable had already been announced and context loaded by root. Read SKILL.md plus audit/detection instructions; did not rerun context or edit UI. Ran exactly one final detect on game-detail.jsp, game-register.jsp, webgl-player.css and webgl-player.js. JSON: final-impeccable-detect.json. Exit 2 reflects two warnings, not a clean automated result:
1. game-detail.jsp line 454 side-tab accent border: existing creator-note block outside changed player. Incumbent design preserved; no new drift.
2. game-register.jsp line 462 hidden preview img without src: verified false positive. Source sets object-URL src before unhiding, removes src only while hiding, and handles image errors with the fallback. No visible broken-image box.
Inspected existing runtime-desktop.png and runtime-mobile.png together. Both show the complete portrait game, top information and bottom navigation inside the player, centered in available space. Outer controls wrap without clipping and have visible focus styling. Registration evidence covers auto/custom metadata and replacement behavior; there is no registration screenshot, so its audit is source/evidence based.
| Dimension | Scoped finding |
|---|---|
| Accessibility | Player buttons have names, state attributes, 44px minima, focus-visible; size form has legend, radio labels, associated numeric labels and live status. Runtime recorded Esc/focus/scroll restoration. Contrast and iframe-internal keyboard traversal not independently certified. |
| Performance | Resize/visualViewport/observer events coalesce through RAF; parent only sizes iframe and does not access Unity DOM. No transforms or layout animation introduced. No timing benchmark claimed. |
| Responsive | Exact runtime 12/12 boundary and ratio checks, max error 0.006665px. Screenshot pair shows top/bottom game UI. Trusted mobile input remains open. |
| Theming | New outer controls and form use incumbent text/accent/border/background tokens; intentional dark WebGL stage retained. No new visual world. |
| Integrity | Same iframe/src/Unity instance and zero additional loads observed. Detector findings verified as pre-existing/out of scope or false positive. |
No P0/P1/P2 defect identified in the changed surfaces from available evidence. No redesign or policy/settings/runtime/DB mutation performed.
## Unused variables/imports
Focused manual inspection covered changed Java/JSP/JS files and the new mapper/parser/controller tests. A supplemental Python symbol-reference scan checked each explicit Java import against its file body; no unused-import candidate was found. Reviewed player and added form variable declarations against their uses: all are referenced. Parser locals are used in bounded reading and dimension selection; model fields are exposed through accessors/MyBatis. This is a focused source audit, not an automated linter/LSP result; no lint capability was invoked or claimed.
## Actual baseline markup regression
At root's explicit request, copied current test/JS/CSS into a temporary tree outside repository, substituted ONLY game-detail.jsp with git show HEAD:src/main/webapp/WEB-INF/views/game-detail.jsp, and ran node --test --test-name-pattern='SSR player ships' src/test/js/webgl-player.test.cjs. Prechange test failed exit 1 due absent stored-ratio attributes; current identical named test passed exit 0. Logs: final-prechange-ssr-regression.log and final-current-ssr-regression.log. Temporary tree removed. This proves baseline SSR markup fails the changed contract; it does not claim old browser geometry or old full runtime execution. No new tests/source edits.
## Limits and self verification
Named Unity button outcome and trusted touchscreen input remain unverified: existing pointer delivery is trusted mouse only. Separate asset-origin support is Node harness evidence, not separate browser runtime. No complete-acceptance claim. No additional full test/build rerun needed for doc edits; baseline named test was explicitly requested. update_plan unavailable, root informed; ATP_POOL_BIND not fabricated. Child count 0, commit/push 0. Artifacts present; required frontmatter checked; concerns deliberately reviewed. Backport exclusion N/A.

View File

@ -0,0 +1,22 @@
[
{
"antipattern": "side-tab",
"name": "Side-tab accent border",
"description": "Thick colored border on one side of a card — the most recognizable tell of AI-generated UIs. Use a subtler accent or remove it entirely.",
"severity": "warning",
"category": "slop",
"file": "/Users/wemadeplay/workspace/stz/bibimbap/src/main/webapp/WEB-INF/views/game-detail.jsp",
"line": 454,
"snippet": "border-left: 3px solid var(--accent)"
},
{
"antipattern": "broken-image",
"name": "Broken or placeholder image",
"description": "<img> tags with empty src, missing src, or placeholder values ship as broken-image boxes. Use real images, generated assets, or remove the tag.",
"severity": "warning",
"category": "quality",
"file": "/Users/wemadeplay/workspace/stz/bibimbap/src/main/webapp/WEB-INF/views/game-register.jsp",
"line": 462,
"snippet": "<img id=\"preview-thumb\" alt=\"\" hidden />"
}
]

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,15 @@
import fs from 'node:fs';
const tabs=await(await fetch('http://127.0.0.1:18087/json')).json();
const ws=new WebSocket(tabs.find(x=>x.type==='page').webSocketDebuggerUrl);await new Promise(r=>ws.onopen=r);let id=0;const pending=new Map();ws.onmessage=e=>{const m=JSON.parse(e.data);if(m.id){const p=pending.get(m.id);pending.delete(m.id);m.error?p.reject(m.error):p.resolve(m.result)}};
const send=(method,params={})=>new Promise((resolve,reject)=>{pending.set(++id,{resolve,reject});ws.send(JSON.stringify({id,method,params}))});
const ev=async(expression)=>{const r=await send('Runtime.evaluate',{expression,returnByValue:true,awaitPromise:true});if(r.exceptionDetails)throw r.exceptionDetails;return r.result.value};
const action=process.argv[2];
if(action==='init'){await send('Emulation.setDeviceMetricsOverride',{width:390,height:844,deviceScaleFactor:1,mobile:true});await send('Emulation.setTouchEmulationEnabled',{enabled:true,maxTouchPoints:1});await send('Page.navigate',{url:'http://127.0.0.1:18086/'});}
if(action==='eval') console.log(JSON.stringify(await ev(process.argv[3]),null,2));
if(action==='shot'){const r=await send('Page.captureScreenshot',{format:'png'});fs.writeFileSync(process.argv[3],Buffer.from(r.data,'base64'));}
if(action==='touch'){const x=+process.argv[3],y=+process.argv[4];await send('Input.dispatchTouchEvent',{type:'touchStart',touchPoints:[{x,y,id:1,radiusX:1,radiusY:1,force:1}]});await new Promise(r=>setTimeout(r,100));await send('Input.dispatchTouchEvent',{type:'touchEnd',touchPoints:[]});}
if(action==='resize'){await send('Emulation.setDeviceMetricsOverride',{width:+process.argv[3],height:+process.argv[4],deviceScaleFactor:1,mobile:true});}
if(action==='expanded'){await ev('document.querySelector("[data-player-expand]").click()');await send('Emulation.setDeviceMetricsOverride',{width:844,height:390,deviceScaleFactor:1,mobile:false});await new Promise(r=>setTimeout(r,1000));console.log(JSON.stringify(await ev('(()=>{let f=document.querySelector("iframe"),c=f.contentDocument.querySelector("canvas");return {view:[innerWidth,innerHeight],frame:f.getBoundingClientRect().toJSON(),canvas:c.getBoundingClientRect().toJSON(),buffer:[c.width,c.height],sameFrame:f===window.__originalFrame,sameUnity:f.contentWindow.unityInstance===window.__originalUnity}})()'),null,2));let r=await send('Page.captureScreenshot',{format:'png'});fs.writeFileSync(process.argv[3],Buffer.from(r.data,'base64'));}
if(action==='expandedtap'){await send('Emulation.setDeviceMetricsOverride',{width:844,height:390,deviceScaleFactor:1,mobile:false});await new Promise(r=>setTimeout(r,400));await ev('document.querySelector("iframe").contentWindow.__events=[]');await send('Input.dispatchTouchEvent',{type:'touchStart',touchPoints:[{x:466,y:345,id:2,radiusX:1,radiusY:1,force:1}]});await new Promise(r=>setTimeout(r,100));await send('Input.dispatchTouchEvent',{type:'touchEnd',touchPoints:[]});await new Promise(r=>setTimeout(r,400));console.log(JSON.stringify(await ev('document.querySelector("iframe").contentWindow.__events'),null,2));let r=await send('Page.captureScreenshot',{format:'png'});fs.writeFileSync(process.argv[3],Buffer.from(r.data,'base64'));}
if(action==='portrait'){await ev('document.querySelector("[data-player-expand]").click()');await send('Emulation.setDeviceMetricsOverride',{width:390,height:844,deviceScaleFactor:1,mobile:false});await new Promise(r=>setTimeout(r,500));let geo=await ev('(()=>{let f=document.querySelector("iframe"),c=f.contentDocument.querySelector("canvas");return {view:[innerWidth,innerHeight],frame:f.getBoundingClientRect().toJSON(),canvas:c.getBoundingClientRect().toJSON(),buffer:[c.width,c.height],sameFrame:f===window.__originalFrame,sameUnity:f.contentWindow.unityInstance===window.__originalUnity}})()');let coords=(portion)=>({x:geo.frame.x+geo.canvas.x+geo.canvas.width*portion,y:geo.frame.y+geo.canvas.y+geo.canvas.height*.96});let tap=async(p)=>{await send('Input.dispatchTouchEvent',{type:'touchStart',touchPoints:[{...p,id:3,radiusX:1,radiusY:1,force:1}]});await new Promise(r=>setTimeout(r,100));await send('Input.dispatchTouchEvent',{type:'touchEnd',touchPoints:[]});await new Promise(r=>setTimeout(r,300));};await tap(coords(.1));let r=await send('Page.captureScreenshot',{format:'png'});fs.writeFileSync(process.argv[3]+'/portrait-home-before.png',Buffer.from(r.data,'base64'));await ev('document.querySelector("iframe").contentWindow.__events=[]');await tap(coords(.3));r=await send('Page.captureScreenshot',{format:'png'});fs.writeFileSync(process.argv[3]+'/portrait-shop-after.png',Buffer.from(r.data,'base64'));let events=await ev('document.querySelector("iframe").contentWindow.__events');let result={geo,coordinates:coords(.3),events};fs.writeFileSync(process.argv[3]+'/portrait-input.json',JSON.stringify(result,null,2));console.log(JSON.stringify(result,null,2));}
ws.close();

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

View File

@ -0,0 +1,59 @@
{
"geo": {
"view": [
390,
844
],
"frame": {
"x": 58.453125,
"y": 76,
"width": 273.078125,
"height": 591,
"top": 76,
"right": 331.53125,
"bottom": 667,
"left": 58.453125
},
"canvas": {
"x": 0,
"y": 0,
"width": 273,
"height": 591,
"top": 0,
"right": 273,
"bottom": 591,
"left": 0
},
"buffer": [
273,
591
],
"sameFrame": true,
"sameUnity": true
},
"coordinates": {
"x": 140.35312499999998,
"y": 643.36
},
"events": [
{
"type": "pointerdown",
"trusted": true,
"pointerType": "touch",
"x": 81.89999389648438,
"y": 567.3599853515625
},
{
"type": "touchstart",
"trusted": true,
"x": 81.89999389648438,
"y": 567.3599853515625
},
{
"type": "touchend",
"trusted": true,
"x": 81.89999389648438,
"y": 567.3599853515625
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

View File

@ -0,0 +1,14 @@
from http.server import HTTPServer,SimpleHTTPRequestHandler
from pathlib import Path
root=Path('/Users/wemadeplay/workspace/stz/bibimbap')
game=Path('/tmp/bibimbap-inv004-uploads/game/d4bf0e5b-5582-49f7-862d-be47e99092b2/GoraniCoin-WebGLTest')
class H(SimpleHTTPRequestHandler):
def do_GET(self):
if self.path=='/':
b=b'''<!doctype html><meta charset="utf-8"><link rel="stylesheet" href="/css/webgl-player.css"><style>body{margin:0;padding:16px;box-sizing:border-box}</style><div class="webgl-player" data-webgl-player data-display-width="390" data-display-height="844" style="--game-ratio:0.4620853"><div class="webgl-player__toolbar"><button class="webgl-player__button" data-player-expand aria-expanded="false">Expand</button><button class="webgl-player__button" data-player-fullscreen aria-pressed="false">Fullscreen</button><span class="webgl-player__status" data-player-status role="status"></span></div><div class="webgl-player__stage" data-player-stage id="webgl-stage"><iframe src="/game/index.html" sandbox="allow-scripts allow-same-origin allow-pointer-lock" allow="fullscreen; autoplay; xr-spatial-tracking"></iframe></div></div><script src="/js/webgl-player.js"></script>'''
self.send_response(200);self.send_header('Content-Type','text/html');self.end_headers();self.wfile.write(b);return
super().do_GET()
def translate_path(self,p):
if p.startswith('/game/'):return str(game/p[6:])
return str(root/'src/main/webapp'/p.lstrip('/'))
HTTPServer(('127.0.0.1',18086),H).serve_forever()

View File

@ -0,0 +1,6 @@
{
"zip_sha256": "02e5272e4086f8f0e2e3a4b41ca4313d5f8862897a1655421f3f1b4315942461",
"html_hashes": {
"GoraniCoin-WebGLTest/index.html": "8a9f8aaff7e949b49f4cab1a87c5b6d414db4031b5fb3e268f5102bc40cbcc74"
}
}

View File

@ -0,0 +1,85 @@
[INFO] Scanning for projects...
[INFO]
[INFO] ----------------------< com.pandoli365:bibimbap >-----------------------
[INFO] Building bibimbap 0.0.1-SNAPSHOT
[INFO] from pom.xml
[INFO] --------------------------------[ war ]---------------------------------
[INFO]
[INFO] >>> spring-boot:3.5.16:run (default-cli) > test-compile @ bibimbap >>>
[INFO]
[INFO] --- resources:3.3.1:resources (default-resources) @ bibimbap ---
[INFO] Copying 7 resources from src/main/resources to target/classes
[INFO]
[INFO] --- compiler:3.14.1:compile (default-compile) @ bibimbap ---
[INFO] Nothing to compile - all classes are up to date.
[INFO]
[INFO] --- resources:3.3.1:testResources (default-testResources) @ bibimbap ---
[INFO] skip non existing resourceDirectory /Users/wemadeplay/workspace/stz/bibimbap/src/test/resources
[INFO]
[INFO] --- compiler:3.14.1:testCompile (default-testCompile) @ bibimbap ---
[INFO] Nothing to compile - all classes are up to date.
[INFO]
[INFO] <<< spring-boot:3.5.16:run (default-cli) < test-compile @ bibimbap <<<
[INFO]
[INFO]
[INFO] --- spring-boot:3.5.16:run (default-cli) @ bibimbap ---
[INFO] Attaching agents: []
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v3.5.16)
2026-10-14T09:43:05.496+09:00 INFO 43913 --- [bibimbap] [ main] c.p.bibimbap.BibimbapApplication : Starting BibimbapApplication using Java 21.0.11 with PID 43913 (/Users/wemadeplay/workspace/stz/bibimbap/target/classes started by wemadeplay in /Users/wemadeplay/workspace/stz/bibimbap)
2026-10-14T09:43:05.497+09:00 INFO 43913 --- [bibimbap] [ main] c.p.bibimbap.BibimbapApplication : The following 1 profile is active: "dev"
2026-10-14T09:43:05.744+09:00 DEBUG 43913 --- [bibimbap] [ main] org.apache.ibatis.logging.LogFactory : Logging initialized using 'class org.apache.ibatis.logging.slf4j.Slf4jImpl' adapter.
2026-10-14T09:43:05.891+09:00 INFO 43913 --- [bibimbap] [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port 18081 (http)
2026-10-14T09:43:05.898+09:00 INFO 43913 --- [bibimbap] [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat]
2026-10-14T09:43:05.898+09:00 INFO 43913 --- [bibimbap] [ main] o.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/10.1.55]
2026-10-14T09:43:05.963+09:00 INFO 43913 --- [bibimbap] [ main] org.apache.jasper.servlet.TldScanner : At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time.
2026-10-14T09:43:05.965+09:00 INFO 43913 --- [bibimbap] [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
2026-10-14T09:43:05.965+09:00 INFO 43913 --- [bibimbap] [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 455 ms
2026-10-14T09:43:06.020+09:00 DEBUG 43913 --- [bibimbap] [ main] org.apache.ibatis.logging.LogFactory : Logging initialized using 'class org.apache.ibatis.logging.slf4j.Slf4jImpl' adapter.
2026-10-14T09:43:06.255+09:00 INFO 43913 --- [bibimbap] [ main] o.s.b.a.w.s.WelcomePageHandlerMapping : Adding welcome page template: index
2026-10-14T09:43:06.313+09:00 WARN 43913 --- [bibimbap] [ main] o.s.w.s.resource.ResourceHandlerUtils : Appended trailing slash to static resource location: file:///tmp/bibimbap-inv004-uploads/profile/
2026-10-14T09:43:06.372+09:00 INFO 43913 --- [bibimbap] [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port 18081 (http) with context path '/'
2026-10-14T09:43:06.376+09:00 INFO 43913 --- [bibimbap] [ main] c.p.bibimbap.BibimbapApplication : Started BibimbapApplication in 1.039 seconds (process running for 1.157)
2026-10-14T09:43:06.382+09:00 INFO 43913 --- [bibimbap] [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting...
2026-10-14T09:43:06.425+09:00 INFO 43913 --- [bibimbap] [ main] com.zaxxer.hikari.pool.HikariPool : HikariPool-1 - Added connection org.postgresql.jdbc.PgConnection@6c96403e
2026-10-14T09:43:06.425+09:00 INFO 43913 --- [bibimbap] [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed.
2026-10-14T09:43:06.435+09:00 INFO 43913 --- [bibimbap] [ main] c.p.bibimbap.config.BadgeCatalogSeeder : [BADGE] 배지 카탈로그 시드 완료: 2 종
2026-10-14T09:43:06.440+09:00 INFO 43913 --- [bibimbap] [ main] c.p.b.config.PermissionCatalogVerifier : [RBAC] 권한 카탈로그 시드 완료: 4 키
2026-10-14T09:43:07.462+09:00 INFO 43913 --- [bibimbap] [.1-18081-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet'
2026-10-14T09:43:07.462+09:00 INFO 43913 --- [bibimbap] [.1-18081-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet'
2026-10-14T09:43:07.465+09:00 INFO 43913 --- [bibimbap] [.1-18081-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 3 ms
2026-10-14T09:44:25.321+09:00 INFO 43913 --- [bibimbap] [.1-18081-exec-3] c.p.b.c.api.GameUploadController : WebGL zip upload request received. fileName=independent-original.zip, size=39008123, contentType=application/zip
2026-10-14T09:44:25.948+09:00 INFO 43913 --- [bibimbap] [.1-18081-exec-3] c.p.b.c.api.GameUploadController : WebGL zip upload completed. gameUuid=d4bf0e5b-5582-49f7-862d-be47e99092b2, webglPath=/game/d4bf0e5b-5582-49f7-862d-be47e99092b2/GoraniCoin-WebGLTest/index.html, entryCount=8, extractedBytes=145049041
2026-10-14T09:46:04.257+09:00 INFO 43913 --- [bibimbap] [.1-18081-exec-4] c.p.b.c.api.GameUploadController : WebGL zip upload request received. fileName=independent-landscape.zip, size=1054, contentType=application/zip
2026-10-14T09:46:04.267+09:00 INFO 43913 --- [bibimbap] [.1-18081-exec-4] c.p.b.c.api.GameUploadController : WebGL zip upload completed. gameUuid=1f84a200-dd40-45b2-9171-544cd222a89d, webglPath=/game/1f84a200-dd40-45b2-9171-544cd222a89d/index.html, entryCount=6, extractedBytes=380
2026-10-14T09:46:22.030+09:00 INFO 43913 --- [bibimbap] [.1-18081-exec-7] c.p.b.c.api.GameUploadController : WebGL zip upload request received. fileName=independent-landscape.zip, size=1054, contentType=application/zip
2026-10-14T09:46:22.034+09:00 INFO 43913 --- [bibimbap] [.1-18081-exec-7] c.p.b.c.api.GameUploadController : WebGL zip upload completed. gameUuid=274566a9-8825-45f7-b255-b7de3cb148c8, webglPath=/game/274566a9-8825-45f7-b255-b7de3cb148c8/index.html, entryCount=6, extractedBytes=380
2026-10-14T09:46:23.406+09:00 INFO 43913 --- [bibimbap] [.1-18081-exec-9] c.p.b.c.api.GameUploadController : WebGL zip upload request received. fileName=independent-square.zip, size=1052, contentType=application/zip
2026-10-14T09:46:23.411+09:00 INFO 43913 --- [bibimbap] [.1-18081-exec-9] c.p.b.c.api.GameUploadController : WebGL zip upload completed. gameUuid=81081344-47f1-4fc7-b7ce-2cd6519bf6bd, webglPath=/game/81081344-47f1-4fc7-b7ce-2cd6519bf6bd/index.html, entryCount=6, extractedBytes=378
2026-10-14T09:48:19.361+09:00 INFO 43913 --- [bibimbap] [.1-18081-exec-4] c.p.b.c.api.GameUploadController : WebGL zip upload request received. fileName=replacement.zip, size=1054, contentType=application/zip
2026-10-14T09:48:19.370+09:00 INFO 43913 --- [bibimbap] [.1-18081-exec-4] c.p.b.c.api.GameUploadController : WebGL zip upload completed. gameUuid=98252972-544b-4109-878b-406b452876ad, webglPath=/game/98252972-544b-4109-878b-406b452876ad/index.html, entryCount=6, extractedBytes=380
2026-10-14T09:49:34.942+09:00 INFO 43913 --- [bibimbap] [ionShutdownHook] o.s.b.w.e.tomcat.GracefulShutdown : Commencing graceful shutdown. Waiting for active requests to complete
2026-10-14T09:49:34.945+09:00 INFO 43913 --- [bibimbap] [tomcat-shutdown] o.s.b.w.e.tomcat.GracefulShutdown : Graceful shutdown complete
2026-10-14T09:49:34.949+09:00 INFO 43913 --- [bibimbap] [ionShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown initiated...
2026-10-14T09:49:34.951+09:00 INFO 43913 --- [bibimbap] [ionShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown completed.
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 06:30 min
[INFO] Finished at: 2026-10-14T09:49:35+09:00
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.springframework.boot:spring-boot-maven-plugin:3.5.16:run (default-cli) on project bibimbap: Process terminated with exit code: 143 -> [Help 1]
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException

View File

@ -0,0 +1 @@
target/bibimbap-0.0.1-SNAPSHOT.war? ?? Manifest ??? ????.

Binary file not shown.

After

Width:  |  Height:  |  Size: 243 KiB

View File

@ -0,0 +1,178 @@
[
{
"content": [
{
"type": "text",
"text": "Script ran on page and returned:\n```json\n{\"ready\":true,\"iframe\":{\"rect\":{\"x\":112.8828125,\"y\":718.6171875,\"width\":259.2265625,\"height\":561,\"top\":718.6171875,\"right\":372.109375,\"bottom\":1279.6171875,\"left\":112.8828125},\"src\":\"http://127.0.0.1:18081/game/d4bf0e5b-5582-49f7-862d-be47e99092b2/GoraniCoin-WebGLTest/index.html\",\"attrs\":[[\"title\",\"independent-portrait WebGL\"],[\"src\",\"/game/d4bf0e5b-5582-49f7-862d-be47e99092b2/GoraniCoin-WebGLTest/index.html\"],[\"sandbox\",\"allow-scripts allow-same-origin allow-pointer-lock\"],[\"allow\",\"fullscreen; autoplay; xr-spatial-tracking\"],[\"loading\",\"eager\"],[\"referrerpolicy\",\"same-origin\"],[\"style\",\"width: 259.23px; height: 561px;\"]],\"parent\":\"<div class=\\\"game-webgl__frame-wrap webgl-player__stage\\\" id=\\\"webgl-stage\\\" data-player-stage=\\\"\\\">\\n <iframe title=\\\"independent-portrait WebGL\\\" src=\\\"/game/d4bf0e5b-5582-49f7-862d-be47e99092b2/GoraniCoin-WebGLTest/index.html\\\" sandbox=\\\"allow-scripts allow-same-origin allow-pointer-lock\\\" allow=\\\"fullscreen; autoplay; xr-spatial-tracking\\\" loading=\\\"eager\\\" referrerpolicy=\\\"same-origin\\\" style=\\\"width: 259.23px; height: 561px;\\\"></iframe>\\n </div>\"},\"canvas\":{\"css\":[259,561],\"buffer\":[518,1122]},\"buttons\":[{\"text\":\"\\n \\n \\n \\n \\n \\n \\n \\n \\n \",\"id\":\"theme-toggle\"},{\"text\":\"취소\",\"id\":\"site-modal-cancel\"},{\"text\":\"확인\",\"id\":\"site-modal-confirm\"},{\"text\":\"삭제\",\"id\":\"game-delete-button\"},{\"text\":\"\\n \\n \\n \\n 0\\n \",\"id\":\"game-like-btn\"}]}\n```"
}
]
},
{
"content": [
{
"type": "text",
"text": "Script ran on page and returned:\n```json\n{\"viewport\":[500,801],\"frame\":[259.2265625,561],\"stage\":[447,560.6953125],\"inside\":true,\"ratioError\":0.003295319905191718,\"sameFrame\":true,\"sameUnity\":true,\"loads\":0,\"css\":[259,561],\"buffer\":[518,1122]}\n```"
}
]
},
{
"content": [
{
"type": "text",
"text": "Script ran on page and returned:\n```json\n{\"viewport\":[1440,801],\"frame\":[259.2265625,561],\"stage\":[858,560.6953125],\"inside\":true,\"ratioError\":0.003295319905191718,\"sameFrame\":true,\"sameUnity\":true,\"loads\":0,\"css\":[259,561],\"buffer\":[518,1122]}\n```"
}
]
},
{
"content": [
{
"type": "text",
"text": "Script ran on page and returned:\n```json\n{\"viewport\":[844,390],\"frame\":[126.1484375,273],\"stage\":[791,273],\"inside\":true,\"ratioError\":0.0008515995260722775,\"sameFrame\":true,\"sameUnity\":true,\"loads\":0,\"css\":[126,273],\"buffer\":[252,546]}\n```"
}
]
},
{
"content": [
{
"type": "text",
"text": "Script ran on page and returned:\n```json\n{\"viewport\":[640,300],\"frame\":[97.03125,210],\"stage\":[587,210],\"inside\":true,\"ratioError\":0.006664691943129242,\"sameFrame\":true,\"sameUnity\":true,\"loads\":0,\"css\":[97,210],\"buffer\":[194,420]}\n```"
}
]
},
{
"content": [
{
"type": "text",
"text": "Script ran on page and returned:\n```json\n{\"kind\":\"portrait-exact\",\"viewport\":[320,844],\"frame\":[267,577.8125],\"stage\":[267,590.796875],\"inside\":true,\"ratioError\":0.0013329383886002688,\"sameFrame\":true,\"sameUnity\":true,\"loads\":0,\"canvasCSS\":[267,578],\"buffer\":[534,1156]}\n```"
}
]
},
{
"content": [
{
"type": "text",
"text": "Script ran on page and returned:\n```json\n{\"kind\":\"portrait-exact\",\"viewport\":[1440,900],\"frame\":[291.109375,630],\"stage\":[858,630],\"inside\":true,\"ratioError\":0.004369075829401936,\"sameFrame\":true,\"sameUnity\":true,\"loads\":0,\"canvasCSS\":[291,630],\"buffer\":[582,1260]}\n```"
}
]
},
{
"content": [
{
"type": "text",
"text": "Script ran on page and returned:\n```json\n{\"kind\":\"portrait-exact\",\"viewport\":[844,390],\"frame\":[126.1484375,273],\"stage\":[791,273],\"inside\":true,\"ratioError\":0.0008515995260722775,\"sameFrame\":true,\"sameUnity\":true,\"loads\":0,\"canvasCSS\":[126,273],\"buffer\":[252,546]}\n```"
}
]
},
{
"content": [
{
"type": "text",
"text": "Script ran on page and returned:\n```json\n{\"kind\":\"portrait-exact\",\"viewport\":[640,300],\"frame\":[97.03125,210],\"stage\":[587,210],\"inside\":true,\"ratioError\":0.006664691943129242,\"sameFrame\":true,\"sameUnity\":true,\"loads\":0,\"canvasCSS\":[97,210],\"buffer\":[194,420]}\n```"
}
]
},
{
"content": [
{
"type": "text",
"text": "Script ran on page and returned:\n```json\n{\"fullscreen\":true,\"sameFrame\":true,\"sameUnity\":true,\"loads\":0,\"canvas\":{\"css\":[388,840],\"buffer\":[776,1680]}}\n```"
}
]
},
{
"content": [
{
"type": "text",
"text": "Script ran on page and returned:\n```json\n{\"mode\":\"custom\",\"width\":\"400\",\"height\":\"900\",\"status\":\"빌드에서 1280 × 720 화면을 확인했습니다. 크기가 다르면 직접 지정해 주세요.\",\"uploadPath\":\"/game/1f84a200-dd40-45b2-9171-544cd222a89d/index.html\"}\n```"
}
]
},
{
"content": [
{
"type": "text",
"text": "Script ran on page and returned:\n```json\n{\"kind\":\"landscape\",\"viewport\":[320,844],\"frame\":[267,150.1875],\"stage\":[267,590.796875],\"inside\":true,\"ratioError\":0}\n```"
}
]
},
{
"content": [
{
"type": "text",
"text": "Script ran on page and returned:\n```json\n{\"kind\":\"landscape\",\"viewport\":[1440,900],\"frame\":[858,482.625],\"stage\":[858,630],\"inside\":true,\"ratioError\":0}\n```"
}
]
},
{
"content": [
{
"type": "text",
"text": "Script ran on page and returned:\n```json\n{\"kind\":\"landscape\",\"viewport\":[844,390],\"frame\":[485.328125,273],\"stage\":[791,273],\"inside\":true,\"ratioError\":0.0052083333333143855}\n```"
}
]
},
{
"content": [
{
"type": "text",
"text": "Script ran on page and returned:\n```json\n{\"kind\":\"landscape\",\"viewport\":[640,300],\"frame\":[373.328125,210],\"stage\":[587,210],\"inside\":true,\"ratioError\":0.0052083333333143855}\n```"
}
]
},
{
"content": [
{
"type": "text",
"text": "Script ran on page and returned:\n```json\n{\"kind\":\"square\",\"viewport\":[320,844],\"frame\":[267,267],\"stage\":[267,590.796875],\"inside\":true,\"ratioError\":0}\n```"
}
]
},
{
"content": [
{
"type": "text",
"text": "Script ran on page and returned:\n```json\n{\"kind\":\"square\",\"viewport\":[1440,900],\"frame\":[630,630],\"stage\":[858,630],\"inside\":true,\"ratioError\":0}\n```"
}
]
},
{
"content": [
{
"type": "text",
"text": "Script ran on page and returned:\n```json\n{\"kind\":\"square\",\"viewport\":[844,390],\"frame\":[273,273],\"stage\":[791,273],\"inside\":true,\"ratioError\":0}\n```"
}
]
},
{
"content": [
{
"type": "text",
"text": "Script ran on page and returned:\n```json\n{\"kind\":\"square\",\"viewport\":[640,300],\"frame\":[210,210],\"stage\":[587,210],\"inside\":true,\"ratioError\":0}\n```"
}
]
},
{
"content": [
{
"type": "text",
"text": "Script ran on page and returned:\n```json\n{\"touch\":1,\"events\":[{\"type\":\"pointerdown\",\"trusted\":true,\"client\":[136.5,295.5],\"pointerType\":\"mouse\"},{\"type\":\"mousedown\",\"trusted\":true,\"client\":[136,295]},{\"type\":\"click\",\"trusted\":true,\"client\":[136,295],\"pointerType\":\"mouse\"}],\"ready\":true,\"canvasCSS\":[273,591],\"buffer\":[273,591],\"sameUnity\":true,\"loads\":0}\n```"
}
]
},
{
"content": [
{
"type": "text",
"text": "Script ran on page and returned:\n```json\n{\"fullscreen\":true,\"overflow\":\"hidden\",\"closeButton\":false,\"status\":\"\",\"sameFrame\":true,\"sameUnity\":true,\"loads\":0}\n```"
}
]
},
{
"content": [
{
"type": "text",
"text": "Script ran on page and returned:\n```json\n{\"kind\":\"rejection-fallback\",\"fullscreen\":false,\"overflow\":\"hidden\",\"closeButton\":true,\"status\":\"전체화면을 사용할 수 없어 크게 보기로 전환했습니다.\",\"sameFrame\":true,\"sameUnity\":true,\"loads\":0}\n```"
}
]
}
]

View File

@ -0,0 +1,5 @@
127.0.0.1 - - [14/Oct/2026 09:44:24] "GET /independent-original.zip HTTP/1.1" 200 -
127.0.0.1 - - [14/Oct/2026 09:46:04] "GET /independent-landscape.zip HTTP/1.1" 200 -
127.0.0.1 - - [14/Oct/2026 09:46:22] "GET /independent-landscape.zip HTTP/1.1" 304 -
127.0.0.1 - - [14/Oct/2026 09:46:23] "GET /independent-square.zip HTTP/1.1" 200 -
127.0.0.1 - - [14/Oct/2026 09:48:19] "GET /independent-landscape.zip HTTP/1.1" 304 -

View File

@ -0,0 +1,8 @@
from http.server import HTTPServer,SimpleHTTPRequestHandler
import os
os.chdir('.atp/work-session/20261014-091658/artifacts')
class Handler(SimpleHTTPRequestHandler):
def end_headers(self):
self.send_header('Access-Control-Allow-Origin','http://127.0.0.1:18081')
super().end_headers()
HTTPServer(('127.0.0.1',18082),Handler).serve_forever()

View File

@ -0,0 +1,11 @@
{
"originalZipUnchanged": true,
"originalZipSHA256": "02e5272e4086f8f0e2e3a4b41ca4313d5f8862897a1655421f3f1b4315942461",
"storedHtml": [
{
"path": "/tmp/bibimbap-inv004-uploads/game/d4bf0e5b-5582-49f7-862d-be47e99092b2/GoraniCoin-WebGLTest/index.html",
"sha256": "8a9f8aaff7e949b49f4cab1a87c5b6d414db4031b5fb3e268f5102bc40cbcc74",
"unchanged": true
}
]
}

View File

@ -0,0 +1,8 @@
{
"content": [
{
"type": "text",
"text": "Script ran on page and returned:\n```json\n{\"http\":[{\"path\":\"/game/new\",\"status\":200},{\"path\":\"/game/1\",\"status\":200},{\"path\":\"/game/1/edit\",\"status\":200},{\"path\":\"/game/2\",\"status\":200},{\"path\":\"/game/3\",\"status\":200}],\"servedHtmlSHA256\":\"8a9f8aaff7e949b49f4cab1a87c5b6d414db4031b5fb3e268f5102bc40cbcc74\"}\n```"
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 97 KiB

View File

@ -0,0 +1,9 @@
{
"content": [
{
"type": "text",
"text": "Error: Cannot read properties of null (reading 'parentElement')"
}
],
"isError": true
}

View File

@ -0,0 +1,7 @@
id | name | display_width | display_height | display_source | webgl_path
----+-----------------------+---------------+----------------+----------------+----------------------------------------------------------------------------
1 | independent-portrait | 390 | 844 | build-info | /game/d4bf0e5b-5582-49f7-862d-be47e99092b2/GoraniCoin-WebGLTest/index.html
2 | independent-landscape | 1280 | 720 | build-info | /game/274566a9-8825-45f7-b255-b7de3cb148c8/index.html
3 | independent-square | 800 | 800 | build-info | /game/81081344-47f1-4fc7-b7ce-2cd6519bf6bd/index.html
(3 rows)

View File

@ -0,0 +1,5 @@
id | name | display_width | display_height | display_source
----+----------------------+---------------+----------------+----------------
1 | independent-portrait | 400 | 900 | manual
(1 row)

View File

@ -0,0 +1,205 @@
CREATE SCHEMA
CREATE SCHEMA
SET
CREATE SEQUENCE
CREATE TABLE
ALTER SEQUENCE
DO
ALTER TABLE
CREATE SEQUENCE
CREATE TABLE
ALTER SEQUENCE
CREATE INDEX
CREATE SEQUENCE
CREATE TABLE
ALTER SEQUENCE
ALTER TABLE
DO
CREATE INDEX
CREATE INDEX
CREATE SEQUENCE
CREATE TABLE
ALTER SEQUENCE
ALTER TABLE
CREATE SEQUENCE
CREATE TABLE
ALTER SEQUENCE
CREATE INDEX
CREATE INDEX
ALTER TABLE
UPDATE 0
COMMENT
ALTER TABLE
COMMENT
CREATE SEQUENCE
CREATE TABLE
ALTER SEQUENCE
DO
DO
DO
CREATE INDEX
CREATE INDEX
COMMENT
COMMENT
CREATE VIEW
COMMENT
CREATE SEQUENCE
CREATE TABLE
ALTER SEQUENCE
CREATE SEQUENCE
CREATE TABLE
ALTER SEQUENCE
ALTER TABLE
ALTER TABLE
ALTER TABLE
CREATE INDEX
CREATE INDEX
CREATE INDEX
CREATE SEQUENCE
CREATE TABLE
ALTER SEQUENCE
CREATE INDEX
CREATE SEQUENCE
CREATE TABLE
ALTER SEQUENCE
DO
CREATE INDEX
CREATE INDEX
CREATE SEQUENCE
CREATE TABLE
ALTER SEQUENCE
DO
CREATE SEQUENCE
CREATE TABLE
ALTER SEQUENCE
DO
CREATE INDEX
CREATE INDEX
CREATE SEQUENCE
CREATE TABLE
ALTER SEQUENCE
DO
CREATE INDEX
CREATE SEQUENCE
CREATE TABLE
ALTER SEQUENCE
DO
CREATE INDEX
CREATE SEQUENCE
CREATE TABLE
ALTER SEQUENCE
DO
CREATE INDEX
CREATE INDEX
CREATE INDEX
CREATE SEQUENCE
CREATE TABLE
ALTER SEQUENCE
DO
CREATE INDEX
CREATE SEQUENCE
CREATE TABLE
ALTER SEQUENCE
DO
CREATE INDEX
CREATE INDEX
CREATE SEQUENCE
CREATE TABLE
ALTER SEQUENCE
DO
CREATE INDEX
CREATE INDEX
CREATE SEQUENCE
CREATE TABLE
ALTER SEQUENCE
DO
CREATE INDEX
CREATE INDEX
CREATE SEQUENCE
CREATE TABLE
ALTER SEQUENCE
DO
CREATE INDEX
CREATE INDEX
CREATE SEQUENCE
CREATE TABLE
ALTER SEQUENCE
DO
CREATE INDEX
CREATE INDEX
CREATE VIEW
COMMENT
CREATE SEQUENCE
CREATE TABLE
ALTER SEQUENCE
DO
CREATE INDEX
CREATE INDEX
CREATE INDEX
CREATE SEQUENCE
CREATE TABLE
ALTER SEQUENCE
DO
CREATE INDEX
CREATE INDEX
CREATE SEQUENCE
CREATE TABLE
ALTER SEQUENCE
DO
CREATE INDEX
CREATE INDEX
CREATE SEQUENCE
CREATE TABLE
ALTER SEQUENCE
DO
CREATE INDEX
CREATE INDEX
ALTER TABLE
CREATE INDEX
CREATE SEQUENCE
CREATE TABLE
ALTER SEQUENCE
CREATE INDEX
CREATE SEQUENCE
CREATE TABLE
ALTER SEQUENCE
DO
CREATE INDEX
CREATE INDEX
CREATE SEQUENCE
CREATE TABLE
ALTER SEQUENCE
CREATE INDEX
CREATE SEQUENCE
CREATE TABLE
ALTER SEQUENCE
DO
CREATE INDEX
CREATE INDEX
CREATE SEQUENCE
CREATE TABLE
ALTER SEQUENCE
DO
DO
CREATE INDEX
CREATE INDEX
COMMENT
COMMENT
CREATE SEQUENCE
CREATE TABLE
ALTER SEQUENCE
CREATE INDEX
DO
CREATE SEQUENCE
CREATE TABLE
ALTER SEQUENCE
DO
CREATE INDEX
CREATE INDEX
CREATE SEQUENCE
CREATE TABLE
ALTER SEQUENCE
DO
DO
CREATE INDEX
CREATE INDEX

View File

@ -0,0 +1,5 @@
id | name | display_width | display_height | display_source
----+--------------------+---------------+----------------+----------------
3 | independent-square | 1280 | 720 | build-info
(1 row)

View File

@ -0,0 +1,56 @@
{
"TEST-com.pandoli365.bibimbap.mapper.WebglDisplayDatabaseContractTest.xml": {
"tests": "1",
"failures": "0",
"errors": "0",
"cases": [
"actualMapperInsertUpdateAndEveryGameSelectRoundTripDisplayMetadata"
]
},
"TEST-com.pandoli365.bibimbap.util.WebglDisplayMetadataTest.xml": {
"tests": "6",
"failures": "0",
"errors": "0",
"cases": [
"portraitLandscapeAndSquareUseTheirOwnCanvasSizes",
"oversizeHtmlAndManifestAndSymlinksAreBounded",
"dynamicScriptAmbiguityAndBrowserDefaultsDoNotInventDimensions",
"nestedEntryOnlyReadsItsAdjacentManifest",
"manifestThenPixelCssThenAttributesHavePriority",
"invalidManifestFallsThroughAndBoundsAreEnforced"
]
},
"TEST-com.pandoli365.bibimbap.controller.api.GameDisplayMetadataTest.xml": {
"tests": "7",
"failures": "0",
"errors": "0",
"cases": [
"legacyCreateDetectsAndPathReplacementRedetectsWhileUnknownRemainsNullable",
"unknownAndLegacyFallbackDoNotBackfillAndCannotReadOutsideStorage",
"invalidCustomAndUnknownModeAre400AndDoNotWrite",
"customAndLegacyEditPreserveAuthorChoiceButAutoReplacesIt",
"autoCreateRedetectsServerFileAndRoundTripsIntoEditAndDetail",
"explicitCustomCanUseBrowserDefaultDimensionsAndDetailPrefersIt",
"csrfAuthenticationAndOwnershipPrecedeMetadataErrors"
]
},
"TEST-com.pandoli365.bibimbap.controller.api.GameUploadControllerSecurityTest.xml": {
"tests": "12",
"failures": "0",
"errors": "0",
"cases": [
"root_returns403_whenCsrfInvalid",
"webglZip_allowsReplace_whenOwner",
"webglZip_returns403_whenReplaceUuidNotOwned",
"webglZip_returns400_whenNotZipExtension",
"thumbnail_returns403_whenCsrfInvalid",
"webglZip_returns403_whenJamModeWithoutPermission",
"webglZip_returns403_whenCsrfInvalid",
"webglZip_returns413_whenOriginalTooLarge",
"webglZip_passesGate_whenAuthenticatedNonJam",
"webglZip_returns400_whenBadMagic",
"uploadDetectsEachBuildAndMalformedMetadataStillSucceeds",
"webglZip_returns401_whenNotAuthenticated"
]
}
}

View File

@ -0,0 +1,489 @@
bash: warning: setlocale: LC_ALL: cannot change locale (C.UTF-8): Bad file descriptor
[INFO] Scanning for projects...
[INFO]
[INFO] ----------------------< com.pandoli365:bibimbap >-----------------------
[INFO] Building bibimbap 0.0.1-SNAPSHOT
[INFO] from pom.xml
[INFO] --------------------------------[ war ]---------------------------------
[INFO]
[INFO] --- resources:3.3.1:resources (default-resources) @ bibimbap ---
[INFO] Copying 7 resources from src/main/resources to target/classes
[INFO]
[INFO] --- compiler:3.14.1:compile (default-compile) @ bibimbap ---
[INFO] Recompiling the module because of changed source code.
[INFO] Compiling 122 source files with javac [debug release 21] to target/classes
[INFO]
[INFO] --- resources:3.3.1:testResources (default-testResources) @ bibimbap ---
[INFO] skip non existing resourceDirectory /Users/wemadeplay/workspace/stz/bibimbap/src/test/resources
[INFO]
[INFO] --- compiler:3.14.1:testCompile (default-testCompile) @ bibimbap ---
[INFO] Recompiling the module because of changed dependency.
[INFO] Compiling 35 source files with javac [debug release 21] to target/test-classes
[WARNING] /Users/wemadeplay/workspace/stz/bibimbap/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[61,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /Users/wemadeplay/workspace/stz/bibimbap/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[61,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /Users/wemadeplay/workspace/stz/bibimbap/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[61,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /Users/wemadeplay/workspace/stz/bibimbap/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[61,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /Users/wemadeplay/workspace/stz/bibimbap/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[61,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /Users/wemadeplay/workspace/stz/bibimbap/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[65,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /Users/wemadeplay/workspace/stz/bibimbap/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[65,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /Users/wemadeplay/workspace/stz/bibimbap/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[65,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /Users/wemadeplay/workspace/stz/bibimbap/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[65,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /Users/wemadeplay/workspace/stz/bibimbap/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[65,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /Users/wemadeplay/workspace/stz/bibimbap/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[68,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /Users/wemadeplay/workspace/stz/bibimbap/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[68,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /Users/wemadeplay/workspace/stz/bibimbap/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[68,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /Users/wemadeplay/workspace/stz/bibimbap/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[68,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /Users/wemadeplay/workspace/stz/bibimbap/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[68,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /Users/wemadeplay/workspace/stz/bibimbap/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[71,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /Users/wemadeplay/workspace/stz/bibimbap/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[71,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /Users/wemadeplay/workspace/stz/bibimbap/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[71,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /Users/wemadeplay/workspace/stz/bibimbap/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[71,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /Users/wemadeplay/workspace/stz/bibimbap/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[71,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /Users/wemadeplay/workspace/stz/bibimbap/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[74,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /Users/wemadeplay/workspace/stz/bibimbap/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[74,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /Users/wemadeplay/workspace/stz/bibimbap/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[74,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /Users/wemadeplay/workspace/stz/bibimbap/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[74,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /Users/wemadeplay/workspace/stz/bibimbap/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[74,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /Users/wemadeplay/workspace/stz/bibimbap/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[77,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /Users/wemadeplay/workspace/stz/bibimbap/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[77,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /Users/wemadeplay/workspace/stz/bibimbap/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[77,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /Users/wemadeplay/workspace/stz/bibimbap/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[77,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /Users/wemadeplay/workspace/stz/bibimbap/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[77,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /Users/wemadeplay/workspace/stz/bibimbap/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[80,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /Users/wemadeplay/workspace/stz/bibimbap/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[80,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /Users/wemadeplay/workspace/stz/bibimbap/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[80,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /Users/wemadeplay/workspace/stz/bibimbap/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[80,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /Users/wemadeplay/workspace/stz/bibimbap/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[80,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /Users/wemadeplay/workspace/stz/bibimbap/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[83,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /Users/wemadeplay/workspace/stz/bibimbap/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[83,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /Users/wemadeplay/workspace/stz/bibimbap/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[83,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /Users/wemadeplay/workspace/stz/bibimbap/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[83,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /Users/wemadeplay/workspace/stz/bibimbap/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[83,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /Users/wemadeplay/workspace/stz/bibimbap/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[86,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /Users/wemadeplay/workspace/stz/bibimbap/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[86,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /Users/wemadeplay/workspace/stz/bibimbap/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[86,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /Users/wemadeplay/workspace/stz/bibimbap/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[86,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /Users/wemadeplay/workspace/stz/bibimbap/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[86,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /Users/wemadeplay/workspace/stz/bibimbap/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[89,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /Users/wemadeplay/workspace/stz/bibimbap/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[89,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /Users/wemadeplay/workspace/stz/bibimbap/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[89,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /Users/wemadeplay/workspace/stz/bibimbap/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[89,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /Users/wemadeplay/workspace/stz/bibimbap/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[89,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /Users/wemadeplay/workspace/stz/bibimbap/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[92,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /Users/wemadeplay/workspace/stz/bibimbap/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[92,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /Users/wemadeplay/workspace/stz/bibimbap/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[92,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /Users/wemadeplay/workspace/stz/bibimbap/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[92,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /Users/wemadeplay/workspace/stz/bibimbap/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[92,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /Users/wemadeplay/workspace/stz/bibimbap/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[95,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /Users/wemadeplay/workspace/stz/bibimbap/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[95,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /Users/wemadeplay/workspace/stz/bibimbap/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[95,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /Users/wemadeplay/workspace/stz/bibimbap/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[95,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /Users/wemadeplay/workspace/stz/bibimbap/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[95,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /Users/wemadeplay/workspace/stz/bibimbap/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[98,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /Users/wemadeplay/workspace/stz/bibimbap/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[98,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /Users/wemadeplay/workspace/stz/bibimbap/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[98,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /Users/wemadeplay/workspace/stz/bibimbap/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[98,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /Users/wemadeplay/workspace/stz/bibimbap/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[98,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /Users/wemadeplay/workspace/stz/bibimbap/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[101,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /Users/wemadeplay/workspace/stz/bibimbap/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[101,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /Users/wemadeplay/workspace/stz/bibimbap/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[101,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /Users/wemadeplay/workspace/stz/bibimbap/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[101,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /Users/wemadeplay/workspace/stz/bibimbap/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[101,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /Users/wemadeplay/workspace/stz/bibimbap/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[104,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /Users/wemadeplay/workspace/stz/bibimbap/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[104,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /Users/wemadeplay/workspace/stz/bibimbap/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[104,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /Users/wemadeplay/workspace/stz/bibimbap/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[104,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /Users/wemadeplay/workspace/stz/bibimbap/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[104,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /Users/wemadeplay/workspace/stz/bibimbap/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[107,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /Users/wemadeplay/workspace/stz/bibimbap/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[107,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /Users/wemadeplay/workspace/stz/bibimbap/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[107,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /Users/wemadeplay/workspace/stz/bibimbap/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[107,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /Users/wemadeplay/workspace/stz/bibimbap/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[107,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /Users/wemadeplay/workspace/stz/bibimbap/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[110,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /Users/wemadeplay/workspace/stz/bibimbap/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[110,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /Users/wemadeplay/workspace/stz/bibimbap/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[110,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /Users/wemadeplay/workspace/stz/bibimbap/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[110,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /Users/wemadeplay/workspace/stz/bibimbap/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[110,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /Users/wemadeplay/workspace/stz/bibimbap/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[113,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /Users/wemadeplay/workspace/stz/bibimbap/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[113,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /Users/wemadeplay/workspace/stz/bibimbap/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[113,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /Users/wemadeplay/workspace/stz/bibimbap/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[113,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /Users/wemadeplay/workspace/stz/bibimbap/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[113,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /Users/wemadeplay/workspace/stz/bibimbap/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[116,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /Users/wemadeplay/workspace/stz/bibimbap/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[116,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /Users/wemadeplay/workspace/stz/bibimbap/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[116,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /Users/wemadeplay/workspace/stz/bibimbap/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[116,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /Users/wemadeplay/workspace/stz/bibimbap/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[116,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /Users/wemadeplay/workspace/stz/bibimbap/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[119,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /Users/wemadeplay/workspace/stz/bibimbap/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[119,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /Users/wemadeplay/workspace/stz/bibimbap/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[119,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /Users/wemadeplay/workspace/stz/bibimbap/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[119,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[WARNING] /Users/wemadeplay/workspace/stz/bibimbap/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java:[119,6] org.springframework.boot.test.mock.mockito.MockBean in org.springframework.boot.test.mock.mockito has been deprecated and marked for removal
[INFO] /Users/wemadeplay/workspace/stz/bibimbap/src/test/java/com/pandoli365/bibimbap/controller/api/GameLikeControllerTest.java: /Users/wemadeplay/workspace/stz/bibimbap/src/test/java/com/pandoli365/bibimbap/controller/api/GameLikeControllerTest.java uses or overrides a deprecated API.
[INFO] /Users/wemadeplay/workspace/stz/bibimbap/src/test/java/com/pandoli365/bibimbap/controller/api/GameLikeControllerTest.java: Recompile with -Xlint:deprecation for details.
[INFO] /Users/wemadeplay/workspace/stz/bibimbap/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java: /Users/wemadeplay/workspace/stz/bibimbap/src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java has additional uses or overrides of a deprecated API that is marked for removal.
[INFO]
[INFO] --- surefire:3.5.5:test (default-test) @ bibimbap ---
[INFO] Using auto detected provider org.apache.maven.surefire.junitplatform.JUnitPlatformProvider
[INFO]
[INFO] -------------------------------------------------------
[INFO] T E S T S
[INFO] -------------------------------------------------------
[INFO] Running com.pandoli365.bibimbap.util.WebglDisplayMetadataTest
[INFO] Tests run: 6, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.214 s -- in com.pandoli365.bibimbap.util.WebglDisplayMetadataTest
[INFO] Running com.pandoli365.bibimbap.util.TagSanitizerTest
[INFO] Tests run: 16, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.020 s -- in com.pandoli365.bibimbap.util.TagSanitizerTest
[INFO] Running com.pandoli365.bibimbap.security.PermissionGateTest
Mockito is currently self-attaching to enable the inline-mock-maker. This will no longer work in future releases of the JDK. Please add Mockito as an agent to your build as described in Mockito's documentation: https://javadoc.io/doc/org.mockito/mockito-core/latest/org.mockito/org/mockito/Mockito.html#0.3
OpenJDK 64-Bit Server VM warning: Sharing is only supported for boot loader classes because bootstrap classpath has been appended
WARNING: A Java agent has been loaded dynamically (/Users/wemadeplay/.m2/repository/net/bytebuddy/byte-buddy-agent/1.17.8/byte-buddy-agent-1.17.8.jar)
WARNING: If a serviceability tool is in use, please run with -XX:+EnableDynamicAgentLoading to hide this warning
WARNING: If a serviceability tool is not in use, please run with -Djdk.instrument.traceUsage for more information
WARNING: Dynamic loading of agents will be disallowed by default in a future release
[INFO] Tests run: 7, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.658 s -- in com.pandoli365.bibimbap.security.PermissionGateTest
[INFO] Running com.pandoli365.bibimbap.security.SsrfSafeFetcherTest
[INFO] Tests run: 20, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 7.189 s -- in com.pandoli365.bibimbap.security.SsrfSafeFetcherTest
[INFO] Running com.pandoli365.bibimbap.security.ZipSecurityTest
[INFO] Tests run: 20, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 6.960 s -- in com.pandoli365.bibimbap.security.ZipSecurityTest
[INFO] Running com.pandoli365.bibimbap.security.JamRoleGateTest
[INFO] Tests run: 8, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.039 s -- in com.pandoli365.bibimbap.security.JamRoleGateTest
[INFO] Running com.pandoli365.bibimbap.mapper.WebglDisplayDatabaseContractTest
[WARNING] Tests run: 1, Failures: 0, Errors: 0, Skipped: 1, Time elapsed: 0 s -- in com.pandoli365.bibimbap.mapper.WebglDisplayDatabaseContractTest
[INFO] Running com.pandoli365.bibimbap.controller.AdminConsoleControllerTest
[INFO] Tests run: 13, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.054 s -- in com.pandoli365.bibimbap.controller.AdminConsoleControllerTest
[INFO] Running com.pandoli365.bibimbap.controller.PostControllerTest
[INFO] Tests run: 10, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.110 s -- in com.pandoli365.bibimbap.controller.PostControllerTest
[INFO] Running com.pandoli365.bibimbap.controller.JamAwardAdminControllerTest
[INFO] Tests run: 7, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.043 s -- in com.pandoli365.bibimbap.controller.JamAwardAdminControllerTest
[INFO] Running com.pandoli365.bibimbap.controller.JamAwardControllerTest
[INFO] Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.027 s -- in com.pandoli365.bibimbap.controller.JamAwardControllerTest
[INFO] Running com.pandoli365.bibimbap.controller.JamControllerTest
[INFO] Tests run: 14, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.063 s -- in com.pandoli365.bibimbap.controller.JamControllerTest
[INFO] Running com.pandoli365.bibimbap.controller.BadgeManageControllerTest
[INFO] Tests run: 14, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.027 s -- in com.pandoli365.bibimbap.controller.BadgeManageControllerTest
[INFO] Running com.pandoli365.bibimbap.controller.JamScoringControllerTest
[INFO] Tests run: 19, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.068 s -- in com.pandoli365.bibimbap.controller.JamScoringControllerTest
[INFO] Running com.pandoli365.bibimbap.controller.SearchControllerTest
[INFO] Tests run: 12, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.034 s -- in com.pandoli365.bibimbap.controller.SearchControllerTest
[INFO] Running com.pandoli365.bibimbap.controller.api.GameCommentControllerTest
[INFO] Tests run: 18, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.026 s -- in com.pandoli365.bibimbap.controller.api.GameCommentControllerTest
[INFO] Running com.pandoli365.bibimbap.controller.api.GameLikeControllerTest
[INFO] Tests run: 8, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.074 s -- in com.pandoli365.bibimbap.controller.api.GameLikeControllerTest
[INFO] Running com.pandoli365.bibimbap.controller.api.GameReviewControllerTest
09:42:31.897 [main] WARN com.pandoli365.bibimbap.controller.api.GameReviewController -- [BADGE] ?? ?? ? ?? userId=7 reviewId=50
java.lang.RuntimeException: boom
at com.pandoli365.bibimbap.badge.ReputationService.record(ReputationService.java:22)
at com.pandoli365.bibimbap.controller.api.GameReviewController.createReview(GameReviewController.java:222)
at com.pandoli365.bibimbap.controller.api.GameReviewControllerTest.createReview(GameReviewControllerTest.java:525)
at com.pandoli365.bibimbap.controller.api.GameReviewControllerTest.createReviewSucceedsEvenWhenReputationHookThrows(GameReviewControllerTest.java:447)
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
at java.base/java.lang.reflect.Method.invoke(Method.java:580)
at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:775)
at org.junit.platform.commons.support.ReflectionSupport.invokeMethod(ReflectionSupport.java:479)
at org.junit.jupiter.engine.execution.MethodInvocation.proceed(MethodInvocation.java:60)
at org.junit.jupiter.engine.execution.InvocationInterceptorChain$ValidatingInvocation.proceed(InvocationInterceptorChain.java:131)
at org.junit.jupiter.engine.extension.TimeoutExtension.intercept(TimeoutExtension.java:161)
at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestableMethod(TimeoutExtension.java:152)
at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestMethod(TimeoutExtension.java:91)
at org.junit.jupiter.engine.execution.InterceptingExecutableInvoker$ReflectiveInterceptorCall.lambda$ofVoidMethod$0(InterceptingExecutableInvoker.java:112)
at org.junit.jupiter.engine.execution.InterceptingExecutableInvoker.lambda$invoke$0(InterceptingExecutableInvoker.java:94)
at org.junit.jupiter.engine.execution.InvocationInterceptorChain$InterceptedInvocation.proceed(InvocationInterceptorChain.java:106)
at org.junit.jupiter.engine.execution.InvocationInterceptorChain.proceed(InvocationInterceptorChain.java:64)
at org.junit.jupiter.engine.execution.InvocationInterceptorChain.chainAndInvoke(InvocationInterceptorChain.java:45)
at org.junit.jupiter.engine.execution.InvocationInterceptorChain.invoke(InvocationInterceptorChain.java:37)
at org.junit.jupiter.engine.execution.InterceptingExecutableInvoker.invoke(InterceptingExecutableInvoker.java:93)
at org.junit.jupiter.engine.execution.InterceptingExecutableInvoker.invoke(InterceptingExecutableInvoker.java:87)
at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$7(TestMethodTestDescriptor.java:216)
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:212)
at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:137)
at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:69)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:156)
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:146)
at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:144)
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:143)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:100)
at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)
at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:160)
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:146)
at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:144)
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:143)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:100)
at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)
at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:160)
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:146)
at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:144)
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:143)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:100)
at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:35)
at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57)
at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:54)
at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:201)
at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:170)
at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:94)
at org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:59)
at org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:142)
at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:58)
at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:103)
at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:85)
at org.junit.platform.launcher.core.DelegatingLauncher.execute(DelegatingLauncher.java:47)
at org.junit.platform.launcher.core.InterceptingLauncher.lambda$execute$1(InterceptingLauncher.java:39)
at org.junit.platform.launcher.core.ClasspathAlignmentCheckingLauncherInterceptor.intercept(ClasspathAlignmentCheckingLauncherInterceptor.java:25)
at org.junit.platform.launcher.core.InterceptingLauncher.execute(InterceptingLauncher.java:38)
at org.junit.platform.launcher.core.DelegatingLauncher.execute(DelegatingLauncher.java:47)
at org.apache.maven.surefire.junitplatform.LauncherAdapter.executeWithoutCancellationToken(LauncherAdapter.java:60)
at org.apache.maven.surefire.junitplatform.LauncherAdapter.execute(LauncherAdapter.java:52)
at org.apache.maven.surefire.junitplatform.JUnitPlatformProvider.execute(JUnitPlatformProvider.java:203)
at org.apache.maven.surefire.junitplatform.JUnitPlatformProvider.invokeAllTests(JUnitPlatformProvider.java:168)
at org.apache.maven.surefire.junitplatform.JUnitPlatformProvider.invoke(JUnitPlatformProvider.java:136)
at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:385)
at org.apache.maven.surefire.booter.ForkedBooter.execute(ForkedBooter.java:162)
at org.apache.maven.surefire.booter.ForkedBooter.run(ForkedBooter.java:507)
at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:495)
[INFO] Tests run: 24, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.058 s -- in com.pandoli365.bibimbap.controller.api.GameReviewControllerTest
[INFO] Running com.pandoli365.bibimbap.controller.api.GameUploadControllerSecurityTest
09:42:31.933 [main] INFO com.pandoli365.bibimbap.controller.api.GameUploadController -- WebGL zip upload request received. fileName=build.zip, size=701, contentType=application/zip
09:42:31.942 [main] INFO com.pandoli365.bibimbap.controller.api.GameUploadController -- WebGL zip upload completed. gameUuid=01c16184-c912-4e6a-a91e-d1866c38221f, webglPath=/game/01c16184-c912-4e6a-a91e-d1866c38221f/index.html, entryCount=5, extractedBytes=56
09:42:31.948 [main] INFO com.pandoli365.bibimbap.controller.api.GameUploadController -- WebGL zip upload request received. fileName=build.zip, size=701, contentType=application/zip
09:42:31.950 [main] INFO com.pandoli365.bibimbap.controller.api.GameUploadController -- WebGL zip upload request received. fileName=build.txt, size=701, contentType=text/plain
09:42:31.956 [main] INFO com.pandoli365.bibimbap.controller.api.GameUploadController -- WebGL zip upload request received. fileName=build.zip, size=701, contentType=application/zip
09:42:31.960 [main] INFO com.pandoli365.bibimbap.controller.api.GameUploadController -- WebGL zip upload request received. fileName=build.zip, size=537919488, contentType=application/zip
09:42:31.962 [main] INFO com.pandoli365.bibimbap.controller.api.GameUploadController -- WebGL zip upload request received. fileName=build.zip, size=701, contentType=application/zip
09:42:31.972 [main] INFO com.pandoli365.bibimbap.controller.api.GameUploadController -- WebGL zip upload completed. gameUuid=69b411a6-a08b-481c-b31d-4b29f26d275f, webglPath=/game/69b411a6-a08b-481c-b31d-4b29f26d275f/index.html, entryCount=5, extractedBytes=56
09:42:31.978 [main] INFO com.pandoli365.bibimbap.controller.api.GameUploadController -- WebGL zip upload request received. fileName=build.zip, size=9, contentType=application/zip
09:42:31.980 [main] INFO com.pandoli365.bibimbap.controller.api.GameUploadController -- WebGL zip upload request received. fileName=build.zip, size=929, contentType=application/zip
09:42:31.989 [main] INFO com.pandoli365.bibimbap.controller.api.GameUploadController -- WebGL zip upload completed. gameUuid=d5cc7729-aed7-4bd2-8edf-4644efc5d21f, webglPath=/game/d5cc7729-aed7-4bd2-8edf-4644efc5d21f/nested/index.html, entryCount=6, extractedBytes=95
09:42:31.989 [main] INFO com.pandoli365.bibimbap.controller.api.GameUploadController -- WebGL zip upload request received. fileName=build.zip, size=930, contentType=application/zip
09:42:31.994 [main] INFO com.pandoli365.bibimbap.controller.api.GameUploadController -- WebGL zip upload completed. gameUuid=e1b3bdf4-3c52-4fde-88cf-4d132b7bf169, webglPath=/game/e1b3bdf4-3c52-4fde-88cf-4d132b7bf169/nested/index.html, entryCount=6, extractedBytes=96
09:42:31.994 [main] INFO com.pandoli365.bibimbap.controller.api.GameUploadController -- WebGL zip upload request received. fileName=build.zip, size=924, contentType=application/zip
09:42:32.001 [main] INFO com.pandoli365.bibimbap.controller.api.GameUploadController -- WebGL zip upload completed. gameUuid=02b8dc25-68f6-4192-b57d-c3f0d88044f6, webglPath=/game/02b8dc25-68f6-4192-b57d-c3f0d88044f6/nested/index.html, entryCount=6, extractedBytes=95
09:42:32.001 [main] INFO com.pandoli365.bibimbap.controller.api.GameUploadController -- WebGL zip upload request received. fileName=build.zip, size=888, contentType=application/zip
09:42:32.010 [main] INFO com.pandoli365.bibimbap.controller.api.GameUploadController -- WebGL zip upload completed. gameUuid=81843fa5-c951-42dc-9994-8745df568909, webglPath=/game/81843fa5-c951-42dc-9994-8745df568909/nested/index.html, entryCount=6, extractedBytes=52
09:42:32.028 [main] INFO com.pandoli365.bibimbap.controller.api.GameUploadController -- WebGL zip upload request received. fileName=build.zip, size=701, contentType=application/zip
[INFO] Tests run: 12, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.118 s -- in com.pandoli365.bibimbap.controller.api.GameUploadControllerSecurityTest
[INFO] Running com.pandoli365.bibimbap.controller.api.GameDisplayMetadataTest
[INFO] Tests run: 7, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.042 s -- in com.pandoli365.bibimbap.controller.api.GameDisplayMetadataTest
[INFO] Running com.pandoli365.bibimbap.controller.api.UserControllerCsrfTest
[INFO] Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.485 s -- in com.pandoli365.bibimbap.controller.api.UserControllerCsrfTest
[INFO] Running com.pandoli365.bibimbap.controller.TagControllerTest
[INFO] Tests run: 19, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.023 s -- in com.pandoli365.bibimbap.controller.TagControllerTest
[INFO] Running com.pandoli365.bibimbap.controller.WebMvcControllerTest
[INFO] Tests run: 11, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.022 s -- in com.pandoli365.bibimbap.controller.WebMvcControllerTest
[INFO] Running com.pandoli365.bibimbap.controller.JamJudgeAdminControllerTest
[INFO] Tests run: 14, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.007 s -- in com.pandoli365.bibimbap.controller.JamJudgeAdminControllerTest
[INFO] Running com.pandoli365.bibimbap.controller.JamVoteControllerTest
[INFO] Tests run: 23, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.024 s -- in com.pandoli365.bibimbap.controller.JamVoteControllerTest
[INFO] Running com.pandoli365.bibimbap.controller.JamAdminControllerTest
[INFO] Tests run: 10, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.035 s -- in com.pandoli365.bibimbap.controller.JamAdminControllerTest
[INFO] Running com.pandoli365.bibimbap.BibimbapApplicationTests
09:42:32.705 [main] INFO org.springframework.test.context.support.AnnotationConfigContextLoaderUtils -- Could not detect default configuration classes for test class [com.pandoli365.bibimbap.BibimbapApplicationTests]: BibimbapApplicationTests does not declare any static, non-private, non-final, nested classes annotated with @Configuration.
09:42:32.763 [main] INFO org.springframework.boot.test.context.SpringBootTestContextBootstrapper -- Found @SpringBootConfiguration com.pandoli365.bibimbap.BibimbapApplication for test class com.pandoli365.bibimbap.BibimbapApplicationTests
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v3.5.16)
2026-10-14T09:42:32.908+09:00 INFO 41713 --- [bibimbap] [ main] c.p.bibimbap.BibimbapApplicationTests : Starting BibimbapApplicationTests using Java 21.0.11 with PID 41713 (started by wemadeplay in /Users/wemadeplay/workspace/stz/bibimbap)
2026-10-14T09:42:32.909+09:00 INFO 41713 --- [bibimbap] [ main] c.p.bibimbap.BibimbapApplicationTests : The following 1 profile is active: "dev"
2026-10-14T09:42:33.541+09:00 INFO 41713 --- [bibimbap] [ main] o.s.b.a.w.s.WelcomePageHandlerMapping : Adding welcome page template: index
2026-10-14T09:42:33.606+09:00 WARN 41713 --- [bibimbap] [ main] o.s.w.s.resource.ResourceHandlerUtils : Appended trailing slash to static resource location: file:///Users/wemadeplay/workspace/stz/bibimbap/src/main/resources/static/game/profile/
2026-10-14T09:42:33.656+09:00 INFO 41713 --- [bibimbap] [ main] c.p.bibimbap.BibimbapApplicationTests : Started BibimbapApplicationTests in 0.845 seconds (process running for 17.757)
2026-10-14T09:42:33.658+09:00 INFO 41713 --- [bibimbap] [ main] c.p.bibimbap.config.BadgeCatalogSeeder : [BADGE] ?? ???? ?? ??: 2 ?
2026-10-14T09:42:33.658+09:00 INFO 41713 --- [bibimbap] [ main] c.p.b.config.PermissionCatalogVerifier : [RBAC] ?? ???? ?? ??: 4 ?
[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.994 s -- in com.pandoli365.bibimbap.BibimbapApplicationTests
[INFO] Running com.pandoli365.bibimbap.service.PostMarkdownServiceTest
[INFO] Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.017 s -- in com.pandoli365.bibimbap.service.PostMarkdownServiceTest
[INFO] Running com.pandoli365.bibimbap.service.BadgeServiceTest
[INFO] Tests run: 12, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.004 s -- in com.pandoli365.bibimbap.service.BadgeServiceTest
[INFO] Running com.pandoli365.bibimbap.service.UnityFeedPollerTest
[INFO] Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.020 s -- in com.pandoli365.bibimbap.service.UnityFeedPollerTest
[INFO] Running com.pandoli365.bibimbap.service.FeedParserTest
[Fatal Error] :1:1: ??????? ???? ???? ????.
[Fatal Error] :2:10: DOCTYPE? "http://apache.org/xml/features/disallow-doctype-decl" ??? true? ??? ?? ???? ????.
[INFO] Tests run: 7, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.031 s -- in com.pandoli365.bibimbap.service.FeedParserTest
[INFO] Running com.pandoli365.bibimbap.jam.JamAwardServiceTest
[INFO] Tests run: 7, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.009 s -- in com.pandoli365.bibimbap.jam.JamAwardServiceTest
[INFO] Running com.pandoli365.bibimbap.jam.JamLifecycleTest
[INFO] Tests run: 8, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.001 s -- in com.pandoli365.bibimbap.jam.JamLifecycleTest
[INFO] Running com.pandoli365.bibimbap.jam.JamEvalWindowTest
[INFO] Tests run: 10, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.001 s -- in com.pandoli365.bibimbap.jam.JamEvalWindowTest
[INFO]
[INFO] Results:
[INFO]
[INFO] Tests run: 377, Failures: 0, Errors: 0, Skipped: 1
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 21.623 s
[INFO] Finished at: 2026-10-14T09:42:33+09:00
[INFO] ------------------------------------------------------------------------
TAP version 13
# Subtest: every uploaded build fits both axes in every normal and expanded viewport
ok 1 - every uploaded build fits both axes in every normal and expanded viewport
---
duration_ms: 0.692625
type: 'test'
...
# Subtest: portrait iframe uses build aspect rather than the former fixed landscape rectangle
ok 2 - portrait iframe uses build aspect rather than the former fixed landscape rectangle
---
duration_ms: 0.063958
type: 'test'
...
# Subtest: SSR player ships the stored ratio and responsive stage without the old hard limit
ok 3 - SSR player ships the stored ratio and responsive stage without the old hard limit
---
duration_ms: 2.61775
type: 'test'
...
# Subtest: resize and overlay preserve same iframe, game state and source; close restores scroll/focus
ok 4 - resize and overlay preserve same iframe, game state and source; close restores scroll/focus
---
duration_ms: 0.482375
type: 'test'
...
# Subtest: successful fullscreen enters and exits without reload and restores focus
ok 5 - successful fullscreen enters and exits without reload and restores focus
---
duration_ms: 3.01275
type: 'test'
...
# Subtest: unsupported and rejected fullscreen use dismissible overlay
ok 6 - unsupported and rejected fullscreen use dismissible overlay
---
duration_ms: 0.517167
type: 'test'
...
# Subtest: native fullscreen exit from overlay returns to overlay; Tab remains within player
ok 7 - native fullscreen exit from overlay returns to overlay; Tab remains within player
---
duration_ms: 0.333167
type: 'test'
...
# Subtest: invalid reference metadata retains safe fallback rather than overflowing
ok 8 - invalid reference metadata retains safe fallback rather than overflowing
---
duration_ms: 0.819833
type: 'test'
...
# Subtest: ZIP selection discovers each build before save; automatic metadata resets on replacement
ok 9 - ZIP selection discovers each build before save; automatic metadata resets on replacement
---
duration_ms: 3.199
type: 'test'
...
# Subtest: custom dimensions survive new ZIP and final save chains server upload path
ok 10 - custom dimensions survive new ZIP and final save chains server upload path
---
duration_ms: 1.52025
type: 'test'
...
# Subtest: automatic save sends mode and upload path and lets server resolve dimensions
ok 11 - automatic save sends mode and upload path and lets server resolve dimensions
---
duration_ms: 0.855791
type: 'test'
...
1..11
# tests 11
# suites 0
# pass 11
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 59.209958
[INFO] Scanning for projects...
[INFO]
[INFO] ----------------------< com.pandoli365:bibimbap >-----------------------
[INFO] Building bibimbap 0.0.1-SNAPSHOT
[INFO] from pom.xml
[INFO] --------------------------------[ war ]---------------------------------
[INFO]
[INFO] --- resources:3.3.1:resources (default-resources) @ bibimbap ---
[INFO] Copying 7 resources from src/main/resources to target/classes
[INFO]
[INFO] --- compiler:3.14.1:compile (default-compile) @ bibimbap ---
[INFO] Nothing to compile - all classes are up to date.
[INFO]
[INFO] --- resources:3.3.1:testResources (default-testResources) @ bibimbap ---
[INFO] skip non existing resourceDirectory /Users/wemadeplay/workspace/stz/bibimbap/src/test/resources
[INFO]
[INFO] --- compiler:3.14.1:testCompile (default-testCompile) @ bibimbap ---
[INFO] Nothing to compile - all classes are up to date.
[INFO]
[INFO] --- surefire:3.5.5:test (default-test) @ bibimbap ---
[INFO] Tests are skipped.
[INFO]
[INFO] --- war:3.4.0:war (default-war) @ bibimbap ---
[INFO] Packaging webapp
[INFO] Assembling webapp [bibimbap] in [/Users/wemadeplay/workspace/stz/bibimbap/target/bibimbap-0.0.1-SNAPSHOT]
[INFO] Processing war project
[INFO] Copying webapp resources [/Users/wemadeplay/workspace/stz/bibimbap/src/main/webapp]
[INFO] Building war: /Users/wemadeplay/workspace/stz/bibimbap/target/bibimbap-0.0.1-SNAPSHOT.war
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1.073 s
[INFO] Finished at: 2026-10-14T09:42:35+09:00
[INFO] ------------------------------------------------------------------------
L1 WebGL display: PASS (Java regression, Node player regression, WAR package)
NOTICE: column "display_width" of relation "games" already exists, skipping
NOTICE: column "display_height" of relation "games" already exists, skipping
NOTICE: column "display_source" of relation "games" already exists, skipping
[INFO] Scanning for projects...
[INFO]
[INFO] ----------------------< com.pandoli365:bibimbap >-----------------------
[INFO] Building bibimbap 0.0.1-SNAPSHOT
[INFO] from pom.xml
[INFO] --------------------------------[ war ]---------------------------------
[INFO]
[INFO] --- resources:3.3.1:resources (default-resources) @ bibimbap ---
[INFO] Copying 7 resources from src/main/resources to target/classes
[INFO]
[INFO] --- compiler:3.14.1:compile (default-compile) @ bibimbap ---
[INFO] Nothing to compile - all classes are up to date.
[INFO]
[INFO] --- resources:3.3.1:testResources (default-testResources) @ bibimbap ---
[INFO] skip non existing resourceDirectory /Users/wemadeplay/workspace/stz/bibimbap/src/test/resources
[INFO]
[INFO] --- compiler:3.14.1:testCompile (default-testCompile) @ bibimbap ---
[INFO] Nothing to compile - all classes are up to date.
[INFO]
[INFO] --- surefire:3.5.5:test (default-test) @ bibimbap ---
[INFO] Using auto detected provider org.apache.maven.surefire.junitplatform.JUnitPlatformProvider
[INFO]
[INFO] -------------------------------------------------------
[INFO] T E S T S
[INFO] -------------------------------------------------------
[INFO] Running com.pandoli365.bibimbap.mapper.WebglDisplayDatabaseContractTest
[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.228 s -- in com.pandoli365.bibimbap.mapper.WebglDisplayDatabaseContractTest
[INFO]
[INFO] Results:
[INFO]
[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1.457 s
[INFO] Finished at: 2026-10-14T09:42:41+09:00
[INFO] ------------------------------------------------------------------------
L2 WebGL display: PASS (legacy row, idempotency, checks, fresh equivalence, actual mapper roundtrip)

View File

@ -0,0 +1,4 @@
bash: warning: setlocale: LC_ALL: cannot change locale (C.UTF-8): Bad file descriptor
The operation couldn’t be completed. Unable to locate a Java Runtime.
Please visit http://www.java.com for information on installing Java.

View File

@ -0,0 +1,22 @@
---
phase: documentation
agent: documentation-advisor
agent_version: 1
report_invocation_id: inv-005
generated_at: 2026-10-14T09:54:53.525775+09:00
concerns_checked: true
concerns:
- Existing usage index setup-checklist.md and faq.md links have no target; unrelated to feature.
- Trusted touchscreen and named Unity button outcome remain unverified.
- Baseline failure evidence is SSR markup regression; previous browser geometry was not replayed.
---
# 문서화 보고
| 경로 | 카테고리 | 유형 | 링크 추가한 index | 교차 링크 |
|---|---|---|---|---|
| docs/usage/webgl-display.md | usage | 실행 명령/Java 환경 교정 | docs/usage/index.md 기존 링크 확인 | contracts/webgl-display-metadata.md |
| docs/changes/2026-10-14-webgl-display.md | changes | 실제 검증 결과/한계 기록 | docs/changes/index.md 기존 링크 확인 | usage/webgl-display.md, 세션 검증/감사 |
실행 계약은 usage, 이번 구현 결과는 changes, 메타 계약은 contracts에 유지했다. 문서 스코프 대조 완료. 상세 감사: [final-doc-ui-audit.md](artifacts/final-doc-ui-audit.md). 미완료: trusted touch/named Unity 버튼 결과, 이전 브라우저 geometry. 구현 제품/테스트 코드와 DB/런타임/정책은 변경하지 않았다.
self_verification: checklist_passed=true; backport=N/A. documentation-guidelines.md는 없어 category/advisor 체크리스트를 적용했다.

View File

@ -0,0 +1,116 @@
---
phase: design
agent: design-advisor
agent_version: 1
report_invocation_id: inv-002
generated_at: 2026-10-14T09:29:21+09:00
concerns_checked: true
concerns:
- Arbitrary WebGL templates may contain no statically recoverable intended dimensions; automatic inference cannot promise Unity scene layout adaptation. Author override is required for these cases.
- New database columns must precede deployment. Existing shared local containers are running; use isolated test DB/runtime, and do not apply shared/production DDL without orchestrator gate.
references:
requirements: user clarification — every uploaded game, not the example ZIP
research: ../research/research.md
adrs: []
---
# 설계: 업로드 빌드별 WebGL 플레이 화면
## 목표 / 비목표
빌드마다 기준 폭·높이를 안전하게 읽고 등록·수정 시 영속화하여, 상세 화면이 해당 게임의 정확한 비율로 양축 contain한다. 작성자가 감지 결과를 교정할 수 있고, 기존 게임도 읽기 시 감지 또는 명시된 기본값으로 작동한다. 확대·전체화면 변경에도 iframe 및 게임 인스턴스를 유지한다.
Unity 내부 카메라/Canvas Scaler/앵커를 개조하거나 임의 템플릿의 의도 해상도를 완벽히 추론하는 작업은 범위 밖이다. ZIP 원본과 업로드 HTML은 변경하지 않는다. 특정 게임 이름/390×844를 제품 기본값으로 사용하지 않는다.
## 개요
현재 업로드는 ZIP 추출→index 찾기→Unity 파일 검사→저장→webglPath 응답이다. 추가할 정적 분석기는 검증된 추출 디렉터리의 index와 인접 메타만 읽는다. 메타는 정수와 제한된 출처 enum으로만 반환하며 HTML/JS 실행, 스크립트 fetch, 임의 HTML 주입을 하지 않는다. 게임별 dimensions는 DB 게임 row에 저장된다. 부모는 dimensions로 iframe 박스만 조정하므로 별도 asset-origin 구성에서도 작동한다.
JS가 없는 초기 렌더에서도 서버 제공 비율 기반 CSS contain이 작동해야 한다. JS는 가용 크기 재계산과 확대/전체화면 상태만 담당한다. 디자인은 기존 골드/다크 테마, shell, 버튼 스타일을 유지한다. Impeccable adapt skill/context를 읽었으며 narrow refinement로 판정했다. PRODUCT.md 신규 생성/리디자인은 필요하지 않다.
## 플로우
1. ZIP 업로드 후 `ZipSecurity.assertUnityBuild` 통과, 이동 전에 `WebglDisplayMetadata.detect(indexFile)` 실행. 검사 오류/알 수 없는 템플릿은 업로드 실패 사유가 아니다. `displayWidth`, `displayHeight`는 둘 다 integer 또는 둘 다 null, `displaySource`는 enum이다.
2. 등록 폼에 “화면 크기”와 자동/직접 지정 선택을 제공한다. 자동 기본값으로 업로드 결과를 안내하고, 직접 지정이면 폭/높이 두 number 입력을 활성화한다. UX에 HTML parser/출처 enum/DB 등 구현 세부를 노출하지 않는다. 예: “빌드에서 960 × 600 화면을 확인했습니다.” / “화면 크기를 확인하지 못했습니다. 직접 지정하거나 기본 가로 화면으로 등록할 수 있습니다.”
3. 폼은 업로드가 끝난 뒤 최종 `/game/new` 또는 `/game/{id}/edit` 저장 요청을 보낸다. 자동이면 서버가 등록 대상의 저장된 index를 다시 분석하여 dims/source를 확정한다. 직접 지정이면 서버 범위 검증 후 source=manual로 저장한다. 업로드 응답을 클라이언트가 변경해도 server source 판정은 바뀌지 않는다.
4. 수정: 기존 manual 값은 직접 지정 선택에 로드한다. 기존 자동 값은 자동 선택 및 감지 결과 표시. 새 ZIP 선택 시 과거 자동 결과를 초기화하고 새 응답 반영; 직접 지정 값은 사용자 의도이므로 유지하며 필요 시 수정 가능하게 한다. mode 누락을 포함한 구 클라이언트 수정 요청은 webglPath 동일 시 기존 metadata 보존; path 교체 시 재감지한다.
5. 상세 GET: 유효 저장 dims 우선. null인 기존 row는 업로드 저장 index를 읽기 전용 감지한다(백필/write 없음). 감지 실패/파일 없음은 source=unknown, 16:9 fallback. nullable row를 예시 게임 비율로 일괄 변경하지 않는다. 작성자는 기존 게임 수정 화면에서 직접 지정 또는 자동 재저장 가능하다.
6. 플레이 영역은 정확한 ratio 유지, 검은 여백 중앙 정렬. “크게 보기”는 같은 wrapper를 viewport overlay로 전환하고 Esc/닫기로 복귀; “전체화면”은 같은 wrapper의 Fullscreen API 사용. API unsupported/rejected면 크게 보기 기능으로 안전하게 전환하고 간단한 상태 안내. 같은 iframe DOM과 src 유지, reload/reparent/transform-scale 금지.
## 감지 계약 / 우선순위
- 정수 1..16384만 허용; width/height 둘 모두 필요; 극단적인 종횡비 1:32..32:1 밖은 unknown 처리. 정수형 숫자와 숫자 문자열은 명시 검증 후 지원 가능. NaN, 무한대, fraction, 음수, 불완전 pair는 거부/unknown. 300×150은 기본 canvas 버퍼로 간주하여 자동 근거에서 제외한다(작성자 manual 지정은 가능).
- 순서: **manual > 인접 `build-info.json`의 top-level `width/height` > 명확한 Unity canvas의 CSS pixel 크기 > 명시 canvas width/height 속성 > unknown fallback**. build-info가 손상되면 다음 신호로 진행한다. metadata는 기술상 선언값이며 실제 scene 의도 검증과 구분한다.
- `build-info.json`은 선택된 index와 같은 디렉터리만 읽는다. 다른 빌드의 metadata를 재귀 탐색해서 혼합하지 않는다. 정적 index 최대 1MiB, JSON 최대 64KiB, 제한 넘으면 해당 신호 skip; bounded read로 메모리 공격 방지. 읽을 때 normalize/real-path boundary, regular-file 및 symlink 방어를 기존 업로드 경계 규칙과 정합한다.
- 기존 jsoup 의존성 활용. canvas는 `id=unity-canvas` 우선, 없으면 canvas가 정확히 1개인 경우만 허용. 복수 ambiguous canvas는 unknown. pixel CSS는 대상 canvas 또는 명확한 `#unity-container`의 inline style/style block의 width/height pair, 혹은 Unity 기본 템플릿의 canvas 변수에 대한 literal `style.width = "960px"`, `style.height = "600px"` pair만 support한다. 이때 해당 변수가 Unity canvas query와 명확히 연결되고 재할당/충돌없는 경우만 인정한다. 문자열/comments/다른 객체의 style을 주워오지 않는다. 안전한 제한 matcher로 충분하지 않으면 그 JS 형식은 지원 제외하고 explicit attrs를 사용한다.
- percent/vw/vh/calc/min/max/동적 JS 실행값/외부 stylesheet는 intended dimensions 증거로 사용하지 않는다. canvas 속성은 초기 buffer일 수 있어 낮은 confidence로 안내하고 manual override를 제공한다. 충돌한 저우선 신호는 고우선 신호를 덮어쓰지 않는다. parser exceptions은 unknown, 원래 업로드 성공을 유지한다.
- helper는 `detect(Path indexFile /* 검증된 빌드 진입점 */)` 최소 인자. 저장 경로에서 detect를 호출하는 계층은 configured game-storage root 하위만 허용하며 HTTP fetch/사용자 입력 absolute path는 사용하지 않는다. 정적 유틸이면 기존 constructor wiring을 최소화할 수 있다.
## 데이터 모델
`games`: nullable `display_width integer`, `display_height integer`, `display_source varchar(16)` 추가. null pair는 기존/unknown. 두 값은 모두 null 또는 모두 유효 정수; source는 `build-info | css | canvas | manual | unknown`로 제한한다. ratio는 계산값으로 별도 저장하지 않는다. GameData에 Integer displayWidth/displayHeight와 String displaySource 접근자 추가. GamesMapper의 모든 GameData 조회와 INSERT/UPDATE에 필드 포함.
DB check는 pair validity 및 허용 범위/source를 보호한다. 새 스키마와 마이그레이션의 정의가 일치해야 한다. additive nullable migration은 기존 row를 삭제/수정하지 않는다. 마이그레이션 파일은 `ADD COLUMN IF NOT EXISTS` 사용, 제약명 존재 조회로 재실행 가능하게 한다. 앱 자동 DDL 및 공유 DB 자동 적용은 금지. rollback은 우선 앱 이전 버전으로 되돌리고 nullable 컬럼은 남겨도 역호환; 실제 DROP은 별도 승인 절차다.
## 외부 계약
`POST /api/game-files/webgl-zip`: 기존 필드 그대로 + optional nullable `displayWidth`, `displayHeight`, `displaySource`. unknown metadata는 정상 HTTP 200이며 게임 upload security 검사 변경 없음.
`POST /game/new`, `POST /game/{id}/edit`: optional `displayMode=auto|custom`, `displayWidth`, `displayHeight`. unknown mode 및 custom 불완전/범위밖 입력은 HTTP 400, 한국어 field error. 기존 CSRF/auth/ownership 분기 우선순서 유지. auto는 dimension params 무시하고 저장 index 정적 감지; unknown은 null/unknown 저장하며 detail fallback. legacy create(mode 미지정)는 auto. legacy edit는 앞선 보존 규칙 적용. 외부 URL은 분석하지 않는다.
SSR addGameModel은 `webglDisplayWidth/Height` 또는 동등 numeric model attribute 및 known/source를 제공한다. register editModel에도 dimension/source 추가. JSP data attrs에는 검증한 숫자만 출력한다. HTML/script 문자열 삽입 없음. iframe sandbox/allow/asset-origin 계약 유지.
## 플레이어 크기 계약
`scale = min(availableWidth / referenceWidth, availableHeight / referenceHeight)`; width=referenceWidth*scale, height=referenceHeight*scale. 비율 오차는 CSS 반올림 1px 이내. normal height budget은 `min(70dvh, 720px)`(vh fallback), actual host width는 ResizeObserver 측정한다. 큰 세로 게임이 기존 520px/16:9에 갇히지 않도록 frame stage 자체를 높이 budget으로 제공한다. CSS fallback은 stage grid center + iframe aspect ratio와 max width/height를 이용한다.
expanded/fullscreen은 safe-area 및 toolbar를 뺀 stage 실제 content box로 양축 contain. overlay 또는 fullscreen 부모에서 width/height budget을 결정하며 JS는 DOM 측정값만 사용한다. `ResizeObserver`, `window.resize`, `visualViewport.resize`(지원시), fullscreenchange로 갱신; RAF coalescing, observer 재귀 없는 변경 방식. overlay에서 body scroll 이전 값 보존/복원, Esc 및 닫기, focus 이전 요소 복귀, 버튼 aria-expanded/pressed 정확 갱신. Fullscreen promise 실패를 처리. 터치 대상 44px, focus-visible 유지, 툴바 모바일 wrapping, resize 애니메이션 및 canvas CSS transform 금지. 해당 통합은 조작 단추 2개만 사용하며 플레이어에 수동 비율 dropdown을 반복 노출하지 않는다.
## 파일 영향 맵 / 소유권
모든 기존 경로는 직접 읽기/rg로 확인했다. `신규` 표기는 구현 단계 생성할 경로다. 구현자 하나가 backend 집합, 하나가 frontend 집합을 소유할 수 있으며 같은 파일 동시 편집 금지. 테스트 작성도 구현자의 책임이다.
| 변경 | 경로 | 책임/owner |
|---|---|---|
| 신규 | src/main/java/com/pandoli365/bibimbap/util/WebglDisplayMetadata.java | 정적 감지 value/utility; backend |
| 수정 | src/main/java/com/pandoli365/bibimbap/controller/api/GameUploadController.java | ZIP 감지 및 응답; backend |
| 수정 | src/main/java/com/pandoli365/bibimbap/controller/api/GameController.java | 저장/edit/SSR 및 경계검증; backend |
| 수정 | src/main/java/com/pandoli365/bibimbap/data/GameData.java | nullable metadata; backend |
| 수정 | src/main/java/com/pandoli365/bibimbap/mapper/GamesMapper.java | 전 조회/INSERT/UPDATE; backend |
| 수정 | db/schema.sql | fresh schema; backend |
| 신규 | db/migrations/20261014-game-display-metadata.sql | 기존 row 호환 additive DDL; backend |
| 신규 | src/test/java/com/pandoli365/bibimbap/util/WebglDisplayMetadataTest.java | parser fixtures; backend |
| 수정 | src/test/java/com/pandoli365/bibimbap/controller/api/GameUploadControllerSecurityTest.java | upload response / malformed tolerated regression; backend |
| 신규 | src/test/java/com/pandoli365/bibimbap/controller/api/GameDisplayMetadataTest.java | create/edit/SSR metadata/legacy/400/CSRF/ownership; backend |
| 조건부 | src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java 및 기존 GameController 직접 호출 테스트 | constructor/signature 변경 시 fixture 전수 갱신; backend |
| 수정 | src/main/webapp/WEB-INF/views/game-register.jsp | 자동/custom 등록·수정 UI 및 upload chaining; frontend |
| 수정 | src/main/webapp/WEB-INF/views/game-detail.jsp | numeric attrs + controls, old fixed aspect CSS 교체; frontend |
| 신규 | src/main/webapp/js/webgl-player.js | contain/overlay/fullscreen stable iframe; frontend |
| 신규 | src/main/webapp/css/webgl-player.css | minimal scoped stage/toolbar/safe-area; frontend |
| 신규 | src/test/js/webgl-player.test.cjs | meaningful layout/resize/state regression (Node native test or repository convention); frontend |
| 신규 | docs/contracts/webgl-display-metadata.md | extraction/precedence/API/fallback declaration; docs owner |
| 신규 | docs/usage/webgl-display.md | author override, existing game edit, migration/use guide; docs owner |
| 신규 | docs/changes/2026-10-14-webgl-display.md | behavior/validation record; docs owner |
| 수정 | docs/contracts/index.md, docs/usage/index.md, docs/changes/index.md | indexes; docs owner |
## 롤아웃 / 마이그레이션
건강한 bibimbap-db(5433)와 bibimbap-app(8080)을 발견했으나 접근/mutation 없음. 별도 disposable DB/schema와 별도 포트 앱에 fresh schema 적용 후 migration 재실행/기존 row contract를 검증한다. credential 값 출력 없이 container 내부 환경을 이용한다. shared local/production 마이그레이션 및 배포가 필요하면 파일+검증 근거를 제공한 뒤 orchestrator가 최종 게이트 처리한다. 승인 전에도 isolated runtime에서 새 JSP와 실제 ZIP 전체 흐름을 검증할 수 있다. migration 선적용→app deployment 순서 문서화. 이 설계와 구현 자체는 사용자 승인 범위이며 재승인 불필요.
## 검증 포인트
AC self-audit: 기대값은 metadata/DOM/DB 행위 불변식에 고정하고 work-session 산출물 개수에 의존하지 않는다. 표현은 literal grep 대신 typed parser/HTTP/DB/DOM assertions; 파일 집합만 아래 명시 목록 전수 확인한다.
- AC-1 parser fixture 집합 전수: portrait, landscape, square, nested index+adjacent info, HTML attrs, Unity literal CSS, conflicting precedence, no metadata, 300×150 default, malformed JSON, invalid pair/range, multiple ambiguous canvas, malicious script/nonliteral, oversize inputs. 각 named fixture 검증 및 product에서 JS 실행 0건; metadata 없는 정상 ZIP HTTP 200.
- AC-2 실제 uploaded game: 제공 ZIP은 390×844 반환; 다른 이름의 1280×720 및 800×800 ZIP도 자신의 값 반환. filename/게임명 상수 없이 동일 계약.
- AC-3 등록→DB→상세/수정 round trip; auto/custom/legacy path 전수 분기, manual 우선, 새 ZIP metadata 업데이트, 구 edit omission 보존, unknown nullable & fallback. 두 숫자 invalid는 400, CSRF/auth/owner unchanged.
- AC-4 isolated PostgreSQL mapper 계약: migration 기존 row 유지/NULL fallback, 재실행 가능; 모든 GameData SELECT 및 INSERT/UPDATE dimensions/source 정합. fresh schema와 migrated schema 동일. L2 remote/seed 미지정만 skip 가능; 알려진 healthy DB에서 가능한 isolated 검증을 우선한다.
- AC-5 stage viewport 집합 전수: 320×844, 1440×900, 844×390, 640×300에서 portrait/landscape/square 모두 iframe 양축 boundary 이내/ratio 오차 ≤1px. 현재 16:9/max520 구현에서 portrait 회귀는 실패하고 수정 후 통과함을 확보한다.
- AC-6 resize/overlay/fullscreen 진입·해제/실패 fallback에서 exact same iframe DOM, src, load count, 게임 state 유지; Esc/닫기/focus/scroll 복원. asset-origin 다른 origin에서도 parent canvas DOM access 없이 지원.
- AC-7 실제 ZIP runtime: 준비 후 CSS client size와 drawing buffer를 별도로 기록; 정상/expanded/fullscreen(지원 브라우저) resize, 상하단 UI 표시, 버튼 좌표/클릭, 모바일 터치 입력 점검. 원본 ZIP 및 served uploaded HTML hash 미변경.
- AC-8 full `./mvnw -o test` 및 WAR package 통과; isolated 최신 앱에서 detail/register/edit 변경 JSP 전수 HTTP 200(인증 포함). runtime stacktrace 및 console error scan. 새 constructor 의존이 생기면 contextLoads mocks 갱신. screenshot은 desktop/mobile 묶음 한 번+필요 fix 한 번; Impeccable detect changed UI 대상 한 번 실행.
- AC-9 파일 영향맵의 신규 산출물은 전수 존재하되 conditional 경로는 조건 성립시에만 변경; docs 계약/사용/변경 3개와 해당 index 링크 모두 확인. verification-advisor는 테스트를 작성하지 않고 실행만 수행.
## 실행 계약 / 자가 검증
update_plan은 tools에 없어 bind를 생성하지 않았고 parent에 고지했다. child 0건, 테스트 실행 0건, 제품/ZIP/DB 변경 0건; 이 design.md만 작성했다. frontmatter/근거 경로/concerns 검토 완료. shared DB migration gate는 구현 blocker가 아니며 isolated validation 가능하다.

View File

@ -0,0 +1,12 @@
{"recorded_at": "2026-10-14T09:31:17.298843+09:00", "logical_task": "backend", "report_invocation_id": "inv-003-w01", "environment_invocation_id": "/root/atp_pool_wgimpl01_1of1_a6814cde/atp_pool_wgworkers01_1of4_f610aa01", "attempt": 1, "clean_retry_limit": 0, "clean_retry_limit_source": "parent no automatic retry authorization", "retries_spawned": 0, "event": "accepted", "provenance": "environment", "source_ref": "collaboration.spawn_agent response /root/atp_pool_wgimpl01_1of1_a6814cde/atp_pool_wgworkers01_1of4_f610aa01"}
{"recorded_at": "2026-10-14T09:31:17.298843+09:00", "logical_task": "backend", "report_invocation_id": "inv-003-w01", "environment_invocation_id": "/root/atp_pool_wgimpl01_1of1_a6814cde/atp_pool_wgworkers01_1of4_f610aa01", "attempt": 1, "clean_retry_limit": 0, "clean_retry_limit_source": "parent no automatic retry authorization", "retries_spawned": 0, "event": "ownership_active", "provenance": "advisor", "source_ref": "implementation/ownership.md#backend", "scope": ["backend"], "rationale": "Explicit allocated file write authority"}
{"recorded_at": "2026-10-14T09:31:17.298843+09:00", "logical_task": "frontend", "report_invocation_id": "inv-003-w02", "environment_invocation_id": "/root/atp_pool_wgimpl01_1of1_a6814cde/atp_pool_wgworkers01_2of4_f610aa02", "attempt": 1, "clean_retry_limit": 0, "clean_retry_limit_source": "parent no automatic retry authorization", "retries_spawned": 0, "event": "accepted", "provenance": "environment", "source_ref": "collaboration.spawn_agent response /root/atp_pool_wgimpl01_1of1_a6814cde/atp_pool_wgworkers01_2of4_f610aa02"}
{"recorded_at": "2026-10-14T09:31:17.298843+09:00", "logical_task": "frontend", "report_invocation_id": "inv-003-w02", "environment_invocation_id": "/root/atp_pool_wgimpl01_1of1_a6814cde/atp_pool_wgworkers01_2of4_f610aa02", "attempt": 1, "clean_retry_limit": 0, "clean_retry_limit_source": "parent no automatic retry authorization", "retries_spawned": 0, "event": "ownership_active", "provenance": "advisor", "source_ref": "implementation/ownership.md#frontend", "scope": ["frontend"], "rationale": "Explicit allocated file write authority"}
{"recorded_at": "2026-10-14T09:35:46.542933+09:00", "logical_task": "backend", "report_invocation_id": "inv-003-w01", "environment_invocation_id": "01a137d1-c16a-7cc1-b011-f03b6435a0e3", "attempt": 1, "event": "completed", "provenance": "environment", "source_ref": "ATP_POOL_TERMINAL_DELTA wgworkers01 index1 sha88f4812ab710268d1ffef930eb4c40dba4708e83a676391753d832d8bbcd9688", "clean_retry_limit": 0, "clean_retry_limit_source": "parent no automatic retry authorization", "retries_spawned": 0}
{"recorded_at": "2026-10-14T09:35:46.542933+09:00", "logical_task": "migration", "report_invocation_id": "inv-003-w03", "environment_invocation_id": "/root/atp_pool_wgimpl01_1of1_a6814cde/atp_pool_wgworkers01_3of4_f610aa03", "attempt": 1, "event": "accepted", "provenance": "environment", "source_ref": "collaboration.spawn_agent response", "clean_retry_limit": 0, "clean_retry_limit_source": "parent no automatic retry authorization", "retries_spawned": 0}
{"recorded_at": "2026-10-14T09:35:46.542933+09:00", "logical_task": "migration", "report_invocation_id": "inv-003-w03", "environment_invocation_id": "/root/atp_pool_wgimpl01_1of1_a6814cde/atp_pool_wgworkers01_3of4_f610aa03", "attempt": 1, "event": "ownership_active", "provenance": "advisor", "source_ref": "implementation/ownership.md#migration", "clean_retry_limit": 0, "clean_retry_limit_source": "parent no automatic retry authorization", "retries_spawned": 0, "scope": ["migration"], "rationale": "Explicit allocated write authority"}
{"recorded_at": "2026-10-14T09:36:18.956153+09:00", "logical_task": "frontend", "report_invocation_id": "inv-003-w02", "environment_invocation_id": "/root/atp_pool_wgimpl01_1of1_a6814cde/atp_pool_wgworkers01_2of4_f610aa02", "attempt": 1, "event": "completed", "provenance": "environment", "source_ref": "collaboration FINAL_ANSWER wgworkers01 2/4 f610aa02", "clean_retry_limit": 0, "clean_retry_limit_source": "parent no automatic retry authorization", "retries_spawned": 0}
{"recorded_at": "2026-10-14T09:36:18.956153+09:00", "logical_task": "docs-verification", "report_invocation_id": "inv-003-w04", "environment_invocation_id": "/root/atp_pool_wgimpl01_1of1_a6814cde/atp_pool_wgworkers01_4of4_f610aa04", "attempt": 1, "event": "accepted", "provenance": "environment", "source_ref": "collaboration.spawn_agent response wgworkers01 4/4", "clean_retry_limit": 0, "clean_retry_limit_source": "parent no automatic retry authorization", "retries_spawned": 0}
{"recorded_at": "2026-10-14T09:36:18.956153+09:00", "logical_task": "docs-verification", "report_invocation_id": "inv-003-w04", "environment_invocation_id": "/root/atp_pool_wgimpl01_1of1_a6814cde/atp_pool_wgworkers01_4of4_f610aa04", "attempt": 1, "event": "ownership_active", "provenance": "advisor", "source_ref": "implementation/ownership.md#docs-verification", "clean_retry_limit": 0, "clean_retry_limit_source": "parent no automatic retry authorization", "retries_spawned": 0, "scope": ["docs-verification"], "rationale": "Explicit allocated write authority"}
{"recorded_at": "2026-10-14T09:36:43.485758+09:00", "logical_task": "migration", "report_invocation_id": "inv-003-w03", "environment_invocation_id": "01a137d5-fbdb-7f31-a4aa-87ad3782bff0", "attempt": 1, "event": "completed", "provenance": "environment", "source_ref": "ATP_POOL_TERMINAL_DELTA wgworkers01 3/4 sha11a533967ee89942af4dc9ec55b7c6a20e8ace2b9d838080053bf979c7e272b2", "clean_retry_limit": 0, "clean_retry_limit_source": "parent no automatic retry authorization", "retries_spawned": 0}
{"recorded_at": "2026-10-14T09:40:31.246818+09:00", "logical_task": "docs-verification", "report_invocation_id": "inv-003-w04", "environment_invocation_id": "01a137d6-5eab-7600-a956-13344e6c6f2f", "attempt": 1, "event": "completed", "provenance": "environment", "source_ref": "ATP_POOL_TERMINAL_DELTA wgworkers01 4/4 shaa871dd0ad901598b785b5386f2c299c786a32bba7c2634d76d0b9aa1aeb7a924", "clean_retry_limit": 0, "clean_retry_limit_source": "parent no automatic retry authorization", "retries_spawned": 0}

View File

@ -0,0 +1,169 @@
[
{
"scope_id": "backend",
"scope_kind": "directory",
"scope_paths": [
"src/main/java/com/pandoli365/bibimbap/util/WebglDisplayMetadata.java",
"src/main/java/com/pandoli365/bibimbap/controller/api/GameUploadController.java",
"src/main/java/com/pandoli365/bibimbap/controller/api/GameController.java",
"src/main/java/com/pandoli365/bibimbap/data/GameData.java",
"src/main/java/com/pandoli365/bibimbap/mapper/GamesMapper.java",
"src/test/java/com/pandoli365/bibimbap/util/WebglDisplayMetadataTest.java",
"src/test/java/com/pandoli365/bibimbap/controller/api/GameUploadControllerSecurityTest.java",
"src/test/java/com/pandoli365/bibimbap/controller/api/GameDisplayMetadataTest.java",
"src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java"
],
"state": "released",
"owner_report_invocation_id": "inv-003-w01",
"owner_environment_invocation_id": "01a137d1-c16a-7cc1-b011-f03b6435a0e3",
"revoked_from_report_invocation_id": null,
"revoked_from_environment_invocation_id": null,
"handoff_to_report_invocation_id": null,
"handoff_to_environment_invocation_id": null,
"handoff_at": null,
"dependencies": [],
"reservation": {
"directory": null,
"namespace": null,
"namespace_key": null,
"schema_files": []
},
"generated_paths": [
"src/main/java/com/pandoli365/bibimbap/util/WebglDisplayMetadata.java",
"src/main/java/com/pandoli365/bibimbap/controller/api/GameUploadController.java",
"src/main/java/com/pandoli365/bibimbap/controller/api/GameController.java",
"src/main/java/com/pandoli365/bibimbap/data/GameData.java",
"src/main/java/com/pandoli365/bibimbap/mapper/GamesMapper.java",
"src/test/java/com/pandoli365/bibimbap/util/WebglDisplayMetadataTest.java",
"src/test/java/com/pandoli365/bibimbap/controller/api/GameUploadControllerSecurityTest.java",
"src/test/java/com/pandoli365/bibimbap/controller/api/GameDisplayMetadataTest.java"
],
"pause": {
"reason": null,
"source_ref": null,
"caused_by_report_invocation_id": null,
"caused_by_environment_invocation_id": null
}
},
{
"scope_id": "frontend",
"scope_kind": "directory",
"scope_paths": [
"src/main/webapp/WEB-INF/views/game-register.jsp",
"src/main/webapp/WEB-INF/views/game-detail.jsp",
"src/main/webapp/js/webgl-player.js",
"src/main/webapp/css/webgl-player.css",
"src/test/js/webgl-player.test.cjs"
],
"state": "released",
"owner_report_invocation_id": "inv-003-w02",
"owner_environment_invocation_id": "/root/atp_pool_wgimpl01_1of1_a6814cde/atp_pool_wgworkers01_2of4_f610aa02",
"revoked_from_report_invocation_id": null,
"revoked_from_environment_invocation_id": null,
"handoff_to_report_invocation_id": null,
"handoff_to_environment_invocation_id": null,
"handoff_at": null,
"dependencies": [],
"reservation": {
"directory": null,
"namespace": null,
"namespace_key": null,
"schema_files": []
},
"generated_paths": [
"src/main/webapp/WEB-INF/views/game-register.jsp",
"src/main/webapp/WEB-INF/views/game-detail.jsp",
"src/main/webapp/js/webgl-player.js",
"src/main/webapp/css/webgl-player.css",
"src/test/js/webgl-player.test.cjs"
],
"pause": {
"reason": null,
"source_ref": null,
"caused_by_report_invocation_id": null,
"caused_by_environment_invocation_id": null
}
},
{
"scope_id": "migration",
"scope_kind": "migration_namespace",
"scope_paths": [
"db/schema.sql",
"db/migrations/20261014-game-display-metadata.sql"
],
"state": "released",
"owner_report_invocation_id": "inv-003-w03",
"owner_environment_invocation_id": "01a137d5-fbdb-7f31-a4aa-87ad3782bff0",
"revoked_from_report_invocation_id": null,
"revoked_from_environment_invocation_id": null,
"handoff_to_report_invocation_id": null,
"handoff_to_environment_invocation_id": null,
"handoff_at": null,
"dependencies": [],
"reservation": {
"directory": "db/migrations",
"namespace": "20261014-game-display-metadata",
"namespace_key": "db/migrations::20261014-game-display-metadata",
"schema_files": [
"db/schema.sql"
]
},
"generated_paths": [
"db/schema.sql",
"db/migrations/20261014-game-display-metadata.sql"
],
"pause": {
"reason": null,
"source_ref": null,
"caused_by_report_invocation_id": null,
"caused_by_environment_invocation_id": null
}
},
{
"scope_id": "docs-verification",
"scope_kind": "directory",
"scope_paths": [
"docs/contracts/webgl-display-metadata.md",
"docs/usage/webgl-display.md",
"docs/changes/2026-10-14-webgl-display.md",
"docs/contracts/index.md",
"docs/usage/index.md",
"docs/changes/index.md",
"docs/development/verification-strategies.md",
"scripts/verify-webgl-display.sh",
"src/test/java/com/pandoli365/bibimbap/mapper/WebglDisplayDatabaseContractTest.java"
],
"state": "released",
"owner_report_invocation_id": "inv-003-w04",
"owner_environment_invocation_id": "01a137d6-5eab-7600-a956-13344e6c6f2f",
"revoked_from_report_invocation_id": null,
"revoked_from_environment_invocation_id": null,
"handoff_to_report_invocation_id": null,
"handoff_to_environment_invocation_id": null,
"handoff_at": null,
"dependencies": [],
"reservation": {
"directory": null,
"namespace": null,
"namespace_key": null,
"schema_files": []
},
"generated_paths": [
"docs/contracts/webgl-display-metadata.md",
"docs/usage/webgl-display.md",
"docs/changes/2026-10-14-webgl-display.md",
"docs/contracts/index.md",
"docs/usage/index.md",
"docs/changes/index.md",
"docs/development/verification-strategies.md",
"scripts/verify-webgl-display.sh",
"src/test/java/com/pandoli365/bibimbap/mapper/WebglDisplayDatabaseContractTest.java"
],
"pause": {
"reason": null,
"source_ref": null,
"caused_by_report_invocation_id": null,
"caused_by_environment_invocation_id": null
}
}
]

View File

@ -0,0 +1,185 @@
---
phase: implementation
agent: implementation-advisor
agent_version: 2
generated_at: 2026-10-14T09:40:31.246818+09:00
concerns: []
concerns_checked: true
lifecycle_ledger: "./lifecycle-events.jsonl"
---
# 파일 소유권 맵
```json
{
"ownership_records": [
{
"scope_id": "backend",
"scope_kind": "directory",
"scope_paths": [
"src/main/java/com/pandoli365/bibimbap/util/WebglDisplayMetadata.java",
"src/main/java/com/pandoli365/bibimbap/controller/api/GameUploadController.java",
"src/main/java/com/pandoli365/bibimbap/controller/api/GameController.java",
"src/main/java/com/pandoli365/bibimbap/data/GameData.java",
"src/main/java/com/pandoli365/bibimbap/mapper/GamesMapper.java",
"src/test/java/com/pandoli365/bibimbap/util/WebglDisplayMetadataTest.java",
"src/test/java/com/pandoli365/bibimbap/controller/api/GameUploadControllerSecurityTest.java",
"src/test/java/com/pandoli365/bibimbap/controller/api/GameDisplayMetadataTest.java",
"src/test/java/com/pandoli365/bibimbap/BibimbapApplicationTests.java"
],
"state": "released",
"owner_report_invocation_id": "inv-003-w01",
"owner_environment_invocation_id": "01a137d1-c16a-7cc1-b011-f03b6435a0e3",
"revoked_from_report_invocation_id": null,
"revoked_from_environment_invocation_id": null,
"handoff_to_report_invocation_id": null,
"handoff_to_environment_invocation_id": null,
"handoff_at": null,
"dependencies": [],
"reservation": {
"directory": null,
"namespace": null,
"namespace_key": null,
"schema_files": []
},
"generated_paths": [
"src/main/java/com/pandoli365/bibimbap/util/WebglDisplayMetadata.java",
"src/main/java/com/pandoli365/bibimbap/controller/api/GameUploadController.java",
"src/main/java/com/pandoli365/bibimbap/controller/api/GameController.java",
"src/main/java/com/pandoli365/bibimbap/data/GameData.java",
"src/main/java/com/pandoli365/bibimbap/mapper/GamesMapper.java",
"src/test/java/com/pandoli365/bibimbap/util/WebglDisplayMetadataTest.java",
"src/test/java/com/pandoli365/bibimbap/controller/api/GameUploadControllerSecurityTest.java",
"src/test/java/com/pandoli365/bibimbap/controller/api/GameDisplayMetadataTest.java"
],
"pause": {
"reason": null,
"source_ref": null,
"caused_by_report_invocation_id": null,
"caused_by_environment_invocation_id": null
}
},
{
"scope_id": "frontend",
"scope_kind": "directory",
"scope_paths": [
"src/main/webapp/WEB-INF/views/game-register.jsp",
"src/main/webapp/WEB-INF/views/game-detail.jsp",
"src/main/webapp/js/webgl-player.js",
"src/main/webapp/css/webgl-player.css",
"src/test/js/webgl-player.test.cjs"
],
"state": "released",
"owner_report_invocation_id": "inv-003-w02",
"owner_environment_invocation_id": "/root/atp_pool_wgimpl01_1of1_a6814cde/atp_pool_wgworkers01_2of4_f610aa02",
"revoked_from_report_invocation_id": null,
"revoked_from_environment_invocation_id": null,
"handoff_to_report_invocation_id": null,
"handoff_to_environment_invocation_id": null,
"handoff_at": null,
"dependencies": [],
"reservation": {
"directory": null,
"namespace": null,
"namespace_key": null,
"schema_files": []
},
"generated_paths": [
"src/main/webapp/WEB-INF/views/game-register.jsp",
"src/main/webapp/WEB-INF/views/game-detail.jsp",
"src/main/webapp/js/webgl-player.js",
"src/main/webapp/css/webgl-player.css",
"src/test/js/webgl-player.test.cjs"
],
"pause": {
"reason": null,
"source_ref": null,
"caused_by_report_invocation_id": null,
"caused_by_environment_invocation_id": null
}
},
{
"scope_id": "migration",
"scope_kind": "migration_namespace",
"scope_paths": [
"db/schema.sql",
"db/migrations/20261014-game-display-metadata.sql"
],
"state": "released",
"owner_report_invocation_id": "inv-003-w03",
"owner_environment_invocation_id": "01a137d5-fbdb-7f31-a4aa-87ad3782bff0",
"revoked_from_report_invocation_id": null,
"revoked_from_environment_invocation_id": null,
"handoff_to_report_invocation_id": null,
"handoff_to_environment_invocation_id": null,
"handoff_at": null,
"dependencies": [],
"reservation": {
"directory": "db/migrations",
"namespace": "20261014-game-display-metadata",
"namespace_key": "db/migrations::20261014-game-display-metadata",
"schema_files": [
"db/schema.sql"
]
},
"generated_paths": [
"db/schema.sql",
"db/migrations/20261014-game-display-metadata.sql"
],
"pause": {
"reason": null,
"source_ref": null,
"caused_by_report_invocation_id": null,
"caused_by_environment_invocation_id": null
}
},
{
"scope_id": "docs-verification",
"scope_kind": "directory",
"scope_paths": [
"docs/contracts/webgl-display-metadata.md",
"docs/usage/webgl-display.md",
"docs/changes/2026-10-14-webgl-display.md",
"docs/contracts/index.md",
"docs/usage/index.md",
"docs/changes/index.md",
"docs/development/verification-strategies.md",
"scripts/verify-webgl-display.sh",
"src/test/java/com/pandoli365/bibimbap/mapper/WebglDisplayDatabaseContractTest.java"
],
"state": "released",
"owner_report_invocation_id": "inv-003-w04",
"owner_environment_invocation_id": "01a137d6-5eab-7600-a956-13344e6c6f2f",
"revoked_from_report_invocation_id": null,
"revoked_from_environment_invocation_id": null,
"handoff_to_report_invocation_id": null,
"handoff_to_environment_invocation_id": null,
"handoff_at": null,
"dependencies": [],
"reservation": {
"directory": null,
"namespace": null,
"namespace_key": null,
"schema_files": []
},
"generated_paths": [
"docs/contracts/webgl-display-metadata.md",
"docs/usage/webgl-display.md",
"docs/changes/2026-10-14-webgl-display.md",
"docs/contracts/index.md",
"docs/usage/index.md",
"docs/changes/index.md",
"docs/development/verification-strategies.md",
"scripts/verify-webgl-display.sh",
"src/test/java/com/pandoli365/bibimbap/mapper/WebglDisplayDatabaseContractTest.java"
],
"pause": {
"reason": null,
"source_ref": null,
"caused_by_report_invocation_id": null,
"caused_by_environment_invocation_id": null
}
}
]
}
```

View File

@ -0,0 +1,68 @@
---
phase: implementation
agent: implementation-advisor
agent_version: 2
generated_at: 2026-10-14T09:40:31.246818+09:00
concerns_checked: true
concerns:
- "Automated unused diagnostics unavailable: no LSP/linter tool; verification must assess separate unused gate."
workers_spawned: 4
planned_workers: 4
actual_workers: 4
---
# 구현 보고
## 변경 목록
| 파일 | worker | 결과 요약 |
|---|---|---|
| src/main/java/com/pandoli365/bibimbap/util/WebglDisplayMetadata.java | inv-003-w01 | backend 구현 |
| src/main/java/com/pandoli365/bibimbap/controller/api/GameUploadController.java | inv-003-w01 | backend 구현 |
| src/main/java/com/pandoli365/bibimbap/controller/api/GameController.java | inv-003-w01 | backend 구현 |
| src/main/java/com/pandoli365/bibimbap/data/GameData.java | inv-003-w01 | backend 구현 |
| src/main/java/com/pandoli365/bibimbap/mapper/GamesMapper.java | inv-003-w01 | backend 구현 |
| src/test/java/com/pandoli365/bibimbap/util/WebglDisplayMetadataTest.java | inv-003-w01 | backend 구현 |
| src/test/java/com/pandoli365/bibimbap/controller/api/GameUploadControllerSecurityTest.java | inv-003-w01 | backend 구현 |
| src/test/java/com/pandoli365/bibimbap/controller/api/GameDisplayMetadataTest.java | inv-003-w01 | backend 구현 |
| src/main/webapp/WEB-INF/views/game-register.jsp | inv-003-w02 | frontend 구현 |
| src/main/webapp/WEB-INF/views/game-detail.jsp | inv-003-w02 | frontend 구현 |
| src/main/webapp/js/webgl-player.js | inv-003-w02 | frontend 구현 |
| src/main/webapp/css/webgl-player.css | inv-003-w02 | frontend 구현 |
| src/test/js/webgl-player.test.cjs | inv-003-w02 | frontend 구현 |
| db/schema.sql | inv-003-w03 | migration 구현 |
| db/migrations/20261014-game-display-metadata.sql | inv-003-w03 | migration 구현 |
| docs/contracts/webgl-display-metadata.md | inv-003-w04 | docs-verification 구현 |
| docs/usage/webgl-display.md | inv-003-w04 | docs-verification 구현 |
| docs/changes/2026-10-14-webgl-display.md | inv-003-w04 | docs-verification 구현 |
| docs/contracts/index.md | inv-003-w04 | docs-verification 구현 |
| docs/usage/index.md | inv-003-w04 | docs-verification 구현 |
| docs/changes/index.md | inv-003-w04 | docs-verification 구현 |
| docs/development/verification-strategies.md | inv-003-w04 | docs-verification 구현 |
| scripts/verify-webgl-display.sh | inv-003-w04 | docs-verification 구현 |
| src/test/java/com/pandoli365/bibimbap/mapper/WebglDisplayDatabaseContractTest.java | inv-003-w04 | docs-verification 구현 |
## Lifecycle ledger
- [lifecycle-events.jsonl](./lifecycle-events.jsonl)
- [ownership.md](./ownership.md)
- [worker-invocations.json](./worker-invocations.json) — report schema v2 append-ready worker payloads; unavailable token telemetry null.
## Wait/wakeup ledger
- [wait-wakeup-events.jsonl](./wait-wakeup-events.jsonl): managed bounded pool 4 requested/accepted/terminal/collected; max2 concurrent; 0 list/interrupt/recovery.
## Bash 단계 (advisor 직접)
- Read-only git diff/status and source contract inspection, artifact ledger/report serialization. No tests/build/runtime/DB/commit/push executed.
- update_plan unavailable for advisor/workers; bind not fabricated.
## 설계와의 차이
- Existing JSP uses separate edit attributes, so approved editDisplayWidth/Height/Source naming replaces hypothetical editModel object.
- Uploaded JavaScript style-variable assignments conservatively omitted; literal CSS, adjacent build-info, canvas attrs supported, manual override covers unknown templates.
- Added actual isolated MyBatis mapper contract test to requested docs/harness worker scope before writing.
- Coherent backend/frontend groups allocated explicitly; disjoint files, schema-only migration worker, fourth code-writer for docs/harness.
## Verification 을 위한 힌트
- Run `bash scripts/verify-webgl-display.sh all` (full offline Maven tests, Node tests, WAR package, disposable PostgreSQL migration/mapper contract).
- L2 requires local postgres:16 image and Docker daemon; override WEBGL_CONTRACT_POSTGRES_IMAGE to local compatible image, no auto pull.
- Runtime/auth/JSP/actual ZIP commands: docs/usage/webgl-display.md. Root has Chrome tools for isolated browser smoke.
- Test matrix: WebglDisplayMetadataTest, GameDisplayMetadataTest, GameUploadControllerSecurityTest, WebglDisplayDatabaseContractTest, src/test/js/webgl-player.test.cjs.
- No compile/test success claimed; unused automated gate unperformed because tools unavailable.
- Original ZIP/served uploaded HTML untouched.

View File

@ -0,0 +1,2 @@
{"event": "await_capability_checked", "recorded_at": "2026-10-14T09:30:42.577553+09:00", "owner_report_invocation_id": "inv-003", "formal_adapter_enabled": false, "host_managed_subagent_orchestration": "supported", "selected_mode": "host_managed_subagent_orchestration", "capability_profile_ref": "atp:codex-team \u00a77"}
{"event": "measurement", "recorded_at": "2026-10-14T09:40:31.246818+09:00", "owner_report_invocation_id": "inv-003", "requested_agents": 4, "spawn_calls": 4, "accepted_spawns": 4, "capacity_denials": 0, "maximum_observed_running": 2, "nonterminal_updates": null, "terminal_deliveries": 4, "collected_results": 4, "generic_list_calls": 0, "interrupt_calls": 0, "semantic_recovery_actions": 0, "pool_wait_calls": null, "pending_refills": 2, "final_pending": 0, "final_running": 0}

View File

@ -0,0 +1,162 @@
[
{
"id": "inv-003-w01",
"layer": "worker",
"name": "code-writer",
"agent_version": 1,
"parent_invocation_id": "inv-003",
"started_at": "2026-10-14T09:31:17.298843+09:00",
"ended_at": "2026-10-14T09:35:46.542933+09:00",
"input_digest": "Exclusive backend file allocation; approved per-upload general implementation; no tests execution or DB/runtime mutation",
"output_digest": "Static bounded metadata, upload/server/SSR/mapper persistence and regression tests",
"artifacts": [
"src/main/java/com/pandoli365/bibimbap/util/WebglDisplayMetadata.java",
"src/main/java/com/pandoli365/bibimbap/controller/api/GameUploadController.java",
"src/main/java/com/pandoli365/bibimbap/controller/api/GameController.java",
"src/main/java/com/pandoli365/bibimbap/data/GameData.java",
"src/main/java/com/pandoli365/bibimbap/mapper/GamesMapper.java",
"src/test/java/com/pandoli365/bibimbap/util/WebglDisplayMetadataTest.java",
"src/test/java/com/pandoli365/bibimbap/controller/api/GameUploadControllerSecurityTest.java",
"src/test/java/com/pandoli365/bibimbap/controller/api/GameDisplayMetadataTest.java"
],
"concerns": [],
"model_choice": {
"phase": "implementation",
"dispatch_size": "parallel",
"tier": "large",
"effort": null,
"resolved_model": "inherit",
"capped": false,
"capped_from": null,
"escalation_reason": null,
"fallback_reason": null,
"rationale": "Coherent owned file group; schema isolated; default inherited model"
},
"token_usage": {
"input": null,
"output": null
},
"attempt": 1,
"termination": "completed",
"retry_of": null,
"lifecycle_fallback_reason": null
},
{
"id": "inv-003-w02",
"layer": "worker",
"name": "code-writer",
"agent_version": 1,
"parent_invocation_id": "inv-003",
"started_at": "2026-10-14T09:31:17.298843+09:00",
"ended_at": "2026-10-14T09:36:18.956153+09:00",
"input_digest": "Exclusive frontend file allocation; approved per-upload general implementation; no tests execution or DB/runtime mutation",
"output_digest": "Generic contain player, author controls, overlay/fullscreen stable iframe and 11 Node tests",
"artifacts": [
"src/main/webapp/WEB-INF/views/game-register.jsp",
"src/main/webapp/WEB-INF/views/game-detail.jsp",
"src/main/webapp/js/webgl-player.js",
"src/main/webapp/css/webgl-player.css",
"src/test/js/webgl-player.test.cjs"
],
"concerns": [],
"model_choice": {
"phase": "implementation",
"dispatch_size": "parallel",
"tier": "large",
"effort": null,
"resolved_model": "inherit",
"capped": false,
"capped_from": null,
"escalation_reason": null,
"fallback_reason": null,
"rationale": "Coherent owned file group; schema isolated; default inherited model"
},
"token_usage": {
"input": null,
"output": null
},
"attempt": 1,
"termination": "completed",
"retry_of": null,
"lifecycle_fallback_reason": null
},
{
"id": "inv-003-w03",
"layer": "worker",
"name": "migration-writer",
"agent_version": 1,
"parent_invocation_id": "inv-003",
"started_at": "2026-10-14T09:35:46.542933+09:00",
"ended_at": "2026-10-14T09:36:43.485758+09:00",
"input_digest": "Exclusive migration file allocation; approved per-upload general implementation; no tests execution or DB/runtime mutation",
"output_digest": "Nullable additive idempotent schema/migration; no DB apply",
"artifacts": [
"db/schema.sql",
"db/migrations/20261014-game-display-metadata.sql"
],
"concerns": [],
"model_choice": {
"phase": "implementation",
"dispatch_size": "parallel",
"tier": "medium",
"effort": null,
"resolved_model": "inherit",
"capped": false,
"capped_from": null,
"escalation_reason": null,
"fallback_reason": null,
"rationale": "Coherent owned file group; schema isolated; default inherited model"
},
"token_usage": {
"input": null,
"output": null
},
"attempt": 1,
"termination": "completed",
"retry_of": null,
"lifecycle_fallback_reason": null
},
{
"id": "inv-003-w04",
"layer": "worker",
"name": "code-writer",
"agent_version": 1,
"parent_invocation_id": "inv-003",
"started_at": "2026-10-14T09:36:18.956153+09:00",
"ended_at": "2026-10-14T09:40:31.246818+09:00",
"input_digest": "Exclusive docs-verification file allocation; approved per-upload general implementation; no tests execution or DB/runtime mutation",
"output_digest": "Contract/usage/change docs, integrated L1/L2 script and isolated actual MyBatis roundtrip test",
"artifacts": [
"docs/contracts/webgl-display-metadata.md",
"docs/usage/webgl-display.md",
"docs/changes/2026-10-14-webgl-display.md",
"docs/contracts/index.md",
"docs/usage/index.md",
"docs/changes/index.md",
"docs/development/verification-strategies.md",
"scripts/verify-webgl-display.sh",
"src/test/java/com/pandoli365/bibimbap/mapper/WebglDisplayDatabaseContractTest.java"
],
"concerns": [],
"model_choice": {
"phase": "implementation",
"dispatch_size": "parallel",
"tier": "medium",
"effort": null,
"resolved_model": "inherit",
"capped": false,
"capped_from": null,
"escalation_reason": null,
"fallback_reason": null,
"rationale": "Coherent owned file group; schema isolated; default inherited model"
},
"token_usage": {
"input": null,
"output": null
},
"attempt": 1,
"termination": "completed",
"retry_of": null,
"lifecycle_fallback_reason": null
}
]

View File

@ -0,0 +1,425 @@
---
schema_version: 2
session_id: 20261014-091658
started_at: 2026-10-14T09:17:15.328427+09:00
ended_at: 2026-10-14T10:02:57.818935+09:00
user_request: |
Downloads/GoraniCoin-WebGLTest.zip Unity WebGL 빌드의 실행 화면 해상도 대응 기능 추가.
---
# Summary
업로드 게임별 기준 크기 감지/저장, 작성자 보정, 비율 유지 플레이어 및 확대/전체화면 구현 완료. 사용자 추가 발화로 예시 전용에서 일반 업로드 대응 범위를 명확히 했다. 전체 테스트/DB 계약 및 독립 runtime/보완 trusted touch 검증 통과.
# Invocations
- id: inv-001
layer: advisor
name: research-advisor
parent_invocation_id: null
started_at: 2026-10-14T09:17:15.328427+09:00
ended_at: 2026-10-14T09:20:31.663736+09:00
termination: completed
input_digest: ZIP HTML 및 서비스 플레이어의 크기 정책 조사, 수정 가능 범위와 계획 근거 수집. 코드 변경 금지.
output_digest: 원본 390:844 유지 및 양축 contain 플레이어 권장, 내부 UI 변경에는 Unity 소스 필요 가능성
artifacts: [research/research.md]
model_choice: {tier: large, resolved_model: inherit, rationale: 빌드와 호스트 경계의 원인 조사}
attempt: 1
# Advisor Invocation Decision Log
- advisor: research-advisor
decision: call
rationale: 빌드물과 호스트 화면의 크기 정책을 근거로 구분해야 함
checked_at: 2026-10-14T09:17:15.328427+09:00
- advisor: graphify-lookup-advisor
decision: skip
rationale: ZIP은 그래프 외부이며 JSP/CSS 플레이어는 프로젝트 문서에 그래프 미지원으로 명시
checked_at: 2026-10-14T09:17:15.328427+09:00
# Decisions
- selected_mode: host_managed_subagent_orchestration
request_intent: general_task
rationale: exact ATP hook marker 존재, Codex 배포 profile 적용
- 구현은 조사 결과 기반 계획 제시 및 사용자 동의 뒤 진행 (task SKILL §5.0).
# Open Items
- 기존 사용자 잔여: .atp/work-session/20260724-095414/, .atp/work-session/20260826-093449/, ~/ (작업 제외).
- update_plan 도구가 현재 도구 목록에 없음. child에 bind 수행 가능 여부 명시 요청, 미수행을 성공으로 기록하지 않음.
# Phase Status
- research: completed (terminal delta 및 FINAL_ANSWER token 일치, artifact 검증 완료)
- implementation: authorized_build_aware_general_support
- verified_by_me: research artifact 존재/근거 검토; 제품 코드 변경 0
- needs_user_verification: 아직 구현 전. 브라우저 실행 검증은 구현 단계에 수행.
- user_signals: {positive: [], negative: []}
## Phase 2 — 업로드 게임별 자동 대응
# Decisions
- user: 예시 전용이 아닌 사용자가 업로드한 게임 빌드에 맞춘 추천 구현 진행 승인.
- scope: 업로드 빌드 기준 크기 추출 및 영속화, 판별 불가 시 등록자 지정, 플레이어 비율 유지 자동 맞춤 및 전체화면.
# Invocations
- id: inv-002
layer: advisor
name: design-advisor
parent_invocation_id: null
started_at: 2026-10-14T09:26:02.640678+09:00
ended_at: 2026-10-14T09:29:51.485835+09:00
termination: completed
input_digest: 일반 업로드 빌드의 크기 메타 추출/저장과 플레이어 자동 맞춤 계약 설계
output_digest: 업로드별 메타 감지/저장 및 작성자 override, 양축 contain/fullscreen 계약 확정
artifacts: [implementation/design.md]
attempt: 1
model_choice: {tier: large, resolved_model: inherit, rationale: 다중 빌드 형식과 영속화 및 UI 계약 설계}
# Advisor Invocation Decision Log
- advisor: design-advisor
decision: call
rationale: 사용자가 업로드별 자동 대응 범위를 명시하여 데이터/업로드/플레이어 계약 필요
- advisor: requirements-advisor
decision: skip
rationale: 사용자 추가 발화로 범용 빌드 대응 및 진행 권한 명확, 설계에 미확정 입력 검토 포함
# Invocations
- id: inv-003
layer: advisor
name: implementation-advisor
parent_invocation_id: null
started_at: 2026-10-14T09:29:51.485835+09:00
ended_at: 2026-10-14T09:41:14.055959+09:00
termination: completed
input_digest: 승인된 업로드별 메타/플레이어 설계 구현, nested bounded workers 및 회귀테스트 작성
output_digest: 24파일 업로드별 크기 감지/저장/플레이어 및 검증 harness 구현 완료
artifacts: [implementation/report.md, implementation/ownership.md]
planned_workers: 4
actual_workers: 4
attempt: 1
model_choice: {tier: large, resolved_model: inherit, rationale: backend/frontend/migration 계약 통합}
# Advisor Invocation Decision Log
- advisor: implementation-advisor
decision: call
rationale: 승인된 다중 파일 구현과 worker ownership 분할 필요
# Decisions
- 작성자 지정 > 인접 build-info > 정적 CSS > canvas 속성 > 기본 비율. ZIP/HTML 원본 보존, 별도 origin 지원.
- 공유 DB 마이그레이션 미적용; additive 파일 작성 및 격리 환경 검증 승인 범위로 진행.
# Worker Invocations
```json
[
{
"id": "inv-003-w01",
"layer": "worker",
"name": "code-writer",
"agent_version": 1,
"parent_invocation_id": "inv-003",
"started_at": "2026-10-14T09:31:17.298843+09:00",
"ended_at": "2026-10-14T09:35:46.542933+09:00",
"input_digest": "Exclusive backend file allocation; approved per-upload general implementation; no tests execution or DB/runtime mutation",
"output_digest": "Static bounded metadata, upload/server/SSR/mapper persistence and regression tests",
"artifacts": [
"src/main/java/com/pandoli365/bibimbap/util/WebglDisplayMetadata.java",
"src/main/java/com/pandoli365/bibimbap/controller/api/GameUploadController.java",
"src/main/java/com/pandoli365/bibimbap/controller/api/GameController.java",
"src/main/java/com/pandoli365/bibimbap/data/GameData.java",
"src/main/java/com/pandoli365/bibimbap/mapper/GamesMapper.java",
"src/test/java/com/pandoli365/bibimbap/util/WebglDisplayMetadataTest.java",
"src/test/java/com/pandoli365/bibimbap/controller/api/GameUploadControllerSecurityTest.java",
"src/test/java/com/pandoli365/bibimbap/controller/api/GameDisplayMetadataTest.java"
],
"concerns": [],
"model_choice": {
"phase": "implementation",
"dispatch_size": "parallel",
"tier": "large",
"effort": null,
"resolved_model": "inherit",
"capped": false,
"capped_from": null,
"escalation_reason": null,
"fallback_reason": null,
"rationale": "Coherent owned file group; schema isolated; default inherited model"
},
"token_usage": {
"input": null,
"output": null
},
"attempt": 1,
"termination": "completed",
"retry_of": null,
"lifecycle_fallback_reason": null
},
{
"id": "inv-003-w02",
"layer": "worker",
"name": "code-writer",
"agent_version": 1,
"parent_invocation_id": "inv-003",
"started_at": "2026-10-14T09:31:17.298843+09:00",
"ended_at": "2026-10-14T09:36:18.956153+09:00",
"input_digest": "Exclusive frontend file allocation; approved per-upload general implementation; no tests execution or DB/runtime mutation",
"output_digest": "Generic contain player, author controls, overlay/fullscreen stable iframe and 11 Node tests",
"artifacts": [
"src/main/webapp/WEB-INF/views/game-register.jsp",
"src/main/webapp/WEB-INF/views/game-detail.jsp",
"src/main/webapp/js/webgl-player.js",
"src/main/webapp/css/webgl-player.css",
"src/test/js/webgl-player.test.cjs"
],
"concerns": [],
"model_choice": {
"phase": "implementation",
"dispatch_size": "parallel",
"tier": "large",
"effort": null,
"resolved_model": "inherit",
"capped": false,
"capped_from": null,
"escalation_reason": null,
"fallback_reason": null,
"rationale": "Coherent owned file group; schema isolated; default inherited model"
},
"token_usage": {
"input": null,
"output": null
},
"attempt": 1,
"termination": "completed",
"retry_of": null,
"lifecycle_fallback_reason": null
},
{
"id": "inv-003-w03",
"layer": "worker",
"name": "migration-writer",
"agent_version": 1,
"parent_invocation_id": "inv-003",
"started_at": "2026-10-14T09:35:46.542933+09:00",
"ended_at": "2026-10-14T09:36:43.485758+09:00",
"input_digest": "Exclusive migration file allocation; approved per-upload general implementation; no tests execution or DB/runtime mutation",
"output_digest": "Nullable additive idempotent schema/migration; no DB apply",
"artifacts": [
"db/schema.sql",
"db/migrations/20261014-game-display-metadata.sql"
],
"concerns": [],
"model_choice": {
"phase": "implementation",
"dispatch_size": "parallel",
"tier": "medium",
"effort": null,
"resolved_model": "inherit",
"capped": false,
"capped_from": null,
"escalation_reason": null,
"fallback_reason": null,
"rationale": "Coherent owned file group; schema isolated; default inherited model"
},
"token_usage": {
"input": null,
"output": null
},
"attempt": 1,
"termination": "completed",
"retry_of": null,
"lifecycle_fallback_reason": null
},
{
"id": "inv-003-w04",
"layer": "worker",
"name": "code-writer",
"agent_version": 1,
"parent_invocation_id": "inv-003",
"started_at": "2026-10-14T09:36:18.956153+09:00",
"ended_at": "2026-10-14T09:40:31.246818+09:00",
"input_digest": "Exclusive docs-verification file allocation; approved per-upload general implementation; no tests execution or DB/runtime mutation",
"output_digest": "Contract/usage/change docs, integrated L1/L2 script and isolated actual MyBatis roundtrip test",
"artifacts": [
"docs/contracts/webgl-display-metadata.md",
"docs/usage/webgl-display.md",
"docs/changes/2026-10-14-webgl-display.md",
"docs/contracts/index.md",
"docs/usage/index.md",
"docs/changes/index.md",
"docs/development/verification-strategies.md",
"scripts/verify-webgl-display.sh",
"src/test/java/com/pandoli365/bibimbap/mapper/WebglDisplayDatabaseContractTest.java"
],
"concerns": [],
"model_choice": {
"phase": "implementation",
"dispatch_size": "parallel",
"tier": "medium",
"effort": null,
"resolved_model": "inherit",
"capped": false,
"capped_from": null,
"escalation_reason": null,
"fallback_reason": null,
"rationale": "Coherent owned file group; schema isolated; default inherited model"
},
"token_usage": {
"input": null,
"output": null
},
"attempt": 1,
"termination": "completed",
"retry_of": null,
"lifecycle_fallback_reason": null
}
]
```
# Invocations
- id: inv-004
layer: advisor
name: verification-advisor
parent_invocation_id: null
started_at: 2026-10-14T09:41:14.055959+09:00
ended_at: 2026-10-14T09:52:22.735705+09:00
termination: completed
input_digest: AC + 실행 명령만 사용하여 통합 L1/L2 및 실제 ZIP/JSP/browser 검증
output_digest: L1/L2/runtime 통과, 전체 AC는 문서 실행 오류/회귀 전 실패/터치/UI audit 미확인으로 fail
artifacts: [verification.md]
attempt: 1
model_choice: {tier: large, resolved_model: inherit, rationale: 런타임/DB/Unity 실화면 독립 검증}
# Advisor Invocation Decision Log
- advisor: verification-advisor
decision: call
rationale: 코드 변경 및 통합/런타임 검증 의무
- advisor: documentation-advisor
decision: skip
rationale: 구현 docs-worker가 계약/사용/변경 문서와 인덱스 작성 완료
# Decisions
- graph_refresh: skip:no-graphify (설치 cache에서 atp-graphify add-on 확인되지 않음)
- 제품 파일 git diff/status 교차 확인: tracked 12 파일 및 신규 구현/테스트/문서 파일 존재. 사용자 잔여 제외.
# User Signals
user_signals:
positive: []
negative:
- quote_or_paraphrase: 단순히 내가 준 예시에만 맞추는게 아니라 사용자가 업로드한 게임에 맞춰서야
about: 초기 수동 비율 선택 중심 제안의 범용 업로드 자동 대응 범위 보정
structural: false
# Open Items
- docs/usage/webgl-display.md WAR 직접 실행 명령은 실제 WAR Main manifest 부재로 실패; runtime working command 확인 후 문서 수정 예정.
# Invocations
- id: inv-005
layer: advisor
name: documentation-advisor
parent_invocation_id: null
started_at: 2026-10-14T09:52:22.735705+09:00
ended_at: 2026-10-14T09:55:42.931969+09:00
termination: completed
input_digest: 검증된 실행 명령으로 문서 수정, 영향맵/index/Impeccable UI audit 완료
output_digest: docs 실행명령 교정, mapped21files/index/UI audit 및 실제 HEAD JSP 회귀 실패/현재 성공 확인
artifacts: [documentation.md, artifacts/final-doc-ui-audit.md]
attempt: 1
model_choice: {tier: large, resolved_model: inherit, rationale: runtime 증거 기반 문서 교정 및 UI audit}
# Advisor Invocation Decision Log
- advisor: documentation-advisor
decision: call
rationale: 독립 실행 검증이 운영 가이드 오류 및 최종 문서/UI audit 미확인 발견
# Regression
- surfaced_at_stage: verification
source_stage: docs
defect: executable manifest 없는 WAR의 java -jar 실행을 가이드에서 제안
full_set_recheck: true
downstream_rerun: [documentation, supplemental-verification]
# Invocations
- id: inv-006
layer: advisor
name: verification-advisor-supplemental
parent_invocation_id: null
started_at: 2026-10-14T09:55:42.931969+09:00
ended_at: 2026-10-14T10:00:24.919475+09:00
termination: completed
input_digest: 문서/회귀/audit 증거 재평가 및 실제 Unity 버튼/모바일 터치 추가 검증
output_digest: trusted CDP touch Shop/Open Upgrades 일반/확대/resize 통과, 문서/회귀/audit 미확인 해소. 실제 기기 스모크만 수동 확인.
artifacts: [supplemental-verification.md]
attempt: 1
model_choice: {tier: large, resolved_model: inherit, rationale: 미확인 입력 동작과 종료 AC 보완 검증}
# Advisor Invocation Decision Log
- advisor: verification-advisor-supplemental
decision: call
rationale: 전체 AC fail의 남은 회귀/audit/입력 확인을 보완, passing 전체 suite 반복 불필요
# Final Summary
- 사용자 업로드별 크기 감지·저장/작성자 override/기존 게임 fallback/비율 유지 확대·전체화면 완료.
- L1/L2/runtime 및 보완 trusted touch 입력 검사 통과. 공유 DB/앱 적용 및 push 요청 없음. 로컬 feat/v2 커밋 준비.
# verified_by_me
- L1: Java377 실패0 오류0 (일반 opt-in L2 1skip), Node11/11, WAR package pass (독립 advisor 실행 로그 취합).
- L2: disposable PostgreSQL migration/idempotency/constraints/fresh schema/mapper7 SELECT 계약 pass1/1.
- Runtime: JSP5paths HTTP200, 빌드3종 viewport12/12 geometry, 원본/서빙 hash 보존, 동일 iframe/Unity instance resize/확대/fullscreen.
- Input: CDP trusted touch Shop/Open Upgrades 메뉴 일반/확대/가로 resize 전환 pass.
- Regression: 실제 HEAD JSP로 동일 SSR 테스트 fail1, 현재 JSP pass1. 이전 browser geometry 재실행 아님.
- UI/docs audit:21file impact map + feature docs/index links pass, final detect warn2(existing/falsepositive).
- 로그 스캔: server clean; browser errors0/warn4(기존 Unity/autoplay/sandbox).
- graph_refresh: skip:no-graphify (옵트인 add-on 미설치).
- project_gate: runtime JSP smoke 의무 수행 pass; 별도 배포 gate skip:no-project-gate.
# needs_user_verification
- 실제 터치 기기에서 게임 상세 → 크게 보기/전체화면 → 방향 전환 → Shop/Upgrades 입력 스모크 1회. 자동 trusted browser touch는 통과.
- 배포 전에 db/migrations/20261014-game-display-metadata.sql 선적용 필요. 공유/운영 DB 및 배포는 이번 요청에 미포함.
# Open Items — Final disposition
- 기존 사용자 잔여 .atp/work-session/20260724-095414/, .atp/work-session/20260826-093449/, ~/ 작업 제외.
- 원본 ZIP 복사 artifacts/*.zip 및 임시 로그인 HTML은 로컬 재현 자료로 session artifacts/.gitignore 제외.
- 기존 usage index setup-checklist.md/faq.md 링크 미존재는 이번 작업 밖 (audit 보고서에 기재).
- 각 pool terminal 모두 수신/취합. update_plan 부재 사실 보존, 자동 복구/interrupt/list 없음.
# Invocations
- id: inv-007
layer: advisor
name: retrospective-advisor
parent_invocation_id: null
started_at: 2026-10-14T10:00:24.919475+09:00
ended_at: 2026-10-14T10:02:08.396635+09:00
termination: completed
input_digest: 최신 report 전체 phase/사용자 범위 보정/실행 검증 결과로 회고, report sink only
output_digest: 범용 업로드 scope 보정 및 trusted touch 검증 교훈, 최신 증거 docs sync 권고
artifacts: [report.md#Retrospective]
attempt: 1
model_choice: {tier: medium, resolved_model: inherit, rationale: 완료된 세션 증거 기반 회고}
# Advisor Invocation Decision Log
- advisor: retrospective-advisor
decision: call
rationale: 전체 결과 수렴 및 L1/L2 통과 뒤 필수 회고
# Retrospective
```yaml
Retrospective:
signals:
positive: []
negative:
- quote_or_paraphrase: "단순히 내가 준 예시에만 맞추는게 아니라 사용자가 업로드한 게임에 맞춰서야"
about: "초기 제안의 예시 중심 범위를 일반 사용자 업로드 자동 대응으로 교정"
structural: false
what_went_well:
- "범위 교정 뒤 게임명·파일명 상수 없이 서로 다른 비율 업로드와 unknown/manual/legacy 계약을 구현·검증했다. 이는 실행 관찰이며 사용자 긍정 발화로 분류하지 않는다."
- "독립 검증이 잘못된 WAR 실행 명령과 입력 증거 공백을 드러냈고, 문서 교정 및 보완 검증으로 해소했다. L1/L2/runtime와 trusted CDP touch의 실제 Shop/Upgrades 전환이 통과했다."
- "자동 브라우저 touch와 물리 기기 검증을 구분하여 실제 기기 스모크만 needs_user_verification으로 유지했다."
what_to_improve:
- "제공 ZIP은 재현 fixture로 취급하고 일반 업로드 범위를 초기 제안에서 명시한다. 범용 업로드 계약은 이미 제품 문서에 있어 별도 중복 규칙은 제안하지 않는다."
- "docs/changes/2026-10-14-webgl-display.md 마지막 문단의 named Unity 버튼/trusted touch 미검증 표현은 최신 보완 검증보다 오래됐다. root가 supplemental-verification.md 기준으로 정확히 동기화해야 한다."
- "운영 명령의 실행 확인은 기존 검증 규약과 이번 수정으로 다루므로 중복 교훈 추가를 제안하지 않는다."
memory_candidates:
- name: trusted-touch-evidence-boundary
type: feedback
description: "터치 검증은 이벤트 종류·신뢰 여부와 실제 게임 동작을 함께 관찰한다."
body_draft: |
Why: touch emulation을 켠 상태의 일반 click도 pointerType=mouse일 수 있어 터치 입력 좌표 검증이 되지 않는다.
How to apply: 모바일 입력 확인 시 pointerType=touch와 isTrusted=true 이벤트를 기록하고, 크기 변경 전후 명명된 게임 버튼의 실제 화면 전환을 확인한다. CDP trusted touch 통과와 물리 터치 기기 스모크 완료 여부를 각각 보고한다.
rationale_for_saving: "기존 레지스트리는 클릭·터치 점검만 요구하며 mouse 이벤트 오인 방지의 구체 증거 기준은 없다."
signal_source: observation
docs_sync_target: docs/development/verification-strategies.md
memory_optional: false
protocol_feedback: []
applied_changes: []
```
Memory는 disabled/unset이므로 전역 memory를 읽거나 변경하지 않았다. 위 후보는 docs 전용 권고이며 직접 적용하지 않았다. 운영 명령 및 일반 업로드 범위의 중복 후보는 제외했다. 최신 증거 동기화는 교훈 후보와 별개의 필수 문서 정합 수정이다.
# Retrospective disposition
- accepted: trusted browser touch/실제 메뉴 결과/물리기기 smoke 구분 규칙을 docs/development/verification-strategies.md에 추가.
- applied_changes: docs/changes/2026-10-14-webgl-display.md 최신 보완 touch 증거 동기화; 전역 memory 미변경.
- Final staging: raw stdout/psql evidence whitespace를 session .gitattributes로 보존; 제품 파일 whitespace check pass.
# Session Closure
- implementation_commit: ddd9abf
- local_branch: feat/v2
- requested_mutations: 구현/문서/회귀테스트/격리 검증 완료, 로컬 커밋 완료.
- push_or_shared_deployment: 미요청; 배포 전 migration 필요.
- terminal_barrier: root advisors7 + nested workers4 모두 completed 수신 및 결과 취합.
- pending_children: 0
- running_children: 0
- repo_status: 이번 작업의 코드/문서/세션 증거 커밋됨. 이전 사용자 untracked3 항목만 제외.
- end_status: implemented_and_verified; physical-device-smoke needs_user_verification.

View File

@ -0,0 +1,90 @@
---
phase: research
agent: research-advisor
agent_version: 4
report_invocation_id: inv-001
concerns_checked: true
source_confidence: mixed
workers_spawned: 0
concerns:
- Unity 씬 소스 미포함으로 실제 UI anchor/Canvas Scaler 설정 확인 불가
- 브라우저 실행 전이므로 화면 잘림 및 입력 이상은 아직 런타임 확인하지 않음
- 분리 asset origin 사용 시 부모의 iframe DOM 직접 접근 불가
---
# WebGL 해상도 대응 조사
## 결론
원인 후보는 플랫폼의 고정 가로 플레이 영역과 빌드 HTML의 세로 영역 계산이다. “Unity가 390×844 해상도만 렌더한다”는 가정은 자료와 맞지 않는다. 이 ZIP은 이미 CSS 크기에 맞춰 Unity 렌더 타깃을 동기화하는 설정이며, 게임 내부 UI가 새 크기에 맞춰 배치되는지는 별개의 문제다.
기본 정책은 **원본 390:844 비율을 유지하면서 가능한 영역 안에 전체 화면을 표시(contain)**하는 것을 추천한다. README가 PC에서도 세로 화면 유지한다고 명시하므로 화면을 늘리거나 자르는 cover/fill 정책은 이 게임의 안전한 기본값이 아니다. 여백 없이 모든 화면을 채우려면 Unity 소스에서 다양한 비율의 UI와 카메라를 검증·수정하여 재빌드해야 한다.
## ZIP 근거 (원본 변경 없음)
ZIP: `/Users/wemadeplay/Downloads/GoraniCoin-WebGLTest.zip`; zipfile로 읽기만 수행.
- `GoraniCoin-WebGLTest/build-info.json:5`: Unity `6000.0.74f1`.
- `build-info.json:8,13–14`: `Assets/Scenes/UITestScene_Final.unity`, 기준 `390×844`.
- `README.txt:3`: PC에서도 세로 화면 유지. `README.txt:5`: Toss 결제 및 호스트 safe-area 호출 비활성화. 실제 프로젝트 소스는 ZIP에 없다.
- `index.html:9–15`: html/body 100%, overflow hidden; container 폭 `min(100vw, calc(100svh * 390 / 844))`, 높이 `100svh`; canvas CSS 폭/높이 100%.
- `index.html:27`: canvas 초기 HTML 버퍼 속성 390×844. 이 속성만으로 실행 중 렌더 타깃이 고정이라고 판단하면 안 된다.
- `index.html:46–61`: config에 `devicePixelRatio: Math.min(window.devicePixelRatio || 1, 2)` 설정. `matchWebGLToCanvasSize`는 미설정.
- `Build/GoraniCoin-WebGLTest.framework.js:7575–7580`: `matchWebGLToCanvasSize`가 undefined면 true를 반환. `:7592–7594`: preferred DPR은 match false면 1, 그 외 Module DPR/window DPR 사용.
- `index.html:69–71`: `window.unityInstance`, 준비 상태 `data-unity-ready`를 제공하여 브라우저 검사에 활용 가능.
**HTML의 비율 결함:** 컨테이너 폭이 viewport 폭 때문에 제한되더라도 높이는 viewport 전체 높이를 유지한다. 예를 들어 iframe 320×844라면 canvas CSS가 320×844가 되어 원래 390:844보다 좁다. Unity는 이 비율에서 새 렌더링을 할 가능성이 높으며, UI가 잘리는지 여부는 내부 레이아웃에 달렸다. 적절한 contain 계산은 `scale=min(availableWidth/390, availableHeight/844)`, 폭 `390*scale`, 높이 `844*scale`이다. 이미지 CSS stretch와 Unity UI 재배치를 혼동하지 않아야 한다.
## 플랫폼 근거
- `src/main/webapp/WEB-INF/views/game-detail.jsp:365–384`: frame wrap 폭 100%, `aspect-ratio:16/9`, `max-height:min(70vh,520px)`, overflow hidden; iframe absolute inset 0, 폭/높이 100%. 비율과 최대 높이가 동시에 걸려 실제 frame 비율이 16:9보다 넓어질 수도 있다.
- `game-detail.jsp:1259–1264`: 업로드 빌드 URL iframe에 그대로 연결. sandbox scripts/same-origin/pointer-lock 허용; fullscreen/autoplay 권한 허용. 전체화면 제어 UI는 없음.
- 이 빌드가 800×450 iframe에 들어가면 자체 portrait 계산에 의해 canvas 약 208×450이 되어 큰 좌우 여백과 작은 세로 화면이 생긴다. 모바일 상세 페이지의 가로 iframe은 더 낮아질 수 있다. 이는 계산상 예상이며 아직 실화면 재현은 아니다.
- `src/main/java/com/pandoli365/bibimbap/controller/api/GameUploadController.java:198–225`: ZIP 압축 해제, index 탐색, Unity 파일 검증, 디렉터리 이동, 빌드 index URL 반환. 별도 템플릿 정규화나 responsive wrapper는 없다.
- `src/main/java/com/pandoli365/bibimbap/controller/api/GameAssetController.java:57–68`: CSP 헤더 설정 뒤 파일 바이트 그대로 복사. CSP는 self/inline script와 self/inline style을 허용한다. CSP 변경 자체는 해상도 지원에 필요하지 않다.
- `src/main/java/com/pandoli365/bibimbap/controller/api/GameController.java:348–357`: `app.webgl.asset-origin`이 있으면 iframe을 별도 origin에 연결. 따라서 “부모 페이지 JS가 모든 게임의 canvas를 직접 고친다”는 구현은 일반화 불가. 호스트는 iframe 박스 크기는 변경 가능하나 내부 문서는 same-origin에서만 직접 접근 가능하다.
- `src/main/java/com/pandoli365/bibimbap/data/GameData.java` 및 game-register 입력에 게임 해상도/비율 메타 필드는 발견되지 않았다.
- `docs/graph/index.md` 알려진 한계와 `docs/development/verification-strategies.md:260–262`: JSP/CSS 정적 프론트 코드는 직접 탐색 대상. graph lookup skip은 타당.
- contracts index는 아직 비어 있고 해상도 계약 문서는 없음. usage index 일부 링크는 파일이 존재하지 않아 해당 문서에 의존하지 않음.
## 외부 근거 — Unity 공식 문서 확인
[Unity 6.0 Web Canvas size](https://docs.unity3d.com/6000.0/Documentation/Manual/webgl-canvas-size.html): CSS 표시 크기와 GPU 렌더 타깃을 구분하며 기본 자동 동기화를 설명한다. `matchWebGLToCanvasSize=false`는 자동 동기화를 끄고 버퍼를 수동 관리할 때 사용하는 설정이다. 이 게임의 config와 framework 근거가 기본 동기화와 일치한다.
[Unity uGUI 2.0 Canvas Scaler](https://docs.unity3d.com/Packages/com.unity.ugui@2.0/manual/script-CanvasScaler.html): Scale With Screen Size/Reference Resolution/Screen Match Mode가 UI 크기와 서로 다른 비율의 레이아웃을 결정한다. HTML에서 렌더 해상도를 바꾸는 것만으로 게임 내부 레이아웃 적응을 보장할 수 없다. 현재 게임이 uGUI인지 UI Toolkit인지도 ZIP만으로 확정하지 않는다.
[MDN postMessage](https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage): 다른 origin의 iframe과 통신하려면 협력하는 child 측 프로토콜이 필요하며 sender origin/source와 message 값을 검증해야 한다. 부모에서 iframe src만 넣는 현행 구조로는 임의 ZIP의 내부 비율 자동 감지/수정 계약이 없다.
## 권장 구현 계획 (구현하지 않음)
1. 빌드 원본과 플레이어를 로컬 HTTP로 실행해 기준 390×844 화면, 창 축소, 모바일 세로·가로에서 재현한다. 준비 상태/실제 canvas client size와 width·height를 기록한다.
2. bibimbap 플레이 영역에 사용자 조절 가능한 비율(현재 가로/세로/원본 또는 사용자 지정)과 확대/전체화면 기능을 도입한다. 390:844 같은 정확 비율을 유지하면서 부모 가용 폭과 높이 양쪽에 맞게 계산한다. 앱의 iframe 전체를 390:844로 맞추면 이 ZIP의 자체 CSS를 수정하지 않고도 양쪽 계산이 일치하게 만들 수 있다. “세로”를 일반 9:16으로만 맞추면 이 게임 원본과 다르므로 원본 정확 비율 옵션이 필요하다.
3. 최소 변경안은 상세 JSP/CSS/전용 JS와 플레이어 테스트를 수정하고, 기존 게임은 현재 정책으로 fallback하면서 이번 게임은 사용자가 원본 비율을 선택할 수 있도록 한다. 화면 비율 추론을 hardcode하거나 특정 ZIP 이름을 앱에 박지 않는다.
4. 모든 게임에 자동 대응이 필요하면 작성자 해상도/비율 메타 입력 또는 협력하는 표준 빌드 메타/resize message 계약을 추가한다. 메타 저장은 GameData/Mapper/API/등록 JSP/DB migration 및 계약 테스트로 영향이 커진다. 업로드 HTML 임의 주입/정규식 개조는 범용 보장과 원본 보존 측면에서 우선안으로 추천하지 않는다.
5. 이 게임 HTML 자체도 개선하려면 원본 ZIP을 보존하고 복사본 index 컨테이너만 양축 contain 방식으로 보정한다. 재빌드 없이 가능한 웹 wrapper 수정이지만, 내부 UI 재설계와는 다르다. matchWebGLToCanvasSize=false나 고정 버퍼는 픽셀 기준 UI 문제가 실제 확인됐을 때 개발자와 함께 검토한다.
## 영향 파일 후보
최소 플랫폼안: `src/main/webapp/WEB-INF/views/game-detail.jsp`, 신규 전용 WebGL player JS/CSS, 동작 회귀 테스트, `docs/changes/...`, 해상도 사용 계약 문서. 공용 `.player` CSS(`bibimbap.css:343`)는 현재 상세 페이지 실제 iframe class와 다르므로 그 줄만 바꾸어도 해결되지 않는다.
자동 메타 영속화안: 위 + `GameData.java`, `GamesMapper.java`, `GameController.java`, 등록 폼, upload metadata parser(채택 시), DB migration, 컨트롤러/매퍼 테스트. 이는 이번 조사에서 확정한 구현 요구사항이 아니라 별도 범위 선택이다.
## 검증 기준
- 원본 390:844와 좁은 320×844, desktop 1440×900, 가로 844×390, 작은 높이 창에서 플레이 영역 양축이 가용 공간을 넘지 않음.
- contain 모드 canvas/iframe 비율 390:844, 화면 잘림 없이 중앙 정렬. 여백은 의도대로 남음. ResizeObserver/viewport resize 후 갱신되고 Unity instance가 재생성되지 않아 플레이 상태가 유지됨.
- Unity 준비 후 CSS 크기와 drawing buffer 크기를 각각 기록; DPR 1/2에서 실제 동기화를 확인. initial width/height attribute만 검사하지 않음.
- 게임 로딩/상하단 UI/버튼 클릭/터치/포인터 위치/다시 축소/전체화면 진입과 해제를 실제 빌드로 확인. 화면만 보기 좋은데 입력이 틀어지는 회귀를 방지.
- 기존 가로 게임과 별도 asset-origin 구성에서 iframe 재생이 유지됨. cross-origin 접근 실패를 정상 지원 여부와 구분.
- `docs/development/verification-strategies.md`에 따라 수정 전 실패→수정 후 통과하는 회귀 포함, JSP 변경은 WAR 빌드 외 HTTP 200 런타임 스모크가 의무.
## 미해결
- 사용자가 원하는 대응 범위: 원본 콘텐츠를 전체 표시하며 확대하는 플레이어인가, 게임 UI가 가로·세로 전체 화면에서 재배치되는 것인가? 후자는 Unity 소스 또는 담당 개발자의 재빌드가 필요할 수 있다.
- 각 게임 비율의 자동 감지/저장까지 이번 범위인지 여부.
- 실제 Unity UI 컴포넌트와 픽셀 단위 레이아웃, 카메라 viewport, safe-area 대응 설정.
- 현행 플레이어와 ZIP의 런타임 실화면은 아직 미실행.
## 실행 계약
Parent instruction에 따라 nested children 0건. update_plan은 callable tools에 없어 bind 호출을 만들지 않았으며 parent에 명시 고지했다. 제품 코드/원본 ZIP/credential 미변경. 파일 산출은 이 research.md 1건만이다.

View File

@ -0,0 +1,45 @@
---
phase: verification
agent: verification-advisor-supplemental
agent_version: 1
report_invocation_id: inv-006
generated_at: 2026-10-14T10:01:00+09:00
concerns_checked: true
concerns:
- Physical touchscreen device smoke remains unperformed; trusted CDP touch is browser automation.
- Baseline evidence proves SSR contract regression, not an old-browser geometry replay.
- Cross-origin behavior remains Node harness coverage, not independent runtime origin coverage.
- update_plan unavailable; binding tool action not fabricated.
---
# Supplemental independent verification
Read only prior verification.md, final-doc-ui-audit.md, final-prechange-ssr-regression.log, final-current-ssr-regression.log and operational docs/usage/webgl-display.md. No implementation/design/diff inspection, product/test/source edits, installs, DB or application changes. Current player JS/CSS were executed by HTTP without inspecting their contents. Root supplied fixture DOM contract. The exact unmodified previously uploaded GoraniCoin build was served from its retained temporary directory.
## Previously open concerns reassessed
The erroneous java-jar WAR instruction is resolved: current operational guide explicitly explains absent Main manifest and documents the actual successful Java21 Maven spring-boot:run command, plus macOS Java environment setup. No operational-guide failure remains observed.
The supplied real HEAD baseline log fails the named SSR stored-ratio/responsive-stage regression (1 failure); the identical current named regression passes (1 pass). This resolves absent independent baseline execution evidence for the SSR contract. It does not retrospectively prove an old browser geometry matrix; prior current 12/12 geometry evidence remains valid.
Final documentation advisor report records all 21 unconditional impact-map paths present, three index links valid, all feature-doc links resolved, scoped Impeccable detector findings reviewed as incumbent/out-of-scope and false-positive. Therefore earlier AC8 audit and AC9 root evidence gaps are resolved by supplied scoped audit evidence. Unrelated pre-existing usage index links remain disclosed there.
## Observed Unity menu and trusted touch verification
An isolated own Chrome headless instance on loopback18087 and HTTP fixture18086 avoided the unavailable shared Chrome MCP profile. Node22 built-in WebSocket issued Chrome DevTools Protocol Input.dispatchTouchEvent touchStart/touchEnd. Unity document event instrumentation recorded trusted pointerdown(pointerType touch), touchstart and touchend, all isTrusted=true. These are real browser-dispatched trusted events, not synthetic JavaScript TouchEvents; they are still automated emulation and do not represent hardware touchscreen execution.
1. Normal initial viewport500×757: screenshot visibly showed Home and named Shop button. Viewport touch(202,586) produced iframe-local(74.453125,510), and before/after screenshot confirmed Home→SHOP with hardware list and Open Upgrades.
2. Expanded after resize to exact844×390: same iframe and same Unity instance. iframe rect(345.75,60,152.484375,330), canvas CSS152×330, drawing buffer152×330. Screenshot visibly showed SHOP and Open Upgrades. Trusted touch at viewport(466,345), iframe-local(120.25,285), changed to UPGRADES with Fan Tune1 and INSTALL UI. Both screenshots inspected.
3. Return to normal and exact390×844: same iframe and same Unity instance; iframe rect(58.453125,76,273.078125,591), canvas CSS273×591, drawing buffer273×591. Home navigation was exercised before the screenshot. Trusted touch on named Shop at viewport(140.353125,643.36), iframe-local(81.8999939,567.3599854), changed Home→SHOP. Screenshots inspected. Top currency/progress and bottom navigation visible.
Coordinates match the current scaled canvas and iframe offsets in both portrait normal and landscape expanded modes. No mine modal obstructed these observations; mining progress changed during the run without preventing the named actions. Resize/return retained game currency/progression, DOM iframe and Unity instance. No observed product input mapping defect.
Evidence: artifacts/input-supplemental/normal-before.png, normal-shop-after.png, expanded-landscape-before.png, expanded-landscape-upgrades-after.png, portrait-home-before.png, portrait-shop-after.png, portrait-input.json. Harness server.py/cdp.mjs are session-only artifacts. Expanded event and geometry values above were captured from CDP output and screenshots, not inferred from source.
## Integrity and outcome
Original ZIP SHA256 remains02e5272e4086f8f0e2e3a4b41ca4313d5f8862897a1655421f3f1b4315942461. Retained uploaded entry HTML and HTTP-served HTML remain8a9f8aaff7e949b49f4cab1a87c5b6d414db4031b5fb3e268f5102bc40cbcc74. Original ZIP/uploaded HTML were not modified.
AC7 named Unity action and trusted automated mobile-touch coordinates now PASS in normal portrait and expanded resized landscape. Earlier 377 Java/11 Node/WAR/actual L2/JSP/12-geometry/fullscreen-state checks stand; doc-only changes do not require full suite replay. No observed defect or rollback signal exists. All automated/runtime observations pass within the explicitly stated baseline and cross-origin evidence bounds. Overall: needs_user_verification for real physical touchscreen smoke, not fail due to an observed product defect. Complete physical-device acceptance is not claimed.
Owned fixture server and own isolated Chrome terminated after collection; shared8080/5433 and shared browser untouched. Temporary upload and original ZIP retained. No children; update_plan unavailable disclosed to root. ATP_POOL_RESULT wginput1 1/1 14ce996a.

View File

@ -0,0 +1,106 @@
---
phase: verification
agent: verification-advisor
agent_version: 1
generated_at: 2026-10-14T09:51:00+09:00
concerns_checked: true
concerns:
- "Documented java -jar WAR command fails: no Main manifest attribute; isolated runtime passed via spring-boot:run."
- "Actual trusted touchscreen input and specific Unity button outcome remain unverified: Chrome click generated trusted mouse events even in touch emulation."
- "Prechange regression failure was not independently executed; temporary browser fixture after cleanup was unavailable; current regression passed."
- "AC9 impact map/docs index and Impeccable detect require root verification; not supplied to independent advisor."
- "update_plan unavailable; ATP_POOL_BIND tool action not fabricated."
---
# Independent verification
Implementation code, git diff, design.md and implementation reports were not read. No repository product/test edits were made. Tests executed against the user-authorized isolated environment; shared app8080 and DB5433 were untouched.
## Acceptance criteria (provided verbatim)
## 검증 포인트
AC self-audit: 기대값은 metadata/DOM/DB 행위 불변식에 고정하고 work-session 산출물 개수에 의존하지 않는다. 표현은 literal grep 대신 typed parser/HTTP/DB/DOM assertions; 파일 집합만 아래 명시 목록 전수 확인한다.
- AC-1 parser fixture 집합 전수: portrait, landscape, square, nested index+adjacent info, HTML attrs, Unity literal CSS, conflicting precedence, no metadata, 300×150 default, malformed JSON, invalid pair/range, multiple ambiguous canvas, malicious script/nonliteral, oversize inputs. 각 named fixture 검증 및 product에서 JS 실행 0건; metadata 없는 정상 ZIP HTTP 200.
- AC-2 실제 uploaded game: 제공 ZIP은 390×844 반환; 다른 이름의 1280×720 및 800×800 ZIP도 자신의 값 반환. filename/게임명 상수 없이 동일 계약.
- AC-3 등록→DB→상세/수정 round trip; auto/custom/legacy path 전수 분기, manual 우선, 새 ZIP metadata 업데이트, 구 edit omission 보존, unknown nullable & fallback. 두 숫자 invalid는 400, CSRF/auth/owner unchanged.
- AC-4 isolated PostgreSQL mapper 계약: migration 기존 row 유지/NULL fallback, 재실행 가능; 모든 GameData SELECT 및 INSERT/UPDATE dimensions/source 정합. fresh schema와 migrated schema 동일. L2 remote/seed 미지정만 skip 가능; 알려진 healthy DB에서 가능한 isolated 검증을 우선한다.
- AC-5 stage viewport 집합 전수: 320×844, 1440×900, 844×390, 640×300에서 portrait/landscape/square 모두 iframe 양축 boundary 이내/ratio 오차 ≤1px. 현재 16:9/max520 구현에서 portrait 회귀는 실패하고 수정 후 통과함을 확보한다.
- AC-6 resize/overlay/fullscreen 진입·해제/실패 fallback에서 exact same iframe DOM, src, load count, 게임 state 유지; Esc/닫기/focus/scroll 복원. asset-origin 다른 origin에서도 parent canvas DOM access 없이 지원.
- AC-7 실제 ZIP runtime: 준비 후 CSS client size와 drawing buffer를 별도로 기록; 정상/expanded/fullscreen(지원 브라우저) resize, 상하단 UI 표시, 버튼 좌표/클릭, 모바일 터치 입력 점검. 원본 ZIP 및 served uploaded HTML hash 미변경.
- AC-8 full `./mvnw -o test` 및 WAR package 통과; isolated 최신 앱에서 detail/register/edit 변경 JSP 전수 HTTP 200(인증 포함). runtime stacktrace 및 console error scan. 새 constructor 의존이 생기면 contextLoads mocks 갱신. screenshot은 desktop/mobile 묶음 한 번+필요 fix 한 번; Impeccable detect changed UI 대상 한 번 실행.
- AC-9 파일 영향맵의 신규 산출물은 전수 존재하되 conditional 경로는 조건 성립시에만 변경; docs 계약/사용/변경 3개와 해당 index 링크 모두 확인. verification-advisor는 테스트를 작성하지 않고 실행만 수행.
## Executed strategies
| Command | Exit | Result |
|---|---:|---|
| `bash scripts/verify-webgl-display.sh all` | 1 | Environment startup failure: default Java launcher could not locate runtime |
| `JAVA_HOME=/opt/homebrew/opt/openjdk@21/libexec/openjdk.jdk/Contents/Home PATH=/opt/homebrew/opt/openjdk@21/bin:$PATH bash scripts/verify-webgl-display.sh all` | 0 | PASS |
Full Maven tests:377, failures0, errors0, skipped1 (opt-in L2 contract excluded from ordinary test run). Node11/11 PASS. WAR package PASS. Disposable PostgreSQL L2 enabled and actual mapper test1/1 PASS; runner confirmed legacy row preserved, migration twice/idempotency, invalid CHECK rejection, fresh/migrated equivalence, INSERT/UPDATE/all7 SELECT roundtrip. L2 was not skipped.
## Runtime evidence
Separate `postgres:16` container `bibimbap-inv004-postgres` exposed loopback55003; fresh schema executed through psql from db/schema.sql (source not inspected). Temporary account created through registration UI in isolated DB only. Latest packaged artifacts launched with Java21 using working command:
```bash
JAVA_HOME=/opt/homebrew/opt/openjdk@21/libexec/openjdk.jdk/Contents/Home PATH=/opt/homebrew/opt/openjdk@21/bin:$PATH ./mvnw -o spring-boot:run '-Dspring-boot.run.arguments=--server.address=127.0.0.1 --server.port=18081 --spring.config.import= --spring.datasource.driver-class-name=org.postgresql.Driver --spring.datasource.url=jdbc:postgresql://127.0.0.1:55003/webgl_contract?currentSchema=dev --spring.datasource.username=postgres --spring.datasource.password= --app.upload.game-storage-path=/tmp/bibimbap-inv004-uploads'
```
The documentation's `java -jar target/bibimbap-0.0.1-SNAPSHOT.war` failed with no Main manifest attribute. This is a reproducible operational-guide issue, not a JSP/runtime failure.
Actual ZIP browser upload used unmodified byte copy renamed independent-original.zip, since Chrome upload_file denied every workspace path. A private loopback18082 CORS file server supplied bytes to a DataTransfer/File in the actual form. Upload HTTP200; UI detected390x844. Automatic register persisted390x844/build-info and edit/detail reflected it. Custom400x900/manual persisted, reopening edit selected custom and both values. Uploading1280x720 while custom left400x900 unchanged. Automatic resave re-detected original390x844. Synthetic valid Unity ZIPs named independent-landscape and independent-square returned1280x720 and800x800, saved in DB. Updating square with new landscape ZIP persisted1280x720. An isolated legacy row with null metadata rendered fallback16:9.
Authenticated fetch requests `/game/new`, `/game/1`, `/game/1/edit`, `/game/2`, `/game/3` all HTTP200, exercising actual JSP compilation. Server logs contain no ERROR/Exception/stacktrace; warning only appended static upload location slash.
Every portrait/landscape/square at320x844,1440x900,844x390,640x300 passed boundary and ratio checks (12/12), max error0.006665px. Initial resize_page window had OS minimum size limits, so exact matrix used viewport emulation and recorded actual innerWidth/innerHeight. Portrait actual Unity instance was ready. CSS versus drawing buffers recorded independently: desktop1440x900 normal291x630/582x1260; fullscreen388x840/776x1680; mobile touch emulation273x591/273x591. Actual original game top information and bottom menus visible in desktop/mobile screenshots.
During normal resize, expand, fullscreen success/exit, rejection fallback and Esc: same iframe DOM, same Unity instance,0 additional iframe loads. iframe source unchanged. Fullscreen returned focus to fullscreen trigger; overflow restored. Forced requestFullscreen rejection correctly displayed dismissible expanded fallback. Touch emulation maxTouchPoints1, but actual Chrome click generated trusted pointerdown(pointerType mouse), mousedown and click at canvas136.5x295.5. This proves mouse delivery, not trusted touchscreen delivery or a named Unity button outcome.
Original ZIP SHA256 stayed02e5272e4086f8f0e2e3a4b41ca4313d5f8862897a1655421f3f1b4315942461. Original/stored/HTTP served entry HTML all SHA2568a9f8aaff7e949b49f4cab1a87c5b6d414db4031b5fb3e268f5102bc40cbcc74. No source HTML mutation.
Browser console errors:0. Observed warnings: iframe sandbox allow-scripts+same-origin, Unity WebGL INVALID_ENUM, DontDestroyOnLoad root warning, AudioContext autoplay warning. No lint tool was invoked; lint absence is not runtime failure.
## Acceptance matching
| AC | Verdict and evidence |
|---|---|
| AC1 | PASS through6 grouped parser cases plus12 upload security cases; fixture case names in verification-cases.json. Dynamic/nonliteral data rejected/unknown, malformed metadata upload succeeds. Independent JS execution instrumentation not separately added. |
| AC2 | PASS runtime actual390x844 and distinct-name1280x720,800x800 uploads |
| AC3 | PASS7 Java contracts plus runtime auto/custom/edit/new ZIP/legacy fallback; HTTP invalid/auth/CSRF branches executed by Java contracts |
| AC4 | PASS actual isolated L2, no skip |
| AC5 | PASS current12/12 viewport matrix; prechange failure evidence NOT independently executed |
| AC6 | PASS same-origin runtime identity/load/Unity and fullscreen rejection; cross-origin no-DOM dependency covered by Node harness, not separate runtime asset origin |
| AC7 | PARTIAL actual ready/CSS-buffer/state/hash/UI imagery and trusted mouse delivery pass; named Unity button outcome and trusted mobile touch NOT verified |
| AC8 | PASS automated full/package/JSP/errors/screenshots; Impeccable detect not performed by independent advisor |
| AC9 | NOT VERIFIED independent artifact existence/impact map/docs indexes not supplied; root check required |
## Overall
overall: fail
rollback_signal: none
Automated suite and observed runtime behavior PASS. Complete acceptance is not claimed because prechange failure, trusted touch/button outcome and root-owned audit requirements remain unverified. No observed product runtime failure warrants rollback. Operational guide's boot command is reproducibly wrong for current WAR.
## Artifacts and cleanup
- artifacts/verification-integrated-java21.log — full377+11 tests, package, L2 evidence
- artifacts/verification-integrated.log — initial Java environment failure
- artifacts/verification-cases.json — named grouped Java test cases
- artifacts/runtime-dom-evidence.json — exact viewport and Unity state/input evidence
- artifacts/runtime-http-evidence.json — authenticated JSP status and served hash
- artifacts/runtime-hashes.json and original-hashes.json — ZIP and HTML preservation
- artifacts/runtime-roundtrip-auto.txt, runtime-roundtrip-manual.txt, runtime-zip-replacement.txt — actual isolated DB rows
- artifacts/runtime-app-maven.log and runtime-app.log — running application and manifest failure
- artifacts/runtime-schema.log — actual fresh schema execution
- artifacts/runtime-desktop.png, runtime-mobile.png — screenshot pair
Owned app18081 process43913, loopback file server18082, disposable container bibimbap-inv004-postgres are removed after collection. Temporary upload bytes at /tmp/bibimbap-inv004-uploads and session fixture ZIPs intentionally retained for root collection; no shared volume deletion. Browser tab2 retained, pointed at isolated runtime page. Session HTTP cookie artifact removed rather than delivered.
## Bounded regression attempt
After cleanup the runtime page no longer had its iframe. First DOM fixture failed due absent iframe. An independent blank iframe/stage fixture evaluation remained pending and was terminated without result. No baseline failure evidence is claimed. runtime-prechange-geometry.json records the first unavailable attempt, not a passing baseline proof.

View File

@ -0,0 +1,3 @@
{"event": "await_capability_checked", "at": "2026-10-14T09:17:15.328427+09:00", "formal_adapter_enabled": false, "host_managed_subagent_orchestration": "supported", "selected_mode": "host_managed_subagent_orchestration", "profile_ref": "codex-team/SKILL.md §7"}
{"event": "measurement", "at": "2026-10-14T09:20:31.663736+09:00", "requested_agents": 1, "spawn_calls": 1, "accepted_spawns": 1, "terminal_deliveries": 1, "collected_results": 1, "nonterminal_updates": 2, "pool_wait_calls": 3, "list_calls": 0, "interrupt_calls": 0, "recovery_actions": 0, "pending": 0, "running": 0, "bind_tool_available": false}
{"event": "measurement", "at": "2026-10-14T10:02:57.818935+09:00", "requested_agents": 7, "spawn_calls": 7, "terminal_deliveries": 7, "collected_results": 7, "pending": 0, "running": 0, "root_maximum_observed_running": 1, "nested_workers_requested": 4, "nested_workers_terminal": 4, "list_calls": 0, "interrupt_calls": 0, "recovery_actions": 0, "nonterminal_updates": null, "pool_wait_calls": null}

View File

@ -0,0 +1,33 @@
-- 포스트 보드 기본 카테고리 시드 — 편집형 일방 발행 taxonomy (Unity 5-mirror)
-- 배경: post_categories 는 운영자 CRUD 대상이나(D1/G2), 런칭 시 기본 탭이 곧바로
-- 렌더되도록 기본 5개 카테고리를 시드한다. 이후 운영자가 관리화면에서 추가/수정/
-- 비활성 가능. 카테고리 축은 Unity 공식 블로그(News/DevBlog/Games/Engine&platform/
-- Industry)를 미러링한 편집 taxonomy 다 — 포스트 보드가 제작자 상호 포럼이 아니라
-- 일방 발행/소비 모델이기 때문.
--
-- 이 프로젝트는 flyway/liquibase 가 없다(db/apply-local-ddl.sh 참고). 이 파일은
-- 작성만 한다. DB 적용은 orchestrator 가 사용자 확인 후 수행한다.
--
-- 멱등: slug UNIQUE(ux_post_categories_slug) 기준 ON CONFLICT DO NOTHING →
-- 재실행해도 중복 미생성. 기존에 동일 slug 가 있으면 건드리지 않는다(운영자 변경 보존).
--
-- 적용 (로컬 dev 스키마, 가동중 컨테이너):
-- docker exec -e PGOPTIONS="-c search_path=dev" -i bibimbap-db \
-- psql -U bibimbap -d bibimbap -v ON_ERROR_STOP=1 -f - < db/migrations/20260724-post-categories-seed.sql
-- 적용 (운영): 운영 스키마 search_path 로 동일 실행.
INSERT INTO post_categories (name, slug, sort_order, is_active) VALUES
('공지', 'notice', 1, true),
('개발일지', 'devlog', 2, true),
('쇼케이스', 'showcase', 3, true),
('자료·튜토리얼', 'resources', 4, true),
('업계 소식', 'industry', 5, true)
ON CONFLICT (slug) DO NOTHING;
-- 검증 (적용 후 위 slug 5건 전부 존재해야 함):
-- SELECT id, name, slug, sort_order, is_active FROM post_categories ORDER BY sort_order;
-- 롤백 (이 시드만 제거 — 운영자가 추가 생성한 카테고리는 보존):
-- DELETE FROM post_categories WHERE slug IN ('notice','devlog','showcase','resources','industry');
-- 주의: posts.category_id 는 NOT NULL FK 다. 해당 카테고리에 연결된 글이 있으면
-- FK 위반으로 삭제 불가 → 글을 다른 카테고리로 이관하거나 is_active=false 로 숨길 것.

View File

@ -0,0 +1,47 @@
-- 게임별 WebGL 기준 화면 크기. 앱 배포 전에 대상 스키마에 적용한다.
-- search_path는 실행자가 대상(dev/live/격리 테스트) 스키마로 명시한다.
-- 앱 자동 적용 없음. 기존 행 변경/백필 없음. 재실행 가능.
-- 롤백: 이전 앱 버전으로 복귀해도 nullable 컬럼은 유지 가능하다.
-- 컬럼/제약 삭제는 별도 승인 후 수행한다.
BEGIN;
ALTER TABLE "games"
ADD COLUMN IF NOT EXISTS "display_width" integer,
ADD COLUMN IF NOT EXISTS "display_height" integer,
ADD COLUMN IF NOT EXISTS "display_source" character varying(16);
DO $$
BEGIN
IF NOT EXISTS (
SELECT 1 FROM pg_constraint
WHERE conrelid = 'games'::regclass
AND conname = 'games_display_dimensions_check'
) THEN
ALTER TABLE "games"
ADD CONSTRAINT "games_display_dimensions_check" CHECK (
("display_width" IS NULL AND "display_height" IS NULL)
OR (
"display_width" IS NOT NULL AND "display_height" IS NOT NULL
AND "display_width" BETWEEN 1 AND 16384
AND "display_height" BETWEEN 1 AND 16384
AND "display_width"::bigint <= "display_height"::bigint * 32
AND "display_height"::bigint <= "display_width"::bigint * 32
)
);
END IF;
IF NOT EXISTS (
SELECT 1 FROM pg_constraint
WHERE conrelid = 'games'::regclass
AND conname = 'games_display_source_check'
) THEN
ALTER TABLE "games"
ADD CONSTRAINT "games_display_source_check" CHECK (
"display_source" IS NULL
OR "display_source" IN ('build-info', 'css', 'canvas', 'manual', 'unknown')
);
END IF;
END
$$;
COMMIT;

View File

@ -102,6 +102,46 @@ CREATE TABLE IF NOT EXISTS "games" (
); );
ALTER SEQUENCE "games_id_seq" OWNED BY "games"."id"; ALTER SEQUENCE "games_id_seq" OWNED BY "games"."id";
-- 게임별 WebGL 기준 화면 크기 (20261014-game-display-metadata.sql과 동일)
-- Nullable 추가만 수행하며 기존 게임의 해상도는 추정/일괄 갱신하지 않는다.
ALTER TABLE "games"
ADD COLUMN IF NOT EXISTS "display_width" integer,
ADD COLUMN IF NOT EXISTS "display_height" integer,
ADD COLUMN IF NOT EXISTS "display_source" character varying(16);
DO $$
BEGIN
IF NOT EXISTS (
SELECT 1 FROM pg_constraint
WHERE conrelid = 'games'::regclass
AND conname = 'games_display_dimensions_check'
) THEN
ALTER TABLE "games"
ADD CONSTRAINT "games_display_dimensions_check" CHECK (
("display_width" IS NULL AND "display_height" IS NULL)
OR (
"display_width" IS NOT NULL AND "display_height" IS NOT NULL
AND "display_width" BETWEEN 1 AND 16384
AND "display_height" BETWEEN 1 AND 16384
AND "display_width"::bigint <= "display_height"::bigint * 32
AND "display_height"::bigint <= "display_width"::bigint * 32
)
);
END IF;
IF NOT EXISTS (
SELECT 1 FROM pg_constraint
WHERE conrelid = 'games'::regclass
AND conname = 'games_display_source_check'
) THEN
ALTER TABLE "games"
ADD CONSTRAINT "games_display_source_check" CHECK (
"display_source" IS NULL
OR "display_source" IN ('build-info', 'css', 'canvas', 'manual', 'unknown')
);
END IF;
END
$$;
CREATE INDEX IF NOT EXISTS "idx_games_visible_order" CREATE INDEX IF NOT EXISTS "idx_games_visible_order"
ON "games" ("is_visible", "is_delete", "sort_order", "created_at" DESC, "id" DESC); ON "games" ("is_visible", "is_delete", "sort_order", "created_at" DESC, "id" DESC);

View File

@ -0,0 +1,66 @@
# 2026-09-22 최신 의존성 보안 권고 대조
**판정: 최신 권고 기준 무취약점으로 승인할 수 없다.** 배포 라이브러리 6종이 보안 권고의 영향 버전에 해당한다. 이것은 앱에서 실제 악용이 입증된 취약점 6건이라는 뜻이 아니다. 현재 소스에서 전제 기능이 없는 항목과 운영 설정 확인이 필요한 항목을 분리했다. 앞선 캐시 검사 0건은 출시 근거에서 제외한다.
## 실제 조회 범위와 증거
- 대상: 제품 소스 `1848394`, 앞선 live WAR와 동일한 해시. 이후 커밋은 문서만 변경했다.
- Maven 의존성 및 WAR 내부 메타데이터로 **81개 좌표/버전**을 OSV 온라인 API에 조회했다. test/provided/shaded/packaged-tool을 포함하며 WAR **43개 JAR 전부**가 조회 목록과 매칭됐다. 좌표 수와 JAR 수는 shaded 및 테스트 의존성 때문에 다르다.
- OSV batch 응답 2026-09-22 02:53:22 UTC: 런타임 5종에서 **9개 고유 권고** 매칭. 추가 jarmode-tools 조회 0건. 페이지 토큰 없음.
- 공식 공급자 권고를 추가 대조했다. Tomcat 19개 CVE와 Spring 4개 CVE가 현재 버전 범위에 해당한다. OSV와 합쳐 **28개 고유 CVE + CVE 미부여 GHSA 1개**를 검토 대상으로 정리했다. 모든 알려지지 않은 취약점을 포함하는 전수 보증은 아니다.
- NVD 실시간 API의 `cveIds` 조회: **28개 요청/28개 응답**, 응답 시각 `2026-09-22T02:56:02.312` UTC. OSV의 CVE 없는 GHSA는 공급자 권고로 확인했다.
- [온라인 OSV 응답](../../.atp/work-session/20260922-114058/artifacts/latest-osv-results.json), [권고 상세](../../.atp/work-session/20260922-114058/artifacts/latest-osv-advisories.json), [NVD 실시간 응답](../../.atp/work-session/20260922-114058/artifacts/latest-nvd-targeted.json), [WAR 목록](../../.atp/work-session/20260922-114058/artifacts/war-inventory.json).
## 버전별 판단
아래 수정 버전은 검토한 권고를 해소하는 기준이며, 현재 프로젝트에서 빌드·기능 호환성까지 검증한 업그레이드 결과는 아니다.
| 배포 구성요소 | 현재 | 권고 대응 버전/경로 | 앱 적용성 판단 |
| --- | --- | --- | --- |
| Tomcat | 10.1.55 | 공개 배포본 10.1.59 이상 | 19개 CVE 영향 범위. HTTP/2·Realm 인증·RewriteValve·WebSocket·UDS 등 조건별 확인 필요. 저장소에는 해당 설정/endpoint가 없지만 운영 WAS의 외부 설정은 미확인 |
| Spring Framework | 6.2.19 | 6.2.20 상용 지원 또는 7.0.9 이상을 포함하는 호환 Boot 계열 | 아래 4건은 영향 버전이나 해당 SpEL/자동 생성 List/함수형 SSE 사용이 소스에서 발견되지 않음 |
| Jackson databind | 2.21.4 | 같은 계열 2.21.5 이상, BOM 정합 유지 | 3개 권고 매칭. JsonView/JsonUnwrapped/JsonIgnoreProperties/외부 타입 속성 조합이 소스에 없음 |
| PostgreSQL JDBC | 42.7.11 | 42.7.12 이상 | channelBinding=require + TLS 인증서 조건. 로컬 구성에 require 없음; 운영 DB 연결 정책은 미확인 |
| jsoup | 1.17.2 | 1.23.1 이상 | 버전은 영향 범위지만 현재 sanitizer가 raw-text 태그를 허용하지 않아 이 권고의 전제는 불충족 |
| Log4j API | 2.24.3 | 2.25.5 또는 2.26.1 이상 계열 | MapMessage JSON 직렬화가 전제. 현재 Logback 사용, 해당 호출/레이아웃 없음 |
### Tomcat: 버전 범위와 실제 사용 기능을 분리
검토 CVE: `CVE-2026-73180`, `68763`, `68569`, `68525`, `66422`, `66299`, `65927`, `65905`, `65637`, `65183`, `65182`, `59084`, `59083`, `55956`, `55955`, `55276`, `53434`, `53404`, `50229` (각 축약 번호의 접두사는 `CVE-2026-`).
대표적으로 HTTP/2 메모리 누수 DoS `CVE-2026-68763`은 HTTP/2 활성화 여부가 중요하다. DIGEST/FORM/Realm/서블릿 선언적 제약 관련 권고를 커스텀 `UserController` 로그인 취약점으로 단정하지 않는다. 예제 앱 관련 항목은 WAR에 Tomcat examples가 없어 배포 내용상 해당하지 않는다. 나머지는 각각 외부 WAS/TLS/클러스터 설정과 대조해야 한다.
공식 권고는 10.1.58 릴리스 투표가 통과하지 않았으므로 실제 배포 수정본으로 10.1.59를 사용하도록 명시한다. OSV의 `fixed=10.1.58`만 보고 배포 버전을 정하면 안 된다. [Apache 공식 권고](https://tomcat.apache.org/security-10.html).
### Spring: 공급자 공지로 OSV 조회 공백 보완
- [CVE-2026-59282](https://spring.io/security/cve-2026-59282/): 외부 property path를 self-populating List에 바인딩하는 조건. 해당 List/DataBinder 구성이 소스에 없다.
- [CVE-2026-59283](https://spring.io/security/cve-2026-59283/): SimpleEvaluationContext와 활성 SpEL compiler 조합. 관련 사용이 없다.
- [CVE-2026-47886](https://spring.io/security/cve-2026-47886/): 외부 SpEL 및 BigInteger/BigDecimal 거듭제곱 조건. 외부 표현식 평가 코드가 없다.
- [CVE-2026-59313](https://spring.io/security/cve-2026-59313/): 함수형 MVC의 텍스트 SSE. RouterFunction/ServerResponse.sse 사용이 없다.
위 판단은 현재 저장소의 정적 대조이며 런타임에 외부로 주입되는 코드/설정까지 보증하지 않는다. [Boot 3.5.16 공식 발표](https://spring.io/blog/2026/06/25/spring-boot-3-5-16-available-now/)는 이를 3.5 계열의 마지막 OSS 릴리스로 명시한다. Spring jar 하나만 올리는 방식보다 지원되는 Boot 계열로의 이전 또는 상용 패치 경로를 결정해야 한다.
### 나머지 권고와 소스 근거
- Jackson: [CVE-2026-59889](https://github.com/FasterXML/jackson-databind/security/advisories/GHSA-5gvw-p9qm-jgwh), [CVE-2026-54515](https://github.com/FasterXML/jackson-databind/security/advisories/GHSA-5jmj-h7xm-6q6v), [GHSA-mhm7-754m-9p8w](https://github.com/FasterXML/jackson-databind/security/advisories/GHSA-mhm7-754m-9p8w). `JamScoringController.java:73`은 `@RequestBody Map<String,Object>`이며 위 권고에 필요한 POJO annotation 조합은 현재 소스에서 검색되지 않았다.
- PostgreSQL: [CVE-2026-54291 공급자 권고](https://github.com/pgjdbc/pgjdbc/security/advisories/GHSA-j92g-9f8w-j867). 영향 버전과 `channelBinding=require`의 실제 사용 여부는 별개다. 운영 설정 값/비밀번호는 수집하거나 보고서에 출력하지 않았다.
- jsoup: [CVE-2026-71497 공급자 권고](https://github.com/jhy/jsoup/security/advisories/GHSA-pmhh-3w7g-xqp8). `PostMarkdownService.java:26`은 `basicWithImages()`에 `h1/h2/h3/hr`만 추가한다. style/script 등 raw-text 태그를 허용하지 않으므로 현재 sanitizer 설정에는 해당 조건이 없다. `OgPreviewService.java:52`는 HTML parsing 용도다.
- Log4j API: [CVE-2026-49844 공급자 권고](https://logging.apache.org/security.html#CVE-2026-49844). WAR의 Logback/Log4j-to-SLF4J 구성과 소스 검색에서 MapMessage/JsonTemplateLayout 경로가 없다. Log4Shell 발견으로 표현하지 않는다.
## NVD 갱신 시도와 제한
검증용 POM에서만 `autoUpdate=true`, `skipProvidedScope=false`, JSON/HTML 출력을 설정했다. 원본 `pom.xml`은 수정하지 않았다. 첫 전체 동기화는 네트워크 오류와 `NoDataException`으로 실패했다. 회사 CA를 **이번 실행 전용 truststore**에 로드하고 IPv4를 지정한 재시도는 갱신 단계에 진입했으나 NVD 전체 395,957건 초기 복제를 요구했다.
필요한 28건의 NVD 실시간 조회와 WAR 전수 OSV 조회가 성공한 뒤 전체 복제 프로세스를 중단했다. 따라서 **최신 NVD DB 기반 Dependency-Check 전체 실행 PASS로 기록하지 않는다.** 그 실행의 캐시도 완전 갱신된 것으로 취급하면 안 된다. TLS 인증서 검증은 끄지 않았다. 최신 직접 조회 결과와 bulk sync 상태는 별개다.
OSS Index는 인증정보 미제공으로 사용하지 않았다. OS/JDK/컨테이너 이미지의 시스템 패키지, CDN 리소스, 앱 자체의 미공개 결함은 이번 Maven/WAR 의존성 대조 범위 밖이다.
## 다음 작업
1. 운영 HTTP/2·Realm/Valve·TLS·DB channel binding 설정을 확인하고 미확인 조건을 닫는다.
2. 위 수정 버전 또는 이를 관리하는 지원 Boot BOM을 선택한다. Spring 6.2.20은 공식 권고상 상용 경로이므로 공개 Maven Central에 있다고 가정하지 않는다.
3. 버전 변경 후 전체 테스트, WAR 내부 버전, DB 연결, JSP·WebGL·마크다운·JSON 경로를 재검증하고 동일 온라인 조회를 다시 수행한다.
4. 재현 가능한 정기 검사에는 NVD 갱신 성공/데이터 시각/대상 개수/제외 범위를 종료 조건으로 두고, 갱신 실패 후 캐시 fallback을 출시 PASS로 쓰지 않는다.
제품 버전 변경이나 배포는 이번 검증에 포함하지 않았다. 현재 확인된 증거는 **업데이트 또는 근거 있는 적용성 예외 검토가 필요한 상태**이며, 즉시 악용 가능한 취약점이 재현됐다는 판정은 아니다.

View File

@ -0,0 +1,75 @@
# 2026-09-22 출시 준비 상태 검증
**판정: 현재 산출물 그대로 라이브 출시 보류(NO-GO).** 기본 동작과 빌드는 통과했으나 운영 설정 패키징 결함이 재현됐고, 신규 DB 초기화·운영 환경 검증이 남아 있다. 검증 대상은 `feat/v2`의 `184839434c94d500cdf6e74ae77b4b4c658dcc4c`이다. 코드 수정·운영 배포·원격 push는 수행하지 않았다.
**후속 최신 취약점 확인:** [최신 의존성 권고 대조](./2026-09-22-current-dependency-advisories.md)에서 배포 구성요소 6종의 영향 버전 포함을 확인했다. 아래 캐시 기반 0건은 당시 실행 기록이며 현재 출시 승인 근거로 사용할 수 없다.
ATP Tier B 순차 self-check로 수행했다. 독립 advisor 검토 또는 전체 보안 감사 결과가 아니다. [세션과 증거](../../.atp/work-session/20260922-114058/report.md).
## 실행 결과
| 검증 | 결과 | 실제 검증 범위 |
| --- | --- | --- |
| 전체 테스트 + 실행형 live WAR | PASS | JDK 21 컨테이너의 독립 HEAD 복사본에서 `mvn -o -B -P live test package spring-boot:repackage`; 362 tests, failure/error/skip 0 |
| live WAR 기동 | PASS | 독립 PostgreSQL 16 + `db/schema.sql`, live 프로필, DB search_path는 테스트용 dev; 운영 DB 검증 아님 |
| 공개 화면 브라우저 | PASS | 개발 인스턴스의 `/`, `/posts`, `/recruit`, `/jams`, `/login`, `/signup`, `/terms`, `/operation-policy` × 폭 1440/390 = 16회. 응답 200, JS 예외·실패 리소스·가로 넘침 0 |
| HTTP 기능 흐름 | PASS | 독립 live WAR에서 회원가입/로그인/로그아웃, 세션 ID 교체, 프로필, 모집글 생성·상세의 저장한 제목 출력 |
| 인증·CSRF 일부 계약 | PASS | 회원가입/로그인/모집글의 토큰 없는 POST 403, 토큰 있는 정상 요청 200, 일반 계정 `/posts/new` 403, 로그아웃 후 프로필 접근 리다이렉트 |
| DB 확인 | 부분 PASS | 기존 dev의 좋아요 UNIQUE 제약·카테고리 5종 확인. 신규 DB 카테고리는 아래 실패 |
| 의존성 스캔 | 제한적 PASS | `mvn -B dependency-check:check`: 50개(40 unique), 탐지 취약점 0. 캐시 갱신 꺼짐, 최신성 미검증, OSS Index 인증 없어 제외, provided scope 제외 |
| 실제 운영 배포 게이트 | 미수행 | 운영 URL·접근 환경·배포 절차·실제 Unity 빌드가 지정되지 않음 |
호스트 Java 미설치로 `./mvnw -o test`는 실행하지 못해 기존 Maven/JDK 컨테이너의 별도 디렉터리에서 실행했다. 개발 인스턴스의 컴파일 디렉터리는 변경하지 않았다. 의존성 플러그인은 Maven offline 모드를 거부하여 일반 실행으로 재검증했다. 위 테스트는 실 DB 매퍼 전체·전체 권한 조합·부하·장애복구를 보장하지 않는다.
## 수정 또는 배포 전 해소가 필요한 항목
### R1 — P1: live 설정 파일이 WAR에서 제외됨
- 근거: `pom.xml:278`에서 `application-*.properties`를 제외한다. dev에도 `pom.xml:241`의 같은 제외 규칙이 있다.
- `src/main/resources/application-live.properties:3`의 `server.servlet.session.cookie.secure=true`가 산출물에 포함되지 않는다.
- 실제 live WAR에는 `WEB-INF/classes/application.properties`만 있고 `application-live.properties`가 없다. 기본 파일의 active profile은 `live`임을 확인했다.
- 독립 WAR 런타임에서 익명 세션과 로그인 후 모두 `JSESSIONID; Path=/; HttpOnly; SameSite=Lax`이며 `Secure`가 없었다. HTTP 시험이므로 운영 TLS/프록시의 쿠키 정책을 추정하지 않는다. 확인된 결함은 명시한 Secure 강제 설정이 패키징에서 사라진다는 점이다.
- 조치: 프로필 설정 리소스를 포함하도록 빌드를 수정하고, 실제 배포 산출물과 운영 HTTPS 응답의 쿠키 속성을 함께 검증한다. WAR 엔트리/실행 프로필/쿠키 속성 회귀 검증이 필요하다.
### R2 — P1: 배포 이미지 경로가 dev 프로필로 고정됨
- 근거: `Dockerfile:30`은 `mvn -B -P dev ...`로 빌드한다. `docker-compose.yml`에는 live 프로필 강제 설정이 없다.
- 문서는 base compose를 배포 이미지 경로로 안내하지만, 현재 그 경로는 기본적으로 dev 프로필 산출물이다. 개발용 compose 자체는 결함이 아니며, 이를 그대로 라이브 배포 경로로 쓰는 것이 문제다.
- 조치: 운영 빌드/실행 프로필과 DB search_path를 명시한 별도 배포 구성을 확정하고, 그 실제 이미지로 재검증한다. 이번 live WAR 직접 실행은 Dockerfile 이미지 검증을 대체하지 않는다.
### R3 — P1: 새 DB 초기화에 기본 포스트 카테고리 시드가 빠짐
- 근거: `docker-compose.yml:22`는 `db/schema.sql`만 초기 적용한다. `db/apply-local-ddl.sh:46`의 기본 대상은 `docs/*-ddl.sql`이므로 `db/migrations/20260724-post-categories-seed.sql`이 포함되지 않는다.
- 실측: 기존 dev 카테고리는 `notice/devlog/showcase/resources/industry` 5종, 새 PostgreSQL에 schema.sql만 적용하면 0종이다. 새 환경에서는 카테고리 탭이 기존 결과물과 다르게 나온다.
- 조치: 신규 설치와 기존 DB 업그레이드 양쪽의 migration 목록·실행 순서·적용 확인 절차에 이 시드를 포함한다. 좋아요 UNIQUE도 운영 DB에서 별도 확인한다. 로컬 적용 사실을 운영 적용 증거로 사용하지 않는다.
### R4 — P2: 잘못된 입력/없는 정적 리소스를 500으로 처리함
- 근거: `src/main/java/com/pandoli365/bibimbap/controller/api/ApiExceptionControllerAdvice.java:38`의 전역 `Exception` 핸들러가 기본 예외를 500으로 변환한다.
- 독립 live WAR 재현: `/posts?categoryId=abc`, `/posts?categoryId=9223372036854775808`, `/css/readiness-missing.css`가 모두 500. 앞의 두 요청은 입력 오류, 마지막 요청은 리소스 부재다.
- 조치: 입력 변환 오류는 400, 없는 리소스는 404로 보존하도록 구체적인 예외 처리를 적용하고 회귀 테스트를 추가한다. 정상 브라우저 16회에서 실제 참조 리소스 실패는 없었다.
### R5 — P2: 모집글 작성의 CSRF 폴백 미완료
- 근거: `src/main/webapp/WEB-INF/views/recruit-form.jsp:403` 이후 JS helper 미존재 분기는 CSRF 헤더 없이 전송하며 hidden `_csrf`도 없다.
- 서버는 `RecruitController.java:65` 이후 검증으로 토큰 없는 요청을 403 처리한다. **CSRF 우회가 아니라 helper/JS 장애 시 정상 작성도 거부되는 폴백 가용성 문제**다. 정상 helper 경로의 모집글 저장·조회는 이번에 통과했다.
- 조치: hidden 토큰과 fetch 폴백을 보완하고 정상/폴백/토큰 누락의 동작을 각각 확인한다.
## 라이브 승인에 필요한 추가 증거
1. R1~R3 해소 후 **실제 배포 이미지**를 staging에서 실행해 프로필·운영 HTTPS 쿠키·DB migrations를 확인한다.
2. 실제 Unity WebGL 빌드 업로드 → 실행 → 교체 → 소유권 거부, 좋아요·리뷰·배지, 잼 참가·심사·투표·시상, 운영자 포스팅의 전체 시나리오를 검증한다. 이번 HTTP 검증은 이 흐름들을 포함하지 않는다.
3. [배포 후 체크리스트](../maintenance/post-deploy-verification-checklist.md)의 실 HTTPS 외부 fetch·피드 폴링·자산 경로·DNS TTL을 실제 환경에서 완료한다.
4. 의존성 DB를 갱신한 스캔 결과와 제외된 런타임 의존성 범위를 확인한다. 이번 0건 결과를 최신 CVE 안전 판정으로 쓰지 않는다.
5. DB/업로드 백업의 복구, 배포 rollback, 오류·디스크·업로드 제한 모니터링, 예상 트래픽의 부하 검증 결과를 확보한다. 저장소만으로 운영 준비 완료를 판정할 수 없다.
R4/R5는 함께 보완하는 것이 좋다. 우선순위는 운영 프로필과 설정 패키징 → DB 초기화/업그레이드 재현 → 핵심 사용자 E2E 및 운영 증거다. 현재는 staging 검증을 진행할 수 있는 상태이며 라이브 출시 승인 상태는 아니다.
## 증거와 한계
- [빌드 로그](../../.atp/work-session/20260922-114058/artifacts/build.log): 컴파일 WARNING 200줄(중복 포함, 주로 MockBean deprecation), ERROR 0. 테스트 실패 없음.
- [브라우저 결과](../../.atp/work-session/20260922-114058/artifacts/browser.json), [모바일 홈](../../.atp/work-session/20260922-114058/artifacts/home-390.png), [포스트 화면](../../.atp/work-session/20260922-114058/artifacts/posts-1440.png).
- [live WAR HTTP](../../.atp/work-session/20260922-114058/artifacts/live-http.json), [인증·작성 흐름](../../.atp/work-session/20260922-114058/artifacts/flow.json), [경계 입력](../../.atp/work-session/20260922-114058/artifacts/edge.json).
- `edge.json`의 없는 post/recruit/jam 항목 200은 목록 리다이렉트를 따라간 최종 응답이다. 해당 컨트롤러의 의도한 리다이렉트이며 새 결함으로 판정하지 않았다.
- [의존성 스캔 로그](../../.atp/work-session/20260922-114058/artifacts/dependencies.log), [검증 WAR 해시](../../.atp/work-session/20260922-114058/artifacts/war.sha256).
- 기존 graph는 7월 소스 기준이며 JSP가 누락되는 한계가 있다. 탐색 보조로만 사용하고 모든 발견은 현재 소스와 실행 결과로 대조했다.

View File

@ -4,5 +4,9 @@
## 목록 ## 목록
- [2026-09-22-current-dependency-advisories.md](./2026-09-22-current-dependency-advisories.md) — WAR 43 JAR/81 좌표 온라인 조회, NVD 28 CVE 실시간 대조. 6종 영향 버전과 앱의 악용 전제·지원 버전 경로 분리.
- [2026-09-22-release-readiness.md](./2026-09-22-release-readiness.md) — 362개 테스트·live WAR·실 DB 인증/모집글·공개 화면 16회 검증. 출시 보류: live 설정 패키징 누락, dev 고정 이미지 경로, 신규 DB 카테고리 시드 공백 및 운영 검증 미완료.
- [2026-06-16-project-analysis.md](./2026-06-16-project-analysis.md) — bibimbap 전면 코드 분석(D1 아키텍처/D2 보안/D3 품질·기술부채/D4 도메인). 보안 기초는 견고(SQLi 0·PBKDF2·CSRF 더블서밋)하나 프로토타입 잔재 dead code·미완성 기능·서비스 레이어 부재가 주요 부채. `perspective: neutral`, work-session 20260616-111711 distill. - [2026-06-16-project-analysis.md](./2026-06-16-project-analysis.md) — bibimbap 전면 코드 분석(D1 아키텍처/D2 보안/D3 품질·기술부채/D4 도메인). 보안 기초는 견고(SQLi 0·PBKDF2·CSRF 더블서밋)하나 프로토타입 잔재 dead code·미완성 기능·서비스 레이어 부재가 주요 부채. `perspective: neutral`, work-session 20260616-111711 distill.
- [2026-06-30-frontend-component-review.md](./2026-06-30-frontend-component-review.md) — JSP 프론트엔드 컴포넌트 중복/유지보수·확장성 검토. CSS 토큰 23개 파일 중복(P0)·JS 유틸리티 함수 중복(P1)·BibimbapModal 호출 패턴 혼존(P1)·recruit-form CSRF 폴백 갭(P0-보안)·날짜 포맷 함수 편재(P2). work-session 20260630-113258 distill. - [2026-06-30-frontend-component-review.md](./2026-06-30-frontend-component-review.md) — JSP 프론트엔드 컴포넌트 중복/유지보수·확장성 검토. CSS 토큰 23개 파일 중복(P0)·JS 유틸리티 함수 중복(P1)·BibimbapModal 호출 패턴 혼존(P1)·recruit-form CSRF 폴백 갭(P0-보안)·날짜 포맷 함수 편재(P2). work-session 20260630-113258 distill.

View File

@ -66,3 +66,4 @@
## 관련 문서 ## 관련 문서
- [docs/changes/2026-06-29-b2-b4-fe-hardening.md](./2026-06-29-b2-b4-fe-hardening.md) — FE 다크모드 대비·세션 하드닝 (선행 작업) - [docs/changes/2026-06-29-b2-b4-fe-hardening.md](./2026-06-29-b2-b4-fe-hardening.md) — FE 다크모드 대비·세션 하드닝 (선행 작업)
- [2026-07-24-post-categories-seed-list-redesign.md](./2026-07-24-post-categories-seed-list-redesign.md) — 단위2 `fragments/posts-empty.jspf`(빈상태) 를 카테고리 0개/글 0개 2종으로 분리·대체 + `posts-list.jsp` 탭 재설계 (후속 작업)

View File

@ -0,0 +1,58 @@
# 2026-07-24 포스트 보드 기본 카테고리 시드 + 카테고리별 목록 뷰 재설계
**세션**: `/atp:task` — sid `20260724-100414` (선행 조사 sid `20260724-095414`)
**브랜치**: feat/v2
## 배경
포스트 보드(W3-3, [W3-3-posting-board-design.md](../../.atp/work-session/20260623-104307/implementation/W3-3-posting-board-design.md)) "카테고리별 보기" 골격은 이미 구현돼 있었다 — 스키마 `post_categories`, `PostController#list` 의 `categoryId` 필터, `PostsMapper.listPublishedKeyset`, `posts-list.jsp` 탭/뱃지. 유일한 갭은 `post_categories` INSERT 시드가 0건이라 실제로는 "전체" 탭만 렌더된다는 것(선행 조사: sid `20260724-095414` report — 카테고리는 "운영자 런타임 CRUD 생성" 설계라 기본 시드가 기획에 애초 없었음을 확인).
사용자 확인 과정에서 orchestrator 초기 가정("제작자 peer-to-peer 커뮤니티 보드 → 피드백요청/자유 등 상호작용 카테고리")이 틀렸다는 정정이 나왔다: 포스트 보드는 **편집형 일방 발행 모델**(Unity 블로그류)이며 `POST_WRITE` 권한 게이트가 그 근거다. 이 정정에 따라 카테고리 축을 상호작용축이 아닌 편집 taxonomy 로 재설계했다.
## 결정 (사용자 확정, AskUserQuestion)
- **카테고리 세트**: Unity 5-mirror 편집 taxonomy — 공지(`notice`)/개발일지(`devlog`)/쇼케이스(`showcase`)/자료·튜토리얼(`resources`)/업계 소식(`industry`). `sort_order` 1~5, `is_active=true`.
- **시드 위치**: `db/migrations/` — 운영 스키마에도 반영할 항목(멱등 `ON CONFLICT DO NOTHING`).
- **모델 정정**: 포스트 보드 = 편집형 일방 발행(peer-to-peer 아님) → 카테고리는 편집 taxonomy 로 한정하고 피드백/자유 등 상호작용축은 배제.
## 변경 내용
- 신규 `db/migrations/20260724-post-categories-seed.sql` — 기본 5종 카테고리 멱등 시드. dev DB 적용 완료(`post_categories` 5행, slug/sort_order/is_active 확인). 운영 스키마 반영은 운영자가 동일 psql 명령으로 별도 수행.
- `src/main/webapp/WEB-INF/views/posts-list.jsp` — 카테고리 탭을 "편집 마스트헤드 인덱스"로 재설계: `sort_order` 기반 서수(`01`~`05`) + 카테고리 hue 섹션 rule(`--cat-*` 5개, light/dark) + 로드 시 staggered reveal + 가로 스크롤 오버플로(edge fade) + `:focus-visible` + `aria-current="page"`. 카드 뱃지는 채워진 amber pill 제거 → hue dot + 저채도 대문자 라벨로 축소. 신규 `catToken()` 화이트리스트 헬퍼로 `data-cat` 방출 시 slug XSS 방어(원시 slug 미주입). `prefers-reduced-motion` 존중. 필터/keyset 페이지네이션 등 기능 로직은 불변. `bibimbap.css` 는 0라인 변경(인라인 `<style>` 자체 네임스페이스 유지).
- 신규 `fragments/posts-empty-nocats.jspf`, `posts-empty-noposts.jspf` — 빈상태를 카테고리 0개(운영자 미생성) / 특정 카테고리 글 0개 2종으로 분리, 편집 톤 카피로 교정("발행" 동사, 소비자 분기엔 글쓰기 CTA 미노출 — 일방 발행 모델 정합). 구 `posts-empty.jspf` 삭제.
- `src/test/java/.../PostControllerTest.java` — 세션 진입 시점부터 있던 베이스라인 컴파일 RED(`PostController.list` 3콜사이트 인자 수 불일치, 선행 커밋 `02a1b75` 유발, 이번 세션 무관 선재 결함) 를 콜사이트에 `categoryId` 인자(null) 추가로 해소.
설계 상세(토큰계획/카테고리 시각코딩/탭 마크업/AC 근거)는 [설계 문서](../../.atp/work-session/20260724-100414/artifacts/design-posts-categories.md) 참조.
## 검증 결과
| 레벨 | 결과 |
|---|---|
| L1 | 컨테이너 `mvn -o -P dev test` — 362/362 PASS (베이스라인 RED 복구 후 GREEN) |
| 정적 AC | 9/9 pass — hue 토큰 5개/화이트리스트 5개 동수, `:focus-visible`, `aria-current`, `prefers-reduced-motion`, 빈상태 2종 존재+include 2회, 뱃지 pill 배경 제거, `bibimbap.css` diff 0, `data-cat` 은 `catToken()` 반환값만 |
| 코드리뷰 AC | 2/2 pass — 편집 톤 교정(peer-forum 문구 잔존 0), 더보기 URL 조립·컨트롤러/매퍼 로직 무변경 |
| 실화면 | dev DB 시드 후 `/posts`: 탭 6개(서수 01~05=sort_order 순), 탭 클릭 필터(`?categoryId=N`→`is-active`+`aria-current`), 빈상태 편집톤, hue rule, focus-visible ring, JSP 런타임 컴파일 200 — 스크린샷 자가비평 완료 |
전체 검증 로그: [verification-posts-categories.md](../../.atp/work-session/20260724-100414/artifacts/verification-posts-categories.md).
## needs_user_verification
- 모바일 좁은 폭 픽셀 육안 확인(반응형 CSS 정적 검증만 완료, 브라우저 툴 resize 한계로 뷰포트 미반영).
- 라이트 테마 육안 확인(다크 테마만 스크린샷 확인, 라이트 hue 토큰은 코드상 대비 규율 준수).
- 카드 뱃지 dot 실물 확인(현재 게시글 0건이라 카드 미표시 — 글 1건 발행 후 확인 필요).
- 운영 스키마에 `db/migrations/20260724-post-categories-seed.sql` 반영(운영자 수행, dev DB 에만 적용됨).
## open item
graph-refresh 판정 `partial-stale`. 근본 원인은 선행 커밋 `02a1b75`(PostController) 로 이 세션 이전부터 존재하던 graph 부채이며, 이번 세션 변경은 JSP/JSPF([graphify 스캔 범위 밖 — 알려진 한계](../graph/index.md))와 DML 시드뿐이라 graph 노드 추가가 없다. 무관한 선행 부채의 full 재생성은 이 세션 스코프 밖으로 두고 이월한다.
## 제약 준수
JSP `HtmlUtils.htmlEscape` 유지, MyBatis `#{}` 바인딩 불변(동적 `${}` 미사용), 정적 CSS 는 `posts-list.jsp` 인라인에 한정(`bibimbap.css` 0변경), 클라이언트 렌더링 `textContent` 원칙(신규 JS 0줄).
## 관련 문서
- [../../.atp/work-session/20260623-104307/implementation/W3-3-posting-board-design.md](../../.atp/work-session/20260623-104307/implementation/W3-3-posting-board-design.md) — 포스트 보드 원 설계(W3-3)
- [2026-06-30-visual-redesign-bibimbap-css.md](./2026-06-30-visual-redesign-bibimbap-css.md) — 단위2(빈 상태 fragment `posts-empty.jspf`) 가 이번 세션에서 2종으로 분리·대체됨
- [../development/frontend-redesign-coverage-checklist.md](../development/frontend-redesign-coverage-checklist.md) — `posts-list.jsp` 행 갱신
- [../development/document-category-classification.md](../development/document-category-classification.md)

View File

@ -0,0 +1,25 @@
---
kind: changes
title: 업로드 빌드별 WebGL 플레이 화면
owner: bibimbap
stability: stable
last_reviewed: 2026-10-14
---
# 업로드 빌드별 WebGL 플레이 화면
기존 상세 실행 영역은 16:9와 최대 높이 520px로 고정되어 세로 게임을 좁은 가로 영역에 넣었다. 이제 업로드한 빌드마다 선언된 기준 폭·높이를 감지·저장하고, 상세 플레이어가 가용 폭·높이 양쪽에 비율을 유지하여 맞춘다. 특정 예시 게임에 따른 크기 상수는 없다.
등록·수정에 자동/직접 지정 크기 설정이 추가되었다. 미확인 빌드는 자동 등록을 계속 허용하며 16:9 fallback을 사용한다. 기존 null 메타 게임은 파일에서 읽기 전용 감지하고 수정 시 교정할 수 있다. 크게 보기와 전체화면은 기존 iframe을 유지해 게임 재시작을 피한다. 전체화면 실패는 크게 보기로 전환한다. Unity 내부 레이아웃 재배치는 빌드 개발자의 영역이다.
추가 DB 마이그레이션은 `20261014-game-display-metadata.sql`이다. 배포 전 nullable 세 컬럼과 CHECK를 적용한다. 기존 행 백필·원본 ZIP/HTML 수정·앱 자동 DDL은 없다. 정적 감지는 안전한 선언 신호만 사용하며 JS style 대입은 지원하지 않는다. 전체 계약은 [화면 메타](../contracts/webgl-display-metadata.md), 운영 절차는 [등록·실행 가이드](../usage/webgl-display.md)에 있다.
2026-10-14 격리 검증에서 Java 21을 명시한 `bash scripts/verify-webgl-display.sh all`은 성공했다. Java 377건은 실패·오류 0, 일반 실행에서 opt-in L2 1건 skip이었다. Node 11/11과 WAR package가 통과했고, disposable PostgreSQL에서 별도로 활성화한 실제 MyBatis L2는 1/1 통과하여 생략하지 않았다. 등록·상세·수정 JSP 경로 5개가 인증 후 HTTP 200이었다.
실제 390×844 ZIP과 별도 이름의 1280×720·800×800 빌드에 대해 320×844, 1440×900, 844×390, 640×300 viewport 12/12가 stage 경계와 1px 이내 비율 조건을 통과했다. 실제 Unity instance는 준비 상태였으며 CSS client 크기와 drawing buffer를 구분해 기록했다(데스크톱 일반 291×630/582×1260, 전체화면 388×840/776×1680, 모바일 emulation 273×591/273×591). Resize·크게 보기·전체화면/복귀·API 거절 fallback 동안 같은 iframe DOM/src와 Unity instance를 유지하고 추가 load는 0이었다. 원본 ZIP 및 저장·HTTP 제공 entry HTML의 SHA-256은 변하지 않았다. 브라우저 console error와 앱 stacktrace는 없었다.
최종 정적 UI detect에서 기존 소개 패널 accent border와 숨겨진 thumbnail preview만 지적되었다. 후자는 src를 먼저 설정한 뒤 표시하므로 broken-image 오탐이다. 변경된 플레이어·크기 설정에서 확인된 새 UI 결함은 없었다. 실제 HEAD 이전 JSP를 임시 복사본에 대입한 동일 SSR regression은 실패(exit 1), 현재 JSP는 통과(exit 0)했다. 이는 markup 회귀 증거이며 이전 브라우저 geometry 실행 증거는 아니다.
보완 검증에서는 CDP touch 이벤트의 pointerType=touch, isTrusted=true와 실제 Unity 메뉴 전환을 함께 확인했다. 세로 일반 화면의 Shop, 가로 확대·resize 후 Open Upgrades가 입력 좌표에 맞게 전환되었고 같은 iframe/Unity 상태를 유지했다. 실제 물리 터치 기기의 스모크는 별도 사용자 확인 항목이다. [보완 검증 보고서](../../.atp/work-session/20261014-091658/supplemental-verification.md), [최초 검증 보고서](../../.atp/work-session/20261014-091658/verification.md), [최종 문서·UI 감사](../../.atp/work-session/20261014-091658/artifacts/final-doc-ui-audit.md)에 근거와 한계를 남겼다. 재현 절차는 [등록·실행 가이드](../usage/webgl-display.md)에 있다. 공유·운영 DB 적용과 배포는 검증 harness에 포함하지 않는다.
후속 로컬 확인에서 개발 DB `dev`에 마이그레이션을 적용하고 앱을 재시작한 뒤 게임 9/10/11을 등록했다. 스크린샷 15장과 사용자 “괜찮은거 같네” 의견을 포함한 현재 상태는 [상세 작업 기록](../work-log/2026-10-14-webgl-display-session.md)에 정리했다. 운영 환경 배포와는 별개다.

View File

@ -4,6 +4,8 @@
## 목록 ## 목록
- [2026-10-14-webgl-display.md](./2026-10-14-webgl-display.md) — 업로드 빌드별 크기 감지·영속화, 자동/직접 지정, 비율 유지와 확대/전체화면. 검증 명령·범위와 배포 전 nullable DDL 절차 등록.
- [2026-06-18-w3-2-comments-reviews.md](./2026-06-18-w3-2-comments-reviews.md) — W3-2 댓글/리뷰 분리 구현. game_comments 서버 영속화 전환 + game_reviews 도메인 신설. 신규 API 9개(댓글 C1~C4, 리뷰 R1~R5), DDL 2종, 권한(작성자/운영자), cascade 확장. L1 31테스트 PASS. L3 스모크·DDL 적용은 needs_user_verification. 좋아요는 범위밖. - [2026-06-18-w3-2-comments-reviews.md](./2026-06-18-w3-2-comments-reviews.md) — W3-2 댓글/리뷰 분리 구현. game_comments 서버 영속화 전환 + game_reviews 도메인 신설. 신규 API 9개(댓글 C1~C4, 리뷰 R1~R5), DDL 2종, 권한(작성자/운영자), cascade 확장. L1 31테스트 PASS. L3 스모크·DDL 적용은 needs_user_verification. 좋아요는 범위밖.
- [2026-06-22-w3-2-comments-reviews-enhancement.md](./2026-06-22-w3-2-comments-reviews-enhancement.md) — W3-2 고도화(코어 위에 얹음). 다축 평점(game_review_axes 6축·육각형 SVG 레이더) + A1~A3 일관성(commentView 통일·작성자 마스킹 QG-2 해결·edited/updatedAt) + B1~B3 목록규모(페이지네이션·본문10자·TextNormalizer) + C1~C6 UX + game_review_stats 집계뷰(C3 재분류 — W2-3 동결 무관 확정). 신규 4파일+변경 13. L1 43/43 GREEN. DDL·L3 스모크 needs_user_verification. - [2026-06-22-w3-2-comments-reviews-enhancement.md](./2026-06-22-w3-2-comments-reviews-enhancement.md) — W3-2 고도화(코어 위에 얹음). 다축 평점(game_review_axes 6축·육각형 SVG 레이더) + A1~A3 일관성(commentView 통일·작성자 마스킹 QG-2 해결·edited/updatedAt) + B1~B3 목록규모(페이지네이션·본문10자·TextNormalizer) + C1~C6 UX + game_review_stats 집계뷰(C3 재분류 — W2-3 동결 무관 확정). 신규 4파일+변경 13. L1 43/43 GREEN. DDL·L3 스모크 needs_user_verification.
- [2026-06-29-w3-w4-features.md](./2026-06-29-w3-w4-features.md) — W3(잔여)+W4 5기능 구현(W3-1·W3-4·W3-3·W3-5·W4) + 후속(20260629-142115) 배지 표시 배선 완료·보안 하드닝 b1/b2. 태그+검색·메인허브·포스팅보드·업로드보안·배지/평판 구현(5 커밋 35f1dc3~305cc73, 최종 L1 347/347 GREEN). 후속: 게임카드 creator 배지 칩·프로필 myBadges 배선(3d10449, L1 352/352) + SsrfSafeFetcher @PostConstruct DNS ttl=30(b1 best-effort) + 업로드 저장루트 static 밖 이전(b2, 9041bb7, L1 353/353). DB DDL 8종 사용자 직접 적용 완료. L3 스모크 및 b2 자산 수동 이전은 배포 후 과제 이월 — 상세: [maintenance/post-deploy-verification-checklist.md](../maintenance/post-deploy-verification-checklist.md). - [2026-06-29-w3-w4-features.md](./2026-06-29-w3-w4-features.md) — W3(잔여)+W4 5기능 구현(W3-1·W3-4·W3-3·W3-5·W4) + 후속(20260629-142115) 배지 표시 배선 완료·보안 하드닝 b1/b2. 태그+검색·메인허브·포스팅보드·업로드보안·배지/평판 구현(5 커밋 35f1dc3~305cc73, 최종 L1 347/347 GREEN). 후속: 게임카드 creator 배지 칩·프로필 myBadges 배선(3d10449, L1 352/352) + SsrfSafeFetcher @PostConstruct DNS ttl=30(b1 best-effort) + 업로드 저장루트 static 밖 이전(b2, 9041bb7, L1 353/353). DB DDL 8종 사용자 직접 적용 완료. L3 스모크 및 b2 자산 수동 이전은 배포 후 과제 이월 — 상세: [maintenance/post-deploy-verification-checklist.md](../maintenance/post-deploy-verification-checklist.md).
@ -15,3 +17,4 @@
- [2026-06-30-visual-redesign-bibimbap-css.md](./2026-06-30-visual-redesign-bibimbap-css.md) — 클로드 디자인 리디자인 비주얼 레이어 9단위 반영. bibimbap.css 신설 + theme-init 공통 link + 빈상태 fragment 2종 + 홈/인증/약관/프로필/에러/모집 마크업·클래스 이식. game-detail no-op. 커밋 8개, L2 스모크 전 페이지 200(errer JSTL taglib 결함 포착·수정). 인터랙티브 제출·다크모드는 needs_user_verification. - [2026-06-30-visual-redesign-bibimbap-css.md](./2026-06-30-visual-redesign-bibimbap-css.md) — 클로드 디자인 리디자인 비주얼 레이어 9단위 반영. bibimbap.css 신설 + theme-init 공통 link + 빈상태 fragment 2종 + 홈/인증/약관/프로필/에러/모집 마크업·클래스 이식. game-detail no-op. 커밋 8개, L2 스모크 전 페이지 200(errer JSTL taglib 결함 포착·수정). 인터랙티브 제출·다크모드는 needs_user_verification.
- [2026-06-30-ui-multiaxis-ratio-visibility-fix.md](./2026-06-30-ui-multiaxis-ratio-visibility-fix.md) — 리디자인 미해결 시각 결함 2건(이미지#2 게임 카드 "비율" / 이미지#3 모집 빈상태 "가시성") 수정. "비율"을 카드 종횡비 단일 축으로 조기 협소화 → 사용자가 검색바 정렬(레이아웃 비율) 축 직접 교정 → multi-axis 멀티에이전트 평가(관찰1→레이아웃비율·카드종횡비·대비가시성·타이포간격 4축 병렬→종합1, 6 에이전트)로 13건 결함+카드 종횡비 결정 복원. 사용자 결정: 카드 4:3 + 전체 13건(index.jsp search-stack·card 4:3·object-position / bibimbap.css btn-ghost 대비·다크 보더·정렬칩·empty padding / recruit-list.jsp 히어로폭·eyebrow·빈상태 CTA 강등). L1 정적 + L2 런타임 스모크 라이트/다크 양화면 PASS. 커밋 9489365·c688aa6. 교훈: [verification-strategies.md](../development/verification-strategies.md) "모호한 시각 결함 어휘는 단일 결정축 협소화 전 다축 스캔 선행". 로그인 상태 스모크·실게임 가로 썸네일 4:3 크롭은 needs_user_verification. - [2026-06-30-ui-multiaxis-ratio-visibility-fix.md](./2026-06-30-ui-multiaxis-ratio-visibility-fix.md) — 리디자인 미해결 시각 결함 2건(이미지#2 게임 카드 "비율" / 이미지#3 모집 빈상태 "가시성") 수정. "비율"을 카드 종횡비 단일 축으로 조기 협소화 → 사용자가 검색바 정렬(레이아웃 비율) 축 직접 교정 → multi-axis 멀티에이전트 평가(관찰1→레이아웃비율·카드종횡비·대비가시성·타이포간격 4축 병렬→종합1, 6 에이전트)로 13건 결함+카드 종횡비 결정 복원. 사용자 결정: 카드 4:3 + 전체 13건(index.jsp search-stack·card 4:3·object-position / bibimbap.css btn-ghost 대비·다크 보더·정렬칩·empty padding / recruit-list.jsp 히어로폭·eyebrow·빈상태 CTA 강등). L1 정적 + L2 런타임 스모크 라이트/다크 양화면 PASS. 커밋 9489365·c688aa6. 교훈: [verification-strategies.md](../development/verification-strategies.md) "모호한 시각 결함 어휘는 단일 결정축 협소화 전 다축 스캔 선행". 로그인 상태 스모크·실게임 가로 썸네일 4:3 크롭은 needs_user_verification.
- [2026-07-01-game-register-redesign-parity.md](./2026-07-01-game-register-redesign-parity.md) — `/game/new`(game-register.jsp)가 9단위 리디자인 목록에서 빠졌던 것을 사용자 지적으로 발견·보강. 실사용 스샷 대조 결과 레이아웃/토큰은 이미 sibling과 일치 — 필수(*) 표시 2건 + 미리보기 eyebrow 라벨만 `recruit-form.jsp` 패턴 재사용으로 추가(단일 JSP, 로직 무변경). 로컬 CSS 토큰 전지역 통합은 별도 과제로 이월. 재발방지로 `frontend-redesign-coverage-checklist.md` 신설 + workflow-patterns 등재. L1 362/362 PASS, L2 로그인 후 라이트/다크 육안 확인. - [2026-07-01-game-register-redesign-parity.md](./2026-07-01-game-register-redesign-parity.md) — `/game/new`(game-register.jsp)가 9단위 리디자인 목록에서 빠졌던 것을 사용자 지적으로 발견·보강. 실사용 스샷 대조 결과 레이아웃/토큰은 이미 sibling과 일치 — 필수(*) 표시 2건 + 미리보기 eyebrow 라벨만 `recruit-form.jsp` 패턴 재사용으로 추가(단일 JSP, 로직 무변경). 로컬 CSS 토큰 전지역 통합은 별도 과제로 이월. 재발방지로 `frontend-redesign-coverage-checklist.md` 신설 + workflow-patterns 등재. L1 362/362 PASS, L2 로그인 후 라이트/다크 육안 확인.
- [2026-07-24-post-categories-seed-list-redesign.md](./2026-07-24-post-categories-seed-list-redesign.md) — 포스트 보드(W3-3) "카테고리별 보기" 골격 기구현 대비 유일 갭이던 `post_categories` 시드 0건 해소 + 목록 뷰 표현층 재설계. Unity 5-mirror 편집 taxonomy(공지/개발일지/쇼케이스/자료·튜토리얼/업계 소식) 멱등 시드(`db/migrations/`, dev 적용 완료·운영 반영 needs_user_verification) + `posts-list.jsp` 탭을 서수·hue rule·staggered reveal의 "편집 마스트헤드 인덱스"로 재설계(focus-visible/aria-current 결손 보강, slug XSS 화이트리스트) + 뱃지 pill 제거(hue dot로 축소) + 빈상태 2종 분리(카테고리 0개/글 0개, 편집 톤). 기능 로직·`bibimbap.css` 불변. 세션 도중 "포스트 보드는 peer-to-peer 아닌 편집형 일방 발행" 사용자 정정으로 카테고리 축을 상호작용축에서 편집 taxonomy 로 재설계. L1 362/362 GREEN(베이스라인 컴파일 RED 복구 포함), 정적 AC 9/9 + 코드리뷰 AC 2/2 PASS, 실화면 확인. 모바일/라이트테마 육안·운영 시드 반영은 needs_user_verification.

View File

@ -4,4 +4,4 @@
## 목록 ## 목록
_(아직 문서 없음)_ - [webgl-display-metadata.md](./webgl-display-metadata.md) — 게임별 빌드 크기 감지·저장·API·플레이어 fallback 계약.

View File

@ -0,0 +1,47 @@
---
kind: contracts
title: 게임별 WebGL 화면 크기 계약
owner: bibimbap
stability: living
last_reviewed: 2026-10-14
---
# 게임별 WebGL 화면 크기
게임의 기준 폭·높이를 등록 정보에 저장하고 플레이어 iframe을 같은 비율로 가용 폭·높이 안에 표시한다. 게임명·ZIP 파일명에 따른 특별 처리는 없다. 이 값은 빌드에 선언된 화면 크기이며 Unity 내부 UI 재배치를 보장하지 않는다.
## 감지와 검증
작성자의 직접 지정이 우선한다. 자동 감지는 선택된 `index.html`과 같은 디렉터리의 `build-info.json` top-level `width`/`height` → 명확한 canvas 또는 그 조상 `#unity-container`의 정수 pixel CSS → canvas의 명시 `width`/`height` 속성 순이다.
Canvas는 `#unity-canvas`가 하나이면 선택하고, 해당 ID가 없으면 canvas가 정확히 하나인 경우 선택한다. CSS는 inline 또는 `style` 블록의 정확한 단일 ID selector만 지원한다. `@` 규칙이 포함된 style 블록, 상대 단위·동적 표현식·외부 CSS·JavaScript style 대입은 감지하지 않는다. JS 실행이나 외부 요청은 하지 않는다. CSS cascade 전체를 계산하는 브라우저가 아니므로 감지된 선언값이 실제 게임과 다르면 직접 지정한다.
폭·높이는 둘 다 정수 1~16384, 비율은 1:32~32:1이다. 숫자 문자열도 허용하되 분수·부호·공백은 허용하지 않는다. 자동 감지의 300×150은 브라우저 기본값으로 취급해 제외하며 직접 지정은 허용한다. HTML 읽기 상한은 1MiB, JSON은 64KiB다. 손상된 선택 메타는 다음 신호로 넘어가고, 알 수 없는 크기는 정상 업로드를 유지한다. 저장 경로는 업로드 저장루트 내부의 regular file만 분석한다.
```json
{"width": 1280, "height": 720}
```
메타 파일은 진입점 옆에 선택적으로 넣는다. 하위 또는 다른 빌드의 파일을 재귀 탐색해서 섞지 않는다.
## API와 저장
| 경계 | 필드 / 동작 |
| --- | --- |
| `POST /api/game-files/webgl-zip` | 기존 응답에 `displayWidth`, `displayHeight`, `displaySource` 추가. 크기 미확인은 null/null/unknown이며 HTTP 200 |
| `POST /game/new`, `POST /game/{id}/edit` | 선택 필드 `displayMode=auto\|custom`, `displayWidth`, `displayHeight` |
| 자동 저장 | 클라이언트 크기 값을 신뢰하지 않고 서버 저장 진입점을 재감지 |
| 직접 지정 저장 | 두 숫자 검증 후 source=manual. 불완전 pair/범위 밖/알 수 없는 mode는 HTTP 400 |
| 구 클라이언트 등록 | mode 누락은 auto |
| 구 클라이언트 수정 | mode 누락과 같은 경로는 기존 메타 유지, 경로 교체는 재감지 |
| 상세 / 수정 읽기 | 유효 저장값 우선, 기존 null 값은 파일에서 읽기 전용 감지. 조회 중 DB 백필 없음 |
기존 인증·CSRF·소유권 검증이 크기 필드 검증보다 먼저 적용된다. Source enum은 `build-info`, `css`, `canvas`, `manual`, `unknown`이다. DB 컬럼은 nullable `games.display_width integer`, `display_height integer`, `display_source varchar(16)`이며 pair/범위/비율/source CHECK가 있다. Source는 legacy 호환을 위해 null도 허용한다. Ratio는 별도 저장하지 않는다. `GameData`를 반환하는 모든 7개 mapper 조회와 INSERT/UPDATE가 세 필드를 전달한다.
## 표시와 fallback
상세 SSR은 검증한 `webglDisplayWidth/Height`, source/known을 전달한다. 미확인 빌드는 16:9 화면으로 표시하며 작성자가 직접 교정할 수 있다. 특정 세로 게임 크기로 기존 행을 일괄 변경하지 않는다.
`scale = min(availableWidth / referenceWidth, availableHeight / referenceHeight)`로 iframe 두 축을 맞춘다. 일반 화면 높이 budget은 `min(70dvh, 720px)`이며 vh fallback이 있다. 여백은 중앙 정렬한다. 확대/전체화면은 safe area와 툴바를 뺀 stage의 실제 크기를 사용한다. ResizeObserver·window/visualViewport resize·fullscreenchange를 RAF로 묶어 반영한다. iframe DOM과 src를 유지하여 게임을 다시 로드하지 않는다. 별도 asset origin에서도 부모는 iframe 박스만 조정하며 canvas DOM 접근을 요구하지 않는다.
전체화면 API가 없거나 거절되면 크게 보기로 전환하고 안내한다. 닫기/Esc·스크롤·포커스 복귀를 지원한다. [사용 절차](../usage/webgl-display.md), [검증 등록](../development/verification-strategies.md)을 함께 참고한다.

View File

@ -20,7 +20,7 @@
| `game-detail.jsp` | no-op(토큰 일치 확인) | 위 문서 단위7 | | `game-detail.jsp` | no-op(토큰 일치 확인) | 위 문서 단위7 |
| `errer.jsp` | 완료 | 위 문서 단위8 | | `errer.jsp` | 완료 | 위 문서 단위8 |
| `recruit-form.jsp` | 완료 | 위 문서 단위9 + token-coherence-fix | | `recruit-form.jsp` | 완료 | 위 문서 단위9 + token-coherence-fix |
| `posts-list.jsp` | 완료 | 위 문서 단위2(빈상태 fragment) | | `posts-list.jsp` | 완료 | 위 문서 단위2(빈상태 fragment) + [2026-07-24-post-categories-seed-list-redesign.md](../changes/2026-07-24-post-categories-seed-list-redesign.md)(탭 인덱스 재설계·뱃지 pill 제거·빈상태 2종 분리) |
| `recruit-list.jsp` | 완료 | 위 문서 단위2(빈상태 fragment) + [2026-06-30-ui-multiaxis-ratio-visibility-fix.md](../changes/2026-06-30-ui-multiaxis-ratio-visibility-fix.md) | | `recruit-list.jsp` | 완료 | 위 문서 단위2(빈상태 fragment) + [2026-06-30-ui-multiaxis-ratio-visibility-fix.md](../changes/2026-06-30-ui-multiaxis-ratio-visibility-fix.md) |
| `game-register.jsp` | 완료 | **9단위 리스트에서 누락 확인 후 처리(20260701)** — `/game/new` 신규 게임 등록. 사용자 지적으로 발견. 로그인 후 실사용 스샷 대조 결과 카드/사이드미리보기 레이아웃·토큰은 이미 sibling(recruit-form 등)과 일치 — 차이 2건만 보강: 필수(*) 표시(게임 이름, WebGL zip — editMode 시 zip 비필수 반영) + 미리보기 패널 "미리보기" eyebrow 라벨. `recruit-form.jsp`의 `.rf-req`/`.rf-preview__label` 패턴 그대로 재사용, 로컬 CSS 변수 관례는 sibling과 동일하게 유지(전지역 통합은 [analysis/2026-06-30-frontend-component-review.md](../analysis/2026-06-30-frontend-component-review.md) P0 별도 과제). | | `game-register.jsp` | 완료 | **9단위 리스트에서 누락 확인 후 처리(20260701)** — `/game/new` 신규 게임 등록. 사용자 지적으로 발견. 로그인 후 실사용 스샷 대조 결과 카드/사이드미리보기 레이아웃·토큰은 이미 sibling(recruit-form 등)과 일치 — 차이 2건만 보강: 필수(*) 표시(게임 이름, WebGL zip — editMode 시 zip 비필수 반영) + 미리보기 패널 "미리보기" eyebrow 라벨. `recruit-form.jsp`의 `.rf-req`/`.rf-preview__label` 패턴 그대로 재사용, 로컬 CSS 변수 관례는 sibling과 동일하게 유지(전지역 통합은 [analysis/2026-06-30-frontend-component-review.md](../analysis/2026-06-30-frontend-component-review.md) P0 별도 과제). |
| `posts-detail.jsp` | 미착수 | — | | `posts-detail.jsp` | 미착수 | — |

View File

@ -31,6 +31,8 @@
**신규 컨트롤러/매퍼 의존 변경 시 full test 의무**: 신규 컨트롤러를 추가하거나 컨트롤러의 매퍼 의존을 늘리면 implementation 단계에서 `test-compile` 만으로 끝내지 말고 반드시 full `./mvnw -o test` 를 실행한다. `BibimbapApplicationTests` 는 MyBatis/DataSource autoconfigure 가 exclude 된 컨텍스트라 컨트롤러가 주입하는 매퍼마다 `@MockBean` 을 수동 등록해야 하며, 누락 시 `contextLoads` 가 `NoSuchBeanDefinitionException` 으로 실패한다. 이 회귀는 `test-compile` 로는 탐지되지 않는다(W3-2 세션 20260618 실증). **신규 컨트롤러/매퍼 의존 변경 시 full test 의무**: 신규 컨트롤러를 추가하거나 컨트롤러의 매퍼 의존을 늘리면 implementation 단계에서 `test-compile` 만으로 끝내지 말고 반드시 full `./mvnw -o test` 를 실행한다. `BibimbapApplicationTests` 는 MyBatis/DataSource autoconfigure 가 exclude 된 컨텍스트라 컨트롤러가 주입하는 매퍼마다 `@MockBean` 을 수동 등록해야 하며, 누락 시 `contextLoads` 가 `NoSuchBeanDefinitionException` 으로 실패한다. 이 회귀는 `test-compile` 로는 탐지되지 않는다(W3-2 세션 20260618 실증).
**기존 컨트롤러/서비스 시그니처 변경도 full test 의무 (위 조항의 스코프 확장)**: 위 조항은 문구상 "신규" 컨트롤러에 초점이나, **기존** 컨트롤러/서비스의 public 메서드 시그니처를 바꾸는 커밋(파라미터 추가·순서 변경 등)도 동일하게 같은 커밋에서 full `./mvnw -o test` 로 마감한다. 호출측 테스트가 구 시그니처로 남으면 `test-compile` 단계 BUILD FAILURE 로 저장소가 baseline RED 가 되고, 이후 무관 세션이 이를 떠안는다(rollback 판정·복구 비용 유발). 시그니처를 바꾼 커밋과 **같은 커밋**에 호출측 테스트를 갱신하는 것이 규칙이다(근거: 세션 20260724 — 선재 커밋 `02a1b75` 가 `PostController.list` 에 categoryId/HttpSession 을 추가하며 `PostControllerTest` 3개 콜사이트를 미갱신 → 무관한 카테고리 세션의 verification-advisor 가 baseline RED 를 발견·최소수정 복구).
**mock-vs-reality: DB-방언 계약은 L1 으로 못 잡는다**: 컨트롤러/애플리케이션 단위테스트가 MyBatis 매퍼를 `@MockBean` 으로 대체하면 "내가 부른 메서드가 불렸나"만 보고 "실제 Postgres 가 그 SQL 을 우리 기대대로 해석하나"는 검증하지 못한다. L1 통과율이 높을수록 DB-통합 계약 공백이 오히려 숨는다. W3-2 세션 20260622 에서 L1 43/43 GREEN 을 통과한 채 누출된 실버그 2종: **mock-vs-reality: DB-방언 계약은 L1 으로 못 잡는다**: 컨트롤러/애플리케이션 단위테스트가 MyBatis 매퍼를 `@MockBean` 으로 대체하면 "내가 부른 메서드가 불렸나"만 보고 "실제 Postgres 가 그 SQL 을 우리 기대대로 해석하나"는 검증하지 못한다. L1 통과율이 높을수록 DB-통합 계약 공백이 오히려 숨는다. W3-2 세션 20260622 에서 L1 43/43 GREEN 을 통과한 채 누출된 실버그 2종:
- **SQL alias 케이스 폴딩**: 따옴표 없는 `AS gameId` 는 Postgres 가 소문자(`gameid`)로 폴딩 → MyBatis `Map` 키가 소문자 → 컨트롤러의 camelCase `get("reviewCount")` 가 null → 집계 summary 전면 무력. camelCase 키가 필요하면 alias 를 **반드시 큰따옴표**(`AS "gameId"`)로 감싼다. - **SQL alias 케이스 폴딩**: 따옴표 없는 `AS gameId` 는 Postgres 가 소문자(`gameid`)로 폴딩 → MyBatis `Map` 키가 소문자 → 컨트롤러의 camelCase `get("reviewCount")` 가 null → 집계 summary 전면 무력. camelCase 키가 필요하면 alias 를 **반드시 큰따옴표**(`AS "gameId"`)로 감싼다.
- **집계 뷰 1:N LEFT JOIN fan-out**: 부모(리뷰)에 자식(축 평점) 직접 JOIN 시 `COUNT(*)`/`AVG` 가 자식 행수만큼 왜곡(자식 0행일 땐 잠복, 입력 순간 발현). 집계는 자식을 서브쿼리에서 선집계 후 LEFT JOIN 한다. - **집계 뷰 1:N LEFT JOIN fan-out**: 부모(리뷰)에 자식(축 평점) 직접 JOIN 시 `COUNT(*)`/`AVG` 가 자식 행수만큼 왜곡(자식 0행일 땐 잠복, 입력 순간 발현). 집계는 자식을 서브쿼리에서 선집계 후 LEFT JOIN 한다.
@ -109,6 +111,35 @@ strategies:
note: "L1 + L2 + 로그 스캔 통합. ATP task 세션 종료 전 의무." note: "L1 + L2 + 로그 스캔 통합. ATP task 세션 종료 전 의무."
``` ```
## WebGL 빌드별 화면 대응 (2026-10-14)
이 scope의 구체 명령은 아래 등록값을 사용한다. 상세 계약은 `docs/contracts/webgl-display-metadata.md`, 격리 런타임 절차는 `docs/usage/webgl-display.md`다. 코드 검증과 JSP 런타임 컴파일 검증을 구분한다.
```yaml
strategies:
- id: webgl-display-l1
cmd: bash scripts/verify-webgl-display.sh l1
scope: [src/main/java/com/pandoli365/bibimbap/util/WebglDisplayMetadata.java, src/main/java/com/pandoli365/bibimbap/controller/api/GameController.java, src/main/java/com/pandoli365/bibimbap/controller/api/GameUploadController.java, src/main/webapp/js/webgl-player.js, src/main/webapp/css/webgl-player.css, src/main/webapp/WEB-INF/views/game-detail.jsp, src/main/webapp/WEB-INF/views/game-register.jsp]
timeout_s: 600
failure_severity: blocker
note: Java full regression + Node contain/resize/state regression + WAR package. Runtime JSP compilation is separate.
- id: contract-webgl-display-postgres
cmd: bash scripts/verify-webgl-display.sh l2
scope: [db/schema.sql, db/migrations/20261014-game-display-metadata.sql, src/main/java/com/pandoli365/bibimbap/mapper/GamesMapper.java, src/main/java/com/pandoli365/bibimbap/data/GameData.java]
timeout_s: 240
failure_severity: blocker
preconditions: [Docker daemon available, local postgres:16 image, Java 21 and cached Maven dependencies]
note: Disposable loopback PostgreSQL only; legacy null row + rerun migration + CHECK rejection + fresh equivalence + actual mapper INSERT/UPDATE/all seven SELECT typed roundtrip. No shared DB mutation. Missing prerequisites must be reported explicitly; failed contract cannot be called skip.
- id: verify-webgl-display
cmd: bash scripts/verify-webgl-display.sh all
scope: webgl-display
timeout_s: 900
failure_severity: blocker
note: Integrated L1 + L2; temporary database removed by EXIT trap.
```
L3 필수 확인: 새 WAR를 기존 앱과 겹치지 않는 포트·disposable DB·임시 업로드 경로에서 기동하고, 인증 후 변경된 등록/상세/수정 JSP 모두 HTTP 200 및 JSP stacktrace 부재를 확인한다. 실제 제공 ZIP과 다른 비율 ZIP으로 등록→DB→상세→수정 roundtrip, viewport 320×844/1440×900/844×390/640×300의 양축 containment·1px 비율 오차, 확대/전체화면/resize 중 같은 iframe DOM/src/load 횟수·게임 상태 유지, CSS canvas 크기와 drawing buffer 크기, 클릭·터치 입력을 점검한다. 전체화면 거절 fallback·Esc·포커스·스크롤 복귀와 서버/브라우저 오류 스캔도 기록한다. 사용자 실제 기기 스모크가 남으면 환경·확인 항목을 별도로 명시한다.
## 필드 정의 ## 필드 정의
| 필드 | 의미 | | 필드 | 의미 |
@ -278,3 +309,9 @@ graphify(`/graphify src/ docs/`)는 `src/main/webapp/WEB-INF/views/*.jsp`, `src/
§299 는 `.jspf` 정적 include 의 `pageEncoding` 을 다루지만, **DefaultServlet 이 서빙하는 순수 `.html`** 도 동일 mojibake 함정이 있다. Tomcat 은 정적 `.html` 에 `Content-Type: text/html`(charset 없음)만 붙이므로, 파일에 `<meta charset="utf-8">` 가 없으면 브라우저가 Latin-1 로 추정해 UTF-8 한글이 깨진다. 앱 정적경로에 두는 프리뷰·정적 페이지는 `<head>` 에 `<meta charset="utf-8">` 를 반드시 포함한다. §299 는 `.jspf` 정적 include 의 `pageEncoding` 을 다루지만, **DefaultServlet 이 서빙하는 순수 `.html`** 도 동일 mojibake 함정이 있다. Tomcat 은 정적 `.html` 에 `Content-Type: text/html`(charset 없음)만 붙이므로, 파일에 `<meta charset="utf-8">` 가 없으면 브라우저가 Latin-1 로 추정해 UTF-8 한글이 깨진다. 앱 정적경로에 두는 프리뷰·정적 페이지는 `<head>` 에 `<meta charset="utf-8">` 를 반드시 포함한다.
> 근거: 세션 20260701-083240 — 카드 프리뷰 정적 html 을 `/css/` 서빙했으나 meta charset 누락으로 전체 한글 mojibake, 사용자 스샷으로 표면화 → meta 추가로 즉시 해소. 변경 상세: [changes/2026-06-30-ui-multiaxis-ratio-visibility-fix.md](../changes/2026-06-30-ui-multiaxis-ratio-visibility-fix.md). > 근거: 세션 20260701-083240 — 카드 프리뷰 정적 html 을 `/css/` 서빙했으나 meta charset 누락으로 전체 한글 mojibake, 사용자 스샷으로 표면화 → meta 추가로 즉시 해소. 변경 상세: [changes/2026-06-30-ui-multiaxis-ratio-visibility-fix.md](../changes/2026-06-30-ui-multiaxis-ratio-visibility-fix.md).
### WebGL 터치 좌표 검증
모바일 emulation에서 click만 실행하면 pointerType=mouse일 수 있으므로 터치 검증으로 집계하지 않는다. CDP touch 입력에서 pointerType=touch와 isTrusted=true를 확인하고, 비율 유지·확대·resize 후 이름이 있는 게임 버튼의 화면 전환까지 검증한다. 실제 기기 스모크는 자동 browser touch와 구분하여 기록한다.
> 근거: 20261014 WebGL 세션 보완 검증 — Shop/Open Upgrades 입력과 메뉴 전환 확인.

View File

@ -74,3 +74,9 @@ CSS 위계·여백·색 같은 시각 변경은 before→after **텍스트 표**
`needs_user_verification` 으로 브라우저 육안 확인을 이월할 때, 변경 대상이 최근 세션에서 docs 화된 렌더링 함정과 같은 경로(JSP/정적 asset)를 공유하면 그 문서를 명시적으로 인용한다. 단순히 "브라우저에서 육안 확인" 이라고만 적으면, 다음 세션/사용자가 이미 알려진 함정(예: JSP stale 렌더링 — `local-dev-setup.md` §JSP/정적)을 다시 밟고도 브라우저 화면만 보고 오탐(false pass) 할 수 있다. 작성 규칙: 최근 work-session 3~5개 이내 docs 반영된 구조적 함정 중 렌더 경로가 겹치는 것이 있으면 `needs_user_verification` 항목에 "known pitfall: `<문서 링크>` — curl 로 서빙값 대조 선행 권고" 를 병기한다. `needs_user_verification` 으로 브라우저 육안 확인을 이월할 때, 변경 대상이 최근 세션에서 docs 화된 렌더링 함정과 같은 경로(JSP/정적 asset)를 공유하면 그 문서를 명시적으로 인용한다. 단순히 "브라우저에서 육안 확인" 이라고만 적으면, 다음 세션/사용자가 이미 알려진 함정(예: JSP stale 렌더링 — `local-dev-setup.md` §JSP/정적)을 다시 밟고도 브라우저 화면만 보고 오탐(false pass) 할 수 있다. 작성 규칙: 최근 work-session 3~5개 이내 docs 반영된 구조적 함정 중 렌더 경로가 겹치는 것이 있으면 `needs_user_verification` 항목에 "known pitfall: `<문서 링크>` — curl 로 서빙값 대조 선행 권고" 를 병기한다.
> 근거: 세션 20260701-100731 — game-detail.jsp 레이더 차트 데이터(6축 axis) 백필 세션. 직전 세션(20260701-093754, 4분 전 종료)이 방금 "JSP 저장 즉시반영 실패 → 브라우저가 stale 렌더링을 정상으로 오판" 함정을 `local-dev-setup.md` 에 반영했음에도, 같은 렌더 경로(JSP)를 다루는 후속 세션의 `needs_user_verification` 이 이를 인용하지 않아 재발 위험을 남김(retrospective-advisor 포착). > 근거: 세션 20260701-100731 — game-detail.jsp 레이더 차트 데이터(6축 axis) 백필 세션. 직전 세션(20260701-093754, 4분 전 종료)이 방금 "JSP 저장 즉시반영 실패 → 브라우저가 stale 렌더링을 정상으로 오판" 함정을 `local-dev-setup.md` 에 반영했음에도, 같은 렌더 경로(JSP)를 다루는 후속 세션의 `needs_user_verification` 이 이를 인용하지 않아 재발 위험을 남김(retrospective-advisor 포착).
## 도메인/상호작용 모델은 UI taxonomy 가정 전에 근거 문서·enum 으로 접지
기능의 상호작용 모델(예: 게시판이 제작자 peer-to-peer 포럼인가 편집형 일방 발행인가)이 UI 구조(카테고리 축·CTA 노출·인터페이스 톤)를 좌우할 때, orchestrator 는 **가정하지 말고** 착수 시 (a) 관련 permission enum(`PermissionKeys.java` — 예: `POST_WRITE` 게이트 존재 = 발행 권한자 한정 = 일방 발행 신호), (b) `docs/work-log/` 의 해당 기능 골자 문서를 먼저 확인한다. 모델을 잘못 가정하면 요구분해·설계 초반이 어긋나 사용자 정정 왕복(AskUserQuestion 다회)이 발생한다. §5.0 계획 가시성 이전에 "모델 접지" 를 둔다.
> 근거: 세션 20260724 — 포스트 보드를 peer-to-peer 커뮤니티로 가정해 카테고리 축에 '피드백요청/자유'(상호작용축)를 배치했으나, 사용자 정정으로 '편집형 일방 발행'(Unity 블로그 모델)로 뒤집혀 편집 taxonomy 로 재설계(AskUserQuestion 3회 왕복). 그러나 `POST_WRITE` 게이트와 `docs/work-log/2026-06-17-w3-feature-skeletons.md`('포스터 권한자만 작성, 일반 유저 읽기만(댓글 없음)')에 이미 일방 발행 모델이 W3-3 설계 시점(2026-06-23)에 명문화돼 있어 docs-first 로 조기 포착 가능했다(documentation-advisor 도 "새 결정이 아니라 orchestrator 가정 오류의 재확인" 으로 판정).

View File

@ -1,7 +1,7 @@
--- ---
kind: graphify-meta kind: graphify-meta
last_generated_at: 2026-07-01T14:35:00+0900 last_generated_at: 2026-07-24T09:43:00+0900
source_commit: 86b0528 source_commit: 6154826
scopes: scopes:
- full - full
--- ---
@ -39,7 +39,13 @@ scope 예시: `full`, `src`, `docs`, `src-features` 등.
| scope | 마지막 생성 | 소스 커밋 | 대상 경로 | 요약 | | scope | 마지막 생성 | 소스 커밋 | 대상 경로 | 요약 |
| --- | --- | --- | --- | --- | | --- | --- | --- | --- | --- |
| `full` | 2026-07-01 | `86b0528` | `src/` + `docs/` | **incremental update** — 18커밋분 변경(11 파일: db/seed-dev.sql + docs 10건) 재추출 후 `build_merge` 병합 시 고스트 중복 486 exact + 251 fuzzy 추가 제거(2089→1477 노드, 4503 엣지, 76 커뮤니티). game-register.jsp 리디자인 보강·frontend-redesign-coverage-checklist·workflow-patterns 신규 노드 반영. JSP/CSS 정적자산은 여전히 스캔 범위 외. | | `full` | 2026-07-24 | `6154826` | `src/` + `docs/` | **incremental update** — 3커밋분 변경(4 파일: PostController.java + docs 3건) 재추출 후 `build_merge` 병합 시 고스트 중복 20 exact + 11 fuzzy 추가 제거(1477→1507 노드, 4570 엣지, 76 커뮤니티 — 커뮤니티 수 불변이라 기존 라벨 재사용). `posts-list.jsp`/`posts-empty.jspf` 는 canWrite 권한 조건부 렌더 추가했으나 JSP 확장자가 여전히 스캔 범위 밖이라 그래프 미반영. |
## 알려진 한계 (영속 — Scopes 표와 달리 재생성해도 덮어쓰지 않음)
- **JSP/JSPF 는 graphify 스캔 범위 밖.** `/graphify` 의 code 확장자 판정 목록(`.py .ts .js .go .rs .java .cpp ...`)에 `.jsp`/`.jspf` 가 없어 AST 추출 대상이 아니고, semantic(LLM) 청크로도 code 파일 취급되지 않는다. `src/main/webapp/WEB-INF/views/**` 의 뷰 로직 변경(조건부 렌더, `<%@ include %>` 관계 등)은 구조적으로 그래프에 반영되지 않는다.
- 재확인 세션: `20260701-083240`, `20260724-092601`(PostController.list() ↔ posts-list.jsp/posts-empty.jspf 의 `canWrite` 바인딩 — 컨트롤러측만 반영, 뷰측 미반영).
- **적용**: 컨트롤러↔JSP 매핑, 뷰 조건부 렌더 등은 graphify query 로 찾지 말고 `grep`/`Read` 로 직접 확인한다. `graph-refresh-checker` 는 변경분이 JSP/JSPF 뿐이면 incremental 재추출을 시도하지 않고 "그래프 미반영(알려진 한계)"로 즉시 판정해도 된다(no-scope-change 취급).
## 갱신 시 체크리스트 ## 갱신 시 체크리스트

View File

@ -24,6 +24,8 @@
### 온라인 모드 (NVD 데이터 갱신 포함) ### 온라인 모드 (NVD 데이터 갱신 포함)
**2026-09-22 정정:** 아래 명령만으로는 이 프로젝트의 `<autoUpdate>false</autoUpdate>` 설정이 해제되지 않는다. 검증용 POM/명시적 Maven 프로필에서 `autoUpdate=true`를 적용하고, 실제 로그의 갱신 완료 및 데이터 시각을 확인해야 온라인 갱신으로 판정할 수 있다. 갱신 실패나 캐시 fallback을 출시 검증 PASS로 취급하지 않는다. 실행형 WAR에서는 `WEB-INF/lib-provided`도 로딩되므로 검증 구성에서 `skipProvidedScope=false`로 포함하고 실제 WAR 목록과 대조한다.
```bash ```bash
mvn dependency-check:check mvn dependency-check:check
``` ```
@ -39,7 +41,7 @@ mvn dependency-check:check
``` ```
캐시 위치: `~/.m2/repository/org/owasp/dependency-check-data/` (기본값). 캐시 위치: `~/.m2/repository/org/owasp/dependency-check-data/` (기본값).
캐시가 없으면 온라인 다운로드가 강제된다. `autoUpdate=false`에서 캐시가 없거나 불완전하면 검사가 실패할 수 있다. 자동 다운로드나 최신성 보장을 가정하지 않는다.
캐시를 명시적으로 지정하려면: 캐시를 명시적으로 지정하려면:

View File

@ -13,6 +13,8 @@ last_reviewed: 2026-05-07
## 목록 ## 목록
- [webgl-display.md](./webgl-display.md) — WebGL 게임별 화면 크기 등록·직접 지정·확대/전체화면과 격리 검증·배포 순서.
- [local-setup.md](./local-setup.md) — 로컬 개발환경 온보딩 (경로 A Docker / 경로 B 직접 실행, DB 스키마 초기화, 트러블슈팅) — 전 과정 실행 검증됨 - [local-setup.md](./local-setup.md) — 로컬 개발환경 온보딩 (경로 A Docker / 경로 B 직접 실행, DB 스키마 초기화, 트러블슈팅) — 전 과정 실행 검증됨
- [setup-checklist.md](./setup-checklist.md) — 이식 후 30분 내 완료 설정 체크리스트 (복사 제외 재확인 → CLAUDE.md 병합 → 검증 명령 교체 → 카테고리 조정 → graphify 도입 여부) - [setup-checklist.md](./setup-checklist.md) — 이식 후 30분 내 완료 설정 체크리스트 (복사 제외 재확인 → CLAUDE.md 병합 → 검증 명령 교체 → 카테고리 조정 → graphify 도입 여부)
- [faq.md](./faq.md) — 문제 해결 / FAQ + 이식자 실수 카탈로그 (M1~M8) - [faq.md](./faq.md) — 문제 해결 / FAQ + 이식자 실수 카탈로그 (M1~M8)

View File

@ -0,0 +1,66 @@
---
kind: usage
title: WebGL 게임 화면 크기 등록과 실행
owner: bibimbap
stability: living
last_reviewed: 2026-10-14
---
# WebGL 화면 크기 등록과 실행
게임 등록·수정의 “화면 크기”에서 기본 선택인 “빌드에 맞추기”를 사용한다. ZIP 업로드 후 확인한 폭·높이를 안내한다. 세로·가로·정사각형 게임마다 자기 비율로 플레이 영역에 맞춰 표시된다.
크기를 확인하지 못하거나 실제 게임 화면과 다른 경우 “직접 지정”에서 게임이 기준으로 삼는 폭·높이를 입력한다. 두 값은 1~16384 정수이며 비율은 1:32~32:1이다. 미확인 상태로 자동 등록하면 기본 가로 화면(16:9)을 사용한다. 기존 게임도 수정 화면에서 다시 자동 저장하거나 직접 지정할 수 있다. 직접 지정 중 새 ZIP을 선택해도 입력한 값은 유지되므로 새 게임의 크기와 일치하는지 확인한다.
상세 화면의 “크게 보기”는 게임을 유지하면서 넓은 영역을 제공한다. “전체화면”을 사용할 수 없는 브라우저는 크게 보기로 전환한다. 닫기/Esc로 돌아오며 창 크기·화면 방향이 바뀌어도 게임의 비율을 유지한다. Unity 게임 자체가 브라우저 크기 변경을 처리하지 않는다면 내부 Canvas Scaler·앵커·카메라 설정을 개발자가 고쳐 다시 빌드해야 한다.
템플릿에 의도 크기가 없으면 진입 `index.html`과 같은 폴더에 선택적인 `build-info.json`을 넣을 수 있다. 예: `{"width":800,"height":800}`. 임의 JS로 계산한 크기를 서버가 실행하여 추론하지는 않는다. 전체 [메타 계약](../contracts/webgl-display-metadata.md)을 참고한다.
## 배포 순서
1. 대상 스키마를 지정하여 `db/migrations/20261014-game-display-metadata.sql`을 먼저 적용한다. 운영·공유 DB 변경은 해당 환경의 승인 절차를 따른다.
2. 새 WAR를 배포한다. 앱 시작 시 자동 DDL은 없다.
3. 기존 게임과 새 게임을 상세·등록·수정 화면에서 확인한다.
마이그레이션은 nullable 컬럼을 추가하고 기존 행을 백필하지 않으며 재실행 가능하다. `db/schema.sql`의 신규 DB 정의도 동일하다. 앱을 이전 버전으로 되돌릴 때 이 컬럼은 남겨도 된다. 컬럼 DROP은 별도 변경으로 다룬다. 다음 명령은 **대상 DB를 운영자가 명확히 지정한 뒤** 실행한다.
```bash
PGOPTIONS='-c search_path=dev' psql -X -v ON_ERROR_STOP=1 \
-f db/migrations/20261014-game-display-metadata.sql
```
## 자동 검증
Java 21, Node, 캐시된 Maven 의존성, Docker와 로컬 `postgres:16` 이미지가 필요하다. Maven offline cache가 없으면 의존성을 준비한 후 실행한다. 스크립트는 기존 DB/앱/볼륨을 사용하지 않고 임시 PostgreSQL을 loopback 임의 포트에 띄우며 종료 시 제거한다. 이미지를 자동 pull하지 않는다.
```bash
bash scripts/verify-webgl-display.sh all
# 개별 실행
bash scripts/verify-webgl-display.sh l1
bash scripts/verify-webgl-display.sh l2
```
macOS에서 기본 Java launcher가 런타임을 찾지 못하면 설치된 Java 21을 명시한다. 검증 환경의 Homebrew 경로 예시는 다음과 같다.
```bash
JAVA_HOME=/opt/homebrew/opt/openjdk@21/libexec/openjdk.jdk/Contents/Home \
PATH=/opt/homebrew/opt/openjdk@21/bin:$PATH \
bash scripts/verify-webgl-display.sh all
```
L1은 Java 전체 단위·회귀, Node 플레이어 테스트, WAR 패키징이다. L2는 기존 null 행 보존, 마이그레이션 두 번 적용, CHECK 거부, fresh/migrated display 스키마 동등성 및 실제 MyBatis INSERT/UPDATE/7개 SELECT roundtrip이다. 일반 Maven test에서 격리 DB 계약 테스트는 환경변수 부재로 skip된다. harness가 만든 DB에서만 활성화하며 JDBC URL은 loopback의 `webgl_contract` DB로 제한한다.
## 격리 런타임 확인
WAR package만으로 JSP 컴파일 성공을 판단하지 않는다. 새 disposable PostgreSQL을 별도로 만들고 `db/schema.sql`을 적용한 후, 기존 앱과 겹치지 않는 포트(예: 18081)에 Maven `spring-boot:run`으로 앱을 기동한다. 현재 WAR에는 Main manifest가 없으므로 `java -jar`로 실행할 수 없다. 임시 DB 포트는 `<isolated-port>`에 지정한다. 다음은 검증에서 성공한 Java 21 실행 명령을 일반화한 예시다. macOS 외 환경에서는 설치된 Java 21 경로로 바꾼다.
```bash
JAVA_HOME=/opt/homebrew/opt/openjdk@21/libexec/openjdk.jdk/Contents/Home \
PATH=/opt/homebrew/opt/openjdk@21/bin:$PATH \
./mvnw -o spring-boot:run \
'-Dspring-boot.run.arguments=--server.address=127.0.0.1 --server.port=18081 --spring.config.import= --spring.datasource.driver-class-name=org.postgresql.Driver --spring.datasource.url=jdbc:postgresql://127.0.0.1:<isolated-port>/webgl_contract?currentSchema=dev --spring.datasource.username=postgres --spring.datasource.password= --app.upload.game-storage-path=/tmp/bibimbap-webgl-smoke-uploads'
```
격리 DB의 임시 계정으로 로그인한 뒤 등록→업로드→저장→상세→수정 흐름을 확인한다. 실제 받은 ZIP과 별도 가로·정사각형 빌드를 각각 등록해 자기 크기가 적용되는지 본다. 직접 지정·새 ZIP 교체·기존 크기 미확인 게임도 확인한다. 등록 `/game/new`, 상세 `/game/{id}`, 수정 `/game/{id}/edit`의 응답 200과 서버의 JSP/stacktrace 오류 부재를 확인한다. 기존 원본 ZIP과 저장된 HTML의 SHA-256을 비교하여 빌드가 변하지 않았음을 남긴다.
320×844, 1440×900, 844×390, 640×300 viewport에서 세로·가로·정사각형 게임 모두 iframe이 stage 경계 안에 있고 비율 오차가 1px 이내인지 확인한다. 일반·크게 보기·전체화면 진입/복귀·API 거절 fallback·resize를 확인하며 iframe DOM/src/load 횟수와 게임 상태가 유지되는지 기록한다. 실제 Unity canvas는 CSS client 크기와 drawing buffer 크기를 각각 확인하고 상하단 UI·클릭 좌표·모바일 터치 입력을 점검한다. 콘솔 오류, focus 복귀, Esc, body 스크롤 복원도 확인한다. 확인 후 임시 앱/DB/업로드만 정리한다.

View File

@ -0,0 +1,185 @@
---
kind: work-log
title: WebGL 화면 대응 구현과 로컬 확인 기록
owner: bibimbap
status: implemented-local-review
last_reviewed: 2026-10-14
source_session: 20261014-091658
implementation_commit: ddd9abf
verification_closure_commit: 90af599
---
# WebGL 화면 대응 구현과 로컬 확인 기록
사용자가 업로드한 Unity WebGL 빌드마다 기준 화면 크기를 감지·저장하고, 실행 화면이 그 비율을 유지하며 가용 공간에 맞춰 표시되도록 구현했다. 등록자가 크기를 직접 교정할 수 있고, 확대·전체화면·창 크기 변경에도 실행 중인 게임을 유지한다. 특정 게임의 이름이나 해상도에 맞춘 특별 분기는 없다.
구현과 격리 검증 이후 로컬 개발 DB에 마이그레이션을 적용하고 앱을 재시작했다. 실제 고라니 게임과 가로·정사각형 검증용 빌드가 로컬 서비스에 등록되어 있다. 사용자는 브라우저에서 확인할 수 있는 상태에서 **“일단 여기까지 상세히 기록하자. 괜찮은거 같네”**라고 평가했다. 현재 단계의 긍정적 검토 의견으로 기록하며, 실제 모바일 기기의 모든 동작을 확인했다는 의미로 확대하지 않는다.
## 요청과 범위 확정
최초 입력은 `/Users/wemadeplay/Downloads/GoraniCoin-WebGLTest.zip`이었다. 다른 개발자가 만든 실행용 빌드이며 Unity 원본 프로젝트는 포함하지 않았다. 사용자는 고정된 실행 영역과 화면 크기가 달라질 때 제대로 표시되지 않는 문제를 해결하려고 했다.
첫 제안은 원래 비율을 유지하는 플레이어 크기 조정이었다. 사용자가 **“단순히 내가 준 예시에만 맞추는게 아니라 사용자가 업로드한 게임에 맞춰서야”**라고 범위를 명확히 했다. 이에 따라 수동 비율 선택만 제공하는 수준에서 업로드별 크기 감지, 등록·수정 시 저장, 상세 화면 자동 적용까지 범위를 확정했다.
Unity 내부의 UI 앵커·Canvas Scaler·카메라 배치는 수정하지 않았다. 현재 기능은 빌드가 선언한 기준 비율로 브라우저 실행 영역을 맞춘다. 모든 비율에서 게임 내부 UI가 재배치되어야 하는 경우에는 해당 개발자의 원본 수정과 재빌드가 필요할 수 있다.
## 기존 화면에서 확인한 문제
| 대상 | 기존 동작 | 영향 |
| --- | --- | --- |
| 서비스 상세 플레이어 | 16:9, 최대 높이 `min(70vh, 520px)` | 세로 게임이 낮은 가로 영역 안에서 작게 표시됨 |
| 제공 빌드 | 기준 390×844, PC에서도 세로 유지 | 서비스의 고정 가로 영역과 비율이 다름 |
| 제공 빌드 HTML | 폭은 줄이지만 높이는 viewport 높이를 유지 | 폭이 먼저 제한되면 원래 비율이 깨질 수 있음 |
| Unity 렌더 타깃 | canvas CSS 크기와 자동 동기화가 이미 활성화됨 | 초기 width/height만 보고 렌더 해상도가 고정이라고 판단하면 안 됨 |
제공 빌드는 Unity `6000.0.74f1`이었다. 캔버스 표시 크기, GPU drawing buffer, 게임 내부 UI 배치를 구분하여 조사했다. 세부 근거는 [조사 보고서](../../.atp/work-session/20261014-091658/research/research.md)에 있다.
## 크기 감지와 등록 저장
작성자가 직접 지정한 값이 우선한다. 자동 감지는 선택된 `index.html`과 같은 디렉터리의 `build-info.json`에 있는 `width`·`height`, 명확한 canvas 또는 `#unity-container`의 정수 pixel CSS, 명시 canvas 속성 순으로 처리한다.
업로드된 JavaScript를 실행하거나 외부 리소스를 요청하여 크기를 추론하지 않는다. 상대 단위·동적 표현식·외부 CSS·JavaScript style 대입 등 정적으로 해석하기 어려운 템플릿은 감지 대상에서 제외한다. 메타가 없거나 잘못되었어도 정상 빌드 업로드는 계속 허용한다.
| 검증 항목 | 계약 |
| --- | --- |
| 폭과 높이 | 둘 모두 정수, 각각 1~16384 |
| 종횡비 | 1:32~32:1 |
| 기본 canvas 300×150 | 자동 감지 근거에서는 제외, 직접 지정은 허용 |
| 파일 읽기 상한 | HTML 1MiB, JSON 64KiB |
| 분석 경로 | 업로드 저장 루트 내부의 파일만 사용 |
| 감지 실패 | 미확인 상태로 등록 가능. 상세는 기본 16:9 사용 |
자동 감지값은 빌드의 선언값이다. 실제 게임 의도와 다르면 등록·수정 화면의 직접 지정으로 교정한다. 상세 감지 계약은 [화면 크기 계약](../contracts/webgl-display-metadata.md)에 있다.
ZIP 업로드 응답에 `displayWidth`, `displayHeight`, `displaySource`를 추가했다. 등록·수정 화면에서 “빌드에 맞추기” 또는 “직접 지정”을 선택한다. 자동 저장은 브라우저가 보낸 크기 대신 서버에 저장된 빌드에서 다시 감지한다.
직접 지정한 값은 새 ZIP을 선택해도 유지하며, 자동 모드에서는 새 빌드 결과를 반영한다. 이전 클라이언트가 크기 파라미터를 보내지 않는 수정 요청은 같은 빌드 경로라면 기존 메타를 보존하고, 경로를 교체하면 다시 감지한다.
기존 게임의 크기 값이 null이면 상세·수정 조회에서 파일을 읽어 감지한다. 조회 중 DB 백필은 하지 않는다. 작성자가 수정 화면에서 자동 저장하거나 직접 지정할 수 있다. 기존 인증·CSRF·소유권 검증을 유지했다.
## 플레이어 비율과 상태 유지
크기 계산은 `scale = min(가용 폭 / 기준 폭, 가용 높이 / 기준 높이)`를 사용한다. 양축이 공간을 넘지 않게 iframe 크기를 정하고 중앙에 배치한다. 일반 높이 한도는 `min(70dvh, 720px)`이며 vh fallback이 있다.
“크게 보기”와 “전체화면”은 같은 iframe과 src를 유지한다. 창 크기 변경·방향 전환·확대·복귀 때문에 Unity 인스턴스를 다시 만들지 않는다. 전체화면 API가 없거나 거절되면 크게 보기로 전환한다. 닫기·Esc·스크롤 및 포커스 복귀도 지원한다.
부모는 iframe 박스만 조정하므로 별도 asset origin을 사용할 때도 내부 canvas DOM 접근이 필요하지 않다. 이 계약은 Node 테스트로 확인했으며, 다른 origin의 실제 서비스 조합은 별도 실행하지 않았다. 실제 Unity 실행과 입력 검증은 같은 origin의 격리 환경에서 수행했다.
## 저장 구조와 변경 파일
`games`에 nullable `display_width`, `display_height`, `display_source`를 추가했다. 폭·높이 pair, 범위, 종횡비, source CHECK를 두었다. 신규 DB 정의와 기존 DB용 마이그레이션을 함께 작성했다. 기존 행 삭제·백필 없이 적용하며 재실행 가능하다.
| 영역 | 주요 파일 |
| --- | --- |
| 정적 감지 | `WebglDisplayMetadata.java` |
| 업로드·저장·상세 모델 | `GameUploadController.java`, `GameController.java` |
| 데이터와 SQL | `GameData.java`, `GamesMapper.java` |
| 화면과 입력 | `game-register.jsp`, `game-detail.jsp`, `webgl-player.js`, `webgl-player.css` |
| DB | `db/schema.sql`, `db/migrations/20261014-game-display-metadata.sql` |
| Java 검증 | `WebglDisplayMetadataTest`, `GameDisplayMetadataTest`, `GameUploadControllerSecurityTest`, `WebglDisplayDatabaseContractTest` |
| 플레이어 검증 | `src/test/js/webgl-player.test.cjs` |
| 통합 실행 | `scripts/verify-webgl-display.sh` |
구현은 `feat/v2`의 `ddd9abf`, 최초 검증 세션 종료 기록은 `90af599`에 커밋했다. 원격 push와 운영 환경 배포는 수행하지 않았다.
## 검증 결과와 증거 범위
| 검증 | 결과 |
| --- | --- |
| Java 전체 테스트 | 377건, 실패·오류 0. 일반 실행에서 opt-in L2 1건 skip |
| Node 플레이어 테스트 | 11/11 통과 |
| WAR package | 통과 |
| PostgreSQL L2 | 임시 DB에서 별도 활성화하여 1/1 통과. 반복 마이그레이션, 기존 행 보존, 제약, 신규·기존 스키마 정합, 실제 저장·수정과 7개 mapper 조회 확인 |
| JSP 실행 | 인증 후 등록·상세·수정 경로 5개 HTTP 200 |
| 비율과 경계 | 세로 390×844, 가로 1280×720, 정사각형 800×800 각각 4 viewport, 총 12/12 통과 |
| viewport | 320×844, 1440×900, 844×390, 640×300 |
| 상태 유지 | resize·확대·전체화면/복귀·API 거절 fallback에서 동일 iframe/src/Unity 유지, 추가 load 0 |
| 입력 | trusted CDP touch로 세로 Shop, 가로 확대·resize 후 Open Upgrades 전환 확인 |
| 무결성 | 원본 ZIP 및 저장·HTTP 제공 HTML SHA-256 보존 |
| 회귀 | 실제 이전 JSP를 임시 복사본에 적용하면 동일 SSR 테스트 실패, 현재 JSP에서는 통과 |
| UI와 문서 | 영향맵 21개 파일과 기능 링크 확인. detect 2건은 기존 스타일 및 숨겨진 preview 오탐 |
현재 12개 화면 조합의 경계·비율 검증은 모두 통과했다. 수정 전 실패 증거는 실제 이전 JSP의 SSR 계약에 대한 것이며, 이전 브라우저에서 12개 geometry 조합을 재실행한 증거는 아니다.
Unity 준비 후 CSS client 크기와 drawing buffer를 별도로 검사했다. 데스크톱 일반은 291×630 / 582×1260, 전체화면은 388×840 / 776×1680이었다. 표시 크기와 렌더 버퍼를 혼동하지 않았다.
터치 검증은 `pointerType=touch`, `isTrusted=true`와 이름이 있는 게임 버튼의 실제 화면 전환을 함께 확인했다. 최초 모바일 emulation에서 trusted mouse click만 나온 결과는 터치 통과로 집계하지 않고, 별도 Chrome CDP 검증으로 보완했다. 자동 브라우저 터치는 확인했으며 실제 물리 기기 스모크는 남아 있다.
브라우저 console error와 앱 stacktrace는 없었다. Unity 경고, autoplay 및 iframe sandbox 경고는 검증 보고서에 별도로 기록했다.
가이드의 `java -jar` 예시는 현재 WAR의 Main manifest 부재로 실패하여, 실제 성공한 Java 21의 Maven `spring-boot:run` 명령으로 수정했다. 기본 Java launcher가 런타임을 찾지 못하는 macOS 환경의 경로 예시도 추가했다.
## 로컬 적용과 테스트 게임 등록
최초 구현 검증은 임시 PostgreSQL과 별도 포트 앱에서 수행했다. 이후 사용자가 **“테스트용 게임 로컬에 등록해줘 내가 브라우저에서 직접 보게”**라고 요청하여 현재 로컬 개발 서비스에 적용했다.
| 항목 | 현재 로컬 상태 |
| --- | --- |
| 앱 | `bibimbap-app`, `http://localhost:8080` |
| DB | `bibimbap-db`, 호스트 포트 5433, database `bibimbap`, schema `dev` |
| DB 변경 | `20261014-game-display-metadata.sql` 적용 완료. 세 display 컬럼 확인 |
| 앱 반영 | `docker compose restart app` 완료 |
| 등록 방식 | 전용 로컬 테스트 계정의 정상 가입·로그인, CSRF를 거친 ZIP 업로드와 게임 등록 API |
| 공개 접근 | 상세·플레이어 JS/CSS·빌드 진입 HTML HTTP 200, 세 게임 공개 상태 |
| 저장 | 일반 업로드 저장소와 Docker uploads 볼륨. 격리 검증용 임시 DB에만 남긴 등록이 아님 |
| ID | 게임 | 기준 크기 | 주소 | 내용 |
| --- | --- | --- | --- | --- |
| 9 | 고라니 코인 · 화면 대응 테스트 | 390×844 | [실제 게임](http://localhost:8080/game/9) | 받은 Unity 빌드 그대로 업로드 |
| 10 | 가로형 · 화면 비율 검증 | 1280×720 | [가로형](http://localhost:8080/game/10) | 콘텐츠 없는 검증 빌드, 흰 캔버스 |
| 11 | 정사각형 · 화면 비율 검증 | 800×800 | [정사각형](http://localhost:8080/game/11) | 콘텐츠 없는 검증 빌드, 흰 캔버스 |
세 게임 모두 `display_source=build-info`이고 공개 상태다. 기록 직전에 비로그인 요청으로 상세 HTTP 200과 기준 크기 data 속성을 다시 확인했다. 고라니 게임을 기본 브라우저로 열었다. 비밀번호와 세션 쿠키는 기록하지 않는다.
ID와 URL은 현재 개발 DB의 시점 정보이며 DB 초기화나 삭제 후에는 달라질 수 있다. 등록 메타와 업로드 경로는 [local-games.json](./assets/2026-10-14-webgl-display/local-games.json)에 보존했다.
## 스크린샷 15장 보존
사용자 요청으로 `/tmp/bibimbap`에 PNG 15장, `index.html` 갤러리와 `README.txt`를 모았다. 임시 디렉터리 정리 이후에도 확인할 수 있도록 이 기록과 함께 복사본을 보존했다.
[보존한 스크린샷 갤러리](./assets/2026-10-14-webgl-display/index.html) · [이미지 목록](./assets/2026-10-14-webgl-display/README.txt)
| 번호 | 화면 | 이미지 크기 |
| --- | --- | --- |
| 01 | 서비스 상세 데스크톱, 실제 세로 게임 | 1440×900 |
| 02 | 서비스 상세 모바일, 실제 세로 게임 | 320×844 |
| 03~04 | 일반 화면 Home / Shop | 각각 500×757 |
| 05~06 | 가로 확대 Shop / Upgrades | 각각 844×390 |
| 07~08 | 모바일 Home / Shop | 각각 390×844 |
| 09~10 | 추가 촬영 실제 게임 데스크톱 / 모바일 | 1440×900 / 390×844 |
| 11~12 | 가로형 검증 빌드 데스크톱 / 모바일 | 1440×900 / 390×844 |
| 13~14 | 정사각형 검증 빌드 데스크톱 / 모바일 | 1440×900 / 390×844 |
| 15 | 추가 촬영 실제 게임 전체화면 | 1440×900 |
01~08은 앞선 실제 서비스와 입력 검증 화면이다. 09~15는 현재 제품 플레이어 JS/CSS를 실행한 별도 로컬 확인 화면이다. 가로·정사각형의 흰 영역은 검증용 캔버스이며 완성된 게임 콘텐츠가 아니다.
## 사용자 판단과 남은 확인
사용자 의견은 **“괜찮은거 같네”**이며, 이 상태를 상세히 남기고 작업을 여기서 정리하기로 했다. 자동화와 로컬 확인에서 새 동작의 결함은 관찰하지 않았다.
추가 구현을 시작한 상태는 아니다. 이후 확인할 항목은 실제 터치 기기의 크게 보기·전체화면·방향 전환·게임 버튼 스모크와, 필요 시 서로 다른 asset origin의 실제 서비스 실행이다. 운영 환경에 적용할 때는 해당 DB 마이그레이션을 먼저 실행하고 앱을 반영해야 한다. 로컬 `dev` 적용 완료와 운영 배포 완료를 구분한다.
모든 템플릿의 의도 크기를 완벽히 추론하는 기능은 제공하지 않는다. 정적 크기 선언이 없거나 실제 의도와 다르면 작성자가 직접 지정한다. Unity 내부 화면 배치는 빌드 개발자와 별도로 다룬다.
## 다음 확인 순서
1. [고라니 게임](http://localhost:8080/game/9)에서 일반 화면, 크게 보기, 전체화면, 복귀를 확인한다.
2. 창 크기나 방향을 바꾸고 게임 상태 및 Shop / Upgrades 입력이 유지되는지 확인한다.
3. [가로형](http://localhost:8080/game/10)·[정사각형](http://localhost:8080/game/11)의 캔버스로 비율과 여백을 비교한다.
4. 다른 실제 빌드 등록 시 자동 안내와 직접 지정 저장을 확인한다.
5. 실제 모바일 기기 또는 별도 origin 배포가 필요하면 해당 환경 스모크를 수행한다.
검증 명령과 실행 방법은 [사용 가이드](../usage/webgl-display.md), API·저장 규칙은 [계약 문서](../contracts/webgl-display-metadata.md)를 따른다.
## 관련 기록
- [구현 변경 이력](../changes/2026-10-14-webgl-display.md)
- [최초 조사](../../.atp/work-session/20261014-091658/research/research.md)
- [설계](../../.atp/work-session/20261014-091658/implementation/design.md)
- [구현 보고](../../.atp/work-session/20261014-091658/implementation/report.md)
- [최초 독립 검증](../../.atp/work-session/20261014-091658/verification.md)
- [입력 보완 검증](../../.atp/work-session/20261014-091658/supplemental-verification.md)
- [최종 문서와 UI 감사](../../.atp/work-session/20261014-091658/artifacts/final-doc-ui-audit.md)
- [최초 세션 보고서](../../.atp/work-session/20261014-091658/report.md)
최초 세션 보고서는 구현·격리 검증 완료 시점의 기록이다. 후속 스크린샷 수집, 로컬 DB 적용, 실제 서비스 등록과 사용자 긍정 의견은 이 기록의 현재 상태를 따른다. 과거 검증 보고서의 최초 미확인 항목은 보완 검증과 함께 읽는다.

Binary file not shown.

After

Width:  |  Height:  |  Size: 243 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 97 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Some files were not shown because too many files have changed in this diff Show More