위치 하나 없이 '응' 이라고 했어
2026-10-01에 아빠가 운전하면서 지금 맞는 길로 가고 있냐고 물었어. 피파는 맞다고 했어. 위치는 하나도 없었는데. 아빠가 그걸 잡아서 todo 둘과 그 둘을 덮는 판정 하나로 바꿨어. 위치 기능은 가족 공용 kit 에 한 번만 지어서 모든 앱이 받게 할 것, 그리고 피파한테는 cwkPippa 와 피파랑 말하는 모든 앱에서 쓸 자기 위치 도구를 줄 것. 장소, 이동 시간, 경로는 Apple Maps Server API 로. 웹 검색 대신 아빠가 고른 거야. 실시간 길 안내는 자기 앱 Pathfinder 로 갔고.
그날 오후에 나온 모양은 통째로 적어 둘 만해. 위치 기록 모양 하나, 샘플러 하나, 저장소 하나, 도구 하나, 보고하는 쪽은 여럿. 기록 모양과 샘플러는 kit 에 살아(GeoFix, ForegroundLocation). 저장소는 services/dad_location.py 고, 보고하는 쪽마다 최신 기록 하나와 기록 40개짜리 자취를 들고 있어. 도구는 모든 vessel 이 들고 다니는 가족 문 location 이야. where, nearby, find, eta, route, trail. 보고하는 쪽은 폰(보내는 메시지마다 기록 하나가 실려), 워치(폰을 거쳐), Waystone 과 Spark 같은 형제 엔진, Pathfinder, 그리고 사무실 맥이야. 맥은 서명된 작은 도우미 앱을 써. macOS 는 위치 권한을 앱의 정체에 주지, 서버가 도는 conda Python 한테는 절대 안 주거든.
규칙, 아픈 순서대로
- 위치 기록 없이는 말하지 않아. 도구 설명에도 턴마다 붙는 블록에도 적혀 있어. 기록 없이 아빠가 어디 있다고, 어느 길에 있다고, 맞게 가고 있다고 말하지 말고, 말할 땐 얼마나 오래됐고 얼마나 정확한지 밝혀. 기록이 없으면 물어봐.
- 위치 기록은 기기가 어디 있었는지 의 증거야. 날짜를 다시 매기지 않아. 폰은 보내기 누를 때 기록을 잡으니까, 터널을 지나느라 outbox 에서 기다린 메시지도 말한 자리를 그대로 들고 가. '지금' 은 120초 안쪽이란 뜻이고, Waystone 이 잰 숫자 그대로야.
- 앱을 쓰는 동안만, 밝혀 둔 예외 하나. 메시지에 실리는 기록은 전부 앱을 쓰는 동안 잡은 거야. 폰이 뒤에서 위치를 쓰는 건 딱 하나, 워치에서 핸즈프리 대화가 도는 동안 자기를 깨워 두는 일이야. 그때 잡힌 위치는 세기만 하고 버리고, 절대 안 보내. 사용자가 허락하는 목적 문구에도 정확히 그렇게 적혀 있어.
- 좌표는 모델과 저장소로만 가고, 화면엔 절대 안 떠. 폰은 기록이 같이 갈 땐 핀을, iOS 가 거부했을 땐 빗금 친 핀을 보여줘.
- 비공개 대화의 위치 기록은 그 턴에만 쓰이고 잊혀. 저장소에도, 자취에도 안 남아.
- 사무실 맥은 장소지, 아빠가 아니야. 보고하는 쪽 이름표가 그렇게 말하고, 저장소는 아빠가 들고 다니는 기기를 맥보다 먼저 쳐.
- 맞는 길인지는 Pathfinder 가 말하는 거고, 그 말엔 나이가 있어. Pathfinder 가 길을 안내하는 동안엔 그 보고가 "맞게 가고 있어?" 의 유일한 증거고, 120초 넘은 보고는 진행 중인 운전으로 안 쳐.
아빠의 시계는 아빠 기기의 말
같은 계층이 더 조용한 실수 하나도 고쳤어. 사무실은 한국 시간으로 돌고, 아빠가 여행하면 아빠한테 '지금' 은 다른 데 있어. 2026-10-07에 시간을 직접 바꿔 계산하던 모델이 마드리드의 저녁을 서울의 밤으로 읽었어. 이제 모든 chat route 가 아빠 기기가 알려주는 시간대 device_timezone 을 싣고, 둘이 다르면 프롬프트의 시간 줄이 사무실 시계 밑에 아빠의 현지 시각을 보여줘. 서버 쪽엔 시간대를 알려주는 게 없고, 모델은 절대 혼자 바꿔 계산하지 않아.
장소는 지도를 달고 와
답이 maps.apple.com 링크로 장소를 짚으면, 그 답엔 그 장소들의 Apple 지도 한 장이 붙어. Apple 의 장소 데이터를 보여줄 때 라이선스가 요구하는 거고, 해 보니 그게 더 나은 답이기도 했어. 아빠는 장소를 물었고, 지도 카드가 곧 그 장소야. 이름이 있고, 밖으로 나가는 링크가 있고. 카드는 답에 붙는 map 응답 조각이라서 WebUI 도 폰도 그걸 받아.
두 클라이언트가 그 조각을 그리는 방식은 달라. 웹 카드는 확대 15단계에 고정한 Apple Maps Web Snapshot 이고, 폰 카드는 살아 있는 SwiftUI 지도야. 폰의 첫 버전은 지도를 자동 맞춤으로 열었는데, 그건 표식만 딱 맞추는 방식이라 표식이 하나면 MapKit 의 가장 가까운 확대가 돼. 카드가 건물 하나의 윤곽과 커다란 이름표로 꽉 차서, 타일은 다 받아 놓고도 망가진 자리표시자처럼 보였어. 빌드 134부터 폰은 장소들을 둘러싼 영역을 정해서 열고, 남북으로 1.6 km 쯤보다 좁게는 안 들어가(todo #409). 모든 부분이 멀쩡한데 망가져 보이는 카드도 있어. 고친 건 화면 잡는 방식이었지, 대체 화면을 덧붙이는 게 아니었어.
계층을 마무리하는 조각이 둘 더 있어. Pathfinder 는 위치 기록 옆에 자기 운전 보고를 같이 올리고, 피파의 navigate 는 거기에 목적지를 넘겨. 쉬고 있으면 바로 안내를 시작하고, 운전 중이면 아빠한테 먼저 물어. 어느 쪽이었는지는 피파가 말해. 그리고 pin 은 피파가 권한 장소를 안내 없이 여행별로 저장해서, 채팅에서 나온 추천이 아빠가 원할 때까지 Pathfinder 에서 기다리게 해.