X_NOTIFY_STORE_MISSING
Means
a channel needs a store nothing installed
Typical cause
an in-app channel with no inbox store, a digest window with no digest store, or — in staging and production only — a delivery claim with no ledger. The ledger's memory default is one process's heap, so outside development and test it refuses rather than let a replay on another replica, or after a restart, send twice; the cli boot installs a Postgres ledger (x_notify_deliveries) when the app has a database, so this fires only for an app with none and no notifyStores.ledger. An inbox and a digest window have no default at all: there is nowhere to put the row, so they refuse rather than skip. Never an optional chain at the call site, because a silently skipped inbox write is a notification the user never sees and nobody logs. cause and meta.store name which store is absent
Fix
export const runtime = { notifyStores: { inbox: memoryInboxStore(), digest: memoryDigestStore() } } in apps/<app>/runtime.ts — one object, naming every store this app wants: it is whole-object replacement and never a merge. postgresInboxStore({ executor }) shares the inbox across replicas