부분 재실행 QA 가이드 — 실패 지점부터 재개
이 문서는 Pipeline Studio의 부분 재실행(#2340)을 QA가 화면에서 단계별로 검증할 수 있도록 실제 prod(gend.genon.ai)의 finance-invest 워크스페이스 화면과 함께 정리한 것입니다.
개요
부분 재실행은 실패한 파이프라인 run을 처음부터 다시 돌리지 않고, 저장점 직하위 노드부터 재개하는 기능입니다.
- store(중간본 저장) 노드가 저장점(checkpoint) 역할을 합니다. store 노드는 실행 중 자신의 출력을 S3에 기록하고 그 URI를 run에 남깁니다.
- 부분 재실행은 저장점 이하의 노드만 다시 실행하고, 상위(조상) 노드는 실행하지 않습니다. 재개 지점의 입력은 S3에 기록된 checkpoint를 로드(pre-seed) 하여 채웁니다.
- MVP 규칙: 재개 가능한 노드는 직접 in-edge가 모두 checkpoint인 노드(= 저장점 직하위)뿐입니다. transitive(여러 단계 위)는 아직 지원하지 않습니다.
전체 재실행(#2038)과의 차이
- 전체 재실행은 파이프라인을 처음 노드부터 통째로 다시 실행합니다(checkpoint 무시).
- 부분 재실행은 실패 지점 근처(저장점 직하위)부터만 재개하고 상위는 skip합니다. 이미 성공한 비싼 상위 단계(수집·파싱)를 반복하지 않아 빠르고, 외부 호출/비용을 줄입니다.
1. 시나리오 소개
다음과 같은 6노드 파이프라인을 가정합니다.
fetch → parse → save(중간본 저장) → chunk → embed → vector
save는 store(중간본 저장) 노드로 저장점 역할을 합니다. (전체 그래프는 아래 2·4단계 스크린샷에서 캔버스로 확인할 수 있습니다.)
2. 실패 발생 — vector에서 실패, save까지는 성공
vector 노드가 잘못된 백엔드(예: backend: "__invalid_backend__")로 설정되어 run이 vector에서 실패합니다. 다만 그 앞의 fetch·parse·save·chunk·embed까지는 성공했고, save가 중간본을 S3에 checkpoint로 기록해 두었습니다.
- 노드 상태: fetch/parse/save/chunk/embed = ok, vector = failed
- checkpoint_index = [save], failed_node = vector
- 에러:
Unknown vector backend: __invalid_backend__
실패한 run은 "실행"(Runs) 탭의 목록에 표시됩니다.

3. "부분 재실행" 메뉴
실패한 run에는 "부분 재실행" 버튼이 노출됩니다. 클릭하면 재개 가능한 노드만 드롭다운 옵션으로 표시됩니다.
저장점(save) 직하위인 chunk만 재개 후보이므로 옵션은 "chunk · 청킹 부터 재실행" 하나입니다(저장점 직하위만 노출).

"부분 재실행" 버튼은 종료(terminal) 상태이면서 failed인 run에만 나타납니다. 재개 가능 노드는 직접 in-edge가 모두 checkpoint를 가진 노드(= save 직하위 chunk)로 한정됩니다.
4. 원인 수정 후 재개
먼저 실패 원인을 고칩니다 — vector config를 유효한 값(예: { "collection": "zz_e2e_resume" }, 잘못된 backend 제거)으로 수정하고 재배포(deploy) 합니다.
그다음 "부분 재실행" → "chunk · 청킹 부터 재실행" 을 클릭하면 새 run이 시작되고 성공 토스트가 표시됩니다("부분 재실행을 시작했습니다").

5. 결과 확인
재개 run이 성공(succeeded) 합니다.
- 상위
fetch/parse/save= skipped (실 S3save.jsoncheckpoint를 로드해 pre-seed) - 하위
chunk/embed/vector= ok (재실행)
목록 상단의 재개 run이 green이고, 아래에 이전 실패 run이 그대로 남아 있습니다.

캔버스에서도 상위 노드는 skip되고 저장점 이하만 재실행된 것을 확인할 수 있습니다.

검증 포인트 (QA 체크리스트)
- 실패 run에만 메뉴 노출 — "부분 재실행" 버튼은 terminal + failed run에만 보인다(성공·실행중 run에는 없음).
- 저장점 직하위만 옵션 — 드롭다운에는 직접 in-edge가 모두 checkpoint인 노드(save 직하위 chunk)만 나타난다.
- 상위 skip + 하위 재실행 — 재개 run에서 fetch/parse/save는 skipped, chunk/embed/vector는 ok로 다시 실행된다.
- checkpoint 없으면 메뉴 미표시 — store 노드 출력(checkpoint)이 없는 실패 run은 부분 재실행 옵션이 없다(전체 재실행만 가능).
- 재개 지점 무효 시 422 — 직접 in-edge가 모두 checkpoint가 아닌 노드를
from_node_id로 지정하면 서버가 422로 거부한다.
동작 원리 (요약)
- store(중간본 저장) 노드가 실행되면 출력을 S3에 기록하고, 그 S3 URI를
checkpoint_index_json에 남깁니다(저장점 등록). - UI는 실패 run에서 직접 in-edge가 모두 checkpoint인 노드만 재개 후보로 계산해 "부분 재실행" 드롭다운에 노출합니다.
- 사용자가 재개 지점을 고르면
POST /runs/{id}/rerun { from_node_id }가 호출됩니다. - 서버는
from_node_id의 모든 직접 in-edge가 checkpoint(URI 보유)인지 검증합니다 — 아니면 422. - executor가 조상 노드를 skip하고, 재개 지점의 입력을 S3 checkpoint로 pre-seed한 뒤 저장점 이하만 실행합니다.
관련 PR: #2345 / #2346 / #2347
현재 상태
- prod(gend.genon.ai) 라이브 — finance-invest 워크스페이스에서 동작합니다.
- 실 S3 checkpoint 로드까지 검증됨 (2026-06-27): bad backend로 vector 실패 → save가 checkpoint 기록 → vector config 수정·재배포 → "chunk 부터 재실행" → 재개 run succeeded(fetch/parse/save = skipped, chunk/embed/vector = ok, 실 S3
save.json로드).