← Docs hub
DeviceAgent Executor Closure Matrix
이 문서는 MR6 DeviceAgent의 60개 TaskManager executor를 “호출할 수 있는가”
가 아니라 Planner가 계획하고, 기기가 실행하고, callback으로 완료를
증명할 수 있는가 기준으로 분류한다.
1. 쉽게 읽는 법
사용자 목표
-> Planner가 의미 capability와 단계를 만든다
-> On-device가 taskMethod 계약을 전달한다
-> TaskManager가 순서·취소·timeout을 관리한다
-> DeviceAgent domain이 실제 기능을 수행한다
-> callback이 완료·실패·취소를 증명한다
-> 필요하면 Planner가 다음 단계를 바꾼다
| 상태 |
쉬운 의미 |
CLOSED_EVIDENCE |
실행 뒤 실제 완료까지 확인한다 |
CLOSED_SESSION |
앱이 끝난 것은 알지만 성공인지 취소인지는 모른다 |
MAPPED_ACK_ONLY |
실행 요청은 연결됐지만 적용 완료 확인이 약하다 |
OBSERVABLE_CONTEXT |
Planner가 현재 상태를 판단하는 데 쓴다 |
LOCAL_MANAGED |
기기 TaskManager에는 있으나 Planner가 아직 직접 계획하지 않는다 |
INTERNAL_ONLY |
내부 lifecycle·동기화·보상용이라 Planner에 노출하지 않는다 |
2. 현재 결과
| 상태 |
수량 |
대표 기능 |
CLOSED_EVIDENCE |
8 |
이동, 제자리 회전, 복귀, 청정, 보안 시작·정지·일시정지·재개 |
CLOSED_SESSION |
1 |
VitalSign/app session |
MAPPED_ACK_ONLY |
2 |
이동 제어, 기기 설정 |
OBSERVABLE_CONTEXT |
9 |
배터리, 주 상태, 기기 상태, 청정, Map, 스테이션·도킹·Vision 관찰, Security preflight |
LOCAL_MANAGED |
26 |
일정, interaction, LED, TTS, Map 요청, 설정 조회 |
INTERNAL_ONLY |
14 |
상태 동기화, 보상 정지, OTA 결과, 내부 refresh |
| 합계 |
60 |
MR6 TaskExecutorBootstrap 등록 수와 동일 |
60개가 모두 사용자용 기능인 것은 아니다. 특히 내부 lifecycle method를
Planner capability로 그대로 공개하면 안전 경계와 계약이 무너진다.
3. Domain별 폐쇄성
Framework
| taskMethod |
상태 |
핵심 근거 |
getBatteryInfo |
OBSERVABLE_CONTEXT |
freshness가 적용된 배터리 context |
getFirmwareVersion |
LOCAL_MANAGED |
동기 응답만 존재 |
getMainState |
OBSERVABLE_CONTEXT |
main state snapshot |
getDeviceStatus |
OBSERVABLE_CONTEXT |
device state snapshot |
getAirCleanerOperation |
OBSERVABLE_CONTEXT |
cleaning snapshot |
setLauncherScreen |
CLOSED_SESSION |
app.sessionEnded, 결과 의미는 미구분 |
getConfiguration |
LOCAL_MANAGED |
설정 동기 응답 |
getStationLocationEvidence |
OBSERVABLE_CONTEXT |
스테이션 위치 후보와 신뢰도·확인 필요 여부 snapshot |
probeDockingSignal |
OBSERVABLE_CONTEXT |
물리 동작 없이 최신 도킹 신호 stage를 관찰 |
rotateInPlace |
CLOSED_EVIDENCE |
회전 완료와 정지 상태를 함께 확인 |
observeVisionSemantics |
OBSERVABLE_CONTEXT |
정지·관찰 자세 뒤 raw frame 없이 최신 의미 결과만 반환 |
Main API
| taskMethod |
상태 |
핵심 근거 |
getAirClearAutoStartModeEnable |
LOCAL_MANAGED |
동기 응답 |
getFollowMeStatus |
LOCAL_MANAGED |
동기 응답 |
reqmap |
LOCAL_MANAGED |
mapping.dataReceived |
isMapFilePresent |
OBSERVABLE_CONTEXT |
Map availability |
resetReturnToStationCounter |
INTERNAL_ONLY |
복귀 retry 상태 초기화 |
setAMRMonitoring |
INTERNAL_ONLY |
AMR 진단·모니터링 제어 |
checkSecurityBasicAvailability |
OBSERVABLE_CONTEXT |
WSS preflight |
startSecurityMode |
CLOSED_EVIDENCE |
security.started |
pauseSecurityMode |
CLOSED_EVIDENCE |
security.paused |
resumeSecurityMode |
CLOSED_EVIDENCE |
security.resumed |
stopSecurityMode |
CLOSED_EVIDENCE |
security.stopped |
Movement
| taskMethod |
상태 |
핵심 근거 |
returnToStation |
CLOSED_EVIDENCE |
movement.stationCharging |
setMoveTo |
CLOSED_EVIDENCE |
movement.arrived와 controller idle |
setMoving |
MAPPED_ACK_ONLY |
command acceptance |
stopMovement |
INTERNAL_ONLY |
cancel·compensation |
Cleaning
| taskMethod |
상태 |
핵심 근거 |
setAirCleanerOperation |
CLOSED_EVIDENCE |
started/stopped/step/report target |
setStatusClean |
LOCAL_MANAGED |
command acceptance |
stopCleaning |
LOCAL_MANAGED |
alias 정규화 경계 확인 필요 |
ampStop |
LOCAL_MANAGED |
command acceptance |
LLM / TTS
| taskMethod |
상태 |
핵심 근거 |
setChangeLlmStatus |
INTERNAL_ONLY |
voice pipeline lifecycle |
setLlmTts |
LOCAL_MANAGED |
playback terminal 부재 |
stopLlm |
INTERNAL_ONLY |
lifecycle stop |
stopTts |
INTERNAL_ONLY |
lifecycle stop |
IoT / Settings
| taskMethod |
상태 |
핵심 근거 |
setDeviceStatus |
INTERNAL_ONLY |
device/voice 상태 동기화 |
setConfig |
MAPPED_ACK_ONLY |
여러 설정 capability가 수렴, 일반 read-back 부재 |
getConfig |
LOCAL_MANAGED |
동기 응답 |
Routine / LED
| taskMethod |
상태 |
핵심 근거 |
setEyeLedColor |
LOCAL_MANAGED |
command acceptance |
setCurrentPuiEyeLedColor |
INTERNAL_ONLY |
PUI 상태 동기화 |
startEyeLedScene |
LOCAL_MANAGED |
scene terminal 부재 |
Product Schedule / Interaction
| taskMethod |
상태 |
핵심 근거 |
addSchedule |
LOCAL_MANAGED |
DB write |
editSchedule |
LOCAL_MANAGED |
DB write |
deleteSchedule |
LOCAL_MANAGED |
DB write |
scheduleiot |
LOCAL_MANAGED |
IoT 일정 upsert/remove |
setActiveSchedule |
LOCAL_MANAGED |
활성 상태 변경 |
puiEditSchedule |
INTERNAL_ONLY |
PUI 동기화 |
callschedule |
LOCAL_MANAGED |
일정 목록 응답 |
getschedule |
LOCAL_MANAGED |
일정 목록 응답 |
getUpComingSchedule |
LOCAL_MANAGED |
다음 일정 응답 |
setScheduleExecuted |
INTERNAL_ONLY |
실행 상태 동기화 |
getScheduleHolidays |
LOCAL_MANAGED |
휴일 조회 |
setScheduleHolidays |
LOCAL_MANAGED |
DB post-check |
setScheduleExecutionOnHoliday |
LOCAL_MANAGED |
DB post-check |
removeScheduleHoliday |
LOCAL_MANAGED |
DB post-check |
refreshSchedule |
INTERNAL_ONLY |
내부 refresh |
gpsLocNearBy |
LOCAL_MANAGED |
interaction 시작, 전체 terminal 부족 |
interSchedule |
LOCAL_MANAGED |
interaction lifecycle terminal은 있으나 Cloud typed action 없음 |
Firmware Update
| taskMethod |
상태 |
핵심 근거 |
OTAUpdateArmResult |
INTERNAL_ONLY |
OTA callback 반영 |
OTAUpdateMcuResult |
INTERNAL_ONLY |
OTA callback 반영 |
setFirmwareUpdateStatus |
INTERNAL_ONLY |
update 상태 동기화 |
4. 현재 가장 중요한 구조 차이
4.1 Cloud method와 MR6 executor가 완전히 같지 않다
Cloud compiler는 setLanguage, setPuiWaitingScreenTheme를 생성할 수 있지만
두 method는 MR6 전용 executor 60개에 포함되지 않는다. 현재 동작한다면
TaskManager의 legacy command factory fallback에 의존하는 것이다.
strict managed-only 경로로 전환하기 전에 전용 executor 또는 setConfig
정규화 계약을 선택해야 한다.
4.2 On-device 범용 전달은 병목이 아니다
On-device ManagedDeviceTask는 청정 위치·상태를 보정하는 경우 외에는
Cloud의 taskMethod와 workflow metadata를 그대로 DeviceAgent에 전달한다.
따라서 다음 기능을 추가할 때마다 새로운 발화 문자열 adapter를 만드는
방식은 필요하지 않다.
4.3 다음 우선순위는 Interaction이다
interSchedule은 welcome, wake-up, relax 흐름과 다음 완료 evidence를 이미
가지고 있다.
interaction.started
interaction.arrived
interaction.actionStarted
interaction.actionEnded
interaction.returning
interaction.completed
하지만 Cloud capability registry와 typed action compiler가 연결되지 않아
Planner가 이 lifecycle을 복합 workflow에 안전하게 배치할 수 없다.
다음 보강은 사용자 문장 keyword가 아니라 다음 구조화 계약이어야 한다.
{
"capability_id": "interaction_experience",
"operation": "start",
"arguments": {
"experience_type": "welcome",
"schedule_id": "..."
},
"completion_target": "interaction.completed"
}
5. 변경 설명 원칙
이후 구현 설명은 파일 목록보다 아래 흐름을 먼저 사용한다.
무엇을 하려는가
-> 어떤 상태를 확인하는가
-> Planner가 어떤 단계로 나눴는가
-> TaskManager가 무엇을 관리하는가
-> 어떤 callback을 성공 증거로 썼는가
-> 실패하면 무엇을 다시 계획하는가
이 기준으로 “소스에 함수가 있다”, “TaskManager에 등록됐다”,
“Cloud에서 계획된다”, “실기기에서 완료까지 검증됐다”를 서로 다른
상태로 기록한다.