A widget shows its last composition until something asks for a new one. android:updatePeriodMillis in the provider XML lets the system wake the app, at most every 30 minutes (BookNest sets 0). update() and updateAll() are suspend calls that fit in a worker, hence the updateAll() at the end of afterSync(). Glance 234 runs each widget's session as WorkManager 234 work of its own: WorkManager's diagnostics dump (adb shell am broadcast -a androidx.work.diagnostics.REQUEST_DIAGNOSTICS -p <package>) listed a running androidx.glance.session.SessionWorker named appWidget-2.
The first version of the widget loaded its books in provideGlance(), before provideContent. After a sync at 07:17 it still said 6 books, synced 07:06: while a session is alive, an update recomposes the content but doesn't rerun provideGlance(), so data loaded there is never reread. The fix, in Glance Widgets's listing, collects Room 234 's Flow and the sync store inside provideContent. The widget then composed twice around the $15.50 sync, first from the initial empty lists, then from Room, and showed the new price (see the figure in Notifications from WorkManager):
D/BookNestWidget( 6396): composed: 0 books, synced not yet D/BookNestNet( 6396): refreshed 6 books from the network D/BookNestWidget( 6396): composed: 6 books, synced 07:37
Keep updates tied to real changes, since each wakes the app; per-instance settings belong in Glance's per-widget state (updateAppWidgetState).