chore: Serena onboarding 메모리 + graphify 지식그래프(src·docs) 생성

- .serena/memories/: 프로젝트 onboarding 메모리 6종(core/tech_stack/
  suggested_commands/conventions/task_completion/graphify_workflow)
- docs/graph/: graphify src(384N/613E/23C)·docs(44N/56E/7C) 스코프 생성,
  index.md 메타·Scopes 표 갱신 (graph 본체 html/json/audit 는 gitignore)
- .atp/work-session/20260616-123205/: ATP 세션 보고서

Serena Java LSP 가 사내 SSL 검사 프록시(Cloudflare Gateway CA)로 IntelliCode
다운로드에 실패하던 것을 CA 번들(certifi+System keychain) MCP env 지정으로
해결한 뒤 진행.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
이정수 2026-06-16 14:13:51 +09:00
parent 33a4465e0e
commit d297f31f72
9 changed files with 263 additions and 5 deletions

View File

@ -0,0 +1,127 @@
---
schema_version: 2
session_id: 20260616-123205
resumed_from: null
started_at: 2026-06-16T12:32:05+09:00
ended_at: 2026-06-16T13:03:00+09:00
user_request: |
PR 생성까지했었는데 생각해보니 세레나 설정 및 그래피파이 생성을 안했더라고.
→ Serena onboarding(memories 생성) + graphify 지식그래프 생성 두 가지 미수행분 보강.
---
# Summary
PR(docs/project-analysis 브랜치) 까지 진행된 상태에서 누락된 두 운영 작업 보강:
(1) Serena onboarding — `.serena/memories/` 비어있음. project.yml(languages: java) config 자체는 존재.
(2) Graphify 생성 — `docs/graph/index.md` 가 placeholder(scopes: [], last_generated_at: null), 실제 산출물 없음.
코드 로직 변경 0건의 artifact 생성 작업이므로 advisor 파이프라인 없이 orchestrator 직접 수행(§1 meta/tool-exec 예외).
# Advisor Invocation Decision Log
- advisor: requirements-advisor
decision: skip
rationale: '요청 명확 — 누락분(serena onboarding + graphify) 보강. 스코프 결정 1건만 사용자 확인.'
checked_at: 2026-06-16T12:32:05+09:00
- advisor: research-advisor / graphify-lookup-advisor
decision: skip
rationale: '외부/그래프 조회 불필요. 현재 코드베이스 자체가 입력.'
checked_at: 2026-06-16T12:32:05+09:00
- advisor: design-advisor / implementation-advisor
decision: skip
rationale: '코드 설계/구현 아님 — serena tool + /graphify skill 직접 실행. artifact 생성.'
checked_at: 2026-06-16T12:32:05+09:00
- advisor: verification-advisor
decision: skip
rationale: '코드 변경 0줄(§9 의무 트리거 미해당). 대신 생성 산출물 존재/메타 정합성 직접 확인.'
checked_at: 2026-06-16T12:32:05+09:00
# Invocations
- id: inv-001
layer: orchestrator
name: orchestrator
started_at: 2026-06-16T12:32:05+09:00
input_digest: 'serena/graph 상태 파악 + 프로토콜 로드'
output_digest: 'serena onboarding 미수행 + graphify placeholder 확인 + Java LSP SSL 실패 진단·fix'
- id: inv-002
layer: orchestrator
name: orchestrator
input_digest: 'Serena onboarding — 코드베이스 LSP/Read 탐색'
output_digest: 'memory 5종 작성(core/tech_stack/suggested_commands/conventions/task_completion)'
- id: inv-003
layer: worker
name: graphify-semantic-subagent (src chunk1)
parent_invocation_id: inv-002
input_digest: 'src 코드 16파일 semantic 추출'
output_digest: '16 nodes, 19 edges, 3 hyperedges'
model_choice: { phase: graphify-exec, dispatch_size: s-batch, tier: medium, resolved_model: inherit, rationale: 'AST 보완 semantic 엣지 추출 — 기계적, medium' }
- id: inv-004
layer: worker
name: graphify-semantic-subagent (src chunk2)
parent_invocation_id: inv-002
input_digest: 'src 코드 15파일 semantic 추출'
output_digest: '15 nodes, 29 edges, 3 hyperedges'
model_choice: { phase: graphify-exec, dispatch_size: s-batch, tier: medium, resolved_model: inherit, rationale: 'src chunk2' }
- id: inv-005
layer: worker
name: graphify-semantic-subagent (docs)
parent_invocation_id: inv-002
input_digest: 'docs 23파일(md21+sql2) 개념/인용/rationale 추출'
output_digest: '44 nodes, 59 edges, 3 hyperedges'
model_choice: { phase: graphify-exec, dispatch_size: s-batch, tier: medium, resolved_model: inherit, rationale: 'docs 단일 청크' }
# Decisions
- by: orchestrator
at: 2026-06-16T12:34:00+09:00
decision: 'graphify scope = src + docs (사용자 선택)'
rationale: '코드 그래프 + 문서 지식그래프 양쪽 매핑 요청'
- by: user
at: 2026-06-16T12:40:00+09:00
decision: 'Serena Java LSP archive 추출 실패 발견 → 복구 안내 후 세션 중단(halt). memories/graphify 는 LSP 복구 후 재개.'
rationale: 'LSP 깨진 채로 진행하면 향후 코딩 세션의 심볼 지능이 무력. 전역 캐시 재설치는 MCP 재시작 필요 → 사용자 수동 수행.'
# Conflicts
# Open Items
- (없음) — 두 작업 모두 완료.
# verified_by_me
- Serena LSP fix: CA 번들로 실패 URL TLS 검증 status 200 OK. 사용자 재시작 후 LSP probe(get_symbols_overview) "Error extracting archive" 소멸 → Java LS 기동 확인.
- Serena onboarding: `list_memories` 6종(memory_maintenance + core/tech_stack/suggested_commands/conventions/task_completion) 확인, 디스크 파일 존재.
- graphify src: `docs/graph/src/{graph.html,graph.json,audit.md}` 생성 (384 nodes/613 edges/23 communities). 토큰 벤치 28.6x.
- graphify docs: `docs/graph/docs/{graph.html,graph.json,audit.md}` 생성 (44 nodes/56 edges/7 communities).
- index.md 메타(frontmatter scopes/source_commit/last_generated_at + Scopes 표) 갱신. graph 본체 gitignore 검증 (`git check-ignore` 통과).
- 코드 로직 변경 0건 → L1/L2 검증 N/A (verify 스크립트 대상 없음).
- 정리: 입력경로 하위 `src/graphify-out`·`docs/graphify-out` transient 캐시 제거(소스트리 오염·오커밋 방지).
# needs_user_verification
- (선택) `docs/graph/src/graph.html` / `docs/graph/docs/graph.html` 브라우저로 열어 그래프 시각 확인.
# graph_refresh
- 이번 세션이 graphify **최초 생성** (no-graph → 생성). scope: src, docs. graph-refresh-checker 는 본 작업이 곧 생성이므로 생략.
# User Signals
user_signals:
positive: []
negative:
- quote_or_paraphrase: '세레나 설정 및 그래피파이 생성을 안했더라고'
about: '직전 PR 세션에서 onboarding/graphify 누락. 단발 누락인지 절차 허점인지 retro 에서 판정.'
structural: false
# Retrospective
- signals:
positive:
- 'LSP 근인 진단(SSL MITM)→fix→TLS 검증→재시작 경로를 한 번에 수락'
negative:
- '직전 PR 세션에서 onboarding/graphify 누락 (이번 보강으로 해소, 단발)'
- what_went_well:
- '캐시 삭제로 안 풀리던 LSP 실패를 로그 traceback 까지 파고들어 진짜 근인(IntelliCode 호스트 SSL CERT_VERIFY_FAILED = 사내 Cloudflare Gateway MITM) 특정.'
- 'fix 를 텍스트 추정이 아니라 serena Python requests 로 실패 URL 실제 검증(status 200)한 뒤 적용 — §4.6 실행 검증 정신.'
- 'graphify scope src/docs 분리 + 자기 산출물(docs/graph/*) detect 제외 + 정적 이미지 제외로 노이즈 억제.'
- what_to_improve:
- 'graphify 가 입력경로 하위에 `graphify-out/` 캐시를 남김 — 매 실행 후 정리 필요(이번에 src/·docs/ 양쪽 발견). 워크플로 메모리에 명시.'
- 'LSP 실패를 첫 호출에서야 발견 — 세션 초반 Serena 활성화 직후 가벼운 probe 로 조기 감지 가능.'
- memory_candidates:
- { name: 'graphify_workflow', type: convention, signal_source: positive, description: 'graph 산출물 위치/스코프 + graphify-out 캐시 정리 함정', docs_sync_target: null }
- { name: '(host-global) serena LSP behind corporate SSL-inspection proxy', type: env, signal_source: positive, note: 'bibimbap 프로젝트 메모리엔 미반영 — 호스트 전역 이슈. report 에만 보존: CA 번들(certifi+keychain) → SSL_CERT_FILE/REQUESTS_CA_BUNDLE in MCP env.' }
- applied_changes:
- '~/.claude.json serena env 에 CA 번들 지정 (전역 — 사용자 승인)'
- 'serena memory `graphify_workflow` 추가 + core 에서 참조'
- protocol_feedback: []

View File

@ -0,0 +1,22 @@
# Conventions — bibimbap
## Mapper (MyBatis)
- `@Mapper` 인터페이스 + 인라인 `@Select/@Insert/@Update/@Delete` (Java text block SQL). XML 매퍼·네임스페이스 없음.
- SELECT 에서 snake_case 컬럼을 camelCase 로 alias (`g.user_id AS userId`).
- 다중/명명 인자에 `@Param("x")`. 자동생성 PK: `@Options(useGeneratedKeys=true, keyProperty="id", keyColumn="id")`.
- 모든 쿼리에 soft-delete 가드 `is_delete IS NOT TRUE` (조인 대상 포함).
## Controller
- 생성자 주입(필드 `@Autowired` 미사용).
- 페이지 `@Controller`: view-name String 반환 (`"recruit-list"`, `"redirect:/login"`).
- JSON 엔드포인트: `ResponseEntity<Map<String,Object>>``LinkedHashMap``{status, message, ...}`. 헬퍼 `response(HttpStatus, msg)`.
- mutation(`@PostMapping`/`@DeleteMapping`)은 `@Transactional` + 표준 가드 순서:
1. `if (!CsrfTokens.isValid(request)) return 403 + CsrfTokens.errorBody()`
2. `sessionUserId(session)` null → 401
3. 소유권 불일치 → 403
- 입력 위생: `trimToNull`/`trimToEmpty` 헬퍼, 길이 상한 인라인 검사, `safeExternalUrl` 은 http/https 만 허용, 에셋 경로는 `/game/` 시작 + `..` 금지.
## 기타
- 사용자 노출 문자열 한국어.
- `data/` POJO 는 수기 getter/setter.
- soft-delete / 세션 인증 불변식은 `mem:core`.

31
.serena/memories/core.md Normal file
View File

@ -0,0 +1,31 @@
# Core — bibimbap
게임 쇼케이스 + 팀원 모집 웹앱 (org: com.pandoli365). 서버사이드 JSP 렌더 + JSON API 혼합. Spring Boot WAR + MyBatis + PostgreSQL.
## Source map (`src/main/java/com/pandoli365/bibimbap/`)
- `BibimbapApplication` / `ServletInitializer` — 부트 진입 + 외부 서블릿 컨테이너 배포용 initializer (packaging=war).
- `controller/``@Controller`. 페이지 컨트롤러(`RecruitController`, `WebMvcController`)는 JSP view-name 반환. `controller/api/` (`GameController`·`GameAssetController`·`GameUploadController`·`UserController` + `ApiExceptionControllerAdvice`)는 JSON/mutation 처리.
- `mapper/` — MyBatis `@Mapper` 인터페이스, 어노테이션 인라인 SQL. 상세 `mem:conventions`.
- `data/` — DB row/DTO POJO (`GameData`,`UserData`,`RecruitPostData`,`GameComment/LikeData`,`UserAuthIdentityData`). 수기 getter/setter (Lombok 미사용).
- `abstracts/` — 제네릭 베이스 `Request`/`Result`/`Service<Req,Res>`/`ErrorResult`.
- `game/GameCatalog` — DB 이전 레거시 게임 카탈로그(정적 배열 NAMES/CREATORS/...). DB 미존재 game id fallback.
- `security/CsrfTokens` — 수동 CSRF 토큰 util (Spring Security 없음).
- `config/UploadResourceConfig` — 업로드 WebGL/프로필 정적 리소스 핸들러.
- `webapp/WEB-INF/views/*.jsp` (+ `fragments/header.jspf`) — 뷰. ViewResolver prefix `/WEB-INF/views/`, suffix `.jsp`.
- `resources/{dev,live}/db.properties` — 프로필별 DB 자격증명 (gitignore; `.example` 만 커밋).
## 프로젝트 전역 불변식
- **Soft delete**: 조회는 `is_delete IS NOT TRUE` 필터, 삭제는 `is_delete=true, updated_at=now()`. `game_likes` 는 hard delete.
- **인증** = `HttpSession` attr `userId` (Spring Security 없음). mutation 엔드포인트는 첫 줄에 `CsrfTokens.isValid(request)` 체크 → 실패 시 403.
- **소유권** = session userId vs row userId 비교.
- 사용자 노출 문자열은 한국어.
## 참조
- 언어/프레임워크/빌드: `mem:tech_stack`
- 실행 명령: `mem:suggested_commands`
- 코드 컨벤션(mapper/controller/validation): `mem:conventions`
- 작업 완료 게이트: `mem:task_completion`
추가: 광범위한 `docs/` (ATP 문서체계 + 분석) 와 `docs/graph/` (graphify 산출물 메타) 존재.
graphify 그래프 산출물 위치·재생성·`graphify-out` 캐시 정리 함정: `mem:graphify_workflow`.

View File

@ -0,0 +1,9 @@
# Graphify Workflow — bibimbap
graphify 지식그래프 산출물 운용 규약.
- **위치**: 산출물은 `docs/graph/<scope>/{graph.html, graph.json, audit.md}`. 메타는 `docs/graph/index.md` (frontmatter `last_generated_at`/`source_commit`/`scopes` + Scopes 표).
- **추적**: graph 본체(html/json/audit)는 `docs/graph/.gitignore`**무시**(재생성 가능). `index.md``.gitignore` 만 커밋.
- **현재 scope**: `src` (Java 코드, 정적 이미지 제외), `docs` (md + DDL, 자기 산출물 `docs/graph/*` detect 제외).
- **함정**: `/graphify <path>` 는 입력경로 하위에 transient 캐시 `<path>/graphify-out/` (AST/semantic 캐시)를 남긴다. 실행 후 **반드시 `rm -rf <path>/graphify-out`** — 안 그러면 소스트리 오염 + 오커밋. (이번 세션에서 `src/graphify-out`·`docs/graphify-out` 발견.)
- 재생성 시 `index.md` 메타 갱신 필수. 폐기 scope 는 디렉토리 rm + 표에서 제거.

View File

@ -0,0 +1,33 @@
# Memory Maintenance
## Discovery Model
- Core principle: progressive discovery through references, building a graph of memories.
- Initially, agents are provided with the list of all memories (names only).
- Agents should read `mem:core` as the top-level entry point (graph root).
This memory should contain references to other memories covering major project domains.
The referenced memories shall, in turn, shall contain references to even more specific memories, and so on.
The depth of the graph shall depend on the project complexity.
- Use topics/folders to group related memories in order to make the content structure explicit.
Folders can mirror project structure (e.g. modules like frontend/backend) or topics like debugging, architecture, etc.
- Memory references must use a mem: prefix inside backticks, e.g. `mem:frontend/core`.
The surrounding text should clearly indicate when to read the memory/which content to expect.
The text should provide more precise guidance than the memory name alone,
i.e. avoid a reference like "frontend debugging: `mem:frontend/debugging` and instead make clear which aspects of frontend debugging are covered.
- Memories themselves should not contain information about when to read them; this is the responsibility of the referring memory.
## Style
Dense agent notes, not prose docs. Prefer invariants, terse bullets.
Avoid obvious context, rationale, and examples unless they prevent likely mistakes.
Keep guidance durable and generalizable, not task-local.
## Add/update threshold
Add or update memories only with stable, non-obvious project conventions that avoid complex rediscovery in the future.
Do not add: quick-read facts; generic language/framework knowledge; one-off task notes; volatile line-level details; behavior likely to change soon.
## Maintenance Actions
- Renaming memories: References are updated automatically if handled via Serena's memory rename tool.
- Checking for stale memories (e.g. after deletion): Call `serena memories check` for a report.

View File

@ -0,0 +1,14 @@
# Suggested Commands — bibimbap (Darwin)
빌드/실행 (Maven wrapper, 루트에서):
- `./mvnw spring-boot:run` — 개발 실행 (프로필 dev 기본).
- `./mvnw -Papp.profile=live spring-boot:run` — live 프로필.
- `./mvnw clean package` — WAR 빌드 → `target/bibimbap-0.0.1-SNAPSHOT.war`.
- `./mvnw test` — 전체 테스트.
- `./mvnw -Dtest=DbUpdateQueryGeneratorTest test` — 단일 테스트.
전제조건:
- 실행/통합테스트 전에 `src/main/resources/dev/db.properties``db.properties.example` 복사 후 작성 (gitignore). live 도 동일.
- PostgreSQL 기동 + 해당 스키마(dev/live) 접근 가능해야 datasource 로드 성공.
git/ls/grep/find 등 일반 유틸은 표준 unix 와 동일 — 생략.

View File

@ -0,0 +1,8 @@
# Task Completion — bibimbap
코딩 작업 완료 시:
1. `./mvnw test` 통과 (JUnit). `BibimbapApplicationTests` 는 컨텍스트 로드 — 유효 datasource(또는 스킵 조건) 필요.
2. `./mvnw clean package` 로 WAR 빌드 확인 — JSP/컴파일 오류는 단위테스트가 못 잡으므로 패키지까지 돌려 확인.
3. 린터/포매터 없음 (spotless/checkstyle 미설정) — 실행할 것 없음.
4. DB 스키마 변경 시: `src/test/db/dev-to-live-update.sql` + `DbUpdateQueryGeneratorTest` 패턴 참조 (dev→live 마이그레이션 쿼리 생성).
5. DB 접근 코드는 `dev/db.properties` + PostgreSQL 기동 전제. 미충족 시 통합 동작은 수동 검증 필요.

View File

@ -0,0 +1,12 @@
# Tech Stack — bibimbap
- **Java 21** (`maven.compiler.release=21`).
- **Spring Boot 3.5.14-SNAPSHOT** (`spring-boot.version`). spring-boot-starter-web.
- **Packaging = war**. `spring-boot-starter-tomcat` scope=**provided** + `ServletInitializer` → 외부 톰캣 배포 가능(개발은 내장 톰캣). finalName 미지정 → `target/bibimbap-0.0.1-SNAPSHOT.war`.
- **MyBatis**`mybatis-spring-boot-starter` 3.0.5. 어노테이션 매퍼만(XML 없음). `mybatis.configuration.log-impl=Slf4jImpl`, `logging.level.org.apache.ibatis=TRACE`.
- **DB** — PostgreSQL (`org.postgresql`). 프로필별 스키마 `currentSchema=dev|live`.
- **View** — JSP via `tomcat-embed-jasper`. ViewResolver prefix `/WEB-INF/views/`, suffix `.jsp`.
- **Lombok** 1.18.44 의존성 존재(단 `data/` POJO 는 수기 accessor).
- **빌드** — Maven wrapper `./mvnw`. Maven 프로필 `dev`(기본)/`live` → `app.profile` 설정 → 리소스 필터링 `@app.profile@` (application.properties `spring.profiles.active`).
- **테스트**`spring-boot-starter-test` (JUnit5).
- **업로드** — multipart/tomcat post size **1GB** (WebGL zip 업로드용). `app.webgl.asset-origin`/`frame-ancestors` 설정 존재.

View File

@ -1,8 +1,10 @@
---
kind: graphify-meta
last_generated_at: null
source_commit: null
scopes: []
last_generated_at: 2026-06-16T13:02:01+0900
source_commit: 33a4465
scopes:
- src
- docs
---
# Graph — graphify 산출물 메타
@ -34,10 +36,10 @@ scope 예시: `src`, `src-features`, `docs`, `full` 등. 한 번에 여러 scope
## Scopes
_현재 생성된 그래프 없음._
| scope | 마지막 생성 | 소스 커밋 | 대상 경로 | 요약 |
| --- | --- | --- | --- | --- |
| `src` | 2026-06-16 | `33a4465` | `src/` (Java 31 + AST) | 384 노드 / 613 엣지 / 23 커뮤니티. Spring MVC 컨트롤러→매퍼→data 흐름, 모집·게임·인증 도메인 군집. 정적 이미지 제외. |
| `docs` | 2026-06-16 | `33a4465` | `docs/` (md 21 + DDL 2, 자기 산출물 제외) | 44 노드 / 56 엣지 / 7 커뮤니티. 문서 카테고리 체계 + DB 스키마/도메인 + 검증·ATP·ADR 정책 군집. |
## 갱신 시 체크리스트