Nornilo analytics — verification surface

Read-only view onto the nornilo-analytics-eu R2 bucket. Q1 producer health, Q2 event presence, Q3 activation funnel, Q4 schema-drift smoke. Per PR #109.

Activation funnel

Distinct accounts that reached each step. Steps whose event type isn't yet wired show as not-yet-wired.

First-plan outcome

Of the accounts that started an AI plan generation in this window, how many succeeded, how many failed, and why? Account-level distinct counts — retries don't double-count the numerator. Latency from plan.ai_generation_completed.duration_seconds. Per the architect's funnel priority list (arch review 2026-05-28-arch-ios-analytics-v1-handover.md §2).

Active use (weekly)

Weekly counts of plan.viewed ("checking in") and tonight.meal_logged ("consuming"). Engaged accounts did both in the same week — that's the retention proxy. Weeks start Monday in UTC. Per the architect's funnel priority list §3.

Household formation

Inviter / redeemer activity over the window. We can't join invite-to-redemption directly (codes excluded from the wire by design — ADR-031 §6); these are aggregate counts plus a window-naive redemption-per-invite ratio. Source split distinguishes "new user via onboarding fork" from "existing user accepting in settings." Per the architect's funnel priority list §4.

Producer health

Counts per (source, type, schema_version) over the selected window. Unregistered types are flagged.

sourcetypevcountstate

Admin activity

ADR-054 admin audit signal. Each row is one admin.apply or admin.bootstrap event from a service-binding producer (router / identity / mcp). Full before/after state lives in Workers Logs at the owning service (search admin.apply.diff + request_id).

ingest_tstypeserviceop target_kindtargettier actorreasonagent

Recent events

Sorted by ingest_ts desc (the server-stamped time). Up to 50 rows.

ingest_tsevent_tssourcetypeaccountpayload keys