Let native clients sync attachment blobs deterministically:
- note_attachments gains sha256 (migration 0018, nullable, no backfill).
The delta feed's attachment metadata now carries size + sha256 so a
client knows exactly which blobs it already has (dedupe) and can verify
integrity after download.
- Upload accepts an optional client-supplied attachment id (multipart form
field), so a file attached offline keeps its identity across sync;
re-uploading an id the note already has is an idempotent no-op. The
server hashes the stored bytes (sha256) on upload. Download by id already
exists (owner/shared scoped).
Frontend Attachment type carries the new optional size/sha256.
(Still image-only mimes — broadening to any-file is task 1900. Blob sync
behavior is operator-verified on deploy.)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FRgehjoz7Yv8LkUfADxACm