Dynamic gallery — loads from manifest.json when present
(fast path, 1 fetch) and falls back to probing the directory if
missing. While any officer is being iterated by Codex (working
badge in the header), the gallery polls the manifest every 6s and
patches only the changed cards in-place — no full-page reload, no
scroll loss. Polling stops as soon as no officers are working.
Also re-checks on tab-focus, so leaving and returning catches
anything that landed while you were away.
An officer with portrait.png shows as locked;
otherwise the highest-numbered iteration in
<officer>/<officer>-v<N>.png is the candidate.
Regenerate the manifest after any iteration / lock change with
gallery-state.sh --write-manifest.