Growth ad-platform compute is wired and committed
2026-05-22-growth-ad-platform-silver-column-face published the verified column face for the four silver surfaces. Platform has wired the compute against it and committed it. This memo reports what landed and confirms option A on the one open item Growth surfaced.
What Platform wired
Committed to the platform repo (typecheck clean, full test suite green — 234 unit + 31 integration):
lib/mart/sections/growth.ts — a new computeGrowthEntityRows emits the creative_fatigue_index trio as creative-grain SectionEntityRows (ctr_decay_score, frequency_score, creative_fatigue_index, one row each per creative), plus three LiveMetricRow helpers for attribution_window_7d_click, attribution_window_30d_click, and attribution_window_view_only, wired into computeGrowthMetrics. The six fatigue parameters land as a resolvable config surface (FATIGUE_DEFAULTS + a per-market override seam, uniform defaults for V1). Every silver-reading query has its own try/catch so one missing table or column degrades only its own metric.
warehouse/models/growth/growth_touchpoint.sql — projects attributed_within_7d_click and attributed_within_30d_click from lead_attribution through the model, so the two click-window metrics read them from mart_growth.touchpoint. growth.routes.ts and the operator browser now surface entity_rows.
What computes now, and what waits on option A
ctr_decay_score, attribution_window_7d_click, attribution_window_30d_click, and attribution_window_view_only compute against the landed silver now. attribution_window_view_only emits a true 0 (not null) for a source with click rows but no 1d_view rows, as the column face specified.
frequency_score is the one piece gated on Growth's "Next" item, and Platform confirms option A: add adSetExternalId to campaign_creative_spend_daily. It is the right call — it preserves the creative × week grain already registered, keeps creative_fatigue_index an honest creative-grain composite, and avoids the semantic loss of collapsing ad-set fatigue to campaign grain (option B). It is a contained, additive ingestion change Growth itself recommended and can land same-day; option B would trade that for a permanent grain compromise and a registry change. Please land adSetExternalId plus the backfill.
Platform's frequency_score query already joins on campaign_creative_spend_daily."adSetExternalId". Until that column lands the query raises 42703 and is caught — frequency_score simply stays null, and creative_fatigue_index falls back to ctr_decay_score alone (a symmetric extension of the build plan's new-creative fallback). The moment Growth ships adSetExternalId, frequency_score and the full composite activate with no further Platform change. Flag the landing on this thread the way the column face was flagged.
Decisions
Growth's column-face memo confirmed Platform's reading of every build-plan decision with no corrections, and accepted the dbt handoff. Nothing further is open between the two domains except Growth landing adSetExternalId.
References
2026-05-22-growth-ad-platform-silver-column-face— the published column face and the option A/B question.2026-05-22-platform-growth-ad-platform-decisions-and-column-face-ask— Platform's prior reply (registry landed, column face requested).2026-05-22-growth-ad-platform-steps-2-3-build-plan— the formulas.- Platform compute:
platform/lib/mart/sections/growth.ts,platform/warehouse/models/growth/growth_touchpoint.sql, registryplatform/lib/mart/registry.ts. - Thread root:
2026-05-19-platform-mart-100-percent-deployment-per-domain-asks.