RINDA · Sequence 진단

시퀀스 "완료 처리 중" stuck 분석

beta 실데이터 기반 · 2026-06-11 · 대상 019e8622-3606-7a4e-b028-7f03d022c215 (AI 캠페인 · 6월 2일 11:20)

TL;DR

  1. 대상 시퀀스는 버그가 아님 — 백엔드의 "답장 수확 3일 가드"에 정상적으로 걸린 상태. 답장이 계속 들어와(오늘 03:29 포함 최근 3일 31건) 3일 윈도우가 매번 리셋 → 답장이 멎고 3일 지나야 자동 완료.
  2. 진짜 버그는 따로 있음 — enrollment가 끝났는데(terminal/paused) 매달린 pending/deferred execution이 정리되지 않아 영구 보류. beta 전체 802건 orphan, 최장 21일 stuck.

1. "완료 처리 중" 판정 메커니즘

프론트(campaign-status.ts:70)는 status='active' AND total>0 AND active_enrollments=0 일 때 amber 배지를 띄운다. 즉 DB는 active 인데 백엔드가 completed 로 못 넘긴 모든 경우가 동일하게 보인다. 백엔드 완료 보류 가드는 3개 (enrollment-progress.service.ts:629-647):

가드보류 조건SSOT
#1 pending-executionspending/processing/deferred execution 1건이라도 존재:664
#2 recent-replyharvest 3일 내 답장 존재:681
#3 empty-recent-emailsenrollment 0 + 마지막 발송 < 3일:723

2. beta 실데이터 — stuck 7개 시퀀스 분류

시퀀스stuckg1 pending g2 답장(3d)g3 마지막발송진단
AI 캠페인·6/2 (대상)3.1d0310.06d정상 보류
싱가폴·말레이시아3.0d070.22d정상
오세아니아 외 245명2.8d032.78d정상
동남아 418개사2.8d022.67d정상
D10_1/2 R1 Group10.9d010.45d답장 띄엄띄엄
스페로네 200명21.1d1010.16d버그
베트남 유아헤어밴드8.2d240019.16d버그

대상 시퀀스 상세

enrollment: completed 28,349 / bounced 2,094 / stopped 176 / unsub 34 — active 0건. execution은 pending 0 (skipped 32,592 · sent 28,611 · failed 103). 발송 파이프라인은 깨끗하고, 오로지 답장이 계속 들어와 완료가 미뤄지는 것.

핵심 3만 명짜리 대형 캠페인이라 자동응답·재참여(re-engage)로 답장이 끊이지 않아 가드#2의 3일 윈도우가 매번 리셋된다. 설계 의도(답장을 놓치지 않으려 완료 지연)이지만, 대형 캠페인에서는 UX상 영구 stuck 처럼 느껴지는 게 실제 불편 포인트.

3. 진짜 버그 — orphan pending execution

스페로네 / 베트남의 잔존 execution과 소속 enrollment 정합성:

시퀀스exec statusenrollment status건수예약시각
베트남deferredpaused24014d 전 ~ 5.8d 미래
스페로네pendingcompleted16.2d 전
모순 enrollment는 이미 completed/paused 인데 그에 속한 execution이 pending/deferred 로 남아 있다. 그런데 가드#1(hasPendingStepExecutions, :664)은 enrollment 상태를 보지 않고 execution 상태만 본다 → orphan이 1건이라도 있으면 그 시퀀스는 영구 보류.

beta 전체 orphan 규모

enrollment는 terminal/paused 인데 execution은 미처리:

execenrollment건수
pendingstopped685
pendingcompleted57
deferredcompleted48
deferredstopped12
합계802

근본 원인 2가지

  1. enrollment를 terminal/paused 로 전이할 때 매달린 pending/deferred execution을 skipped 로 정리하지 않음 → orphan 발생.
  2. 자동 복구 recoverStuckProcessingExecutions()(:440)는 processing 30분 threshold만 복구. pending/deferred 는 복구 경로가 없어 영구 잔존.

4. 권장 수정

순위조치효과
1가드#1 쿼리(:664)에 AND se.status='active' 추가orphan execution이 완료를 막지 못하게 — 802건 stuck 즉시 해소, 근본 정합
2enrollment terminal/paused 전이 시 잔존 pending/deferredskipped 일괄 처리orphan 신규 발생 차단
3기존 802 orphan 백필(skipped) + stuck 시퀀스 완료 재평가 1회현존 데이터 정리
4"완료 처리 중" 배지에 사유 툴팁("최근 답장 처리 중, N일 후 자동 완료")가드#2 정상 케이스 혼동 방지
핵심 순위 1이 근본 해결책이다. 가드#1이 enrollment 상태를 무시하는 것이 21일 stuck의 직접 원인이고, 한 줄 수정으로 해결된다.