콘텐츠로 이동

실행, 승인, 체크포인트

실행 생명주기와 상태, 인간 승인/입력, 재시도, 체크포인트, 오래된 실행 처리 방법을 설명합니다.

워크플로우를 작성하고 저장하면, 이후 모든 실행은 런(run) 이 됩니다. 런은 고유한 상태, 단계별 결과, 디스크 체크포인트를 가진 추적 가능한 인스턴스입니다. 이 페이지에서는 런 생명주기와 상태, 인간 승인 또는 자유 형식 입력을 위해 런을 일시 정지하는 방법, 실패한 런을 재시도하는 방법, 체크포인트가 상태를 유지하는 방식, 그리고 Cloud Run과 같은 임시(ephemeral) 호스트에서 발생하는 오래된 실행(stale run) 문제를 다룹니다.

이 페이지는 대시보드에서 런을 모니터링하고, 승인 게이트를 처리하고, 실패를 재시도하는 등 워크플로우를 일상적으로 운영할 때 참고하세요. 아직 워크플로우를 실행해 본 적이 없다면 첫 번째 워크플로우부터 시작하세요. 정의 CRUD 및 런 엔드포인트 전체 내용은 Workflows & Architect API를 참조하세요.

런은 워크플로우를 시작할 때 생성됩니다(대시보드의 Execute 버튼, POST /api/workflows/run/{name}, 크론 트리거, 또는 엔티티 이벤트 트리거). 오퍼레이터는 단계 DAG를 실행하고, 게이트웨이는 로컬 체크포인트 데이터를 Kumiho 런 레코드 위에 오버레이하여 상태를 보고합니다. 이를 통해 지속성 플러시 사이에도 진행 상태가 최신으로 유지됩니다.

상태의미
pending생성되었지만 아직 실행기가 처리하지 않은 상태.
running실행기가 활성 상태.
pausedhuman_approval 또는 human_input 게이트에서 대기 중.
completed모든 단계가 성공적으로 완료됨.
failed단계가 실패함; 재시도할 수 있도록 체크포인트가 보존됨.
cancelled사용자 또는 시스템에 의해 중지됨.
stale체크포인트도 없고 활성 잠금도 없는 비종단(non-terminal) 상태 — 오래된 실행을 참조하세요.

런 id로 단일 런을 조회합니다. 모든 워크플로우 경로에는 페어링 bearer 토큰이 필요합니다(페어링 & 인증 참조).

GET /api/workflows/runs/{run_id}
Authorization: Bearer <token>

응답은 단계별 상세 정보가 포함된 { "run": { ... } } 형식입니다. 활성 런은 실행기의 인메모리 상태에서 읽고, 완료된 런은 Kumiho 런 레코드에서 조회합니다. 알 수 없는 run_id404를 반환합니다.

최근 런 목록을 조회하려면:

GET /api/workflows/runs?limit=20&workflow=hello-world
Authorization: Bearer <token>
쿼리 파라미터기본값의미
limit20반환할 런 수.
workflow워크플로우 이름으로 필터링.

런을 중지하면 실행기에 신호가 전달되고, 실행기는 다음 단계 경계에서 멈추며 가능한 경우 소유한 셸/파이썬 서브프로세스를 종료합니다. 런을 삭제하면 Kumiho 런 레코드와 로컬 체크포인트 및 아티팩트 파일이 최선의 방법으로 제거됩니다. 워크플로우 정의는 삭제되거나 폐기되지 않습니다(정의는 별도의 /api/workflows/{kref} 경로를 사용합니다).

메서드경로효과
POST/api/workflows/runs/{run_id}/cancel다음 경계에서 활성 런을 중지.
DELETE/api/workflows/runs/{run_id}런 레코드와 로컬 파일을 삭제.

전체 런 엔드포인트(목록, 트리거, 승인, 재시도, 취소, 삭제, 대시보드 통계, 에이전트 활동)는 Workflows & Architect API에서 확인할 수 있습니다.

checkpoint: true(워크플로우 수준 기본값)를 설정하면, 실행기는 각 단계가 완료된 후 및 인간 승인을 위해 일시 정지될 때 런 상태를 디스크에 저장합니다. 재시도와 승인 후 재개를 가능하게 하는 것이 바로 이 기능입니다.

name: deploy-pipeline
version: "1.0"
checkpoint: true # workflow-level default is true
steps:
- id: build
type: shell
shell:
command: "npm run build"
아티팩트경로목적
체크포인트 파일~/.revka/workflow_checkpoints/{run_id}.json완료된 단계와 해당 출력의 스냅샷.
잠금 파일~/.revka/workflow_locks/{run_id[:12]}.lock런이 실행 중인 동안 보유하는 권고 잠금.

게이트웨이는 두 파일을 모두 읽어 런의 활성 상태를 결정합니다. 활성 잠금은 실행기가 살아있음을 의미하고, 체크포인트는 단계별 진행 상황을 제공합니다.

단계별 재시도는 런 진행 중에 발생하는 일시적 오류를 처리합니다. retry(첫 번째 시도 후 추가 시도 횟수)와 선택적 retry_delay(시도 간 대기 시간, 초)를 설정합니다:

- id: flaky_step
type: agent
agent:
role: researcher
prompt: "Fetch and summarize the latest report."
retry: 2 # retry up to 2 times after the first attempt
retry_delay: 10 # wait 10 seconds between retries
필드타입기본값의미
retryint0첫 번째 실패 후 추가 시도 횟수.
retry_delayint (초)0재시도 사이의 대기 시간.

런이 failed 상태에 도달하면, 보존된 체크포인트를 통해 첫 번째 실패한 단계부터 재시도할 수 있습니다. 성공한 단계의 출력은 재사용되므로, 실패한 단계와 그 하위 단계만 다시 실행됩니다.

Workflow Runs 페이지에서 실패한 런을 선택하고 Retry를 클릭합니다. 재시도는 체크포인트부터 실행을 다시 시작합니다.

human_approval 단계는 런을 일시 정지하고 예/아니오 결정을 기다립니다. 런이 일시 정지되기 전에 체크포인트가 기록되므로, 몇 시간 후에 도착한 승인도 깔끔하게 재개됩니다.

- id: approve
type: human_approval
human_approval:
message: "Deploy to production?"
timeout: 3600 # seconds — here, 1 hour
필드타입의미
messagestring승인자에게 표시되는 프롬프트.
timeoutint (초)게이트가 타임아웃되기까지 대기 시간.

일시 정지된 동안 런은 paused 상태를 유지합니다. API를 통해 결정을 제출합니다:

POST /api/workflows/runs/{run_id}/approve
Authorization: Bearer <token>
Content-Type: application/json
{ "approved": true, "feedback": "LGTM — ship it." }
필드필수의미
approvedtrue면 승인하고 계속, false면 거부.
feedback아니오런에 전달되는 자유 형식 메모.

결정이 내려지면 게이트웨이는 대시보드 클라이언트에 human_approval_resolved SSE 이벤트(run_idapproved 포함)를 브로드캐스트합니다.

human_input 단계는 예/아니오 대신 자유 형식 텍스트를 기다리며 일시 정지합니다. 제출된 텍스트는 하위 단계에서 ${step_id.output}으로 사용할 수 있습니다.

- id: ask_user
type: human_input
human_input:
message: "What changes do you want?"
channel: dashboard
timeout: 3600
필드타입의미
messagestring오퍼레이터에게 표시되는 프롬프트.
channelstring질문할 채널(예: dashboard).
timeoutint (초)응답 대기 시간.

이후 단계에서는 예를 들어 prompt: "Apply these changes: ${ask_user.output}"와 같이 답변을 직접 사용할 수 있습니다. 전체 네임스페이스 목록은 변수, 표현식 & 트리거를 참조하세요.

승인 레지스트리 (워크플로우 인간 승인)

섹션 제목: “승인 레지스트리 (워크플로우 인간 승인)”

승인 게이트는 대시보드에만 국한되지 않습니다. 채팅 채널에서도 처리할 수 있습니다. 게이트웨이는 워크플로우 human_approval 단계를 Discord, Slack, Telegram 답글과 연결하는 프로세스 전역 승인 레지스트리를 유지합니다.

런이 승인 단계에 도달하면, 이 레지스트리에 대기 중인 승인을 등록합니다. 채널 어댑터가 승인 프롬프트를 게시한 후에는 채널의 스레드 및 메시지 ID를 첨부하여 레지스트리가 정확하게 매칭할 수 있도록 합니다. 사용자가 답글을 달면 레지스트리는 메시지를 매칭하고 원자적으로 승인을 클레임(try_claim)합니다. 이 과정에서 항목이 제거되어 이중 결정을 방지합니다. 예를 들어 Discord 답글과 대시보드 클릭이 동시에 도착하는 경쟁 상황을 방지하는 것이 바로 이 메커니즘입니다.

매칭규칙
승인메시지가 승인 키워드 중 하나로 시작(대소문자 구분 없음).
거부메시지가 거부 키워드로 시작; 키워드 이후 텍스트가 feedback이 됨.

기본 실시간 인터페이스와 SSE 이벤트가 대시보드에 전달되는 방식은 실시간: WebSocket, SSE & Live Canvas를 참조하세요. 워크플로우 하위에 위치한 별도의 게이트인 도구 호출 수준 승인은 정책, 명령어 & 샌드박싱자율성 수준 & 승인에서 다룹니다.

대시보드 — 시각적 DAG & 런 뷰어

섹션 제목: “대시보드 — 시각적 DAG & 런 뷰어”

대시보드는 워크플로우 정의와 워크플로우 을 분리하여 표시합니다. 런 화면(/runs)은 런 범위의 제어만 제공합니다. 활성 런 중지, 실패한 런 재시도, 런 레코드 삭제, 그리고 라이브 그래프 뷰를 제공합니다.

런 뷰어는 워크플로우를 인터랙티브 DAG로 렌더링하고, 각 런을 실행된 정확한 YAML 리비전에 고정합니다(workflow_revision_kref를 확인하여). 이는 정의를 나중에 수정해도 이미 완료된 런의 그래프가 변경되지 않음을 의미합니다. 보이는 것이 실제로 실행된 것입니다.

  • 완료된 조건부 노드는 그래프와 단계 인스펙터 모두에서 매칭된 브랜치, goto 대상, 브랜치 값, 출력된 결과를 표시합니다.
  • 실패한 노드는 실행기 오류, 구조화된 output_data, stderr 미리보기, 또는 캡처된 입력 등 가능한 최선의 실패 상세 정보를 표시합니다.
  • 단계 인스펙터(노드 클릭)는 상태, 에이전트 id와 역할, 출력 미리보기, 주입된 스킬, 그리고 그룹 채팅 트랜스크립트를 표시합니다.
  • **“Run to here”**는 target_step_id를 사용하여 대상 단계의 전이적 선조 집합과 단계 자체만 실행한 후 중지합니다. 특정 브랜치를 반복 작업할 때 유용합니다.

대시보드는 GET /api/workflows/dashboard를 통해 집계된 통계(정의 수, 활성 런, 최근 런)를 제공하고, GET /api/workflows/agent-activity/{agent_id}를 통해 에이전트별 드릴다운을 제공합니다. 이는 ~/.revka/operator_mcp/runlogs/{agent_id}.jsonl의 JSONL 런 로그를 기반으로 합니다. 전체 대시보드 안내는 워크플로우, 에디터 & 런을 참조하세요.

체크포인트와 잠금 파일은 오퍼레이터를 실행하는 호스트의 로컬 파일시스템에 저장됩니다. 영구 호스트에서는 이 파일들이 요청 사이에도 유지되므로 문제가 없습니다. 하지만 배포 또는 스케일-투-제로 사이클 사이에 디스크를 초기화하는 임시 호스트(Cloud Run 및 유사한 서버리스 PaaS)에서는 Kumiho 런 레코드가 여전히 running 또는 paused 상태를 표시하는 동안 해당 파일들이 사라집니다.

게이트웨이가 이러한 런을 로드할 때 체크포인트도 없고 활성 잠금도 없으면, 해당 런이 활성 상태라고 정직하게 보고할 수 없으므로 stale로 표시합니다. 오래된 실행은 사실상 고아 상태입니다. 해당 런을 보유하는 실행기도 없고, 재개할 디스크 상태도 없습니다.

상태를 영구적으로 유지하는 배포 가이드는 Docker, Compose & one-click PaaS런타임 모드, 어댑터 & 리소스 제한을 참조하세요.