The admin plane could reverse nothing and re-materialize nothing: a
mis-tapped completion could only be fixed by hand in the database, and
a config or presence change left the household's rolling horizon
stale until the integration itself regenerated it.
- POST /api/v1/admin/instances/{id}/uncomplete appends the reversal
through core uncomplete_instance (actor_source 'user' with the
verified JWT's sub — D-008), so the original completed row is never
edited or deleted and the derived state returns to open. An actual
reversal publishes the quest-uncompleted transition via the existing
api.transitions helper; an already-open no-op publishes nothing and
still answers with the honest derived state (open, or missed when
past due).
- POST /api/v1/admin/regenerate re-materializes the rolling horizon
through the same core path the integration uses: household (default)
= materialize over [today, today + const.DEFAULT_HORIZON_DAYS] (the
API config supplies no horizon knob), definition/child =
regenerate_for_definition / regenerate_for_child after ONE DAO
existence read each (unknown id -> 404, which the core's regenerate
path itself does not check). The walk is idempotent, so re-running
never duplicates an instance.
Both handlers are thin adapters: Pydantic models carry the request
shape (scope/id pairing is the model's job), the business rules stay
in core, and the error mapping stays narrow — unknown
instance/definition/child 404, rejected argument 422, anything else
re-raises.
HA event triggers expose the payload as trigger.event.data, not
trigger.payload; fix the blueprint, its tests, and the README
examples, with a regression guard.
README gains the blueprint section: all four blueprints, their
inputs, the wiring table to the options-flow notification settings,
the celebration helper setup, event/sensor payload reference, and a
copy-pasteable example package. Tests assert every event trigger
references a real NestQuest event and no reminder is produced for an
absent child.
Child ids sharing a prefix no longer suppress each other (split and
compare entries for equality), and queued mode keeps a second child's
day-complete event from being dropped while the first notify runs.
Triggers on nestquest_child_day_complete (never a zero-quest day),
notifies with the payload's child name, and dedupes per child per
day via an input_text helper holding <child_id>:<today> entries
pruned to today — a re-cleared day does not re-fire, but a second
child clearing the same day still celebrates.
A missing or non-numeric remaining sensor reads as -1 in the
all-clear guard, so a degraded day reaches the parent instead of
looking like a clear day.
Defaults to 20:00 local — deliberately before the midnight missed
sweep, reading the same day's data. Every present child gets a
completion line; owed lines name still-open quests; absent children
are omitted; nothing sends when all clear unless opted in.
The modern HA action schema passes title and message to the notify
service only under data; fix the morning summary and afternoon
reminder blueprints and the test accessors accordingly.