"If you can't send the image, don't quietly send the question without it. A question that lost its picture is a different, wrong question."
The Silent Downgrade Trap
Image handling has more failure points than text: staging can fail, resolution can fail, encoding can fail, the upload can fail. When one of these breaks, there's a tempting "graceful" fallback: send the question as text-only so something goes through. It feels robust — the user gets an answer instead of an error. But it's the honesty failure from Track 3 wearing a new outfit. The user asked about an image; you delivered a question with the image silently missing; Pippa answered a question that was never actually asked. A confident answer to the wrong question is worse than an honest failure on the right one.
All-or-Error
The rule is all-or-error: for a turn that includes images, either the whole aggregate is delivered — question and images, intact — or the client surfaces a failure and preserves the whole input for retry. There is no middle path where the text goes and the image is dropped. This mirrors the atomic aggregate from Track 2: the question and its images were captured as one indivisible unit, so they must be delivered as one too. Partial delivery is exactly as corrupting as partial capture.
- Success: question + all images reach Pippa. The turn is answered honestly.
- Error: something in the image path failed. Surface it, keep the full input durable, offer retry. Nothing is silently dropped.
- Forbidden: text delivered, image quietly gone, user unaware. This path must not exist.
Why the Error Is the Kind Choice
Surfacing an image-attachment error feels less smooth than "just send the text," but it's the choice that respects the user. An explicit "couldn't attach your image — retry?" keeps them in control and keeps their question intact. A silent text-only downgrade takes the decision away and corrupts their intent behind their back. As with honest offline, the client that intends to be trusted prefers a visible, recoverable failure over an invisible, plausible wrong. Make the forbidden path unrepresentable — no code branch that sends text after the image path has failed — and the guarantee holds structurally.