- CompleteTaskAction only ever redrew TaskWidget by glanceId; since the
callback is shared with GlanceTaskWidget's rows too, and a GlanceId
doesn't say which provider it belongs to, that could push the wrong
widget's RemoteViews into the other's slot. Redraws both via
updateAll instead.
- A single-group header is now dropped only when its label would
repeat the widget's own title verbatim (e.g. the "Today" smart list
showing one "Today" bucket) rather than whenever there's just one
group — a real-list widget whose only bucket is "Tomorrow" needs
that label, since nothing else on screen says it.
- A widget's preset list, like the app's own default list, is checked
against the writable/existing list set before seeding a new task —
it can otherwise have been deleted or turned read-only since the
widget was configured.
- The "group by list" toggle is cleared on save once the selection
narrows to where its row no longer shows, instead of staying stuck
on with no way left to see or undo it.
- GlanceTaskWidget's next-task row now shares TaskWidget's due-text
logic (bare time when the day's already said), instead of always
showing the full date for a same-day due.
- Dropped Position/positionOf from WidgetSection now that rows are
standalone pills rather than WidgetGroupedRow cards — it was dead
weight computed on every redraw, and the doc comment describing the
card rendering no longer matched what's there.
- Collapsed Ready.singleListName into a lookup on singleListId rather
than a second parallel filter switch.