profile-photo.png for Google SERP Portrait Signals
The Google SERP favicon article and the live verification follow-up were about the 48×48 slot next to the blue link. Portraits are a different cache. Google stores entity photos separately. Commit 644549d added `public/profile-photo.png` so Person JSON-LD and a crawlable `<img>` point at a stable square URL, not a random Open Graph crop.
`docs/SEARCH_CONSOLE.md` is the runbook: verify production bytes, purge Cloudflare if needed, request indexing, align LinkedIn, then freeze the URL for at least a week. Favicon and portrait share “do not churn hashes,” not the same file.
`scripts/generate-profile-photo.py` reads `public/character/layers/composite-fallback.png`, fits it on a 512×512 RGB canvas with a white background, and writes `public/profile-photo.png` plus `profile-photo.variants.json` with SHA-256. Opaque fill matters — entity photos handle solid backgrounds better than alpha.