← Docs hub

2026-10-08 최신 전체 현황: 12개 구역 · 97개 할 일과 진행 단계. 소스 연결과 기기 인수를 분리해 기록했습니다. 아래 날짜가 앞선 상태 설명은 당시 이력이며 최신 완료 판정은 새 표를 기준으로 확인하세요.

SKIX Framework 브랜치 정합 — 구조·진척·다음 작업

현재는 팀 SDK와 제품 앱을 우리 구조에 맞추는 작업을 진행 중이다. Framework 패키지를 com.sk.intellix 기준으로 바꾸고 새 SDK·Host·소비 앱의 소스와 APK 빌드를 맞췄다. 현재 제품 실행 owner는 유지된다. 과거 기기 검증 이력과 별도로, 새 namespace의 debug Host에서 실제 Android 서비스 바인딩 2건과 관측 Parcel 전달 6건을 확인했다. 이 검사는 같은 프로세스에서 수행했으며 운영 제품 앱의 관측 전달 검증은 남아 있다. 새 바이너리는 QSSI 작업 저장소의 선택 APK 11개에 반영했다. 별도 AOSP 후보 입력까지 반영했으며, 운영 AOSP 적용·전체 이미지 생성·제품 자동부팅·운영 IPC 및 실센서 동작은 남아 있다.

최근 소스 정리: Host의 TTS, Pairing의 BLE, IoT·WSS의 listener/worker 수명 정리에 이어 Launcher의 초기 상태 전달, Launcher2의 공기질 샘플 처리를 정합했다. DeviceAgent는 실행하지 않은 지도 요청을 접수 성공으로 반환하지 않도록 수정했다. Runtime 팬과 ICT 팬의 거절 응답, ICT 하위 진단 상태의 결과 전달도 정리했다. 새 추상화나 실행 owner는 추가하지 않았다. 이어서 MCU 패킷 길이와 이동 좌표 검증을 보강했다. 지도·Runtime Adapter와 하위 AMRAgent 차이를 분류했고, SafeCare의 해제된 충전소 listener가 늦게 호출되는 경로도 정리했다. 현재 호출되지 않는 AMR Adapter 이동 경로의 입력 보호는 소스에서 검증했으며 제품 APK 동작 변경과 구분한다. 콜백 caller 번호의 범위 검사를 수정했고, DeviceAgent가 사용하는 공통 서버 소스 14개만 Gradle·Make에 포함하도록 빌드 경계를 고정했다. DeviceAgent의 전체 조립 차이를 대조하고 Wi-Fi 감시자와 상위 종료 경로의 해제 누수를 수정했다.

이번 WSS 정합: EventAsset 연결이 일시적으로 끊겨도 등록을 유지하고, 연결이 폐기되면 해제 후 다시 연결한다. 인증 접수가 거절되면 남은 요청 ID를 정리해 다음 감지가 다시 시도할 수 있게 했다. 호출되지 않는 DeviceAgent 업로드 래퍼 7개를 제거했으며, 업로드 책임은 기존 EventAsset 서비스에 두고 typed 경로와 기존 AIDL 계약은 유지했다. 새로운 Service·계층은 추가하지 않았다.

이번에 이어서 반영한 내용: WSS 순찰 상태와 인증 처리가 같은 잠금을 사용하도록 정리했다. 인증 timeout은 일반 화면 작업 정리로 지워지지 않게 분리하고, 재개 시 기존 순찰 정책을 거치도록 수정했다. 종료 시 예약 취소·상태 초기화를 복원했고, 저배터리 뒤 기본 순찰을 재개할 수 있도록 상태 누락을 보완했다. 얼굴 인증은 시작한 요청 ID를 보관해 이전 요청의 콜백이 새 요청을 중단·승인·통지하지 않도록 했다. 이 변경들은 기존 DeviceAgent 실행 책임 안에서 처리했으며, 공통 domain 서비스로 실행 책임이 이관된 것은 아니다.

현재 테스트 환경: 기기는 연결이 끊겨 있어 테스트를 보류했다. 앞의 기기 결과는 이전 검증 이력이다. 인터넷은 재연결됐으며, 이번에는 소스·로컬 테스트·Release APK·제품 빌드 입력까지만 확인했다.

이번에 달라진 제품 경로

작업 구역 이전 문제 → 지금 동작 확인한 범위 · 남은 확인
DeviceAgent · 빌드 경계 같은 policy/port 폴더의 새 서버 소스도 자동 포함됨 → 현재 사용하는 서버 Java 14개만 명시적으로 포함 실제 Gradle Debug/Release·Make 입력에서 미래 소스 5개 제외를 확인. 단위 테스트 221개/43 suites·Release 통과. 실행 owner 이관은 별도 작업
DeviceAgent · 시작과 종료 감시자가 재초기화·종료 뒤에도 남거나 수신기 해제 실패가 정리를 중단함 → 이전 감시자·자기 리스너를 해제하고 종료 참조를 먼저 분리 실제 Java 영향 검사 14개, 단위 테스트 221개·Release 통과. 다른 리스너·기존 RSSI 판정 유지. 이미 실행 중인 콜백 취소·동시성·기기 종료 미검증
DeviceAgent · 콜백 번호 잘못된 번호가 배열 조회 예외로 이어질 수 있음 → 음수·상한 밖 번호를 기존 빈 결과로 거절 RED 3건 → 영향 검사 10건 통과. 정상 caller·Launcher 예약 토글·SystemUI 경로 유지. 기기 콜백 미검증
DeviceAgent · 팀원 차이 검토 팀원 Java 315개 모두 존재. byte 동일 210개·표현 차이 30개·동작 차이 검토 대상 75개 현재 양측 SHA가 맞는 정적 검토 근거 62쌍, 연결할 근거 13쌍. DeviceAgent 조립과 MainService/MainMcu의 이번 정적 검토에서 유효 입력 동작 누락 없음. 13은 미구현 기능 수나 전체 완료율이 아님
DeviceAgent · EventAsset 연결 일시 단절을 해제로 취급하거나 해제 뒤 늦은 콜백이 연결을 되살림 → 등록 유지·dead/null 연결 정리·명시 해제 뒤 콜백 거절 연결 수명 영향 검사 13개, Release 확인. 같은 연결 객체를 다시 쓸 때의 세대 격리·실제 Binder 재연결은 미검증
DeviceAgent · WSS 인증 시작 거절된 요청 ID가 남아 다음 감지를 막거나 모드 설정을 두 번 읽다가 예외 발생 → 실패 예약 해제·오류 통지·설정 단일 조회 실패 4건 재현 → 영향 검사 9개·단위 테스트 221개·Release 통과. 승인 후 클립만 준비되지 않은 경우에는 세션 유지
DeviceAgent · 업로드 구조 정리 쓰지 않는 업로드 래퍼 7개가 별도 실행 경로처럼 남음 → 제거하고 typed 업로드 owner 경로 유지 영향 검사 14개·단위 테스트 221개·Release 통과. 마지막 정리 전후 APK는 동일하며 기존 AIDL 유지. 실제 클라우드 업로드는 미검증
DeviceAgent · 인증과 순찰의 동시 접근 서로 다른 잠금으로 보호하던 인증·순찰 상태 → 기존 객체 잠금으로 통일 잠금 우회 재현 후 관련 검사 통과. 전체 동시성·교착 상태 검증은 아님
DeviceAgent · 인증 timeout 화면 작업 정리가 owner timeout도 삭제하거나 직접 이동 재개 → 별도 callback handler·기존 순찰 재개 정책 사용 삭제·정책 우회 2건 재현 후 영향 검사 통과. 실제 timeout/Binder 전달은 미검증
DeviceAgent · 종료와 저배터리 종료 시 예약 취소 누락·저배터리 상태 경쟁·기본 순찰 재개 누락 → 취소/상태 정리·공통 잠금·기본 모드 복원 실패 4건 재현 → 영향 검사 12개 통과. 실제 예약 취소·물리 중단은 미검증
DeviceAgent · 얼굴 인증 세션 이전 요청 콜백이 새 인증을 중단·승인·통지하거나 빈 요청에서 인식 시작 → 요청 ID 확인·공통 잠금 실패 3건·잠금 우회 1건 재현 → 영향 검사 11개·얼굴 검사 4개·단위 검사 221개·Release 통과. Vision 원문에는 요청 ID가 없어 새 리스너에 도착한 지연 데이터의 발생 요청까지 판별하지 못함
DeviceAgent · 명령 연결 공급 interface 32개·handler 35개의 팀원 연결을 대조 → 빠진 handler 없이 현재 명령 연결 유지 전체 소스 차이 검토. Map 인자 순서는 생성자와 함께 변경됐고 Security 우선순위 변경은 명령이 겹치지 않음. 실제 장치 실행은 미검증
DeviceAgent · 요청 차단과 콜백 청소 금지 상태에서는 새 청소·복귀 예약 요청도 기존 실패 응답으로 거절 현재 gate의 차단 6조합·허용/조회/특수 모드/재부팅 검사 통과. 콜백 검사 10건은 소스·테스트 SHA가 같은 기존 결과를 재사용
DeviceAgent · 제품 예약 DB 저장·AlarmManager 등록·실행은 제품이 담당하고 시간 계산과 조건 판단만 공통 코드로 공유 등록 15건·입출력 8건·공통 정책 JUnit 21건 통과. DB 실패 시 기존 알람 유지, 예약 없는 요일은 등록 안 함. 실제 알람·재부팅은 미검증
DeviceAgent · 청소 실행 Basic/Moving/Lifecycle의 기존 검토 후 변경은 패키지 이름뿐 → 기존 청소 동작 검토 근거가 현재 소스에도 적용됨 전체 소스와 지원 7개 파일 SHA 대조 통과. 기존 48건 host 검사 재사용. 팬·이동·상태·보고·타이머 실행 owner는 여전히 DeviceAgent
DeviceAgent · 지도 명령 Privacy·저배터리·입력 누락·미구현/불필요 명령이 빈 응답으로 성공처럼 보임 → 기존 result=-1로 거절. 정상 지도·로봇 호출과 저배터리 알림은 유지 지도·제출·이동 영향 검사 24개, 단위 테스트 221개/43 suites, Release 통과. APK 입력 2곳·Make 선택 확인. 실제 AMR 실행·완료는 미검증
Launcher2 · 공기질 표시 잘못된 숫자·빈 VOC/NOX·비유한 값이 표시 처리를 중단할 수 있음 → 장소를 먼저 확인하고 잘못된 샘플만 제외 공기질 영향 검사 12개, 단위 테스트 41개/22 suites, Release 통과. APK 입력 2곳 확인. 실제 센서·화면 동작은 미검증
구 Launcher · 초기 설정 첫 실행 Intent의 연결/지도 완료 상태가 누락됨 → 초기·재진입 처리를 공유하고 복원·지도 중복 실행 방지 회귀 7개, 단위 테스트 4개/2 suites, Release 통과. 제품 선택은 Launcher2이므로 구 Launcher APK 입력은 교체하지 않음
DeviceAgent · 나머지 명령 복구·설정·펌웨어·화면·예약·이동·상호작용 7영역 → 팀 명령 75개가 실제 handler에서 인식되고 composition에 등록됨 소스 차이 검토 완료. 명령 인식은 실제 실행 성공·전체 기능 완료를 뜻하지 않음
DeviceAgent · Runtime 팬 잘못된 속도가 0으로 바뀌거나 장치 부재가 성공처럼 보임 → 기존 signed byte 범위를 유지하고 입력 오류·장치 부재·호출 예외를 거절 팬 영향 검사 31개와 Release 확인. 기존 초기화·heartbeat 빈 명령 4개는 유지하며 전체 Runtime 완료로 표시하지 않음
SDK ↔ DeviceAgent · ICT 팬 RPM HAL의 false와 기존 fail 응답을 성공으로 해석 → 장치 반환값을 보존하고 SDK가 fail을 거절로 해석 영향 검사 31개, SDK 252개·DeviceAgent 221개 단위 테스트 통과. ICT는 단위 테스트가 없으며 APK 빌드만 확인. AAR 정본+소비 7곳, DA·ICT APK 입력 4곳 반영
DeviceAgent · ICT 진단 응답 하위 실패를 parent가 성공으로 덮거나 비동기 결과를 너무 일찍 읽음 → 하위 반환값과 완료된 응답 보존. Fan·Voice 정상 요청의 고정 실패값 수정 영향 검사 37개, DeviceAgent 단위 테스트 221개·Release 확인. 최신 APK 입력 2곳 반영. 큐 거절·시간 초과·interrupt는 실패 응답; 실제 진단 완료는 미검증
EventAsset · 충전소 listener 교체·해제된 listener가 SDK 순회에 남아 늦게 호출됨 → 등록 세대가 지난 콜백은 소비자에게 전달하지 않음 실제 Gateway 메서드 RED 2개 → 연관 회귀 8개 통과. 단위 테스트 396개·Release 및 APK 입력 2곳 확인. 이미 실행 중인 콜백 취소·실제 Binder 재연결은 미검증
AMRAgent · 팀원 소스 대조 소스·설정 159개 → 동일 127개, 상수 치환 30개, 빌드 입력 추가 1개, Bundle 이름 분리 1개 양쪽 전용 파일 0개·차이 분류와 명세/품질 검토 완료. 소스 비교이며 전체 실행 동등성·펌웨어·부팅 증거는 아님
AMR Adapter · 직접 이동 입력 잘못된 좌표가 Position/정책에 전달됨 → 유한한 좌표만 허용 직접 경로의 영향 검사 17개 통과. 현재 제품에서 호출되지 않아 R8이 제거하며 DeviceAgent APK는 이전과 동일. 현재 실행 owner 이관으로 계산하지 않음
DeviceAgent · MCU 수신 잘못된 패킷 길이가 제품 상태 처리에 들어갈 수 있음 → null·size 불일치는 거절하고 제품 상태는 100-byte 패킷만 갱신. 진단 모드의 원시 패킷 전달은 유지 실제 분기 동작 검사 14개·구조 검사 5개 통과. 단위 테스트 221개·Release 확인. 실 MCU 입력은 미검증
DeviceAgent · 이동 좌표 변환 오류를 삼켜 0·부분 좌표로 이동하거나 NaN·무한대를 전달할 수 있음 → x/y/각도를 실행 정책에 넘기기 전에 검증하고 기존 실패 응답·요청 ID 유지 잘못된 입력 9가지를 재현해 수정. 영향 테스트 10개·단위 테스트 221개·Release 통과. APK 입력 2곳·Make 선택 확인. 실제 이동은 미검증
지도 · Runtime 연결 대조 지도 파일 6개와 분리된 Adapter 14개의 메서드 148개를 팀 구현과 대조 → 이번 범위에서 누락·추가 0개. 동일 144개, 차이 4개는 괄호·로그·Context 사용으로 분류 필수 Runtime 연결 32개의 builder 호출 존재도 확인. 코드 수정은 필요하지 않았음. 메서드 존재·텍스트 대조는 부팅·DB·리소스 설정 동작의 증거가 아님

완료 기준은 분리한다: 소스 수정·단위 테스트·APK 빌드·후보 입력은 확인했지만, 운영 APK 교체·다른 프로세스의 Binder 연결·실센서/장치·전체 이미지 부팅은 아직 남아 있다. 위 검사는 변경별 묶음이며 전체 완료율로 합산하지 않는다. 실행 책임을 Domain Service로 옮기는 Phase 2도 진행 완료 상태가 아니다.

팀원 정합 확인: 9개 소비 앱의 추적된 비Java main 파일 1,318개를 대조했다. 경로 부재 2개는 기존 IoT IPC 순번 충돌과 Launcher 리소스 병합으로 분류했다. EventAssetAgent·Launcher2는 Android가 합치는 리소스 이름 기준으로 확인해 새 기능 문구 누락·중복이 없음을 확인했다. 파일 일치율을 기능 완료율로 환산하지 않는다.

이동과 Task · 지금 연결된 경로와 남은 이관

현재 제품 이동: SDK의 moveTo() → DeviceAgent MovementCommandHandler → LegacyMovementGateway → 기존 실행 정책·장치 실행부. 귀환·일시정지·재개·중단은 공통 AmrOperations를 거쳐 기존 제품 실행부로 연결된다. 잘못된 좌표를 거절하는 이번 수정은 이 경로의 입력 검증이다.

공통 Task 이동: MovementServices에는 Task 접수·자원·세션·완료 경로가 구현돼 있다. 이를 제품에 연결하는 FrameworkHostComposition.withMovement(...) 구성도 있지만, 현재 Android Host는 관측용 기본 구성을 사용한다. DeviceAgent의 제품 이동 요청을 공통 Task로 보내고 실제 완료·중단 이벤트를 연결하는 이관은 남아 있다. 정책 접수나 명령 반환만으로 Task 완료를 만들지 않는다.

하위 AMR 연결 확인: 현재 이동 명령과 상태 변환은 실행 ID·장치 세대·이벤트 순번을 보존하지 않는다. 패킷의 currPart는 조각 번호다. 현재 Task ID를 늦은 콜백에 붙여 완료 처리하지 않으며, 펌웨어 확장 지원 여부도 미확인이다. 실행 책임 이관은 이 종단 계약과 기기 증거를 확보한 뒤 진행한다. 그동안 다른 제품 기능의 정합을 이어간다.

최신 DeviceAgent 빌드: 0.256, APK SHA-256 44e5e365267bcc01c882dde35a45a56a13c24a30ee9f285d6140e7a02fd4785f. QSSI와 별도 AOSP 후보의 입력 2곳에 반영했다. 운영 기기의 이전 확인 버전은 0.258이므로 운영 교체·배포 버전 정합은 아직 완료되지 않았다.

소스 근거: MovementCommandHandler, LegacyMovementGateway, LegacyAmrExecutionAdapter, SkixFrameworkHostService.onCreate(), FrameworkHostComposition, MovementServices. 검증 근거는 저장소의 skix-movement-coordinate-admission-evidence-2026-10-02.json, skix-mcu-packet-boundary-evidence-2026-10-02.json, skix-map-runtime-adapter-convergence-evidence-2026-10-02.json에 묶었다. 추가 WSS 근거는 skix-wss-whole-peer-convergence-evidence-2026-10-02.json, skix-eventasset-binding-lifetime-evidence-2026-10-02.json, skix-wss-verification-start-evidence-2026-10-02.json, skix-wss-upload-wrapper-retirement-evidence-2026-10-02.json이다. 전체 차이 분류는 정적 검토이며 기기·클라우드·전체 부팅 완료와 구분한다. 이번 묶음의 최신 근거는 skix-wss-monitor-convergence-evidence-2026-10-02.json, skix-wss-movement-error-convergence-evidence-2026-10-02.json, skix-wss-timeout-convergence-evidence-2026-10-02.json, skix-wss-state-cleanup-convergence-evidence-2026-10-02.json, skix-wss-face-session-convergence-evidence-2026-10-02.json이다. 최근 수정과 테스트 수를 전체 정합 완료나 실기기 성공으로 합산하지 않는다. 기존 계층·작업지도 SVG는 유지한다.

전체 작업지도 · 현재 구조에서 최종 모습까지

SKIX 리팩터링 전체 작업지도: 현재 제품 경로와 최종 Domain Service 구조, 계층별 폴더와 확인 단계

공통 System UI · 제공 서비스와 소비 앱의 경계

SKIX 공통 System UI 책임과 호출 경로

Launcher는 소비 앱, ProductSystemUI는 SKIX 공통 UI 제공 서비스다. Framework 구성의 책임 기준에는 SystemUI를 포함하고, 배포 기준에는 com.sk.productsystemui 독립 APK로 표시한다. services/core나 system_server로 UI 렌더링을 옮기는 작업을 뜻하지 않는다.

소스 근거: systemui/README.md, SystemPopupService.java, TopBarService.java, TopBarDeviceState.java, AndroidManifest.xml, canonical SDK의 systemui/SkixSystemUiManager.java. Android 기본 com.android.systemui와는 별도 제품 서비스다.

왼쪽은 지금 동작 책임이 있는 곳, 오른쪽은 이관을 마친 뒤의 구조다. DeviceAgent에서 추출한 로직과 공통 서버의 Control·TaskManager·7개 Domain Service를 함께 표시했다. Launcher/2는 SDK 소비 앱이다. ProductSystemUI는 SKIX 공통 UI 서비스로 API를 제공하며, 독립 시스템 APK에서 실행된다. 제품 실행부와 HAL은 별도 계층이다. 폴더 기준은 skix-framework/base/ 아래 경로다.

짙은 청색은 해당 소스·빌드 묶음의 확인, 옅은 청색은 부분 구현·연결, 흰 점선은 남은 이관을 나타낸다. 소스·빌드 확인 → 이미지 입력 → 격리 기기 확인까지 근거가 있지만, 운영 제품 연결·전체 이미지·자동부팅·실제 장치 검증은 남아 있다. 전체 완료율은 검증 범위가 달라 계산하지 않았다.

계층 표현은 AOSP 공식 Architecture overview의 앱·Framework API·시스템 서비스·HAL·Kernel 구분을 참고했다. SKIX의 배치와 진척은 우리 소스를 기준으로 그렸으며, AOSP 기본 구성 자체에 SKIX가 포함된다는 뜻은 아니다. 기존 Android Layer 위에서 보는 SKIX 그림은 아래에 유지했다.

Phase 1 → Phase 2 · 목표·책임·WBS·예상 일정

Phase 1은 기존 제품 기능을 보존하며 팀원 소스와 빌드·제품 연결을 맞추는 단계다. Phase 2는 검증한 기능의 실행 책임을 공통 Framework로 옮기는 단계다. 현재는 Phase 1 진행 중이다. 공통 서버 구현은 일부 먼저 진행됐지만, 제품 실행 책임 이관이 완료된 상태는 아니다.

구분 Phase 1 · 정합하고 제품에서 연결 Phase 2 · 공통 Framework로 실행 책임 이관
목표 팀원 기능을 빠짐없이 반영한 소스·SDK·APK·제품 기준선 확보 Domain Service가 정책·상태·실행을 소유하는 목표 구조 구현
실행 책임 DeviceAgent·EventAsset·IoT 등 기존 제품 owner 유지 기능별 Domain이 실행 owner, 제품 Agent는 장치·외부 연결 Adapter로 축소
앱 책임 Launcher/2는 소비 앱, SystemUI는 공통 UI 제공 서비스 SystemUI의 독립 APK 배치 유지; UI를 services/core로 이동하지 않음
완료 판단 선택 제품 이미지에서 부팅·서비스 연결·핵심 기능 회귀 확인 실제 제품 호출이 Domain·Task·Port 경로를 통과하고 중복 실행 owner 제거
현재 상태 SDK/APK 빌드·후보 입력 확인, 잔여 동작 정합·제품 검증 진행 서비스·계약 일부 구현, 실제 실행 owner 이관은 남음

책임을 나누는 기준

아래 담당은 사람을 확정 배정한 것이 아니라 책임 역할이다. SYSTEM 6명의 실제 이름·역량 배정은 별도 합의한다. 한 사람이 여러 역할을 맡아도 기능별 주관 책임은 하나로 유지한다.

책임 역할 주관 업무 · Codex 작업 협업 · 판정 책임
Framework 담당 SDK·IPC·공통 Runtime·의존 경계·Task 계약<br>Codex: 소스 구현·계약 대조·영향 테스트·빌드·근거 기록 SYSTEM 담당자가 공개 계약과 아키텍처 변경 검토
제품 기능 담당 DeviceAgent·AMR·Cleaning·센서·IoT·SafeCare의 동작<br>Codex: 팀원 차이 정합·Adapter 연결·기능별 이관 구현 기능 담당자가 기존 제품 동작과 실장치 결과 판정
앱·UI 담당 Launcher/2 소비 화면·SystemUI 공통 UI 서비스·SDK 계약<br>Codex: import/호출/콜백/권한 정합·앱 빌드·회귀 앱 담당자가 화면·사용 시나리오 판정
플랫폼 담당 AOSP 제품 구성·HAL 경계·권한·SELinux·부팅<br>Codex: 제품 입력·서비스 등록·초기화 코드와 로그 분석 플랫폼/HAL 담당자가 보드·빌드 환경과 제품 적용 검토
통합·검증 담당 기준선·시나리오·장애/성능·전환·rollback<br>Codex: 테스트 실행·로그/산출물 대조·현황 갱신 SYSTEM 통합 담당자가 릴리스 수용과 잔여 위험 판정

Codex는 위 역할별 코드 작업을 순서대로 수행한다. HAL 구현·보드 동작·제품 수용을 단독으로 승인하지 않는다. 자동 백그라운드 일정 실행을 약속하는 계획이 아니라, 실제 작업 세션에서 사용할 순서와 예상 소요다.

Phase 1 WBS · 팀원 정합과 제품 연결

목표 산출물: 팀원 기능 반영 목록 + 단일 SDK·APK 기준선 + 제품 빌드/부팅/기능 검증 기록. 기존 실행 owner를 유지해 구조 변경과 기능 회귀 원인을 분리한다.

WBS 업무 · 현재 상태 책임 · 완료 조건
1.1 잔여 기능 정합 — DeviceAgent 명령·수명, SafeCare 예약/중단/화면, Launcher 소비, IoT·SystemUI 차이 확인·반영<br>상태: 진행 중 주관 / 협업: 제품 기능 / 앱·Framework<br>완료: 모든 차이를 반영·보호 유지·의도적 보류로 판정하고 근거 연결; 기능 누락 0
1.2 SDK·IPC 정합 — Manager/모델·콜백·wire·오류 응답·호환 계약 대조<br>상태: 빌드 확인·의미 정합 진행 주관 / 협업: Framework / 제품 기능<br>완료: 제품 소비자가 단일 SDK 사용; 미구현 요청의 성공 응답과 중복 계약 제거
1.3 앱·서비스 빌드 통합 — AAR 배포 경로·Release APK·설치 ID·서명·버전 고정<br>상태: 빌드 묶음 확인 주관 / 협업: 앱·UI / Framework·플랫폼<br>완료: 실제 선택 APK와 소스 revision·SDK·서명·버전 연결; 운영 DA 0.258 대비 배포 버전 정합
1.4 AOSP 제품 입력 연결 — vendor Git·제품 상속·SDK/Host 모듈·중복 방지·파티션<br>상태: 별도 후보 입력 확인 주관 / 협업: 플랫폼 / Framework<br>완료: 실제 전체 빌드 트리에서 Kati/Soong 모듈 발견·선택·컴파일 성공
1.5 권한·서비스 수명 연결 — 제품 Framework 권한, Host 초기화·인증·종료·재연결<br>상태: Host 수명 분리·격리 바인딩 확인·제품 경로 미검증 주관 / 협업: 플랫폼 / Framework·제품 기능<br>완료: 실제 다른 프로세스의 producer/consumer 연결·권한·종료/재연결 확인
1.6 이미지·부팅 확인 — 제품 이미지 생성, 설치, 자동 기동 순서·실패 로그 확인<br>상태: 미검증 주관 / 협업: 플랫폼 / 통합·검증<br>완료: 선택 이미지가 부팅되고 Host/제품 서비스가 정해진 경로로 준비됨
1.7 제품 기능 회귀 — 이동·청소·예약·SafeCare·공기질/전원·IoT·UI의 현재 기능 확인<br>상태: 일부 격리 검사·제품 검증 남음 주관 / 협업: 통합·검증 / 기능·앱<br>완료: 실제 제품 경로의 성공/거절/중단·완료·화면/상태 일치, 주요 회귀 없음
1.8 Phase 1 기준선 고정 — revision/SDK/APK/image·잔여 위험·rollback·인수 기록<br>상태: 미완료 주관 / 협업: 통합·검증 / 전 역할<br>완료: 1.1–1.7 증거 검토와 담당자 수용; Phase 2 비교 기준 확보

Phase 1 통과 조건: 소스 대조나 APK 빌드만으로 통과하지 않는다. 전체 제품 구성·부팅·운영 IPC·핵심 기능 회귀와 복구 기준이 함께 확인돼야 한다. 현재 후보에 전체 AOSP 빌드 도구가 없고 원본 vendor Git 연결도 미정합이므로 1.4–1.6은 환경 연결 작업을 포함한다.

Phase 2 WBS · 공통 서비스가 실제 기능을 소유

목표 산출물: 앱 → SDK → Binder → Control/Task → Domain Service → Port/제품 Adapter → 장치로 이어지는 실제 제품 경로. Phase 1 기준선에 기능별 이관을 적용한다. 새 Planner·새 Domain 확대는 이번 범위에서 제외한다.

WBS 업무 · 현재 상태 책임 · 완료 조건
2.1 기능별 책임 확정 — 명령·정책·상태·실행·완료·저장·화면·장치 연결을 분류<br>상태: 초안·부분 구조 있음 주관 / 협업: Framework / 기능·앱·플랫폼<br>완료: 기능별 owner 하나, 유지/이관 소스와 의존 방향 승인; 빈 추상화 추가 금지
2.2 공통 Runtime·부팅 구현 — 얇은 system_server Root와 독립 Runtime, 시작/종료/복구<br>상태: APK Host 기반 있음·목표 배치 미완료 주관 / 협업: 플랫폼 / Framework<br>완료: 제품 부팅·준비 상태·장애/재시작 검증; 현재 APK Host와 목표 Root를 구분
2.3 Control·Task 제품 경로 연결 — caller/공유 UID·admission·policy/resource·조회/취소/완료<br>상태: 계약·내부 구현 있음 주관 / 협업: Framework / 기능·검증<br>완료: 실제 제품 요청의 접수·충돌·취소·완료 소유권과 실행 ID 연결; ACK≠완료
2.4 상태·관측 이관 — Power/AirQuality/IoT/팬 사실→canonical state·재연결·순번/세대<br>상태: Publisher·ingress 있음·운영 전달 미검증 주관 / 협업: 제품 기능 / Framework·플랫폼<br>완료: 실제 센서/제품 producer의 최신 상태·오래된 이벤트 거절·장애 복구 확인
2.5 AMR 실행 이관 — 이동/귀환·상태·정책·중단/완료를 Domain 소유, AMR 연결은 Adapter<br>상태: Domain/Port 일부 구현·제품 owner 유지 주관 / 협업: 제품 기능 / Framework·HAL·검증<br>완료: 실제 이동·귀환·중단이 AMR Domain/Task 경유; 이전 중복 실행 경로 제거
2.6 Cleaning 실행 이관 — 청소 모드/팬·이동 연계·예약·중단·완료 소유권 연결<br>상태: Domain/Port 일부 구현·제품 owner 유지 주관 / 협업: 제품 기능 / AMR·Framework·검증<br>완료: 청소·이동 자원 충돌, 전체 중단, 예약/귀환·완료를 실제 장치에서 확인
2.7 나머지 기존 기능 이관 — Power/AirQuality/IoT/Vision/LLM 경계와 SafeCare·예약 연계<br>상태: 기존 서비스/계약 일부 있음 주관 / 협업: 제품 기능 / Framework·앱<br>완료: 기존 기능별 실행 owner와 외부 Adapter 구분; UI/전문 Agent 책임 유지·새 Domain 일괄 생성 금지
2.8 소비 경로 전환·레거시 축소 — 앱 SDK 호출을 새 실행 경로로 전환·미사용 중복 로직 제거<br>상태: namespace/SDK 소비 정합 있음 주관 / 협업: 앱·UI / Framework·기능<br>완료: 이전 제품 직접 실행 우회 차단; 필요한 레거시 IPC 번역만 유지
2.9 구조·제품 검증과 인수 — 의존 경계·중복 owner·부팅/장애/성능·실장치·rollback<br>상태: 목표 검증 남음 주관 / 협업: 통합·검증 / 전 역할<br>완료: 전체 목표 경로·릴리스 수용, DeviceAgent Adapter 역할과 잔여 예외 문서화

Phase 2는 기능별로 진행한다: 2.1 → 2.2/2.3 → 2.4 → AMR(2.5) → Cleaning(2.6) → 나머지 기존 기능(2.7) 순서다. 앱 전환·회귀 검증은 각 기능 이관마다 함께 수행하며 마지막에 몰지 않는다. 하나의 실행 owner를 두 번 활성화하지 않는다. Phase 1에서 Host 부팅을 확인해도 목표 system_server Root 구현까지 완료된 것으로 계산하지 않는다.

예상 일정 · 작업일 기준, 2026-10-02 작성

예상안이며 확정 납기가 아니다. 실측 처리량·미발견 기능 차이·전체 빌드 및 기기 가용 시간을 반영한 일정 기준선이 아직 없다. 아래 기간은 Codex가 집중 작업 세션에서 소스 구현·검토를 수행할 때의 초기 범위 추정이며, 6명 병렬 투입이나 24시간 자동 실행을 가정하지 않는다. W1은 다음 집중 작업 시작일부터의 첫 작업 주다.

구간 · 예상 작업 창 주요 작업 다음 구간으로 넘어갈 근거
Phase 1 A · 잔여 소스<br>W1–W2 / 약 5–10작업일 1.1–1.3: 남은 동작 차이·오류 응답·SDK/APK 버전 정합 기능 차이 판정표·영향 테스트·선택 APK 일치
Phase 1 B · 제품 연결<br>W3–W4 / 약 5–10작업일 + 환경 대기 1.4–1.8: 실제 AOSP 연결·권한·기동·이미지·핵심 회귀 제품 이미지/부팅/운영 IPC 검증과 Phase 1 수용
Phase 2 A · 공통 기반<br>Phase 1 수용 후 W1–W2 / 약 5–10작업일 2.1–2.4: 책임·Runtime/Root·Control/Task·실관측 실제 제품의 admission·상태·재연결 경로
Phase 2 B · AMR·Cleaning<br>후속 W3–W5 / 약 10–15작업일 2.5–2.6 및 해당 앱 전환·회귀 각 Domain 실실행·중단/완료·자원 충돌 검증
Phase 2 C · 나머지·인수<br>후속 W6–W8 / 약 10–15작업일 2.7–2.9: 기존 기능·레거시 축소·통합·장애/성능 목표 구조와 제품 수용·복구 기록

Phase 1은 약 10–20작업일, Phase 2는 약 25–40작업일을 최초 계획 범위로 둔다. 작업 창에는 검토·수정 여유가 있어 기간을 단순 합산한 확정 종료일을 제시하지 않는다. 전체 이미지 빌드 환경·vendor 소스·장치 이벤트 규격이 확보되지 않은 기간은 별도 대기이며 종료일을 밀 수 있다. 첫 소스 묶음과 첫 실제 제품 빌드가 끝나면 예상안을 다시 산정한다.

지금 Codex의 다음 작업: Phase 1의 WSS 시작·중단 접수와 나머지 팀원 동작 차이를 대조한다. 최신 DeviceAgent APK는 44e5e365…이며 QSSI와 AOSP 후보 입력 두 곳에 반영했다. WssManager의 최근 수명·정책·얼굴 세션 수정은 각각 검토했지만 파일 전체 정합 완료로 올리지 않았다. 정적 검토 근거 62쌍·추가 연결 대상 13쌍은 전체 완료율이 아니다. 실제 DB·알람·팬·이동·보고 실행은 DeviceAgent가 담당하고, 공통 실행 owner 이관은 Phase 2에 남아 있다. 기기 연결이 끊겨 운영 설치·부팅·실센서 검증은 보류한다.

최근 근거: skix-command-runtime-wiring-evidence-2026-10-02.json, skix-entry-callback-convergence-evidence-2026-10-02.json, skix-product-schedule-peer-convergence-evidence-2026-10-02.json, skix-cleaning-current-review-applicability-evidence-2026-10-02.json. 소스 차이 75쌍 중 56쌍에 현재 검토 근거를 연결했고 19쌍은 추가 확인이 필요하다. 이 수치를 전체 기능 완료율로 환산하지 않는다.

한눈에 보는 진행 상황 · 2026-10-02

현재 위치: 소스 정합 → SDK·APK 빌드 → QSSI 작업 입력·별도 AOSP 후보 입력 반영. 원본 제품 트리 적용과 전체 이미지·부팅 검증은 아직 남아 있다. 파일 비교 수치만으로 전체 완료율을 계산하지 않는다.

작업 구역 지금까지 반영한 것 상태 / 다음 작업
SDK·공통 서버 새 Framework namespace, Manager·모델·Task 계약과 Host 빌드 이번 이름 변경 묶음 완료 / 실제 제품 기동 수명 검증 필요
제품 소비 앱 새 AAR을 7개 소비 경로에 반영, Release APK 13개 빌드 해당 빌드 묶음 완료 / 운영 앱 연결·화면 검증 필요
팀원 제품 로직 DeviceAgent 호출 경로와 SafeCare 예약·화면·설정·종료·지역 조건 정합 진행 중 / Launcher 예약 ID·귀환 화면·AQM 목록 정합. 기기 동작과 다른 제품 경로 검증 필요
이미지 탑재 준비 QSSI 선택 APK 11개와 별도 AOSP 후보의 모듈·APK·권한·상위 제품 설정 반영 후보 APK·Framework 소스 입력 검사 완료 / vendor Git 연결·전체 빌드·원본 제품 적용 필요
Core 실행 책임 Control·TaskManager·7개 Domain Service 구조 분리 부분 구현 / 제품 기능별 실행 책임 이관 필요
기기·제품 검증 새 namespace Host 서비스 바인딩 2건·관측 Parcel 6건 통과, 이전 격리 APK 이력 Host 내부 연결 확인 / 운영 앱 전달·전체 이미지·자동부팅·실센서·물리 동작 미검증

다음 순서: ① 남은 제품 동작 차이 정합 → ② 실제 AOSP 제품 구성·Host 탑재 연결 → ③ 이미지 생성·자동부팅·운영 IPC 검증 → ④ 기능별 Domain 실행 책임 이관과 제품 검증. 기존 제품 실행 owner는 현재 유지한다.

최신 연결 점검 · DeviceAgent 관측 전달

수정 완료: 설치 ID는 com.sk.airbot.frameworkservice로 유지하면서 서비스 클래스는 com.sk.intellix.frameworkservice.server.entrypoint.service.*로 연결한다. 이전에는 설치 ID 뒤에 클래스 경로를 붙여 이름 변경 전 서비스로 연결하려던 오류가 있었다.

제품에서 들어오는 데이터 DeviceAgent 전달 경로 Framework 진입점
MCU 공기질 패킷 MainMcu → AirQualityObservationPublisher AirQualityObservationGatewayService
MCU 청소 팬 상태 MainMcu → CleaningFanTelemetryPublisher CleaningFanTelemetryGatewayService
IoT 상태 MainApi → IotObservationPublisher IotObservationGatewayService
AMR 배터리 상태 MainService → PowerObservationPublisher PowerObservationGatewayService

DeviceAgent 초기화에서 네 Publisher를 생성해 수신자로 등록한다. 종료 시 수신자를 해제하고 Publisher를 닫는다. 공통 worker가 연결·전송·재시도·종료를 담당한다. 이 표는 현재 소스의 관측 전달 경로이며 장치 실행 책임을 Domain으로 이관했다는 뜻은 아니다.

당시 관측 수정 묶음 확인: 실제 Publisher·worker를 실행하는 host 검사에서 잘못된 클래스 이름을 재현한 뒤, 4개 Manifest 대상과 서명 거절 검사를 통과했다. DeviceAgent unit 221건/43 suite와 Release 빌드가 성공했다. 당시 APK SHA-256은 909245fd19c64d64e5e3f00d74b6283fb02e15c85bfd86a380924cd354ea5f38이며 QSSI 작업 입력과 별도 AOSP 후보 입력에 반영했다. 실제 Make 선택도 양쪽에서 각각 1건 통과했다. 소스·산출물 각각 독립 명세 → 품질 검토를 마쳤다. 최신 resetDevice 수정 APK는 778376fd5eebec12c32e708470ecca52e253652a01fd1a7c7b2362b82b1dc376으로 두 입력을 갱신했으며 위 Phase 1 진행에 기록했다.

남은 확인: 운영 APK 교체, 새 Publisher의 실제 Binder 전달, 실센서·전체 이미지·부팅 검증. Android API를 대역으로 제공한 host 검사를 기기 성공으로 계산하지 않는다. 상세 근거는 저장소의 docs/refactor/skix-observation-component-evidence-2026-10-02.json에 기록했다.

기기에서 확인한 범위 · 제품 연결에 남은 조건

새 Host는 기기에서 생성·바인딩된다. 운영 DeviceAgent까지 새 관측 경로로 연결됐다는 뜻은 아니다. 기존 인증서와 대조한 최신 debug Host·테스트 APK를 설치하고 설치 SHA를 다시 확인했다. 운영 DeviceAgent·EventAsset은 교체하지 않았다.

확인 구역 기기에서 확인한 것 남은 확인
Host 생성·접근 제한 실제 Android Service 바인딩 2건: 관측 모듈 초기화, 일반 UID 입력 거절 제품 부팅 시 자동 초기화·장애 복구
관측 데이터 전달 같은 프로세스의 generated Proxy → Parcel → Stub → 실제 ingress/state 검사 6건 다른 프로세스의 제품 producer·인증·종료·재연결·실센서
운영 DeviceAgent 연결 조건 설치본 0.258/UID1000과 정합 APK 0.256의 SHA가 다름. 양쪽 APK와 Host의 인증서는 일치 배포 버전 정합과 Framework 권한 부여·실제 전달

운영 DeviceAgent의 현재 패키지 정보에는 ACCESS_SKIX_FRAMEWORK 권한 요청이 표시되지 않는다. 서명 일치와 UID1000만으로 제품 연결 성공을 판단하지 않는다. 실제 제품 경로를 확인하려면 최신 producer가 포함된 APK의 배포 버전과 권한을 먼저 맞춰야 한다. 같은 프로세스의 Parcel 검사를 kernel IPC나 물리 동작 검증으로 계산하지 않는다.

검증 근거: 저장소의 docs/refactor/skix-host-device-binding-evidence-2026-10-02.json과 docs/refactor/skix-product-observation-device-gap-2026-10-02.json. 두 묶음 모두 독립 명세 → 품질 검토를 마쳤다.

Blueprint와의 차이 · 설계 변경과 미구현을 구분

2026-09-10 상세 설계 이력은 보존 문서다. 당시의 DeviceAgent 집중 배치·범용 Task 제출 예시를 현재 목표로 그대로 적용하지 않는다. 목표 기준은 현재 Blueprint의 2·4·5·8절이다.

비교 축 현재 Blueprint 목표 현재 구현 / 남은 차이
SDK와 서버 공개 Manager·typed 계약과 내부 서비스 책임 분리 core 공개 계약과 services 서버 소스를 분리·빌드. 제품 전체 실행 이관은 진행 중
부팅·프로세스 얇은 system_server Root + 독립 제품 Runtime Android APK Host가 onCreate()에서 공통 Runtime을 조립·시작. Root 등록·제품 자동 기동·장애 복구는 미완료
실행 소유권 Domain Service가 기능을 소유하고 기존 Agent는 제공자·호환 연결로 축소 7개 Domain Service 구조는 있으나 DeviceAgent·EventAsset 등 기존 제품 owner가 여전히 실행. 기능별 실제 이관 필요
Task 접수 도메인별 typed 요청, 공통 Task 조회·취소·결과 관리 typed 계약과 내부 Task 기반 구현. 공개 Task 연결의 공유 UID·caller/소유권 정책과 실제 제품 경로 검증은 남음
제품 전환 빌드 포함·권한·부팅·실장치 검증까지 연결 APK·QSSI 작업 저장소·별도 AOSP 후보 입력까지 반영. 운영 AOSP 적용·전체 이미지·운영 검증은 남음

판단: 큰 설계 방향은 현재 Blueprint를 따르지만 목표 구조 구현이 끝난 상태는 아니다. 현재 APK Host와 기존 제품 owner를 최종 구조로 고정하지 않는다. 폴더 재배치·이름 변경·팀원 정합은 이관 준비이며, 서비스 실행 책임과 부팅 경계를 실제로 연결해야 한다.

이번 반영 · 제품명 없는 Framework 패키지

Framework 소스와 소비 코드를 새 이름으로 정리했다. 실행 책임 이관과 전체 브랜치 정합은 계속 진행 중이다.

구역 현재 이름과 반영 내용 확인
공개 SDK com.sk.intellix.framework — Manager·모델·Task·canonical AIDL 새 namespace 실제 컴파일, unit 252건, AAR
공통 서버 com.sk.intellix.frameworkservice — Control·Task·Domain·Android Host unit 1,055건, Host APK, Make의 Java 14/AIDL 8 컴파일
소비 코드 소스 695개 경로 이동, import·문자열 클래스명·Gradle·Soong·검증 경로 정리 새 AAR을 정본+7개 소비 앱에 동일 SHA로 반영
제품 앱 기존 설치 ID·권한·제품 레거시 IPC 유지 소비 앱 11개 + DeviceAgent/Host 2개 = Release APK 13개, 플랫폼 서명 확인

IoT는 현행 소스의 dev·opr·mal_dev·mal_opr·stg 5개 변형을 빌드했다. 이전 문서의 4변형/10APK는 이전 묶음의 이력이다. 이전 namespace 묶음에서는 DeviceAgent unit 221건과 EventAssetAgent unit 393건이 통과했다. EventAssetAgent의 후속 전체 검사 396건은 아래 최신 확인에 별도로 기록한다. SDK AAR에는 새 Framework class 526개, 이전 Framework class 0개, 중복 class 0개이며 기존 DeviceControl class 17개는 유지된다. 독립 명세 → 품질 검토를 통과했다.

새 격리 APK로 기기의 PIN 8·중단 8·이동 4, 전송 계약 검사 20건을 실행했다. 일반 UID·설치 SHA를 확인했고 운영 DeviceAgent 0.258·EventAssetAgent 1.015는 교체하지 않았다. 메모리 Binder·대체 gateway 검사이므로 운영 Binder나 물리 동작 성공을 뜻하지 않는다.

이미지 입력 반영: a1-qssi-quber에서 Make가 선택하는 APK 11개를 새 namespace 빌드와 맞췄다. 교체 전 불일치 11건을 재현했고, 백업·실제 설치 ID·버전·플랫폼 서명 대조 후 교체하여 11건 모두 통과했다. 구 Launcher·IoT stg는 이번 이미지 선택 경로에 없어 제외했다.

원본 제품 트리의 남은 작업: 실제 빌드 트리 g13qcs6490/LA.QSSI.13.0.R1/vendor/quber는 별도 디렉터리이며 이번 입력이 연결되지 않았다. 이 트리에는 Host prebuilt 모듈도 없어, 제품 구성과 연결한 뒤 이미지·부팅·제품 IPC를 검증해야 한다. 아래 기존 부팅 증거는 namespace 변경 전 바이너리 기준이다. 지도 제출 요청의 mapMetadataPath 키는 compatibility 상수로 통합해 SDK 송신부와 DeviceAgent 수신부에 반영했다. 경계 검사 실패를 재현한 뒤 영향 host 8건, SDK unit 252건·DeviceAgent unit 221건과 Release 빌드를 통과했다. 기존 전송 문자열·거절 조건은 유지되며 DeviceAgent APK 해시도 이전과 같다. 실제 지도 파일 적용·기기 Binder·로봇 동작 검증은 별도다.

제품 입력 연결 · 후보와 운영 제품을 구분

별도 AOSP 작업 공간에 모듈 설정 10개·선택 APK 11개를 반영하고, 누락된 상위 quber.mk도 원본과 동일하게 복구했다. 실제 QSSI → Quber → 제품 선택 파일을 실행해 소스·프리빌트 두 방식에서 Host·EventAsset·SystemUI 선택을 확인했다. Host의 system_ext 배치·서명 설정·소스/프리빌트 중복 방지, Launcher 권한과 APK 선택을 합쳐 17개 입력 검사가 통과했다.

이는 후보 입력 정합이다. 원본 AOSP와 운영 APK는 바꾸지 않았다. 원본 vendor Git metadata가 없어 후보는 필요한 원본 파일을 복제한 별도 공간이며, 보드·HAL 상속과 전체 Kati/Soong 모듈 빌드는 아직 검증하지 않았다. 정본 근거는 skix-full-aosp-product-overlay-evidence-2026-10-02.json, skix-product-inheritance-evidence-2026-10-02.json이다.

Framework 소스 탑재 준비 · 후보 공간에 실제 입력 배치

후보의 vendor/quber/packages에도 Framework 소스 732개를 배치했다. SDK·공통 Host·서버 라이브러리와 빌드 설정·manifest·리소스가 대상이다. 다른 제품 앱은 앞서 검증한 프리빌트를 유지한다. 이전 소스 모드 검사는 임시 연결로 제품 선택만 확인했으므로, 이번 실제 소스 배치와 구분한다.

확인한 연결 결과 아직 증명하지 않은 것
root → apps → SDK·Host Make 실제 AOSP Make 함수로 두 소스 모듈 등록 확인 전체 제품의 모듈 탐색·Kati 빌드
Host → SDK + 서버 라이브러리 참조하는 6개 BP 모듈의 소스와 의존 경로 존재, Host 프리빌트 중복 없음 Soong 실제 컴파일·APK 패키징
원본 소스 → 후보 입력 732개 파일 SHA 일치, 기존 대상 덮어쓰기 거부 운영 AOSP 적용·제품 부팅

배치 도구는 지정한 입력만 복사하고, 임시 공간에서 해시를 검증한 뒤 반영한다. 기록 파일 생성에 실패하면 소스 디렉터리를 게시하지 않는다. 관련 검사 6건과 실제 AOSP bpfmt 문법·형식 검사를 통과했다. 정본 근거는 skix-aosp-source-inputs-evidence-2026-10-02.json이다. 이는 소스 탑재 준비이며 전체 Soong/Kati 빌드·이미지 생성·자동부팅 성공을 뜻하지 않는다. 원본 AOSP·운영 APK·팀원 저장소와 기존 SVG는 변경하지 않았다.

SafeCare 정합 · 반영한 동작과 남은 차이

팀원 코드에서 빠졌던 실제 호출 경로를 아래처럼 반영했다.

Launcher 예약 ID 검증: 실제 요청 생성 테스트에서 같은 예약의 다음 실행이 같은 ID를 재사용하던 실패를 재현했다. 수정 후 Launcher unit 41건/22 suite와 Release 빌드, 워커 대기·접수 보호 host 4건, EventAsset의 기존 영속 접수 이력 선택 unit 20건/1 suite가 통과했다. 새 Launcher APK를 백업·서명·해시 확인 후 QSSI 작업 입력과 별도 AOSP 후보에 반영했고, Make 선택 검사도 각각 1건 통과했다. 이 검사는 운영 Binder·실제 순찰·부팅 완료의 증거가 아니다. 근거: skix-schedule-occurrence-evidence-2026-10-02.json.

Launcher 추가 정합 · 누락 동작 두 곳 복구

기능 이전 누락 반영한 동작
귀환 안내 화면 SafeCare 화면 위에 Launcher 안내가 겹칠 수 있음 외부 SafeCare 화면이 앞에 있으면 Launcher 안내를 띄우지 않음
AQM 센서 목록 잘못된 위치 ID 하나가 뒤의 정상 센서 처리를 막고 이전 목록을 남김 잘못된 항목만 제외하고 정상 센서를 모아 최종 목록을 갱신. 전부 무효면 빈 목록으로 교체

팀원 코드의 동작을 수용하면서 기존 null 입력·타입 기본값·화면 보호는 유지했다. 귀환 안내는 실제 helper·callback을 사용한 host 4건, AQM 목록은 실제 handler·정본 모델을 사용한 host 5건으로 확인했다. 최신 AQM 변경 기준 Launcher unit 41건/22 suite, failure·error·skip 0 및 Release 빌드가 통과했다. 이 테스트의 worker·Activity는 대역이므로 실제 센서나 Android 화면 동작이 검증됐다는 뜻은 아니다.

Launcher Java는 양쪽 380개이며 팀원 파일 누락은 없다. namespace 정규화 비교의 차이 13개는 실제 동작·보호조건·단순 표현 차이로 분류했다. 이 목록은 두 수정 전 비교 기준이며 전체 완료율이 아니다. skix-launcher-remaining-classification-2026-10-02.md, skix-return-guide-owner-evidence-2026-10-02.json, skix-launcher-aqm-list-evidence-2026-10-02.json에 판단과 검증 근거를 기록한다. 최신 Launcher2 APK SHA-256은 c52c9c8701182badba150f1f0fb1d9fdd33b3a77882c1df6e0ec68a072efdd83이다. 이 값은 후속 AQM 측정 입력 보호까지 포함한다. 백업·설치 ID·버전·플랫폼 서명을 확인해 QSSI 작업 입력과 별도 AOSP 후보에 반영했으며 Make 선택 검사도 각각 1건 통과했다. 원본 AOSP와 운영 APK는 유지했다. 앞선 예약 ID 검증은 해당 묶음의 이력으로 남기며 최신 APK의 전체 제품 검증으로 합산하지 않는다.

최신 확인: EventAssetAgent unit 396건/28 suite, failure·error·skip 0 및 Release 빌드 통과. APK 설치 ID·버전·플랫폼 서명을 대조하고 백업한 뒤 QSSI 작업 저장소의 EventAssetAgent 입력을 갱신했다. 최신 station listener 변경은 QSSI와 격리 AOSP 후보의 입력 2곳에 반영했고 Make 선택 검사가 각각 1건 통과했다. 최신 APK SHA-256은 71434607d7518066381494e525768b01abd63eece62aa0a8ce20a6002918b5aa이다. 교체·해제된 listener의 늦은 전달을 막으며 이미 실행 중인 콜백을 중단하는 기능은 아니다. Android Looper·운영 Binder·실제 화면·순찰·전체 이미지 부팅 검증은 별도다.

남은 11개 파일은 모두 미이관 기능이라는 뜻이 아니다. 빌드 대상 app/src/main/java는 양쪽 180개이고 팀원 누락은 없다. Framework namespace만 맞춰 비교하면 169개가 같고 11개가 다르다. 4개는 import·주석·메서드 배치 차이, 나머지는 이름 변경·Toast 소비 방식·재연결/인증 보호·제품 정책 차이를 포함한다. 이 수치는 기능 완료율이 아니다. 과거 370/372개 목록과는 조사 범위도 다르다.

실패 안내는 원인에 맞춰 유지한다. 팀원 코드는 시작을 막은 결과를 구독 실패 안내로 연결하지만, 현재 SDK의 PREVENTED 분류는 REJECTED·CANCELLED·EXPIRED를 모두 포함한다. DeviceAgent는 요청 취소나 기한 만료에도 이 상태들을 만든다. 따라서 구독 실패로 일괄 변경하지 않고 일반 실패 안내를 유지한다. 실제 시작 호출이 -1을 반환하는 기존 구독 안내·메뉴 복귀 경로는 별개로 보존한다.

시작 경고·idle 책임 대조: 메뉴 진입 안내와 실제 시작 직전 재검사를 구분하고, STOP 접수 뒤 idle 관측을 기다리는 보호를 유지했다. 기존 영향 unit 82건/3 suite를 확인했다. STOP 접수나 idle 관측만으로 물리 중단 완료를 뜻하지 않는다. 재연결 listener·오래된 인증/Toast callback 보호는 유지한다. 정본 근거는 skix-region-availability-evidence-2026-10-02.json, skix-resolution-timer-evidence-2026-10-02.json, skix-eventasset-remaining-classification-2026-10-02.md, skix-safecare-prevented-classification-evidence-2026-10-02.json 및 해당 SHA 기록이다. 실패 원인은 SDK SecurityPatrolRequestSnapshot.isPrevented() → DeviceAgent WssPatrolStartRequests.cancel()/refresh() → EventAsset SafeCareStartCoordinator.awaitStart()/resolved()의 실제 소스 흐름으로 대조했다.

새 SDK AAR SHA-256: de4ed30ae04c2eddcf0a227f33f3b54777c503b2a9d1d76e9d933354dc7c215c. 정본 근거: skix-framework-namespace-evidence-2026-10-02.json, skix-framework-namespace-image-evidence-2026-10-02.json, skix-map-metadata-wire-evidence-2026-10-02.json. 최신 AAR은 정본+7개 소비 경로에 반영했다. 타 소비 APK는 앞선 namespace 빌드 묶음이며 이번 상수 정리로 다시 빌드한 것으로 표시하지 않는다. 이름 변경을 Domain Service 실행 책임 이관이나 전체 정합 완료로 계산하지 않는다.

먼저 볼 것 · 목표와 현재를 구분

  1. 목표: DeviceAgent의 이관 대상 기능은 Domain Service가 소유하고 DeviceAgent는 제품 연결·호환 adapter로 축소한다.
  2. 현재 제품: Launcher/2는 SDK를 소비하며 ProductSystemUI는 공통 UI API를 제공하고, DeviceAgent·EventAssetAgent·IotAgent가 실행·연결을 담당한다.
  3. 분리한 공통 서버: Control·TaskManager·7개 Domain Service가 있지만 현재 제품의 모든 명령이 이쪽으로 이동한 것은 아니다.
  4. 확인 범위: SDK·소비 APK·Host 이미지 입력, 기기의 Host 초기화·합성 관측 Binder 전달·설치된 CameraBroker 상태 조회까지 확인했다. 전체 이미지 생성·자동부팅·실센서 및 기능별 실행 책임 이관은 남아 있다.

그림은 목표 구조 → 현재 이관 상태 → 공통 서버 내부 → 유지한 Android Layer → Core 기동 목표 → 현재 부팅 경로 순서로 읽는다. 클릭하면 원본 SVG를 확대할 수 있으며, 상세 폴더와 변경 이력은 아래에 둔다.

리팩터링 목표 · 기능 책임을 Domain Service로 이관

리팩터링 목표: SDK / Binder → 공통 제어·Task → 기능별 Domain Service → 제품 adapter

완료 방향은 DeviceAgent의 기능 책임을 Domain Service로 나누는 것이다. Domain이 상태·정책·실행 접수·관측 해석을 맡고, 장치·모델·화면의 실제 실행은 port와 제품 제공자로 연결한다. DeviceAgent는 필요한 legacy IPC·장치 연결·callback adapter 위주로 줄인다. 지금처럼 제품 owner가 모든 기능을 계속 소유하는 구조를 최종 상태로 두지 않는다.

Blueprint의 목표 배치는 system_server의 얇은 Root·부팅 연결부 + system_ext 독립 제품 Runtime의 공통·도메인 서비스다. SDK는 호출 앱에 놓인다. EventAssetAgent의 전문 실행·저장, SystemUI의 화면 등은 해당 owner를 유지하며 공통 서버에 중복 구현하지 않는다. 기능별 책임 이관은 실제 caller·계약·완료/중단 의미까지 함께 맞춰야 한다.

위 그림은 목표와 그 구간별 이관 진척을 보여준다. 아래는 현재 실제 소유권의 비교 그림이다. 현재와 목표를 한 실행 경로처럼 섞지 않는다.

현재 이관 상태 · 기존 제품 owner와 분리된 Core

전체 구조: 앱 → SDK → 현재 제품 서비스 / 선택적 공통 서버 → 외부 장치

왼쪽은 현재 제품의 실행 경로, 오른쪽은 분리한 공통 서버와 이미지 입력에 연결한 Host다. Host 탑재 설정과 일부 Binder 검증을 마쳤지만 기존 제품 명령 전체를 이관한 상태는 아니다. Launcher/2는 API 소비층, ProductSystemUI는 공통 UI 서비스 영역에 두고, DeviceAgent·EventAssetAgent·IotAgent의 실행 책임을 별도로 표시했다. 두 경로가 이미 하나로 통합된 것처럼 그리지 않았다.

공통 서버 내부 · TaskManager와 기능별 Service

공통 서버 내부: Endpoint → Task / Control → Domain · runtime composition

base/core는 공개 SDK, base/services/core는 서버 로직이다. 서버 내부의 Task·Control·Domain·Runtime을 확대했다. 실제 Domain Service 7개는 유지하고, 사용하지 않는 생성자 골격 8개는 제거했다. 기존 제품 명령이 모두 TaskManager를 통과하는 상태는 아니다.

실제 폴더로 구조 읽기

skix-framework/base/
├── core/                 공개 Manager·모델·Task 계약, 내부 AIDL
├── compatibility/        기존 제품 IPC·Bundle·callback 변환
└── services/
    ├── core/java/.../server/
    │   ├── control/      상태·정책·자원·권한
    │   ├── execution/    Task 접수·실행권·기록·예약
    │   ├── domain/       AMR·Cleaning 등 기능별 서버 로직
    │   ├── entrypoint/   요청 검증·서버 진입 경계
    │   └── runtime/      공통 서비스 조립·시작·종료
    ├── runtime/java/     Android Service·Binder·관측 Gateway
    └── tests/            서버 로직·Android 경계 검사

core는 앱이 쓰는 SDK이고 services/core는 서버 로직이다. services/runtime은 서버를 Android에서 구동하는 연결부다. 실제 앱은 apps/DeviceAgent, apps/SKMLauncher2, apps/SkixFrameworkService 등에 있다. 빈 예약 폴더와 사용하지 않는 Service 골격은 제거했다.

내부 README는 base·Android runtime·SDK 패키징·DeviceAgent·Launcher2의 역할과 현재/목표/미검증을 설명한다. 다음 세션은 인수인계 → 해당 README → 작업 카드 → 필요한 소스 변경분 순서로 복구한다. 상세 로그와 SHA는 정합 기록에 둔다.

Android Layer에서 SKIX는 어디에 놓이나

Android 기본 계층과 SKIX 배치

왼쪽은 Android의 기본 계층이고 오른쪽은 우리 코드가 맡는 책임이다. 같은 높이에 놓였다고 같은 프로세스에 들어간다는 뜻은 아니다. 이 대응은 AOSP 공식 Architecture overview와 Android Platform architecture를 참고해 현재 코드에 적용했다.

구분 한 문장으로 읽기
화면 Launcher/2가 화면과 시나리오를 소유한다. ProductSystemUI가 공통 상태바·팝업을 소유하고 SDK API로 제공한다.
공개 API base/core의 Manager·모델은 현재 AAR로 앱에 포함된다.
서버 로직 base/services/core에는 Control·Task·Domain Service가 분리돼 있다.
현재 제품 실행 DeviceAgent·EventAssetAgent·IotAgent가 기존 실행·연결 책임을 유지한다.
Android 연결 services/runtime의 Host는 선택적 구성이다. SystemServer 통합 완료를 뜻하지 않는다.
장치 연결 adapter와 기존 플랫폼/HAL을 사용한다. AMR·MCU·Agent가 모두 HAL인 것은 아니다.

두 개의 core를 구분하면 그림이 읽힌다: base/core는 앱의 공개 계약, base/services/core는 서버 로직이다. Binder는 이들 사이의 연결 방식이다.

리팩터링 후 부팅 목표 · Core Service 초기화

리팩터링 후 Core 초기화: Android 시작 주체 → Host → Composition → Registry → Control / Task / Domain

리팩터링의 기동 목표는 SKIX Host가 Core Service를 한 수명 아래 초기화하는 것이다. Core의 ManagerService마다 APK나 프로세스를 따로 띄우는 구조가 아니다. 목표의 얇은 Android Root·부팅 연결부가 제품 Host를 생성하면 Host 안에서 루트·저장·의존성을 조립하고 ServiceRegistry가 Core Service의 onStart()를 실행한다.

이 내부 초기화 코드는 이미 있다. 기본 구성은 Control·Task/Evidence와 Iot·AirQuality·Power·Cleaning 관측을 시작한다. 소스에 존재하는 Amr·Llm·Vision까지 모두 자동 활성화하지 않는다. AMR 실행은 withMovement와 장치 provider 연결을 명시해야 한다. FrameworkRuntimeHost가 전달하는 CORE_SERVICES(500)은 내부 수명 단계이며 Android의 SystemServer boot phase 자동 연결이 아니다.

아직 남은 부분은 제품 부팅 시작 경로, 공개 SDK/Binder 연결, 기능별 장치 adapter와 기존 owner의 실행 책임 이관이다. 위 그림의 점선은 이 목표 연결이다. 아래 그림은 비교를 위한 현재 제품 부팅 경로이며 목표 완료 상태를 뜻하지 않는다.

현재 코드의 부팅 · 기존 제품 경로와 bind 기반 Host

부팅 흐름: init / Zygote / SystemServer → broadcast → 제품 서비스 초기화 · bind 기반 Host

DeviceAgent의 잠금 전 시작, IoT·상태바의 부팅 완료 시작, EventAsset·공통 Host의 bind 기반 활성화를 구분했다. 각 컴포넌트의 onCreate()에서 의존 연결·외부 서비스 bind·runtime 초기화가 어떻게 이어지는지 그림 안에 표시했다. 서로 다른 APK 사이에 확정되지 않은 실행 순서는 그리지 않았다.

서비스 시작과 bind는 구분한다. AOSP 시스템 서비스는 SystemServer가 시작한다. APK의 Android Service는 시작 요청 또는 bind로 생성할 수 있다. 현재 SKIX는 Gateway가 Host에 BIND_AUTO_CREATE로 연결하고, Host의 onCreate()가 Core 객체를 조립해 lifecycle을 시작한다. onBind()는 Binder를 반환하며 내부 Task·State·Policy 서비스마다 개별 bind를 하지 않는다. 클라이언트 연결과 독립적인 제품 부팅·재시작 수명은 아직 확정·검증되지 않았다.

Android 공통 구간은 AOSP 부팅 설명·Zygote 설명·Direct Boot 설명을 참고했다. SKIX 구간은 현재 manifest·receiver·서비스 소스 기준이며 실제 기기 부팅 trace는 아니다.

그림 읽는 법: 배경색은 컴포넌트 종류, 테두리와 상태 문구는 확인 범위다. 실선 호출·제어, 파란 점선 callback, 녹색 점선 관측, 회색 점선 미완료 연결을 구분했다. 그림을 클릭하면 편집 가능한 SVG 원본을 확대할 수 있다.

정합 작업 이력 · 아래 SHA와 검증은 각 작업 당시 기준

현재 namespace와 입력 상태는 문서 상단을 기준으로 본다. 아래 기록의 이전 APK SHA·기기 결과를 최신 바이너리 검증으로 해석하지 않는다.

이번에 실제로 바뀐 부분

팀원 소스 정합에 이어 지도 거절 처리·ICT 초기화 방어·Host 이미지 입력을 반영하고, 관측 Binder와 설치된 CameraBroker 상태 조회를 기기에서 확인했다. SDK 정본과 기존 제품 실행 owner는 유지한다. 아래의 “확인”은 적힌 범위에 한정되며 전체 제품 완료율이 아니다.

작업 이전 상태 현재 상태 확인 범위
SafeCare 업로드·복구 DeviceAgent와 EventAssetAgent에 실행 처리가 중복 EventAssetAgent가 업로드·복구·삭제를 담당. DeviceAgent는 typed 요청·결과 전달 실제 Java 협상/전이 검사, APK 빌드
인증 timeout·알림 DeviceAgent의 별도 60초 timer와 cloud 알림 owner가 정한 deadline·결과 사용. 중복 controller 3개, 1,464줄 제거 owner snapshot·ID/감지시각/순번 회귀
PIN 인증 인증 전 실행 ID 확인 인증 후에도 같은 실행인지 확인. 새 실행에는 이전 인증 성공 적용 차단 실제 Java PIN 진입 메서드, credential endpoint는 대체 객체
순찰 시작·중단 시작 결과 기록이 알림 뒤에 있음. 새 중단 경로의 앱 알림 누락 결과를 먼저 기록한 뒤 SDK용 mode 알림과 기존 IPC 알림 전달. 승인되지 않은 중단은 알림 차단 실제 Java 결과 메서드, callback endpoint는 대체 객체
DeviceAgent 이미지 입력 이전 정합 APK 최신 Release APK로 교체, 플랫폼 서명·SHA·백업 확인 이미지 입력 파일까지. 이미지 생성·부팅 미검증
공통 Service 구조 사용하지 않는 생성자 골격 8개를 폴더·테스트에서 강제 골격 Java 16개 제거, 실제 Service 7개 유지. 폴더·계층 검사도 현재 소스 기준으로 수정 수명·등록 테스트 10개, Host Release 및 DEX 포함 여부
지도 제출 snapshot 거절 뒤에도 AMR setBypass가 이어짐 거절 결과를 전달하고 즉시 종료 실제 Java 6경우·영향 검사, Release 빌드. 기기 지도 동작은 미검증
Host 이미지 탑재 QSSI prebuilt 경로에서 Host 누락 제품 목록과 플랫폼 서명 APK 추가. source/prebuilt 모두 system_ext 배치, 중복 모듈 방지 Make 평가 6개·Host 14Java/8AIDL 컴파일. 전체 이미지 빌드는 미검증
Host 기기 초기화 소스·빌드 근거 Host/test APK 설치, 서비스 bind와 4개 ingress 생성 확인 기본 계약 19개 + Host bind 1개, Android 기기 실행
관측 IPC 내부 검사 중심 권한 없는 producer 거절, system UID remote 관측 전달·순번/시각/세션 검사 거절 1개 + 임시 앱의 정상3/거절3. 합성값이며 실센서 검증 아님
ICT 초기화 콜백 API 연결 전 이벤트에서 null 접근 가능 팀원 null 검사를 수용. 연결 전 무시하고 연결 후 원본 payload 전달 실제 Java branch RED→영향12 PASS·Release 빌드. 실제 ICT 앱 동작은 미검증
CameraBroker 외부 앱 의존성의 설치 기록만 있음 팀원·우리 소비 AAR/연결 코드 동일, 설치본1.0.17 remote 상태 조회 PASS 임시 앱 제거·기존 Vision 연결 유지. 최신 소스·이미지 입력은 미확인

검증을 세 단계로 구분한다. 소스 수준에서는 SDK 계약과 팀원 기능 차이를 정합했다. 이미지 입력 수준에서는 소비 앱과 Host의 APK·서명·제품 선택을 맞췄다. 기기에서는 Host 생성·관측 Gateway·설치된 CameraBroker의 실제 Binder 상태 조회를 확인했다. 이들을 전체 제품 완료율로 합산하지 않는다.

기기 결과: Framework Host와 테스트 APK를 설치해 계약 19개·Host 초기화 1개·권한 거절 1개를 서로 다른 실행 묶음에서 확인했다. 임시 플랫폼 서명 system UID 앱으로 별도 프로세스의 Power Gateway에 정상 관측3건을 전달하고 중복 순번·미래 시각·종료 후 호출3건을 거절하는 것도 확인했다. 임시 앱은 제거하고 서비스 정리까지 확인했다. 임시 앱의 권한 요청은 공유 system UID에 영향을 줄 수 있으므로 기존 DeviceAgent의 권한이나 전달 성공으로 해석하지 않는다.

CameraBroker 기기 결과: EventAssetAgent·Launcher2가 사용하는 AAR와 팀원의 AAR는 동일하다. 임시 플랫폼 서명 앱으로 설치된 Broker1.0.17에 bind해 원격 Binder descriptor와 isCameraRunning() 호출을 확인했다. 결과는 true였으며 프레임 조회·클라이언트 등록·카메라 시작 요청은 하지 않았다. 임시 앱 제거 후 기존 Broker·Vision 프로세스와 연결이 유지됐다. 현재 설치본과의 상태조회 IPC 호환성 근거이며 최신 소스·새 이미지 탑재·촬영 성공·Framework Vision 실행 책임 이관을 뜻하지 않는다.

이미지 입력과 설치본: 새 DeviceAgent/QSSI 입력은 90651aff82bcd804f07b059d0ce155dd58cba0147592ad061c71b70337b37b4c, Host Release/QSSI 입력은 e947a19c0a83aafc9dd620a26ffbf0cbe0047f13cb05b452998e112e22dbcd05다. SDK 정본 AAR은 d113cb90…로 유지했다. 기기의 기존 DeviceAgent0.258은 유지했고 새0.256은 설치하지 않았다. Host 기기 검사에는 Debug 플랫폼 서명 APK를 사용했으므로 Release 이미지 부팅 검증과 구분한다.

다음 작업: 남은 제품 caller 의미 차이 정합 → 새 DeviceAgent producer의 실제 관측 전달 → 이미지 생성과 자동부팅·장애 복구 → 기능별 실행 책임 이관. CameraBroker 제품 입력은 별도로 확보해야 한다. 공개 Task SDK 연결은 공유 UID의 caller·Task 소유권 정책 결정이 선행하며, 이를 우회해 공개하지 않는다.

Blueprint는 검토할 초안이다. 기존 제품의 실행 책임을 먼저 확인하고 필요한 계약을 수용한다. 전체 merge/rebase, 새로운 도메인 일괄 생성, Planner 구현은 이번 범위에 넣지 않는다.

DeviceAgent · 관측 연결과 검증 빌드 정합

제품의 기존 처리를 유지하면서 Framework 관측 실패를 분리했다. 새 APK와 QSSI 입력까지 반영했고, 기기에는 설치하지 않았다.

MCU 수신 → 기존 센서 갱신 + fan / AirQuality 관측
AMR 수신 → 기존 상태 처리 + Power 관측
IoT 연결 상태 → 기존 상태 저장 + IoT 관측
                              ↓
                     관측 실패는 각 호출에서 격리
                     제품 처리와 명령 반환은 계속

청소 시간 정책은 실제 팀원 메서드와 공통 정책을 20,000개 입력으로 대조했다. 이는 host 입력 비교이며 실기기 청소·팬 수명 검증은 아니다. IoT Binder는 기존 호출 순번을 보존한다. 팀원 파일을 그대로 복사해 호출 순번을 바꾸는 방식은 적용하지 않았다.

각 코드 변경은 독립 명세·품질 검토를 거쳤다. 최신 DeviceAgent Release와 QSSI 입력은 동일한 플랫폼 서명·동일한 SHA이며 이전 입력은 백업했다. 관측 실패 격리가 Domain Service로의 실행 책임 이관 완료를 뜻하지 않는다. Android·MCU·Binder·AWS의 실제 동작은 host 검사와 구분하며, 전체 이미지 생성·자동부팅·실센서 전달은 남아 있다.

DeviceAgent · 작업 큐와 콜백 정합

서로 다른 기능이 같은 큐 번호를 사용해 다른 작업까지 취소하던 문제를 수정했다.

WSS 명령       → 2000번대 ┐
                         ├→ 기존 공통 작업 큐 → 장치 명령 실행
Streaming 명령 → 3000번대 ┘

최신 DeviceAgent Release와 QSSI 입력 SHA는 90651aff82bcd804f07b059d0ce155dd58cba0147592ad061c71b70337b37b4c로 같다. 플랫폼 서명 확인과 이전 입력 백업을 완료했다. 새 APK 설치·전체 이미지 부팅·실제 장치 동작은 아직 검증하지 않았다.

DeviceAgent · 실제 명령 결과와 연결 종료

미구현 이동 명령의 잘못된 접수 응답과 TTS·AMR·제품 서비스 연결 종료 결함을 수정했다. 네 변경 모두 소스·Release APK·QSSI 입력까지 반영했으며 기기에는 설치하지 않았다.

관측 publisher 4종은 DeviceAgent 생성·종료 흐름에 연결되어 있다. 이동은 RuntimePorts → AmrOperations → 제품 adapter, 청소는 CommandHandler → CleaningOperations → 제품 adapter를 실제로 호출한다. 이 경로는 공통 실행 로직을 제품에 연결한 상태이며, DeviceAgent의 실행 책임을 Domain Service로 모두 옮긴 상태는 아니다.

각 변경은 실패 재현과 독립 명세→품질 검토를 거쳤다. host에서는 Android·원격 전송 경계를 대역으로 처리했다. 실제 TTS 음성·AMR 장치·Binder 경쟁·새 이미지 부팅은 아직 검증하지 않았다. 앞선 기기 검사 결과를 이번 APK의 기기 검증으로 사용하지 않는다.

Binder 요청과 제품 초기화 정합

팀원 코드에서 빠졌던 Bundle 클래스 로더 설정을 복구했다. 예약처럼 SDK 모델이 들어 있는 요청은 첫 Bundle 조회 전에 DeviceAgent 클래스 로더를 지정한다. 실제 요청 메서드를 실행한 host 7개가 통과했고, 기존 null·빈 요청·일반 명령·권한 거절 응답을 유지했다. host의 Bundle 복원과 호출자 판정은 대역이다. 실제 Parcelable 전송·Binder 권한 검증은 남아 있다. Release 빌드·플랫폼 서명·백업·QSSI 입력 반영을 마쳤으며 새 APK는 기기에 설치하지 않았다.

제품 초기화도 팀원 본문과 대조했다. 서비스 연결과 부팅 명령 처리는 동일하며, 초기화에는 관측 전달 4종과 TTS 등록 관리가 추가됐다. MCU·설정 이관·청소 예약·SoundFlow·LCD·네트워크·OTA 초기화는 유지한다. 이는 소스 대조 결과이며 실제 Android 부팅 성공을 뜻하지 않는다.

익명 구현에서 adapter로 옮긴 동작

팀원 DeviceAgent에 모여 있던 설정·공기질·이동·복구·시스템·버전·제품 등록·시뮬레이션 구현을 adapter 15개, 메서드 158개와 대조했다. 검토 범위에서 빠진 메서드는 발견하지 않았다. 147개는 패키지 이름·주석·서식을 제외한 본문이 같고, 나머지 11개는 Context 사용·변수명·AMR 실행 연결 차이를 개별 확인했다. 독립 명세·품질 검토를 통과했으며 이번 대조에서는 제품 코드를 추가로 바꾸지 않았다.

이동의 기존 스테이션 복귀 분기와 일시정지·재개·중단 인자는 공통 AmrOperations → 제품 adapter 경로에서 유지한다. 158개는 전체 정합 완료율이나 실제 실행 성공 수치가 아니다. 내부 상태 저장 8개와 MCU 패킷 2개 본문은 같고, 팬·OTP·OTA·Pairing 전달도 기존 인수와 미연결·예외 처리를 유지한다. 전체 이미지 부팅·실제 장치 실행은 남아 있다.

명령 등록과 지연 실행 연결

양쪽 모두 명령 처리기 35개를 등록하고 실행 의존성 32개를 참조한다. 이 범위에서 팀원 등록이 빠진 곳은 없었다. 관측 전달 추가, 청소 의존성의 null 검증, 지도 생성자의 인수 순서 변경은 실제 연결과 일치한다. MainApi의 명령 진입·callback·MCU OTA 연결도 유지한다.

등록 순서가 달라진 구간은 실제 선택 조건과 Dispatcher로 대조했다. 179개 후보 문자열과 null·알 수 없는 명령을 확인했으며, 순찰 상태 조회는 의도적으로 Security에서 SecurityPatrol 처리기로 옮겼다. 같은 상태 조회 항목을 반환한다. 나머지 후보의 첫 처리기 선택은 유지한다. 이는 명령 선택 검증이며 각 처리기의 장치 실행 성공을 뜻하지 않는다.

지연 작업은 팀원 코드처럼 기존 MainHandler에 등록하도록 복구했다. 매번 새 Handler를 생성하던 차이를 제거했다. 실제 연결 람다의 host 2개가 수정 전 실패하고 수정 후 통과했으며, 명세·품질 검토와 Release 빌드를 통과했다. 플랫폼 서명·기존 입력 백업·QSSI APK 갱신을 확인했다. host의 취소 확인은 소유권 호환성 검증이며 제품 종료 때 취소가 구현됐다는 뜻은 아니다. Android Looper·새 APK 설치·부팅은 미검증이다.

실행 경계 복구와 남은 명령 대조

이번에 바꾼 코드: 오류 발생 후 스테이션 복귀가 팀원 코드와 같은 ExecutionPolicyGateway를 거치도록 복구했다. 기존 허용·부분 허용·거절 결과와 인자는 유지한다. 명령 전달 인터페이스 3개에는 팀원의 @FunctionalInterface를 복구해, 추상 메서드를 잘못 추가하면 컴파일 단계에서 잡도록 했다. 새 인터페이스나 계층은 추가하지 않았다. 두 변경 각각의 영향 host 검증·독립 명세/품질 검토·Release 빌드를 통과했고, 플랫폼 서명·백업·QSSI 입력 갱신을 확인했다.

코드가 이미 보존된 구간: 실행 의존성 32개의 필드·생성자·setter 연결, 상태/펌웨어/카메라/전달 6파일, 관리정보/진단/명령 전달/오류 4파일, 설정/등록/예약/LLM 12파일을 전체 소스 차이와 대조했다. 검토 범위에서 팀원 기능 누락은 발견하지 않았다. LLM의 명령·키·값 29개는 공통 상수를 재귀 해석한 실제 문자열이 팀원 값과 같고, 실행 본문도 같다.

설정에는 기존 차이가 하나 있다. 직접 야간모드 명령은 앞뒤 공백과 대소문자를 허용한다. SDK가 전달하는 "true"·"false" 계약과 기존 setConfig 처리는 유지한다. 이 차이를 단순 서식 변경으로 계산하지 않았다. 위 파일 수는 검토 범위이며 완료율이 아니다. 전달 검증의 Bundle은 host 대역이고, 소스 대조는 실제 Binder·LLM·장치 실행·부팅 성공을 증명하지 않는다.

SafeCare 화면 앱의 호출권한 누락 복구

EventAssetAgent가 PIN·순찰 API에서 거절되는 원인을 수정했다. 화면과 인증 세션을 맡는 com.sk.airbot.eventassetagent가 팀원 코드의 WSS 화면 앱 허용 목록에는 있었지만 우리 목록에는 빠져 있었다. 해당 항목을 반영했다. 기존 system UID·PID·패키지·호출 역할 검사는 유지한다. 이 값은 패키지 이름의 SHA-256이며 APK 서명 인증서와는 다르다.

실제 WSS 검사 코드와 SHA-256 구현을 실행한 host 11개 항목이 통과했다. 화면 앱 호출은 허용하고 일반 앱·알 수 없는 앱·테스트 패키지·다른 PID·원격 전용 API 호출은 계속 거절한다. 실패 재현, 명세·품질 검토와 Release 빌드 50초를 통과했다. 이전 이미지 입력 백업·플랫폼 서명 대조·QSSI APK 교체 후 SHA 일치를 확인했다. Android 호출자 정보는 host 대역이므로 실제 PIN 검증·순찰·기기 부팅 성공은 아직 증명하지 않았다.

도메인 의존성 검사와 남은 차이

팀원의 DeviceAgent 도메인 검사 규칙을 가져와 공통 검사에 연결했다. domain에서 app/service를 직접 참조하거나 지정된 전역 객체를 직접 사용하는 변경을 잡는다. 검사 파일·필수 소스가 없거나 검색에 오류가 나도 실패하도록 보강했다. 제품 검사 4개·공통 회귀·현재 소스 트리 검사와 명세·품질 검토를 통과했다. 이 검사는 소스 의존성 검사이며 Soong 모듈 경계를 모두 분리했다는 뜻은 아니다.

AIDL·Manifest·리소스·빌드 입력 등 팀원 88개와 우리 88개를 대조했다. 79개는 원문이 같고, 차이 8개와 팀원 전용 1개는 SDK 정본 연결·기존 Binder 순번·버전·검사 이관으로 구분했다. IoT AIDL의 기존 순번을 바꾸는 팀원 변경은 그대로 복사하지 않았다. 선택적 annotation의 Proguard 경고 정합은 남아 있다. 파일 수를 제품 완료율로 계산하지 않는다.

공기질 5개·MCU OTA 2개, 제품 명령·지도·SafeCare 8개 파일도 전체 차이를 대조했다. 공기질은 실제 양쪽 계산 코드의 등급 1,554·정렬 8,001·이력 17개 입력 결과가 같았다. 오류/OTA 공통 문자열 8개도 팀원 값과 같다. 지도 오류 메시지·잘못된 JSON의 실패 순서, 내부 순찰 snapshot 생성자 규격, MCU 미연결 시 반환 차이는 별도로 기록했다. 정상 경로 보존과 소스 대조를 실제 센서·MCU·Binder 실행 성공으로 해석하지 않는다. 예약·WSS 요청 보호 규칙은 아래 범위까지 검토했다. EventAsset의 나머지 화면·검증 입력 정합과 제품 실행 책임 이관은 남아 있다.

SafeCare 화면과 실행 소유자 정합

현재는 EventAssetAgent의 화면과 실행 경로를 팀원 소스에 맞추고 있다. 실행 책임을 Domain Service로 옮긴 상태는 아니다.

작업 구역 반영한 동작 확인 범위 남은 것
귀환 화면 일시정지·재개는 화면 전환. 나가기는 Controller → Session → worker → WSS 종료 요청 host·unit·격리 기기 화면 검사 4건 실제 로봇 귀환·물리 중단
관측·화면 수명 UNKNOWN/연결 손실만으로 종료하지 않음. 확인된 STOPPED만 종료·귀환. 재생성 상태·EyeLED 수명 복구 host·peer 화면 unit 제품 화면과 LED 동작
PIN·구독 안내 원래 제목·본문·toast·버튼 복구. 실패 시 Controller 신호로 Launcher 메뉴 복귀 host·격리 전송/문구 검사 실제 서비스 응답과 Launcher 화면
중단 후 귀환 기한이 지난 중단 결과·상태 조회로 AMR 귀환을 승인하지 않음. 같은 중단 실패 알림은 한 번 실제 Session host·unit·Release 실제 IPC 지연·worker 경쟁·AMR 동작
작업명 안내 메뉴의 실제 caller가 공통 안내 formatter 사용. 한국어·영어 작업명과 취소 버튼 유지 host·격리 기기 2건, 언어별 17개 이름 실제 팝업 전송과 작업 중단
설정 초기화 기본 설정 조회 → main 상태 반영 → 완료 후 화면 구성. 동적 옵션의 초기 모드 선택 복구 실제 Controller/Fragment host·격리 옵션 뷰 3건 실제 장치 조회와 worker 경쟁
화면 이동 뒤로 가기에서 시작 취소 → Launcher 메뉴 선택 → 화면 닫기. Session도 기존 무애니메이션 옵션 사용 실제 handler host·Intent/창 계약 검사 운영 Activity·Launcher 전환
전송 경계 PIN context/deadline, 중단 fingerprint/owner, 이동 접수·거절을 별도 검사 SDK/Parcel·메모리 Binder proxy 운영 제품 Binder·물리 완료

화면 종료와 종료 요청 전달은 물리적인 로봇 정지 완료를 뜻하지 않는다. 충전대 진입은 저전력 안내를 다시 표시할 수 있도록 기록을 초기화한다. 상태를 관측하지 못했다는 이유로 실행 종료를 선언하지 않는다.

현재 시작 admission·Task 중단 확인·연결 revision·claim/cancel 보호를 유지한다. 시작 버튼은 팀원의 원래 화면처럼 연결 전에도 표시되지만, 미연결 요청은 실행 소유자의 연결·세대 검사에서 차단한다. station listener 재연결/해제, PIN context 무효화, 사용자 실패 팝업과 toast 수명 보호는 의도적으로 유지했다.

소스 검증: 최신 앱 unit 393건/28개 suite, Release·격리 APK 빌드와 독립 명세 → 품질 검토를 통과했다. 최근 작업명 안내·설정 초기화·Session 화면 전환은 각각 실패 재현 후 반영했다. 제품 APK/QSSI 입력은 백업·플랫폼 서명·SHA 대조 후 갱신했다. 파일 이동이나 검증 개수를 실행 책임 이관·전체 완료율로 계산하지 않는다.

기기 검증: API 33 기기의 별도 verification 앱에서 네 묶음을 실행했다. 기존 전송·문구·Intent/창 계약 46건, 작업명 안내 2건, 설정 옵션 뷰 3건, 귀환/일시정지 뷰·클릭 4건이 각각 통과했다. 각 묶음은 해당 시점의 APK로 실행했으며, 최신 APK의 전체 55건을 한 번에 실행했다는 의미는 아니다. 귀환/일시정지 뷰는 기기에서 렌더링한 이미지도 확인했다. 일반 UID·설치 APK SHA를 대조했고 운영 DeviceAgent 0.258·EventAssetAgent 1.015는 유지했다. 실제 제품 Binder·Launcher 전환·로봇 귀환/중단·제품 부팅 성공은 미검증이다.

새로 점검한 남은 차이: Gradle app/src 기준 팀원 370개/우리 372개 중 원문 동일 347개, 내용 차이 23개, 팀원 전용 누락 0개다. 이 수치는 정적 파일 비교이며 의미 정합 완료를 뜻하지 않는다. 팀원 instrumentation 파일의 누락은 해소했지만 다음 기능 차이는 추가 검토·반영해야 한다.

전체 EventAsset 의미 정합, Launcher의 남은 차이, 새 제품 APK 설치, 전체 이미지 생성·자동부팅 및 목표 Domain Service 실행 책임 이관은 미완료다.

최신 EventAssetAgent 제품 APK/QSSI SHA-256: 85e59f8282742239a216d1422345647b7a8c7ebd5af1d659f8a964071adea646. 저장소 근거는 skix-eventasset-task-prompt-evidence-2026-10-02.json, skix-eventasset-config-init-evidence-2026-10-02.json, skix-eventasset-session-screen-evidence-2026-10-02.json, skix-eventasset-source-difference-inventory-2026-10-02.json이다. 기존 46건은 skix-eventasset-isolated-device-evidence-2026-10-02.json에 기록했다.

예약과 WSS 요청 검토

예약은 팀원 파일 9개 중 동일 5개와 의도적인 차이 4개를 대조했고 누락은 없다. 입력 8건·등록 15건·저장 9건의 실제 Java host 검사를 확인했다. 기존 예약 종류·시간 보호·저장 실패 처리와 등록 순서를 유지한다. TaskManager로 예약 실행 책임을 이관하거나 Android Alarm 실동작을 검증한 것은 아니다.

WSS 시작·중단·실행 식별자 3개 파일은 실제 JUnit 27건으로 검토했다. 중단 요청 소유권 검사 3건은 우리 코드에서 통과하고 팀원 코드에서는 실패해, 큐 접수 전 실행·다른 registry·서로 다른 owner를 차단하는 기존 보호를 유지했다. 시작 중인 요청 기록의 만료는 실제 실행 취소를 뜻하지 않고, 기록은 프로세스 재시작을 넘는 영속 상태가 아니다. 근거는 skix-schedule-peer-convergence-2026-10-01.json과 skix-wss-request-peer-convergence-2026-10-02.json이다.

당시 검토 후 현재 상태: EventAsset의 verification 설정·화면·호출 경로는 위의 기능별 근거로 검토·수정을 이어갔으며, DeviceAgent의 얼굴 인증 세션 보호까지 이어서 반영했다. 위에서 설명한 13개 팀원 전용 파일은 당시 탐색 목록이며, 현재 13쌍의 근거 연결 대상과 다른 집계다. 다음은 WSS 시작·중단 접수와 남은 전체 파일 차이의 정합 근거를 연결하는 일이다. 실제 서비스 연결·제품 동작과 실행 책임 이관은 별도 검증이 필요하다.

팀원 소스 검토 범위

DeviceAgent Java는 팀원 315개·우리 353개를 대조했으며 팀원 파일 누락은 없다. 팀원 기준으로 원문 동일 213개, 주석·서식 또는 공통 문자열 상수 치환 후 토큰 동일 28개, 동작 차이를 검토해야 하는 파일 74개로 분류했다. 우리 전용 파일은 38개다. 이 숫자는 검토 범위를 정한 목록이며 전체 의미 정합 완료율이 아니다. 일부 검토는 이미 완료했고, 남은 차이는 파일별 현재 SHA와 호출 경로를 기준으로 확인한다. AIDL·Gradle·리소스 전체 검토까지 포함하는 수치도 아니다.

청소·이동 정합에서 확인한 동작

청소·이동 관련 6개 파일의 전체 차이와 실제 호출 경로를 검토했고, 팀원 동작 누락은 발견하지 않았다. 예약 갱신·현재 예약 조회, 선택 구역과 AI 스캔 구역 ID 일치, 없는 목적지 거절, 콜백 무효화·실패 후 정리를 유지했다. 정상 청소·보고·상태 전달과 제품 정책의 실행 순서도 대조했다. 현재 정책의 세 반환값에 한해 접수 판단이 같으며 향후 모든 정책 결과를 보장하는 것은 아니다.

실제 BasicCleaningManager와 공통 시간 정책·예약 상태 및 청소 시간 계산을 실행한 host 48개(청소 47·예약 상태 1)가 통과했다. Android·MCU·관측 provider와 일부 transaction은 대역이다. 명령 handler 전체 실행, 실제 팬 정지·로봇 이동·새 이미지 부팅 검증과 구분한다. 이 검토에서는 제품 소스를 추가로 변경하지 않았으며 파일별 SHA를 저장했다. 전체 74개 차이의 정합 완료를 뜻하지 않는다.

Launcher2 · 팀원 변경 8개 묶음 반영

현재는 소스 정합·Release APK·QSSI 입력까지 반영했다. 기기 Launcher는 교체하지 않았으며 실제 UI·Binder·순찰·청소·MQTT 검증은 남아 있다.

기능 바뀐 동작 검증 범위
SafeCare 예약 owner에 한 번 접수. 사전·중복 실행 보고와 취소 시 다른 예약 해제 제거 실제 Java 메서드 host
외부 SafeCare 화면 Launcher 내부 화면 대신 시스템 top task 확인. 요청 권한과 제품 allowlist 함께 반영 helper host·권한 입력
SafeCare 상태 표시 worker에서 mode 조회. owner의 화면 완료 callback 호출·해제 제거. 복귀 화면·stale UI 차단 유지 실제 observer host
자가진단 이력 typed 이력 사용. 미전달은 표시 없음, 전달된 부족 이력은 18개 미검사 표시 실제 메서드·canonical 모델 host
청소 명령 결과 풍량·정지·일시정지·재개는 전달 여부 대신 접수 여부로 판단. 명시적 거절 보존 실제 메서드·canonical 요청/결과 host
배경화면 응답 응답 ID·결과 boolean 유지, message는 팀 계약대로 빈 문자열 helper host·IoT 응답 변환
SafeCare 팝업 정리 호출되지 않는 전용 팝업 5개 제거. Stay 안내·공통 팝업·화면 보호 유지 제거 계약 unit 1건·영향 검사 10건
예약 데이터 변환 typed SDK 데이터를 직접 매핑. Bundle 재변환 제거, 음수 거절·정수 범위·null 기본값 보호 유지 실제 변환 메서드·canonical 모델 host

각 묶음은 실패 재현 → 영향 검사 → Release 빌드 → 독립 명세·품질 검토를 거쳤다. 앞선 예약 데이터 변환 묶음은 영향 검사 16건 PASS·Release 빌드 31초다. Android 자료형·화면 상수·SafeCare 설정 판정은 host 대역을 사용했고, 기기 실행 증거로 해석하지 않는다. 기존 묶음 결과를 합산한 새 전체 검사 수치로 표현하지 않는다. 해당 이전 묶음의 Launcher2/QSSI 입력 SHA-256은 4faceaa171e72c480f9f3f64fc17aacd9fadafaf25807e42c632bf5d4183705b이다. 플랫폼 서명 대조·기존 입력 백업·원자적 교체 후 SHA 일치를 확인했다. 현재 반복 예약 ID 정합 뒤 Launcher2의 QSSI/별도 AOSP 후보 입력 SHA-256은 ebc9c3b7bc37fe00a38dc87acefbe93b8c3917b9792d2c85f558ae4f7d31a964이며 상단 최신 검증과 연결한다.

예약 휴일은 팀 SDK와 같은 전달 의미여서 유지했다. 지역 설정은 기존 ms-MY 처리를 보존했다. 파일 차이를 없애기 위한 일괄 치환은 하지 않는다. Launcher의 팀원 Java 파일 누락은 없으며, 구현 차이 12개 파일은 기존 보호 동작·SDK 사용 방식까지 대조하고 있다. 파일 존재와 전체 동작 정합 완료는 구분한다. DeviceAgent 시스템 제어는 팀원 동작이 기존 Gateway에 수용되어 있고, LLM의 공통 상수·숫자 상태 입력 지원도 보존한다. 나머지 DeviceAgent 소스의 의미 차이 검토는 계속 진행 중이다.

구조 해설과 확인 범위

현재 연결과 진행 상태 읽기

그림 읽는 순서: 위에서 아래로 시스템 앱·화면 → SDK API → Binder → 서버 책임 → 장치 연결을 읽는다. 서버 책임 안에서 왼쪽은 현재 제품 서비스, 오른쪽은 분리된 공통 Core Service다. 그림을 누르면 크게 볼 수 있다.

Launcher/Launcher2는 시스템 앱 소비층이다. HOME·설정·청소/이동 화면과 사용자 흐름을 담당하며 SkixXxxManager API를 소비한다. DeviceAgent의 로봇 실행 책임과 같은 구역에 묶지 않는다. ICT·Pairing·EventAsset의 화면도 소비층에 있다. ProductSystemUI는 SKIX 플랫폼의 공통 UI 제공 서비스다. TopBarService가 상태바를 그리고 SystemPopupService가 Binder API를 제공한다. 독립 시스템 APK로 배치하며 로봇 실행 Domain과 구분한다.

그림의 계층은 논리 책임이다. 하나의 APK가 UI·SDK 소비·Binder 서비스 역할을 함께 가질 수 있다. EventAsset의 화면과 SafeCare 실행 서비스, IoT의 요청 클라이언트와 MQTT/WSS 서비스는 각각 역할을 나눠 표시했다. 상단의 앱 API와 하단의 서버 Service도 같은 의미가 아니다.

짙은 테두리는 SDK/APK 입력 확인, 중간 테두리는 내부 구현, 옅은 점선 테두리는 제품 연결이 남은 영역이다. 배경색은 앱·Framework·장치·외부 시스템의 종류를 구분한다. 상태 문구와 함께 읽으며 전체 완료율로 해석하지 않는다.

DeviceAgent 내부 분리와 Framework Service 이관은 다르다. 현재 제품 경로는 SkixXxxManager → Binder → DeviceAgent MainApi/Composition → 기능별 CommandHandler → 제품 adapter/장치다. 이동·청소·일정·지도·설정 등의 기존 비즈니스 로직과 실행 책임은 상당 부분 DeviceAgent에 남아 있다. 공개 Manager API 분리와 내부 Handler 분리는 진행했지만, 모든 기능을 독립 Framework Service로 옮긴 상태는 아니다.

TaskManager는 오른쪽 공통 Framework 구현에 표시했다. TaskManagerService에는 접수·중복 방지·큐·기록·취소 의도·이력 관리가 있고, Control과 Domain에는 실행 허용·자원 점유·관측·완료 처리 계약이 있다. 이는 기존 DeviceAgent의 모든 명령이 TaskManager를 통과한다는 뜻이 아니다. TaskManagerEndpoint는 transport-neutral 진입부이고 공개 Android Binder 게시와 별개다. 기본 FrameworkHostComposition은 관측 구성으로 AMR 실행을 자동 활성화하지 않는다.

base/core는 공개 SDK 계약이며, 서버 로직은 base/services/core에 있다. 두 경로의 core를 구분해야 한다. DeviceAgent 업무를 기능별로 나누며 만든 공통 Service가 아래 구역에 놓여 있지만, 소스가 있다는 이유만으로 현재 제품 명령의 실행 owner가 모두 옮겨졌다고 표시하지 않는다.

서버 구역 실제 클래스 / 기능 현재 의미
Control State·Policy·Resource·Capability·Health ManagerService, lifecycle 공통 상태·허용 판단·자원·수명 관리
Execution TaskManagerService·EvidenceManagerService 실행 단위와 근거 관리; 모든 기존 명령의 자동 통과점은 아님
Domain 내부 기능 Amr·Cleaning·Llm·Iot·AirQuality·Power ManagerService 기능별 실행·정책·관측 구현; 제품 연결 범위는 각기 다름
Vision VisionManagerService·CameraSessionService 카메라 세션 연결; 제품 CameraBroker 경로와 함께 확인
공통 Service 구조 정리 생성자뿐인 Diagnostics·EventAsset·Mcu·Pairing·Security·System·Ui·Update 골격 8개 제거 실제 구현 7개 유지. 해당 제품 기능은 기존 제품 앱이 담당하며 삭제되지 않음
조립·진입 runtime composition·entrypoint, Android Host 공통 구현의 조립·수명 연결. 제품 탑재와 공개 Binder 연결은 별도

연결은 실선 호출·제어, 파란 점선 비동기 callback, 녹색 점선 관측 데이터, 회색 점선 미완료 연결로 구분한다. 소스 연결이 실기기 성공을 뜻하지 않는다. 공통 Host의 SDK 연결·탑재·시작 주체와 기존 실행 owner 이관은 함께 확인해야 한다.

소스 분리·정합 축 현재 코드 남은 부분
공개 API와 모델 base/core/{java,aidl}의 Manager·모델·callback 실제 caller·wire 의미 기준 잔여 계약 정합
기존 IPC 호환 base/compatibility/{java,aidl} 제품별 기존 명령·callback 의미 검증
DeviceAgent 내부 기능 분리 main/api/DeviceAgentCommandComposition 및 domain/*CommandHandler 제품 비즈니스 로직·수명 차이와 실행 책임 이관 판단
공통 Task 실행 제어 services/core/.../execution/task/TaskManagerService 및 Control·Domain 제품 채택·SDK Binder 연결·장치 adapter·완료/중단 증거
Android 연결과 수명 services/runtime의 SkixFrameworkHostService 제품 탑재·기동·권한·재연결·실제 실행 검증

구조 정리는 빈 미래 폴더·비실행 scaffold·정적 service locator·중복 AIDL 제거를 포함한다. SDK 입력 통일·APK 생성은 확인했지만 전체 이미지 생성·부팅·기기 동작은 남아 있다.

설치본과 새 빌드 구분: 기기의 DeviceAgent는 기존0.258이며 새0.256은 미설치다. CameraBroker1.0.17의 원격 상태 조회는 확인했지만, 새 이미지 입력이나 실제 촬영 성공은 확인하지 않았다.

기존 현재 연결 상세 그림

작업 구역 지금 어디까지 했나 다음 완료 조건
공개 SDK·계약 팀 typed API·callback 수용 진행. 일정 등록 결과와 기기 식별 callback 반영 남은 API 차이를 실제 caller·wire 의미로 분류
앱 소비 경로 Launcher/2·ICT·IoT·Pairing·EventAsset·SystemUI가 같은 SDK AAR 소비 7개 소비 앱 APK 빌드 확인. 제품별 조합·실제 이미지 입력 정합
DeviceAgent 실행 관측 실패 격리·검증 빌드 복구, composition·gateway·ICT 초기화 방어 정합. 순찰 완료 기록·앱 알림·PIN 실행 ID 보완, 최신 APK·이미지 입력 반영 남은 제품 caller 차이와 오류·재연결·종료 경로 확인
SafeCare EventAssetAgent가 실행·업로드·복구·저장 담당. DeviceAgent 중복 실행·timeout·cloud 알림 제거 CameraBroker 최신 이미지 입력 확보, 등록·프레임·원격 요청·중단/재시작 검증
ProductSystemUI SDK 계약 단일 소유. Launcher2의 13개 상태바를 정책 슬롯으로 바꾸고 표시를 SystemUI에 연결. Release APK·이미지 입력 정합 실제 부팅·권한·overlay·앱 전환 검증
공통 Framework Host 순수 서버·Host와 QSSI system_ext 입력 연결. 기기 bind 초기화·관측 IPC 일부 확인 제품 자동부팅·새DA producer·공개 SDK 연결·실행 책임 이관
폴더·의존성 빈 미래 폴더와 중복 scaffold 제거. 기존 6개 Soong 컴파일 경계 유지 예외·외부 소비자·실제 배치 관계 검토
이미지·보드 SystemUI·ICT·PairingAgent·DeviceAgent·IoT 4조합·Launcher2·EventAssetAgent 이미지 입력 갱신. 전체 image build/boot 미검증 대상 이미지 생성 → 부팅 → Binder → 기능·장애 검증

파일 수, 테스트 수, AAR 복사 수로 전체 완료율을 계산하지 않는다. 소스 구현 / APK 빌드 / 이미지 입력 / 이미지 생성 / 기기 동작을 각각 표시한다.

책임을 어디에 두었나

책임 현재 담당 코드 이번 정합 방향
앱이 사용하는 API와 공통 모델 base/core의 SkixXxxManager·model·계약 SDK 정본 한 곳. 팀 SDK의 필요한 계약 수용
기존 Bundle·IPC 번역 base/compatibility 기존 앱·장치 wire 호환 유지. 새 실행 owner를 만들지 않음
제품의 장치 기능 실행 DeviceAgent의 MainApi·composition·domain·gateway 팀 경계 주입을 수용하고 정적 접근·중복 전달 구조 정리
SafeCare 기능 실행 EventAssetAgent SDK는 요청·조회·callback 계약 제공. 실행·저장 책임 중복 금지
공통 팝업·상태바 표시 ProductSystemUI의 SystemPopupService·TopBarService 화면 구현은 APK, 사용 계약은 SDK
공통 task/control/domain 후보 base/services/core 기존 모듈 경계 유지. 실제 이관 전에는 현재 제품 owner와 구분
Android Binder·부팅·연결 구현 base/services/runtime·apps/SkixFrameworkService 선택적 Host. 정의만으로 제품 탑재 완료라고 표현하지 않음

SystemUI 사용 방식: 제품 앱 → SkixManager.systemUi() → IProductSystemUi Binder → ProductSystemUI APK. 팝업 요청·결과, 상태바 정책, 내비게이션 callback은 SDK로 사용한다. 청소·이동 등의 실행과 정책 판단은 해당 기능 owner에 남는다.

현재 SystemUI 서비스는 signature 권한으로 보호된다. SDK manifest가 호출 권한을 제공하며, 서비스와 호출 앱의 서명 조건도 맞아야 한다. 상태바는 부팅 receiver에서 시작하고, 팝업 서비스는 SDK가 명시적으로 bind한다. 현재 목표에는 별도 시스템 APK 방식이 적합하며 SystemServer 이관을 필수로 두지 않는다.

부팅 시 서비스 준비와 앱의 Manager 연결은 다르다

필수 서비스는 부팅 과정에서 준비하고, 앱은 자기 프로세스가 시작된 뒤 Manager로 연결해 Binder를 재사용한다. 일반 API 호출마다 bind/unbind하는 구조를 목표로 하지 않는다. 앞의 SystemUI 그림은 책임과 호출 관계를 나타낸 것이며, 모든 서비스가 부팅 때 준비됐다는 뜻은 아니다.

서비스 초기화와 앱별 연결 수명

서버는 언제 올라오고, Manager는 언제 연결하나

SkixXxxManager는 앱 안의 SDK 객체다. 반면 Domain Service는 기능의 상태·정책·실행을 소유하는 서버 모듈이다. Domain Service마다 Android Service와 bind가 하나씩 필요한 것은 아니다. 같은 Host 안의 모듈은 직접 호출하고, 프로세스 경계에만 Binder 연결을 둔다. 또한 system_server에서 등록하는 서비스와 독립 APK의 bound service는 시작·연결 방식이 다르므로 같은 그림 기호만으로 동일한 생명주기를 가정하지 않는다.

상주 수명은 서버 쪽에서 보장해야 한다. bind만으로 생성된 Android Service는 마지막 client가 해제되면 종료될 수 있다. 필수 APK 서비스는 제품에서 허용하는 시작 경로와 서비스 수명 정책을 갖추고, client의 bind 수명과 분리해야 한다. startService() 호출 하나만으로 자동 재시작·부팅 순서·Android 백그라운드 실행 조건까지 해결되는 것은 아니다. Android bound service 수명 설명을 기준으로 제품 정책을 구현하고 확인한다.

현재 소스에서 확인한 부분과 남은 작업

대상 현재 구현 목표·남은 작업
ProductSystemUI 상태바 BootReceiver가 overlay 권한을 확인한 뒤 TopBarService 시작 권한·제품 이미지 설정을 포함한 실제 자동 기동 확인
ProductSystemUI 팝업 API SkixSystemUiManager가 명시적으로 bind. 연결 중/연결됨 중복 bind 차단, 연결 재사용, release()에서 해제 필수 UI API의 부팅 준비·준비 상태와 상시 앱의 사전 연결 정책 확정
Framework Host onCreate()에서 공통 Runtime·관측 모듈 구성 후 host.start(). onDestroy()에서 종료 현재 Host manifest에 boot receiver 없음. 제품 부팅 시작 경로·준비 상태·재시작 정책 구현/검증 필요
Control·Task·Domain 공통 Runtime 내부 모듈 구조·일부 구현 있음 실제 제품 실행 owner 이관과 초기화 순서 확인. 모듈별 Android Service 일괄 생성 금지

앞으로의 완료 기준: 필수 서비스 목록과 시작 책임을 정하고 → 의존 순서대로 초기화 → 요청 가능 상태 확인 → 상시 앱 연결 → Binder 재사용 → 서버 재시작 시 재연결을 제품 이미지에서 확인한다. 준비 전 호출은 기능별 대기·거절·타임아웃 규칙을 정하며, 요청 접수를 장치 실행 완료로 해석하지 않는다. 큰 선택 기능은 필요 시 초기화해 부팅 시간과 메모리 사용을 관리한다.

코드 근거: ../systemui/.../BootReceiver.java, SystemPopupService.java, base/core/.../systemui/SkixSystemUiManager.java, base/services/runtime/.../SkixFrameworkHostService.java, apps/SkixFrameworkService/app/src/main/AndroidManifest.xml. 위 표는 소스 확인 결과이며 전체 이미지 부팅·최초 호출 지연·장애 복구가 실기기에서 검증됐다는 의미는 아니다.

실제 폴더와 설명

skix-framework/
├── ARCHITECTURE.md                 이름·책임·의존성 판단의 대표 규칙
└── base/
    ├── Android.bp                  순수 서버 모듈·계약의 Soong 정의
    ├── core/
    │   ├── java/                   공개 SDK·공통 모델·계약
    │   ├── aidl/                   SDK 소유 IPC 계약
    │   └── tests/src/              SDK·계약 JVM 테스트
    ├── compatibility/
    │   ├── java/                   기존 IPC·Bundle 번역
    │   └── aidl/                   기존 wire 호환 계약
    └── services/
        ├── core/java/.../server/
        │   ├── control/            공통 상태·정책·자원 제어
        │   ├── execution/          task 접수·실행·결과 처리
        │   ├── domain/             기능별 계약·상태·정책·실행
        │   ├── entrypoint/         typed 요청 검증과 위임
        │   └── runtime/            순수 구성요소 조립·수명 연결
        ├── runtime/java/           Android Service·Binder 구현
        └── tests/                  서버 JVM·instrumentation 테스트

apps/AirbotSdkProject/skix-framework-sdk/  SDK Gradle 빌드 모듈
apps/DeviceAgent/                         현재 장치 실행·제품 연결
apps/EventAssetAgent/                     SafeCare 실행·저장·화면
apps/SkixFrameworkService/                선택적 공통 Framework Host
../systemui/                             공통 시스템 화면 APK

core·control·execution·domain·entrypoint·runtime은 책임과 빌드 경계다. 기능을 추가할 때 모든 접미사와 하위 폴더를 만들라는 템플릿이 아니다.

정리한 부분 무엇이 달라졌나
README만 있던 base/api, adapters, services/systemserver, data/etc 제거. 미래 배치 조건은 ARCHITECTURE.md에 통합
DeviceAgent의 비실행 server scaffold 24개 삭제. 제품 연결 코드와 별도 서버 구현을 혼동하지 않게 정리
MainCommon 정적 service locator 직접 주입한 제품 owner·gateway로 대체 후 제거
Power·보정·관리 기능 중복 canonical manager로 소비 경로 정리. 기존 호환 API는 필요한 범위에서 유지
생성자뿐인 공통 domain Service 8개와 package marker Java 16개 제거. 실제 구현 7개와 제품 기능·공개 API 유지
SystemUI AIDL 사본 6개 동일 SDK 계약 사본 제거. SDK가 생성한 계약을 앱이 구현

폴더 이름만 바꾸는 것은 실행 책임 이관이 아니다. Manager는 클라이언트 API, Endpoint는 진입 검증, Port는 외부 행위 요구 계약, Adapter는 그 계약으로의 변환 구현이다. 새 타입은 별도 책임·수명·교체 지점이 있을 때만 추가한다.

이번에 소스로 연결한 주요 항목

기능 묶음 실제 변경 확인 범위
관리·설정 Launcher/2의 maintenance·상태·지도·update 호출을 해당 manager로 연결 관련 JVM·APK 빌드 이력 있음
IoT·원격 요청 공유 SDK gateway·typed callback·durable ingress. MQTT·지도·AQM 진입, Wi-Fi·Binder 수명, WSS 응답·typed publish·업무 준비 상태 정합 진입부 host·JVM85개·제품 Release 4종 확인; 실제 broker/Binder/Wi-Fi·기기 미검증
DeviceAgent runtime·firmware·map·status snapshot·service callback의 owner 주입. 기존 명령과 장치 실행 유지 관련 JVM·APK 빌드 이력 있음; 실제 장치 실행 미검증
일정 등록 팀 ScheduleRegistrationResult·registerOnDeviceSchedule() 수용 SDK unit·AAR·API 확인
기기 식별 DeviceAgent의 onProvisioningDeviceIdentity → SDK DeviceIdentityListener 연결 값·중복·해제·예외·raw callback·재연결 generation host 회귀
Launcher2 상태바 팀의 슬롯·Coordinator 수용. 자체 위젯과 화면별 상태 구독 제거, 기존 showType·좌표/너비 유지(높이 계약38dp) 소스 회귀3개·실제 Coordinator host12동작·JVM40개·Release APK 확인; 실제 UI 미검증
SystemUI 공통 SDK 계약으로 popup/topbar 구현. 새 SDK로 Release APK·이미지 입력 갱신 APK build·서명·SHA 확인; boot/Binder/overlay 미검증

남은 API 차이는 파일 이름만으로 복사하지 않는다. 예를 들어 팀 Manage에 있는 상태 callback은 우리 SkixDeviceStateManager, 보정·시뮬레이션은 SkixMaintenanceManager, 클라우드 연결 조회는 SkixCloudBridgeManager와 책임을 대조한다. MR8 이후의 선택적 B2B 조회처럼 현재 MR7 제품 명령과 caller가 확인되지 않은 항목은 별도 미결 항목으로 둔다.

최신 바이너리와 검증 기준

추가 정합: Provisioning 등록 상태·BLE serial 반환형을 팀 typed 계약으로 맞췄다. 새 SDK(d113cb90…)를 정본+7개 소비 앱에 동기화했고, 7앱 Release·IoT 4변형 포함 10APK의 platform 서명을 확인했다. Make가 선택하는 이미지 입력9개도 백업 후 교체했다. 아래 이전 SHA 기록은 해당 시점의 검증 이력이다.

기기 테스트 승인·부분 검증: 192.168.10.5:5555에서 Host 초기화와 관측 Gateway의 실제 Binder 경로를 확인했다. 기존 DeviceAgent는 유지했다. 상세 범위는 위 기기 결과를 따르며 전체 이미지 생성·제품 자동부팅 증거는 아니다.

대상 최신 확인 상태
비교 기준 local 4d9b1a57 + dirty; team 164654fc 비교 전용; SystemUI 85693da + dirty
SDK v55 / 2.0.2 · 정본1 + consumer7 = AAR8개 동일 d113 SHA
SDK 소스 검증 JVM252개 / 87 suites · 실패·오류·skip0 · Release AAR 빌드 PASS
AAR 배포 불일치 RED8 → identity/version tests4 + checksum PASS · 이전 AAR8개와 manifest 백업
소비 앱 빌드 ICT·Pairing·Launcher·Launcher2·EventAsset·IoT·ProductSystemUI 7앱 PASS
APK와 서명 IoT4변형 포함 APK10개 · platform signer 일치
최신 이미지 입력 소비 앱 APK9개·최신 Launcher2 4faceaa1…·DeviceAgent 2b80cd3c…·Host Release e947… · Make 선택/SHA/서명/기존 입력 backup 확인
DeviceAgent 최신 QSSI 입력2b80cd3c… · 기기 설치본0.258 유지, 새0.256 미설치 · SDK 소비 AAR 변경 대상 아님
실기기 Host 계약19·bind초기화1·권한거절1 확인; 임시 systemUID remote 관측 정상3/거절3 확인·앱 제거
CameraBroker 기기 설치본1.0.17 remote 상태 조회 PASS · 임시 앱 제거·기존 Vision 연결 유지 · 최신 이미지 입력 미확인
남은 검증 전체 이미지·제품 자동부팅 · 새DA producer·공개 SDK/overlay · 실센서·기능 완료/중단

이전 namespace SDK AAR SHA-256: d113cb9043a61601a249d79a0efc0e6613835a57b2f57dc864a3d74b7f063df8. 새 정본은 상단에 표시했다.

최신 ProductSystemUI APK / QSSI 입력 SHA-256: fd7aa994a70bf9c8acd331152d63b11244f4774ee0270e06f287deb929a95590.

이 반환형 정합은 JVM descriptor 변경을 포함한다. 기존 SDK로 컴파일한 앱 바이너리를 그대로 사용하지 않고 모든 소비 앱을 새 AAR로 재빌드했다. 이번 검증 근거는 skix-provisioning-result-evidence-20261001.json, skix-sdk-d113-consumer-apk-evidence-20261001.json, skix-sdk-d113-image-evidence-20261001.json이다.

이전 묶음의 검증 이력

아래 SHA와 테스트 수는 이전 정합 시점의 기록이다. 현재 입력은 위 표와 d113 SHA를 따른다.

이전 SDK AAR SHA-256: 79c6dd0711309340093fbf4680a137c6e4bb3b461802eafa87fc925f5d98b926.

이전 SystemUI APK / QSSI prebuilt SHA-256: 3d2bdf8842c81406135ba86da1a79e20069bf7fbc754bd5f938214973faae84a.

6개 앱 APK 묶음은 APK 생성·서명·권한 검사이며 새 단위 테스트나 설치·실행 검증을 뜻하지 않는다. 이후 이미지 입력 정합에서 ICT·PairingAgent·DeviceAgent를 갱신했다. DeviceAgent Release build도 통과했으며 R8의 선택적 annotation(Immutable·GuardedBy) 경고는 남아 있다. IoT dev/opr·mal_dev/mal_opr Release 네 변형의 이미지 입력까지 정합했다. Launcher2 카메라/HY 구 APK 분리는 최신 0.285 단일 APK와 runtime property 계약으로 통합했다. 실제 제품 옵션 값·화면은 미검증이며, EventAssetAgent 1.011 제품 포함 조건과 이미지 입력도 연결했다. 녹화 Binder 권한을 보완한 EventAssetAgent Release(28s)와 호출 권한을 명시한 DeviceAgent Release(19s)를 이미지 입력에 반영했다. 기존 APK·Make 입력은 별도 백업했다. EventAssetAgent의 카메라 경로는 외부 CameraBroker 서비스도 필요하며, 현재 확인한 QSSI 설정 범위에서는 해당 서비스 탑재 선언을 찾지 못했다. 전체 이미지 부재를 뜻하지 않는다.

AQM 보고 경로는 팀 코드와 동일하게 nullable 측정값 생성 결과를 확인한 뒤 전달한다. 사용할 수 없으면 명시 로그를 남기고 중단하며, PM·습도·온도·VOC/NOx·포름알데히드·CO2 및 등록 센서 정보를 유지한다. 실제 함수 host 검사는 JSON·장치 경계를 double로 대체했으므로 SDK wire·broker·실기기 전달의 증거는 아니다. CmdTopic의 남은 팀 차이 중 온디바이스 지도와 배경 변경 응답은 현재 호출 경로 때문에 유지한다. 팀 WifiMonitor의 중복 등록 방지와 등록 실패 복구를 반영했다. 종료 시 네트워크 콜백·대기 메시지·주기 작업을 정리하고, 해제 오류가 나도 finally에서 작업 정리를 수행한다. 종료 후 진입한 콜백이 새 감시 작업을 시작하지 않는 것을 host 검사로 확인했다. Android·예약 실행·socket 경계를 대체한 검사이며, 이미 진행 중인 콜백/네트워크 호출의 강제 취소와 실제 Wi-Fi 동작은 미검증이다.

IotAgent의 기존 Binder unregisterCallback() 자기 호출로 발생하는 StackOverflowError를 host에서 재현하고 제거했다. 팀의 RemoteCallbackList를 사용해 여러 클라이언트의 등록·개별 해제와 서비스 종료 시 목록 정리를 연결했다. 이벤트 콜백과 MQTT·SafeCare 업무 경로는 그대로 유지한다. 실제 메서드와 종료 함수를 실행하는 host 검사에서 등록/해제/정리를 확인했지만 Android callback 목록은 double이므로 실제 Binder death·IPC 검증은 별도로 필요하다.

호출되지 않는 securityMode 즉시 응답 helper와 전역 응답 주소·요청 ID를 팀 구조에 맞춰 제거했다. 원격 요청은 SafeCare inbox에 보관한 뒤 worker가 요청별 replyTo와 처리 결과로 응답한다. 상태 이벤트·PIN·업로드 경로는 유지한다. 구조 회귀 검사 7개·JVM 85개와 제품 Release 4종을 확인했으며, 실제 broker·Binder·기기 동작 검증은 별도로 남아 있다.

오류 보고와 배경 변경 응답은 Bundle 진입도 유지하되 typed 모델로 변환한 뒤 같은 MQTT 조립 함수를 사용한다. 오류 코드는 E03일 때만 상세 메시지를 포함하며, 배경 응답의 요청별 주소·상관 ID·결과·메시지를 유지한다. 실제 함수 host 검사로 기본값·null 입력·전송 예외 격리를 확인했으며 Android Bundle·MQTT·Binder는 검증하지 않았다.

IoT 업무 진입 10곳에 팀의 준비 상태 검사를 반영했다. 검사 시 Framework 장치 연결이 없으면 명시 로그를 남기고 전달을 건너뛴다. 설정 적용 결과의 거절·미전달도 로그로 확인할 수 있게 했다. gateway 연결 전 listener 등록과 청소 문자열·생략 필드는 유지한다. 실제 함수 host 검사로 전달/차단과 진단을 확인했지만 실제 Binder 연결·물리 실행 검증은 별도로 남아 있다.

일정의 청소 옵션은 기존 지원을 유지한다. 옵션 일부만 들어올 때 없는 청소·풍량 코드를 변환하다 발생하던 NullPointerException을 재현하고 수정했다. 없는 필드는 생략하고 명시된 false는 유지한다. 실제 일정 변환 클래스·SDK 모델·상태 코드 매핑과 host org.json 검사에서 옵션 8조합·요일·작업 좌표·매개변수·손상 일정 전체 거절을 확인했다. Android JSON·MQTT/Binder·기기 일정 실행은 미검증이다.

서버 지도 처리의 중복 parser를 제거하고 ServerMapSnapshotDecoder에 연결했다. 방 순서·좌표·배정·스캔·보안 위치와 optional 기본값을 검증했으며, 필수 구조나 숫자가 잘못된 지도는 전체를 거절한다. 기존 숫자 오류를 0으로 대체하던 동작보다 엄격하다. 온디바이스 지도 응답·복호화·metadata reload는 그대로 유지했다. 실제 지도 다운로드·Binder 전달·기기 지도 변경은 아직 검증하지 않았다.

SafeCare의 typed 서비스와 기존 녹화 서비스는 모두 CONTROL_SAFECARE signature 권한으로 보호한다. SDK 소비 앱과 DeviceAgent의 호출 권한 및 현재 DeviceAgent·IoT·EventAsset APK의 플랫폼 서명을 확인했다. 서비스·DeviceAgent·SDK 권한 회귀 3개와 제품 활성/비활성 Make 선택을 검증했다. 실제 Binder 연결·촬영·중단 성공은 아직 확인하지 않았다. 이전 권한 보완 빌드의 EventAsset APK SHA는 af9825ccf0725526f7a69688a3201351a9b65823612ea06b5e608549d5614890, DeviceAgent는 ea13491cce74830171018beea43dbb625412c78cfafac57dafd0a9f70f304c91이다. 앞선 6개 앱 APK 묶음의 EventAsset SHA는 이번 재빌드 전 이력이다.

Launcher2의 옵션 누락·property 조회 실패는 현재 팀/우리 동일 소스의 기본값 true를 따른다. 구 HY APK는 property 이름 문자열을 true와 비교해 camera/mic를 항상 끄는 구현이었다. 이 차이는 실제 제품 옵션·UI 확인 시 검증해야 한다. Host 검사는 Android property stub을 사용한 소스 검증이며 실기기 검증이 아니다.

Launcher2 상태바는 이제 SDK의 화면 정책을 통해 ProductSystemUI에 연결한다. 13개 화면 슬롯의 showType·좌표·너비를 유지하고 높이는 팀 계약의 38dp로 맞췄다. Launcher의 자체 상태 아이콘·시간·네트워크 구독을 제거했으며, SystemUI가 없을 때 자체 표시로 대체하지 않는다. 화면 제목·뒤로가기·기존 터치 처리는 유지한다. 실제 Coordinator host 검사는 가려진 Fragment·복귀·부모 슬롯·미측정 대기·종료 해제를 포함하지만 Android view/Fragment doubles이므로 실제 화면 검증이 아니다. Launcher2 JVM40개/21suites와 Release 빌드(3m4s)를 확인하고 이미지 입력 APK를 다시 갱신했다. 앞선 Launcher2 APK SHA는 이번 상태바 정합 전 이력이다. 이번 검증 근거는 skix-launcher2-topbar-integration-evidence-20261001.json이다.

배포 목록은 tools/artifacts/framework-sdk-manifest.json, source/consumer 검사 근거는 tools/tests/test_framework_sdk_artifact_identity.py에 있다. 미커밋 소스를 포함한 개발 기준이며, 정식 제품 release 승인이나 전체 정합 완료를 뜻하지 않는다.

다음 작업 — 순서와 종료 조건

  1. 남은 제품 동작 차이 정리: 실제 caller·명령·callback·재연결/종료 동작으로 수용·유지·보류를 결정한다. 사용하지 않는 별칭을 추가하거나 안전 장치를 팀판으로 되돌리지 않는다.
  2. APK와 이미지 입력 통합: 새 SDK 기준 7개 소비 앱 APK 빌드를 확인했다. Launcher2 입력을 최신 APK로 맞췄으며, EventAssetAgent 포함 조건도 연결했으며, 설치된 CameraBroker의 상태조회 IPC는 확인했고, 다음은 정본 소스·배포 APK와 QSSI 입력을 확보한 뒤 새 이미지의 기동·등록·프레임 경로를 검증한다. Launcher/Launcher2는 같은 앱 ID이므로 제품 구성에 맞춰 하나를 선택한다. 추가 국가·제품 변형은 해당 요구에 맞춰 검증한다.
  3. 제품 이미지 검증: Host의 source/prebuilt 선택과 system_ext 입력은 연결했다. 전체 이미지 생성·부팅에서 현행 producer bind와 권한·재연결을 확인한다. 목표 SystemServer Root와 공개 SDK 연결은 별도 미완이다.
  4. 실제 실행 검증: 이미지 생성·부팅 → Binder 연결 → 앱 전환·프로세스 재시작 → 장치 기능·중단·장애 복구를 확인한다.
  5. Blueprint 승인: 현재 제품 근거와 요구를 연결해 구조·단일 owner·의존성·R&R을 리뷰한다. 승인되지 않은 초안을 구현 완료로 취급하지 않는다.

AMRService는 현재 직접 IAMR 연결과 local의 연결·callback 수명 보호를 유지한다. 현재 팀 최종 소스에서 되돌린 중간 AMR owner 실험은 가져오지 않는다. 실제 movement completion, 외부 IWssControl 소비자, Framework Host 이미지 입력은 연결했고, 실제 제품 부팅·SDK root 연결은 별도 검증 대상으로 남는다.

이전 기록과 달라진 점

2026-09-30 문서는 일정 등록 result의 수용을 보류하고, SDK 후보와 consumer AAR이 다르며 ICT 기본 입력도 미정합이라고 기록했다. 이후 소스 정합에서 일정 등록 API를 수용했고 ICT 입력을 SDK AAR로 통일했으며, 2026-10-01 정본과 7개 consumer를 같은 AAR로 맞췄다. 과거 SHA·파일 수·테스트 수는 당시 이력이며 위 최신 표를 대체하지 않는다.

이 페이지는 현재 구조와 다음 작업을 보는 대표 요약이다. 세부 코드 변경·검증 이력은 저장소 docs/refactor/skix-next-session.md, skix-branch-convergence-plan-2026-09-22.md, skix-work-cost.md를 따른다. 총 토큰 절감률은 동등 baseline과 전체 telemetry가 없어 미측정이다.

Connections

초기화·CameraBroker 검증 근거

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