docs: 고도화 로드맵 목적축 재구조 (게임잼 단일프레임 → W1~W4 워크스트림)

20260617-150635 로드맵(S1~S7, 의존성축)을 목적축("왜 존재/누구를 위한가")으로
재검토. 모든 항목이 단일 "게임잼" 프레임에 묶여 있던 것을 4개 목적 워크스트림으로 분해:

- W1 거버넌스/RBAC — 사이트 거버넌스, 게임잼은 소비자, 독립
- W2 게임잼 — 본체(엔티티+심사위원역할+잼평가설계+심사/투표/시상)
- W3 사이트 플랫폼 — 태그검색·댓글리뷰·포스팅·메인허브·Unity, 전부 잼일정 독립
- W4 유저 배지/평판 — 신규 발굴(리뷰어/기술자가 RBAC 플래그로 오분류됐던 것)

150635 대비 핵심 교정 5건 + S→W 매핑표 + 의존성 그래프(빌드순서) 유지.

번들(이전 잔여 정리): 오늘 work-session durable history
(094450/143315/150635/162536), serena 설정·메모리, 분석문서 교차링크.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
이정수 2026-06-17 17:20:53 +09:00
parent 1fa1e12128
commit 2eb0be5654
13 changed files with 1008 additions and 1 deletions

View File

@ -0,0 +1,146 @@
---
schema_version: 1
sid: 20260617-094450
started_at: 2026-06-17T09:44:50+09:00
ended_at: 2026-06-17T10:05:00+09:00
user_request: |
PR #1 (docs/project-analysis → main, "docs: ATP 문서 체계 도입 및 프로젝트 종합 분석")
당사자 승인 완료. 그러나 main 에 실수로 "일부 병합한" 커밋(f6f691c)이 들어가 PR 이
mergeable:false 상태. main 으로 병합 + 충돌 해결 요청.
PR URL: https://gitea.pandoli365.com/pandoli365/bibimbap/pulls/1
---
# Summary
진단 (read-only):
- PR #1 head = `d297f31` (docs/project-analysis), base = `main`. gitea state=open, **mergeable:false**, merged:false.
- merge-base = `40bde12` (단일).
- 사고 커밋 `f6f691c "fix: harden auth csrf handling"` 가 두 가지를 한 커밋에 섞음:
1. **정당한 csrf 보안 수정** (B1): UserController.java / login.jsp / signup.jsp / 테스트 2건
2. **PR 문서의 부분·다른 버전 스냅샷**: CLAUDE.md, docs/analysis/..., docs/index.md, .serena/project.yml,
.atp/work-session(파일형), 그리고 README.md 컨벤션 docs (PR 은 index.md 컨벤션)
- 동일 경로가 양측에서 다르게 추가/수정 → gitea 충돌. 단 `.atp/work-session` 은 main=blob / PR=tree
의 **파일/디렉토리 타입 충돌**이 gitea mergeable:false 의 핵심 원인.
위험 발견:
- **naive `git merge` 금지**: 로컬 ort 전략이 충돌 0으로 자동 병합하지만, 결과 트리가 **csrf 코드 5건을
base 로 되돌리고 csrf 테스트 파일을 삭제**함 (블롭 해시로 검증). gitea Merge 버튼도 신뢰 불가.
→ 결과 트리를 결정론적으로 구성해야 함.
# Advisor Invocation Decision Log
# 각 advisor 호출/스킵 판단 즉시 1줄 append
- advisor: requirements-advisor
decision: skip
rationale: '요청 명확(병합+충돌해결). 모호점은 git 상태 자체이며 orchestrator 직접 조사가 효율적.'
checked_at: 2026-06-17T09:45:00+09:00
- advisor: research-advisor
decision: skip
rationale: 'git/gitea 상태 조사는 orchestrator 직접 Bash 가 적합. 외부 자료 불요.'
checked_at: 2026-06-17T09:45:00+09:00
- advisor: design/implementation-advisor
decision: skip (pending user)
rationale: 'git 병합 충돌해결은 §6 파괴적 게이트 + 단계별 명령. orchestrator 직접 수행이 적합. 사용자 결정 후 진행.'
checked_at: 2026-06-17T09:45:00+09:00
# Invocations
- inv-001: graph-refresh-checker (post-merge staleness 판정) — model_choice: phase=graphify-judgment, tier=large(inherit), rationale='no-defer 정책상 머지 직후 그래프 신선도 판정'
# Decisions
- D1: csrf 보안 수정(f6f691c 코드분)은 정당 → main 버전 보존 (전제, 사용자 미반대)
- D2: CLAUDE.md → main 프로젝트 지침 + PR ATP 블록 결합 (사용자 선택)
- D3: 사고 커밋 README.md 5건 제거, security-remediation-checklist.md(고유) 유지 (사용자 선택)
- D4: 반영 방식 → main 에 병합커밋(parents f6f691c+d297f31) + push (사용자 선택)
- D5: 충돌 문서(project-analysis.md/docs.index.md/.serena.project.yml) → PR 정식본. db-update-query-generator.md·user-signup-schema.md 는 ort 자동병합 union 유지(링크 전부 유효, README 참조 없음).
# self_correction
- 세션 초반 "naive git merge 가 csrf 코드를 base 로 되돌리고 테스트를 삭제한다"는 발견을 보고했으나, 이는 **로컬 main 이 stale(40bde12)** 상태에서 만든 temp 브랜치로 테스트해 발생한 오판. 올바른 base(origin/main=f6f691c)로 재실행하니 정상 충돌 표면화 + csrf 보존. 교훈: 머지 동작 추론 전 `git fetch` 후 로컬 브랜치==원격 동기화 여부 확인. (memory_candidate)
# user_signals
positive:
- '권장안 3건(CLAUDE 결합/README 제거/병합커밋+push)을 한 라운드에 모두 수락'
negative: []
# verified_by_me
- 'L1: 병합 결과 src/ 트리가 origin/main(f6f691c)과 바이트 동일 — git diff --cached f6f691c -- src/ 빈 결과. 코드 델타 0, csrf 보존. 신규 코드 없음 → 빌드 불요(docs-only 델타).'
- 'L2: skip — 외부 의존성/계약 변경 없음(docs·설정 머지)'
- '충돌 0 잔여, README 5건 제거 확인, .atp/work-session blob→dir 해소(4 entries)'
- 'push: f6f691c..8c41b22 main->main 성공. d297f31 이 origin/main ancestor 재확인(=PR 내용 머지 완료)'
# graph_refresh
- 판정: fresh (src·docs 모두 fresh; docs 는 partial-stale 경계 근접)
- 미반영 항목: docs/security/security-remediation-checklist.md 1개 문서 노드(+analysis/schema 링크 엣지). src 는 구조 시그널 0(UserController 변경은 기존 CsrfTokens.isValid 호출 2줄, 신규 노드/엣지 없음).
- 처리: 재생성 유보. 사유 = checker 가 docs 재생성을 "선택적·저효익(노드 1개)"으로 평가. /graphify 는 docs 그래프 전체 재생성 + 추가 push 를 유발하므로 PR 머지라는 작업 범위에 비해 과함. 사용자가 그래프 완전성을 원하면 `/graphify docs/` 로 트리거 가능 (open item).
# needs_user_verification
- 'gitea PR #1 레코드: 직접 push 로는 자동 merged 전환 안 됨(state:open 잔존). gitea UI 에서 수동 close 하거나 API 토큰 제공 시 닫기 대행 가능. 내용상 머지는 완료.'
- '세션 노트 .atp/work-session/20260617-094450/ 는 untracked. 영속화 원하면 별도 커밋 가능.'
Retrospective:
signals:
positive:
- quote_or_paraphrase: '권장안 3건(CLAUDE 결합 / README 5건 제거 / 병합커밋+push)을 한 라운드에 모두 수락'
about: 'orchestrator 가 충돌 해소 방식을 옵션화해 한 번에 제시 — 재질의·재지시 없이 단발 수락. 비자명한 결정(병합커밋 parents 구성, 충돌 문서 정식본 채택)을 묶어 제시한 판단이 검증됨.'
negative: []
what_went_well:
- 'self_correction 메커니즘이 작동: 세션 초반의 "naive git merge 가 csrf 코드를 base 로 되돌리고 테스트를 삭제한다"는 오판을 push 전에 스스로 발견·정정. 잘못된 결론이 사용자에게 확정 안내되거나 파괴적 push 로 이어지기 전에 차단됨.'
- '파괴적 git 작업(병합 충돌 해결)을 advisor 우회 없이 orchestrator 직접 수행 — 프로토콜 §1 직접 수행 영역 판정이 정확. advisor 호출 스킵 사유를 Decision Log 에 즉시 기록.'
- '결과 트리를 블롭 해시 수준으로 결정론적 검증(L1: src/ 트리가 origin/main 과 바이트 동일, csrf 보존 확인). gitea Merge 버튼·로컬 ort 자동병합을 신뢰하지 않고 직접 검증.'
- 'graph staleness 를 no-defer 정책에 따라 머지 직후 판정하고, 재생성 효익(노드 1개) 대비 비용(전체 docs 그래프 재생성 + 추가 push)을 평가해 유보 + open item 으로 위임.'
what_to_improve:
- 'git 머지 동작을 추론·시뮬레이션하기 전 baseline ref 의 신선도를 확인하지 않았다. stale 로컬 main(40bde12) 기반 temp 브랜치로 머지를 테스트해 "csrf 파괴" 라는 오판을 생성·보고했다. fetch 후 로컬==원격 동기화 확인이 추론보다 선행해야 한다.'
- '오판을 정정한 것은 self_correction 으로 회수됐으나, 그 오판이 한 번은 진단 보고(Summary 위험 발견 섹션)에 실렸다. 추론 기반 위험 경고를 보고에 싣기 전 baseline 전제(어느 ref 로 시뮬레이션했는지)를 명시하는 게이트가 있었다면 오판 단계에서 자가 포착 가능했을 것.'
memory_candidates:
- name: merge-reasoning-requires-fresh-baseline-ref
type: feedback
description: 'git 머지/충돌 동작을 추론·시뮬레이션하기 전 fetch 후 로컬 브랜치==원격 ref 동기화 여부를 먼저 확인. stale baseline 으로 시뮬레이션하면 잘못된 위험 결론이 나온다.'
body_draft: |
git 머지/충돌 결과를 추론하거나 temp 브랜치로 시뮬레이션하기 전에 `git fetch`
시뮬레이션 baseline 으로 쓸 로컬 브랜치가 원격 ref(보통 origin/main)와 동기화돼 있는지
먼저 확인한다. stale baseline 으로 머지를 테스트하면 실제와 다른 결과 트리가 나와
"코드가 파괴된다" 류의 잘못된 위험 결론을 보고하게 된다.
**Why:** 세션 20260617-094450 에서 "naive git merge 가 csrf 코드를 base 로 되돌리고
테스트를 삭제한다"는 위험을 진단 보고에 실었으나, 이는 로컬 main 이 stale(40bde12)
상태에서 만든 temp 브랜치로 머지를 테스트해 발생한 오판이었다. 올바른 base
(origin/main=f6f691c)로 재실행하니 정상적인 충돌이 표면화되고 csrf 가 보존됐다.
오판은 push 전 self_correction 으로 회수됐지만, 그 전에 한 번 위험 경고로 보고됐다.
관련: bump 커밋 *쓰기 대상* 선정 시 stale 브랜치 회피는
[[feedback_bump_target_branch_must_be_consumer_tracked_ref]] — 본 항목은 *읽기/추론*
baseline 의 신선도라는 별개 축.
**How to apply:**
- 머지 동작 추론/시뮬레이션 전: `git fetch``git rev-parse <local> origin/<remote>`
동기화 확인, 또는 시뮬레이션 base 를 `origin/<remote>` 로 직접 지정.
- 추론 기반 위험 경고를 보고에 실을 때는 "어느 ref 를 baseline 으로 시뮬레이션했는가"를
함께 명시 — 전제가 드러나면 stale 오판을 자가 포착하기 쉬워진다.
- 충돌 머지 결과는 블롭 해시 수준으로 결정론 검증(git diff --cached <ref> -- <path>).
rationale_for_saving: '재현 가능한 패턴(stale ref 기반 시뮬레이션 → 오판). 코드/커밋 로그로 유도 불가, 관찰로만 드러남. 기존 bump-target memory 와 인접하나 read/추론 baseline 신선도라는 별개 축으로 비중복.'
signal_source: observation
docs_sync_target: null
conflicts_with: null
- name: report-risk-claim-states-its-baseline-premise
type: feedback
description: '추론·시뮬레이션 기반 위험 경고를 진단 보고에 실을 때 baseline 전제(어느 ref·상태로 시뮬레이션했는지)를 함께 명시. 전제 누락 시 오판이 무검증으로 보고된다.'
body_draft: |
진단 보고(Summary "위험 발견" 등)에 추론·시뮬레이션 기반 경고를 실을 때는
그 결론의 baseline 전제를 한 줄로 함께 기록한다 — 예: "origin/main(f6f691c) 기준
ort 시뮬레이션 결과". 전제가 명시되면 검증자(및 작성자 자신)가 전제의 타당성부터
점검할 수 있어 stale·잘못된 전제에서 나온 오판을 보고 단계에서 포착할 수 있다.
**Why:** 세션 20260617-094450 에서 stale 로컬 main 기반 머지 오판이 "위험 발견"
섹션에 baseline 전제 없이 단정적으로 실렸다. push 전 self_correction 으로 회수됐으나,
전제가 보고에 명시돼 있었다면 오판 단계에서 자가 포착 가능했을 것이다.
**How to apply:**
- 진단 보고의 위험/경고 항목은 (관찰 사실 | 추론) 을 구분하고, 추론이면 전제 ref·상태를 병기.
- "naive X 하면 Y 파괴된다" 류 강한 단정은 결정론 재현 검증(블롭 해시/diff) 후에만 단정형으로.
rationale_for_saving: '위 머지 baseline 교훈의 메타 층위(보고 규약). orchestrator 의 보고 작성 습관에 재현 적용 가능. self_correction 이 회수한 경로를 한 단계 앞당기는 게이트로 비중복.'
signal_source: observation
docs_sync_target: null
conflicts_with: null
protocol_feedback:
- '프로토콜 §1(orchestrator 직접 수행 영역) 또는 §6(파괴적 게이트)에 "git 머지/리베이스 동작을 추론·시뮬레이션하기 전 baseline ref 신선도 확인(fetch + 로컬==원격)" 선행 체크를 추가 권고. 이번 세션의 stale-baseline 오판은 단발 실수가 아니라 시뮬레이션 baseline 전제를 명시하지 않는 구조적 허점에 가깝다(structural 경계).'
- '진단 보고의 "위험 발견" 류 항목에 (관찰 | 추론) 구분 + 추론 시 baseline 전제 병기를 권장 포맷으로 추가하면, self_correction 이 사후에 회수하던 오판을 보고 작성 시점에 자가 포착하도록 앞당길 수 있다.'
applied_changes: []

View File

@ -0,0 +1,36 @@
---
schema_version: 1
sid: 20260617-143315
user_request: "바이너리 직접 실행(./mvnw -P dev spring-boot:run) 시 DB 연결 문제"
started_at: 2026-06-17T14:33:15+09:00
ended_at: 2026-06-17T14:34:00+09:00
status: resolved
code_change_lines: 0
---
# Summary
호스트 직접 실행(경로 B) DB 연결 실패 진단. 근본 원인: bibimbap-db postgres 컨테이너 미기동 → localhost:5433 connection refused. db 컨테이너 기동으로 해소.
# Advisor Invocation Decision Log
- advisor: ALL
decision: skip
rationale: '런타임 환경 진단 + 0줄 코드변경 마이크로 작업. 원인=컨테이너 미기동(설정 정상). orchestrator 직접 처리(§1 예외).'
checked_at: 2026-06-17T14:33:20+09:00
# Decisions
- 근본원인: docker-compose db 서비스(bibimbap-db) 미생성/미기동. db.properties(localhost:5433), .env(DB_PORT=5433) 는 정상.
- kord-postgres(host 5432) 는 무관 — bibimbap 은 5433 사용.
- 조치: `docker compose up -d db` (가역적 로컬 액션, §6 파괴게이트 비해당).
# verified_by_me
- L1: n/a (코드변경 0)
- 런타임: bibimbap-db Up(healthy), host 5433 LISTEN, dev 스키마 6테이블 자동주입(schema.sql), psql CONNECT_OK(dev.games 0행 무에러).
# needs_user_verification
- `./mvnw -P dev spring-boot:run` 재실행 → Tomcat 8080 + 홈 / HTTP 200 1회 확인(앱→DB 라운드트립).
# graph_refresh
skip: no-scope-change (코드 변경 0줄)
# open_items
- (없음) — 미커밋 잔여는 본 세션 산출 아님(.serena/*, 이전 work-session dir).

View File

@ -0,0 +1,103 @@
---
title: 게임잼 플랫폼 고도화 — 세션 로드맵
status: draft (사용자 확정 대기)
created_at: 2026-06-17
session: 20260617-150635
---
# 게임잼 플랫폼 고도화 — 세션별 로드맵
기존 bibimbap(게임 공유 + 팀원 모집, Spring Boot + MyBatis + JSP) 위에 **게임잼 운영/평가/리뷰/관리자/포스팅/검색** 신규 기능군을 얹는다. 메모를 "1항목=1세션"으로 쪼개면 공유 자원(게임잼 엔티티·RBAC·평가 데이터모델)에서 재작업이 폭증하므로(§2.7), **토대 → 결합 클러스터 → 표면 기능** 순으로 의존 순서를 강제한다.
## 의존 그래프
```
S1 RBAC(권한) ─┬─> S2 게임잼 엔티티 ─┬─> S3 태그+검색
│ ├─> S4D 평가 통합설계(스키마 동결)
│ │ └─> S4a 댓글/리뷰분리 ─┬─> S4b 심사위원
│ │ ├─> S4c 인기투표
│ │ └─(4a·4b·4c)─> S4d 시상집계
│ └─> S6 메인 통합(노출 대상 필요)
└─> S5 포스팅 보드 (S4와 독립, S1 후 병렬 가능)
└─> S6 메인 통합
차후: S7 Unity 빌드 업로드 파이프라인 (별도 조사)
운영: Discord/뒤끝/상금 (코드 외 — 표시 필드만 S2 흡수)
```
- **크리티컬 패스**: S1 → S2 → S4D → S4a → S4d → S6
- **S1 직후 병렬 가능**: S5(포스팅)
- **S2 직후 병렬 가능**: S3(태그)
- **S4 분할 원칙**: S4D(통합설계) 가 평가/리뷰/투표/댓글/시상 **스키마를 한 번에 동결**. 이후 S4a~S4d 는 동결된 계약을 소비만 한다 — 구현 세션이 스키마를 바꾸면 형제 세션 재작업이므로, 스키마 변경은 S4D 로 회귀해 처리.
## 세션 카드
### S1 — 권한 체계(RBAC) 기반 ★최우선 토대
- **목표**: 사이트 관리권한 모델 + 기능별 인증유저 플래그 스캐폴드.
- **포함**: 관리자(전체)/부관리자(허용 권한만 = 권한부여형) 모델, 관리자 콘솔(부관리자 임명 + 권한 토글), 인증유저 플래그 정의·부여(리뷰어/포스터/심사위원/기술자), 권한 체크 인터셉터.
- **제외**: 각 권한의 실제 사용처(후속 세션이 소비).
- **의존**: 없음.
- **공유 자원**: `users`, `security/`, 세션/인증.
- **권장 진입**: requirements-advisor(권한 모델 정밀화) → design → implementation.
- **산출**: 권한 스키마 마이그레이션, 관리자 콘솔, 권한 인터셉터.
### S2 — 게임잼 엔티티 + 라이프사이클 ★토대
- **목표**: 게임잼 이벤트 엔티티 + 상태전이 + 관리 + 출품작 연결.
- **포함**: `jams` 테이블, 상태전이(모집→개발→평가→종료), 개발기간/평가기간 필드, 관리자 게임잼 CRUD, 출품작 = `games`에 잼 연결(개인·팀 모두), 게임잼 목록/상세 페이지, (운영 표시) Discord 링크·상금·후원사 필드.
- **제외**: 평가/투표/리뷰(S4), 검색(S3).
- **의존**: S1(게임잼 생성 권한).
- **공유 자원**: `games`, `recruit_posts`(팀 연결), 상태전이.
- **산출**: `jams` 스키마, 게임잼 페이지, 라이프사이클 상태머신.
### S3 — 태그 + 검색
- **목표**: 게임잼+게임 공통 태그, 게임잼 태그 검색.
- **포함**: 공유 `tags` + 조인테이블(game/jam), 게임잼 태그 검색 UI/쿼리.
- **의존**: S2.
- **산출**: 태그 스키마, 검색 UI.
### S4 — 평가·리뷰·투표 통합 ⚠️결합 클러스터 → 분할 세션화
> §2.7 주의: 댓글/리뷰/심사/투표/시상이 같은 데이터 도메인 + 평가기간 게이트를 공유. **S4D 가 스키마를 한 번에 동결**하고, S4a~S4d 는 그 계약을 소비만 한다. 스키마 변경 필요 시 S4D 로 회귀(형제 세션 재작업 방지).
#### S4D — 평가 통합설계 (설계 전용 세션, 코드 0)
- **목표**: 리뷰/댓글/심사/투표/시상 데이터모델 + 계약 + 평가기간 게이트를 한 번에 확정·동결.
- **포함**: `reviews`(게시물당 1회, 완성도+종합 평점), `game_comments` 200자 제약, 심사 점수 스키마, 잼 투표 스키마, 3트랙 집계 규칙, 상태/기간 게이트 계약.
- **의존**: S1, S2.
- **권장 진입**: design-advisor.
- **산출**: design.md + DB 스키마(동결) + contracts.
#### S4a — 댓글/리뷰 분리 (구현)
- **목표**: `game_comments` 200자 제한 + 리뷰(신규, 게시물당 1회, 완성도+종합 평점) 분리.
- **의존**: S4D.
#### S4b — 심사위원 평가
- **목표**: 심사위원 권한자 점수 입력 → 심사위원 대상.
- **의존**: S4D, S4a, S1(심사위원 권한).
#### S4c — 인기투표
- **목표**: 잼 전용 1인 1표(평가기간 한정) → 인기 대상.
- **의존**: S4D.
#### S4d — 시상 집계/결과
- **목표**: 3트랙(심사/유저평점/인기) 산정 + 수상 표시.
- **의존**: S4a·S4b·S4c 산출.
### S5 — 정보성/홍보성 포스팅 보드 (S1 후 병렬 가능)
- **목표**: 운영진 전용 공지·블로그 + 외부링크 큐레이션. 유저 작성 차단.
- **포함**: `posts` 테이블, 포스터 권한자 작성, 카테고리(유니티블로그/세션/후기인터뷰/뒤끝 개발팀), 외부링크 타입, 유저작성 차단.
- **의존**: S1(포스터 권한). S4와 독립.
- **산출**: `posts` 스키마, 포스터 작성 UI.
### S6 — 메인페이지 통합 (거의 마지막)
- **목표**: `index.jsp` 에 게임잼+게임+포스팅 통합 노출.
- **의존**: S2, S5(노출 대상 존재).
- **산출**: index 확장.
### S7 — (차후) Unity 빌드 업로드 파이프라인 ⏸deferred
- **목표**: WebGL 빌드 업로드 → 검증 → `/game/{uuid}/` 배치 자동화.
- **선행**: 별도 조사(빌드 포맷/검증 규칙/보안 — zip-slip 등).
- **현재**: 스코프 인지만, 후속 결정.
## 운영(코드 외)
- **Discord**: 공지·진행은 수동 운영. 코드는 게임잼 상세에 초대 링크 표시 정도(S2 흡수).
- **뒤끝(Bekend)**: 파트너/콘텐츠 — 포스팅 카테고리로만 등장.
- **상금·후원**(치킨/10만원/편의점 5000원권): 게임잼 상세 표시 필드(S2) + 실제 지급은 수동.

View File

@ -0,0 +1,43 @@
---
phase: documentation
agent: documentation-advisor
agent_version: 1
generated_at: 2026-06-17T15:30:00+09:00
concerns: []
concerns_checked: true
---
# 문서화 보고
## 작성/수정된 문서
| 경로 | 카테고리 | 유형 | 링크 추가한 index | 교차 링크 |
|---|---|---|---|---|
| `docs/work-log/2026-06-17-jam-platform-roadmap.md` | work-log | 신규 생성 | `docs/work-log/index.md` | `docs/analysis/2026-06-16-project-analysis.md` 하단 관련 링크 섹션 |
| `docs/work-log/index.md` | work-log | 기존 갱신 | — | — |
| `docs/analysis/2026-06-16-project-analysis.md` | analysis | 기존 갱신 (교차 링크 추가) | — | — |
## 카테고리 판정 근거
**선택: `work-log/`**
`document-category-classification.md` 분류 기준:
- `backlog/` 명시 제외 사항: "확정된 로드맵 → 사용하지 않음"
- `work-log/` 빠른 결정 순서 §8: "진행 중인 작업 메모인가? → work-log/"
- 이 로드맵은 S1~S7 순서로 진행될 다중 세션 작업의 실행 계획이며, 각 후속 세션 진입 시 의존 순서·스코프 경계를 확인하기 위해 참조되는 세션 간 handoff 기준 문서다.
- 아키텍처 구조 설명(`architecture/`)이나 불변 기술 결정(`adr/`)이 아닌 실행 계획이므로 보수적으로 `work-log/`를 선택.
**신규 카테고리 생성**: 없음.
## 의사결정 기록 위치
- 사용자 확정 결정 8건: `.atp/work-session/20260617-150635/report.md` §Decisions
- 결합 트랙 판정(§2.7): `.atp/work-session/20260617-150635/report.md` §Coupling Analysis
- Advisor 호출 결정: `.atp/work-session/20260617-150635/report.md` §Advisor Invocation Decision Log
## 추후 문서화가 필요한 항목
- S1 세션 완료 시: RBAC 스키마 마이그레이션 → `changes/` + 권한 모델 설계 → `architecture/` 또는 `contracts/`
- S4D 세션 완료 시: 평가 통합 데이터모델 동결 → `contracts/` (내부 스키마 계약)
- S7 조사 완료 시: Unity WebGL 업로드 파이프라인 결정 → `adr/` (되돌리기 어려운 기술 선택)
- 각 세션 완료 후: `work-log/2026-06-17-jam-platform-roadmap.md` 의 해당 세션 카드 status 갱신 권장

View File

@ -0,0 +1,154 @@
---
schema_version: 2
session_id: 20260617-150635
resumed_from: null
started_at: 2026-06-17T15:06:35+09:00
ended_at: 2026-06-17T15:20:00+09:00
user_request: |
고도화 위한 계획 수립. 단위별로 끊어서(세션별) 작업할 수 있도록 분류·정리.
사용자가 공유한 모호한 메모(게임잼 운영/평가/리뷰/관리자/포스팅/검색 등)를
각 항목 의미를 확인하며 계획화. 이번 세션은 계획 수립 전용(코드 변경 0).
---
# Summary
게임잼 플랫폼 고도화 기획 세션. 기존 bibimbap(게임 공유 + 팀원 모집) 위에
게임잼 운영/평가/리뷰/관리자(RBAC)/포스팅/태그검색 신규 기능군을 얹는 요청.
메모가 무분별 → requirements 확정 전 orchestrator 가 직접 파싱 + 배치 질의로 의미 확정.
세션 분할(단위별 새 세션) 요구 → §2.7 결합 트랙 판정이 핵심: 공유 자원(게임잼 엔티티/
평가 데이터모델/RBAC) 기준으로 선후 순서를 강제해야 재작업 방지.
# Advisor Invocation Decision Log
- advisor: requirements-advisor
decision: pending
rationale: '메모가 극도로 모호 → advisor 디스패치 전 orchestrator 가 사용자 배치 질의로 의미 확정 선행. 확정 후 requirements-advisor 로 FR/NFR 분해 디스패치 예정.'
checked_at: 2026-06-17T15:06:35+09:00
- advisor: graphify-lookup-advisor / research-advisor
decision: skip
rationale: '코드 구조는 기존 분석 세션(20260616-111711) + 직접 grep 으로 충분 파악. 외부 연동 모두 운영/차후로 확정 → 이번 세션 외부 조사 불필요.'
checked_at: 2026-06-17T15:06:35+09:00
- advisor: design-advisor / implementation-advisor / verification-advisor
decision: skip
rationale: '사용자가 "계획만 확정, 종료" 선택 → 코드 변경 0. 설계·구현·검증은 각 후속 세션(S1~)에서 수행.'
checked_at: 2026-06-17T15:16:00+09:00
- advisor: documentation-advisor
decision: call
rationale: '확정된 로드맵을 docs/ 적절 카테고리에 영구 저장 + index 연결(docs-first 참조용). 카테고리 분류는 advisor 책임 영역.'
checked_at: 2026-06-17T15:16:00+09:00
# Invocations
- id: inv-001
layer: orchestrator
name: orchestrator
parent_invocation_id: null
input_digest: '게임잼 고도화 메모 24항목 파싱 + 기존 도메인 구조 대조'
output_digest: '소프트웨어 기능 vs 운영 로지스틱 분리 + 결합 트랙 식별 + 배치 질의 설계'
artifacts: []
concerns: []
# Decisions
- by: user
at: 2026-06-17T15:10:00+09:00
decision: '게임잼 = 기존 bibimbap 위 신규 대형기능. games/game_likes/game_comments 재사용·확장, 게임 공유/모집은 유지.'
- by: user
at: 2026-06-17T15:10:00+09:00
decision: '시상 3개 독립 트랙(상호 무관): ①심사위원 대상(심사위원 선정) ②유저평점 대상(유저 리뷰의 완성도+종합리뷰 평점 집계) ③인기투표 대상(최고 게임 투표). 스코어 대상 폐기.'
- by: user
at: 2026-06-17T15:10:00+09:00
decision: '권한 체계 = 사이트 관리권한. 관리자(전체) / 부관리자(허용된 권한만 열림 = 권한부여형). 심사위원은 관리권한과 별개. 향후 기능별 인증유저(리뷰어/포스터/기술자 등) 추가 예정.'
- by: user
at: 2026-06-17T15:10:00+09:00
decision: '포스팅 = 운영진 전용 공지·블로그 보드 + 외부링크 큐레이션. 유저 작성 절대 불가. 콘텐츠 카테고리: 유니티블로그/세션/게임잼대상 후기인터뷰/뒤끝 개발팀.'
- by: user
at: 2026-06-17T15:14:00+09:00
decision: '출품작 = 기존 games 재사용 + 잼 연결(jam_id/조인). 참가 단위 개인·팀 모두.'
- by: user
at: 2026-06-17T15:14:00+09:00
decision: '인기투표 = 게임잼 전용 1인 1표(평가기간 한정). game_likes 와 별개.'
- by: user
at: 2026-06-17T15:14:00+09:00
decision: '외부 연동: Unity WebGL 빌드 업로드 파이프라인만 in-scope(차후 단계). Discord/뒤끝 = 운영/링크/콘텐츠만, 코드 연동 없음.'
- by: user
at: 2026-06-17T15:14:00+09:00
decision: '태그 = 게임잼 + 게임(출품작) 공통 태그 테이블. 검색은 게임잼 중심.'
# Coupling Analysis (§2.7)
# 공유 자원 기준 결합 판정 — "1메모=1세션" 분할 시 재작업 폭증 방지.
foundations:
- RBAC 권한체계 (관리자/부관리자 + 기능별 인증유저 플래그) — 게임잼관리·포스팅·심사위원의 전제
- 게임잼 엔티티 + 라이프사이클 (모집→개발→평가→종료) — 대부분 기능이 매달림
- 공유 태그 모델 — 검색 + 게임잼/게임
coupled_cluster:
# 같은 데이터 도메인(평가/리뷰/투표/댓글) + 게임잼 평가기간 게이트 공유 → 한 설계로 동결 후 구현 분할
- 댓글 vs 리뷰 분리 (댓글 200자 / 리뷰 게시물당1회+평점)
- 심사위원 평가 (→ 심사위원 대상)
- 인기투표 잼전용 1인1표 (→ 인기 대상)
- 3트랙 시상 집계/결과
relatively_independent:
- 정보성/홍보성 포스팅 보드 (RBAC 포스터 권한만 의존, 평가 클러스터와 무관 → 병렬 가능)
deferred:
- Unity WebGL 빌드 업로드 파이프라인 (차후, 별도 조사 필요)
operational_only:
- Discord 공지·진행(수동, 링크 표시만) / 뒤끝 파트너·콘텐츠 / 상금·후원 표시 필드
# Open Items
- 메모 24항목 의미 확정 — 완료
- 세션 분할 단위 확정 — 완료 (S1~S7, S4 분할 세션화 확정)
- **미커밋 잔여(이번 작업 단위)**: `docs/work-log/2026-06-17-jam-platform-roadmap.md`(신규), `docs/work-log/index.md`(링크), `docs/analysis/2026-06-16-project-analysis.md`(교차링크) — 사용자 커밋 확인 대기. 브랜치 feat/v2.
- **이번 작업 단위 외 잔여(이전 세션)**: `.serena/project.yml`(M), `.serena/memories/serena_tooling.md`(??), `.atp/work-session/20260617-094450·143315`(??) — 본 세션 미관여, 별도 처리.
- **다음 시작점**: S1(RBAC) — 사용자가 새 세션에서 `/atp:task S1` 류로 진입. docs/work-log 로드맵 참조.
# verified_by_me
- L1/L2: n/a (코드 변경 0줄, 계획 수립 전용 세션)
- 문서 배치 검증: docs/work-log/2026-06-17-jam-platform-roadmap.md 본문(S1~S7 카드 + S4D/S4a~d 분할 + 의존그래프 + 크리티컬패스) grep 보존 확인. work-log/index.md 링크 1건 추가 확인. frontmatter kind/status/source_session 정상.
# needs_user_verification
- (없음) — 계획 문서 산출만. 단 미커밋 docs 3건 커밋 여부는 사용자 결정.
# graph_refresh
- skip: no-scope-change (§3.2) — src/ scope diff 0, docs/ 전용 변경. fresh 취급. (atp-graphify add-on enable 상태이나 scope 변경 없어 호출 불필요)
# project_gate
- skip: no-project-gate — 코드 변경 0, 런타임/배포 대상 없음.
# User Signals
user_signals:
positive:
- quote_or_paraphrase: '배치 질의 8건에 모두 명확·결단적으로 답변, 로드맵을 1라운드 만에 수락(S4 분할만 보강)'
about: '모호 메모 → 기존 코드 대조 파싱 → 배치 AskUserQuestion → 결합 인지 로드맵 흐름'
negative: []
# Retrospective (inline — retrospective-advisor dispatch skip)
# skip 사유: 코드 변경 0 계획 세션 + 마찰 negative 시그널 0 + 신규 교훈(기존 §2.7/§4.4 적용 외) 없음.
- what_went_well:
- 메모 24항목을 기존 엔티티(games/game_comments/game_likes/recruit_posts) 대조로 신규 vs 기존 vs 운영 분류 → 헛스코프 방지
- §2.7 결합 판정으로 "1메모=1세션" 재작업 함정 사전 차단, S4 통합설계(S4D) 동결 게이트 설계
- §4.4 배치 질의(2라운드×4) + Recommended + 기존자산 인용으로 의미 확정 효율화
what_to_improve:
- 인기투표가 game_likes 재사용 아닌 잼 전용 투표로 밝혀짐 — 1차 파싱서 좋아요=인기로 단정했던 가정을 질의로 교정(시그널 세탁 없이 반영)
memory_candidates: [] # 기존 프로토콜(§2.7/§4.4) 적용 외 신규·재현 교훈 없음 → MEMORY 반영 불필요
protocol_feedback: []
applied_changes: []
# Notes Parse (작업 입력)
# 사용자 원문 메모를 소프트웨어 기능군 vs 운영 로지스틱으로 1차 분류.
software_features:
- 게임잼 엔티티/운영 (개발기간 1주 + 평가기간 3일~1주, 상태 전이)
- 평가 체계 (심사위원제 완성도 / 인기=좋아요집계 / 스코어?)
- 리뷰 vs 댓글 분리 (리뷰=게시물당 1회+평점, 댓글=200자)
- 관리자/부관리자 RBAC
- 정보성/홍보성 포스팅 (블로그/보드)
- 태그 검색 (게임잼 검색)
- 메인페이지 통합 (게임잼 포함 전부 노출)
operational_logistics:
- 상금/후원 (치킨3마리 / 총괄 10만원 / 음료수·편의점 5000원권) — 코드 아님(상금 표시 UI 는 별개)
- Discord 공지·진행 (연동 깊이 미확정)
- Unity 엔진 (제출 메타 vs WebGL 호스팅 — 이미 /game/** 호스팅 존재)
- 뒤끝(Bekend BaaS) 개발팀 (파트너/후원 vs 기술연동 미확정)
content_seeds:
# "정보성/홍보성 포스팅" 의 예시 콘텐츠로 추정
- 유니티 블로그 / 세션 / 게임잼 대상 후기인터뷰 / 뒤끝 개발팀
# User Signals
user_signals:
positive: []
negative: []

View File

@ -0,0 +1,48 @@
---
phase: documentation
agent: documentation-advisor
agent_version: 1
generated_at: 2026-06-17T17:10:00+09:00
concerns:
- "status: active 유지 — 재구조된 로드맵은 여전히 진행 중인 계획이므로 active 유지 적절."
- "restructured_by 필드 신규 도입 — 표준 frontmatter에 없는 커스텀 필드이나, 세션 추적성을 위해 source_session 보완 용도로 허용. 과도한 필드 추가 아님."
- "documentation-guidelines.md 미존재 — docs/development/documentation-guidelines.md 파일이 없어 참조 불가. document-category-classification.md로 카테고리 판별 수행."
concerns_checked: true
---
# 문서화 보고
## 작성/수정된 문서
| 경로 | 카테고리 | 유형 | 링크 추가한 index | 교차 링크 |
|---|---|---|---|---|
| `docs/work-log/2026-06-17-jam-platform-roadmap.md` | work-log | 기존 문서 전면 재작성 | `docs/work-log/index.md` 항목 설명문 갱신 | report.md(20260617-162536) → Decisions 섹션이 본 doc 재구조 트리거로 교차 참조 |
| `docs/work-log/index.md` | work-log | 기존 index 항목 설명문 갱신 | — (index 자체) | — |
## 의사결정 기록 위치
- `.atp/work-session/20260617-162536/report.md` — Decisions 섹션에 목적 축 재분류 확정 전 과정(S1~S7 → W1~W4) 기록. Emergent Categories + final_workstreams + key_reframes 포함.
- `docs/work-log/2026-06-17-jam-platform-roadmap.md` — 재구조된 로드맵 본문. "150635 대비 핵심 교정 5건" 섹션에 교정 이유 명시. S→W 매핑 표로 추적성 보존.
## 적용한 섹션 목록
1. frontmatter — title/description/kind/status/owner/created_at/source_session 유지 + `restructured_by: 20260617-162536` 신규 필드 추가
2. 본문 도입 — 재구조 이유 + 4개 워크스트림 + 게임잼=W2 명시
3. W1 — 거버넌스/RBAC (★토대)
4. W2 — 게임잼 (★본체): W2-1~W2-6 세분화
5. W3 — 사이트 플랫폼: W3-1~W3-5 세분화, 잼 일정 분리 가능 명시
6. W4 — 유저 배지/평판 (★신규 워크스트림, 150635 누락)
7. 운영 (코드 외) 섹션
8. 의존성 그래프 / 빌드 순서 — ASCII 코드블록, 워크스트림 라벨로 재서술
9. S→W 매핑 표 — 추적성 보존 (이전 handoff 호환)
10. 150635 대비 핵심 교정 5건
## S→W 매핑 포함 여부
포함. `docs/work-log/2026-06-17-jam-platform-roadmap.md` 내 "S → W 매핑 (추적성)" 섹션에 표 형식으로 작성. 구 S1~S7 전체 매핑 + 교정 사항 명시.
## 추후 문서화가 필요한 항목
- W2-3 잼 평가 통합설계(스키마 동결) 세션 진입 시 → design.md + contracts/ 문서 신규 작성 필요 (동결 스키마 + 집계 계약)
- W4 유저 배지/평판 — 신규 발굴 워크스트림이므로 상세 requirements 확정 시 별도 work-log 또는 domain/ 문서 권장
- W3-5 Unity 업로드 조사 결과 → analysis/ 문서로 기록 필요 (빌드 포맷/검증/보안 조사)

View File

@ -0,0 +1,209 @@
---
schema_version: 2
session_id: 20260617-162536
resumed_from: null
started_at: 2026-06-17T16:25:36+09:00
ended_at: 2026-06-17T17:16:00+09:00
user_request: |
고도화를 위해 세션을 나눴었는데, 기능 관련 계획은 나뉜 것 같다.
그러나 각각 "왜 쓰고 무엇을 위해 존재하는지"(목적 축)는 명확하게 안 나뉜 것 같아
하나씩 짚어보려 한다. 제공했던 메모가 모두 게임잼을 위해 존재했던 것은 아니다.
→ 직전 세션(20260617-150635)이 메모 24항목을 전부 "게임잼 플랫폼 고도화" 프레임으로
묶은 데 대한 목적 축 재분류 요청.
---
# Summary
직전 150635 세션 산출 로드맵(S1~S7)을 "목적(존재 이유)" 축으로 재검토하는 분석 세션.
150635 는 기능 의존성(공유 자원 §2.7) 축으로는 잘 쪼갰으나, 모든 항목을 "게임잼" 목적
프레임 아래 배치 → 사이트 전반용 기능(RBAC/포스팅/태그/리뷰·댓글/Unity업로드/메인)과
게임잼 전용 기능(잼 엔티티/심사/인기투표/시상)이 목적상 섞여 보이는 framing gap.
사용자 요청 = 항목별 "게임잼 전용 vs 사이트 플랫폼 vs 공유" 목적 재분류 후 하나씩 확정.
# Advisor Invocation Decision Log
- advisor: requirements-advisor
decision: pending
rationale: '본질이 목적 축 재분류 + 사용자와 1:1 대화형 확정. advisor 는 AskUserQuestion 불가 → orchestrator 직접 대화로 의미 확정 선행. 필요 시 확정 후 로드맵 재작성을 documentation-advisor 로 위임.'
checked_at: 2026-06-17T16:26:00+09:00
- advisor: graphify-lookup / research-advisor
decision: skip
rationale: '코드 신규 조사 불요 — 기존 엔티티(games/game_comments/game_likes/recruit_posts)는 150635·110836 세션에서 확인됨. 본 세션은 기존 산출물(로드맵+decisions) 해석.'
checked_at: 2026-06-17T16:26:00+09:00
- advisor: requirements-advisor
decision: skip(완료)
rationale: '목적축 의미확정을 orchestrator 가 사용자 1:1 배치질의(S1~S7 + 플래그)로 완료. advisor 재분해 불요 — 산출 결정이 이미 확정적.'
checked_at: 2026-06-17T16:55:00+09:00
- advisor: documentation-advisor
decision: call
rationale: '확정된 W1~W4 목적 워크스트림을 로드맵 doc 에 W중심 전면 재구조로 반영. docs 카테고리/index/guidelines 준수는 advisor 책임. 사용자 "W중심 전면 재구조" 선택.'
checked_at: 2026-06-17T16:55:00+09:00
# Invocations
- id: inv-001
layer: orchestrator
name: orchestrator
started_at: 2026-06-17T16:25:36+09:00
input_digest: '150635 로드맵 + report decisions + notes parse 수집'
output_digest: '목적 축 재분류표 작성, 사용자 확정 대기'
model_choice:
phase: analyze
dispatch_size: direct
tier: large
effort: medium
resolved_model: inherit
capped: false
rationale: '프레이밍·목적 판정은 다항목 교차 추론(§5.4 axis4) → orchestrator 직접 보유. 코드 변경 0.'
# Decisions
- by: user
at: 2026-06-17T16:30:00+09:00
decision: '진행 방식 = S1부터 하나씩 목적 확정 → 종료 시 로드맵 doc 에 목적 축 반영.'
- by: user
at: 2026-06-17T16:34:00+09:00
decision: |
S1 "RBAC" 은 성격이 다른 3개가 한 카드에 뭉쳐 있었음 (150635 오분류):
1. 관리자/부관리자 = 운영 중심 설계 = 진짜 RBAC (사이트 거버넌스, 잼 무관)
2. 심사위원 = 게임잼 전용 역할 권한
3. 리뷰어 = 권한 아님, 유저 '배지/평판' 개념 (업로드 게임 인증 리뷰어) → RBAC 도메인 분리 필요
포스터/기술자 = 미확정 (후속 질의).
- by: user
at: 2026-06-17T16:40:00+09:00
decision: |
S1 플래그 4종 최종 분해:
- 포스터 = 운영 작성 권한(부관리자 토글) → S1 RBAC 흡수, 별도개념 아님
- 심사위원 = 게임잼 전용 역할 권한 → 잼 도메인으로 이관
- 리뷰어 = 유저 배지/평판 (업로드 게임 인증 리뷰어)
- 기술자 = 유저 배지/평판 (개발정보 공유/적극 업로더 인정, 임시명칭)
→ "리뷰어+기술자" = 제3의 기능군 '유저 배지/평판 시스템'. 게임잼·RBAC 와 별개.
150635 가 RBAC '인증유저 플래그' 로 통째 오분류 → 누락된 워크스트림 발굴.
# Emergent Categories (목적 축 재분류 결과 — 누적)
# 150635 의 게임잼-단일프레임을 목적별로 분해. 항목 확정될 때마다 갱신.
purpose_axes:
site_governance_rbac:
- 관리자/부관리자 권한모델 + 권한 토글(게임잼관리/포스팅작성 등) + 인터셉터 (구 S1)
game_jam_only:
- 심사위원 역할 권한 (구 S1 일부)
- 게임잼 엔티티 + 라이프사이클 + 출품작 연결 + 상세페이지 (S2)
# 속성: 회차 독립(다중 인스턴스). 통합지점: 출품작이 잼뷰 + 일반 게임노출 페이지 이중 노출(S6 로 흐름).
# 운영표시필드(Discord/상금/후원) = operational, 표시만.
user_badge_reputation: # ★신규 발굴 — 150635 누락
- 리뷰어 배지 (인증 리뷰어)
- 기술자 배지 (기여 인정, 임시명칭)
site_platform:
- 태그 모델 + 검색 = 일반 게임 발견성 중심 (S3). 잼용도: 이전회차 검색 + 진행회차 강조(부수). 잼일정 분리 가능.
- 댓글/리뷰 분리 (S4a) = 모든 게임 페이지 일반기능. 댓글 200자 / 리뷰 게시물당1회+평점.
# 리뷰주체=아무나(게임당1회), 리뷰어 배지=평판인정(→ user_badge_reputation 연결).
# 잼 게이트 없음. 잼 연결=시상(S4d)이 리뷰 평점을 단방향 집계. ★S4D 동결묶음에서 분리해야.
game_jam_only_eval:
- 심사위원 평가 (S4b) — 평가기간 게이트, S1 심사위원 역할 소비
- 인기투표 (S4c) — 잼 1인1표 평가기간, game_likes 와 별개
- 시상 집계 3트랙 (S4d) — 심사/유저평점/인기. 유저평점만 S4a 리뷰평점 단방향 집계
# ★S4D 재프레임: 잼 평가스키마(심사/투표/시상) + S4a→S4d 집계계약만 동결. 댓글/리뷰 스키마는 일반(별도설계).
site_platform_more:
- 포스팅 보드 (S5) = 사이트 콘텐츠/마케팅(공지·블로그·외부링크). 포스터=S1 운영권한. 잼은 포스팅 주제 1개로 포함. 잼일정 완전분리.
- 메인 = 게임 허브 노출 (S6) = 게임 + 잼출품작 모이는 공간. ★포스팅은 별도 메뉴(150635 "메인 통합" 교정).
- Unity WebGL 업로드 자동화 (S7) = 일반 게임 호스팅 자동화(모든 제출). 현 수동 호스팅 대체. deferred(조사선행).
# 목적 축 종합 (전 항목 확정)
# 150635 단일 "게임잼" 프레임 → 4개 목적 워크스트림 + 운영으로 분해.
final_workstreams:
W1_거버넌스_RBAC:
- 관리자/부관리자 권한모델 + 권한토글(게임잼관리/포스터=포스팅작성) + 인터셉터 (구 S1)
W2_게임잼:
- 게임잼 엔티티/라이프사이클/출품작연결/상세 (S2)
- 심사위원 역할 권한 (구 S1 일부)
- S4D 잼평가 통합설계(심사/투표/시상 스키마 + S4a→S4d 집계계약 동결)
- 심사위원평가(S4b) / 인기투표(S4c) / 시상집계(S4d)
W3_사이트플랫폼:
- 태그+검색 일반 게임 발견성 (S3)
- 댓글/리뷰 분리 일반 게임기능 (S4a)
- 포스팅 보드 별도 메뉴 (S5)
- 메인 게임 허브 노출 (S6)
- Unity 업로드 자동화 (S7, deferred)
W4_유저배지평판: # ★신규 — 150635 누락
- 리뷰어 배지(S4a 리뷰활동 기반) / 기술자 배지(기여인정, 임시명칭)
operational_표시만:
- Discord/뒤끝/상금·후원 (코드 외, 표시 필드만)
key_reframes_vs_150635:
- 댓글/리뷰(S4a) = 일반기능 → 잼 S4D 동결묶음에서 분리(시상은 단방향 집계만)
- 포스팅(S5) = 별도 메뉴, 메인(S6) 통합 아님
- 태그/검색(S3)·Unity(S7) = 사이트 일반 인프라(잼은 소비자)
- 유저 배지/평판(W4) = 누락된 신규 워크스트림 발굴
- S4D 동결 범위 = 잼 평가만으로 축소
- 의존성 그래프(빌드순서)는 유효 — 목적 축은 "왜/독립출시여부"를 추가로 분리
# Regression (§2.6)
- surfaced_at_stage: '본 세션 목적축 재검 (S1)'
source_stage: '150635 requirements/notes-parse'
defect: '"기능별 인증유저 플래그(리뷰어/포스터/심사위원/기술자)" 를 전부 RBAC 권한으로 동질 취급 → 리뷰어=배지(평판) 오분류'
full_set_recheck: true
downstream_rerun: ['로드맵 S1 카드 목적 재서술', '잔여 플래그(포스터·기술자) 전수 재확인']
resolved_at: null
# Open Items
- 항목별 목적 축(게임잼전용/사이트플랫폼/공유) 사용자 확정
- 로드맵 doc 재프레이밍 여부 결정 (게임잼 = 워크스트림 1개 vs 전체 프레임)
# ── 세션 종료 (§9) ──
# Conflicts
- (없음) — 단일 documentation-advisor, advisor 간 충돌 없음.
# verified_by_me
- L1/L2: n/a — 코드 변경 0줄(docs 전용 재구조 세션).
- 문서 검증(직접 Read): roadmap doc 본문에 W1~W4 + 운영 + 의존성 그래프(ASCII) + S→W 매핑표(구 S1~S7 전체) + 교정 5건 보존 확인. frontmatter title/description/restructured_by 갱신 확인. work-log/index.md 링크 설명문 W중심으로 갱신 확인.
# needs_user_verification
- (없음) — 계획 문서 재구조만. 런타임/배포 대상 없음.
# graph_refresh
- skip: no-scope-change (§3.2) — src/·pom.xml diff 0, docs/ + work-session 전용. fresh 취급.
# project_gate
- skip: no-project-gate — 코드 변경 0.
# Open Items / 미커밋 잔여 (§9.5)
# 이번 작업 단위 (162536):
- docs/work-log/2026-06-17-jam-platform-roadmap.md — 전면 재작성(W중심). 직전 150635 untracked 위에 갱신.
- docs/work-log/index.md (M) — 링크 설명문 갱신.
- .atp/work-session/20260617-162536/ — 본 세션 durable history(추적 기본, ADR-0010).
# 이번 단위 외 잔여 (이전 세션 — 본 세션 미관여):
- .serena/project.yml (M), .serena/memories/serena_tooling.md (??)
- .atp/work-session/{20260617-094450,143315,150635}/ (??) ← 150635 roadmap 원본 포함
- docs/analysis/2026-06-16-project-analysis.md (M)
# 커밋 정책: harness "사용자 요청 시에만 커밋". 자동 커밋 안 함 → 사용자 결정 대기. 브랜치 feat/v2.
# User Signals
user_signals:
positive:
- quote_or_paraphrase: 'S1~S7 + 플래그 8건 배치질의에 모두 결단적·구체 답변(리뷰어=배지, 기술자=배지, 포스터=운영권한, S6 포스팅 별도메뉴 등), 목적축 재분류 1회 수락'
about: '목적축 1:1 워크스루 → W중심 재구조 흐름'
negative: []
# Regression (§2.6) — 마감
- surfaced_at_stage: '본 세션 목적축 재검 (S1~S7 전수)'
source_stage: '150635 requirements/notes-parse (의존성축 분할 시 목적축 누락)'
defect: '메모를 의존성/공유자원 축으로만 분할 → 단일 "게임잼" 목적 프레임이 비대상 기능(RBAC·태그·댓글리뷰·포스팅·메인·Unity)을 흡수. "인증유저 플래그"를 동질 취급해 리뷰어/기술자(배지) 오분류 → W4 워크스트림 누락.'
full_set_recheck: true # S1~S7 전수 목적 재확인
downstream_rerun: ['로드맵 doc W중심 전면 재구조', 'index.md 링크 갱신']
resolved_at: 2026-06-17T17:15:00+09:00
# Retrospective (inline — retrospective-advisor dispatch skip)
# skip 사유: 코드 변경 0 + 본 세션 마찰 negative 0. 단 150635 발원 구조결함 1건 표면화 → 재현성 교훈 존재 → memory_candidate 1건 제안.
- what_went_well:
- 의존성축(150635) vs 목적축(본 세션) 2축 분리 인지 → 사용자 ground truth 로 항목별 "왜 존재" 1:1 확정
- 다항목(플래그 4종) 한 항목 결함(리뷰어=배지) 발견 시 §2.6 전수 재검 → W4 누락 워크스트림 발굴
- documentation-advisor self-contained 브리프로 W중심 재구조 1회 완결
what_to_improve:
- 기획/세션분할 세션에서 의존성축만으로 쪼개면 목적축(왜/누구를 위한가)이 단일 프레임에 묻힘 — 분할 시 두 축 병행 확인 필요
memory_candidates:
- name: planning-purpose-vs-dependency-axis
type: feedback
description: '기능 요청을 세션/단위로 분할할 때 의존성 축(빌드순서)과 목적 축(왜 존재/누구를 위한가)을 분리 확인. 한 축만으로 쪼개면 비대상 기능이 단일 프레임에 흡수되고, 묶음 라벨("인증유저 플래그" 등) 동질 취급이 도메인 오분류(권한 vs 배지/평판)를 부른다.'
rationale_for_saving: '150635(의존성축 우수) → 목적축 누락으로 4개 워크스트림이 단일 게임잼 프레임에 흡수된 실증. 기획 세션 재발 가능.'
signal_source: positive
docs_sync_target: null # 내부 기획 흐름 교훈 → MEMORY 단독. (프로토콜 §2.7/§4.2.2 와 인접하나 planning-split 특화)
protocol_feedback: []
applied_changes: []
# ended_at: 2026-06-17T17:16:00+09:00

View File

@ -0,0 +1,25 @@
# 기획 분할: 의존성 축 + 목적 축 병행 확인
type: feedback
source_session: 20260617-162536 (발원 결함: 20260617-150635)
## 교훈
기능 요청을 세션/단위로 **분할**할 때 두 축을 **병행** 확인한다. 한 축만 쓰면 결함이 난다.
1. **의존성 축** (빌드 순서 / 공유 자원, ATP §2.7) — "먼저 뭐가 필요한가". 재작업 방지용.
2. **목적 축** (왜 존재 / 누구를 위한가) — "이게 특정 기능(예: 게임잼) 때문에 생긴 건가, 사이트 전반용인가".
## 실패 모드 (의존성 축만 쓸 때)
- 단일 프레임(예: "게임잼 플랫폼 고도화")이 **비대상 기능을 흡수** → 사이트 전반 기능이 불필요하게 그 일정/스코프에 결합되어 독립 출시 기회를 잃음.
- 묶음 라벨("인증유저 플래그" 등)을 **동질 취급**하면 도메인 오분류 발생 — 권한(RBAC) vs 배지/평판은 다른 도메인인데 한 통에 들어감.
## 실증
- 20260617-150635: 의존성 축으로 S1~S7 로 잘 쪼갬. 그러나 전부 "게임잼" 목적 프레임.
- 20260617-162536: 목적 축 재검 → 4개 워크스트림 중 W1(거버넌스)·W3(사이트플랫폼)·W4(유저배지)가 게임잼 무관/독립으로 드러남. W4(리뷰어/기술자 배지)는 RBAC 플래그로 오분류돼 **통째 누락**됐다가 발굴됨.
## 적용 체크
- 분할 직후 각 항목에 1:1로 묻는다: "이 기능, 특정 대상(잼 등) 없으면 존재 이유가 있나?" → 있으면 사이트 전반(독립), 없으면 전용.
- 묶음 라벨은 항목별로 도메인(권한 / 평판·배지 / 일반기능)을 따로 판정.
- 로드맵 산출에 "특정 일정과 분리 가능 여부"를 항목별 명시.
관련 프로토콜: §2.7(결합 트랙 게이트), §4.2.2(톤/어휘 두 축 분리), §2.6(다항목 전수 재검).

View File

@ -0,0 +1,15 @@
# Serena Tooling Scope — bibimbap
`.serena/project.yml``languages: [java, html]` (java = 기본/fallback LS).
## 파일 타입별 도구 적용
- **`.java`** (31): LSP(EclipseJDTLS) 활성. `get_symbols_overview`/`find_symbol`/`find_referencing_symbols`/`replace_symbol_body` 등 심볼 도구 **사용**.
- **`.jsp` / `.jspf`** (16+1, `webapp/WEB-INF/views/`): **LSP 미지원**. Serena HTML LS 매처는 `.html`/`.htm` 만 잡고 `.jsp` 는 안 잡힘 (매처는 solidlsp `ls_config.py` enum 하드코딩, 프로젝트별 확장자 override 없음). → `.jsp` 작업은 file 도구(read) + `replace_content`(regex) 사용. `find_symbol` 헛호출 금지.
- **`.html`/`.htm`**: html LS 대상이나 현재 프로젝트에 **0개**. (정적 페이지 추가 시 자동 심볼 지원, node v22 필요 — 설치됨.)
- **`.js`/`.css`**: 별도 파일 없음. JSP 내 인라인 `<script>`/`<style>` 만 존재 → JSP 와 동일하게 file/regex 도구.
## 제외 경로
`target/`·`build/` 는 `.gitignore` + `ignore_all_files_in_gitignore: true` 로 자동 제외. 추가 `ignored_paths` 불필요.
## 백엔드
`language_backend: LSP` (전역). JetBrains 아님.

View File

@ -33,6 +33,10 @@ project_name: "bibimbap"
# Note that when using the JetBrains backend, language servers are not used and this list is correspondingly ignored.
languages:
- java
- html
- bash
- json
- yaml
# the encoding used by text files in the project
# For a list of possible encodings, see https://docs.python.org/3.11/library/codecs.html#standard-encodings

View File

@ -216,3 +216,4 @@ Java/Maven 웹앱(Spring Boot 3 MVC + MyBatis + PostgreSQL, JSP 뷰) 전면 read
- [db-update-query-generator.md](../db-update-query-generator.md) — `DbUpdateQueryGeneratorTest` 운영 도구(D3 테스트 항목 관련)
- [user-signup-schema.md](../user-signup-schema.md) — `users`/`user_auth_identities` 스키마 상세(D4 데이터 모델 관련)
- 카테고리 분류 기준: [development/document-category-classification.md](../development/document-category-classification.md)
- 이 분석을 기반으로 확정된 고도화 실행 계획: [work-log/2026-06-17-jam-platform-roadmap.md](../work-log/2026-06-17-jam-platform-roadmap.md)

View File

@ -0,0 +1,223 @@
---
kind: work-log
title: bibimbap 플랫폼 고도화 — 목적별 워크스트림 로드맵
description: 150635 단일 게임잼 프레임을 4개 목적 워크스트림(거버넌스/게임잼/사이트플랫폼/유저배지)+운영으로 재구조. 게임잼은 그 중 하나. 의존성(빌드순서) 유지 + 잼일정 분리가능 여부 명시.
status: active
source_session: 20260617-150635
restructured_by: 20260617-162536
created_at: 2026-06-17
owner: art
---
# bibimbap 플랫폼 고도화 — 목적별 워크스트림 로드맵
기존 bibimbap(게임 공유 + 팀원 모집, Spring Boot + MyBatis + JSP) 위에 신규 기능군을 얹는다.
**핵심 재구조 이유**: 이전 로드맵(20260617-150635)은 의존성/공유자원 축으로는 잘 쪼갰으나, 모든 항목을 단일 "게임잼 플랫폼 고도화" 목적 프레임 아래 배치했다. 재검토 결과, 제공한 메모가 전부 게임잼용이 아니었다. 항목별 "왜 존재하나(목적)"를 1:1로 재확정한 결과, **4개 목적 워크스트림 + 운영**으로 분해됐다.
- 게임잼은 4개 워크스트림 중 하나(W2)다.
- 사이트 전반 기능(태그검색·댓글리뷰·포스팅·메인·Unity업로드)과 유저 배지/평판은 게임잼 회차 일정과 무관하게 독립 진행 가능.
- 의존성 그래프(빌드 순서)는 그대로 유효하다 — 워크스트림 라벨로 재서술했을 뿐.
---
## W1 — 거버넌스 / RBAC ★토대
**목적**: 사이트 거버넌스(운영진 관리). 게임잼이 없어도 필요한 토대.
- **포함**:
- 관리자(전체) / 부관리자(허용된 권한만 = 권한부여형) 모델
- 관리자 콘솔 — 부관리자 임명 + 권한 토글
- 권한 체크 인터셉터
- 권한 토글 항목 예시: 게임잼관리, 포스팅작성(= 포스터 권한)
- **게임잼 관계**: 소비자 — 게임잼관리 권한·심사위원 역할이 이 위에 얹힘.
- **잼 일정 분리**: 가능(토대, 독립).
- **의존**: 없음.
- **공유 자원**: `users`, `security/`, 세션/인증.
---
## W2 — 게임잼 ★본체
**목적**: 게임잼 운영·평가·시상 그 자체. 잼이 없으면 존재 이유 없음.
- **잼 일정 분리**: 불가(잼 그 자체).
- **의존**: W1.
### W2-1 — 게임잼 엔티티 + 라이프사이클
- `jams` 테이블, 상태전이(모집→개발→평가→종료), 개발기간/평가기간 필드
- 관리자 게임잼 CRUD, 게임잼 목록/상세 페이지
- 회차 독립(다중 인스턴스)
- 출품작 = 기존 `games` 재사용 + 잼 연결(`jam_id`/조인). 개인·팀 모두.
- 출품작 이중 노출 — 잼 전용 뷰 + 일반 게임 허브
- 운영 표시 필드: Discord 링크 / 상금 / 후원사 (표시만)
### W2-2 — 심사위원 역할 권한
- W1 위에 얹히는 잼 전용 역할
- 권한 체크: 심사위원만 심사 점수 입력 가능
### W2-3 — 잼 평가 통합설계 (스키마 동결) ⚠️결합 클러스터
> 범위 = 잼 평가만. 댓글/리뷰 스키마 자체는 W3에서 설계(동결 묶음 아님).
- 심사 점수 / 잼 투표 / 시상 집계 스키마 확정·동결
- "W3 댓글/리뷰의 리뷰 평점 → 시상 유저평점 트랙" 단방향 집계 계약
- 평가기간 게이트 계약
- **권장 진입**: design-advisor
- **산출**: design.md + DB 스키마(동결) + contracts
### W2-4 — 심사위원 평가
- 권한자(심사위원) 점수 입력 → 심사위원 대상 집계
- **의존**: W2-3 동결 완료, W2-2(심사위원 권한)
### W2-5 — 인기투표
- 잼 전용 1인 1표, 평가기간 한정, `game_likes`와 별개
- **의존**: W2-3 동결 완료
### W2-6 — 시상 집계 / 결과
- 3트랙 산정: 심사 / 유저평점(W3 리뷰 평점 집계) / 인기 → 수상 표시
- **의존**: W2-4, W2-5, W3 댓글리뷰 평점
---
## W3 — 사이트 플랫폼 (전부 잼 일정 독립)
**목적**: 일반 게임/콘텐츠 사이트 기능. 게임잼은 소비자 중 하나.
- **잼 일정 분리**: 전부 가능(독립 출시 가능).
### W3-1 — 태그 + 검색
- **목적**: 일반 게임 발견성 중심. 잼 용도(이전 회차 검색 / 진행 회차 강조)는 부수.
- 공유 `tags` + 조인테이블(game/jam), 게임잼 태그 검색 UI/쿼리
- **의존**: W2 게임잼 엔티티 (잼 태그 연결 시에만). 단독 게임 태그는 독립.
### W3-2 — 댓글 / 리뷰 분리
- **목적**: 모든 게임 페이지 일반 기능. 잼 평가기간 게이트 없음.
- `game_comments` 200자 + 리뷰(게시물당 1회, 완성도+종합 평점)
- 리뷰 작성 주체 = 아무나(게임당 1회)
- 잼 연결 = 시상(W2-6)이 리뷰 평점을 단방향 집계할 뿐. 이 기능 자체는 잼과 무관.
- **의존**: 없음(독립).
### W3-3 — 포스팅 보드
- **목적**: 사이트 공지·블로그 + 외부링크 큐레이션. **별도 메뉴**로 운영.
- 포스터 권한자(W1)만 작성. 유저 작성 차단.
- 카테고리: 유니티블로그 / 세션 / 게임잼대상 후기인터뷰 / 뒤끝 개발팀
- 게임잼은 포스팅 주제 중 하나로 포함될 뿐 — 포스팅 보드가 게임잼에 의존하지 않음.
- **의존**: W1(포스터 권한).
### W3-4 — 메인페이지 (게임 허브)
- **목적**: `index.jsp` 에 게임 + 잼 출품작이 모이는 공간.
- 포스팅은 별도 메뉴 — 메인 통합 아님.
- **의존**: W2 게임잼 엔티티(잼 출품작 노출 시).
### W3-5 — Unity WebGL 빌드 업로드 자동화 ⏸deferred
- **목적**: 일반 게임 호스팅 자동화(모든 제출). 현 수동 호스팅 대체.
- 업로드 → 검증 → `/game/{uuid}/` 배치
- **선행**: 별도 조사(빌드 포맷/검증/보안 — zip-slip 등)
- 게임잼과 무관한 일반 인프라.
---
## W4 — 유저 배지 / 평판 ★신규 (150635 누락)
**목적**: 커뮤니티 기여 인정. 권한 아님, 평판/배지. 게임잼·RBAC와 별개 도메인.
- **포함**:
- **리뷰어 배지**: 업로드 게임 인증 리뷰어. W3 리뷰 활동/품질 기반 부여.
- **기술자 배지**: 개발 정보 공유·적극 업로더 인정. ("기술자"는 임시명칭)
- **배경**: 150635가 리뷰어/기술자를 RBAC "인증유저 플래그"로 오분류 → 본 재검에서 별도 워크스트림으로 발굴.
- **잼 일정 분리**: 가능(독립).
- **의존**: 활동 소스(W3 리뷰 등) 존재 후. 독립 출시 가능.
---
## 운영 (코드 외)
- **Discord**: 공지·진행은 수동 운영. 코드는 게임잼 상세에 초대 링크 표시(W2-1 흡수).
- **뒤끝(Bekend)**: 파트너/콘텐츠 — 포스팅 카테고리로만 등장(W3-3).
- **상금·후원**(치킨/10만원/편의점 5000원권): 게임잼 상세 표시 필드(W2-1) + 실제 지급은 수동.
---
## 의존성 그래프 / 빌드 순서
```
W1 거버넌스/RBAC ─────────────────────────────────────────────── ★최우선 토대
├──> W2-1 게임잼 엔티티 + 라이프사이클
│ │
│ ├──> W2-2 심사위원 역할 권한
│ │
│ ├──> W2-3 잼 평가 통합설계(스키마 동결)
│ │ │
│ │ ├──> W2-4 심사위원 평가 ──────────────────┐
│ │ │ │
│ │ └──> W2-5 인기투표 ─────────────────────┐ │
│ │ │ │
│ │ W3-2 댓글/리뷰(독립) ──[리뷰평점 단방향집계]──┤ │
│ │ ↓ ↓
│ │ W2-6 시상 집계
│ │
│ ├──> W3-1 태그+검색 (잼 태그 연결 시)
│ └──> W3-4 메인 허브 (잼 출품작 노출 시)
├──> W3-3 포스팅 보드 (W1 후 병렬 가능, 잼 독립)
└──> W4 유저 배지/평판 (W3 활동 소스 후, 독립)
W3-2 댓글/리뷰 ── 독립(잼 무관, 단 W2-6이 평점 집계)
W3-5 Unity 업로드 ── deferred (조사 선행 필요)
```
**크리티컬 패스**: W1 → W2-1 게임잼 엔티티 → W2-3 잼 평가 통합설계 → W2-6 시상 집계
**병렬 가능**:
- W1 완료 후: W3-3 포스팅(잼 독립)
- W2-1 완료 후: W3-1 태그검색, W3-4 메인 허브
- W3-2 댓글/리뷰: 언제든 독립 진행 가능
- W4 배지: W3 활동 소스 존재 후 독립 진행
---
## S → W 매핑 (추적성)
이전 세션 및 handoff가 S1~S7 레이블을 참조하므로 매핑을 유지한다.
| 구 레이블 | 새 워크스트림 | 교정 사항 |
|---|---|---|
| S1 RBAC | W1(관리자/부관리자/권한토글) + W2-2(심사위원 역할) + **W4(리뷰어/기술자 배지, 오분류 교정)** | 리뷰어·기술자는 RBAC 아닌 배지/평판으로 재분류 |
| S2 게임잼 엔티티 | W2-1 | 변동 없음 |
| S3 태그+검색 | W3-1 | 목적 재확인: 일반 발견성 중심, 잼은 소비자 |
| S4D 평가 통합설계 | W2-3 | **범위 축소**: 잼 평가(심사/투표/시상) 스키마만 동결. 댓글/리뷰 스키마는 W3-2에서 별도 설계 |
| S4a 댓글/리뷰 분리 | W3-2 | **일반기능으로 재분류**: 잼 평가 동결묶음에서 분리. 시상은 단방향 집계만 |
| S4b 심사위원 평가 | W2-4 | 변동 없음 |
| S4c 인기투표 | W2-5 | 변동 없음 |
| S4d 시상 집계 | W2-6 | 변동 없음 |
| S5 포스팅 보드 | W3-3 | **별도 메뉴 명확화**: 메인 통합 아님 |
| S6 메인페이지 | W3-4 | **교정**: 포스팅 통합 아님. 게임+잼 출품작 허브만 |
| S7 Unity 업로드 | W3-5 | 목적 재확인: 일반 인프라, 잼 의존 아님. deferred 유지 |
| *(누락)* | **W4 유저 배지/평판** | 신규 발굴 워크스트림 |
---
## 150635 대비 핵심 교정 5건
1. **댓글/리뷰(구 S4a) = 일반기능** → 잼 평가 동결묶음에서 분리. 시상(W2-6)은 리뷰 평점을 단방향으로 집계할 뿐이며, 댓글/리뷰 자체는 잼과 무관하게 독립 진행 가능.
2. **포스팅(구 S5) = 별도 메뉴** → 메인(구 S6) 통합 아님. 메인은 게임+잼 출품작 허브이고, 포스팅은 별도 메뉴로 운영.
3. **태그검색(구 S3)·Unity업로드(구 S7) = 사이트 일반 인프라** → 잼은 소비자 중 하나일 뿐, 이 기능들이 게임잼을 위해 존재하는 것이 아님.
4. **유저 배지/평판(W4) = 누락됐던 신규 워크스트림** → 리뷰어·기술자가 S1 RBAC "인증유저 플래그"로 오분류됐던 것을 별도 도메인(평판/배지)으로 발굴·분리.
5. **잼 평가 통합설계(구 S4D) 동결 범위 축소** → 잼 평가(심사/투표/시상) 스키마만 동결 대상. 댓글/리뷰 스키마는 W3-2에서 별도 설계하며 동결 묶음 아님.

View File

@ -4,4 +4,4 @@
## 목록
_(아직 문서 없음)_
- [2026-06-17-jam-platform-roadmap.md](./2026-06-17-jam-platform-roadmap.md) — bibimbap 플랫폼 고도화 목적별 워크스트림 로드맵. 4개 W(W1 거버넌스/RBAC · W2 게임잼 · W3 사이트플랫폼 · W4 유저배지)+운영으로 재구조. 게임잼은 W2 하나. 의존성(빌드순서) 유지 + 잼일정 분리가능 여부 명시. S→W 매핑 + 150635 대비 교정 5건 포함. `status: active`, source_session: 20260617-150635, restructured_by: 20260617-162536.