본문 바로가기
C.W.K.
Stream
Lesson 06 of 06 · published

폰 반쪽

~12 min · ios, watchos, capture-doors, offline-outbox, on-device-speech, testflight

Level 0차가운 쇠
0 XP0/37 lessons0/12 achievements
0/100 XP to next level100 XP to go0% complete
"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, 가족 파이프라인 하나 — 아빠 폰 속 건강앱도 여전히 가족 인프라니까.

새 캡처 문은 스토어가 아니라 계약이 허락해. 규칙 넷: 자유 산문으로 들어올 것, required type picker 없을 것, 로컬 쓰기가 먼저일 것, 프라이버시는 코드로 집행할 것. 못 지키는 문은 ship 안 해 — 그리고 코드가 마지막 하나를 집행할 수 없는 곳(손목의 시스템 받아쓰기 화면)에선, 규칙은 아빠의 명시적이고 기록된 결정이 돼.

Code

문 넷, 계약 하나 (2026-09-10 — 폰 반쪽)·text
문 넷, 계약 하나

  스캔      폰 문서 카메라 -> 데스큐된 여러 페이지 PDF 하나,
            엔진의 25 MB 상한에 맞춰 기기 위에서 크기 조정
  받아쓰기  기기 위 음성 인식; 오프라인 모델 없음 -> 문은
            거절 (증상 텍스트의 서버 fallback 은 절대 없음)
  공유      공유 확장 -> App Group inbox; 엔진 자체엔 절대 손 안 댐
  손목      complication = 문; module 탭; 받아쓰기는 시스템 화면
            (코드로 on-device 검증 불가 -> 아빠의 명시적·기록된
            결정으로만 열림)

모든 문: 자유 산문으로 들어옴, required picker 없음, 로컬 쓰기 먼저,
프라이버시는 코드로 집행(코드가 못 닿는 곳은 아빠의 기록된 결정).
폰은 office 엔진의 클라이언트 — 캡처는 안으로 흐르고,
밖으로 publish 되는 건 없음. Face ID 가 지키고, 파일은 저장 시 암호화.

External links

Exercise

다섯 번째 문이 제안됐어. 클립한 페이지를 저장하기 전에 required 드롭다운에서 crumb type 을 고르게 하고, 본문을 클라우드 가독성 서비스로 보내는 웹 클리퍼. 문 계약 네 규칙 중 어느 두 개를 어기는지 짚고, 받아들일 수 있게 하는 가장 작은 변경을 말해봐.
Hint
required picker 없음을 어겨 — 드롭다운은 아빠한테 taxonomy 를 조작시키고, 구조는 Pippa 의 일이야. 그리고 코드-집행 프라이버시를 어겨 — 제3자가 텍스트를 머신 밖으로 가져가지. 받아들일 수 있는 모양: picker 없이 클립하고, 로컬에 먼저 쓰고, 정리는 기기나 office 엔진에서 해. 남의 서버는 절대로.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.