Projection rollout behavior in Shield is all-or-nothing per authorized dashboard scope…
Projection rollout behavior in Shield is all-or-nothing per authorized dashboard scope: projection_readiness uses bool_and(stored_version = CURRENT_VERSION and status is not null). After deploying v2 over v1 rows, the dashboard safely falls back to legacy hydration rather than mixing versions, while the enabled cron upgrades at most 250 roots per invocation. During that interval projection-dependent queue counts can be zero and queue filtering is not applied by the fallback path, so a post-deploy manual backfill avoids a potentially long degraded UI window. Source: web/src/app/page.tsx, dashboard-load-page-query.server.ts, and dashboard-status-projection.server.ts.