← Docs hub

TaskManager 사양 3 · 생명주기와 Workflow

None
사양 허브DeviceAgent MR6Spec 1.9

TaskRecord, 실행 모드, Workflow, 완료 증거, 취소, 실패, 이벤트와 예약 실행을 정의한다.

이 장의 결론: API 반환은 완료가 아니며, 다음 단계는 각 도메인의 최신 완료 증거가 확인된 뒤에만 진행한다.

8. TaskRecord와 생명주기

8.1 TaskRecord가 보존하는 정보

구분 필드
식별 taskId, method, workflowName
입력 input, source, 요청·추적·상관관계 메타데이터
실행 queueKey, executionMode, priority, timeoutMs
정책 maxRetries, cancellable, cancelMethod
상태 state, progress, stage, message
시간 createdAtMs, startedAtMs, finishedAtMs, updatedAtMs
실패 errorCode, reason, reasonCode, reasonParams
복구 recoverability, suggestedAction, requiresCloudDecision
Workflow currentStepIndex, currentStepMethod, workflowStepStates
상위·하위 관계 parentRecord, parentGroupId, activeChildRecords
생명주기 취소·보상 동작 명령과 실행·실패 여부
결과 result, workflowState

8.2 상태 모델

TaskManager Task 상태 생명주기

상태 의미 최종 상태 여부
PENDING 대기열에서 실행 대기 아니오
RUNNING 실행기 또는 Workflow 실행 중 아니오
CANCELLING 취소 명령과 실행 중단 여부 확인 중 아니오
COMPLETED 성공을 증명하는 실제 완료 증거까지 확인
FAILED 실행 오류, 시간 초과, 예약 시점의 실행 불가 또는 취소 확인 실패
PARTIAL_FAILED 병렬 일부 실패를 보존
CANCELLED 취소가 확인됨

CANCELLEDCOMPLETED가 아니다. PUI에서 사용자가 청정을 중단하거나 앱 세션을 취소한 경우에도 “작업 종료”와 “목표 성공”을 구분해야 한다.

8.3 ID와 보존

8.4 진행률


9. 실행 런타임

9.1 DIRECT

  1. 실행 기록 생성 및 저장
  2. RUNNING 상태와 STARTED 이벤트 기록
  3. 호출 스레드에서 명령 실행
  4. 결과 저장
  5. 성공 시 COMPLETED, 예외 시 FAILED
  6. 최종 상태 지표와 이벤트 기록

DIRECT는 짧은 조회에 적합하다. 물리 동작처럼 메서드 반환과 실제 완료 시점이 다른 기능에 사용하면 안 된다.

9.2 QUEUED_WAIT

  1. 우선순위가 지정된 작업을 대기열에 제출
  2. 호출자는 Future.get(timeout)으로 대기
  3. 런타임이 재시도, 완료 대기와 최종 상태 관리
  4. 시간 초과 또는 중단 발생 시 구조화된 실패 반환
  5. 최종 결과를 호출자에게 반환

호출 스레드를 점유하므로 긴 사용자 세션에는 신중하게 사용한다.

9.3 ASYNC

  1. 대기열에 Task 제출
  2. accepted=true, taskId를 즉시 반환
  3. 실제 실행과 완료 증거 대기는 실행기 스레드에서 계속됨
  4. 진행·완료·실패는 이벤트와 상태 조회로 관찰

이동, 복귀, 청정, 보안처럼 시간이 걸리는 동작의 기본 실행 방식이다.

9.4 재시도


10. Workflow 런타임

TaskManager가 관리하는 복합 workflow 예시

10.1 상위 Workflow와 단계

submitWorkflow는 하나의 상위 TaskRecord를 만들고 subTasks를 순서대로 처리한다.

각 순차 단계는 다음 정보를 가진다.

단계 상태 필드 의미
index Workflow 안의 단계 순번
stepId, cloud_step_id 기기 단계와 상위 계획 단계의 식별자
taskMethod 단계에서 실행하는 기기 기능
state 단계의 현재 생명주기 상태
stage, message 진행 구간과 운영·사용자 표시 문구
completedAtMs 단계가 종료된 시각
result 단계 실행 결과
errorCode, reason 단계 실패 코드와 원인

10.2 순차 실행

각 단계의 기본 순서는 다음과 같다.

  1. 별칭 정규화와 입력 검증
  2. 도메인 자원 실행 허용 판정
  3. 단계 상태를 PENDING으로 변경
  4. 시작 조건과 실행 조건 평가
  5. WORKFLOW_STEP_STARTED
  6. 도메인 명령 생성과 실행
  7. 완료 조건 대기
  8. 결과 저장 후 COMPLETED로 변경
  9. WORKFLOW_STEP_COMPLETED
  10. 다음 단계 진입

앞 단계의 실제 완료 증거가 없으면 다음 단계를 시작하면 안 된다.

10.3 단계 의존성

현재 구현은 두 가지 실행 조건을 지원한다.

조건 유형 의미 조건 불충족 처리
step_completed 지정 단계가 COMPLETED 또는 SKIPPED인지 확인 실패
step_output_equals 지정 단계 결과의 Bundle 경로가 기대값과 같은지 확인 onFalse=skip 또는 실패

예시:

{
  "stepId": "clean-if-available",
  "taskMethod": "setAirCleanerOperation",
  "conditions": [
    {
      "type": "step_output_equals",
      "stepId": "read-air-quality",
      "path": "result.needs_cleaning",
      "value": "true",
      "onFalse": "skip"
    }
  ]
}

step_output_equals는 현재 Boolean 또는 String 비교를 지원한다. 범위 비교, 숫자 연산자와 복합 AND/OR 조건식은 목표 확장이다.

10.4 이전 단계 기준 지연

after_step 시작 조건은 선행 단계 완료 후 일정 시간이 지나면 다음 단계를 시작한다.

{
  "stepId": "vital-after-move",
  "taskMethod": "setLauncherScreen",
  "screenName": "vitalSign",
  "trigger": {
    "type": "after_step",
    "stepId": "move-room-1",
    "delayMs": 30000
  },
  "conditions": [
    {
      "type": "step_completed",
      "stepId": "move-room-1"
    }
  ]
}

지연 시간 동안 단계 상태는 WAITING, 세부 단계는 scheduled_delay_wait가 되며 remainingDelayMs가 갱신된다. 현재 구현은 Workflow 스레드 안에서 대기하므로, 매우 긴 지연은 별도의 영속 예약 실행으로 처리해야 한다.

10.5 병렬 그룹

{
  "type": "parallelGroup",
  "groupId": "feedback-group",
  "joinPolicy": "all_success",
  "failurePolicy": "partial_success",
  "tasks": [
    {"taskMethod": "setEyeLedColor", "color": "calm"},
    {"taskMethod": "setLlmTts", "text": "청정을 시작합니다"}
  ]
}

현재 구현은 다음과 같다.

10.6 실패 정책

실패 정책 현재 동작
fail_parent 하위 Task 실패를 상위 Task 실패로 전파
partial_success 그룹과 상위 Task를 PARTIAL_FAILED로 보존
continue_on_failure 실패 정보를 남기고 다음 단계 진행 가능

partial_success를 전체 성공으로 처리하면 안 된다. 상위 서비스와 UX는 “일부 완료” 상태를 명시적으로 다뤄야 한다.

10.7 Workflow 대기열의 책임 경계


11. 완료 증거

TaskManager 완료 판정 신호 모델

11.1 왜 메서드 반환만으로 부족한가

setMoveTo()가 성공을 반환해도 이동 요청이 전달됐다는 뜻일 뿐, 목표 공간 도착을 보장하지 않는다. setLauncherScreen()도 화면 전환 요청과 사용자의 측정 완료는 서로 다른 사건이다.

TaskManager는 다음 세 시점을 분리한다.

이벤트 단계 의미
accepted 요청을 접수하고 실행 관리가 시작됨
started 기기 도메인의 실제 실행이 시작됨
completed 목표를 증명하는 실제 완료 증거를 확인함

11.2 현재 완료 조건

도메인 완료 조건 완료 의미
Movement movement.arrived 목표 공간 도착
Movement movement.stationCharging 스테이션 복귀 후 충전 상태
Movement movement.rotationCompleted 제자리 회전 완료
Cleaning cleaning.started 청정 시작 확인
Cleaning cleaning.stopped 청정 동작의 최종 중지 확인
Cleaning cleaning.stepComplete 청정 내부 단계 완료
Cleaning cleaning.reportDone 청정 결과 보고 완료
Interaction interaction.started 상호작용 세션 시작
Interaction interaction.arrived 상호작용 위치 도착
Interaction interaction.actionStarted 콘텐츠/동작 시작
Interaction interaction.actionEnded 콘텐츠/동작 종료
Interaction interaction.returning 복귀 시작
Interaction interaction.completed 전체 상호작용 완료
Security security.started 보안 모드 시작
Security security.paused 보안 일시정지
Security security.resumed 보안 재개
Security security.stopped 보안 모드 종료
Security security.patrolCompleted 순찰 주기 완료
Mapping mapping.dataReceived 지도 데이터 수신
App app.sessionStarted 외부 앱 세션 시작
App app.sessionEnded 사용자 완료/정상 종료
TTS tts.playbackStarted 실제 재생 시작
TTS tts.playbackEnded 실제 재생 종료
UI ui.screenApplied 화면 적용 확인

현재 DeviceAgent Core의 완료 조건 목록과 AAR 공개 상수 목록은 완전히 같지 않다. Core에는 movement.rotationCompleted, tts.playbackStarted, tts.playbackEnded, ui.screenApplied가 있지만 현재 TaskManagerClient.TaskCompletionTargets에는 이 네 상수가 없다. 원시 문자열로는 요청할 수는 있지만 타입 기반 SDK 계약이 완성된 것은 아니다. AAR 상수 추가와 계층 간 상수 정합성 검사가 필요하다.

11.3 CompletionStateStore

11.4 CompletionWatcher

TaskManager 완료 증거 감시 흐름

since 기준이 없으면 이전 이동이나 TTS 이벤트가 새 Task를 즉시 완료시키는 과거 증거 재사용 문제가 생긴다.

11.5 장기 세션 완료 의미

기능 시작 증거 정상 완료 취소·실패
Vital Sign 앱 세션 실행 중 사용자가 측정을 완료하고 앱이 최종 결과 반환 사용자 취소 또는 앱 오류
Security 보안 모드 시작 사용자가 모드를 종료하거나 정책상 최종 이벤트 발생 중지·취소·실패
Welcome 상호작용 시작 또는 위치 도착 예약된 시나리오의 동작과 복귀까지 완료 사용자 취소, 시간 초과, 도메인 실패
TTS 재생 시작 재생 후 LLM 상태가 IDLE로 전환 호출어 취소 또는 STOP
Launcher 화면 화면 적용 단순 전환은 적용 확인. 앱 세션이면 세션 종료까지 확인 앱 취소 또는 오류

화면이 열렸다는 이유로 Vital Sign 측정 Task 전체를 완료하면 안 된다. 이 경우 setLauncherScreen은 시작 단계이고 app.sessionEnded가 완료 단계다.

11.6 AppSessionCompletionBridge

11.7 LlmTaskCompletionBridge


12. 취소와 보상 동작

12.1 취소 처리 순서

  1. 대상 실행 기록과 최종 상태 여부 확인
  2. cancellable 확인
  3. CANCELLING 전이
  4. 실행 중인 Workflow 하위 Task 취소
  5. 실행 중이면 취소 명령 실행
  6. 비동기 실행 취소와 대기열 제거
  7. 취소 증거가 충분하면 CANCELLED
  8. 취소 확인이 불충분하면 FAILED(cancel_failed)

12.2 확인된 생명주기 계약

도메인 취소 메서드 보강 매개변수
Movement stopMovement 생명주기 동작과 대상 메서드
Cleaning setAirCleanerOperation action=0, 모듈·TaskManager 메타데이터
LLM setChangeLlmStatus 중지 상태
Interaction interSchedule action=0
Security stopSecurityMode 도메인 중지 계약

12.3 보상 동작

보상 동작은 취소와 다르다.

예를 들어 이동 후 화면 전환에 실패한 Workflow에서 “원위치 복귀”가 항상 올바른 보상 동작은 아니다. 배터리와 장애 상태에 따라 스테이션 복귀나 현 위치 대기가 더 안전할 수 있다. 따라서 보상 메서드는 기능별 안전성 검토를 거쳐 등록한다.

12.4 PUI 취소

PUI 버튼이 기기 도메인을 직접 중단한 경우에도 TaskManager가 최종 상태 증거를 받아야 한다.

PUI 취소가 Task 최종 상태로 반영되는 흐름

PUI와 음성 경로가 별도 상태를 관리하면 실제 기기는 멈췄는데 TaskManager에는 계속 RUNNING으로 남는 고립 Task가 생긴다.


13. 실패 사유 계약

실패를 자연어 한 문장으로만 전달하면 상위 시스템이 안전하게 분기할 수 없다. TaskManager는 하위 오류와 제품 수준의 실패 사유를 분리한다.

13.1 실패 사유 코드

실패 사유 코드 대표 하위 오류 의미
TIMEOUT timeout, completion_timeout 제한 시간 내 완료 증거 없음
INTERRUPTED interrupted 실행 스레드 중단
USER_CANCELLED cancelled 사용자 또는 명시적 취소
DEVICE_BUSY queue_full, resource_busy 현재 실행 충돌
RESOURCE_LIMIT cpu/ram/thermal limit 시스템 자원 부족
STATE_CONDITION_FAILED move policy not allowed 등 현재 기기 상태에서 실행 불가
CAPABILITY_UNAVAILABLE validation/missing command 기능 또는 입력 계약 없음
PATH_BLOCKED navigation path blocked 이동 경로 장애
ROOM_NOT_FOUND position/location not found 대상 공간을 기기 공간 정보와 연결하지 못함
LOW_BATTERY battery low 전력 조건 미충족
SENSOR_ERROR sensor failure 필요한 관찰 실패
UNKNOWN 정규화되지 않은 오류 분류되지 않은 실패

13.2 실패 사유 매개변수

현재 공통 매개변수는 다음을 보존한다.

13.3 복구 가능성과 후속 조치

실패 사유 복구 가능성 권장 조치
LOW_BATTERY device_self_recoverable DOCK_AND_RESUME
PATH_BLOCKED user_action_required ASK_USER_CLEAR_PATH
ROOM_NOT_FOUND user_action_required ASK_USER_TARGET
USER_CANCELLED user_action_required CANCEL_WORKFLOW
DEVICE_BUSY/RESOURCE_LIMIT/TIMEOUT auto_retryable RETRY_OR_WAIT
STATE/CAPABILITY/SENSOR cloud_replan_required REPLAN
기타 cloud_replan_required ASK_USER

13.4 Cloud 판단 경계

현재 requiresCloudDecision은 실패 사유에 따라 계산된다. 다만 이 값이 true라고 해서 반드시 LLM을 호출해야 하는 것은 아니다.

20.5 콜백 이후 재계획 경계의 구조도처럼 짧은 대기 후 재시도, 저전력 복귀와 명시적 취소 종료는 기기 내부 정책으로 처리할 수 있다. 목표 공간 대체, 기능 변경, Workflow 재구성이나 사용자 동의가 필요하면 상위 판단으로 전달한다.


14. 이벤트 계약

14.1 이벤트 종류

이벤트 이름 의미
STARTED Task 시작
PROGRESS 진행률/단계 갱신
COMPLETED Task 성공 완료
FAILED Task 실패
CANCELLED Task 취소 완료
WORKFLOW_STEP_WAITING 선행 단계 기준 지연 또는 조건 대기
WORKFLOW_STEP_STARTED Workflow 단계 시작
WORKFLOW_STEP_COMPLETED Workflow 단계 종료
WORKFLOW_STEP_SKIPPED 조건 불충족으로 단계 생략
예약 BLOCKED 실행 시점의 허용 판정에서 차단됨

14.2 이벤트 데이터

{
  "type": "task_event",
  "deviceId": "A1-board-005",
  "eventName": "WORKFLOW_STEP_COMPLETED",
  "taskId": "task-42",
  "taskMethod": "setMoveTo",
  "source": "CLOUD",
  "state": "RUNNING",
  "queue": "workflow",
  "progress": 33,
  "traceId": "trace-001",
  "workflowName": "room_clean_return",
  "currentStepIndex": 0,
  "currentStepMethod": "setMoveTo",
  "cloud_workflow_id": "wf-001",
  "cloud_step_id": "move-bedroom",
  "stage": "movement",
  "message": "안방 이동 완료",
  "completionTarget": "movement.arrived",
  "requires_cloud_decision": false,
  "ts": 1786400000000
}

14.3 이벤트 처리 원칙


15. 예약 실행

TaskManager의 예약 실행은 제품의 반복 스케줄 기능과 구분해야 한다.

15.1 세 시간 계층

계층 예시 소유자 저장/실행
제품 반복 일정 매일 밤 9시 청정 Schedule 도메인 제품 스케줄 DB와 정책
TaskManager 지연 실행 30분 뒤 안방 청정 TaskManager ScheduledTaskRecord와 실행 시점 허용 판정
선행 단계 기준 지연 이동 완료 30초 후 화면 전환 Workflow 런타임 after_step + delayMs

15.2 예약 등록과 실행 분리

30분 뒤 이동 청정 workflow

scheduleTaskscheduleWorkflow는 등록 시점에 기기 기능을 실행하지 않는다.

예약 등록에서 실행 시점 재접수까지의 흐름

15.3 예약 유형

유형 의미 현재 Core 처리
deferred_task TaskManager 일회성 지연 실행 지원
native_product 제품 고유 반복 스케줄 AAR 상수는 있으나 TaskManager 지연 등록과 구분
event_continuation 이벤트 콜백 기반 재개 계약 확장 값으로, 일반 지연 등록과 분리

현재 TaskManager.normalizeDeferredScheduleKind()는 Core 예약 등록을 deferred_task로 제한한다. 제품 스케줄은 기존 스케줄 메서드를 Task로 호출할 수 있지만, 일정 데이터의 저장과 관리 책임은 제품 Schedule 도메인에 남는다.

15.4 실행 조건과 미실행 처리

예약 요청은 절대 시각 또는 상대 지연 시간을 정규화해 실행 시각을 저장한다. 주요 필드는 다음과 같다.

실행 시각이 허용 유예 시간을 지난 Task는 MISSED_RUN_EXPIRED로 차단할 수 있다. 오래된 예약을 뒤늦게 무조건 실행하면 이동이나 청정이 예상하지 않은 시간에 시작될 수 있다.

15.5 예약 상태

상태 의미
SCHEDULED 등록됐고 실행 시각 전
ADMITTED 실행 시각에 실제 Task 또는 Workflow 제출 성공
BLOCKED 실행 시각이 됐지만 현재 상태에서 실행 불가
CANCELLED 실행 전 예약 취소

15.6 영속성

기본 예약 저장소:

/mnt/data2/db/taskmanager_scheduled_tasks.json

관련 시스템 속성:

persist.sys.deviceagent.taskmanager.schedule_persist
persist.sys.deviceagent.taskmanager.schedule_persist_path

등록 후 스냅숏을 저장하고 AlarmManager 실행기가 다음 실행 시각을 재예약한다. 부팅 복원 후에는 기기 식별자, 시계 변경과 미실행 유예 시간을 다시 검증해야 한다.

예약 런타임이 코드에 존재한다고 자동 실행되는 것은 아니다. 현재 기본값은 다음과 같다.

설정 기본값 의미
taskmanager.scheduler.enable false 30초 주기 실행 시각 확인 비활성
taskmanager.scheduler.interval_ms 30000 실행 시각 확인 주기
taskmanager.scheduler.limit 20 한 번에 실행 허용할 최대 예약 수
taskmanager.scheduler.exact_alarm false setExactAndAllowWhileIdle 재예약 비활성

따라서 출시 형상에서 예약 자동 실행을 보장하려면 등록 성공뿐 아니라 해당 속성, 수신기·서비스 생명주기, 정확한 알람 권한, 재부팅 복원과 실행 시각 이벤트를 함께 확인해야 한다.

15.7 현재 검증 경계


제4부 · 도메인과 외부 연동 — 16~20장은 기존 기기 기능, 계획 컨텍스트, AAR, IoT/MQTT와 선택적 Planner 연결을 설명한다.

Keyboard shortcuts

⌘K / Ctrl+KOpen command palette
/Focus search
g hGo to home
g pGo to projects
g sGo to sessions
j / kNext / prev row (tables)
?Show this help
EscClose dialogs

Structured queries

Mix key:value filters with free text in the palette:

type:sessionOnly session pages
project:llm-wikiFilter by project name (substring)
model:claudeFilter by model name (substring)
date:>2026-03-01Sessions after a date
date:<2026-04-01Sessions before a date
tags:rustPages mentioning a tag/topic
sort:dateSort results by date (newest first)

Example: type:session project:llm-wiki date:>2026-04 sort:date