Feature 18: the shared coordinator's refresh pass now fetches
GET /api/v1/panel/snapshot through the NestQuestApiClient and
reconstructs the exact core dataclasses (NestQuestSnapshot,
ChildDaySnapshot, QuestInstanceView) the Feature 10 entities read, so
sensor.py and binary_sensor.py are untouched and every entity_id and
attribute payload keeps its shape.
Why: the integration becomes an API client of the NestQuest service
instead of a second reader of the SQLite file, and the panel cards and
the four blueprints keep working without changes.
- snapshot_from_api_payload maps the route's JSON back onto the
dataclasses field by field (state 'completed' -> 'done' so
instance_payload renders 'completed' again; counts, presence,
next_present, overdue, on_time, completed_at pass through verbatim;
due_date is stamped from today_iso, the only date the route serves).
- The panel payload omits missed instances (D-009), so
admin_instances can no longer carry missed rows — the admin surface
for missed quests is the PWA reading the API directly. Documented in
the module docstring and pinned by tests.
- An unconfigured panel token (the shipped default) gets a typed-error
stub instead of a construction crash: setup succeeds, the first
refresh fails cleanly, entities come up unavailable and HA's retry
cycle applies. Fetch failures log the typed error and mark the
entities unavailable while data keeps its last good snapshot.
- The runtime record registers before the first refresh so the refresh
path always finds the live entry state; the update interval and the
serialized forced-refresh behaviour are unchanged.
- Tests: a fixture snapshot drives the coordinator (stub client, no
network) asserting per-child values, household rollups, cycle day,
and the exact instance payload shape, plus unconfigured and
failed-fetch cases; DB-seeded tests ride a lazy local-snapshot
client through the same JSON path.
One fixture drives every Feature 10 contract: all per-child sensors
and binary sensors, household rollups, the 255-character limit,
the three events exactly once with schema-valid payloads, the
missed-instance omission rule, and no entities for inactive children.