26 KiB
26 KiB
| schema_version | sid | resumed_from | started_at | ended_at | branch | user_request | init_guard | migrate_check |
|---|---|---|---|---|---|---|---|---|
| 2 | 20260629-100849 | null | 2026-06-29T10:08:49+09:00 | 2026-06-29T12:55:00+09:00 | feat/v2 | 크리티컬(W2 크리티컬패스) 닫혔으니 다른 작업(W2-W4 풀설계 미구현 잔여) 진행. 열린 질문 없도록 미리 파악 후 착수. | pass — docs/development/verification-strategies.md 존재 | skip — CLAUDE.md 에 atp:migrate 마커 없음 (이미 .atp/ 경로) |
ATP Work Session — 20260629-100849
Summary
"크리티컬 닫힘" = W2 크리티컬 패스(W1→W2-1→W2-3 동결→W2-6) 완료(20260624 세션, 6 feat, 190/190 GREEN). "다른 작업" = W2-W4 풀설계 11기능 중 미구현 잔여 = W3-1·W3-3·W3-4·W3-5·W4 (5기능). W3-2(댓글/리뷰)는 이미 완료(21892c8). 설계 오픈질문 0(_cross-consistency-audit PASS), 단 구현 전 선결정/선결조건 식별됨.
Invocations
- (진행 전 — orchestrator 직접 discovery: work-session 20260624 report·풀설계 요약·구현추적·grounding)
- W3-1: implementation-advisor(9 worker, 신규13+수정6, ${} 0, @MockBean 4) → verification-advisor(PASS: L1 235/235 컨테이너·L2 C1~C5 throwaway DB·AC-1/2/4/5·보안VP) → commit
35f1dc3. baseline 190→235(+45 신규테스트). 편차 2건(insertTag int+generatedKeys, TagController GamesMapper 주입 소유자확인) 의미보존. - W3-4: implementation-advisor(6 worker, 신규2+수정5, 단계1+2 통합, BibimbapApplicationTests 무변경) → verification-advisor(PASS: L1 243/243·L2 C1~C5 keyset 경계 무중복/무누락 throwaway DB·AC-T2/T3/T4·단계무결성·보안VP) → commit
e28fa60. 편차 0(listActive limit=1 설계 축소후보 채택). - W3-3: implementation-advisor(9 worker, 신규17 Java+5 JSP+5테스트+DDL+pom) → verification-advisor(FAIL: L1 283/2fail+1err) + adversarial SSRF 감사(CRITICAL: Host restricted-header→fetch vacuous + CGNAT 등 범위갭; XSS SOUND) → impl fix1(option-b hostname-connect 전환·범위확장·FeedParser) → 재검증(FAIL: FeedParser parsesRss20 잔존) → orchestrator 마이크로수정(FeedParser RFC1123 요일-날짜 불일치 robust) → L1 287/287 GREEN → commit
6047a39. 2중검증(verification+adversarial)이 vacuous SSRF(거짓통과) 포착 — 핵심 가치. - W3-5: implementation-advisor(7 worker, 신규 8+수정 3, ZipSecurity 단독, dead code 제거) → verification-advisor(PASS: L1 318/318·L2 C1~C5 audit throwaway DB·AC-T1/3/4/5/6·getCompressedSize 0) + adversarial zip-slip 감사(SOUND: 심링크 TOCTOU 구조불가·경로탈출/유니코드/zipbomb/LIKE주입 차단) → commit
08d191f. 편차 0. LOW 2건(split 빈세그먼트·static 트리 .tmp 노출)=open_item.
Advisor Invocation Decision Log
각 advisor 호출/스킵 판단 즉시 1줄 append
- advisor: requirements-advisor decision: skip rationale: '풀설계 11기능 산출 완료(오픈질문 0, W1-design 깊이). 요구 분해 불필요 — 잔여 5기능 설계도 확정적.' checked_at: 2026-06-29T10:12:00+09:00
- advisor: research-advisor decision: skip rationale: '풀설계 grounding(.atp/.../20260623-104307/research) + _cross-consistency-audit PASS 존재. orchestrator discovery 로 baseline·prereq 직접 확인 완료.' checked_at: 2026-06-29T10:12:00+09:00
- advisor: design-advisor decision: skip rationale: '잔여 5기능 풀설계 파일영향맵+계약+시퀀스+AC 확정적, audit PASS. orchestrator→implementation-advisor 직행.' checked_at: 2026-06-29T10:12:00+09:00
- advisor: implementation-advisor (W3-1) decision: call rationale: '대규모 다파일(4매퍼+2컨트롤러+POJO+DDL+sanitizer+JSP+테스트) → worker 분산+소유권 충돌방지 필요.' checked_at: 2026-06-29T10:25:00+09:00
- advisor: verification-advisor (W3-1) decision: call rationale: '코드 변경 → 스킵 불가. 신규 매퍼+VIEW alias 소비 → L1+L2(DB-방언 계약).' checked_at: 2026-06-29T11:00:00+09:00
- advisor: implementation-advisor (W3-4) decision: call rationale: 'keyset 페이징 매퍼+컨트롤러+JSP+JamsMapper 확장+테스트 다파일. 단계1+2 통합(W2-1 jams·W3-1 검색라우트 충족).' checked_at: 2026-06-29T11:10:00+09:00
- advisor: verification-advisor (W3-4) decision: call rationale: '코드 변경 → 스킵 불가. keyset 혼합방향 OR 분해 → L1+L2(경계 무중복/무누락 실측).' checked_at: 2026-06-29T11:40:00+09:00
- advisor: implementation-advisor (W3-3) decision: call rationale: '최대 복잡(SSRF 9항목·md sanitize·6매퍼·3컨트롤러·4테이블·scheduling·pom 의존). worker 다분산+보안핵심 단독 worker 필요.' checked_at: 2026-06-29T11:45:00+09:00
- advisor: verification-advisor (W3-3) decision: call rationale: '코드 변경 → 스킵 불가. SSRF/sanitize 보안핵심 → L1+L2+9항목 커버리지.' checked_at: 2026-06-29T12:30:00+09:00
- advisor: adversarial-ssrf-audit (general-purpose) decision: call rationale: '보안핵심 — verification(테스트 실행)이 못 잡는 우회벡터(IP인코딩·IPv6·rebinding·redirect)를 코드추적으로 adversarial 탐색. perspective-diverse verify.' checked_at: 2026-06-29T12:30:00+09:00
- advisor: implementation-advisor (W3-3 fix1) decision: call rationale: '§2.6 backward — 발원=구현. (1)CRITICAL Host restricted-header→fetch 전건 empty+테스트 vacuous (2)CGNAT 100.64/10 등 범위갭 (3)FeedParser RSS prolog (4)테스트 버그 (5)HTTPS SNI 동작우려. 보안핵심 전수 보정.' checked_at: 2026-06-29T12:50:00+09:00
- advisor: verification-advisor (W3-3 fix1 재검증) decision: call rationale: '보정 후 재검증 의무. FAIL(FeedParser parsesRss20 잔존) → orchestrator 마이크로수정으로 해소.' checked_at: 2026-06-29T13:15:00+09:00
- advisor: (orchestrator 직접 마이크로편집) decision: call rationale: 'FeedParser parseRfc1123 단일 메서드 — pubDate 요일-날짜 불일치(픽스처 Tue=실제 Wed) RFC1123 DOW 검증 거부. §5.1 마이크로편집 예외. 선행 요일토큰 제거 robust 파싱. 직접 L1 287/287 검증.' checked_at: 2026-06-29T13:25:00+09:00
- advisor: implementation-advisor (W3-5) decision: call rationale: 'zip-slip/심링크/zipbomb/포맷/권한게이트/생명주기/감사 보안보강 다파일. ZipSecurity 보안핵심 단독 worker.' checked_at: 2026-06-29T13:30:00+09:00
- advisor: verification-advisor (W3-5) + adversarial-zipslip-audit decision: call rationale: '보안핵심 zip-slip → 2중검증(L1+L2 + 우회벡터 코드추적). 감사 SOUND, 우회 0.' checked_at: 2026-06-29T14:00:00+09:00
- advisor: implementation-advisor (W4) decision: call rationale: '배지/평판 3테이블+5매퍼+2서비스+2훅+매니지컨트롤러+표시+BADGE_MANAGE+시더 다파일. worker 분산.' checked_at: 2026-06-29T14:10:00+09:00
Decisions
- 범위 = 잔여 5기능 전부 순차 (AskUserQuestion). 순서 W3-1→W3-4→W3-3→W3-5→W4. 각 impl→verify→commit(롤백 경계, 중간 중단 가능).
- 검증 실행 경로 확정 (환경 핵심): 호스트 JDK 0(
/usr/bin/java=실패 스텁). L1 = 컨테이너 실행:docker run --rm -v "$PWD":/work -w /work -v "$HOME/.m2":/root/.m2 --entrypoint sh eclipse-temurin:21-jdk -c './mvnw -o test'근거: ~/.m2(136M) 채워짐 → 오프라인-o해소, maven 3.9.14 dist 캐시됨. W2 세션이 쓴 동일 경로(메모리 java-crypto-verify-via-jdk-container-when-no-host-jdk). L2 = compose postgres:16 격리 throwaway(비파괴). - W3-1 concern 해소(설계 명시): concern1 CONTENT_MODERATE 재사용(신규키 0), concern2/3 GameTags AND/OR 메서드 분리(listGameIdsByTagsAll/Any)+existsRecentView sinceTs 인자제거(dead param 회피), concern4 GameData nullable 박스필드 확장(소비처 영향 최소).
잔여 미구현 인벤토리 (풀설계 대비)
| W | 설계 문서 | 의존 | 신규 테이블/뷰 | 선결조건(구현 1보) | 보안핵심 |
|---|---|---|---|---|---|
| W3-1 태그+검색 | W3-1-tags-search-design.md | 독립 | tags, game_tags, jam_tags, game_views (+games.view_count) | DDL | sanitize/금칙어·CONTENT_MODERATE |
| W3-3 포스팅보드 | W3-3-posting-board-design.md | 독립 | post_categories, posts, unity_feed_sources, unity_feed_items | pom: commonmark+jsoup + @EnableScheduling(SchedulingConfig) | ★SSRF 9항목·md sanitize·POST_WRITE enforcement 연결 |
| W3-4 메인허브 | W3-4-main-hub-design.md | W3-1 후 | (없음, GamesMapper 확장) | W3-1 선행 | 파라미터 #{} |
| W3-5 Unity업로드 | W3-5-upload-design.md | 독립 | game_upload_audit_log | DDL | ★zip-slip canonical+심링크거부+zipbomb·권한게이트 |
| W4 배지/평판 | W4-badges-design.md | 독립 | badges, user_badges, reputation_events | PermissionKeys+BADGE_MANAGE(4번째) + W1 카탈로그 전수 AC 재측정 | 부여/회수 CSRF+BADGE_MANAGE·/manage/badges 경로 |
선결정 (구현 전 — 설계가 이미 정한 사항이나 부수효과 플래그)
- W3-3: pom.xml 신규 의존 commonmark+jsoup 추가(HTTP=spring-web RestClient 내장, 의존 0) + @EnableScheduling 신규 활성. → 구현 1보 = 의존추가+contextLoads.
- W4: PermissionKeys enum +BADGE_MANAGE → W1 권한카탈로그 전수 AC 카운트 3→4 동반갱신(회귀 가드).
- W3-4 는 W3-1 산출(GET /games/search 태그파라미터) 소비 → W3-1 선행 강제.
- DB DDL: 신규 테이블 다수. W2 패턴 답습 = L2 격리 throwaway DB 비파괴 실측 + 실 dev DB 적용은 §6 수동게이트(needs_user_verification). 실 dev DB 는 W2 jam DDL 도 아직 미적용(carryover).
user_signals
positive: [] negative: []
verified_by_me
- L1 (typecheck / unit+regression): 컨테이너
./mvnw -o test(eclipse-temurin:21-jdk + ~/.m2 마운트, 오프라인). baseline 190 → 최종 347/347 GREEN(누적 +157 신규테스트, 회귀 0). 각 W per-feature 검증: W3-1 235·W3-4 243·W3-3 287(fix1 포함)·W3-5 318·W4 347. contextLoads 전 신규 매퍼/서비스 @MockBean 전수. - L2 (contract-dev-db): pass — 각 W 격리 throwaway postgres:16 비파괴 실측(적용→실측→DROP). W3-1 alias 케이스폴딩 인용/비인용 대조·NULLS LAST·AND⊆OR·ILIKE·interval dedupe / W3-4 keyset 혼합방향 OR분해 경계 무중복·무누락·tie-break / W3-3 board keyset row-comparison·insertIgnoreDup ON CONFLICT·FK / W3-5 audit insert·outcome CHECK·FK·findGameByWebglUuid alias / W4 자동부여 멱등·회수후 재획득 부분유니크·dedupe·배치 alias·CHECK/FK. 실 dev DB(bibimbap) 무접촉(전 W).
- adversarial 보안 감사 2건: W3-3 SSRF(CRITICAL Host restricted-header→vacuous 포착 → option-b 전환 + CGNAT 등 범위확장; XSS sanitize SOUND), W3-5 zip-slip(SOUND — 심링크 TOCTOU 구조불가·경로탈출/유니코드/zipbomb/LIKE주입 전수 차단).
- 로그 스캔: clean(전 W. WARN = Mockito/ByteBuddy agent·Spring static trailing-slash 환경 noise).
needs_user_verification
- 실 dev DB(bibimbap) DDL 미적용 —
db/apply-local-ddl.sh로 신규 DDL 5종(tag-ddl/games-hub-ddl/board-ddl/game-upload-ddl/badge-ddl) + (W2 carryover) jam DDL 3종 일괄 적용 필요. L2 는 throwaway 로 통과, 실 dev DB 는 §6 수동게이트. L3 선행. - L3 런타임 스모크(WAR 기동 후): ① 검색
/games/search태그·정렬키·잼필터 + 방문수 dedupe ② 허브/keyset 더보기 + 진행중 잼 배너 ③ 포스팅 작성(POST_WRITE)/sanitize 렌더/OG 미리보기/유니티 피드 폴링 + ★실 HTTPS 외부 fetch 동작(SsrfSafeFetcher option-b hostname-connect 실 TLS — 단위는 HTTP만) ④ 업로드 zip-slip/포맷 거부 + 정상 Unity 빌드 + replaceUuid 교체 ⑤ 배지 자동부여(리뷰10/업로드3)·수동 grant/revoke(BADGE_MANAGE)·리뷰작성자 칩. - W3-3 SSRF 하드닝(선택): option-b 잔여 rebinding TOCTOU →
networkaddress.cache.ttl설정 검토.
graph_refresh
- 판정: fully-stale (graph-refresh-checker). 기준 a74bf74(W2)→HEAD
305cc73, 9커밋차. src 77파일(+10163/-103, 신규63), docs 10파일(신규6 DDL5). no-defer 처리 완료: orchestrator/graphify src/(AST 1825노드/4292엣지/79커뮤니티 — 비코드 4건[wordlist·이미지3]은 아키텍처값 0으로 AST 기반) +/graphify docs/(semantic 198노드/282엣지/14커뮤니티, 3 subagent chunk — DDL FK·결정 rationale, graph 본체 자기참조 제외) 재생성. docs/graph/src·docs/ 본체 갱신(gitignore), docs/graph/index.md frontmatter(source_commit→305cc73·last_generated 2026-06-29) + Scopes 표 2행 갱신. graphify-update-advisor 가 advisor 경계상 /graphify 직접호출 불가로 orchestrator 가 Skill 실행. src/graphify-out AST 캐시 잔여물 제거.
선제 해소 (구현 전 blocker)
- W3-3 pom 의존 blocker 해소: commonmark·jsoup
~/.m2미존재(오프라인-o컴파일 불가) → 온라인+프록시 CA(certs/corporate-proxy-ca.crt) 주입으로 1회 pre-resolve 완료. jsoup 1.17.2 + commonmark 0.22.0 캐시됨(jsoup 1.14+ Safelist API 정합). W3-3 impl 은 이 정확버전 pom 선언. 이후 오프라인 빌드 가능. (online dep 해소 = JDK cacerts 프록시 CA 주입 필요 — 메모리 local-dev-setup-gotchas §1 패턴.)
open_items
- (W2 carryover) 실 dev DB(bibimbap) jam DDL 미적용 — 신규 W3/W4 DDL 과 함께 일괄 적용 게이트 검토 필요.
- W3-5 gameRoot() dev 경로 이중중첩(app.upload.game-storage-path=src/main/resources/static/game → resolve('game') → .../static/game/game): W3-5 설계 명시 스코프-아웃(에스컬레이션). 보안작업 무관 진행(canonical 경계 보장). 별도 config 정합 작업 — dev 자산 위치 영향이라 사용자 결정 필요. needs_user_verification 후보.
- W3-3 SSRF 잔여 rebinding TOCTOU(option-b hostname-connect): connect 시 재resolve 창. DNS 캐시로 최소화, 위협모델 LOW(URL 제출자=권한자). 하드닝 옵션:
networkaddress.cache.ttl설정. HTTPS 실 TLS = L3 스모크 권고.
Retrospective
Retrospective:
signals:
positive: [] # 이번 세션 발화는 초기 요청 1 + "계속해줘" + config 명령(model/effort/fast). 강한 긍정 발화 없음 — 억지 기재 안 함. 비자명 판단의 가치는 what_went_well + memory_candidates(signal_source: observation)로 분리 기재.
negative: [] # 부정 발화 없음("왜 안했어"/"또야"/"틀렸어" 0건). W3-3 1차 SSRF 갭은 사용자 시그널이 아니라 adversarial 감사가 잡은 내부 관찰 — observation 으로 처리.
what_went_well:
- "착수 전 환경 blocker 선제 해소: 호스트 JDK 0 → 컨테이너 L1 경로 확정(baseline 동결), W3-3 commonmark/jsoup 오프라인 의존 → 프록시 CA 주입으로 1회 pre-resolve. '열린 질문 없도록 미리 파악' 의도를 환경 차원까지 확장해 W3-3 착수 시 컴파일 blocker 0."
- "보안핵심 2중 검증(verification + adversarial 코드감사 병렬): W3-3 SSRF 에서 verification 은 'fetch empty' RED 만 봤으나 adversarial 감사가 근본원인(Host restricted-header → 거부 테스트 vacuous PASS, SSRF 거부가 거짓통과) + 추가 범위갭(CGNAT 100.64/10) 진단. 이대로 커밋했으면 SSRF 무력 배포였음. W3-5 zip-slip 도 동일 패턴(감사 SOUND)으로 우회 0 확정."
- "backward 회귀 단계 판정(§2.6) + 마이크로편집(§5.1) 정확 적용: W3-3 fix1 후 FeedParser 잔존 RED 의 발원이 픽스처 요일-날짜 불일치(RFC1123 DOW 검증 거부)임을 orchestrator 가 직접 진단, 선행 요일토큰 제거 robust 파싱으로 마이크로편집(실 피드 대응) + 직접 L1 287/287 검증. advisor 라운드 추가 없이 단일 메서드 보정으로 해소."
- "advisor 호출/스킵 판단 즉시 로깅: requirements/research/design 3 advisor 를 풀설계 audit PASS 근거로 스킵 결정 + rationale 기록 → 확정적 설계에 불필요 라운드 0. 코드 변경 W 마다 verification 스킵 불가 일관 적용."
- "검증 DB 격리 무파괴 일관 유지: 전 W L2 를 격리 throwaway postgres:16(적용→실측→DROP)으로 실측, 실 dev DB(bibimbap) 무접촉. 실 dev DB DDL 적용은 §6 수동게이트로 needs_user_verification 에 분리."
what_to_improve:
- "W3-3 1차 구현이 SSRF Host restricted-header 를 놓침 + 자체 거부 테스트가 vacuous(전건 empty 반환이라 '거부됨'을 입증한 게 0건). graceful catch 가 예외를 삼켜 정상경로 실패를 '정상 거부'처럼 위장. → '보안 거부 테스트는 정상경로 성공 케이스와 쌍으로 차별 입증(distinguishing assertion)해야 vacuous 회피' 가 핵심 교훈."
- "W4 표시 AC 부분 갭(프로필 myBadges 주입·게임카드 creator 배지 칩): orchestrator scope-fence(W3-1/3/4 산출물 접근금지)가 W4 표시면을 선행기능 컨트롤러에 배선하는 것을 막음. 단일 기능의 표시면이 선행 기능 컨트롤러에 의존할 때, scope-fence 가 표시 배선을 차단하지 않도록 표시-배선 지점을 fence 예외로 사전 식별하는 설계 교훈."
- "option-b SSRF(hostname-connect) 잔여 rebinding TOCTOU: 설계 concern 이 IP핀닝 vs HTTPS-SNI 트레이드오프를 예고했으나 1차 구현이 HTTPS 미검증 IP핀닝을 선택. 보안핵심에서 설계가 명시한 트레이드오프는 구현 1보에 선결정으로 못박아 1차에서 정답 분기를 고르게 한다."
memory_candidates:
- name: security-reject-test-needs-distinguishing-assertion
type: feedback
description: "보안 거부 테스트는 정상경로 성공 케이스와 쌍으로 차별 입증해야 vacuous(거짓통과)를 회피한다."
body_draft: |
What: 보안 거부(SSRF·zip-slip·인가 등) 단위 테스트가 '차단되어 empty/예외'만 확인하면, 정상경로마저 같은 이유로 실패할 때 테스트가 vacuous PASS(거부를 입증한 게 0건)가 된다. graceful catch 가 예외를 삼키면 '정상경로 실패'가 '정상 거부'로 위장된다.
Why: W3-3 1차 구현은 Host restricted-header 때문에 모든 fetch 가 empty 였고(정상 URL 도 fetch 0), SSRF 거부 테스트가 전건 empty 라 거부를 차별 입증하지 못했다. verification 은 RED 만 봤고 adversarial 코드감사가 vacuous 근본원인을 잡았다. 이대로 커밋했으면 SSRF 무력 배포.
How to apply: 보안 거부 테스트는 (a) 차단되어야 하는 입력 → 거부, (b) 허용되어야 하는 정상 입력 → 성공, 두 케이스를 쌍으로 둬 두 분기가 실제로 갈리는지(distinguishing assertion) 본다. graceful catch 경로는 '거부 사유'와 '정상경로 실패'를 구별 가능한 신호로 분리한다. 보안핵심 기능은 verification(테스트 실행)과 adversarial 코드감사를 병렬로 건다.
rationale_for_saving: "재현성 높은 테스트 안티패턴(전 보안 거부 테스트에 적용). 코드/커밋에서 유도 불가 — 관찰로만 드러난 verification 사각."
signal_source: observation
docs_sync_target: /Users/wemadeplay/workspace/stz/bibimbap/docs/development/verification-strategies.md # "## 설계·테스트 단계 체크리스트" 섹션에 신규 소제목 append (append-only 관례)
memory_optional: false
- name: security-core-parallel-adversarial-audit
type: feedback
description: "보안핵심 기능은 verification(테스트 실행)과 adversarial 코드감사를 병렬로 건다 — 우회 벡터는 테스트 실행이 못 잡는다."
body_draft: |
What: SSRF·zip-slip 등 보안핵심 변경은 verification-advisor(테스트 실행)만으로 부족. 우회 벡터(IP 인코딩·IPv6·DNS rebinding·redirect·심링크 TOCTOU·zipbomb·유니코드 경로)는 테스트가 작성돼 있어야만 잡히는데, 누락 벡터는 테스트 자체가 없어 GREEN 으로 숨는다.
Why: W3-3 SSRF — adversarial 감사가 vacuous PASS(Host restricted-header) + CGNAT 범위갭을 잡아 무력 배포를 막음. W3-5 zip-slip — 감사 SOUND 로 우회 0 확정. 두 케이스 모두 verification 단독이면 누출됐을 사각.
How to apply: 변경 scope 에 SSRF/파일추출/인가/sanitize 등 보안핵심이 포함되면 verification 과 별도로 general-purpose adversarial 감사(코드추적 기반 우회벡터 탐색)를 병렬 호출. 감사 산출은 CRITICAL/SOUND 판정 + 미커버 벡터 목록. CRITICAL 시 §2.6 backward 보정.
rationale_for_saving: "보안핵심 검증 토폴로지의 재현 패턴. 이번 세션이 2건(SSRF·zip-slip)으로 가치를 실증 — verification-strategies 레지스트리에 보안핵심 분류 트리거로 둘 가치."
signal_source: observation
docs_sync_target: /Users/wemadeplay/workspace/stz/bibimbap/docs/development/verification-strategies.md # "버그 범주 → 적용 L 레벨" 표에 '보안핵심(SSRF/파일추출/인가/sanitize) → L1+L2+adversarial 감사' 행 추가 + 체크리스트 소제목
memory_optional: false
- name: scope-fence-vs-display-wiring
type: feedback
description: "단일 기능의 표시면이 선행 기능 컨트롤러에 의존하면 scope-fence 가 표시 배선을 차단할 수 있다 — 표시-배선 지점을 fence 예외로 사전 식별."
body_draft: |
What: orchestrator scope-fence 는 충돌 방지를 위해 worker 의 선행 기능 산출물 접근을 막는다. 그러나 신규 기능의 '표시면'(예: 배지 칩 렌더)이 선행 기능 컨트롤러(프로필·게임카드)에 주입돼야 하면 fence 가 표시 배선을 막아 표시 AC 부분 갭이 생긴다.
Why: W4 배지/평판 — myBadges 프로필 주입·게임카드 creator 배지 칩 표시가 W3-1/3/4 컨트롤러에 배선돼야 하는데 scope-fence(W3-1/3/4 접근금지)가 막아 표시 AC 부분 미충족.
How to apply: 설계 영향맵에서 신규 기능의 표시면이 선행 기능 컨트롤러/뷰에 배선되는 지점을 'cross-feature display wiring'으로 표시. orchestrator 는 이 지점을 scope-fence 예외(읽기+해당 라인 편집 허용)로 사전 식별하거나, 표시 배선을 별도 후행 단계로 분리한다.
rationale_for_saving: "scope-fence 운영의 재현 가능한 사각. 다기능 순차 구현에서 반복 발생 — orchestrator 토폴로지 교훈으로 docs 가치."
signal_source: observation
docs_sync_target: /Users/wemadeplay/workspace/stz/bibimbap/docs/development/verification-strategies.md # 체크리스트 섹션에 설계/스코프 교훈으로 append (또는 design 영향맵 규약 — protocol_feedback 과 연동)
memory_optional: false
- name: design-tradeoff-pin-to-implementation-step1
type: feedback
description: "설계 concern 이 명시한 보안 트레이드오프(IP핀닝 vs HTTPS-SNI 등)는 구현 1보 선결정으로 못박아 1차에서 정답 분기를 고르게 한다."
body_draft: |
What: 설계 단계가 'A vs B 트레이드오프, B 권장' 식으로 concern 을 예고해도, 구현이 1차에서 A 를 고르면 backward 보정 라운드가 생긴다. 트레이드오프는 선결정 목록(구현 전)에 결론까지 명시해야 1차 구현이 정답으로 수렴한다.
Why: W3-3 SSRF — 설계 concern 이 IP핀닝 vs HTTPS-SNI 트레이드오프를 예고했으나 1차 구현이 HTTPS 미검증 IP핀닝(option-a 류)을 선택 → fix1 에서 option-b hostname-connect 로 전환. 잔여 rebinding TOCTOU 도 이 분기에서 파생.
How to apply: design-advisor 가 'concern: 트레이드오프'를 남기면 결론(채택 분기 + 이유)을 함께 적고, orchestrator 는 '선결정' 섹션에 결론을 못박아 implementation-advisor 지시에 포함. 결론 미확정 트레이드오프는 구현 착수 전 해소.
rationale_for_saving: "design→implementation 핸드오프의 재현 갭. 보안핵심에서 1차 정답률을 올리는 운영 교훈."
signal_source: observation
docs_sync_target: /Users/wemadeplay/workspace/stz/bibimbap/docs/development/verification-strategies.md # 체크리스트 또는 protocol_feedback(design-advisor concern 규약)와 연동
memory_optional: false
protocol_feedback:
- "[verification 전략 레지스트리] '버그 범주 → 적용 L 레벨' 표에 '보안핵심(SSRF/파일추출·zip-slip/인가/sanitize) → L1 + L2 + adversarial 코드감사(병렬)' 행 추가. verification(테스트 실행)이 못 잡는 우회벡터를 코드추적 감사로 병렬 커버하는 패턴을 레지스트리 트리거화. 근거: W3-3 SSRF vacuous 포착 + W3-5 zip-slip SOUND."
- "[verification-advisor 또는 W-TEST worker 체크리스트] '보안 거부 테스트는 정상경로 성공 케이스와 쌍으로 차별 입증(distinguishing assertion)해야 vacuous 회피' 조항 추가. graceful catch 가 정상경로 실패를 거부로 위장하는 안티패턴을 명시. 근거: W3-3 SSRF 거부 테스트 전건 empty vacuous PASS."
- "[orchestrator scope-fence 규약 / design-advisor 영향맵] 신규 기능의 표시면이 선행 기능 컨트롤러/뷰에 배선되는 'cross-feature display wiring' 지점을 영향맵에 표시하고 scope-fence 예외(또는 후행 분리)로 사전 식별하는 조항 추가. structural — 다기능 순차 구현에서 반복 가능. 근거: W4 myBadges/게임카드 배지 표시 AC 부분 갭."
- "[design-advisor concern 규약] '트레이드오프 concern' 은 결론(채택 분기 + 이유)까지 명시하고, orchestrator 는 이를 '선결정'으로 못박아 implementation 지시에 포함하는 조항 추가. 결론 미확정 트레이드오프는 구현 착수 전 해소. 근거: W3-3 SSRF IP핀닝 vs HTTPS-SNI 1차 오선택 → backward 보정."
applied_changes: []
applied_changes (orchestrator — 회고 교훈 docs-first 반영)
- verification-strategies.md "설계·테스트 단계 체크리스트" append 4건: (1) 보안 거부 테스트 차별 입증(vacuous 회피) (2) 보안핵심 verification+adversarial 병렬 (3) 표시면 의존 scope-fence 예외 (4) 설계 트레이드오프 1차 결론 못박기.
- verification-strategies.md "프로토콜 개선 권고" append 5건(보안핵심 L레벨 행·distinguishing assertion·cross-feature display fence·design 트레이드오프). 외부번들 대상 미적용 기록.
- memory: bibimbap memory 미활성 → docs 단독 마감(memory_optional=false 전 후보). 강제 기록 안 함.