12. 트러블슈팅 · 실패 시나리오
실행 중 마주칠 수 있는 문제와 대응 방법을 정리합니다.
재시도 가능 실패
런타임에서 자동으로 재시도하는 실패 유형.
| 실패 | 원인 | 자동 대응 |
|---|---|---|
| 큐 미개방 충돌 (409) | 서버 큐 스케줄러 지연 (정각 뒤 수 초 미개방) | 500ms 간격으로 최대 3분 반복 클릭, 큐 열리는 순간 자동 진입 |
| 좌석 충돌 (409) | 같은 좌석 동시 선택 | 선택 해제 후 다른 좌석 재시도 (claimed_seats 반영) |
| 챌린지 타이밍 실패 | 인디케이터 조건 놓침 | 1.2초 후 다음 시도 (최대 5회) |
| 챌린지 드래그 실패 | 마우스 위치 오차로 착지 실패 | 재드래그 (최대 3회) |
| 추천 결과 없음 | 좌석 추천 모드에서 추천 카드 미수신 | 직접 좌석 선택 모드로 폴백 (S4) |
| 구역 선택 4xx | 서버 4xx 응답 (차단은 아님) | S3 재진입 (챌린지 확인) |
중단 조건
다음 조건에서는 에이전트가 즉시 SX(BLOCKED) 또는 SX(ABORT)로 종료됩니다.
BLOCKED (방어 차단)
| 조건 | 판정 기준 |
|---|---|
| HTTP 403 응답 | 명시적 차단 |
| 챌린지 5회 재시도 모두 실패 | 방어가 챌린지 레벨에서 차단 |
terminal_fail 서브 라운드 결과 | 재시도 불가 판정 |
text=인증 실패 가시화 | 구역 단계 봇 감지 |
BLOCKED reasonCode 응답 | API 응답의 명시적 차단 사유 |
ABORT (내부 실패)
| 조건 | 판정 기준 |
|---|---|
| 세션 만료 | 저장된 쿠키·토큰 무효 |
| 각 단계 타임아웃 | S2 큐 대기 180s 초과 등 |
| 예상치 못한 예외 | 네트워크 오류·DOM 파싱 실패 등 |
| 추천 모드 ↔ MAP 폴백 모두 실패 | 어느 경로로도 진행 불가 |
운영 중 발견된 구체적 문제와 대응
1. 큐 미개방 타이밍 불일치
관찰: 오픈 정각에 정확히 클릭했지만 서버 큐가 아직 안 열려 충돌 응답 반복.
원인: 백엔드 스케줄러가 초 단위로 정렬되지 않음. 정각 뒤 수 초까지 큐 미개방 상태 지속.
대응: 500ms 고정 주기로 최대 3분간 반복 클릭, 큐 열리는 순간 자동 진입.
2. 단일 PC 다중 에이전트 호스트 경합
관찰: 한 PC에서 에이전트 5~10개를 정각에 동시 투입하면 개별 에이전트 응답이 수 초씩 누적 지연.
원인: Chromium 프로세스 간 CPU·메모리·네트워크 경합 + 브라우저 통신 메시지 직렬 처리.
대응: 에이전트 순번별로 수 초씩 선형 지연 주입 (호스트 부하 분산 + 실전 타이밍 재현).
3. VQA 드래그 착지 실패
관찰: drag_verify_failed 결과가 전체 실패 중 다수를 차지.
원인: 드래그 중 마우스 이동 곡선 합성 과정에서 수직 방향 떨림으로 최종 위치가 목표에서 벗어남.
대응: 누른 직후 글러브 실제 위치 재확인, 24px 이상 벗어나면 재드래그 (최대 3회).
4. 장거리 이동 체감 속도 저하
관찰: 구역·좌석 버튼까지 수백 픽셀 이동 시 전 구간 곡선 합성으로 지연 누적.
원인: 자연스러움을 위해 전 경로를 곡선으로 합성하면 누적 시간이 길어짐.
대응: 숙련자 사전 위치 선점 모델 — 버튼 출현 전 타깃 예상 위치 근처로 마우스 미리 이동.
5. 스웜 내 동시 VQA 풀이 위험
관찰: 한 스웜 안 여러 에이전트가 같은 순간에 챌린지를 풀면 과민반응 우려.
원인: 서로 독립 세션임에도 "비정상적으로 동기화된 풀이 패턴"으로 보일 수 있음.
대응: 스웜 차원 동시 풀이 수 제한 (세마포어 기반 직렬화) + 에이전트별 시작 시각 jitter.
6. LLM 무의미한 구역 변경 지시
관찰: 좌석 추천 모드 에이전트(자동 배정)에게도 LLM이 구역 변경 지시를 내리는 경우.
원인: 자유로운 시스템 프롬프트는 불필요한 개입 유발.
대응: 시스템 프롬프트에 보수적 제약 명시, 집계 단에서도 자동 제외.
증상별 확인 항목
| 증상 | 확인 순서 |
|---|---|
| 에이전트가 대기열에서 멈춤 | ① 에이전트 JSONL의 QUEUE_RANK_POLL 이벤트 확인 ② 큐 URL 패턴 확인 ③ 서버 응답 코드 확인 |
| 챌린지 통과 후 구역 화면에서 정체 | ① CHALLENGE_PASSED 이후 이벤트 타임스탬프 확인 ② RECOMMEND_PARTY_SIZE_* 이벤트 확인 |
| 장거리 이동 후 체감 지연 | ① TRAJ_SYNTH 이벤트의 목표 vs 실측 지표 비교 ② 사전 위치 선점 동작 확인 |
| 요약 파일이 없음 | ① logs/attack/<env>/<run_id>/ 경로 확인 ② 종료 시점 로그 확인 |
| 코디네이터 결정이 반영 안 됨 | ① 코디네이터 JSONL 로그 확인 ② 결정 시각 이후 단계 전이 이벤트 확인 |
| 좌석 충돌이 지속 | ① 공유 점유 리스트가 갱신되는지 확인 ② PAYMENT_PAGE_REACHED 이후 다른 에이전트 excluded_seats 확인 |
| 챌린지 실패율이 높음 | ① CHALLENGE_SUB_ROUND_RESULT.result 분포 확인 ② 실패 원인별 집계 |
분석 도구
요약 파일 먼저 보기
logs/attack/<env>/<run_id>/summary_<swarm_id>_<ts>.txt
KPI 요약으로 전체 상황 파악.
에이전트 JSONL 타임라인
logs/attack/<env>/<run_id>/swarm_<ID>_agent<N>_<ts>.jsonl
단일 에이전트의 이벤트 타임라인을 시간순으로 확인.
스크린샷 교차 확인
logs/evidence/<run_id>/
의심스러운 시점의 UI 상태를 시각적으로 확인.
HAR 네트워크 트레이스
logs/evidence/<run_id>/trace.zip
서버 응답 상세를 확인해야 할 때.
여러 스웜 합산
scripts/summarize_logs.py logs/attack/<env>/*/swarm_*_agent*.jsonl
전체 스웜을 합산해 지표 재계산.
참조
- 02-workflow-states — 상태머신 이해
- 08-audit-evidence — 감사 파일 구조
- 11-events-reference — 이벤트 카탈로그