From 2eb0be565431c2d930e640c6c1509269e631f358 Mon Sep 17 00:00:00 2001 From: art Date: Wed, 17 Jun 2026 17:20:53 +0900 Subject: [PATCH] =?UTF-8?q?docs:=20=EA=B3=A0=EB=8F=84=ED=99=94=20=EB=A1=9C?= =?UTF-8?q?=EB=93=9C=EB=A7=B5=20=EB=AA=A9=EC=A0=81=EC=B6=95=20=EC=9E=AC?= =?UTF-8?q?=EA=B5=AC=EC=A1=B0=20(=EA=B2=8C=EC=9E=84=EC=9E=BC=20=EB=8B=A8?= =?UTF-8?q?=EC=9D=BC=ED=94=84=EB=A0=88=EC=9E=84=20=E2=86=92=20W1~W4=20?= =?UTF-8?q?=EC=9B=8C=ED=81=AC=EC=8A=A4=ED=8A=B8=EB=A6=BC)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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) --- .atp/work-session/20260617-094450/report.md | 146 ++++++++++++ .atp/work-session/20260617-143315/report.md | 36 +++ .../20260617-150635/artifacts/jam-roadmap.md | 103 ++++++++ .../20260617-150635/documentation.md | 43 ++++ .atp/work-session/20260617-150635/report.md | 154 ++++++++++++ .../20260617-162536/documentation.md | 48 ++++ .atp/work-session/20260617-162536/report.md | 209 ++++++++++++++++ .../planning-purpose-vs-dependency-axis.md | 25 ++ .serena/memories/serena_tooling.md | 15 ++ .serena/project.yml | 4 + docs/analysis/2026-06-16-project-analysis.md | 1 + .../2026-06-17-jam-platform-roadmap.md | 223 ++++++++++++++++++ docs/work-log/index.md | 2 +- 13 files changed, 1008 insertions(+), 1 deletion(-) create mode 100644 .atp/work-session/20260617-094450/report.md create mode 100644 .atp/work-session/20260617-143315/report.md create mode 100644 .atp/work-session/20260617-150635/artifacts/jam-roadmap.md create mode 100644 .atp/work-session/20260617-150635/documentation.md create mode 100644 .atp/work-session/20260617-150635/report.md create mode 100644 .atp/work-session/20260617-162536/documentation.md create mode 100644 .atp/work-session/20260617-162536/report.md create mode 100644 .serena/memories/planning-purpose-vs-dependency-axis.md create mode 100644 .serena/memories/serena_tooling.md create mode 100644 docs/work-log/2026-06-17-jam-platform-roadmap.md diff --git a/.atp/work-session/20260617-094450/report.md b/.atp/work-session/20260617-094450/report.md new file mode 100644 index 0000000..c2e9e94 --- /dev/null +++ b/.atp/work-session/20260617-094450/report.md @@ -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 origin/` 로 + 동기화 확인, 또는 시뮬레이션 base 를 `origin/` 로 직접 지정. + - 추론 기반 위험 경고를 보고에 실을 때는 "어느 ref 를 baseline 으로 시뮬레이션했는가"를 + 함께 명시 — 전제가 드러나면 stale 오판을 자가 포착하기 쉬워진다. + - 충돌 머지 결과는 블롭 해시 수준으로 결정론 검증(git diff --cached -- ). + 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: [] diff --git a/.atp/work-session/20260617-143315/report.md b/.atp/work-session/20260617-143315/report.md new file mode 100644 index 0000000..dc6c439 --- /dev/null +++ b/.atp/work-session/20260617-143315/report.md @@ -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). diff --git a/.atp/work-session/20260617-150635/artifacts/jam-roadmap.md b/.atp/work-session/20260617-150635/artifacts/jam-roadmap.md new file mode 100644 index 0000000..fb73816 --- /dev/null +++ b/.atp/work-session/20260617-150635/artifacts/jam-roadmap.md @@ -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) + 실제 지급은 수동. diff --git a/.atp/work-session/20260617-150635/documentation.md b/.atp/work-session/20260617-150635/documentation.md new file mode 100644 index 0000000..bf85884 --- /dev/null +++ b/.atp/work-session/20260617-150635/documentation.md @@ -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 갱신 권장 diff --git a/.atp/work-session/20260617-150635/report.md b/.atp/work-session/20260617-150635/report.md new file mode 100644 index 0000000..e6c20c8 --- /dev/null +++ b/.atp/work-session/20260617-150635/report.md @@ -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: [] diff --git a/.atp/work-session/20260617-162536/documentation.md b/.atp/work-session/20260617-162536/documentation.md new file mode 100644 index 0000000..513b751 --- /dev/null +++ b/.atp/work-session/20260617-162536/documentation.md @@ -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/ 문서로 기록 필요 (빌드 포맷/검증/보안 조사) diff --git a/.atp/work-session/20260617-162536/report.md b/.atp/work-session/20260617-162536/report.md new file mode 100644 index 0000000..8e67fb6 --- /dev/null +++ b/.atp/work-session/20260617-162536/report.md @@ -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 diff --git a/.serena/memories/planning-purpose-vs-dependency-axis.md b/.serena/memories/planning-purpose-vs-dependency-axis.md new file mode 100644 index 0000000..f260678 --- /dev/null +++ b/.serena/memories/planning-purpose-vs-dependency-axis.md @@ -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(다항목 전수 재검). diff --git a/.serena/memories/serena_tooling.md b/.serena/memories/serena_tooling.md new file mode 100644 index 0000000..049b72d --- /dev/null +++ b/.serena/memories/serena_tooling.md @@ -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 내 인라인 `