Repository navigation
ENDING_SCREEN DATA_SOURCES
작성일: 2026-10-01 · 상태: §2 A·B 구현 완료 (2026-10-02, 마이그레이션 138) — 토픽 명세는
MQTT_SCHEMA-ORCHESTRATION_SERVER§5-2. §1 차량 3필드는 147 로 됐다(2026-10-03). §2 C·D · §4 결정 사항은 아직이다. 화면 ↔ 필드 매핑은 §0-1.입력 자료: 기획
엔딩 가이드_261001.pptx(14장). 요청은 둘이다 — ① 세션 사용자 정보에 차량 3필드 추가(견적·수소충전·출고 확인 화면의 차종 불일치 해소), ② 세션 종료 시 보여 줄 엔딩 화면 5종.이 문서는 그 화면들이 요구하는 값을 지금 서버가 줄 수 있는지만 따진 것이다. 코드는
orchestration-server26313db기준으로 읽었고, 추측한 것은 적지 않았다.
| 항목 | 어디에 |
|---|---|
엔딩 토픽 orchestration/{sessionId}/ending (retained, 종료 시 1회) |
internal/mqttx/session_ending.go, 명세 §5-2
|
| §2-A 전부 — 이름·동반자·세션 시간·성향 칩(아이)·여정·AI 배려·태스크 집계·외형·표정·구매 | 같은 파일. /context 빌더 재사용 |
| §2-B 전부 — 발화 장소·차 모드 구분·자기소개 저장·세션별 명령 로그 쿼리 | 마이그레이션 138 (ai_messages.source·location_id) |
발행 순서 — ended_at → 엔딩 → /context 삭제 |
internal/mqttx/end_session.go 두 경로 모두 |
| 어드민 미리보기·재발행 |
GET/POST /api/admin/users/:id/ending[/publish], 세션 상세 "엔딩" 탭 |
| 차량 마스터 — 브랜드·모델·트림·이미지·설명(메타정보) (2026-10-02) | 마이그레이션 139·140 vehicles, GET/POST/PUT/DELETE /api/admin/vehicles, 백오피스 "스토어와 미래차 › 차량". 영상·키/값 메타·표시 순서는 쓰지 않기로 함 |
엔딩 멘트 ending_line (2026-10-02) |
145. 앱 설정 ending_line_prompt, 종료 직후 데이터 발행 → LLM 멘트 오면 같은 토픽에 채워 2차 발행 (§5-2) |
추천 차 지정 — 견적 브리핑 LLM 이 {{vehicle_list}} 를 읽고 한 대 고름 → user_vehicles(role=recommended)
|
140. 대시보드 quote_briefing·vehicle_ready 태스크에 vehicle 필드, 엔딩 vehicles, 어드민 GET/PUT/DELETE /api/admin/users/:id/vehicles/:role
|
차량 3필드 자동 채움 + /me (2026-10-03, 147) |
current = 세션 생성 시 앱 설정 session_current_vehicle_id(기본 넥쏘, 비우면 없음) · recommended 확정 = 견적 브리핑 태스크 완료(confirmed_at) · delivered = 출고 준비(vehicle_ready) 태스크 완료 시 추천 차 복사. 셋 다 orchestration/{sessionId}/me 의 vehicles 로 내려가고 바뀌면 재발행 (§7) |
| 확정·출고 이벤트 (2026-10-03, 147) | 새 토픽 없이 기존 신호에 걸었다 — 견적 "주문하기" = 견적 브리핑 태스크 task/complete, 18:15 출고 확인 = 출고 준비 태스크 task/complete. FE 가 이미 보내는 것. 어드민 강제 완료도 같은 길 |
| AI 가 오늘 한 말 전체 (2026-10-03, 147) |
user_narratives — ai/summary 발행마다 저장. 엔딩 narratives[] 가 전체(장소·시각 포함)를 싣고 재발행본에도 그대로 (§5-2) |
| 미래차 주행 이력 (2026-10-03, 147) |
user_vehicle_steps — future-car/response route/state 수신마다 저장. 엔딩 vehicle_history[]
|
| # | 항목 | 지금 상태 | 막힌 이유 / 필요한 것 |
|---|---|---|---|
| 1 |
vehicle.current / recommended / delivered |
셋 다 코드가 채우고 /me 에 실린다 |
남은 것은 추천 규칙표(2번) — 지금 추천은 LLM 이 고른다 |
| 2 | 추천 규칙표 (아이→카니발 / 부모님→팰리세이드 / 반려동물·캠핑→싼타페·EV9 / 없으면 아이오닉6) | 입력값 중 자녀만 컬럼. 부모님 동거·반려동물은 users.description 자유 텍스트 |
§4-1 결정 필요 — 설문 문항 고정 + 컬럼 추가(권함) / LLM 추출 / 설문 키 고정 |
| 3 |
|
견적 브리핑·출고 준비 태스크의 task/complete 에 걸었다 |
FE 는 "주문하기"/"출고 확인" 버튼이 해당 태스크를 완료 처리하기만 하면 된다. 별도 토픽이 꼭 필요하면 그때 추가 |
| 4 |
|
vehicles.image_url / video_url 에 어드민이 올린다 |
남은 것은 FE 가 vehicle.*.model 대신 vehicles.id 로 에셋을 찾게 하는 것 — 1번과 같이 |
| 5 |
|
앱 설정 ending_line_prompt, 2단계 발행(데이터 먼저 → 멘트 채워 재발행) |
길이는 20자 요구·30자 상한. 프롬프트 손보기는 앱 설정에서 |
| 6 |
연도별 카드 (1·2·3년 후 — 이벤트·상황·AI 행동·모드 5종, 처음 만난 날은 moments[]) |
✅ 2026-10-09 — 엔딩 years[] (LLM 생성, 158·159), 배경은 years[].theme_key. 모드는 백오피스 "케어 모드"(care_modes, theme_key·description_prompt) |
완료 — LLM 생성으로 결정. 모드는 어드민 관리 |
| 7 | N년 후 누적 km·날짜 더미 | 없음 | §4-4 결정 필요 — 생성 규칙을 기획이 줘야 함 |
| 8 |
|
user_narratives, 엔딩 narratives[] 전체 |
147 이전 세션은 소급 안 됨(메모리 최근 5개) |
| 9 |
|
user_vehicle_steps, 엔딩 vehicle_history[]
|
147 이전 세션은 소급 안 됨 |
| 10 | 성향 칩 부모님·반려동물 | ✅ 2026-10-09 — 세션 생성 때 LLM 판별(157) → traits[] 에 lives_with_parents·has_pet
|
완료 (추천 규칙표 2번은 아직 — 판별값은 user_traits 에 있어 규칙표 입력으로 쓸 수 있다) |
138 이전에 만들어진 세션은 소급되지 않는다 — 발화가
source=chat·장소 없음으로 보이고 자기소개는 없다.
남은 것은 전부 기획 결정이 필요한 것이다 — 2(추천 규칙표 입력값)·10(성향 칩)은 §4-1, 6(연도별 카드)은 §4-3, 7(km 더미)은 §4-4. 서버만으로 할 수 있는 것은 2026-10-03 기준 다 했다. 4번의 FE 쪽(에셋을 vehicles.id 로 찾기)은 FE 몫.
"엔딩 가이드_261001.pptx" 의 화면 번호(슬라이드에 찍힌 ①②③…)를 orchestration/{sessionId}/ending 페이로드 필드에 하나씩 붙였다.
필드 타입·설명은 §5-2. 시각은 전부 RFC3339 KST 라 화면 표기(2026.09.30 22:16, 13m 05s)는 FE 가 포맷한다.
| # | 화면 요소 | 예시 | 필드 | 비고 |
|---|---|---|---|---|
| ① | 사용자 이름 · AI 페르소나 | 여행자님 · 똑똑한 비서 |
user.username · companion.title
|
아바타 companion.avatar_url, 사용자 사진 user.user_images[type=default]
|
| — | 성향 칩 (우상단) |
부모님과 아이 반려동물
|
traits[] |
화면 순서로 온다: lives_with_parents→부모님과, has_children→아이, has_pet→반려동물. 아이는 DB 컬럼, 나머지는 세션 생성 때 LLM 이 메타 답 + 자기소개로 판별(157) |
| ② | 처음 만난 날 · 시각 | 2026.09.30 22:16 · 처음 만난 날 |
session.started_at |
하단 SINCE 2026.09.30 은 session.since_date (이미 YYYY.MM.DD) |
| ③ | TOGETHER 총 세션 시간 | 13m 05s |
session.duration_sec |
785 → 13m 05s. session.ended_at 도 있음 |
| ④ | VEHICLE 차량 계보 |
넥쏘 → 투싼, 투싼 · 오늘 출고
|
vehicles.current.model → vehicles.delivered.model
|
delivered 없으면 vehicles.recommended.model (출고 차 = 추천 차). "오늘 출고" 날짜는 vehicles.delivered.set_at. 이미지 vehicles.<role>.image_url, 브랜드 brand. 오늘의 0 km 는 더미 — 서버가 거리를 모른다. 굳이 쓰려면 vehicle_history[] 길이(스텝 수) |
| ⑤ | 발화 3줄 [자리] "말한 내용"
|
차에서 "조용히", 처음에 "부모님과 살아요"
|
moments[] — place + text
|
2026-10-09 부터 토픽 utterances[] 는 차에서 한 말만 온다 — 전체 발화는 moments[]. 최근 3개 = 배열 뒤에서 3개(시간순). 원문 자리는 source(intro|car|chat)·location_name
|
| ⑥ |
→ AI 가 한 배려 한 줄 |
집에 오니 로봇이 말없이 공기만 바꿔뒀어요 |
moments[] — response
|
2026-10-09 부터 care[] 는 토픽에서 빠졌다. 그 말의 규칙 짝 원재료는 moments[].care[]
|
| ⑤+⑥ | 발화 ↔ 배려 짝 | 한 줄에 "조용히" → 공기만 바꿔뒀어요
|
moments[] — place + text → response (2026-10-09) |
서버가 짝을 맞춘다. 최근 발화 최대 6개(시간순, 화면은 뒤 3개)마다 response 한 문장. LLM 이 없거나 실패하면 규칙 짝(response_source: "rule" — 그 말 뒤 ~ 다음 말 전까지 한 일의 첫 문장), 보통은 발행 전에 LLM 이 발화·해 준 일 전체를 보고 쓴 문장("llm", 앱 설정 ending_moment_prompt)이 들어간다 — 엔딩은 LLM 보강 뒤 한 번만 발행된다(2026-10-10). 맞는 게 없으면 "". 규칙 짝 원재료는 moments[].care[]. |
| # | 화면 요소 | 예시 | 필드 | 비고 |
|---|---|---|---|---|
| ① | N YEARS LATER |
3 YEARS LATER |
없음 (FE 고정 1→2→3) | — |
| ② | 누적 km · 차종 · n년
|
24,318 km, 투싼 · 3년
|
km: 없음 (§4-4 더미 규칙 대기) · 차종: vehicles.delivered.model
|
— |
| ③ |
n years · nnnn일째
|
3 years, 1,095일째
|
없음 (FE: n×365) |
SINCE 는 session.since_date
|
| # | 화면 요소 | 예시 | 필드 | 비고 |
|---|---|---|---|---|
| ① | 1 YEAR LATER |
없음 (FE 고정) | ||
| ② | 일상 이벤트 제목 | 첫 가족 여행 |
없음 — §4-3 결정 대기 (어드민 템플릿 권함 vs LLM) | 성향 칩(traits[])·차(vehicles)·발화(utterances)가 입력이 될 수 있다 |
| ③ | 상황 | 뒷좌석에 아이가 잠든 저녁 |
없음 (②와 같이) | |
| ④ | AI 가 한 행동 | 잠들면 음악을 낮춰요. |
years[].action (2026-10-09) |
오늘 한 일(서버 안의 배려 기록)을 LLM 이 이어서 쓴다 |
| ⑤ | 모드(배경색) 5종 | 즐거운 순간 / 우울함 / 긴장 / 응원 / 케어 | 없음 (②와 같이) | 가장 가까운 기존 값은 emotions.dominant(관람객 표정 최빈값 joy|surprise|neutral|anger) — 모드와 1:1 은 아니다 |
| 화면 요소 | 필드 |
|---|---|
날짜 · 우리의 첫 번째 하루 · 시각
|
session.since_date · session.ended_at
|
그날 차에서 처음 하신 말 — "조용히" |
utterances[0].text — 토픽 utterances[] 는 차에서 한 말(source == "car")만 온다 (2026-10-09) |
AI 일기에서 오늘 다시 보기 |
narratives[] (AI 가 오늘 한 말 전체, 시간순, 147) |
| # | 화면 요소 | 필드 | 비고 |
|---|---|---|---|
| ① | 엔딩 멘트 20자 | ending_line |
2차 발행으로 온다 — 종료 직후 1차는 "", LLM 이 쓰면 같은 토픽(retained)에 채워 다시. FE 는 ending_line 이 비어 있으면 기다렸다가 바뀌면 그린다. 프롬프트는 앱 설정 ending_line_prompt
|
현재 차 / 추천 차와 이유 / 출고 상태 세 줄 → orchestration/{sessionId}/me 의 vehicles.current · vehicles.recommended(reason, confirmed_at=주문하기 확정) · vehicles.delivered(§7, 147). 차량이 바뀌면 재발행.
task_counts(완료/건너뜀/진행/대기 수) · journey[](장소 순서·태스크 결과·이벤트 처리) · emotions · vehicle(미래차 마지막 스텝) · intro_message(자기소개 원문) · user.description/gender. 연도별 카드나 멘트를 만들 때 재료로 쓰라고 넣어 뒀다. (care[]·device_commands[]·device_log_counts·purchases[] 는 2026-10-09 토픽에서 뺐고, utterances[] 는 차에서 한 말만 남겼다.)
기획 지적: 지금 사용자 정보에 "현재 차"와 "추천 차"가 없어 화면마다 다른 차가 뜬다. 견적 화면 히어로는 아반떼, 가상 시승은 EV9, 출고 확인은 현대 인테리어에 기아 영상이다. 수소 충전 화면의 넥쏘는 출처가 없다.
요구값:
| 필드 | 내용 |
|---|---|
vehicle.current |
시나리오 상수 넥쏘 (08:00 수소 충전 태스크가 있어 설문으로 고르지 않음) |
vehicle.recommended |
{model, trim, reason, at} |
vehicle.delivered |
{model, at}, model 은 recommended 와 동일 |
추천 규칙 (LLM 아님, 코드):
| 조건 | 추천 |
|---|---|
| 아이 있음 | 카니발 |
| 부모님 동거 | 팰리세이드 |
| 반려동물·캠핑 | 싼타페 또는 EV9 |
| 해당 없음 | 아이오닉 6 |
조합 시 우선순위는 아이 > 부모님 > 반려동물. 결과가 current 와 같으면 다음 후보로.
받아야 할 이벤트 둘: 견적 화면 "주문하기" → recommended 확정, 18:15 출고 확인 → delivered.
users 테이블에 차량 필드가 없다. 저장소 전체에서 car_model·vehicle_model 류 식별자도 없다.
세션에 붙는 "차" 비슷한 데이터는 태스크 단위 LLM 캐시 둘뿐이고(user_task_vehicle_ready,
user_task_vehicle_options) 차종·이미지가 들어 있지 않다.
사용자 정보는 orchestration/{sessionId}/me (retained) 로 나간다. 실리는 값은 이름, 성별,
자녀 유무, AI 동반자, 사용자 사진, 현재 표정이다. 차량 자리는 없다.
막히는 것 — 추천 규칙의 입력값이 모자란다. 세 조건 중 자녀 유무만 제대로 된 컬럼이고
(users.has_children), 부모님 동거와 반려동물·캠핑은 설문 답이 users.description 자유
텍스트에 섞여 들어갈 뿐이다. 설문 문항 테이블(user_meta_prompts.effect)이 has_children
하나만 허용하도록 CHECK 제약이 걸려 있다.
선택지 셋:
-
제약을 풀고 컬럼을 더 둔다 (
lives_with_parents,has_pet등) ← 권함 - 자유 텍스트를 LLM 으로 뽑는다 ← 기획이 "LLM 아님, 코드"라고 못박음
- 설문 문항을 고정 키로 바꾼다
1번을 하려면 "설문 문항 3개는 고정"이라는 합의가 필요하다.
차종별 에셋도 없다. 추천 결과가 카니발·팰리세이드·싼타페·EV9·아이오닉6 중 하나인데, 그 차종의 이미지·영상을 어디에 두는지가 정해져 있지 않다. 기획이 "현대/기아 별로 영상이 분리되어야 할 것 같다"고 적은 것이 이 문제다.
| 화면 | 담기는 것 |
|---|---|
| 첫 화면 | 이름·페르소나, 성향 칩, 처음 만난 날·시각, VEHICLE {km} + 차종·출고, 현재차 → 출고차, TOGETHER {경과시간}, 발화 3줄 [장소] "말한 내용" → AI 가 한 배려
|
| N년 후 |
N YEARS LATER, 누적 km, 차종 · n년, n years, nnnn일째
|
| 연도별 카드 |
1 YEAR LATER, 이벤트 제목(첫 가족 여행), 상황(뒷좌석에 아이가 잠든 저녁), AI 가 한 행동 한 줄(잠들면 음악을 낮춰요), 배경색 = 모드 |
| 종료 화면 | 날짜, 우리의 첫 번째 하루 · 시각, 그날 차에서 처음 하신 말 — "조용히", 맺음 문장, AI 일기에서 오늘 다시 보기
|
| 마지막 | LLM 엔딩 멘트 20자 이내 ("새 차는 처음이지만, 우리는 처음이 아니니까.") |
모드 5종: 즐거운 순간을 함께 나눔 / 우울함을 달래줌 / 긴장을 풀어줌 / 응원해줌 / 든든하게 케어해줌.
세션 ID 하나로 뽑는 쿼리가 이미 전부 있다.
| 엔딩 항목 | 출처 |
|---|---|
| 이름 · AI 페르소나 |
users.username, personas
|
| 처음 만난 날 · 시각 | users.created_at |
| 총 경과 시간 |
users.created_at ↔ ended_at
|
| 성향 칩 (아이) | users.has_children |
| 방문 장소와 순서 |
user_location_history, user_locations.visit_order
|
| AI 가 한 배려 한 줄 |
taskResults.forTask — 고른 선택지 + 로봇 명령 결과 + 자동화 결과를 한 줄로 합쳐 주는 코드가 이미 있다 (internal/mqttx/journey_narrative.go) |
| 태스크 완료·건너뜀 집계 |
bucketTaskReportItems (internal/mqttx/task_report.go) |
| 사용자 외형·성별·사진 |
users.description, users.gender, users.asset_id → user_assets
|
| 표정 추세 | user_emotion_history |
| 구매 내역 | store_purchases |
orchestration/{sessionId}/context (retained) 가 이미 세션 전체 스냅샷이다. 장소별 태스크와
그 결과 한 줄, 이벤트 선택, 차량 스텝, 최근 내레이션까지 들어 있다. 재료 수집 함수
(buildJourneyContext)와 구조화 변환(toSessionContextPayload)을 그대로 재사용할 수 있어,
엔딩 집계를 처음부터 짤 필요가 없다.
| 항목 | 막히는 지점 | 할 일 |
|---|---|---|
| 발화 내용 | 저장됨 (ai_messages, STT 포함) |
그대로 |
| 발화한 장소 | 발화 행에 장소 컬럼이 없다 | 컬럼 추가 또는 created_at ↔ user_location_history.changed_at 대조 |
| "차에서" 한 말 | 차 모드 발화인지 구분자가 안 남는다 (type 은 voice/text 뿐) |
컬럼 하나 |
| 자기소개 원문 |
버린다. intro_message 에서 이름만 LLM 추출하고 문장을 저장하지 않는다 |
저장 코드 추가 |
| 디바이스 명령 전체 |
device_command_logs.session_id 컬럼은 있는데 그걸로 뽑는 쿼리가 없다 |
쿼리 한 줄 |
자기소개 원문이 제일 아프다. 첫 화면의 처음에 "부모님과 살아요" 와 종료 화면의
그날 차에서 처음 하신 말 이 둘 다 이 값을 쓴다.
| 항목 | 현황 |
|---|---|
| 현재차 · 추천차 · 출고차 | 개념 자체가 서버에 없다 (§1) |
| 차종별 이미지·영상 | 없다 |
| 추천 규칙 입력값 | 자녀만 컬럼, 나머지는 자유 텍스트 (§1) |
| AI 가 오늘 한 말 | 내러티브 본문이 메모리에만 산다 (narrativeHist, 최대 10개). 종료 시 삭제돼 나중에 못 꺼낸다 |
| 미래차 주행 이력 | 마지막 스텝 1건만 메모리(VehicleStep). route/state 이력이 DB 에 안 남는다 |
- 연도별 카드 전부. 이벤트(가족여행·승진·아이 출생·멀미·사고), 그때 상황, AI 가 한 행동, 모드 5종. 세션에서 나올 수 있는 값이 아니다.
- N년 후 누적 km 와 날짜. 기획이 더미라고 적었다. 서버가 찍어 내리면 되는데 규칙을 받아야 한다.
- "1년째는 항상 고정" 같은 고정값.
연도별 카드는 어드민에서 관리하는 템플릿으로 두기를 권한다. 세션 성향(아이·부모님·반려동물)별로 카드 묶음을 만들어 두고 엔딩에서 해당 묶음을 고르는 식이다. LLM 에 맡기면 매번 달라져 전시 품질이 흔들린다. LLM 은 마지막 20자 멘트 하나로 한정하는 편이 안전하다.
구현됨 (2026-10-02):
orchestration/{sessionId}/endingretained,ended_at→ 엔딩 발행 →/context삭제 순서. B 의 네 가지(발화 장소·차 모드 구분·자기소개 저장·세션별 명령 로그 쿼리)도 138 에서 처리했다. 아래는 당시 제안 원문이다.
orchestration/{sessionId}/ending (retained, 세션 종료 시 1회)
retained 를 권한다. 엔딩 화면이 늦게 붙어도 받을 수 있고 다시 띄울 때 재요청이 필요 없다. 조회형이 맞으면 태스크 리포트처럼 Request-Reply 로 해도 된다 — 그 패턴도 이미 있다.
LLM 멘트가 몇 초 걸리므로 데이터를 먼저 내리고 멘트는 뒤이어 갱신 발행하는 편이 화면이 덜 기다린다.
세션 종료 처리(internal/mqttx/end_session.go)의 clearSessionRuntime 이
/context retained 를 빈 페이로드로 지운다. 엔딩 발행은 반드시 그 앞에 끼워야 한다.
뒤에 두면 재료가 사라진 뒤에 집계하게 된다.
마지막 장소의 태스크가 전부 끝나면 ai/summary 로 마무리 문장이 하나 나간다
(source=journey_complete, internal/mqttx/milestone_summary.go). 둘이 모자라다.
- 관람객이 중간에 signout 하면 안 나간다
- 결과가 문장 하나라 엔딩 화면이 쓸 구조가 아니다
태스크 리포트(task/report/request)는 FE 가 요청할 때만 응답한다. 서버가 자발적으로 발행하지 않는다.
| # | 결정 사항 | 정해 줄 쪽 |
|---|---|---|
| 1 | 추천 규칙 입력값을 설문 고정 문항 + 컬럼으로 둘 것인가 | 기획 |
| 2 | 차종별 이미지·영상을 어디에 둘 것인가 (어드민 업로드 / 정적 경로) | 기획·FE |
| 3 | 연도별 카드를 어드민 템플릿으로 둘 것인가, LLM 이 지을 것인가 | 기획 |
| 4 | N년 후 km·날짜 생성 규칙 | 기획 |
| 5 | 엔딩을 retained 로 내릴 것인가 Request-Reply 로 할 것인가 | FE |
| 6 | 필드 이름을 기존 사용자 모델 규칙에 맞춰 바꿀 것인가 (기획이 "바꾸면 엔딩 명세도 맞추겠다"고 함) | 백엔드 |
기획이 적은 순서는 "백엔드 1·4 → 프론트 1·3 → 나머지" 다. 그대로 가되 하나를 끼운다.
- 차량 3필드 + 사용자 정보에 싣기 (기획의 백엔드 1·4)
- 자기소개 발화 저장 — 한 줄짜리 변경인데, 안 하면 엔딩 첫 화면과 종료 화면이 비어 보인다
- 추천 규칙 입력값 결정(§4-1) 후 규칙표 구현
- 확정·출고 이벤트 수신
- 엔딩 집계 + 토픽
- 연도별 카드 (출처를 정한 뒤)
- Google ADK 검토 (프레임워크·모델 비교)
- 페르소나 + 상황 카드 모델 (2차 시나리오 구동 방식)
- Mac Studio 로컬 LLM + Claude Opus 하이브리드 라우팅 전략
- 개발 일정·할 일 점검표 (단계별 진행 점검)
- 로봇 Adapter 개발 온보딩 (HA·MQTT 계정 등록, 토픽 적용, 테스트 송수신, 상태 확인)
- LG ThinQ 가전 연동 (HA 통합 · REST 데이터 취득 · 제어)
- 장소 도착 자동화 (태스크/이벤트/장소 규칙 → SPOT·로봇팔·반려로봇·Hub 자동 명령)
- 엔딩 화면 데이터 출처 점검 (차량 3필드 · 세션 종료 엔딩 5화면)