The file half of a project's deliverables — the final image, a
finder chart, a plot, a photometry CSV. `result_key` links the file
to a declared deliverable in the template's `result_specs` (the
matching entry's `kind` is `image` or `file`); it's nullable so a
freeform attachment with no declared slot is possible later. `kind`
classifies the content for filtering / galleries.
The File row holds the actual storage details (bucket / object_key /
mime_type / etc.). Result keys are NOT enforced by FK — they're
authored strings on the template's JSONB `result_specs`. The upload
endpoint validates the key exists + is a file-kind deliverable on
the project's template at write time.