SOW HLT-DC-MCN-001 · Confidential
Prepared for James · Ku · Simon · Ash · 21 May 2026 · Wk 5 wrap (14–20 May) · Halfway point · Day 35 of 56 · Wk 6 Day 1 in flight
docs/sessions/2026-05-20-sprint-review.md (139 lines · PR #286 + #287 merged).docs/sessions/2026-05-20-chris-hristo-snowflake-dc-integration.md. 21 May Day 1 follow-up confirms sandbox-side LIVE: Preference stream ACTIVE · 1.79M records · daily incremental.specs/data-graph/p2-149-bi-canonical-model-spec.md (825 lines · Snowflake medallion · dbt · 7 canonical DMOs · 16 NEW computed fields with exact SQL CASE logic · static seed catalogs Campus_Catalog + Staff_Assignment + Programme_Lookup). specs/data-graph/p2-149-bdt-canonical-normalization.md (770+ lines · full field-coverage parity with Track A for BDT-suitable subset · documents what stays in dbt only: SIA aggregation · row-rank conflict resolution · IR).<Object>_<source>_<layer>__<dll|dlm>. Aligned with Hristo's existing preference_sf_slv convention. Chris + Hristo + Jonatan + Simon to broadcast (HULTMKT1-10164 created · workshop scheduled post-Polly-return).data_cloud_reverse schema in silver · materialised tables + incremental loads · dbt-owned movement · private/public key auth pattern. PRD_GLD grants documented for Chris (ACCOUNTADMIN-only · 6 SQL statements drafted + optional ownership transfer to SYSADMIN). Findings posted to HULTMKT1-10139.specs/data-graph/p2-149-bi-canonical-model-spec.md — Track A dbt · 7 DMOs · 16 NEW fields with exact SQL CASE logic · seed CSVs for Campus_Catalog + Staff_Assignment + Programme_Lookup · 825 lines. specs/data-graph/p2-149-bdt-canonical-normalization.md — Track B BDT · field-parity · 15-code programme normalization · single + multi-value formulas · 770+ lines. Plus 3 session logs committed (Chris+Hristo BDT debugging · playbook training · sprint review).audit/phase-4/calculated-insights-pre-unmap-2026-05-12/ (JSON + Metadata XML formats · deployable manifest). BI safety confirmed — Tableau pulls SFTP not DC, unmap window invisible to BI.CdpDataStreams, CdpDataSpace) reactivated by Jonatan (not SF Support). 3 remaining gaps tracked: stream activation · Data Kits redeploy · companion org link. Memory updated for future-session context.<Object>_<source>_<layer>__<dll|dlm>). Reverse ETL plan locked sandbox-first — dedicated data_cloud_reverse schema · dbt-owned movement.Both tracks fully specced and parity-checked: Track A (p2-149-bi-canonical-model-spec.md · 825 lines · Snowflake medallion · dbt · 7 canonical DMOs · 16 NEW computed fields with exact SQL CASE logic · static seed catalogs Campus_Catalog + Staff_Assignment + Programme_Lookup) and Track B (p2-149-bdt-canonical-normalization.md · 770+ lines · full field-coverage parity with Track A for the BDT-suitable subset · documents what stays in dbt only: SIA aggregation · row-rank conflict resolution · IR). Build is now execution, not design.
Chris + Hristo working session: prod Snowflake↔DC connection ESTABLISHED. Default role swap from public → DATACLOUD_SHARE_ROLE · USAGE chain validated · bronze + silver revoked post-validation → only gold accessible to DC. Locks: case-by-case Track A vs B per dataset · curated gold (not full passthrough) · DMOs as Engagement (not Profile) for Preference/time-series objects · sandbox uses separate RSA key + user, same role. 21 May follow-up confirms sandbox-side also LIVE: Preference stream ACTIVE · 1,790,615 records · daily 06:00 UTC incremental. Session log: docs/sessions/2026-05-20-chris-hristo-snowflake-dc-integration.md.
3-level pattern locked: <Object>_<source>_<layer>__<dll|dlm>. Aligned with Hristo's existing preference_sf_slv convention. Adopted across Chris (BI) · Hristo (dbt) · Jonatan (specs) · Simon to broadcast at upcoming workshop. HULTMKT1-10164 created as marketing-side tracker · workshop scheduled post-Polly return (week of 25 May). Track A + B specs to be updated with the convention before dbt build kicks off.
Star diagram delivered (James's 15 May ask · standalone HTML + embedded in p4-79-82 deck as new slide 6). 30-min session yielded 4 decisions confirmed: phone channels unified · latest event timestamp as tiebreaker · marketing vs transactional split · requirements doc precedes technical model. New blocker surfaced: CRM ↔ SFMC opt-out discrepancy 600K vs 3.6K (~166× gap) · Chris to investigate. 4 tickets updated (GH #79 · #82 · HULT-21770 · HULT-21841). Restart momentum recovered after 2+ weeks of deferral.
All five remaining blockers visible, owned, and sequenced. None is a technical design issue: (1) Orphan DLO fields (~30 fields · Jess UI surgery · HULT-22242 · GH #285) — gates Lead/Account/Contact streams → Track A/B silver. (2) 6 SF objects not visible in DC (3 Finance · 3 Ranking · Chris support ticket) — gates full BI data scope. (3) Companion + SFMC connectors reauth (Jess · HULTMKT1-10138) — gates full sandbox integration + #80 sandbox-first path. (4) PRD_GLD grants to DATACLOUD_SHARE_ROLE (Chris needs ACCOUNTADMIN · HULTMKT1-10139) — gates reverse ETL. (5) Ash MCN admin permissions since Dec 2025 (SF Support · HULTMKT1-7467). Build can proceed in parallel.
The orphan DLO fields blocker (sandbox · #285) and the 4 SFMC subscriber streams blocker (prod · #80) have been bundled into a single SF Engineering escalation umbrella (GH #294) — same root-cause family. 99 orphan fields inventoried across 3 DLOs (Lead 21 · Account 14 · Contact 64). 9 API surfaces attempted across v60→v67 (REST · Tooling · Metadata · Apex DML · sObject DML) · all 9 failed with "setup object in use". Reproduced lock on a non-orphan field (AnnualRevenue__c) → confirms the DC platform lock is systemic, not orphan-specific. Specific question for SF Engineering: how to destructively deploy CustomField on a __dll CustomObject when the DLO is referenced by an active DataStream? Owners: Ash (primary SF Support channel) · Jess (secondary) · Jonatan (evidence). Operational fallback available: UI clicks (30–60 min).
HULT-22242 (orphan DLO fields) currently requires Jess UI surgery as the only known path. To mitigate: James covers Jess this week for connector reauth coordination · Jonatan documents step-by-step UI procedures for autonomy · SF Engineering case (#294) pursued in parallel for a programmatic path. Chris ACCOUNTADMIN dependency for PRD_GLD grants is a parallel single-thread risk — mitigation proposed: schema ownership transfer to SYSADMIN to remove future bottleneck.
Full DLO → DMO lineage covering all 137 DMOs, 203 DLOs, and 224 DSOs across both Enrollment and MyStudents orgs. Interactive — zoom, pan, and click to explore relationships.
| # | Issue | Phase | Status |
|---|---|---|---|
| 72 | Access provisioning (sandbox, JIRA, GitHub, MC) | 1 | Done |
| 74 | CI write-back diagnosis — CC_TopChoiceCampus__c | 1 | Done |
| 75 | Opportunity 3-stream split audit | 1 | Done |
| 76 | Data Stream baseline — 176 streams | 1 | Done |
| 77 | Repo scaffold + spec-driven workflow | 1 | Done |
| 112 | V3 CRM Data Kit field maps (963 mappings) | 1 | Done |
| 143 | SFMC Classic full audit (362 autos · 1,534 journeys · 14 query families) | 1 | Done |
| 96 | BI architecture review — Hybrid decided 29 Apr | 1 | Decided |
| 142 | Operating-model deck — signed-off 5 May | 4 | Done · Wk 3 |
| 160 | MC stream cleanup audit | 2 | Done · Wk 3 |
| 157 | Web behavioural data gap — discovery, exec lives in HULTMKT1-9834 | 2 | Done · Wk 3 |
| 175 | Preference scoring deprecation — 0 of 1.7M ever populated | 2 | Done · Wk 3 |
| 176 | Stakeholder project update deck — presented 6 May | 4 | Done · Wk 3 |
| 176 | Stakeholder project update deck — presented 6 May | 4 | Done · Wk 3 |
| 225 | Data Graph playbook — deck + canonical specs + Jira tickets | 4 | Done · 14 May |
| 173 | Unmap existing DC configurations — scope superseded by HULT-22198/22199 + #149 (closed Wk 6 Day 1) | 2 | Done · 21 May |
| 149 | Campus canonical pilot — specs done, Jira execution tickets active (HULT-22198 + 22199) | 2 | In Progress · gated by orphan DLO fields (#285/HULT-22242) |
| 80 | MC connection recreation — bundled into SF Engineering case via #294 | 4 | In Progress · escalated via #294 |
| 178 | Data Cloud One companion org sandbox provisioning — connector reauth pending Jess+Falak | 1 | In Progress (Jess + Falak) |
| 79 | Consent architecture — restart Simon+James 20 May · 4 decisions confirmed · star diagram delivered | 4 | In Progress · requirements doc pending |
| 82 | All Subscribers migration — spec drafted, blocked on DD + consent legal scope | 4 | Spec drafted |
| 84 | WhatsApp / Unified Messaging — audit complete, 5 bugs · MCN cutover review Wk 6 | 4 | In Review |
| 294 | SF Engineering escalation umbrella — orphan DLO fields (#285) + 4 SFMC subscriber streams (#80) (NEW Wk 6 Day 1) | 2 | Critical-path · Ash + Jess |
| 285 | Orphan DLO fields blocking Lead/Account/Contact streams (99 fields · sandbox) — bundled into #294 (NEW Wk 5) | 2 | Blocker · HULT-22242 |
| 272 | Sandbox connector reauth — 3 of 5 done (SF CRM · Companion · Snowflake ZC) · SFMC pending Jess · BigQuery dropped | 1 | In Progress · 3 of 5 live |
| 281 | Naming convention — Data Graphs · Journeys · CIs · Segments (HULTMKT1-10164 · Simon) (NEW Wk 5) | 4 | Blocked · workshop post-Polly return |
| 73 | Two-org Data Space/Data Share architecture | 1 | Backlog |
| 81 | Calculated Insights build — PipeAge, Suppression, CTAs | 4 | Backlog |
| 83 | Sender profiles + Reply Mail Management | 4 | Backlog |
| 85 | BigQuery DLO — batch data transform workaround | 2 | Backlog |
| 86 | WhatsApp bulk send — MCN setup | 4 | Backlog |
| 87 | Programme-specific footers + application link CTAs | 4 | Backlog |
| 88 | Stream error monitoring — 27 streams | 2 | Backlog |
| 92 | Lead Source deduplication | 2 | Backlog |
| 93 | Team enablement sessions | 5 | Backlog |
| 219 | MCN deliverability — IP warming, subdomain rep, sending strategy | 4 | Backlog |
| 221 | MCN Preference Center configuration | 4 | Backlog |
_canon_gld__dlm pattern landing first.audit/phase-2/ · feeds SF Engineering case (#294).| Decision | Context | Asked of |
|---|---|---|
| Consent solution scope | MCN defaults Opt-Out · zero emails without consent setup. Polly out · Simon is key person. Star diagram delivered 20 May · 4 decisions confirmed in restart session · business requirements doc needs to land before technical model. | Simon (with James) |
| 2-preference-centre approach | Ash proposed Next emails + Marketing Engagement, both push to DC. Needs SF validation before build. | SF + James |
| WhatsApp config review for MCN cutover | Ensure no blocking points moving from Classic → Next. Paired session with James + Jonatan in Wk 6. | James + Jonatan |
| Epic | Wk 5 status |
|---|---|
| Data transformation (BI · Snowflake · dbt) | Specs ✅ locked · Build ⏳ waiting on sandbox streams (orphan DLO fields via #294) |
| Data harmonisation & activation (MCN · segments · Data Graphs) | Naming convention ✅ adopted · Consent ⏳ restarted 20 May · Preference centres ⏳ SF validation · WhatsApp ⏳ Wk 6 review |
| Environment readiness (sandbox + prod) | 99.66% deployed · 3 of 5 connectors live (SF CRM · Companion · Snowflake ZC) · 5 blockers carved with named owners · prod Snowflake↔DC connection LIVE 20 May |
| Risk | Mitigation |
|---|---|
| Jess single-thread on DC sandbox UI fixes (HULT-22242 · 99 orphan fields) | James covers for connector reauth · Jonatan documents step-by-step UI procedures · SF Engineering case (#294) pursued in parallel for programmatic path |
| Chris ACCOUNTADMIN dependency for PRD_GLD grants | Propose schema ownership transfer to SYSADMIN to remove future bottleneck |
| Consent conversation deferred 2+ weeks already | Jonatan takes over from Ash · restart with Simon executed 20 May · 4 decisions confirmed · momentum recovered |
| Wk 6 build phase starts late if blockers slip | Spec work is parallel-tracked, no rework risk · all 5 blockers are coordination/permission issues, not technical design |
| # | Action | Owner | Due |
|---|---|---|---|
| 1 | Execute orphan DLO field audit + UI deletion (HULT-22242 · 99 fields) | Jess | This week / next week |
| 2 | PRD_GLD grants via ACCOUNTADMIN | Chris | This week |
| 3 | 6 SF objects support ticket (3 Finance · 3 Ranking) | Chris | This week |
| 4 | Companion + SFMC connector reauth (HULTMKT1-10138) | Jess | After return |
| 5 | Restart consent conversation with Simon (business requirements doc) | Jonatan + James | Mon/Tue Wk 6 · 20 May session delivered |
| 6 | WhatsApp config review with James | Jonatan | Wk 6 |
| 7 | Validate 2-preference-centre approach with SF | Jonatan | Wk 6 |
| 8 | Update Track A + Track B specs with new naming convention | Jonatan | When dbt build kicks off |
| 9 | Schedule BDT workshop with marketing team | Jonatan | Wk 6/7 · post-Polly return |
| 10 | (NEW 21 May) Open SF Engineering case via #294 — bundles 99 orphan DLO fields + 4 SFMC subscriber streams | Ash (primary) · Jess (secondary) · Jonatan (evidence) | Wk 6 — Slack/email draft pending |
Track A + Track B are complete and parity-checked. Build is execution, not design. 10 of 10 specs locked.
4 weeks ago this was a "sandbox doesn't exist" risk. Today it's "99% deployed · 3 of 5 connectors live · 5 carved blockers." Prod Snowflake↔DC connection live since 20 May · sandbox-side verified live 21 May (1.79M Preference records flowing).
No scope creep · no budget overrun · GBP invoicing established (F-14R + INV-002 sent 15 May ≈ £10,000). 50% invoiced at 62.5% of timeline · delivery still ahead of invoicing pace.
Every open item has a named owner. All 5 blockers are permission / coordination issues. GH #294 (NEW 21 May) bundles the orphan DLO fields and SFMC streams into a single SF Engineering escalation umbrella — one channel, one case, one root-cause family.
Engagement on schedule and on budget at the halfway point (Day 35 of 56). Wk 5 delivered all spec work (Track A + Track B parity · naming convention adopted cross-team · reverse ETL plan locked · prod Snowflake↔DC connection live · consent restart with Simon+James). Phase 2 jumped from 75% → 85% through sandbox deployment. Build phase (Wk 6+) starts as soon as orphan DLO fields clear via #294. Pilot build (HULT-22198 + 22199) runs in parallel as soon as silver layer accepts data. Engagement now at ~65% delivered against 50% invoiced — outperforming pace. Forward signal: Wk 6 Day 1 saw sandbox-side Snowflake ZC verified live (1.79M Preference records · daily incremental) and SF Engineering escalation umbrella (#294) opened — momentum carrying forward.