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:
parent
33a4465e0e
commit
d297f31f72
|
|
@ -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: []
|
||||
|
|
@ -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`.
|
||||
|
|
@ -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`.
|
||||
|
|
@ -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 + 표에서 제거.
|
||||
|
|
@ -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.
|
||||
|
|
@ -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 와 동일 — 생략.
|
||||
|
|
@ -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 기동 전제. 미충족 시 통합 동작은 수동 검증 필요.
|
||||
|
|
@ -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` 설정 존재.
|
||||
|
|
@ -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 정책 군집. |
|
||||
|
||||
## 갱신 시 체크리스트
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue