Production measurement preparation — 2026-09-20
Source history capture and the warehouse archive are now installed. Canonical feed exposure collection and experimental personalization remain disabled. These changes prepare observation; they do not deploy a ranking model or establish reader uplift.
Executed and verified
| Component | Evidence |
|---|---|
| World-family history | Source trigger installed; 18,800 baseline mappings reconciled with zero missing/mismatched mappings. 189 bounded calls, maximum observed call 121 ms. Observation time is never backdated to world creation. |
| Measurement source schema | Event/erasure tables, durable known-story ledger, coverage marker, capture triggers and interval columns installed. Schema-only transaction completed in 114 ms. |
| Historical known-story backfill | 97,368 Library rows and 152,150 session rows traversed in 251 transactions of at most 1,000 raw rows. Maximum observed batch 1,056 ms. |
| Known-story reconciliation | 164,162 ledger keys across 26,773 accounts; all surviving expected keys present and none with a later first-known timestamp than source evidence. Updates preserving earlier timestamps mean write operations are not a unique-key count. |
| Source publication | Existing yumina_admin_analytics extended from 17 to 19 members in 49 ms; all other member definitions preserved. Both new tables and the interval's three additional columns are explicitly allowlisted. |
| Replication permissions | Existing yumina_analytics_cdc has the exact required 27 data columns across the three affected tables plus ctid snapshot access. No new role or broad future-table grant. |
| Warehouse | Migration 008 applied through yumina_discovery_migrator: ID-keyed event archive, permanent erasure markers and filtered consumer view. All three were empty after installation. Runtime importer already has database-scoped SELECT/INSERT; migration identity retains only its narrow DDL grants. |
The original combined installer attempted its full historical scan under a two-second production statement limit, timed out and rolled back. The corrected installer commits schema/triggers without that scan. The separate backfill preserves earliest evidence, excludes erased accounts, uses a dedicated connection and commits every bounded batch before reporting its cursor. Both use 250 ms lock and two-second statement limits. No longer timeout was used to force the combined migration through.
Continuous history coverage starts at the database-recorded trigger-install time. It cannot recover already-deleted histories or make older unknown histories complete. The ledger is available to the current rollback code through additive tables/triggers, but canonical exposure receipts still need the new application release and cursor route.
ClickPipe configuration still required
The existing yumina-admin-analytics ClickPipe was Running with seventeen table mappings. Its installed Cloud connector exposes read-only management operations; the separate SQL migration identity cannot edit ClickPipe configuration. The user was given this single console step after the source/publication/grants were ready:
| Add source | Destination | Sorting key |
|---|---|---|
public.discovery_events | yumina_raw.discovery_events | id |
public.discovery_erased_actors | yumina_raw.discovery_erased_actors | actor_id |
Keep the existing seventeen mappings and select all columns of the two new source tables. Save/resume the existing pipe. Verify the new raw tables, keys, version and delete markers, then reconcile immutable source IDs before enabling archive import. Do not replace existing mappings or create a second owner of the same raw facts.
The existing interval mapping excludes no columns. The actual raw interval table now contains session_id Nullable(String), received_at Nullable(DateTime64(6)) and consumer_eligible Nullable(Bool), confirming schema propagation. The discovery exporter reads these columns directly from the raw table, so the existing general analytics view needs no change. Legacy rows with missing fields remain explicitly excluded and counted; column presence alone does not establish complete receipts. ClickPipes documents automatic propagation after a subsequent source insert/update/delete and the following sync. Official schema-change behavior.
Release gates that remain
- Integrate the follow-up patches into the local candidate based on current main; re-run exact-head checks. The expanded audit's operator-model accounting gap now has an explicit platform cost policy and durable journal. The focused suite passes 119 checks, including the full billing boundary; no invented reader account or wallet charge funds these jobs.
- Verify end-to-end source → raw → archive capture and erasure; no heartbeat alone proves completeness. Keep readiness off until these observations reconcile.
- Measure/isolate Redis and full-origin request costs before material cursor traffic. Retain raw encoding; the compact codec did not establish consistent latency gains. A subsequent bounded route probe inside Railway passed 96 HTTP checks and complete 713-family traversal. Small samples and untimed safety-audit overhead prevent a production capacity claim; first-page profiling remains open. Its temporary service, database, role and Redis keys were independently verified removed.
- Enable cursor/measurement separately from semantic personalization. The cursor path retains the incumbent scorer but changes diversity, deduplication and continuation, so it cannot be described as identical incumbent slates.
- Keep semantic personalization and onboarding off. The fresh retrieval comparison did not justify promotion. Reader experiments require trustworthy observations and real follow-up time.
No new vendor account or subscription was opened. The bounded probe used a temporary service in the existing Railway account and removed it afterward. No user messages were sent and no production feed flag or trained model was changed by these preparation steps. Local artifacts retain migration hashes, exact reconciliations and per-batch timing; committed reports contain aggregate counts only.
