"composer 가 유일한 문이던 시절은 끝났어. 새 문은 전부 같은 계약에 사인하고 들어왔어."
캡처가 책상을 떠나
2026 년 9 월 중순까지 Forge 는 화면 하나였어. office 웹앱. 9 월 10 일에 폰 반쪽이 생겼지 — 범용 iOS 앱 하나, 가족 공유 kit 코어 위의 SwiftUI, TestFlight 배달, 같은 번들에 watch 가 타고. 이유는 허영이 아니라 캡처 계약이었어. 증상은 flare 한복판에, 대기실에서, 바이크 위에서 오는데, 책상은 crumb 를 입력하는 곳이지 생기는 곳이 아니거든. 근데 새 문은 덧붙이는 부품이 아냐. 문마다 이 트랙의 두 규칙을 지킨다는 걸 증명해야 했어. 캡처는 required picker 없는 자유 산문일 것, 로컬 쓰기가 항상 먼저 커밋될 것.
문 넷, 계약 하나
스캔. 폰의 문서 카메라가 검진 출력물을 데스큐된 여러 페이지 PDF 하나로 만들어. 엔진의 25 MB 상한에 맞춰 기기 위에서 크기를 맞추고. 병원에서 찍은 페이지는 차에 타기 전에 이미 crumb 야. 받아쓰기. 음성 인식은 기기 위에서만 돌아. locale 에 오프라인 모델이 없으면 문은 서버 fallback 대신 거절해 — 증상 텍스트를 제3자가 머신 밖으로 가져가는 걸 금지한 가족의 선이, 여기선 약속이 아니라 코드로 되어 있어. 공유. 몇 주 뒤 메일로 도착하는 검진 PDF 는 공유 확장이 받아. App Group inbox 에 쓰고 엔진 자체엔 절대 손 안 대. 정리는 다음에 앱을 열 때 폰 반쪽이 해. 손목. watch 페이스의 complication 이 곧 문이야. 탭하면 받아쓰기가 열리고, module 탭은 두 번 터치로 운동을 기록해. 그 받아쓰기에 정직한 각주 하나. watchOS 는 앱에 자체 인식기를 주지 않아서, 손목은 시스템의 받아쓰기 화면을 쓰고 코드는 그게 어디서 듣는지 증명할 수 없어. 그 문은 아빠의 명시적이고 기록된 결정으로 열렸어 — 프라이버시 선 자체의 예외 조항을, 문서로 남기며 쓴 거야. '주절거리고 넘어가기' 가 비유를 벗는 지점이 여기야.
오프라인은 모드가 아니라 모양이야
지난 레슨의 outbox 는 폰에서도 돌아. 저장소는 kit 의 CaptureOutbox 고, 첨부 바이트는 로컬에 스테이징해. client_request_id 가 멱등 키라 재시도가 crumb 를 두 번 만들 수 없고, 올라간 media id 는 도착하는 순간 다시 적혀. 폰 반쪽 전체는 Face ID 뒤에 있고, 파일은 기기가 잠긴 동안 암호화된 채야. 배달은 TestFlight, 가족 파이프라인 하나 — 아빠 폰 속 건강앱도 여전히 가족 인프라니까.