You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
라우트 및 파라미터:app/cody/item/[skuHash] 동적 라우트 생성. URL 파라미터 skuHash를 CandidateSKU.sku_signature_hash로 인식하여 ④에서 진입할 때 정확히 매핑.
CandidateSKU 타입 import:lib/api/adapters/cody-match.ts에서만 타입 import. 별도 adapter 파일(codyItemAdapter.ts, useCodyMatch.ts 등) 생성 금지. F1이 생성한 단일 adapter 유일 진입.
아이템 상세 정보 렌더링: primary_image_url(OG-verified), category, brand, product, price_krw, confidence(유사도%), reason(대체 이유) 모두 화면에 노출. image_verification 배지로 시각적 신뢰도 표시(og_verified 초록, og_missing 회색, hyperbrowser_fallback 노랑 등).
구매하기 CTA: 쇼핑몰명(source_domain)이 버튼 텍스트에 포함 예) "[무신사]에서 구매하기". 클릭 시 affiliate redirect 패턴(SCR-VIEW-03 참조) 적용. catalog_items.affiliate_url 존재 시 우선 사용, null 시 product_url fallback. 이 fallback 로직은 F7 reconcile gap에 명시할 것 (affiliate_url은 LinkPrice Phase 3+이므로 현재 null).
저장 액션 — 미가입 실패 처리 (F6 owned): 하트 버튼 클릭 시 비로그인 유저에겐 가입 모달 표시(gated). "룩 보드에 저장" 기능은 구현하지 않음 (이는 (+)Saved 화면의 별도 작업); 여기서는 가입 유도만 (세부 저장 로직은 F9의 보드 저장 기능과 연계될 때 완성).
링크 끊김 실패 처리 (F6 owned): product_url 또는 affiliate_url fetch 시 4xx/5xx 발생하면, 에러 상태 표시 + "대체 상품 둘러보기" 버튼 제공 (← 버튼 클릭 시 ④로 복귀, per_role 리스트의 다음 후보 아이템 표시). 동선: 연결 오류 → 유저가 수동으로 다른 후보 선택 또는 조건 재설정.
← 버튼/헤더: ④ Recommended로 복귀. 이전 화면의 추천 세트/조건 상태 유지 (browser history or query state).
VTON 분리 확인:app/cody/item/* 컴포넌트는 lib/components/vton, lib/stores/vtonStore, /api/v1/vton import 금지. 본 화면은 독립적으로 작동.
Output: F1이 생성한 codyStore 또는 /api/* endpoint에서 per_role 맵 조회, 해당 SKU의 CandidateSKU object 추출
Mock strategy: F1이 fixture 생성 시 full CandidateSKU 필드(sku_signature_hash, brand, product, color, category, price_krw, primary_image_url, product_url, source_domain, retailer_scope, confidence, reason, relaxation_level, image_verification) 모두 포함. 테스트 fix엔 real schema 100% mirror.
affiliate_url sourcing — F7 reconcile gap
현재 (Phase 1):catalog_items.affiliate_url is nullable, LinkPrice 미통합 (Phase 3+). 따라서 redirect는 product_url로 진행.
구현:product_url OR (catalog_items.affiliate_url if exists) 우선순위. mock에서는 affiliate_url null 가정, real에선 값 있을 때 우선 사용.
F7 체크리스트 항목: affiliate_url mock→real 재조정 확인 (구현 아님, 검증만).
의존성
F5 (Recommended 화면): ⑤로 진입하는 상단 앞 버튼의 출처. per_role 맵과 추천 세트 상태 공유 (codyStore via F1).
F1 (단일 adapter):lib/api/adapters/cody-match.ts 타입 import 전용. 새 adapter 파일 절대 금지.
auth (gated save): 저장 모달은 기존 signup 플로우 재사용.
catalog_items DB (§7.1): primary_image_url, affiliate_url, OG metadata (og_title, og_description, image_verification) 조회 의존. 백엔드는 이미 구축(catalog-acquisition scope).
제약·주의
경로 규칙 (절대):app/cody/item/[skuHash]/ 외 경로 절대 금지 (금지: /recreate, /app/(request), /app/cody/screens, /app/cody/detail 등).
adapter 단일성: F1이 생성하는 cody-match.ts 1개만. F6는 import만. codyItemAdapter.ts, useCodyMatch, CodyEngineAdapter 등 신규 adapter 파일 생성 금지.
타입 mirror — 누락 금지:CandidateSKU full 필드(sku_signature_hash, brand, product, color, category, price_krw, primary_image_url, product_url, source_domain, retailer_scope, confidence, reason, relaxation_level, image_verification) 를 fixture·mock·schema에 100% 포함. 발명 또는 누락 시 F7 reconcile 실패.
실패 상태 소유 (F6만):
링크 끊김 (product_url/affiliate_url 접근 불가) → 대체 후보 안내
목적
④ Recommended 화면에서 룩 세트의 특정 아이템을 탭했을 때, 그 아이템의 상세 정보와 구매 링크를 표시하는 화면 구현. 코디 재현 엔진의 마지막 단계(P6)로, 유저가 대체 상품을 검토 후 제휴 쇼핑몰로 이동해 구매하는 지점.
범위
packages/web/app/cody/item/[skuHash]/page.tsx(동적 라우트,skuHash=CandidateSKU.sku_signature_hash)packages/web/lib/components/cody/*(렌더링 로직)lib/api/adapters/cody-match.ts에서CandidateSKU타입 import제외 범위:
화면 스펙
레이아웃 (모바일 우선)
필드 매핑 (CandidateSKU full schema per cody-match-stage2 §2.2)
primary_image_urlcategory,brandproductprice_krwconfidence(0.0–1.0 → 0–100% 표시)reasonimage_verification(og_verified/og_missing/hyperbrowser_fallback)product_url또는catalog_items.affiliate_url(phase 3+)source_domainretailer_scope(kr/global)미사용 필드 (이 화면에서는 쓰지 않음)
sku_signature_hash: URL 파라미터로만 사용 (조회 key)relaxation_level: admin verify UI용, consumer 화면엔 미노출Acceptance Criteria
라우트 및 파라미터:
app/cody/item/[skuHash]동적 라우트 생성. URL 파라미터skuHash를CandidateSKU.sku_signature_hash로 인식하여 ④에서 진입할 때 정확히 매핑.CandidateSKU 타입 import:
lib/api/adapters/cody-match.ts에서만 타입 import. 별도 adapter 파일(codyItemAdapter.ts, useCodyMatch.ts 등) 생성 금지. F1이 생성한 단일 adapter 유일 진입.아이템 상세 정보 렌더링: primary_image_url(OG-verified), category, brand, product, price_krw, confidence(유사도%), reason(대체 이유) 모두 화면에 노출. image_verification 배지로 시각적 신뢰도 표시(og_verified 초록, og_missing 회색, hyperbrowser_fallback 노랑 등).
구매하기 CTA: 쇼핑몰명(source_domain)이 버튼 텍스트에 포함 예) "[무신사]에서 구매하기". 클릭 시 affiliate redirect 패턴(SCR-VIEW-03 참조) 적용.
catalog_items.affiliate_url존재 시 우선 사용, null 시product_urlfallback. 이 fallback 로직은 F7 reconcile gap에 명시할 것 (affiliate_url은 LinkPrice Phase 3+이므로 현재 null).저장 액션 — 미가입 실패 처리 (F6 owned): 하트 버튼 클릭 시 비로그인 유저에겐 가입 모달 표시(gated). "룩 보드에 저장" 기능은 구현하지 않음 (이는 (+)Saved 화면의 별도 작업); 여기서는 가입 유도만 (세부 저장 로직은 F9의 보드 저장 기능과 연계될 때 완성).
링크 끊김 실패 처리 (F6 owned): product_url 또는 affiliate_url fetch 시 4xx/5xx 발생하면, 에러 상태 표시 + "대체 상품 둘러보기" 버튼 제공 (← 버튼 클릭 시 ④로 복귀, per_role 리스트의 다음 후보 아이템 표시). 동선: 연결 오류 → 유저가 수동으로 다른 후보 선택 또는 조건 재설정.
← 버튼/헤더: ④ Recommended로 복귀. 이전 화면의 추천 세트/조건 상태 유지 (browser history or query state).
VTON 분리 확인:
app/cody/item/*컴포넌트는lib/components/vton,lib/stores/vtonStore,/api/v1/vtonimport 금지. 본 화면은 독립적으로 작동.비로그인 가능: 조회/구매 redirect는 로그인 불필요. 저장만 gated. mvp-scope §4 로그인 정책 준수.
핵심 파일 경로
packages/web/app/cody/item/[skuHash]/page.tsxpackages/web/lib/components/cody/ItemDetail.tsx(또는 여러 컴포넌트로 분할)packages/web/lib/api/adapters/cody-match.ts(F1이 생성, import만)packages/web/lib/stores/codyStore.ts(F1이 생성)mock·real 경계
Contract 출처:
cody-match-stage2§2.2 (CodyMatchResult.per_role[role][]) + §7.1 (catalog_items 스키마)Stage 2 adapter 계약
sku_signature_hash(URL 파라미터)codyStore또는/api/*endpoint에서 per_role 맵 조회, 해당 SKU의CandidateSKUobject 추출CandidateSKU필드(sku_signature_hash, brand, product, color, category, price_krw, primary_image_url, product_url, source_domain, retailer_scope, confidence, reason, relaxation_level, image_verification) 모두 포함. 테스트 fix엔 real schema 100% mirror.affiliate_url sourcing — F7 reconcile gap
catalog_items.affiliate_urlis nullable, LinkPrice 미통합 (Phase 3+). 따라서 redirect는product_url로 진행.product_urlOR (catalog_items.affiliate_urlif exists) 우선순위. mock에서는affiliate_urlnull 가정, real에선 값 있을 때 우선 사용.의존성
lib/api/adapters/cody-match.ts타입 import 전용. 새 adapter 파일 절대 금지.제약·주의
경로 규칙 (절대):
app/cody/item/[skuHash]/외 경로 절대 금지 (금지:/recreate,/app/(request),/app/cody/screens,/app/cody/detail등).adapter 단일성: F1이 생성하는
cody-match.ts1개만. F6는 import만.codyItemAdapter.ts,useCodyMatch,CodyEngineAdapter등 신규 adapter 파일 생성 금지.타입 mirror — 누락 금지:
CandidateSKUfull 필드(sku_signature_hash, brand, product, color, category, price_krw, primary_image_url, product_url, source_domain, retailer_scope, confidence, reason, relaxation_level, image_verification) 를 fixture·mock·schema에 100% 포함. 발명 또는 누락 시 F7 reconcile 실패.실패 상태 소유 (F6만):
confidence 용법: CandidateSKU.confidence (0–1 float → 0–100% 유사도 배지). AnalysisQuality (②의 분석 품질 배지)와 무관. 혼동 금지.
retailer_scope 명시: 상품이
global(kr 아님)이면 이미지 신뢰도 낮음 표시 (og_missing 가능성 높음). UI에서 차이 있음.VTON 분리: import 금지. app/cody/* smoke test는 vton state/modal 미의존 확인.
비로그인 정책: 조회/구매는 로그인 불필요 (mvp-scope §4). 저장만 gated.
persona (owner=raf, 6/11 확정): AC엔 제외. §6 narrative(지수)는 wireframes §5 참조. Primary 페르소나 확정 후 강조점 조정 가능.
참조