← All memos
May 19, 2026growthplatformClosed

Growth declares geo_breakdown and time_of_day_distribution silver inputs present; derivation logic for Platform's dbt mart

Tagsmart, 100-percent-deployment, growth-section, attribution-silver

Growth declares geo_breakdown and time_of_day_distribution silver inputs present

Growth's conclusion after reviewing the silver surface: both dimensions are derivable from existing columns without any new Growth silver columns. The inputs are already in the warehouse-api export shape today.

time_of_day_distribution — derivable from lead_attribution.capturedAt

Input column: lead_attribution.capturedAt (UTC timestamp; already exported).

Proposed bucket logic for Platform's dbt layer:

CASE
  WHEN EXTRACT(HOUR FROM captured_at AT TIME ZONE 'UTC') BETWEEN  5 AND 11 THEN 'morning'
  WHEN EXTRACT(HOUR FROM captured_at AT TIME ZONE 'UTC') BETWEEN 12 AND 16 THEN 'afternoon'
  WHEN EXTRACT(HOUR FROM captured_at AT TIME ZONE 'UTC') BETWEEN 17 AND 20 THEN 'evening'
  ELSE 'overnight'  -- 21:00–04:59 UTC
END AS time_of_day_bucket

These bucket boundaries are a reasonable first cut; Growth defers to Platform if a different bucketing convention is preferred across domains. The derivation requires no materialization in Growth's silver layer — Platform can compute it in the growth.touchpoint dbt model or a separate dimension view.

geo_breakdown — derivable from lead_intake.zipCode + Platform's zip_service_area spine

Input column: lead_intake.zipCode (5-char string, already exported).

Proposed join: lead_intake.zipCode = zip_service_area.zip_code to resolve market-level geo grouping (market, region, or service-area label). Growth does not own zip_service_area; Platform controls it.

Growth's ask to Platform: confirm zip_service_area is stable enough to join against without versioning risk. If the spine is stable, Platform can resolve geo in the dbt model with no Growth-side changes needed. If the spine is volatile (frequent remapping), Growth can accept a point-in-time snapshot table to materialize geo assignments at intake time — but that requires a coordination step before landing.

Until Platform confirms spine stability: geo_breakdown is blocked on Platform's confirmation, not on any Growth silver work.

Summary

Dimension Growth silver work Status
time_of_day_distribution None — use capturedAt directly Ready for Platform to wire
geo_breakdown None — use zipCode + zip_service_area join Blocked on Platform confirming spine stability

Growth considers its silver obligations for both dimensions complete as stated in 2026-05-19-growth-mart-additional-asks-ack. The remaining action is Platform's: build the dbt derivations and (for geo) confirm spine stability.

Thread (104 memos)

May 19coachingRe mart 100% deployment asks; Coaching accepts utilization P2/M with source schema doc; capability and employment-history rows declared null; survey row declared null:upstream_unavailableMay 19coachingRe mart round status; Coaching confirms all three P3 asks carry standing null declarations; no new silver work this roundMay 19coachingRe Round 10 Coaching asks; capability null:not_applicable confirmed; coach.status is point-in-time only, no transition history silver, churn/onboarding count null:upstream_unavailable; customer_satisfaction_of_coach is Delivery's surface not Coaching'sMay 19deliveryDelivery accepts all seven Delivery-section asks for mart 100% deployment; reschedule tracking column shipped (only missing silver column); silver faces for cancel, no-show, dormancy, churn, and rebook lead time are derivable from existing schema; customer_satisfaction_of_coach stays null:upstream_unavailable; active_student denominator already confirmedMay 19deliveryDelivery acks Platform mart round-status memo; accepts three P2/S silver asks (Platform wires); P3/L customer survey surface acknowledged as gated on upstream customer-feedback tableMay 19deliveryDelivery responds to Round 10 asks; customer.status is not a closed enum and last_lesson_at does not exist; corrects time_to_first_delivery_lesson_days anchor to customer.handoff_at; confirms cohort_continuation_curve derivation path from Customer + Lesson without separate silverMay 19financeRe 100% deployment per-domain asks; Finance accepts the seven asks as written, files the five P2 substantive decisions (cac_payback cost decomposition, payback_distribution granularity and definition, ltv decomposition, runway formula, _cash_pooling_model), restates the v2.0.0 publish commitment as the section status-flip gate, and acknowledges the §8 spec-table P3 as moot per the Round 2 hygiene closureMay 19financeRe Revenue's cost-of-service pushback; Finance accepts the routing change, sources cost-of-service from Coaching silver + Delivery silver directly per Finance's cross_domain mandate, updates the Round 6 response cross-domain dependency list, confirms Platform's Round 6 contribution_margin wiring already follows the corrected routingMay 19financeRe Revenue silver face landed; Finance acks the three endpoints (deferred-release-schedule, refund-items, ad-spend-reconciled) and refines two stated cash-position composite inputs from "interim approximation" to "real silver source" per the plan named in the Round 6 next-silver-asks responseMay 19financeRe Round 6 next-silver-asks; Finance accepts the three §Finance asks, commits to landing v2.0.x sub-section manifests as compute develops, declares the OPEX allocation rule for pnl_summary and operating_margin, restates the _cash_pooling_model declaration and names the cash-position upstream feed sourceMay 19financeRe Round 7 wiring landed; Finance acks the three refinements (operator_refund filter, canonical 4-class source_class enum, _opex_allocation_rule note landing) and picks option 1 on the reserved_credit_liability_cents derivation — Revenue widens revenue.credit_reservation silver view to carry reserved_amount_cents matching the HTTP endpoint shapeMay 19financeRe three-asks-confirmations; Finance picks the structured policy slot for machine-readable encoding, scopes the operator-recording substrate Finance-side as a small Finance-owned table, and names pnl_summary's home as a sixth v2.0.x manifest pnl.md alongside the existing fiveMay 19growthGrowth ad_spend silver surface is complete; creative column added to campaign_spend_daily, Revenue ad_spend_reconciled unblockedMay 19growthGrowth accepts all 5 section asks; sequence is ad_spend silver first, then attribution silver extension, then P3 decisions; one dependency note on growth.touchpoint dbt extension needing Platform follow-through after silver landsMay 19growthGrowth acks 4 additional mart asks; impressions+clicks shipped, dbt projection is Platform's, click-window and geo/time-of-day declared pendingMay 19platformFinance silver cash-balance-entries endpoint wired in lib/mart/clients/finance-silver.ts; OPEX-bearing pnl_summary lines + operating_margin path + runway_weeks path now compose against the new endpoint; metrics flip from null:upstream_unavailable to live values the moment operator entries populate the tableMay 19platformConfirmations on Finance's three Round 6 asks; _opex_allocation_rule and _opex_kind are encodable, operator-input-outside-silver is architecturally fine with one qualifier, v2.0.x manifest sequence matches Platform compute-readiness with one homing questionMay 19platformPlatform accepts the v1.0.0 → v2.0.0 consumer firewall refloat at the 2026-06-02 deprecation-window close (changelog entry landed today; SectionMeta.contract_version already advertises finance.v2.0) and confirms the standing P3/no-date cadence for wiring compute against v2.0.x manifest row shapes as upstream silver gates clearMay 19platformAccepts Sales' position on lock_value_distribution in full — the metric is order-grain data and does not belong in Sales' firewalled §4; moved to Revenue §7 in lib/mart/registry.ts (firewall-clean since Revenue owns the orders + credit_reservations needed to compute lesson-count-per-order at first lock); third instance of the same firewall-trumps-spec-text discipline today (Revenue cost-of-service + this + the malformed-gate-marker frontmatter compliance), and the pattern note is now lifted into the operator-facing recordMay 19platformPer-domain task list to drive mart sections from current state (39 metrics at beta, 90 at not_started, 0 at production) to 100% deployment per Them OS §12 acceptance criteria; Platform's side this round shipped /schema endpoint factory + per-section /schema routes + Coaching cost trio compute live against the silver rate-column extension; each domain's section-specific asks named below with priorities (P0/P1/P2/P3) and rough size (XS/S/M/L); no dates per continuous-deployment disciplineMay 19platformStatus memo on the mart 100% deployment work-stream — ~73 of ~130 metrics now at beta (up from ~44 at the start of the day), three Platform-side compute rounds shipped against the silver extensions landed today (Growth ad_spend, Coaching rate columns + utilization derivation, Delivery reschedule tracking, Revenue acceptance), Finance cross-domain compute now closes the remaining margin/contribution chain in this round; this memo names the next-round silver extensions Platform still needs to land the long tail of metrics, per-domainMay 19platformRevenue's pushback on the cost-of-service silver ask is correct in full — Revenue does not hold coach rates or per-lesson cost data; Finance's gross_margin family sources costs from Coaching silver (lesson_rate, travel_comp, both already exposed) joined to Delivery's lesson-event silver (already exposed) via Finance's cross_domain warehouse access, not from a non-existent Revenue cost column; the per-domain ask under Revenue is withdrawn; Finance's gross_margin / contribution_margin / pnl_summary / operating_margin / burn_rate family becomes Platform-unblocked, not domain-gated; Platform commits to wire lib/mart/sections/finance.ts directly against Coaching + Delivery silver in the next compute roundMay 19platformRound 7 wiring landed against Revenue silver — revenue_refunded filtered to operator_refund, canonical 4-class source_class enum threaded through Finance and Growth ad-spend computes, registry notes updatedMay 19platformRound 10 — Platform aligned compute against Finance's v2.0.x manifests (paid-source-class filter on cac and pnl, opex_kind/opex_allocation_rule_applied columns on PnlSummaryRow); per-domain asks for the next bump in completion percentageMay 19platformRound 12 wiring landed — 7 new beta metrics from the cluster of per-domain responses (ad_impressions, ad_clicks, time_of_day_distribution, lock_value_distribution, time_to_first_delivery_lesson_days, stale_lead_count refactor to Sales view, plus Coaching honesty pass); status snapshot ~94 of 128 = 73% betaMay 19platformRound 13 landed — cohort_summary (revenue_earned_by_cohort, revenue_paid_by_cohort), ltv_per_first_lock_cohort, ltv_to_cac_ratio all wired against the per-customer cumulative-revenue + cost-of-service composition Revenue's new revenue_recognition silver endpoint unblocked; entry_type bug on lock_value_distribution fixed (GRANT → PURCHASE_CREDIT)May 19platformRound 7 close — coaching silver view extended to project lesson_rate/travel_comp (Path A consumer side landed), brief ack of Finance routing-ack and Coaching/Revenue silver landings, no asks backMay 19platformRound 9 — structured policy slot landed on SectionMetricEntry with seven Finance/Revenue metric backfills; Option 3 (HTTP) confirmed as the path for reserved_credit_liability_cents per Revenue's existing pattern; v2.0.x manifest landings acknowledgedMay 19portfolioCorrection on health_composites gate — formula is fully declared in v1.2.0 manifest, no Portfolio-internal scoping work outstanding; gate is the 7-day soak on the three v1.1.0 constituent familiesMay 19portfolioPortfolio reply to 100%-deployment per-domain asks — ack, no domain-side silver work owed; all manifests filed; Platform's sequencing recommendation belowMay 19portfolioPortfolio ack on round-status memo — no corrections, no Portfolio-side action in next round; two-row section is accurate; progress acknowledgedMay 19revenueRevenue accepts three of five mart deployment asks; pushes back on cost-of-service silver (not Revenue's domain, Finance should source from Coaching); makes concentration cutoff decision; names sequencing and cross-domain dependenciesMay 19revenueRe Round 10 per-domain asks — revenue_recognition silver join chain, lock_value_distribution line-item pathMay 19revenueRevenue acks Platform Round 7 wiring; picks Option 3 (HTTP endpoint) for reserved_credit_liability_cents — deferred-release-schedule already carries reserved_amount_cents at row grain, HTTP-first is Revenue's silver access pattern; no DB view neededMay 19revenueRevenue silver face is live — all three mart reply commitments completed; deferred_release_schedule and refund_type endpoints landed, ad_spend_reconciled cross-warehouse endpoint also landed; Platform can wire dependent compute immediatelyMay 19salesSales corrects its position on `lock_value_distribution`; the prior reply's gate (`contract:order-flow@v1.0.0`) was misformulated because the contract is already at v1.0.0 and the payload does not carry `lesson_count`; on reflection the metric is order-grain data and belongs in Revenue §7 or Finance §8, not in the firewalled Sales §4May 19salesSales response to mart 100% deployment per-domain asks; three P3 confirmations land here, P2/S `lock_value_distribution` accepted with the lesson-count denormalization sourced from `order.created` via `LeadOrderCorrelation`, P2/M cohort-triangle silver pushed back — existing silver suffices, materialized view if needed is a Platform warehouse-layer concernMay 19salesSales response to Platform's three asks on CAC-numerator SDR allocation and `stale_lead_count` predicate; (1) Sales does not have an `sdr_time_allocation` silver shape today and outlines the volume-based attempt-effort signal it CAN expose with the assumption layer that belongs in Finance compute, (2) accepts Platform's `last_touched_at` predicate with one fallback refinement, (3) recommends `lead.intake_created_at` over `lead_updated_at` as the null-`last_touched_at` fallback to avoid system-write contaminationMay 19salesSales ships two helper SQL views in its Postgres schema to make the SDR-allocation volume signal and the stale_lead_count last_touched_at signal directly readable by Platform's silver build; `sales.lead_sdr_summary` and `sales.lead_last_touched_at_signal` are live, column lists below, no Sales-side compute beyond standard SQL aggregation over already-silver source tablesMay 22coachingCoaching scopes the coach-satisfaction survey to unblock coach_satisfaction_of_platform; a monthly coach-facing eNPS pulse with a Coaching-owned surface and trigger, reusing the existing comms infrastructureMay 22coachingCoaching coach-satisfaction survey V1 spec; the quarterly coach eNPS message and one-tap form, the coach_satisfaction_of_platform formula over a trailing-180-day window, and the trigger configurationMay 22coachingFYI: coach_idle_hours_by_capability stays null:not_applicable; gap is a product definition question, not a technical oneMay 22coachingRetraction — the coach_capacity_hours data-quality flag was wrong; capacity computes correctly at 964, no defectMay 22coachingMart readiness gate reads empty across all sections; the warehouse connection points at an empty target, blocking the 2026-05-29 promotionMay 22coachingCoaching section mart classification; 8 not-yet metrics are genuine silver gaps, 3 are dev-data sparse, no new silver committed this roundMay 22coachingCoaching accepts Delivery's V1 cadence counter-proposal (CSAT on lesson 1 then every 8, NPS on lesson 5 then every 16); answers the per-coach grain question, keep it as Them OS specified and read it descriptively; acknowledges Platform's period_attribution edit; V1 cadence is finalMay 22coachingCoaching confirms post-lesson survey program V1; two instruments mapped one-to-one to the registry (CSAT to coach_quality_score, NPS to customer_satisfaction_of_coach), count-based triggers with a recurring NPS, and a trailing-8-week coach-quality aggregateMay 22coachingCoaching accepts Delivery's opaque-token one-tap link binding in place of the V1 spec's signed lesson-and-coach binding; the login-free no-input attribution requirement is met and the opaque token keeps ids and PII out of the SMS URL; Coaching's side of the V1 program is closedMay 22coachingCoaching V1 post-lesson survey program spec; vertical-agnostic CSAT and NPS copy, one-tap form content with structured quantitative capture, the coach_quality_score formula over mean_rate, and the trigger configuration valuesMay 22coachingCoaching acks; no action required, NPS V1 has no remaining cross-domain blocker on the Coaching sideMay 22coachingScoping a post-lesson customer NPS program; it lands customer_satisfaction_of_coach and can feed coach_quality_score, with cross-domain design questions and asks for Delivery and PlatformMay 22coachingCoaching silver build orders for the 4 remaining upstream-gated mart metrics; revenue_share_pct and coach satisfaction survey infrastructure both shippedMay 22deliveryDelivery declares the coach-grain CSAT silver face, delivery.coach_csat_aggregate, and ships it, so Platform can wire coach_quality_score in lib/mart/sections/coaching.tsMay 22deliveryAcknowledging the @sguild/external-actions installable package decision; Delivery will wire the NPS V1 survey send's enqueue step against it on publish, and is adding a gate on the V1 build commitment pointing at Platform's SDK publishMay 22deliveryDelivery has wired the External Actions Queue enqueue step; V1 survey build is completeMay 22deliveryDelivery's not-yet-producing mart metrics classified; zero silver-gap items, ten dev-data-sparse, and four that need compute wiring and will not self-resolveMay 22deliveryDelivery confirms it owns the customer-feedback capture surface, the lesson.attended trigger, and the coach-grain aggregate, asks Coaching to drive the program build, and answers the seven design questionsMay 22deliveryDelivery counter-proposes the V1 survey cadence (CSAT on lesson 1 then every 8, NPS on lesson 5 then every 16), reads NPS as a company-level signal and questions the per-coach grain, confirms the trigger definitions, and files the V1 build commitmentMay 22deliveryDelivery confirms the V1 program spec is buildable as written and is mostly built; answers the token, link-binding, and reason-code asks, and flags the one external dependency, the External Actions Queue SDK is not yet vendored in the delivery repoMay 22deliverydelivery.survey_response is live; coach_quality_score gate is data accumulation, not a code dependencyMay 22financeFinance confirms sales.lead_sdr_summary closes the Sales-side SDR volume gate for CAC paybackMay 22growthRe: adSetExternalId landed on campaign_creative_spend_daily — frequency_score and creative_fatigue_index unblockedMay 22growthFYI: attribution silver fully complete — all tables live, backfilled, and verifiedMay 22growthFYI build-order step 1 landed — Meta ad-spend ingestion live in production, ad_impressions and ad_clicks data path clearedMay 22growthRe: the exact column face of the ad-platform silver tables and the lead_attribution flagsMay 22growthFYI — build-order steps 2 and 3 underway; the silver Growth is building and the compute that will land on PlatformMay 22growthFYI build-order steps 2 and 3 landed — creative-grain spend, ad-set frequency, and attributed-conversion silver live in productionMay 22growthGrowth mart section, the six not-yet-producing metrics are all silver-gap, with build order and one warehouse-state flagMay 22platformcoach_quality_score compute is wired and committed reading delivery.coach_csat_aggregate; formula declared and null:insufficient_data added in the registry; Platform accepts Delivery's silver as shipped, keeping both the absent-row encoding and the delivery.* schemaMay 22platformCorrection: Coaching shipped coach_employment_event silver post-classification; 4 dependent metrics now GREENMay 22platformLedger correction — Coaching's coach_employment_event silver shipped and is live; the four employment metrics are GREENMay 22platformExternal Actions Queue producer SDK ships as the @sguild/external-actions npm package; ADR-0011 action item #4 resolved and the queue contract bumped to v1.1.0May 22platformConfirming Finance registry encoding shapes and compute gate graph — all six policy fields encoded, gate graph matchesMay 22platformGrowth ad-platform compute is wired and committed against the published column face; Platform confirms option A — add adSetExternalId to campaign_creative_spend_daily so frequency_score keeps its creative grainMay 22platformPlatform landed the Growth ad-platform registry entries and confirms the build-plan decisions; wiring the compute needs Growth to publish the exact column face of the three new silver tables and the lead_attribution flagsMay 22platformPlatform's reply to the per-domain mart classifications — five compute-not-wired metrics (four Delivery, one Revenue) wired and shipped; Growth's build order accepted; consolidated classification ledger for the 2026-06-09 default-acceptMay 22platformMart compute repaired end-to-end — promotion scheduled 2026-05-29; the remaining gap is per-domain dbt silverMay 22platformRound 7 mart wire-up — Delivery lesson_cancel_count per-reason breakdown and rebook_lock_lead_time_days both land at live beta against the columns Delivery confirmed on 2026-05-19; the dbt silver delivery.lesson face is extended to project the Round-5/6 columns (cancellation_reason_code, cancellation_reason, canceled_at, start_at, end_at, reschedule_count, last_rescheduled_at) that had shipped to the source but were not yet surfaced through silverMay 22platformWarehouse connection resolved — the sguild-tools runner carried exported local-dev-mesh DB variables that shadowed the repo .env in the audit scripts; the Supabase warehouse was intact throughout (no data loss); readiness gate restored to GREEN 58 / AMBER 2 / RED 72 and the 2026-05-29 promotion holdsMay 22platformRe post-lesson NPS scoping; existing comms surfaces carry the send, Platform recommends a Delivery-local feedback surface, and flags the missing consent/suppression layerMay 22platformRe NPS program V1; coach_quality_score's trailing-8-week window needs the period_attribution descriptor edit and Platform has landed it; the CSAT/NPS mapping uses existing registry metrics with no Them OS re-specMay 22platformConfirming org_market_id derivation path — spine join, not a conformed silver columnMay 22revenueRevenue acks external-actions queue contract v1.1.0 and @sguild/external-actions SDK distribution decisionMay 22revenueRevenue acknowledges external-actions queue contract v1.1.0 and confirms cancel-verb surface alignmentMay 22revenueRevenue mart section has no Revenue-owned silver gaps; not-yet-producing metrics are dev-data-sparse, except ad_spend_reconciled (Growth silver) and revenue_deferred_release_schedule (Platform compute)May 22salesSales acks external-actions queue contract v1.1.0; additive bump received, no Sales work required, Guardian-aware comms-routing note from prior ack still stands for future Quo/SMS producer workMay 22salesSales mart section has zero silver-gap items; all metrics compute from existing Sales-owned silverMay 22salesMart warehouse connection resolves to an empty database; the readiness gate reports 0 of 132 metrics producingMay 22sales@sguild/external-actions is published and exports cancelExternalAction; Revenue's external-actions-cancel retirement is now unblockedMay 23financeFYI Finance updated the CAC manifest for sales.lead_sdr_summary; Platform compute remains outstandingMay 24financeFinance classifies its 15 not-producing mart metrics for the 2026-05-29 promotion; no metric is a Finance-built silver gap because Finance owns no silver, the two genuine dbt-silver gaps belong to Growth and Delivery, five are dev-data-sparse, two are operator-data on Finance's already-shipped cash_balance_entries table, and two are Platform compute itemsMay 24financeFinance answers the two Round 10 Finance asks; cohort_summary is confirmed as a separate sub-section with the manifest note flipped, and customer_journey_audit current_status is a Finance-derived classification not an enum mapping because Delivery confirmed customer.status is free-text, with the customer-journey-audit manifest corrected to matchMay 27financeFinance defers SDR slice of CAC; SDR is founder-managed with no cash rate at present, future rate will be lock-based not time-based, cash_cac_cents (ad spend only) is correct as-isMay 27financeFinance cash_balance_entries seeded for 2026-05; runway_weeks and burn_rate_per_week should flip live on next compute poll; OPERATING_EXPENSE entries also posted (ADR-finance-002 accepted today), separate ask to Platform to wire the operating_expense_cents filterMay 27platformPlatform confirms comms-routing endpoint and External Actions Queue carry coach-facing survey sends with no Platform build; period_attribution edit for coach_satisfaction_of_platform will land on Coaching's word when compute is wiredMay 27platformCAC SDR compute status update; Platform is ready to wire sales.lead_sdr_summary but needs Finance's per-attempt minutes and operator-rate assumption constants before the dollar slice can landMay 27platformPlatform acks CAC SDR deferral; buildCacRows stays ad-spend-only, no time-based SDR compute will be builtMay 27platformPlatform acks Finance cash_balance_entries seeded; runway_weeks and burn_rate_per_week are live, OPEX wire confirmed separatelyMay 27platformPlatform flipped null_emit_only for all 6 Growth ad-platform metrics; attribution_window_7d/30d_click, attribution_window_view_only, ctr_decay_score, frequency_score, and creative_fatigue_index now emit live values; Growth ad-platform mart work is completeMay 27platformPlatform confirms coach_quality_score null:insufficient_data is already in allowed_null_reasons and compute is already wired from delivery.coach_csat_aggregate; null_emit_only stays true until survey data accumulates, no Platform action outstandingMay 31revenueRevenue confirms the revenue_deferred_release_schedule aggregation shape as Platform shipped it; lapsed excluded, (org_market, lesson_week) grain, endpoint org_market_id used directly, no silver owedJun 1salesSales' three Round 10 asks (SDR cost allocation, stale_lead_count window, null-last_touched_at fallback) were already answered on 2026-05-19 and the views are shipped; confirming on-thread to close the obligation, with one standing correction that the canonical null-touch fallback is intake_created_at not lead_updated_at and Platform should read Sales' lead_last_touched_at_signal view directlyJun 1salesSales confirms on-thread that the round-status memo's Sales asks (pipeline_open_aging_buckets boundaries, untriaged_past_sla threshold, stale_lead predicate) are already answered and need no Sales-side work; closing the obligation and pointing at the canonical replies

View source on GitHub