diff --git a/docs/seveneleven-stock-recovery-20261008.md b/docs/seveneleven-stock-recovery-20261008.md index c11fcf88..fdcc4ff2 100644 --- a/docs/seveneleven-stock-recovery-20261008.md +++ b/docs/seveneleven-stock-recovery-20261008.md @@ -34,4 +34,23 @@ CU·GS25·세븐일레븐 공통 중계 예산은 분당 69회, 일당 100,000 `tests/services/seveneleven/inventory-bounded.test.ts`는 직접·중계 단일 점포 호출, 거리순 제한, 0·미확인 구분, 개별 실패 보존, 직접·중계 429 중단을 검증합니다. -이 문서는 로컬 코드 복구를 기록하며 운영 배포나 운영 호출의 추가 성공을 주장하지 않습니다. + +## Mac 실행 런타임에 따른 403·502 + +같은 Mac, URL, 본문, 모바일 헤더로 비교했을 때 Node 24.15.0은 HTTP 403과 +Incapsula HTML을 반환했으며, Node 25.9.0은 HTTP 200 JSON을 반환했습니다. +설치된 중계 검증기에 정상 JSON을 넣으면 200이므로 이 장애는 응답 스키마 불일치가 +아니었습니다. 실행 버전에 따른 접근 차이는 확인했지만 TLS 지문 등 내부 차단 원인은 +확정하지 않았습니다. 원본 HTML은 정상 재고로 해석하지 않으며 중계의 502로 전달됩니다. + +복구 시 셸의 `node --version`만 확인하지 말고 LaunchAgent `ProgramArguments[0]`의 +실행 파일로 같은 요청을 확인합니다. 인증·원장·환경 파일을 보존하고 plist를 백업한 뒤, +검증된 실행 파일로 변경합니다. 운영은 Node 25.9.0으로 바꾼 뒤 공개 재고 응답에서 +`stockAvailable: true`, `stockError: null`을 확인했습니다. 이는 점검 시점의 결과이며 +향후에도 특정 버전이 항상 허용된다는 뜻은 아닙니다. + +변경 전 새 실행 파일로 중계 모듈을 로드해 호환성을 확인합니다. launchd는 `bootout` +후 기존 프로세스가 종료되기 전에 `bootstrap`하면 일시적으로 오류 5를 반환할 수 +있습니다. 종료 상태를 확인하고 재등록한 다음 건강 응답과 CU·GS25·세븐일레븐·CGV를 +확인합니다. 건강 응답 200만으로 외부 재고 성공을 판단하지 않습니다. 실행 파일이 +패키지 관리자 갱신으로 사라지지 않도록 경로와 버전을 운영 기록에 남깁니다.