chore(utilities): bump feederhub image tag → phase5-complete
Summary
Live container on nuc-mini is still `ghcr.io/jedmund/feederhub:phase4-cameras` — predates the entire Phase 5 surface plus this week's follow-ups. Bump to `phase5-complete` once the image is published.
What ships in phase5-complete
- PATCH `/api/feeders/{uid}` — display fields, location, calibration
- PUT `/api/feeders/{uid}/plan` — 8-slot schedule editor
- POST `/api/feeders/{uid}/feed-now` — manual feed
- GET `/api/feeders/{uid}/dispenses` — dispense history (missing on phase4-cameras, returns SPA HTML)
- GET / PATCH `/api/settings` — global timezone setting (missing on phase4-cameras, 404)
- kalay_uid backfill on bridge startup (feederhub MR!16)
- Camera-card Feed Now button on /feeders (feederhub MR!17)
- Auto-detect Kalay UID from DEVICE_LOG_REPORT_EVENT (feederhub MR!18)
- Timezone setting + UTC conversion at FEEDING_PLAN_SERVICE publish (feederhub MR!19)
Required before merge
Publish the image so the ansible deploy can pull it:
```bash cd ~/Developer/PetLibro/feederhub make docker-publish PUBLISH_TAG=phase5-complete ```
(`make docker-publish` checks ghcr.io login pre-flight; if it complains, `gh auth token | docker login ghcr.io -u jedmund --password-stdin` first.)
Deploy + verify
```bash ansible-playbook deploy/utilities.yml
curl https://cat.atelier.house/api/settings | jq # expect {"timezone":"America/Los_Angeles"} curl https://cat.atelier.house/api/feeders/AF0301374F9901C5B/dispenses | jq # expect days[] array, not SPA HTML ssh nuc 'docker logs feederhub | grep "bridge initialized" | tail -1' # log should include "timezone":"America/Los_Angeles" + "kalay_uids_backfilled" ```
Caveats
- Existing schedule rows under the new image will start firing at their stored HH:MM interpreted as Pacific instead of UTC. For nuc (which had `FEEDERHUB_TIMEZONE=America/Los_Angeles` set) this is the bug fix — existing schedules shift 7-8h earlier than they have been on phase4-cameras. Worth a sanity-check after deploy.