Playball Logo

Command Palette

Search for a command to run...

목차 열기

02. 워크플로우 — FlowState 상태머신

에이전트는 예매 흐름을 그래프 기반 상태머신으로 관리합니다. 전체 흐름이 8개의 상태로 분리되며, 각 상태는 "지금 무엇을 해야 하는가"를 정의합니다. 한 상태의 일이 끝나면 반환값만 보고 다음 상태로 전환됩니다.

상태 정의

상태명칭역할대응 UI 단계
S0Init브라우저 기동·세션 복원경기 상세 페이지 접근
S1Pre-entry예매 버튼 클릭, 대기열 진입경기 상세 → 대기열
S2Queue큐 통과 대기대기열 화면
S3Security보안 챌린지 풀이 (인터럽트)챌린지 팝업
S4Section (MAP)직접 좌석 선택 모드 — 구역 클릭구역 선택 화면
S4RRecommend좌석 추천 모드 — 추천 카드 로드추천 결과 화면
S5Seat (MAP)좌석표에서 좌석 선택 + 예매 요청좌석표 화면
S5RAccept추천 카드 수락 또는 자동 선택추천 결과 확정
SXTerminalDONE · BLOCKED · ABORT 중 하나로 마감결제 페이지 / 차단 / 오류

전이 흐름

LangGraph FlowState state machine

문서 이미지를 큰 화면으로 확인합니다.

실선 = 정상 전이, 점선 = 실패 / 인터럽트. S3는 어떤 활성 상태에서도 발생 가능하고, 풀이 성공 시 last_non_security_state로 복귀 (공격 에이전트는 방어를 블랙박스로 가정).

상태별 반환 규칙

각 상태는 다음 상태를 값으로만 반환합니다. 상태 내부에서 직접 다음 상태를 호출하지 않습니다.

현재 상태반환 가능 다음 상태설명
S0S1, SX(ABORT)세션 복원 실패 시 중단
S1S2, S3, SX(BLOCKED), SX(ABORT)큐 진입 성공/차단 구분
S2S4, S4R, S3, SX(ABORT)모드에 따라 분기
S3이전 상태, SX(BLOCKED)챌린지 성공 시 원복, 실패 시 종료
S4S5, S3, SX(BLOCKED), SX(ABORT)구역 선택 후 좌석 단계
S4RS5R, S4 (폴백), S3, SX(BLOCKED), SX(ABORT)추천 없으면 직접 좌석 선택 폴백
S5SX(DONE), S5 (재시도), S3, SX(BLOCKED)좌석 확보 or 재시도 or 종료
S5RSX(DONE), S5R (재시도), S3, SX(BLOCKED)동일

인터럽트 처리 — 보안 챌린지

보안 챌린지는 어느 단계에서든 갑자기 뜰 수 있습니다. 모든 상태는 공통 인터럽트 패턴으로 처리합니다.

┌──────────────────────────────────────────┐
│ 현재 상태 N 진입                         │
│     ↓                                    │
│ 챌린지 가시성 체크                       │
│     ↓ (감지됨)                           │
│ last_non_security_state ← 상태 N 저장   │
│     ↓                                    │
│ S3 전환                                  │
│     ↓ (챌린지 풀이)                      │
│ last_non_security_state 값으로 복귀     │
│     ↓                                    │
│ 상태 N 재진입 → 이어서 진행              │
└──────────────────────────────────────────┘

복귀 가능 상태

다음 상태들만 last_non_security_state로 저장 가능합니다. 즉 챌린지 복귀 대상이 될 수 있습니다.

  • S0, S1, S2, S4, S4R, S5, S5R
  • S6, SX는 제외 — terminal 상태로 복귀 불필요

TIP — 이 패턴 덕분에 각 단계별로 "챌린지가 뜨면 어디로 돌아가야 하나"를 개별 구현할 필요가 없습니다. 모든 복귀 로직이 한 지점에 집중됩니다.

상태별 세부 동작

S0 — 초기화

구분내용
목적브라우저 기동, 저장된 세션으로 로그인 상태 복원
주요 동작브라우저 컨텍스트 생성, 쿠키·저장소 로드, 초기 페이지 접근
성공 조건대상 서비스 도메인에 인증된 상태로 접근 가능
실패 처리세션 만료 시 SX(ABORT)
기록 이벤트RUN_START, BOOTSTRAP_COMPLETE

S1 — 예매 진입

구분내용
목적예매 버튼 클릭, 대기열 진입
주요 동작오픈 시각 정밀 대기, 예매 버튼 탐색, 클릭
성공 조건서버가 정상 응답(2xx) 또는 큐 진입 URL 반환
실패 처리큐 미개방(409) 시 재시도 / 차단(403) 시 SX(BLOCKED)
기록 이벤트PRE_ENTRY_QUEUE_OPENED, ENTRY_CLICKED

자세한 내용은 03-open-at-sync 참조.

S2 — 대기열 통과

구분내용
목적큐 통과 대기, 다음 단계 진입
주요 동작URL 변화 감시, 보안 챌린지 가시성 폴링
성공 조건구역 선택 또는 추천 카드 UI 로드 확인
실패 처리타임아웃 시 SX(ABORT)
기록 이벤트QUEUE_PASSED

S3 — 보안 검증 인터럽트

자세한 내용은 05-vqa-solver 참조.

S4 — 구역 선택 (직접 좌석 선택 모드)

구분내용
목적목표 구역 클릭해 좌석표 로드
주요 동작인원수 드롭다운 설정, 목표 구역 탐색, 사전 마우스 이동, 클릭
성공 조건서버가 좌석표 데이터 응답(2xx)
실패 처리403 → SX(BLOCKED) / 4xx → S3 재진입
기록 이벤트SECTION_SELECTED (구역 이름 포함)

S4R — 구역 선택 (좌석 추천 모드)

구분내용
목적시스템 추천 카드 로드
주요 동작인원수 드롭다운 조작, 추천 API 응답 감시, 카드 가시화 대기
성공 조건추천 카드 또는 자동 선택 버튼 가시화
실패 처리결과 없음 시 직접 좌석 선택 모드로 폴백(S4)

S5 — 좌석 선택 (직접 좌석 선택 모드)

구분내용
목적좌석표에서 좌석 선택 + 예매 요청
주요 동작스웜 공유 점유 리스트 + 코디네이터 제외 좌석 병합, 연석 탐색, 클릭
성공 조건좌석 확보 API 2xx + 결제 페이지 리다이렉트
실패 처리좌석 충돌(409) → 재시도 / 403 → SX(BLOCKED)
기록 이벤트PAYMENT_PAGE_REACHED (좌석 라벨 포함)

좌석 분산 전략

  • 에이전트별 담당 구역·시작 열을 다르게 배정해 충돌 최소화
  • N연석 필요 시 같은 행의 인접 좌석 탐색

S5R — 추천 수락

구분내용
목적추천 카드 수락 또는 자동 선택 버튼 클릭
주요 동작카드 순차 클릭 또는 자동 선택
성공 조건좌석 확보 API 2xx + 결제 페이지 리다이렉트
기록 이벤트RECOMMEND_CARD_SELECTED, RECOMMEND_BOOK_CLICK, RECOMMEND_AUTO_CLICK

SX — 종료

종료 사유의미발생 조건
DONE좌석 확보 성공결제 페이지 도달
BLOCKED방어 차단403 응답, 챌린지 풀이 실패 등
ABORT내부 실패타임아웃, 세션 만료, 예외

NOTE — DONE 상태에서 브라우저는 자동으로 닫히지 않습니다. 사용자가 수동으로 결제를 완료할 수 있도록 유지됩니다.

그래프 기반 상태머신이 주는 이점

이점설명
디버깅 가능성"구역 선택 단계에서 막혔다"처럼 원인을 단계 수준으로 좁힐 수 있음
인터럽트 일관성모든 상태가 같은 패턴으로 챌린지 복귀 처리
흐름 예측성상태 안에서 다음 상태를 직접 호출하지 않음 → 분기 로직 한곳에 집중
확장성새로운 상태(예: 대기 시간대별 분기)를 기존 코드 건드리지 않고 추가 가능

참조