## 왜 ### 계약 전환 - TeamPiKi/infra#145 로 확정 code 9개가 TRANSIENT 로 바뀜 - 실패 분류의 정본은 예외 팩토리의 permanent 플래그 - CI 가 proto 의 `disposition` 옵션과 대조 - **결과:** 계약 머지 뒤 CI 실패 ### 확정 판정이 페이지 관측에 기댐 - 받은 dom 에 상품이 없다는 관측을 링크가 상품이 아니라는 결론으로 승격 - 4xx·일부 5xx 를 봇 방어 클로킹 가능성을 알면서도 확정으로 분류 - **결과:** 호출자가 재시도 없이 닫음 ### 실측 - 올리브영 7건(2026-10-04): 스타일시트 차단으로 앱이 죽은 dom 을 상품 아님·읽을 내용 없음으로 확정 - 올리브영 공유링크: 목적지 403 확인 화면, 경유 안내 페이지를 보고 상품 아님으로 확정 (#102) ## 무엇을 ### permanent 플래그 전환 | code | 이전 | 이후 | |---|---|---| | NOT_PRODUCT_PAGE·UNTRUSTWORTHY_VALUE·NO_EXTRACTABLE_CONTENT | 확정 422 | 일시 502 | | FETCH_CLIENT_ERROR·PERMANENT_UPSTREAM·EMPTY_SHELL | 확정 422 | 일시 502 | | TOO_MANY_REDIRECTS·MALFORMED_REDIRECT | 확정 422 | 일시 502 | | LLM_INVALID_RESPONSE | 확정 422 | 일시 502 | - 에스컬레이션 축(plain fetch 에서 헤드리스로)은 그대로 - 관련 테스트의 permanent 단언 갱신 ### Gemini 재시도 판단 분리 - 재시도 중단 판단이 permanent 플래그에 기댐 - LLM_INVALID_RESPONSE 가 일시가 되면 같은 요청의 Gemini 호출이 늘어남 - 재시도 여부를 code 축으로 분리해 호출 수 유지 ### 확정 유지 - INVALID_URL(형식 위반·host 조회 실패)·BLOCKED_HOST·IMAGE_UNSUPPORTED·MODEL_* - **원인:** 링크 자체의 사실이거나 우리가 직접 막은 것 ### 선행 - TeamPiKi/infra#146 머지 - #102·#103 은 이 이슈에 흡수 - **원인:** 목적지 차단 분기 없이도 같은 건이 일시 실패가 됨
Activity