"이미지를 못 보내면, 그거 없이 질문을 조용히 보내지 마. 그림을 잃은 질문은 다른, 틀린 질문이야."
조용한 다운그레이드 함정
이미지 처리는 텍스트보다 실패 지점이 많아: staging 실패, 해소 실패, 인코딩 실패, 업로드 실패. 이 중 하나가 깨지면, 솔깃한 '우아한' 폴백이 있어: 뭐라도 나가게 질문을 텍스트 전용으로 보내기. 견고해 보여 — 사용자가 에러 대신 답을 받으니까. 근데 이건 트랙 3 의 정직함 실패가 새 옷을 입은 거야. 사용자는 이미지에 대해 물었고; 넌 이미지가 조용히 빠진 질문을 배달했고; Pippa 는 실제로 안 물어진 질문에 답했어. 틀린 질문에 대한 확신에 찬 답이, 맞는 질문에 대한 정직한 실패보다 나빠.
전부-아니면-에러
규칙은 전부-아니면-에러야: 이미지를 포함한 턴은, aggregate 전체가 배달되거나 — 질문 이랑 이미지, 온전히 — 클라이언트가 실패를 드러내고 재시도 위해 입력 전체를 보존해. 텍스트는 가고 이미지는 버려지는 중간 경로는 없어. 이건 트랙 2 의 원자적 aggregate 를 비춰: 질문이랑 이미지가 나눌 수 없는 한 단위로 캡처됐으니, 하나로 배달도 돼야 해. 부분 배달은 부분 캡처만큼 정확히 망가뜨려.
- 성공: 질문 + 모든 이미지가 Pippa 에 닿음. 턴이 정직하게 답해짐.
- 에러: 이미지 경로에서 뭔가 실패. 드러내고, 전체 입력을 내구성 있게 지키고, 재시도 제공. 조용히 버려지는 건 없음.
- 금지: 텍스트 배달, 이미지 조용히 사라짐, 사용자 모름. 이 경로는 존재하면 안 됨.
왜 에러가 다정한 선택인가
이미지 첨부 에러를 드러내는 건 '그냥 텍스트 보내기'보다 덜 매끄러워 보이지만, 사용자를 존중하는 선택이야. 명시적 '이미지 첨부 못 함 — 재시도?' 는 사용자를 통제 안에 두고 질문을 온전히 지켜. 조용한 텍스트 전용 다운그레이드는 결정을 빼앗고 등 뒤에서 의도를 망가뜨려. 정직한 오프라인처럼, 믿음받을 작정인 클라이언트는 보이지 않는 그럴듯한 틀림보다 보이는 회복 가능한 실패를 택해. 금지 경로를 표현 불가능하게 만들어 — 이미지 경로가 실패한 뒤 텍스트를 보내는 코드 분기 없음 — 그러면 보장이 구조적으로 성립해.