이동 취소의 수명 — 실행 세션 종료 후 중단 확인은 누가 맡는가
내부 통합 구현·회귀 검증 완료 / 제품 경로 미연결 / 실기기 미검증.
선택형 실행 경로에서 세션 종료 이후의 중단 관측을 AMR 서비스로 실제 인계한다.
서버 604개·SDK 62개 테스트와 release APK 빌드를 확인했다. 미완 LLM/TTS 변경을
제외한 소스 스냅샷 검증이며 제품 공급자 활성화나 AOSP 이미지 검증은 아니다.
최종 커밋·검증 이력은 진행 현황에 기록한다.
구현 커밋은 5d6280c이며 refactor/blueprint-foundation에 유지한다.
이 페이지는 승인된 중단 관측 수명 설계와 현재 구현 계약을 설명한다.
최종 검증 결과는 리팩터링 진행 현황에 구분해서 기록한다.
제품에서 이 경로가 기본으로 실행된다는 뜻은 아니다.
1. 전체 구조에서 어느 부분인가
Blueprint는 AOSP 위의 SKIX 전체 계층을, 전체 구조 Atlas는 모듈과 폴더를 보여 준다. 아래 그림은 그중 AMR 실행 세션 → AMR 서비스 → Task 결과 처리 연결을 확대한 것이다. 별도의 SystemServer나 새로운 제품 도메인을 만드는 작업이 아니다.
2. 취소 요청과 실제 정지는 다르다
주행 중 취소 요청을 받으면 Task는 CANCELLING이 되고, 실행 세션은 추가 명령 권한을 잃는다.
그러나 기기의 실제 중단 응답은 세션의 finally 이후에 도착할 수 있다.
그때 수신기와 완료 등록을 모두 지워 버리면, 정상적인 중단 응답도 어느 작업의 것인지 확인할 수 없다.
따라서 명령을 수행하는 수명과 중단을 관측하는 수명을 나눈다. 세션이 기존 수신기와 완료 등록을 AMR 서비스에 넘기면, AMR 서비스가 제한된 시간 동안 원래 실행 시도에 대한 중단 근거만 기다린다. 새 명령 권한을 얻거나 실행을 재시작하지 않는다.
| 상태의 소유자 | 취소 이후 맡는 일 | 맡지 않는 일 |
|---|---|---|
MovementTaskSession |
실행권 상실 감지, 추가 명령 차단, 관측 소유권 인계 | 취소 후 명령 계속 수행 |
AmrAbortObservationService |
원본 중단 관측 검증, 제한 시간·서비스 수명 관리, 등록 정리 | Task 임의 종료, 기기 명령, 자원 해제 |
TaskCompletionCoordinator / TaskManagerService |
현재 등록과 Task를 다시 검사하고 결과 반영 | 중단 이벤트 합성 |
ResourceManagerService |
자원 격리 및 재사용 가능 여부의 별도 판단 | Task가 끝났다는 이유만으로 자동 FREE 처리 |
CANCELLED는 해당 Task의 취소 결과다. 구동 자원의 정상 복구를 뜻하지 않는다.
실행 실패로 RECOVERY_REQUIRED가 된 자원은 별도 복구·물리 상태 확인 경로가 필요하다.
3. 폴더와 실제 API
skix-framework/base/services/core/java/.../server/
├── domain/amr/
│ ├── AmrManagerService.java 선택형 관측 서비스의 생성·시작·종료 소유
│ ├── execution/MovementTaskSession.java 실행 종료 시 관측 책임 인계
│ ├── observation/AmrObservationIngress.java 원래 시도의 순번·나이·세대 검사
│ └── completion/
│ ├── MovementCompletionSession.java 원래 완료 등록과 단일 정리 소유권
│ └── AmrAbortObservationService.java 종료 이후 중단 관측의 제한된 수명
├── execution/task/
│ ├── TaskManagerService.java 전체 Task 상태 정본
│ └── completion/TaskCompletionCoordinator.java 결과 귀속·중복 검사와 반영
└── control/resource/ResourceManagerService.java 자원 점유·격리·복구 정본
내부 연결 계약은 다음과 같다. 공개 앱 Manager API를 추가하거나 기존 제품 요청을 자동 전환하지 않는다.
| 진입점 | 역할과 제한 |
|---|---|
AmrManagerService.configureAbortObservation(configuration) |
AMR 시작 전에 한 번 구성. TaskManager·coordinator, 단조 시계, 공급자 세대, 정리 스케줄러, 용량·시간 예산을 명시 |
abortObservationService(expectedTasks) |
같은 TaskManagerService 인스턴스에 연결된 서비스만 반환 |
MovementTaskSession.executeWithAbortObservation(runtime, cleaning) |
기존 이동 절차에 취소 관측 수명 인계를 명시적으로 사용 |
abortObservationHandle() |
성공적으로 인계한 경우에만 읽기 전용 상태 핸들 제공 |
service.deliverAccepted(handle) |
인계 전에 이미 수락한 최신 원본 관측을 한 번 인수하여 검증·전달 |
service.observe(handle, envelope) |
세션 종료 뒤 도착한 원본 관측을 기존 수신기로 검증·전달 |
핸들은 상태·마지막 결과·종료 사유를 읽는 식별자다. 완료 등록 키나 수신기를 공개하지 않는다.
종료 사유는 문자열 대신 CloseReason enum으로 정의한다. 인계한 이전 세션의
완료·실패 변경 호출은 거부하며, 이전 세션의 close는 서비스 소유 등록을 닫지 않는다.
기존 execute·executeWithResult·executeWithCompletion 경로는 자동으로 이 수명을 사용하지 않는다.
4. 한 번만 인계하고, 한 소유자만 정리한다
- 이동 명령 전에 완료 등록을 만들고, 실제 명령이 반환한 실행 시도를 결합한다.
- 취소를 감지하면 현재 Task가
CANCELLING인지, 원래 등록·시도·수명이 유효한지 확인한다. - 서비스 용량을 예약하고 기존 완료 등록과 수신기를 인계한다. 새 키로 재등록하지 않는다.
- 인계 성공이면 세션
finally는 넘긴 등록을 닫지 않는다. 실패하면 기존 세션이 정리한다. - 서비스가 유효한 중단을 전달하거나 시간 초과·종료로 수명을 닫으면 원래 등록과 수신기를 한 번 정리한다.
이미 수락한 관측은 AmrObservationIngress.takeAccepted로 가져온다.
다른 수신기의 결과, 교체된 결과, 이미 인수한 결과를 사용할 수 없다.
순번 초기화나 이벤트 재수신으로 중복 검사를 우회하지 않는다.
5. 어떤 응답을 받아들이는가
원래 실행 시도·목적지·공급자 세대에 속하고, 원본 순번과 관측 시간이 유효한 ABORTED만 취소 결과 후보가 된다.
원본 이벤트 ID와 중단 이유가 있어야 하며, 현재 Task도 여전히 CANCELLING이어야 한다.
Task·AMR·Runtime의 현재 수명과 완료 등록은 결과 반영 전에 다시 검사한다.
| 상황 | 처리 원칙 |
|---|---|
ARRIVED 또는 충전 상태 |
중단 완료로 바꾸지 않음 |
| 빈 ID·형식이 맞지 않는 ID·빈 이유 | 원본을 보정하거나 합성하지 않고 거부 |
| 이전 실행·중복 순번·미래/오래된 관측 | 원래 수신기의 검증으로 거부 |
| 시간 초과·서비스 종료·공급자 재시작 | 관측 수명과 등록 정리. 취소 완료나 물리 정지를 추정하지 않음 |
| 두 응답이 동시에 도착 | 진행 중 전달을 하나만 허용. 중복 Task 반영 차단 |
| Task 결과 반영 후 근거 기록 실패 | Task 반영 결과와 기록 실패를 따로 보존. Task 변경을 재시도하지 않음 |
서로 다른 서비스의 모든 상태가 하나의 전역 트랜잭션으로 잠긴다는 주장은 하지 않는다. 관측 서비스의 예약·전달·정리 상태를 직렬화하고, coordinator의 최종 유효성 검사로 결과 반영을 제한한다. 이미 전달 중인 항목은 외부 호출이 반환된 뒤 한 번 정리한다. 공급자 조회·스케줄러· coordinator/Evidence 콜백은 제한된 시간 안에 반환하는 내부 의존성 계약이 필요하다. 서비스 종료가 임의의 외부 콜백을 강제로 중단하거나 이미 반영한 Task 결과를 되돌린다는 보장은 없다.
6. 제품 연결에 남는 일
MR6 task_manager 브랜치의 동작 의미를 유지하되, MR7 제품 콜백이 원본 이벤트 ID·실행 시도·공급자 세대를 제공하는지 검증해야 한다.
현재 Task 값이나 수신 시각을 끼워 넣어 원본 귀속을 만들어서는 안 된다.
공급자 어댑터, 제품별 시간 예산·용량, 공개 요청의 진입 경로, 장치에서의 정지 확인은 별도 연결·검증 대상이다.
전체 구축은 이 AMR 연결만으로 끝나지 않는다. 이어서 Cleaning 정지 협력과 자원 소유권, Vision/UI의 관리형 실행 및 상태 경계, 제품 공급자 연결을 같은 기준으로 확대한다. 각 도메인의 상세 사양은 기존 소스 근거와 충돌 정책을 함께 확인하며 옮긴다.
Connections
- 전체 프레임워크 Blueprint — 계층과 AOSP 경계
- 전체 구조 Atlas — 모듈·폴더별 역할
- 리팩터링 진행 현황 — 검증된 구현과 남은 단계
- 이동 작업 실행 — 청소 정지부터 도착·구동부 정지까지
- 상태·자원 소유권 — 도메인 상태와 공통 자원 관리의 분리