Skip to content

ci(smoke): 네트워크 도달 실패와 계약 파손을 분리 (canary 오탐 수정) - #18

Merged
djfksjd merged 1 commit into
mainfrom
fix/smoke-unreachable-vs-contract
Jul 27, 2026
Merged

ci(smoke): 네트워크 도달 실패와 계약 파손을 분리 (canary 오탐 수정)#18
djfksjd merged 1 commit into
mainfrom
fix/smoke-unreachable-vs-contract

Conversation

@djfksjd

@djfksjd djfksjd commented Jul 27, 2026

Copy link
Copy Markdown
Owner

문제

스케줄 smoke canary가 양 레포에서 실패 상태였다. 원인은 스킬 결함이 아니라 canary 자체의 오탐이다.

크롤러의 exit 2는 두 가지를 구분하지 않는다:

  • 첫 페이지 0건 파싱 = 사이트 계약 파손 (canary가 잡아야 할 진짜 신호)
  • 네트워크 도달 실패 = 러너가 해외 IP라서 대상 사이트에 못 닿음

근거

러너에서 백엔드 A/B 진단을 직접 돌렸다:

사이트 urllib curl_cffi
seoulshinbo FAIL (timeout 30.8s) FAIL (curl 28, 30.0s)
bizinfo OK (200) OK (200)
  • seoulshinbo는 TLS 지문 문제가 아니라 TCP 연결 자체가 안 되는 구조적 도달 불가. 같은 시각 한국 IP 로컬에서는 16건 정상 수집.
  • bizinfo·kocca·smtech간헐 flake (한 런에서 타임아웃, 몇 분 뒤 정상).

둘 다 빨간불로 만들면 canary가 상시 실패로 굳어 진짜 계약 파손이 묻힌다.

수정

  • .github/smoke_step.sh — 라이브 스텝 래퍼. 도달 실패는 30초 뒤 1회 재시도, 그래도 실패하면 ::warning::으로 강등. 그 외 실패는 그대로 job 실패.
  • 네트워크 신호를 먼저 판정한다 — 도달 실패는 0건 파싱을 부수적으로 유발하지만, 그 역은 성립하지 않는다.

검증

래퍼 4개 분기를 로컬에서 확인(정상 0 / 도달실패 soft 0 / 계약파손 hard 2 / flake 재시도 후 0)했고, 브랜치에서 실제 smoke를 돌려 통과시켰다.

🤖 Generated with Claude Code

추가로 gov24의 인라인 exit-4 처리를 래퍼의 SMOKE_SKIP_RC 계약으로 통일했다.
seoulshinbo는 러너에서 상시 warning이 정상이며, 이 소스의 계약 검증은 한국 IP에서 region_crawl.py를 직접 돌려야 한다는 점을 워크플로 주석에 남겼다 (run 30305398387 ✓).

스케줄 canary 실패는 스킬 결함이 아니라 canary 오탐이었다. 러너에서
백엔드 A/B 진단을 돌린 결과:

  seoulshinbo  urllib FAIL(timeout 30.8s) / curl_cffi FAIL(curl 28, 30.0s)
  bizinfo      urllib OK(200)             / curl_cffi OK(200)

seoulshinbo 는 TLS 지문 문제가 아니라 러너(해외 IP)에서 TCP 연결 자체가
안 되는 구조적 도달 불가다 — 같은 시각 한국 IP 로컬에서는 16건 정상
수집된다. bizinfo 는 간헐 flake(한 런에서 타임아웃, 3분 뒤 정상).

크롤러의 exit 2 는 이 도달 실패와 "첫 페이지 0건 파싱(진짜 계약 파손)"을
구분하지 않아, 둘 다 빨간불이 되면 canary 가 상시 실패로 굳고 진짜 파손이
묻힌다.

- .github/smoke_step.sh: 라이브 스텝 래퍼. 도달 실패는 30초 뒤 1회 재시도
  후에도 실패하면 ::warning:: 으로 강등, 그 외 실패는 그대로 job 실패.
- gov24 의 인라인 exit-4 처리를 래퍼의 SMOKE_SKIP_RC 계약으로 통일.

seoulshinbo 의 계약 검증은 한국 IP에서 region_crawl.py 를 직접 돌려야
한다는 점을 워크플로 주석에 남겼다.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@djfksjd
djfksjd merged commit 9f73a1d into main Jul 27, 2026
2 checks passed
@djfksjd
djfksjd deleted the fix/smoke-unreachable-vs-contract branch July 27, 2026 21:10
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant