ENDING_SCREEN DATA_SOURCES - zero1ne-26/doc GitHub Wiki

์—”๋”ฉ ํ™”๋ฉด โ€” ๋ฐ์ดํ„ฐ ์ถœ์ฒ˜ ์ ๊ฒ€

์ž‘์„ฑ์ผ: 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-server 26313db ๊ธฐ์ค€์œผ๋กœ ์ฝ์—ˆ๊ณ , ์ถ”์ธกํ•œ ๊ฒƒ์€ ์ ์ง€ ์•Š์•˜๋‹ค.


0. ํ˜„ํ™ฉ โ€” ๋œ ๊ฒƒ / ์•„์ง ์•ˆ ๋œ ๊ฒƒ (2026-10-03)

๋œ ๊ฒƒ

ํ•ญ๋ชฉ ์–ด๋””์—
์—”๋”ฉ ํ† ํ”ฝ 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 ์ฐจ๋Ÿ‰ 3ํ•„๋“œ vehicle.current / recommended / delivered โ†’ ๋œ ๊ฒƒ์œผ๋กœ ์ด๋™ (2026-10-03, 147) ์…‹ ๋‹ค ์ฝ”๋“œ๊ฐ€ ์ฑ„์šฐ๊ณ  /me ์— ์‹ค๋ฆฐ๋‹ค ๋‚จ์€ ๊ฒƒ์€ ์ถ”์ฒœ ๊ทœ์น™ํ‘œ(2๋ฒˆ) โ€” ์ง€๊ธˆ ์ถ”์ฒœ์€ LLM ์ด ๊ณ ๋ฅธ๋‹ค
2 ์ถ”์ฒœ ๊ทœ์น™ํ‘œ (์•„์ดโ†’์นด๋‹ˆ๋ฐœ / ๋ถ€๋ชจ๋‹˜โ†’ํŒฐ๋ฆฌ์„ธ์ด๋“œ / ๋ฐ˜๋ ค๋™๋ฌผยท์บ ํ•‘โ†’์‹ผํƒ€ํŽ˜ยทEV9 / ์—†์œผ๋ฉด ์•„์ด์˜ค๋‹‰6) ์ž…๋ ฅ๊ฐ’ ์ค‘ ์ž๋…€๋งŒ ์ปฌ๋Ÿผ. ๋ถ€๋ชจ๋‹˜ ๋™๊ฑฐยท๋ฐ˜๋ ค๋™๋ฌผ์€ users.description ์ž์œ  ํ…์ŠคํŠธ ยง4-1 ๊ฒฐ์ • ํ•„์š” โ€” ์„ค๋ฌธ ๋ฌธํ•ญ ๊ณ ์ • + ์ปฌ๋Ÿผ ์ถ”๊ฐ€(๊ถŒํ•จ) / LLM ์ถ”์ถœ / ์„ค๋ฌธ ํ‚ค ๊ณ ์ •
3 ํ™•์ •ยท์ถœ๊ณ  ์ด๋ฒคํŠธ ์ˆ˜์‹  โ†’ ๋œ ๊ฒƒ์œผ๋กœ ์ด๋™ (2026-10-03, 147) ๊ฒฌ์  ๋ธŒ๋ฆฌํ•‘ยท์ถœ๊ณ  ์ค€๋น„ ํƒœ์Šคํฌ์˜ task/complete ์— ๊ฑธ์—ˆ๋‹ค FE ๋Š” "์ฃผ๋ฌธํ•˜๊ธฐ"/"์ถœ๊ณ  ํ™•์ธ" ๋ฒ„ํŠผ์ด ํ•ด๋‹น ํƒœ์Šคํฌ๋ฅผ ์™„๋ฃŒ ์ฒ˜๋ฆฌํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋œ๋‹ค. ๋ณ„๋„ ํ† ํ”ฝ์ด ๊ผญ ํ•„์š”ํ•˜๋ฉด ๊ทธ๋•Œ ์ถ”๊ฐ€
4 ์ฐจ์ข…๋ณ„ ์ด๋ฏธ์ง€ยท์˜์ƒ โ†’ ๋œ ๊ฒƒ์œผ๋กœ ์ด๋™ (2026-10-02) vehicles.image_url / video_url ์— ์–ด๋“œ๋ฏผ์ด ์˜ฌ๋ฆฐ๋‹ค ๋‚จ์€ ๊ฒƒ์€ FE ๊ฐ€ vehicle.*.model ๋Œ€์‹  vehicles.id ๋กœ ์—์…‹์„ ์ฐพ๊ฒŒ ํ•˜๋Š” ๊ฒƒ โ€” 1๋ฒˆ๊ณผ ๊ฐ™์ด
5 LLM ์—”๋”ฉ ๋ฉ˜ํŠธ 20์ž โ†’ ๋œ ๊ฒƒ์œผ๋กœ ์ด๋™ (2026-10-02, 145) ์•ฑ ์„ค์ • 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 AI ๊ฐ€ ์˜ค๋Š˜ ํ•œ ๋ง ์ „์ฒด โ†’ ๋œ ๊ฒƒ์œผ๋กœ ์ด๋™ (2026-10-03, 147) user_narratives, ์—”๋”ฉ narratives[] ์ „์ฒด 147 ์ด์ „ ์„ธ์…˜์€ ์†Œ๊ธ‰ ์•ˆ ๋จ(๋ฉ”๋ชจ๋ฆฌ ์ตœ๊ทผ 5๊ฐœ)
9 ๋ฏธ๋ž˜์ฐจ ์ฃผํ–‰ ์ด๋ ฅ โ†’ ๋œ ๊ฒƒ์œผ๋กœ ์ด๋™ (2026-10-03, 147) 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 ๋ชซ.


0-1. ํ™”๋ฉด โ†” ์—”๋”ฉ ํ† ํ”ฝ ํ•„๋“œ ๋งคํ•‘ (2026-10-04)

"์—”๋”ฉ ๊ฐ€์ด๋“œ_261001.pptx" ์˜ ํ™”๋ฉด ๋ฒˆํ˜ธ(์Šฌ๋ผ์ด๋“œ์— ์ฐํžŒ โ‘ โ‘กโ‘ขโ€ฆ)๋ฅผ orchestration/{sessionId}/ending ํŽ˜์ด๋กœ๋“œ ํ•„๋“œ์— ํ•˜๋‚˜์”ฉ ๋ถ™์˜€๋‹ค. ํ•„๋“œ ํƒ€์ž…ยท์„ค๋ช…์€ ยง5-2. ์‹œ๊ฐ์€ ์ „๋ถ€ RFC3339 KST ๋ผ ํ™”๋ฉด ํ‘œ๊ธฐ(2026.09.30 22:16, 13m 05s)๋Š” FE ๊ฐ€ ํฌ๋งทํ•œ๋‹ค.

์ฒซ ํ™”๋ฉด (์Šฌ๋ผ์ด๋“œ 5 โ€” "๋ฐ˜๊ณ ์ •ยท๊ณ ์ •ยทLLM")

# ํ™”๋ฉด ์š”์†Œ ์˜ˆ์‹œ ํ•„๋“œ ๋น„๊ณ 
โ‘  ์‚ฌ์šฉ์ž ์ด๋ฆ„ ยท 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๋…„ ํ›„ (์Šฌ๋ผ์ด๋“œ 6ยท7 โ€” ๋”๋ฏธ, 1~3๋…„ ๊ณ ์ •)

# ํ™”๋ฉด ์š”์†Œ ์˜ˆ์‹œ ํ•„๋“œ ๋น„๊ณ 
โ‘  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

์—ฐ๋„๋ณ„ ์นด๋“œ (์Šฌ๋ผ์ด๋“œ 8~12 โ€” 1ยท2ยท3๋…„)

# ํ™”๋ฉด ์š”์†Œ ์˜ˆ์‹œ ํ•„๋“œ ๋น„๊ณ 
โ‘  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 ์€ ์•„๋‹ˆ๋‹ค

์ข…๋ฃŒ ํ™”๋ฉด (์Šฌ๋ผ์ด๋“œ 13)

ํ™”๋ฉด ์š”์†Œ ํ•„๋“œ
๋‚ ์งœ ยท ์šฐ๋ฆฌ์˜ ์ฒซ ๋ฒˆ์งธ ํ•˜๋ฃจ ยท ์‹œ๊ฐ session.since_date ยท session.ended_at
๊ทธ๋‚  ์ฐจ์—์„œ ์ฒ˜์Œ ํ•˜์‹  ๋ง โ€” "์กฐ์šฉํžˆ" utterances[0].text โ€” ํ† ํ”ฝ utterances[] ๋Š” ์ฐจ์—์„œ ํ•œ ๋ง(source == "car")๋งŒ ์˜จ๋‹ค (2026-10-09)
AI ์ผ๊ธฐ์—์„œ ์˜ค๋Š˜ ๋‹ค์‹œ ๋ณด๊ธฐ narratives[] (AI ๊ฐ€ ์˜ค๋Š˜ ํ•œ ๋ง ์ „์ฒด, ์‹œ๊ฐ„์ˆœ, 147)

๋งˆ์ง€๋ง‰ (์Šฌ๋ผ์ด๋“œ 14)

# ํ™”๋ฉด ์š”์†Œ ํ•„๋“œ ๋น„๊ณ 
โ‘  ์—”๋”ฉ ๋ฉ˜ํŠธ 20์ž ending_line 2์ฐจ ๋ฐœํ–‰์œผ๋กœ ์˜จ๋‹ค โ€” ์ข…๋ฃŒ ์งํ›„ 1์ฐจ๋Š” "", LLM ์ด ์“ฐ๋ฉด ๊ฐ™์€ ํ† ํ”ฝ(retained)์— ์ฑ„์›Œ ๋‹ค์‹œ. FE ๋Š” ending_line ์ด ๋น„์–ด ์žˆ์œผ๋ฉด ๊ธฐ๋‹ค๋ ธ๋‹ค๊ฐ€ ๋ฐ”๋€Œ๋ฉด ๊ทธ๋ฆฐ๋‹ค. ํ”„๋กฌํ”„ํŠธ๋Š” ์•ฑ ์„ค์ • ending_line_prompt

์Šฌ๋ผ์ด๋“œ 1 "์‚ฌ์šฉ์ž ์ •๋ณด ํŒ์—…" (์—”๋”ฉ ์•„๋‹˜)

ํ˜„์žฌ ์ฐจ / ์ถ”์ฒœ ์ฐจ์™€ ์ด์œ  / ์ถœ๊ณ  ์ƒํƒœ ์„ธ ์ค„ โ†’ 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[] ๋Š” ์ฐจ์—์„œ ํ•œ ๋ง๋งŒ ๋‚จ๊ฒผ๋‹ค.)


1. ์š”์ฒญ โ‘  โ€” ์ฐจ๋Ÿ‰ 3ํ•„๋“œ

๊ธฐํš ์ง€์ : ์ง€๊ธˆ ์‚ฌ์šฉ์ž ์ •๋ณด์— "ํ˜„์žฌ ์ฐจ"์™€ "์ถ”์ฒœ ์ฐจ"๊ฐ€ ์—†์–ด ํ™”๋ฉด๋งˆ๋‹ค ๋‹ค๋ฅธ ์ฐจ๊ฐ€ ๋œฌ๋‹ค. ๊ฒฌ์  ํ™”๋ฉด ํžˆ์–ด๋กœ๋Š” ์•„๋ฐ˜๋–ผ, ๊ฐ€์ƒ ์‹œ์Šน์€ 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 ์ œ์•ฝ์ด ๊ฑธ๋ ค ์žˆ๋‹ค.

์„ ํƒ์ง€ ์…‹:

  1. ์ œ์•ฝ์„ ํ’€๊ณ  ์ปฌ๋Ÿผ์„ ๋” ๋‘”๋‹ค (lives_with_parents, has_pet ๋“ฑ) โ† ๊ถŒํ•จ
  2. ์ž์œ  ํ…์ŠคํŠธ๋ฅผ LLM ์œผ๋กœ ๋ฝ‘๋Š”๋‹ค โ† ๊ธฐํš์ด "LLM ์•„๋‹˜, ์ฝ”๋“œ"๋ผ๊ณ  ๋ชป๋ฐ•์Œ
  3. ์„ค๋ฌธ ๋ฌธํ•ญ์„ ๊ณ ์ • ํ‚ค๋กœ ๋ฐ”๊พผ๋‹ค

1๋ฒˆ์„ ํ•˜๋ ค๋ฉด "์„ค๋ฌธ ๋ฌธํ•ญ 3๊ฐœ๋Š” ๊ณ ์ •"์ด๋ผ๋Š” ํ•ฉ์˜๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

์ฐจ์ข…๋ณ„ ์—์…‹๋„ ์—†๋‹ค. ์ถ”์ฒœ ๊ฒฐ๊ณผ๊ฐ€ ์นด๋‹ˆ๋ฐœยทํŒฐ๋ฆฌ์„ธ์ด๋“œยท์‹ผํƒ€ํŽ˜ยทEV9ยท์•„์ด์˜ค๋‹‰6 ์ค‘ ํ•˜๋‚˜์ธ๋ฐ, ๊ทธ ์ฐจ์ข…์˜ ์ด๋ฏธ์ง€ยท์˜์ƒ์„ ์–ด๋””์— ๋‘๋Š”์ง€๊ฐ€ ์ •ํ•ด์ ธ ์žˆ์ง€ ์•Š๋‹ค. ๊ธฐํš์ด "ํ˜„๋Œ€/๊ธฐ์•„ ๋ณ„๋กœ ์˜์ƒ์ด ๋ถ„๋ฆฌ๋˜์–ด์•ผ ํ•  ๊ฒƒ ๊ฐ™๋‹ค"๊ณ  ์ ์€ ๊ฒƒ์ด ์ด ๋ฌธ์ œ๋‹ค.


2. ์š”์ฒญ โ‘ก โ€” ์—”๋”ฉ ํ™”๋ฉด

ํ™”๋ฉด ๊ตฌ์„ฑ (์Šฌ๋ผ์ด๋“œ์—์„œ ์ฝ์€ ๊ฒƒ)

ํ™”๋ฉด ๋‹ด๊ธฐ๋Š” ๊ฒƒ
์ฒซ ํ™”๋ฉด ์ด๋ฆ„ยทํŽ˜๋ฅด์†Œ๋‚˜, ์„ฑํ–ฅ ์นฉ, ์ฒ˜์Œ ๋งŒ๋‚œ ๋‚ ยท์‹œ๊ฐ, VEHICLE {km} + ์ฐจ์ข…ยท์ถœ๊ณ , ํ˜„์žฌ์ฐจ โ†’ ์ถœ๊ณ ์ฐจ, TOGETHER {๊ฒฝ๊ณผ์‹œ๊ฐ„}, ๋ฐœํ™” 3์ค„ [์žฅ์†Œ] "๋งํ•œ ๋‚ด์šฉ" โ†’ AI ๊ฐ€ ํ•œ ๋ฐฐ๋ ค
N๋…„ ํ›„ N YEARS LATER, ๋ˆ„์  km, ์ฐจ์ข… ยท n๋…„, n years, nnnn์ผ์งธ
์—ฐ๋„๋ณ„ ์นด๋“œ 1 YEAR LATER, ์ด๋ฒคํŠธ ์ œ๋ชฉ(์ฒซ ๊ฐ€์กฑ ์—ฌํ–‰), ์ƒํ™ฉ(๋’ท์ขŒ์„์— ์•„์ด๊ฐ€ ์ž ๋“  ์ €๋…), AI ๊ฐ€ ํ•œ ํ–‰๋™ ํ•œ ์ค„(์ž ๋“ค๋ฉด ์Œ์•…์„ ๋‚ฎ์ถฐ์š”), ๋ฐฐ๊ฒฝ์ƒ‰ = ๋ชจ๋“œ
์ข…๋ฃŒ ํ™”๋ฉด ๋‚ ์งœ, ์šฐ๋ฆฌ์˜ ์ฒซ ๋ฒˆ์งธ ํ•˜๋ฃจ ยท ์‹œ๊ฐ, ๊ทธ๋‚  ์ฐจ์—์„œ ์ฒ˜์Œ ํ•˜์‹  ๋ง โ€” "์กฐ์šฉํžˆ", ๋งบ์Œ ๋ฌธ์žฅ, AI ์ผ๊ธฐ์—์„œ ์˜ค๋Š˜ ๋‹ค์‹œ ๋ณด๊ธฐ
๋งˆ์ง€๋ง‰ LLM ์—”๋”ฉ ๋ฉ˜ํŠธ 20์ž ์ด๋‚ด ("์ƒˆ ์ฐจ๋Š” ์ฒ˜์Œ์ด์ง€๋งŒ, ์šฐ๋ฆฌ๋Š” ์ฒ˜์Œ์ด ์•„๋‹ˆ๋‹ˆ๊นŒ.")

๋ชจ๋“œ 5์ข…: ์ฆ๊ฑฐ์šด ์ˆœ๊ฐ„์„ ํ•จ๊ป˜ ๋‚˜๋ˆ” / ์šฐ์šธํ•จ์„ ๋‹ฌ๋ž˜์คŒ / ๊ธด์žฅ์„ ํ’€์–ด์คŒ / ์‘์›ํ•ด์คŒ / ๋“ ๋“ ํ•˜๊ฒŒ ์ผ€์–ดํ•ด์คŒ.

A. ์ง€๊ธˆ ๋ฐ์ดํ„ฐ๋กœ ๋ฐ”๋กœ ๋งŒ๋“ ๋‹ค

์„ธ์…˜ 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)์„ ๊ทธ๋Œ€๋กœ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด, ์—”๋”ฉ ์ง‘๊ณ„๋ฅผ ์ฒ˜์Œ๋ถ€ํ„ฐ ์งค ํ•„์š”๊ฐ€ ์—†๋‹ค.

B. ์ž‘์€ ์ถ”๊ฐ€๋กœ ๋œ๋‹ค

ํ•ญ๋ชฉ ๋ง‰ํžˆ๋Š” ์ง€์  ํ•  ์ผ
๋ฐœํ™” ๋‚ด์šฉ ์ €์žฅ๋จ (ai_messages, STT ํฌํ•จ) ๊ทธ๋Œ€๋กœ
๋ฐœํ™”ํ•œ ์žฅ์†Œ ๋ฐœํ™” ํ–‰์— ์žฅ์†Œ ์ปฌ๋Ÿผ์ด ์—†๋‹ค ์ปฌ๋Ÿผ ์ถ”๊ฐ€ ๋˜๋Š” created_at โ†” user_location_history.changed_at ๋Œ€์กฐ
"์ฐจ์—์„œ" ํ•œ ๋ง ์ฐจ ๋ชจ๋“œ ๋ฐœํ™”์ธ์ง€ ๊ตฌ๋ถ„์ž๊ฐ€ ์•ˆ ๋‚จ๋Š”๋‹ค (type ์€ voice/text ๋ฟ) ์ปฌ๋Ÿผ ํ•˜๋‚˜
์ž๊ธฐ์†Œ๊ฐœ ์›๋ฌธ ๋ฒ„๋ฆฐ๋‹ค. intro_message ์—์„œ ์ด๋ฆ„๋งŒ LLM ์ถ”์ถœํ•˜๊ณ  ๋ฌธ์žฅ์„ ์ €์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค ์ €์žฅ ์ฝ”๋“œ ์ถ”๊ฐ€
๋””๋ฐ”์ด์Šค ๋ช…๋ น ์ „์ฒด device_command_logs.session_id ์ปฌ๋Ÿผ์€ ์žˆ๋Š”๋ฐ ๊ทธ๊ฑธ๋กœ ๋ฝ‘๋Š” ์ฟผ๋ฆฌ๊ฐ€ ์—†๋‹ค ์ฟผ๋ฆฌ ํ•œ ์ค„

์ž๊ธฐ์†Œ๊ฐœ ์›๋ฌธ์ด ์ œ์ผ ์•„ํ”„๋‹ค. ์ฒซ ํ™”๋ฉด์˜ ์ฒ˜์Œ์— "๋ถ€๋ชจ๋‹˜๊ณผ ์‚ด์•„์š”" ์™€ ์ข…๋ฃŒ ํ™”๋ฉด์˜ ๊ทธ๋‚  ์ฐจ์—์„œ ์ฒ˜์Œ ํ•˜์‹  ๋ง ์ด ๋‘˜ ๋‹ค ์ด ๊ฐ’์„ ์“ด๋‹ค.

C. ์ƒˆ ๋ฐ์ดํ„ฐ ๋ชจ๋ธ์ด ํ•„์š”ํ•˜๋‹ค

ํ•ญ๋ชฉ ํ˜„ํ™ฉ
ํ˜„์žฌ์ฐจ ยท ์ถ”์ฒœ์ฐจ ยท ์ถœ๊ณ ์ฐจ ๊ฐœ๋… ์ž์ฒด๊ฐ€ ์„œ๋ฒ„์— ์—†๋‹ค (ยง1)
์ฐจ์ข…๋ณ„ ์ด๋ฏธ์ง€ยท์˜์ƒ ์—†๋‹ค
์ถ”์ฒœ ๊ทœ์น™ ์ž…๋ ฅ๊ฐ’ ์ž๋…€๋งŒ ์ปฌ๋Ÿผ, ๋‚˜๋จธ์ง€๋Š” ์ž์œ  ํ…์ŠคํŠธ (ยง1)
AI ๊ฐ€ ์˜ค๋Š˜ ํ•œ ๋ง ๋‚ด๋Ÿฌํ‹ฐ๋ธŒ ๋ณธ๋ฌธ์ด ๋ฉ”๋ชจ๋ฆฌ์—๋งŒ ์‚ฐ๋‹ค (narrativeHist, ์ตœ๋Œ€ 10๊ฐœ). ์ข…๋ฃŒ ์‹œ ์‚ญ์ œ๋ผ ๋‚˜์ค‘์— ๋ชป ๊บผ๋‚ธ๋‹ค
๋ฏธ๋ž˜์ฐจ ์ฃผํ–‰ ์ด๋ ฅ ๋งˆ์ง€๋ง‰ ์Šคํ… 1๊ฑด๋งŒ ๋ฉ”๋ชจ๋ฆฌ(VehicleStep). route/state ์ด๋ ฅ์ด DB ์— ์•ˆ ๋‚จ๋Š”๋‹ค

D. ์„œ๋ฒ„๊ฐ€ ๋งŒ๋“ค ์ˆ˜ ์—†๋‹ค โ€” ๊ธฐํš์ด ์ •ํ•ด์•ผ ํ•œ๋‹ค

  • ์—ฐ๋„๋ณ„ ์นด๋“œ ์ „๋ถ€. ์ด๋ฒคํŠธ(๊ฐ€์กฑ์—ฌํ–‰ยท์Šน์ง„ยท์•„์ด ์ถœ์ƒยท๋ฉ€๋ฏธยท์‚ฌ๊ณ ), ๊ทธ๋•Œ ์ƒํ™ฉ, AI ๊ฐ€ ํ•œ ํ–‰๋™, ๋ชจ๋“œ 5์ข…. ์„ธ์…˜์—์„œ ๋‚˜์˜ฌ ์ˆ˜ ์žˆ๋Š” ๊ฐ’์ด ์•„๋‹ˆ๋‹ค.
  • N๋…„ ํ›„ ๋ˆ„์  km ์™€ ๋‚ ์งœ. ๊ธฐํš์ด ๋”๋ฏธ๋ผ๊ณ  ์ ์—ˆ๋‹ค. ์„œ๋ฒ„๊ฐ€ ์ฐ์–ด ๋‚ด๋ฆฌ๋ฉด ๋˜๋Š”๋ฐ ๊ทœ์น™์„ ๋ฐ›์•„์•ผ ํ•œ๋‹ค.
  • "1๋…„์งธ๋Š” ํ•ญ์ƒ ๊ณ ์ •" ๊ฐ™์€ ๊ณ ์ •๊ฐ’.

์—ฐ๋„๋ณ„ ์นด๋“œ๋Š” ์–ด๋“œ๋ฏผ์—์„œ ๊ด€๋ฆฌํ•˜๋Š” ํ…œํ”Œ๋ฆฟ์œผ๋กœ ๋‘๊ธฐ๋ฅผ ๊ถŒํ•œ๋‹ค. ์„ธ์…˜ ์„ฑํ–ฅ(์•„์ดยท๋ถ€๋ชจ๋‹˜ยท๋ฐ˜๋ ค๋™๋ฌผ)๋ณ„๋กœ ์นด๋“œ ๋ฌถ์Œ์„ ๋งŒ๋“ค์–ด ๋‘๊ณ  ์—”๋”ฉ์—์„œ ํ•ด๋‹น ๋ฌถ์Œ์„ ๊ณ ๋ฅด๋Š” ์‹์ด๋‹ค. LLM ์— ๋งก๊ธฐ๋ฉด ๋งค๋ฒˆ ๋‹ฌ๋ผ์ ธ ์ „์‹œ ํ’ˆ์งˆ์ด ํ”๋“ค๋ฆฐ๋‹ค. LLM ์€ ๋งˆ์ง€๋ง‰ 20์ž ๋ฉ˜ํŠธ ํ•˜๋‚˜๋กœ ํ•œ์ •ํ•˜๋Š” ํŽธ์ด ์•ˆ์ „ํ•˜๋‹ค.


3. ๋ฐœํ–‰ ๋ฐฉ์‹

๊ตฌํ˜„๋จ (2026-10-02): orchestration/{sessionId}/ending retained, 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 ๊ฐ€ ์š”์ฒญํ•  ๋•Œ๋งŒ ์‘๋‹ตํ•œ๋‹ค. ์„œ๋ฒ„๊ฐ€ ์ž๋ฐœ์ ์œผ๋กœ ๋ฐœํ–‰ํ•˜์ง€ ์•Š๋Š”๋‹ค.


4. ์ •ํ•ด์•ผ ํ•  ๊ฒƒ

# ๊ฒฐ์ • ์‚ฌํ•ญ ์ •ํ•ด ์ค„ ์ชฝ
1 ์ถ”์ฒœ ๊ทœ์น™ ์ž…๋ ฅ๊ฐ’์„ ์„ค๋ฌธ ๊ณ ์ • ๋ฌธํ•ญ + ์ปฌ๋Ÿผ์œผ๋กœ ๋‘˜ ๊ฒƒ์ธ๊ฐ€ ๊ธฐํš
2 ์ฐจ์ข…๋ณ„ ์ด๋ฏธ์ง€ยท์˜์ƒ์„ ์–ด๋””์— ๋‘˜ ๊ฒƒ์ธ๊ฐ€ (์–ด๋“œ๋ฏผ ์—…๋กœ๋“œ / ์ •์  ๊ฒฝ๋กœ) ๊ธฐํšยทFE
3 ์—ฐ๋„๋ณ„ ์นด๋“œ๋ฅผ ์–ด๋“œ๋ฏผ ํ…œํ”Œ๋ฆฟ์œผ๋กœ ๋‘˜ ๊ฒƒ์ธ๊ฐ€, LLM ์ด ์ง€์„ ๊ฒƒ์ธ๊ฐ€ ๊ธฐํš
4 N๋…„ ํ›„ kmยท๋‚ ์งœ ์ƒ์„ฑ ๊ทœ์น™ ๊ธฐํš
5 ์—”๋”ฉ์„ retained ๋กœ ๋‚ด๋ฆด ๊ฒƒ์ธ๊ฐ€ Request-Reply ๋กœ ํ•  ๊ฒƒ์ธ๊ฐ€ FE
6 ํ•„๋“œ ์ด๋ฆ„์„ ๊ธฐ์กด ์‚ฌ์šฉ์ž ๋ชจ๋ธ ๊ทœ์น™์— ๋งž์ถฐ ๋ฐ”๊ฟ€ ๊ฒƒ์ธ๊ฐ€ (๊ธฐํš์ด "๋ฐ”๊พธ๋ฉด ์—”๋”ฉ ๋ช…์„ธ๋„ ๋งž์ถ”๊ฒ ๋‹ค"๊ณ  ํ•จ) ๋ฐฑ์—”๋“œ

5. ๊ถŒํ•˜๋Š” ์ˆœ์„œ

๊ธฐํš์ด ์ ์€ ์ˆœ์„œ๋Š” "๋ฐฑ์—”๋“œ 1ยท4 โ†’ ํ”„๋ก ํŠธ 1ยท3 โ†’ ๋‚˜๋จธ์ง€" ๋‹ค. ๊ทธ๋Œ€๋กœ ๊ฐ€๋˜ ํ•˜๋‚˜๋ฅผ ๋ผ์šด๋‹ค.

  1. ์ฐจ๋Ÿ‰ 3ํ•„๋“œ + ์‚ฌ์šฉ์ž ์ •๋ณด์— ์‹ฃ๊ธฐ (๊ธฐํš์˜ ๋ฐฑ์—”๋“œ 1ยท4)
  2. ์ž๊ธฐ์†Œ๊ฐœ ๋ฐœํ™” ์ €์žฅ โ€” ํ•œ ์ค„์งœ๋ฆฌ ๋ณ€๊ฒฝ์ธ๋ฐ, ์•ˆ ํ•˜๋ฉด ์—”๋”ฉ ์ฒซ ํ™”๋ฉด๊ณผ ์ข…๋ฃŒ ํ™”๋ฉด์ด ๋น„์–ด ๋ณด์ธ๋‹ค
  3. ์ถ”์ฒœ ๊ทœ์น™ ์ž…๋ ฅ๊ฐ’ ๊ฒฐ์ •(ยง4-1) ํ›„ ๊ทœ์น™ํ‘œ ๊ตฌํ˜„
  4. ํ™•์ •ยท์ถœ๊ณ  ์ด๋ฒคํŠธ ์ˆ˜์‹ 
  5. ์—”๋”ฉ ์ง‘๊ณ„ + ํ† ํ”ฝ
  6. ์—ฐ๋„๋ณ„ ์นด๋“œ (์ถœ์ฒ˜๋ฅผ ์ •ํ•œ ๋’ค)
โš ๏ธ **GitHub.com Fallback** โš ๏ธ