Problem
Someone attaches a 300-page PDF and asks for a summary. The file uploads, a chip appears, the answer arrives, and it’s confidently about the first forty pages. Nothing on screen ever distinguished the file being present from the file being read.
Solution
The tray is the place where the difference between attached and understood gets stated. It sits above the composer, holds one chip per item, and each chip carries four things: what it’s, what type it’s, how much of it there’s, and what state it’s in.
State runs further than upload progress. The useful sequence is uploading, extracting, ready, and the extraction step is where most of the honesty lives. A scanned PDF with no text layer uploads perfectly and contains nothing a text model can read. A spreadsheet may arrive as flattened CSV with the formulas gone. An image goes to a vision model and gets described rather than read. None of that’s visible from a filename and an icon, and all of it changes what the answer can be.
Truncation is the second honesty problem and the more damaging one. Context windows are finite, and a document larger than the budget gets cut, chunked, or retrieved from rather than read whole. Silent truncation produces an answer that’s confidently partial, which is worse than a refusal because it carries no signal. Say how much was used. Even a rough form works: forty of three hundred pages, or the first 100,000 tokens.
HAX guideline 16 covers the shape of this: convey the consequences of user actions before they happen. Attaching a file has three consequences a viewer can’t infer. It commits content to a provider, it may persist beyond this conversation, and it consumes a context budget shared with the conversation itself. The tray is the only place all three can be said at the moment they become true.
Two smaller decisions round it out. Attachments have to be removable before send, because the wrong file gets picked constantly. And their lifetime across turns has to be stated: a file attached on turn one is still in context on turn nine, the viewer rarely knows that, and it’s the difference between a follow-up that works and one answered from a document they thought they’d left behind.
Use when
The assistant accepts files, images, or documents as part of a question.
Don’t use when
The context comes from the product rather than the person, which is scoped context and needs a different treatment. A tray implies something was added and can be removed, and applying it to the ambient contents of a workspace overstates the viewer’s control.
Trade-offs
Showing extraction detail makes the interface talk about plumbing at the exact moment the viewer wants to ask a question, and most people won’t read it. Showing nothing produces the silent-truncation failure, which costs far more and surfaces much later. Chips that stay visible across every turn keep the context legible and consume composer space permanently. Persisting files makes follow-ups work and creates a retention surface that has to be explained and controlled.
Checklist
- Does a chip distinguish uploaded from extracted from ready?
- What does a scanned PDF with no text layer look like here?
- If the document exceeds the context budget, does the viewer learn how much was used?
- Can an attachment be removed before send, and after?
- Is it clear whether the file stays in context on later turns?
- Where does the file go, how long does it live, and is that said at attach time?
- What happens when extraction fails, and is that distinguishable from an empty document?
- Does the chip name the file in a way that survives two files with similar names?
- Is the drop target big enough to hit with a dragged file?
- Can a screen reader user tell what’s attached and remove it?
Compare
ChatGPT puts the chip in the composer and keeps the file available for later turns, so the attachment behaves like conversation state rather than a one-shot payload. Claude separates a per-message attachment from project-level knowledge, which makes the lifetime question explicit in the interface instead of leaving it to be inferred. Gemini reaches into Drive rather than asking for an upload, so the attached thing is a live reference to a document that can change underneath the conversation. Notion replaces attachment with an @-mention of a page, so context is addressed by name in the prompt text itself and there is no tray at all.
Related
Composer is the surface the tray sits on. Scoped context is the same problem when the material comes from the product rather than from a file the viewer chose. Context meter is where the budget the attachment consumes becomes visible. Source list is the answer-side counterpart, naming what was actually drawn from. Generation error is what a failed extraction turns into if the tray stays silent.