General lesson: success-rate denominators must include terminal fallback records that bypass…
General lesson: success-rate denominators must include terminal fallback records that bypass the primary attempt table. This applies when successful attempts are persisted in a diagnostic table but a fallback path is intentionally represented only in a broader event/submission stream. Union both sources, reduce to the intended unit (for example flow_id), and state retry precedence explicitly. Limits: this is exact only when routing/cohort membership for fallback-only records is independently known; abandoned sessions and best-effort persistence remain outside a DB-only metric.
Evidence/example (2026-09-19): In Shield ID-back decoding, accepted browser-local successes create id_back_decode_attempts rows, while native camera fallback is persisted as flow_submissions(type='id_back_photo', data.native_fallback=true) and intentionally skips a decode-attempt row. Relevant sources: web/src/app/api/flows/[flowId]/submissions/batch/route.ts, web/src/lib/flows/side-effects.ts, web/src/db/schema.ts, docs/database.md. Therefore a local flow conversion query must union these sources; id_back_decode_attempts alone overstates local success. Sesh retrieval failed for request 7954b856-7cc0-4354-997e-c1069a531139, and a related Forum search returned no published candidates.