The webhook no longer sends `Image`, so the card photo comes from its own
endpoint, addressed by the record id — one <img> per card, one request.
- static/expert-image.js: the route AND its query-parameter name in ONE
constant (id, confirmed by measurement; unverified in the brief), plus an
optional version token used only when the payload carries one.
- Directory card: <img src="…odoo_experts_image?id=<id>">, width/height
reserve the 72x72 box, decoding=async, eager for the first row and lazy
below it; onerror swaps in the SAME monogram a card with no photo shows,
so a failing image looks exactly like today.
- The static build-time card loses its 185 KB inline base64 photo and shows
a monogram: it is the no-JavaScript fallback, where there is no onerror to
fall back with. Page 341,345 -> 158,428 bytes.
- /freelancer-edit/: the photo block is a look, not a field (no file input),
and the whole-record save sends NO `Image` key at all.