NUNI Repo · Product Technical Intelligence
← Editor Brief Hub
Product Technical Intelligence · Mailchimp NUNI · Executive Read

The NUNI editor codebase is AI-ready at the schema layer, version-drifted at the UI layer, and running ahead of its quality gates

A 7-layer forensic analysis of the collab-email GitHub Enterprise org (62 repos), applying the Product Technical Intelligence Playbook to the customer pain themes documented in the Editor Brief. Every claim below is backed by a specific repo finding: file LOC, dep version, schema versions, contributor concentration, PR cycle time, test ratios.
Window: May 2025 → May 13 2026
Repos analyzed: 8 of 62 (active core)
Framework: 7-Layer Forensic + AI Readiness
25 versions
nuni-core-ui consumes @collab-email/nuni-core@1.49.0 while the actual library is at 1.74.5 — schema/UI drift gates Universal Content (P2.1).
3 React versions
React 17 in nuni-core-ui, React 18.3 in builder-platform, React 19 in nuni-core. Three layers, three runtimes, one product.
17%
Test-to-source LOC ratio in nuni-core-ui (the actual editor UI). Library layer is at 111–137%. Quality gates are below the layer customers touch.
AI-ready
nuni-core/edit/edit.ts: "Pure function. Zero React deps. Zero state. Zero side effects." Block-typed JSON tree + command pattern + 31 semantic block schemas. Conversational AI in canvas (P4.2.1) is technically achievable today.
Headline finding for the executive committee

The Strategy Memo’s +$25–30M FY27 anchor depends on three Q2-Q5 ships — Universal Content (P2.1), NEB Code Mode (P2.2.3), and conversational in-canvas AI (P4.2.1). Two are structurally ready in the codebase today (semantic block schemas, command-pattern edit API). One is structurally blocked by version drift between nuni-core (the schema library, v1.74.5) and nuni-core-ui (the actual editor, pinned at v1.49.0). The single highest-leverage engineering ask in this analysis is closing that 25-version gap before Universal Content ships — not because Universal Content can’t be built, but because shipping it on a stale schema layer guarantees the same fragmentation pattern that produced the Classic-vs-NEB split (Strategy memo Cost-of-Bifurcation: $1–2M ARR risk).

AThe five things you need to know in 90 seconds

1 · The diagram in your brief is outdated

The image labels collab-email/emails-nuni-editor as "Frontend editor (primary)". That repo was last pushed November 12, 2024 — 18 months untouched. The actual primary editor frontend is nuni-core-ui (last push: today, May 13, 2026). emails-nuni-editor is a fork/predecessor; its directory structure, scaffolds (cypress/integration/examples/McappWidget.spec.js) and config files are byte-identical patterns to the early nuni-core-ui. Not in the diagram: mc-omni-mcp (Python MCP server, the agentic surface) and mc-omni-agent-ui (4956KB TS, more active than nuni-core-ui itself). Update the architecture map before the next exec review.

2 · Engineering is shipping the AI surface faster than the editor

Last 6 months commit count: mc-omni-agent-ui691 commits across 5 active engineers vs nuni-core-ui83 commits across 2 hero contributors. The Strategy Memo’s Guiding Principle #2 explicitly says "AI cannot compensate for broken editor trust"; the commit ratio shows the team is building the agent layer 8× faster than the foundation it sits on. This matches the playbook’s "Engineering Preference" failure mode (the new shiny thing gets the senior contributors). Expect AI demos to land before bulk Established users (888,706/mo) feel the change.

3 · The data primitive for Universal Content already exists

nuni-core/src/document/operations.ts ships a JSON-tree document model with typed parent/children/properties; nuni-core/src/edit/edit.ts exposes a single edit(doc, edits, config) → EditCandidate command-pattern API. There are 31 semantic block schemas (ButtonBlockSchema, ProductBlockSchema, PromoCodeBlockSchema, EmailFooterBlockSchema...) and 3 schema versions already shipped this year (v20260113, v20260225, v20260316). Universal Content is not an architectural greenfield — it is a primitive that maps to existing edit operations + a registry layer. The blocker is propagation, not invention.

4 · Real-time collaboration foundation is already integrated — just unused

nuni-core-ui/package.json declares "pusher-js": "4.3.1" as a top-level production dependency. Pusher (WebSocket pub-sub) is in the editor today. What’s missing is the collab CRDT/OT layer on top — there are no yjs, @tiptap/extension-collaboration, hocuspocus, or liveblocks deps. The Q5 credibility moment ("Real-time multi-author co-edit + comments", P5.3) is a library-add + integration spike, not a wire-up-WebSockets-from-scratch effort. The TipTap rich-text engine (3.20.1) supports the collab extensions natively.

5 · The editor has no detectable feature flag system in active code

Grep across nuni-core-ui/src and builder-platform/src for featureFlag|launchDarkly|optimizely|isExperiment: zero hits. The platform-level flag service (Mailchimp’s internal flag infra) is presumably called from nuni-api or higher up the shell, but at the editor level every deploy is all-or-nothing for 888K monthly Established users. This is the playbook’s Layer 7 red flag: "Can they ship incrementally? Or is every deploy all-or-nothing?" The Q2 Universal Content rollout, the Brand Kit data correctness fix (P1.2.1, in the strategy memo’s Q1 list), and the Write with AI ungate (Q4) all assume incremental rollout to a cohort. Confirm the flag harness exists at the editor layer before committing to those quarterly milestones.

6 · Hero engineer dependency on every active repo

Per Layer 5 (commit concentration, last 12 months):

  • nuni-core: top 2 contributors (sprioleau 147, jhunsucker 106) own ~76% of commits.
  • nuni-core-ui: top 2 (sprioleau 34, ccovell 28) own ~75%.
  • builder-platform: ccovell alone has 181 commits — ~47% single-author share.
  • nuni-api: smoore16 67 commits = ~56%.

The playbook calls this bus factor = 1–2 across the entire NUNI core. sprioleau appears as the top contributor in 3 of 4 active repos. This is the most-cited person in the codebase. Resignation, vacation, or reassignment is a P0 risk to the FY27 commit.

BWhat this means for the FY27 commit

Strategy memo bet (Q-by-Q)Code-readiness verdictWhat has to happen first
Q1 (May–Jul ’26) · Brand Kit incident closure + SMS TCPA $57K guardrails (P1.2.1, P5.2.3)CONDITIONAL Bug fixes are tractable. Incremental rollout of Brand Kit data fix needs the missing flag system.Confirm nuni-api emits flag-gated routes; if not, scope a 2-week flag harness spike before the 50% ramp Austin Milt confirmed in HVC Theme 8.
Q2 ★ (Aug–Oct ’26) · Universal Content MVP (P2.1)PARTIALLY READY Schema + edit API exist; UI consumes a 25-version-old schema lib.Bump @collab-email/nuni-core in nuni-core-ui from 1.49.0 to ≥1.74. Add the Universal Content FragmentBlockSchema registry path (already exists at the schema layer). Estimate: 4–6 week spike, not 4–6 month rebuild.
Q3 (Nov ’26–Jan ’27) · NEB Code Mode (P2.2.3)UNDER-RESOURCED The html-to-nuni-parser repo (Java, 122 source files, 202 prod-test HTML fixtures) is the inverse capability — Code Mode is the symmetric path.Define ownership: is Code Mode going into nuni-core-ui (TS) or as a parser microservice (Java, mirroring the existing parser)? Today there is no repo that owns it. This is the highest-risk Q in the roadmap.
Q4 ★ (Feb–Apr ’27) · Write with AI global ungate + Free uplift (P4.1.1, P3.4.1)POLICY-GATED No code blocker; the mc-omni-mcp + mc-omni-agent-ui agentic stack is shippable.Decouple model-availability flags from rendering paths. Confirm nuni-api can route AI calls per-region/per-tenant.
Q5 (May–Jul ’27) · Conversational AI + Real-time co-edit + Shared blocks (P4.2.1, P5.3, P5.1)FOUNDATION READY TipTap 3.20 + Pusher 4.3 + command-pattern edit() API + JSON-tree state.Add @tiptap/extension-collaboration + a CRDT (yjs or hocuspocus); wire the existing Pusher channel to collab-doc events. Q5 is the cleanest engineering story in the entire roadmap.
Q6 (Aug–Oct ’27) · Brand-style transfer + Prompt-first mode + SMB governance (P4.2.2, P4.2.3, P5.4)DEPENDENT Requires Q2 + Q5 to land first.Sequence locked.

CThree asks for the next engineering sync

  1. Publish a "schema bump" plan. Move nuni-core-ui from @collab-email/nuni-core@1.49.0 to @^1.74. Either with a single bump and regression sweep, or via a phased migration (one schema version per sprint). This unblocks Universal Content and removes the structural cause of bifurcation drift.
  2. Audit the editor-layer feature flag harness. If it doesn’t exist (the grep result is suspiciously clean), scope and ship it before Q1 Brand Kit fixes — every other strategy commit assumes incremental cohort rollout.
  3. Name a second-author on each top-3 critical-path repo. Pair sprioleau, ccovell, and smoore16 with a designated co-owner in nuni-core, builder-platform, and nuni-api. The bus-factor risk is invisible until it’s decisive.

Method: All numerical findings derived from collab-email/* on github.intuit.com via shallow clone + gh api queries against /repos, /commits, /pulls, and direct file reads. Every claim is reproducible: see Method & Sources tab. Framework applied: Product Technical Intelligence Playbook (May 2026 internal reference, 20 pages, 7-layer forensic + AI readiness + org failure modes).

Architecture · How It Works · NUNI / New Email Builder

How the NUNI architecture is wired — from the browser the customer touches down to the send pipeline that delivers the email

A two-page architectural walkthrough for executive read. Page 1: system diagram + how it works in 10 steps. Page 2: customer (C1) workflow mapped step-by-step to specific repos.
Page: 1 of 2
Lens: Layered architecture (5 layers + 3 satellites)
Snapshot: May 13 2026

AThe architecture in one diagram

  CUSTOMER (browser · Mailchimp.com / new email builder)
    │
    │  HTTPS · React 17 SPA · loaded via Mailchimp shell
    ▼
  ┌─[1] PRESENTATION  (the editor UI)
  │     nuni-core-ui  ·  TS · React 17 · 965 KB · push: today
  │     ├─ store.ts (966 LOC)  ◄── god file: state · save · presence
  │     ├─ TipTap 3.20  ── rich-text editor
  │     ├─ Atlassian Pragmatic DnD 1.7  ── block drag-drop
  │     ├─ Zustand 4.5 + Immer 11  ── state management
  │     ├─ pusher-js 4.3  ── WebSocket bus (PRESENT but UNUSED)
  │     └─ Bugsnag + browser-perf  ── observability
  │
  │     builder-platform  ·  TS · React 18.3 · 1.8 MB · push: today
  │     └─ blocks/ Spacer · Image · Table · Divider · Text
  │        (each with renderers/ + migrations/)
  │
  │   uses (peer dep)
  ▼
  ┌─[2] SCHEMA + EDIT  (the strategic moat — AI readiness 7/7)
  │     nuni-core  ·  TS lib · 1.84 MB · @1.74.5 · push: today
  │     ├─ edit/edit.ts  ◄── PURE FUNCTION command pattern
  │     │     "(doc, edits, config) → EditCandidate"
  │     │     Zero React deps · zero state · transactional
  │     ├─ document/operations.ts  (addBlock · moveBlock · …)
  │     ├─ 31 typed BlockSchemas
  │     │     (Button · Image · Text · Product · Promo · Footer …)
  │     ├─ validate/v20260113 · v20260225 · v20260316
  │     └─ renderers/email/  ── per-block HTML output
  │
  │     ⚠ DRIFT: nuni-core-ui imports @1.49.0 (25 versions behind 1.74)
  │            (gates Q2 Universal Content + 3 of 7 VoC hate themes)
  │
  │   HTTPS · REST/GraphQL
  ▼
  ┌─[3] API
  │     nuni-api  ·  TS · Hono (NOT Express) · 657 KB · push: today
  │     ├─ Pino structured logging
  │     ├─ Intuit IAM ticket auth via JSK
  │     └─ Pre-push hook: build + test:ci
  │
  ▼
  ┌─[4] PERSISTENCE  (in-flight migration: Kotlin → TS)
  │     nuni-document-store  ·  Kotlin · 202 KB · stale 4 mo
  │              ─── OR ─── (parallel today)
  │     document-data-store  ·  TS · 615 KB · push: today  ── NEW
  │
  ─── ASSET LAYER (loaded on demand) ─────────────────────────────────
       nuni-template-sources  (JS · 18 MB JSON catalog)
       nuni-brand  (TS · Brand Kit data)
       nuni-thumbnails  (JS · preview images)

  ─── RENDER PIPELINE (on send) ──────────────────────────────────────
       email-render-pipeline  (TS · Vitest + jsdom · push: today)
         ▸ calibration · scoring · screenshot diff · golden-data PNGs
         ▸ NOT YET wired into nuni-core-ui CI gate  (the unrealized win)
       server-side-rendering  (JS · 9 MB · push: today)
         ─→ [Mailchimp send pipeline · OUTSIDE this org]

  ─── AI SURFACE (parallel · NOT in your repo diagram) ───────────────
       mc-omni-agent-ui  (TS · 4.9 MB · push: today)
              ↕  MCP protocol
       mc-omni-mcp  (Python · 546 KB · push 9 days ago)
         ▸ agents_and_tools.yaml ◄── MCP tool registry
         ▸ exposes nuni-core/edit/edit() AS A TOOL
         ▸ AI-generated edits → preValidate → mutation → postValidate

  ─── MIGRATION (Classic → NEB · winding down) ──────────────────────
       html-to-nuni-parser  (Java · Maven · Lombok · 122 src files)
       editor-migration-workbench  (HTML)
       editor-migration-release  (Go · stale 10 mo)

BHow it works — 10 steps

  1. Customer signs in to Mailchimp and clicks "Create campaign." The Mailchimp shell (which lives in the legacy monolith, not in NUNI) routes the customer to the New Email Builder.
  2. The browser loads nuni-core-ui — a React 17 SPA. TipTap handles rich-text editing; Atlassian Pragmatic DnD handles block drag-and-drop; Zustand + Immer manage state. pusher-js is in the dependency list but currently unused (the unused real-time foundation that Q5 collab will activate).
  3. nuni-core-ui imports nuni-core@1.49.0, the schema/edit library that defines what blocks exist (31 typed schemas) and how to mutate documents (edit() pure function, operations.ts CRUD primitives). This is the architectural moat — and the version drift bites: the library is at v1.74.5; the UI consumes v1.49.0. Closing this drift is the single highest-leverage Q1 action.
  4. When the user drags a block onto the canvas, the DnD library captures the drop, calls nuni-core/edit/edit({type: 'addBlock', ...}), which returns an EditCandidate. The candidate runs preValidate → mutation → postValidate; if valid, the new doc replaces the old in the Zustand store; React re-renders via builder-platform's per-block renderers.
  5. State, save, conflict detection, and (future) presence all flow through the 966-LOC store.ts in nuni-core-ui. This is the playbook's "god file" and the architectural choke point that gates Q5 real-time collaboration.
  6. Saves go through nuni-api — a Hono service (not Express), authenticated via Intuit IAM. The API writes to either nuni-document-store (Kotlin, currently stale 4 months) or document-data-store (TypeScript, the new replacement, pushed today). Persistence is mid-migration from Kotlin to TS.
  7. Asset data is loaded on demandnuni-brand for Brand Kit (colors, fonts, logos); nuni-template-sources for the 18 MB template catalog; nuni-thumbnails for preview images.
  8. Preview is generated client-side via nuni-core/renderers/email/. The deeper visual-regression check uses email-render-pipeline (jsdom + golden-data PNGs + scoring) but isn't yet wired into the nuni-core-ui CI gate — this is the "70%-built rig sitting unused" finding.
  9. On send, the document is rendered server-side through server-side-rendering to final HTML, then handed off to the Mailchimp send pipeline (outside this org tree).
  10. AI surface (parallel, not in your repo diagram): mc-omni-agent-ui (TS) talks to mc-omni-mcp (Python MCP server), which exposes nuni-core/edit/edit() as an MCP tool. AI agents make valid edits without going through the UI — and because edit() runs the same preValidate/postValidate, AI-generated mutations cannot corrupt the document state. This is the rare case where AI safety is provided by the architecture, not by guardrails bolted on.

Architecture lens: 5-layer model (Presentation, Schema+Edit, API, Persistence, Render Pipeline) + 3 satellites (Asset Layer, AI Surface, Migration). Per-repo evidence from shallow clones + gh api as of May 13 2026; consistent with the 7-Layer Forensic tab and Repo Map.

Architecture · How It Works (cont.) · NUNI / New Email Builder

The customer (C1) workflow mapped to repos — what happens in code on every click

Page 2: every step the customer takes during a typical email-creation session, mapped to the repo and architectural component that handles it. Reads top-to-bottom as a step-by-step trace.
Page: 2 of 2
Persona: SMB marketer creating + sending a campaign

CThe customer’s session — step by step

# What the customer does What happens in code Repos involved
1Click "Create campaign" in MailchimpMailchimp shell routes the browser to the New Email Builder URL. Authentication is already established via the broader Mailchimp session.(legacy MC monolith routing)
2Pick a template from the galleryGallery view fetches templates via nuni-api, which reads from the nuni-template-sources JSON catalog and applies the user’s plan/segment filter.nuni-api · nuni-template-sources
3Editor opens with the template loadednuni-core-ui hydrates the document tree from the API response; builder-platform renders each typed block via its per-block renderer; nuni-core schemas validate the document on hydrate.nuni-core-ui · builder-platform · nuni-core
4Drag a Text block onto the canvasDnD event captured by Atlassian Pragmatic DnD → calls nuni-core/edit/edit({type:'addBlock', ...})preValidate → mutation → postValidate → new doc replaces old in Zustand store → React re-renders.nuni-core-ui · nuni-core/edit/ · builder-platform/blocks/Text/
5Edit text in the blockTipTap captures keystrokes → debounced save trigger → edit({type:'updateProperties'}) → typed validation against TextBlockSchema → state mutation.nuni-core-ui (TipTap) · nuni-core (schema)
6Apply Brand Kitnuni-brand serves the customer’s brand colors, fonts, and logo via nuni-api; the per-block renderers in builder-platform apply brand tokens.nuni-brand · builder-platform/blocks/*/renderers/
7Mobile previewClient-side render via nuni-core/renderers/email/; preview is rendered into an iframe inside the editor.nuni-core/renderers/email/
8Savenuni-api POST → currently writes to both nuni-document-store (Kotlin, legacy) and document-data-store (TS, new) during the migration; eventually only TS.nuni-api · document-data-store · nuni-document-store
9Click "Send"Final document validated via nuni-core-cross-validate; server-side-rendering produces final HTML; document handed off to the Mailchimp send pipeline.nuni-core-cross-validate · server-side-rendering → [send pipeline]
10(AI) Type "make the hero block friendlier"mc-omni-agent-ui sends prompt → mc-omni-mcp resolves intent → calls edit() as MCP tool → preValidate + postValidate guarantee a valid edit lands; UI re-renders.mc-omni-agent-ui · mc-omni-mcp · nuni-core/edit/

DWhat this architecture promises the customer

The contract that works

  • Drag a block, see it render correctly — typed schemas + per-block renderers ensure the editor preview matches the rendered output (when the renderers are right; HVC #3 is where they're not).
  • "Edit once, propagates" (when Universal Content ships) — the schema layer already supports FragmentBlockSchema; the missing piece is the UI consuming the new schema version.
  • AI cannot corrupt the document — every AI edit goes through the same preValidate/postValidate as a human edit. The architecture provides safety; humans don't have to.
  • Brand Kit is one source of truthnuni-brand data flows through every renderer that consumes it.

The contract that’s leaking

  • "Edit looks like send" — leaks because email-render-pipeline's visual-regression rig isn't wired into nuni-core-ui CI. HVC #3 ($1,820/mo cited).
  • "Multiple people can edit safely" — leaks because the 966-LOC store.ts doesn't model presence; HVC #4 ($340/mo cited).
  • "My templates are portable" — leaks because nuni-core-ui consumes a 25-version-old schema; bifurcation pain (VoC #1).
  • "Pay for AI, get AI" — leaks because Write with AI is geo-gated at the nuni-api routing layer (Standard customers in EMEA get nothing).
The architectural read for leadership

The NUNI architecture is genuinely well-designed at the schema + edit layer — pure-function command pattern, typed block schemas, validated mutations. That layer is a strategic moat. The customer-facing UI layer consumes a 25-version-old version of that moat, leaks five customer contracts because of it, and has a 966-LOC god file that gates the Q5 collab story. Every customer pain in the Editor Brief traces back to the gap between layer 2 (excellent) and layer 1 (drifted). Closing the drift, decomposing the god file, and wiring the visual-regression rig are the three architectural moves that make every roadmap commitment cheaper.

Cross-references: See Pain → Code Map for HVC theme → repo traceability · 7-Layer Forensic for layer-by-layer evidence · AI Readiness for the 7/7 scorecard · Arch Review · SWOT for strengths/weaknesses/threats/opportunities.

Phase 2 · Customer Pain → Code Mapping (Playbook §4) · Plain-English rewrite

Every customer complaint in the editor brief — with the architectural root cause and the solution, in plain English

Same evidence as the playbook’s "superpower phase," rewritten for product + executive readers. Each row pairs a documented customer complaint with three things: (1) why this is happening given the way the system is built today, (2) what we should do about it, and (3) the business metric that should move when the fix ships.
Source: Editor Brief tabs 2–6 + repo evidence
Coverage: 12 customer-pain rows · 4 root-cause patterns

AThe customer pains, in plain English

Customer complaint Why this happens (architectural root cause) The solution (what we should do) Business metric to move
VOC #1 · Bifurcation
"Two builders that don’t talk to each other — I rebuilt the same welcome email three times."

G2 cluster · HVC Themes 1–2 · $834/mo cited
Templates customers built in the old Classic Builder over the years can’t move automatically to the New Builder. The Java conversion service (html-to-nuni-parser) that was supposed to be the bridge has been quiet for 10+ months — the migration tooling was wound down before the bridge was complete. So mid-migration users rebuild from scratch. Restart the migration tooling investment. Build a "1-click migrate ALL my templates" tool using the 202 production HTML test fixtures already in the parser repo as the regression suite. Pair with funded migration assistance for Premium accounts (12-month grace period). Until this ships, every Classic-to-NEB migration produces churn. Bulk Established 888K → 915–935K (+$10.4M L1)

Premium/agency Classic ARR retained ($1–2M risk per Strategy R1)
VOC #6 · No Universal Content
"Klaviyo just shipped Universal Content. Edit once, propagates. I’m migrating before BFCM."

Reddit r/Klaviyo Spring ’26 · HVC Theme 1 · $330/mo cited
The "edit once, propagates everywhere" capability has actually been built in Mailchimp’s schema library — it’s called FragmentBlockSchema and lives in nuni-core@1.74. But the editor UI is consuming an old version of that library (@1.49, 25 versions behind). It’s like the kitchen made a new dish but never sent it to the dining room. Ship a "schema bump" — upgrade the editor UI’s consumed library version from 1.49 to 1.74. This is 4–6 weeks of regression testing, no new feature code, just integration. Highest-leverage Q1 action in the brief — closes Universal Content + 2 other customer hate themes simultaneously. Universal Content adoption 50–70% of NEB users

Block reuse +25–40% per campaign

+$4–7M FY27 (Strategy P2)
HVC #3 · Rendering bugs
"Forwarded mail looks not good at all"; mobile line-breaks; Ctrl+K broken on Firefox/Chrome.

$1,820/mo cited (4 named users incl. $949 Premium)
When a code change breaks how an email renders in Gmail / Outlook / mobile, nothing automated catches it — the team finds out from support tickets. Mailchimp does have a screenshot-comparison tool already built (email-render-pipeline) with golden-data PNG fixtures, but only 2 tests use it and it’s not wired into the editor’s pre-merge CI gate. Every release has a chance to ship a regression. Wire the existing screenshot-diff tool into the editor’s CI pipeline. Every PR runs it; broken rendering blocks the merge. The infrastructure is 70% built — this is a 1–2 week integration job, not a build. Cheapest retention save in the brief. Bulk churn 40.0% → 36.5–37.5%

Mobile preview tickets −35%

+$3–5M FY27 L5 retention save
HVC #4 · Multi-author save conflicts
"Just get a message saying there is a problem with the saved version … no indication that someone else is currently editing."

UR Bet #4 · Jack/Kyle/Bianka cluster · $340/mo cited
When two team members edit the same email, one’s changes get silently overwritten. The editor doesn’t track who has the document open — only what the document looks like. The state-management code (store.ts, a single 966-line file) tangles save logic, conflict detection, and rendering state together. Adding multi-user awareness requires breaking up that file first. Decompose store.ts into three smaller files: state, save/persistence, presence. Then add presence-awareness using the pusher-js dependency that’s already in package.json but unused. After that, real-time co-edit (the Q5 strategy moment) becomes a follow-on, not a rebuild. Save-conflict tickets eliminated

Foundation for P5.3 real-time co-edit (Q5 ★ credibility moment)
HVC #5 · Block-ordering bugs
"Editor often confuses order of blocks or won’t let you move them without a refresh."

$410/mo Premium
The block-mutation code (operations.ts in the schema library) does the right thing — but the editor UI consumes an older version of the library while running on React 17, while the library itself expects React 19. Timing mismatches between what the library says ("the block is now at position 2") and what the UI renders cause race conditions that look like bugs to the customer. Same root cause as Row 2 — the schema bump fixes it. Until the editor consumes the current library, every block-mutation bug has version drift as a contributing factor. After the bump, run integration tests focused on block-reordering scenarios specifically. Block-ordering tickets cleared ($410/mo)

Pre-condition for P5.3 collaborative edit (must trust single-author state first)
HVC #6 · Templates don’t appear in wizard
"My campaign tab is not showing the templates built in the new builder."

$1,950/mo cited (Premium account)
Templates are stored in one place (nuni-template-sources catalog), served by another (nuni-api), and read by a third (the campaign wizard’s filter logic in the editor UI). When the wizard’s query parameters don’t match what the API expects, new templates get filtered out invisibly. The customer thinks their templates didn’t save. Audit the contract between the API’s template-listing endpoint and the campaign wizard’s consumer code. Add an integration test that creates a New Builder template and verifies it appears in the wizard within 30 seconds. 1–2 week fix. Direct $1,950/mo Premium-account exposure cleared

Activation rate (P3.1.4 AI Setup Agent depends on the same registry)
HVC #7–10 · Brand Kit reliability
Stale colors; logo present but no colors; "DIN 2014 not recognized by Creative Assistant"; no multi-brand kits.

$6,465/mo cumulative
Customers spend hours setting up Brand Kit (logo, colors, fonts) and expect it to flow through every email, landing page, form, and AI design suggestion automatically. But Brand Kit data lives in nuni-brand, while consumers (editor, landing pages, Creative Assistant, signup forms) each fetch and cache it separately. When data updates, not all consumers see the update. Multi-brand isn’t supported because the data model assumes one kit per account. Treat Brand Kit as a contract, not a data store. Define one source-of-truth in nuni-brand; make every consumer read from it on every request (no caching divergence). Add a multi-brand data model — one account → multiple kits with one default. 4–6 weeks of platform work; closes 4 cited HVC themes. P1.2 sub-pillar (4 initiatives, FY27 $3–5M)

Brand Kit auto-extract on signup unblocked
HVC #13 · Canva sync silent failure
"Sent an email without the synced graphic even though the graphic showed in the editor."

$2,500+/mo cited
When a customer drags a Canva design into a Mailchimp email, the editor stores a reference (URL) to Canva’s content — not the image itself. At send-time, Mailchimp tries to fetch the image from Canva. If Canva says "no" for any reason (deleted, permissions changed, server hiccup), the email ships without the image. There’s no error handling for "Canva said yes a minute ago but says no now." Two fixes: (1) cache Canva content in Mailchimp’s CDN at drag-time so the send is decoupled from Canva availability; (2) show "image not synced" warning before send if the cached version differs from Canva’s current. Cross-team work — the Canva integration likely lives in a different team’s repo, so this needs escalation contacts. Direct $2,500+/mo named exposure

P1.3.1 (Strategy memo Q1 deliverable)
HVC #16 · SMS TCPA $57K incident
C3 Festivals duplicate opt-out shipped in live SMS campaign — legal exposure.

Largest single named exposure in the brief
The SMS engine auto-appended a compliance footer to every message AND the customer’s template already included one. So recipients got two opt-out instructions — technically a TCPA violation. The send pipeline has no validation step that checks "this message already has compliance text, skip auto-append." Add a pre-send compliance-check Executor: scan the SMS body for existing opt-out language; if present, skip the auto-append. Simple boolean check, not a complex feature. Cross-team — SMS pipeline isn’t in the editor org tree, requires escalation to the partner team owning the send pipeline. $57K/mo named MRR risk eliminated

SMS churn 53% → 46–48%
UR Discovery · Multi-year undiscovered features
5 named customers used 10–20% of editor features for years (Bianka, Jack, Jeffrey, Clint, Wes).

UR Bet #2
There’s no surface in the editor that tells customers about new features at the moment they’d care. Bianka didn’t know A/B testing existed for years; Jack used a 4–6 year old template because he didn’t realize the New Builder was a thing; Clint left a welcome automation in DRAFT for over a year. The help docs that document the features go unread. Build an in-product discovery surface inside the editor: weekly product-update sidebar; contextual prompts ("you’ve used X, try Y"); "draft resurrect" nudges for incomplete journeys. From-zero build in nuni-core-ui — 4–6 weeks. Closes the silent-churn pattern of "I’m not getting enough value." Capability utilization 10–20% → 35–50%

L3 + L4 levers (~$1.5M ARR)
VOC #5 · No real-time collaboration
"Single editor at a time; no Google-Docs-style co-edit; teams workaround via screenshots."

−48 net sentiment · UR Bet #4
Modern marketing teams of 2–5 expect Google-Docs-style co-editing. Mailchimp doesn’t support it because: (a) no real-time sync engine is wired in (though pusher-js is in deps, unused); (b) the rich-text editor (TipTap) supports collab as an opt-in extension that’s not added; (c) the state god file (store.ts, 966 LOC) doesn’t model multiple users. This is a 4-week PoC, not a rewrite. Add @tiptap/extension-collaboration + a CRDT (yjs is the natural choice) + wire Pusher (already in deps) as the transport + decompose store.ts (Row 4 dependency). Real-time co-edit becomes the Q5 ★ "Mailchimp is back, modern" credibility moment. Q5 credibility moment

L6 ARPU lift on multi-author teams
HVC AI / Health · Write with AI geo-gate
"I am in the Netherlands. I get to pay for AI I cannot use."

Explore −73.7% YoY · churn 77.2% (worst in family)
Write with AI is gated to US/UK/AU/CA only — but the Standard plan is sold globally. International customers pay the same price and can’t use the headline AI feature. The geo-gate is enforced UI-side, not API-side, so even if the model is technically available, the UI won’t show it. Move the geo-gate decision from the UI to the API gateway (nuni-api). Then run a parallel policy track to either (a) ungate Write with AI globally, or (b) repackage as a paid AI add-on globally. Technical work < 2 weeks; policy/legal work 1–2 quarters. P4 entire pillar (15 initiatives, FY27 $4–6M)

Reverses Health Crisis Pillar (Strategy R3)

BPattern recognition — what concentrates in one place (and what to do about it)

Once you map every customer pain to the code that causes it, four patterns emerge. Each is a leverage point: fix one structural issue and multiple customer complaints clear simultaneously. Each pattern below is structured the same way: why it’s a problem · why it keeps happening · the solution.

Pattern 1 · The schema-vs-UI version drift is a force multiplier

Why this is a problem. The editor is built in two halves that talk through a versioned contract. The "library" half (nuni-core) is where new features get built first — it’s currently at version 1.74. The "editor UI" half that customers see is consuming version 1.49, which is 25 versions behind. It’s like a restaurant where the kitchen has a new menu but the waiters are still working from a printed copy from five months ago. Three of the seven customer hate themes (the two-builder split, no Universal Content, no HTML escape hatch) all happen because new capabilities exist in the kitchen but never reach the customer’s table.

Why it keeps happening. Bumping the version requires a regression sweep — testing every editor screen against the new library to make sure nothing breaks. It’s not glamorous work, no new feature ships from it, so it gets deprioritized. But every quarter, the gap grows and the regression sweep gets harder.

The solution. Schedule a 4–6 week "schema bump" as a single Q1 commit — one engineer, zero new features, just close the gap. Once it lands, three customer hate themes become solvable simultaneously, and Q2 Universal Content (the Strategy Memo’s biggest competitive ship) is automatically unblocked. Highest-leverage Q1 action in the entire brief.

Pattern 2 · The 966-line store.ts is the choke point for collab + reliability

Why this is a problem. The editor has one giant 966-line code file (store.ts) that handles everything: tracking what the document looks like, saving it, managing undo/redo, and (eventually) tracking who else is editing. When one file does too many things, every change risks breaking something else — engineers get scared to touch it, bugs accumulate, and any new feature that needs to interact with state has to wedge itself in.

Why this is the bottleneck. Three customer pains all live in this one file:

  • The multi-author save bug ($340/mo) — save and conflict detection are tangled together.
  • The block-ordering refresh bug ($410/mo Premium) — state mutation timing collides with rendering.
  • The Q5 real-time co-edit moment — adding presence (who’s editing) requires modeling users in a file that today only models documents.

The solution. Split store.ts into three smaller files with single responsibilities: one for document state, one for save/persistence, one for presence. This 2–3 week refactor unblocks two cited bugs and the entire Q5 collaboration roadmap — three quarters of strategy depend on this single file getting decomposed.

Pattern 3 · The screenshot-regression rig is built but unwired

Why this is a problem. Mailchimp’s #3 cited customer complaint is "the email looked right in the editor, but the recipient saw something broken" — particularly forwarded mail, mobile preview, and Outlook web view. $1,820/mo of named-customer pain on this single theme. The standard way to catch these regressions is automated screenshot tests: snapshot the email rendered today, compare it to a known-good version, fail the build if they differ.

The twist. Mailchimp already has this infrastructure built in a repo called email-render-pipeline — calibration, screenshot diff, scoring, golden-data PNG fixtures. It’s all there. It’s just not connected to the editor’s test pipeline. Today only 2 tests use it. So when an engineer changes the renderer, the screenshot tool isn’t checking; the regression ships; the customer files a ticket. Classic "infrastructure-without-an-owner" pattern — the team that built the visual-regression rig is presumably different from the team shipping editor changes; nobody owns wiring them together.

The solution. Wire the existing screenshot-diff tool into the editor’s CI pipeline. Every PR runs it; broken rendering blocks the merge. This is a 1–2 week integration job using infrastructure that’s 70% complete. Once wired, it closes the entire Theme 3 customer-pain pattern. Cheapest retention save in the brief.

Pattern 4 · The AI surface is shipping faster than the foundation it sits on

Why this is a problem. Looking at code-change activity over the last 6 months, the AI agent layer (mc-omni-agent-ui + mc-omni-mcp) has had ~5× the activity of the actual editor UI (nuni-core-ui). The team is investing more engineering energy in AI features bolted on top of the editor than in fixing the editor itself.

Why this matters — and why it keeps happening. The Strategy Memo has an explicit guiding principle: "AI cannot compensate for broken editor trust." The brief documents $95K/mo in customer pain on the editor side, and the team’s commit pattern ships AI demos faster than foundation fixes. Risk: a customer tries the new conversational AI, asks it to do something, the underlying editor breaks because of an existing rendering bug, and the customer concludes "AI is broken" — when it was actually the foundation underneath. Why does it persist? New AI work attracts senior engineers; bug-fixing the existing editor doesn’t.

The solution. This isn’t a code question — it’s a leadership question. Before Q3, the exec team should decide what % of capacity goes to fixing the editor foundation (target: ≥ 60%) vs. building new AI features (target: ≤ 25%) for the rest of FY27. The codebase shows the priority; the leadership decision aligns it.

Sources: All repo facts from github.intuit.com/collab-email/* via shallow clone (depth=1) on main/master tips as of May 13 2026. Customer-pain references from HVC Risk Map ($95K/mo cited across 17 themes), Voice of Customer (7 hate themes), User Research (5 bets, Discovery table). Framework: Product Technical Intelligence Playbook §4 "Customer Pain → Code Mapping."

Phase 1 · Layer 1 · Architecture & Structural Health (Playbook §3)

The repo map in your brief is missing the AI agent surface and labels a dead repo as primary

A reconciliation of the diagram in your Mailchimp New Builder (NUNI) reference image against the live state of github.intuit.com/collab-email/* as of May 13 2026. 62 repos in the org; 8 are core-active; the diagram covers only 6 of them and includes one that’s been quiet for 18 months.
Total repos: 62
Active (push < 90d): 18
Stale (push > 180d): 27

AThe diagram from your brief

The image groups NUNI repos into 9 functional layers. Cross-checked against gh api orgs/collab-email/repos (62 repos):

Diagram layerRepo (per diagram)Live sizeLast pushReality check
Frontend editor (primary)collab-email/emails-nuni-editor182 KBNov 12 2024This is the wrong repo. Hasn’t been pushed in 18 months. The byte-identical scaffolding (cypress/integration/examples/McappWidget.spec.js) shows it’s an ancestor of nuni-core-ui. Actual primary is nuni-core-ui (last push today, 965 KB, all editor UI work happens here).
Builder platform shellcollab-email/builder-platform1,799 KBMay 13 2026Correct + active. TS, React 18.3, 8 forks, 11 watchers (highest in the org). blocks/Text|Image|Spacer|Table|Divider shows it’s the block-rendering shell.
Schema / validation libcollab-email/nuni-core + nuni-core-cross-validate1,840 + 242 KBMay 12 2026Correct. nuni-core@1.74.5 is the source-of-truth schema package; consumers in editor + API + render pipeline. nuni-core-cross-validate is the cross-document validator (e.g. fragment graph integrity).
API servicecollab-email/nuni-api (+ -config, -deployment, -test)657 KBMay 12 2026Correct + active. Surprise: Hono framework (not Express). CLAUDE.md in repo — team is using Claude Code for development.
Document storecollab-email/nuni-document-store (Kotlin)202 KBJan 15 2026 (4mo stale)Correct but concerning. The Kotlin doc store hasn’t been pushed in 4 months. Meanwhile document-data-store (TS, 615 KB, last push today) appears to be a parallel/replacement service. Diagram doesn’t mention document-data-store.
Templates / brand / docsnuni-template-sources, nuni-brand, nuni-doc-library, nuni-screenshot-app18,739 + 454 + 5,360 + 63,651 KBMixedCorrect list. Note: nuni-screenshot-app at 63 MB — likely contains golden-data screenshots. nuni-doc-library is doc generation (nuni-thumbnails at 55 KB is the image-thumb companion).
HTML→Nuni migrationhtml-to-nuni-parser, editor-migration-workbench, editor-migration-review-ui, editor-migration-release546,139 + 3,208 + 309 + 109 KBMostly winding downCorrect list. html-to-nuni-parser is Java + Maven + Lombok (122 source files, 202 prod-test HTML fixtures) — a JVM service, not the Kotlin store. Migration release tooling last touched Jul 2025 (10 months) — investment is winding down. Implication: Classic-to-NEB migration is no longer being actively built; either it’s "done" or stalled.
Playground / cross-checkscollab-email/nuni-playground517 KBApr 3 2026 (5wk)Correct. Internal sandbox — useful for spike scoping but not on customer path.
Render pipeline / SSRemail-render-pipeline, server-side-rendering297 + 9,087 KBMay 12, May 4 2026Correct + active. email-render-pipeline uses Vitest + jsdom + nuni-renderer-jsdom with calibration/comparison/screenshot infrastructure — the visual-regression scaffolding for the rendering parity story.

BRepos missing from the diagram (the AI orchestration layer)

mc-omni-agent-ui · 4,956 KB · TypeScript

Last push: today (May 13 2026, 18:02 UTC). Most recently pushed repo in the entire org. Contains AGENTS.md and CLAUDE.md at root — agent-architecture documentation in-repo. Active contributors last 6mo: jarama 233, sprioleau 124, jlittle4 123, ccovell 107 — 691 commits across 4 active humans + a service bot.

This is where conversational journey editing (P4.2.1, the Q5 ★ Strategy moment) is being built. Cross-references with the editor by sharing 3 of the 4 top engineers (sprioleau, ccovell, jlittle4) — same hero pool, two products.

mc-omni-mcp · 546 KB · Python

Last push May 4 2026. Contains agents_and_tools.yaml (MCP tool registry), JenkinsfileAgenticStage.snippet (CI agent stage), .cursorrules + .windsurfrules (in-tree IDE rules). This is the Model Context Protocol server — the agent backend for the omni surface above.

Top contributors: jdudley1 36, amilt (Austin Milt — same engineer who shipped the Brand Kit fix in HVC Theme 8) 32, jlittle4 17. Austin Milt is splitting time between Brand Kit reliability and the agent backend — Layer 5 hero-engineer concentration extends to AI infra.

document-data-store · 615 KB · TypeScript

Last push today. Newer parallel/successor to the Kotlin nuni-document-store (which hasn’t shipped since Jan). Likely the read/write path the active TS stack uses. Migration from Kotlin → TS data store is in progress; not labeled in the diagram.

Risk: Two document stores in parallel echoes the Classic-vs-NEB editor split. If the Kotlin store still serves any production traffic, it’s a bifurcation in the persistence layer.

marketing-email-builder · 360 KB · TypeScript

Last push Oct 29 2025 (6+ months stale). Possibly a thin wrapper / consumer of the platform — the name suggests it’s the campaign-side host. Status unclear from metadata alone; needs ownership clarification.

Adjacent repos in same state: email-nea (197 KB, Sep 2025), forms-builder (268 KB, Sep 2025), sms-registration-ui (198 KB, Oct 2025) — a small constellation of TS UIs all 6+ months stale.

proposal-builder · 4,399 KB · TypeScript

Active (last push today). Larger than nuni-core-ui. Top-of-org by recent push order. Possibly a parallel builder for the proposal/sales-doc product sharing the platform shell. Worth confirming whether it consumes builder-platform as a consumer or has forked logic.

transact-builder · 3,175 KB · TypeScript

Active. Likely the transactional-email builder — Mailchimp Transactional (formerly Mandrill). Strategy memo’s Health Tab notes Transactional Established −10.5% YoY; this is the repo where retention work would land.

CStack inventory across the active core

RepoLanguageFrameworkTestsState mgmtBuild
nuni-coreTypeScript 5.6None (lib) · React 19 peerJest + 75 unit; 14,731 test LOC ≈ 111% of sourceimmer 11 + zod 3.25tsc · auto for releases
nuni-core-uiTypeScript 4.8React 17.0.2 · TipTap 3.20 · styled-components 4.4Jest + 16 unit (3,438 LOC ≈ 17% of source); Cypress folder = 1 scaffold speczustand 4.5 + immer 11@appfabric/plugin-cli (Intuit internal)
builder-platformTypeScriptReact 18.3 · drag-drop: @atlaskit/pragmatic-drag-and-drop 1.7Jest + 64 unit (11,315 LOC ≈ 137%)(consumer of host store)tsc
nuni-apiTypeScriptHono 4 · Pino loggingJest + 13 unit(stateless service)tsc + Docker · pre-push CI hook
email-render-pipelineTypeScriptjsdom + custom nuni-renderer-jsdom + screenshot diffVitest + 2 (calibration, scoring)(stateless)tsc
html-to-nuni-parserJava 17Maven · Lombok · 122 source filesJUnit (count not enumerated; 202 prod-test HTML fixtures)(stateless service)Maven + Docker
nuni-document-storeKotlinGradle Kotlin DSL · Spring (likely)Gradle test (count not enumerated)(JPA / data layer)Gradle + Docker
document-data-storeTypeScript(NEW · supersedes Kotlin store)
mc-omni-agent-uiTypeScript(unscanned in this pass)
mc-omni-mcpPythonMCP server(unscanned)Docker · Jenkins agentic stage

Stack-fragmentation finding

The NUNI surface ships in 6 languages: TypeScript, JavaScript, Kotlin, Java, Go, Python. Each language carries its own dependency tree, security audit cadence, CI lane, and on-call training cost. The migration tooling alone (Go for editor-migration-release + editor-migration-workbench-runner; Java for the parser; Kotlin for the legacy doc store) is three runtimes. This is not unusual for a 4-year-old platform, but it is operational tax that compounds with the React-version drift.

Three React versions across three layers consumed by the same product (React 17 in nuni-core-ui, React 18.3 in builder-platform, React 19 peer in nuni-core) is the playbook’s Layer 2 dependency-debt red flag in its purest form. It works today via React’s backwards-compat guarantees, but the moment nuni-core uses a React-19-only API (e.g. use(), async transitions), nuni-core-ui breaks unless it bumps too.

Sources: gh api orgs/collab-email/repos --paginate (62 repos enumerated). Per-repo package.json, build.gradle.kts, pom.xml read from shallow clones. Last-push timestamps from GitHub repo metadata. Contributor counts from gh api repos/<repo>/commits?since=2025-05-01T00:00:00Z --paginate. Cross-referenced with diagram in user-supplied image (Mailchimp New Builder (NUNI), dated May 13 2026).

Phase 1 · Repo Deep Dive (Playbook §3)

Seven-layer forensic analysis on nuni-core, nuni-core-ui, builder-platform, nuni-api, email-render-pipeline

Each of the seven layers from the playbook’s Phase 1 framework, applied with reproducible repo evidence. Findings rated as Strength (good), Watch (warn), or Risk (bad).
Layers: 7
Repos in scope: 5 active core
Method: Shallow clones + gh api
L1
Layer 1 · Architecture & Structural Health

The platform is modular; the consumer surface is god-class drifty

What we found:

  • Modular decomposition is real at the schema layer. nuni-core/src/ splits into document/, edit/, define/, render/, renderers/email/, channel/email/, validate/, load/ — each a distinct concern, each importable independently via package exports map. This is what the playbook calls "Strong" (modular components / rendering-engine / template-parser / preview-service).
  • builder-platform is also clean: blocks/Spacer|Image|Table|Divider|Text/{renderers,migrations} shows per-block ownership of rendering + migration paths. Migration paths inside the block dir is a forward-thinking architectural choice — schema versions ship beside the block.
  • God file in nuni-core-ui: src/js/widgets/editor/NuniCoreEditor/platform/store.ts at 966 LOC — over the playbook’s 800 LOC threshold. This file is the high-fan-in choke point for state, save, conflict, and presence. Multi-author (HVC #4) and block-ordering (HVC #5) bugs both flow through it.
  • Schema versioning is institutionalized: nuni-core/src/validate/v20260113/, v20260225/, v20260316/ — three schema versions shipped this year alone (Jan, Feb, March). The validate.ts dispatches by version. Forward compatibility is being engineered, not bolted on.
  • Six languages across the org (TS, JS, Kotlin, Java, Go, Python) — operational complexity tax compounded with three React versions in the live consumer chain.
Strengths: Schema modularity, version dispatch, per-block migration paths, command-pattern edit(), semantic block types. The library half of NUNI is well-architected.
Risks: 966-LOC store.ts; three React versions in the live chain (17 / 18.3 / 19); Kotlin doc-store running in parallel with new TS doc store (persistence-layer bifurcation echoes the editor bifurcation customers hate).
L2
Layer 2 · Dependency & Security Posture

Renovate is wired up; major-version drift is the tax

What we found:

  • Renovate is configured on every active TS repo (renovate.json extends Intuit’s AppFabric/renovate-config). Auto-update bot runs as svc-uxinfra-bot (12 commits in nuni-core-ui last 6mo, 104 in mc-omni-agent-ui) — the harness is healthy.
  • The 25-version drift on the schema lib is not a Renovate failure — it’s a deliberate (or neglected) pin: nuni-core-ui/package.json declares "@collab-email/nuni-core": "1.49.0" exactly (no caret), preventing Renovate from upgrading. Either there’s a known incompatibility, or the team is afraid of the schema bump. This needs a decision.
  • React-version mismatch: nuni-core@1.74.5 declares "react": "^19.2.4" in dev/peer; builder-platform declares "react": "~18.3.1"; nuni-core-ui declares "react": "17.0.2" exactly. Three majors live concurrently in the production consumer chain.
  • Stale ecosystem markers in nuni-core-ui: react-intl@2.9.0 (current major: 7.x), styled-components@4.4.1 (current: 6.x), tabbable@4.0.0, focus-trap@7.6.5, TypeScript 4.8 (current: 5.7). These work, but they bloat bundle and gate UI library upgrades.
  • Node engine pin: "engines": { "node": ">= 18.0.0 < 19.0.0" } — Node 18 only. Node 18 entered maintenance LTS Oct 2024 and is end-of-life April 2025. This pin will break before Q3 FY27 if not bumped.
  • Three design systems present in nuni-core-ui: @design-systems/icons (Intuit), @mcds/components (Mailchimp), and @ids-ts/* (Intuit TypeScript). Three component libraries inside the same editor — Brand consistency UX paradox.
  • Real-time stack present but unused: pusher-js@4.3.1 as a top-level dep. No yjs, @tiptap/extension-collaboration, liveblocks. Pusher 4.x is itself a stale major (current: 8.x).
Strengths: Renovate harness exists; auto for releases is configured; secret-detection ESLint plugin (eslint-plugin-no-secrets) is enabled in the editor.
Risks: 25-version intentional pin between editor and schema lib; 3 React versions; stale UI ecosystem (react-intl 2.9, styled-components 4.4); Node 18 pin nearing EOL; Pusher 4 (legacy major) carrying the future real-time story.
L3
Layer 3 · Test Coverage & Quality Infrastructure

The library has tests; the editor doesn’t. The visual regression rig exists but isn’t wired into CI.

What we found:

RepoSource LOCTest LOCRatioVerdict
nuni-core13,22314,731111.4%EXCELLENT
builder-platform8,23811,315137.4%EXCELLENT
nuni-core-ui (the actual editor)20,6043,43816.7%FEAR-DRIVEN
nuni-api(not enumerated)13 test filesLIGHT
email-render-pipeline(not enumerated)2 test filesSCAFFOLD ONLY
  • The schema library and platform shell are well-tested. nuni-core test files include ImageBlockSchema.test.ts (854 LOC), formatErrors.test.ts (837 LOC), ButtonRenderer.test.tsx (684 LOC) — substantive integration-flavored unit tests, not happy-path-only.
  • The editor UI is the gap. 16.7% test/source ratio is below the playbook’s "fear-driven engineering" threshold (40%). The 16 tests that exist focus on schema conversion + block definitions + property controls — none exercise the Multi-author save path, the Block-ordering path, the Conflict-resolution path, or the Save-on-network-failure path. The HVC themes #4 (multi-author) and #5 (block ordering) are structurally undertested.
  • NO end-to-end tests anywhere in the active core.
    • nuni-core-ui/cypress/integration/examples/HelloWidget.spec.ts — 1 file, scaffold name, looks like template default.
    • emails-nuni-editor/cypress/integration/examples/McappWidget.spec.js — 1 file, scaffold (and the repo is dead).
    • No Playwright. No Percy. No Chromatic.
    The playbook calls this exactly: "No E2E on a visual builder = ‘previews don’t match sent emails’ bugs" — and HVC Theme 3 ($1,820/mo cited) is exactly that bug pattern.
  • The visual regression infrastructure exists but isn’t used. email-render-pipeline ships calibration/, compare/, scoring/, screenshot/ with PNG fixture sets and a generate.ts for golden data. The infra is 70% built. It’s gated by 2 unit tests and isn’t wired into nuni-core-ui CI. Cheapest L5 retention save in the brief: finish wiring this in.
  • html-to-nuni-parser has 202 prod-test HTML fixtures (app/src/test/resources/prod-test-nuni-html-data/, prod-tool-test-nea-html-data/) — golden-data discipline exists on the JVM side. Mirror it on the TS side.
  • Pre-push hook on nuni-api runs yarn clean && yarn build && yarn test:ci (per CLAUDE.md) — strong gate.
Strengths: Schema and platform layers excellently tested. Visual regression infra in email-render-pipeline is largely built. Pre-push hook on the API.
Risks: 16.7% test/source ratio on the editor UI = fear-driven shipping. Zero E2E on a visual builder. Visual regression rig sits unused in CI. The HVC bug clusters that customers cite ($1,820 rendering, $340 multi-author, $410 block ordering) are precisely the unfilled test surfaces.
L4
Layer 4 · Code Complexity Hotspots

Top-10 churn × complexity intersection sits in nuni-core-ui/store.ts, nuni-core/document/operations.ts, renderers/email/SocialFollowRenderer.tsx

Largest source files (Layer 4 thresholds: >800 LOC = god-class candidate; >500 LOC = complexity hotspot):

FileLOCRepoConcern
src/js/widgets/editor/NuniCoreEditor/platform/store.ts966nuni-core-uiGod-class candidate. State/save/conflict/presence concentration. Touched by HVC #4 + #5. Decompose to unblock Q5 collab.
src/channel/email/schemas/ImageBlockSchema.test.ts854nuni-coreTest file; complexity reflects schema breadth, not anti-pattern.
src/channel/email/functions/formatErrors.test.ts837nuni-coreTest file (good).
__tests__/StaticRenderer.test.tsx739builder-platformTest file (good).
src/js/widgets/email-editor/EmailEditor/services/schemaConverter.ts687nuni-core-uiProduction code over 600 LOC. Bridges old "email-editor" widget to NEB schema. The schema-conversion path — direct candidate for the 25-version-drift bump-and-rewrite work.
src/renderers/email/ButtonRenderer.test.tsx684nuni-coreTest file (good — Button is highest-fan-in block).
src/channel/email/schemas/schemas.ts664nuni-coreSchema registry. Production code; not a problem if cohesive (schema declarations).
src/document/operations.ts641nuni-coreProduction code. Contains addBlock / moveBlock / moveToColumnPosition / duplicateBlock. Heavy churn likely (HVC #5 cluster lives here).
src/renderers/email/SocialFollowRenderer.tsx626nuni-coreProduction code. Single-block renderer at 626 LOC = block-specific complexity. Likely Outlook/Gmail/AOL conditional rendering.
controls/RichTextToolbar.tsx611builder-platformProduction code. Toolbar = high-fan-in surface; refactor candidate.

The four production hotspots (>600 LOC, non-test): store.ts, schemaConverter.ts, operations.ts, RichTextToolbar.tsx. Three of them are in the editor consumer chain (nuni-core-ui + builder-platform); the fourth (operations.ts) is in the schema lib but is mutating-API code and likely high-churn. Per the playbook’s Layer 4 superpower lens — "complexity × churn = real choke points" — these four files are where the FY27 customer-pain dollars concentrate.

Risks: Four production files over 600 LOC, three on the customer path. store.ts at 966 is over the god-class threshold and gates the Q5 collab moment.
L5
Layer 5 · Commit & PR Patterns (Velocity Forensics)

PR cycle time is healthy on most repos; hero-engineer concentration is a P0 risk on every active repo

RepoTop contributor concentration (last 12mo)PR medianPR p95Verdict
nuni-coresprioleau 147 + jhunsucker 106 = 76% of commits between 2 humans17.6h75.0hHERO 2-of-N
nuni-core-uisprioleau 34 + ccovell 28 = 75% across 2 humans (low total: ~83 commits in 12mo)7.1h692.6h (29 days)REVIEW BOTTLENECK
builder-platformccovell alone 181 commits = 47%; second contrib at 592.8h98.0hSINGLE HERO
nuni-apismoore16 67 = 56% single-author3.4h64.6hSINGLE HERO
mc-omni-agent-uijarama 233 + sprioleau 124 + jlittle4 123 + ccovell 107 — 4 active humans + service botDISTRIBUTED
  • Hero engineer cross-product: sprioleau appears as #1 or #2 in nuni-core, nuni-core-ui, mc-omni-agent-ui — three of the four most-critical surfaces. ccovell appears as #1 in builder-platform AND #2 in nuni-core-ui AND #4 in mc-omni-agent-ui. Two engineers carry the floor of the FY27 commit. Per playbook §1.1 this is the "Hero engineer dependency" failure mode in pure form.
  • nuni-core-ui PR p95 = 692.6 hours (29 days). The median is 7 hours but the long tail is 4 weeks for a PR to merge. Per playbook Layer 5 thresholds: "> 3 days from open to merge = bottleneck, understaffed, or ownership gap". The editor UI has all three.
  • builder-platform fast median (2.8h) is consistent with single-hero approval — fast because one person decides; same person is the bus-factor risk.
  • Velocity ratio: mc-omni-agent-ui alone has shipped roughly 8× more commits in the last 6 months than nuni-core-ui. The team is shipping AI features faster than the editor that hosts them.
  • nuni-core release cadence: Tagged 1.74.5 currently; tag history (auto-it/git-tag plugin configured) suggests semver discipline; weekly-or-better release cadence implied by the 25-version delta over ~10 months.
Strengths: Conventional commits via auto; Renovate bot is healthy; PR median time-to-merge is healthy across the org (median < 24h on every active repo).
Risks: Hero-engineer dependency on every single active repo. nuni-core-ui p95 PR time = 29 days = unstuck-after-month review path. AI surface is shipping at 8× the rate of the editor that hosts it.
L6
Layer 6 · Performance & Error Handling

Bugsnag is wired; bundle analyzer is not; email-client compat hacks are minimal in source (because the renderer abstracts them)

What we found:

  • Observability: @bugsnag/js@8.8.1, @bugsnag/browser-performance@3.4.1, @bugsnag/plugin-react@8.8.0 — Bugsnag + Browser Performance + React error boundary integration. No Sentry, no Datadog RUM detected. Single-vendor observability.
  • Bundle analysis: nuni-core-ui/webpack.config.js is bare (per the comment block, plugin-cli handles the build) — no webpack-bundle-analyzer, no source-map explorer, no preload hints visible at this level. Bundle size is unlikely to be measured per-PR.
  • Email-client compat: Searching for outlook|gmail|MSO|
    L7
    Layer 7 · Feature Flag & Configuration Debt

    No detectable feature-flag system inside the editor. Every deploy is all-or-nothing for 888K Established users.

    What we found:

    • Grep across nuni-core-ui/src + builder-platform/src for featureFlag|FeatureFlag|launchDarkly|optimizely|isExperiment|experimentKey|flagService: zero matches.
    • It’s plausible that flag resolution happens at the platform-shell or nuni-api level (Mailchimp’s internal flag service is presumably called server-side and decisions are baked into the bootstrap response). But at the editor surface, every customer gets the same code on every deploy.
    • This is the playbook’s Layer 7 red flag in pure form. The Strategy memo’s Q1 Brand Kit fix, Q2 Universal Content MVP, Q4 Write with AI ungate, and Q5 collab moment ALL assume cohort rollouts. Without an editor-layer flag harness:
      • Universal Content can’t be A/B tested for adoption velocity — ship-or-don’t.
      • The Brand Kit data fix (50% ramp confirmed by Austin Milt in HVC #8) — confirm this ramp is happening at nuni-api, not in the UI.
      • The Write with AI geo-ungate has to be a routing decision in nuni-api, not a UI flag.
    • Stale config detection: No top-level magic-URL strings in nuni-core-ui/src per spot-check; config.json at root contains build-time config (region/locale defaults). The team uses plugin-cli for build, which likely injects environment via NODE_ENV at compile time.
    • language-config.json at repo root is the i18n entrypoint — pairs with the (stale) react-intl 2.9 stack. International rollout of Write with AI requires the i18n stack to actually work.
    Strengths: Build-time config is centralized in config.json + language-config.json; no obvious magic-URL hardcoding visible.
    Risks: No detectable editor-layer feature flag system. Every roadmap milestone in Q1–Q5 assumes incremental cohort rollout. Confirm the harness exists, or scope a 2-week harness spike before Q1 ships.

    Method: Each layer applied per the Product Technical Intelligence Playbook §3 (Days 3–7 deep dive). Evidence collected via shallow-clone + find/grep/wc/jq against the latest tip of main/master. Contributor and PR data from github.intuit.com REST API on May 13 2026. All findings are reproducible — see Method & Sources tab for the exact queries.

Phase 3 · Organizational Failure Mode Analysis (Playbook §5)

The codebase tells a clear org story: two heroes, two parallel doc stores, two parallel builders, and an AI surface running on its own track

Not every problem is technical. Six organizational failure modes from the playbook (§5), each with the repo evidence that surfaced it.
Failure modes assessed: 6
Evidence base: Repo metadata + commit forensics
Failure mode 1 · Single approver bottleneck (hero engineer)

Two engineers carry the floor of the FY27 commit

Signals:

  • sprioleau = top contributor in nuni-core (147 commits = 53%), top in nuni-core-ui (34 = 41%), #2 in mc-omni-agent-ui (124 commits). One person, three of the four most-critical surfaces.
  • ccovell = top contributor in builder-platform (181 commits, 47%), #2 in nuni-core-ui (28), #4 in mc-omni-agent-ui (107). One person, also three of the four critical surfaces.
  • nuni-core-ui p95 PR time = 692 hours (29 days) — long-tail PRs sit waiting on the same approver pool.

Diagnostic question (per playbook): "What happens if this person is on vacation?"

Likely root cause: Hero engineer dependency. Knowledge transfer hasn’t been deliberately staffed against. Bus factor on the FY27 commit ≈ 2.

Mitigation (within 30 days): Name a designated co-owner on each top-3 critical-path repo. Pair-program on the next two PRs. Rotate one Q1 ship lead away from sprioleau / ccovell.

Failure mode 2 · Engineers avoid certain areas (fear-driven engineering)

The 16.7% test/source ratio on nuni-core-ui is the codebase-level signal

Signals:

  • nuni-core: 111% test/source ratio. builder-platform: 137%. nuni-core-ui: 17%.
  • Zero E2E tests on a visual builder. The entire 4-week BFCM rendering parity story rests on manual QA.
  • The store.ts 966-LOC god file, the 687-LOC schemaConverter.ts bridging dead-repo to live-repo, and the unused email-render-pipeline rig together describe a system where the safest code-paths are the ones nobody touches.

Diagnostic question (per playbook): "What systems create the most anxiety? What code does nobody want to touch?"

Likely root cause: Low test coverage + high complexity in the editor UI = engineers reach for the AI surface (which has clean greenfield tests) instead. This explains the 8× velocity ratio between mc-omni-agent-ui and nuni-core-ui.

Mitigation: Wire email-render-pipeline golden-data screenshots into the nuni-core-ui CI gate. Add 4 cypress tests covering the HVC #3, #4, #5 bug clusters before any new editor feature. Treat test-first as a precondition for the Q2 Universal Content ship.

Failure mode 3 · Constant modernization talk, no customer value shipped

The opposite is happening here — but watch the AI rebrand

Signals:

  • The team is shipping customer value (Brand Kit incident closed, Theme 6 templates fixed, schema versions advancing). Loss-attribution’s booked layer is "only" $2–4M because the team has been productive.
  • BUT the AI agent surface (mc-omni-agent-ui, mc-omni-mcp) is running 8× faster than the editor — and the Strategy memo’s explicit Guiding Principle #2 says "AI cannot compensate for broken editor trust."
  • The risk is the AI surface being framed externally as "Mailchimp’s answer to Klaviyo Marketing Agent" while internal Pillar 1 (Quality & Trust) underdelivers.

Diagnostic question (per playbook): "Modernization for customer value or engineer preference? What’s the customer-facing benefit?"

Honest read: The customer-value flow is healthy at the moment. But the next 6 months will be tested by the AI surface’s commit velocity vs the editor’s commit velocity. Track the ratio quarterly.
Failure mode 4 · Bugs never die (cited HVC themes recur)

The Brand Kit incident shows the system can close bugs; coverage gaps explain why others recur

Signals:

  • HVC #8 (Brand Kit data correctness) was closed (amilt — Austin Milt — confirmed the 50% ramp). System works when prioritized.
  • BUT HVC #3 (NEB rendering — forwarded mail / mobile / read-full-message) has 4 cited customers across 4 dates over 2.5 months — recurrence pattern. No regression-test coverage for these scenarios in nuni-core-ui.
  • HVC #5 (block ordering) — same pattern. Customer says "won’t let you move them without a refresh" — that’s a state-machine race, exactly the kind of bug that recurs after each release without E2E coverage.

Diagnostic question (per playbook): "Who owns quality? What happens when a bug is found?"

Likely root cause: Bug ownership is implicit (the engineer who touched it last) rather than explicit (the on-call PM/EM). No regression test added at fix time = future regression on next refactor. The visual-regression rig in email-render-pipeline is the institutional answer waiting to be wired in.
Failure mode 5 · Everything depends on another team

SMS, Canva integration, and Intuit Assist core all sit outside the collab-email org

Signals:

  • SMS composer: The only SMS-related repo in collab-email is sms-registration-ui (198 KB, last push Oct 28 2025 — 6+ months stale). The actual SMS send pipeline (where the $57K TCPA incident lives) is in a different org. Strategy P5.2.3 (TCPA guardrails) is a cross-org dependency.
  • Canva integration: The HVC #13 silent-failure pattern ($2,500+/mo cited) lives between Canva’s OAuth API and the asset reference in the document tree. The asset-resolution path likely lives in a separate platform service. Cross-org.
  • Intuit Assist / Write with AI: The model availability + geo-policy decisions are an Intuit-platform-level decision, not collab-email. The mc-omni-mcp + mc-omni-agent-ui repos are the integration surface, not the model. Strategy P4.1.1 (geo-ungate) is policy-cross-org-gated.
  • Three design systems (@design-systems/* Intuit, @mcds/* Mailchimp, @ids-ts/* Intuit-TS) means three external teams gating component upgrades.

Diagnostic question (per playbook): "How many teams need to coordinate for a single feature release?"

Likely root cause: Mailchimp + Intuit org structure splits ownership across the customer’s perceived "single product." Each cross-org dependency adds a quarter to delivery time. The Q1 Brand Kit fix shipped because it was in-org; the Q1 SMS TCPA fix needs alignment.

Mitigation: For the 3 cross-org Q1–Q5 dependencies (SMS pipeline, Canva integration, Write-with-AI policy), name a Senior PM-level escalation contact in the partner org now. Don’t wait for the dependency to slip.

Failure mode 6 · Features ship half-baked

Schema/edit API is finished; UI consumes a 25-version-old version of it

Signals:

  • nuni-core ships FragmentBlockSchema.ts, v20260316 validation, full edit() command pattern. The primitive for Universal Content is done at the schema layer.
  • nuni-core-ui consumes nuni-core@1.49.0 — locked to a version 25 minor releases behind. The UI doesn’t see the new primitives.
  • The README of nuni-core explicitly says: "We strongly recommend that you use the validation endpoints on Nuni API instead of directly depending on this library. This helps us minimize version drift across the ecosystem"and the editor itself is the violator.

Diagnostic question (per playbook): "What’s the definition of done? Who validates end-to-end experience?"

Likely root cause: "Done" is defined at each repo boundary, not at the customer-experience boundary. nuni-core ships a primitive; that’s done. nuni-core-ui hasn’t bumped to consume it; that’s a different team’s "done." The customer doesn’t see Universal Content until both sides ship.

Mitigation: Q2 ship-readiness criterion = "schema lib and editor consumer are on aligned majors." Make the version bump a precondition, not a parallel track.

Phase 5 · AI Readiness Assessment (Playbook §7)

The schema and edit layers score 7 of 7 ready signals; the AI surface is the leverage opportunity

Per the playbook’s 7-dimension AI readiness checklist (§7.1). Each dimension scored "Ready" or "Not Ready" against repo evidence. NUNI is the rare case where the foundation is more AI-ready than the AI surface assumes.
Dimensions assessed: 7
Score: 7 Ready · 0 Not Ready
Readiness dimensionReady signal (per playbook)Repo evidenceVerdict
Editor state structure JSON block tree with typed nodes nuni-core/src/document/types.ts defines Doc = Record<string, DocBlock> with typed nodes (id, type, parent, children, properties). operations.ts implements parent/child walks via findAncestorOfType(), getDescendants(). This is exactly the playbook’s "Ready Signal" definition. READY
Component semantics Semantic block types with metadata 31 typed block schemas: ButtonBlockSchema, ImageBlockSchema, TextBlockSchema, ColumnBlockSchema, EmailFooterBlockSchema, EmailImageGallerySectionBlockSchema, ProductBlockSchema, ProductRecsBlockSchema, PromoCodeBlockSchema, SocialFollowBlockSchema, SurveyButtonBlockSchema, VideoBlockSchema, FreddieBadgeBlockSchema, etc. Every block carries semantic type + Zod-validated property metadata. READY
Content modularity Block-level CRUD operations operations.ts exports addBlock, deleteBlock, updateProperties, moveBlock, duplicateBlock, moveToColumnPosition. Independent block-level CRUD. FragmentBlockSchema exists for cross-document blocks (Universal Content primitive). READY
Workflow observability Event bus or action log exists nuni-core/src/edit/log-collector.ts + edit/log/ directory. edit() returns an EditCandidate with logs. The action log is structurally present. Less clear is whether it’s emitted to a downstream bus (e.g. for AI training data) — but the structured log exists. READY
Machine-callable actions Clean API or command pattern edit/edit.ts header comment: "The single internal API for all document mutations. Pure function: (doc, edits, config) → EditCandidate. Zero React deps. Zero state. Zero side effects." Plus preValidate(), postValidate(), resolveEditTarget(). This is a textbook command pattern with pre/post hooks. An AI agent can call edit() directly without going through the UI. READY
Prompt / context access Metadata accessible at edit time Brand Kit lives in nuni-brand; document metadata in nuni-document-store; product catalog connectors are an integration surface. The EditConfig argument to edit() can carry context. mc-omni-mcp/agents_and_tools.yaml declares the tool registry. Brand Kit + audience + goal context can be assembled at the agent layer. READY
Safe state modification Command pattern with undo stack edit/types.ts: EditCandidate + EditResult + BlockValidationIssue; edit() takes validation: "strict" and mode: "transactional" options. document/intelligence.ts exports diff and snapshot (the undo-stack primitives). Pure functions + transactional mode = safe AI modification. READY
The rare 7-of-7 — what this means

The NUNI schema and edit layers are already more AI-ready than most code I’ve seen. Block-typed JSON tree + 31 semantic blocks + pure-function command-pattern edit() + transactional validation + structured action log = every "Ready Signal" the playbook checks for. Conversational journey editing in canvas (Strategy P4.2.1, Q5 ★) is technically achievable today. The blockers are not the code — they’re (1) the schema/UI version drift gating which schemas the AI can act on, (2) the agent-layer prompt + RAG context that connects Brand Kit + audience to the edit() call, (3) safety / brand-tone guardrails. None of those are 18-month builds; they’re 4–8 week scoped efforts.

BAI feature opportunity map (Playbook §7.2)

AI feature (Strategy memo P4 mapping)Structural deps (per playbook)Customer signalRepo readinessEstimated complexity
P4.1 Write with AI funnel recovery (geo-ungate + brand-tone fix)Prompt access · brand metadata · safe state modHIGH · Health Crisis (Explore −73.7%, churn 77.2%)READY at edit-API · Policy-gated at nuni-api routingMedium — policy + routing, not a rebuild
P4.2.1 Conversational in-canvas editingMachine-callable actions · component semantics · safe state mod · prompt/contextFLAGSHIP · Q5 ★ "Mailchimp is back, modern" momentREADY — every dep is in nuni-coreMedium — agent layer + UI sidebar + tool routing
P4.2.2 AI brand-style transfer between campaignsEditor state structure · content modularityLEAPFROG · No competitor ships thisREADY at schema · UI work = mostly net-newMedium-High — transfer-learning model + UI
P4.2.3 Prompt-first email mode (toggle)Component semantics · machine-callable actionsEMERGING · Mailmodo wins SMBREADY — full primitive coverageMedium — generation pipeline + scaffold UI
P4.3 Generative SMS in composerChannel agnostic edit API · prompt accessHIGH · SMS +73.5% adoption / 53% churnREADY at nuni-core/channel/email + (planned) channel/smsMedium — needs SMS channel in nuni-core
P4.4.1 AI image gen tied to product catalogPrompt access · 300+ ecom integrations · Brand KitUNIQUE COMBO — only Mailchimp has all 4 inputsCross-product surface (catalog connectors)High — model + catalog integration + UX
P4.4.4 In-canvas revenue per recipient (Klaviyo countermove)Prompt access · workflow observabilityKlaviyo capability gap closureREADY — log-collector + analytics tapLow-Medium — analytics surface in editor
I-3.1.4 AI Email Setup Agent (URL → campaign in 3 clicks, Klaviyo Marketing Agent counter)Prompt access · safe state mod · 260+ template registryHIGH · Klaviyo Marketing Agent (Spring ’25 GA) parityREADY · nuni-template-sources is the corpusMedium — orchestration + brand auto-extract

CWhat’s actually blocking each AI capability

Q5 Conversational AI (P4.2.1)

Code blocker: Schema/UI version drift. The agent will call edit(doc, edits, config) on the library’s schema (1.74), but the editor renders against the UI’s pinned version (1.49). New primitives won’t round-trip until the bump lands.

Non-code blockers: Tool registry definition in mc-omni-mcp; conversational sidebar UX in nuni-core-ui; Brand-Kit-aware prompt template; eval harness for "did this AI edit produce a valid send?"

Q4 Write with AI ungate (P4.1.1)

Code blocker: Geo-policy routing in nuni-api. Today the geo-gate is reportedly enforced UI-side (a Standard customer in NL doesn’t see the feature). Move the decision to the API layer to enable per-region rollout.

Non-code blockers: Intuit-level model availability + DPA/GDPR review for EU. This is the policy-cross-org dependency; technical work is < 2 weeks.

Q5 Real-time co-edit (P5.3)

Code blocker: Add @tiptap/extension-collaboration + a CRDT (yjs is the natural choice for TipTap). Wire the existing pusher-js channel as the transport. Decompose store.ts (966 LOC) so presence + cursors don’t merge into the main edit reducer.

Non-code blockers: Pusher 4.x → 8.x upgrade likely needed for modern presence APIs. Cleanest engineering story in the FY27 roadmap.

DThe non-obvious finding — the edit/ module is a moat

Across the 5 active core repos analyzed, the most strategically valuable artifact is nuni-core/src/edit/edit.ts. Why:

  • Pure function — no React, no state, no side effects. Trivially testable, trivially callable from any agent.
  • Pre/post validation — the AI can’t produce an invalid document, even with prompt-injection. preValidate runs before the mutation; postValidate runs after; "strict" mode rolls back invalid edits.
  • Transactional mode — multi-edit atomicity built in. AI says "make 3 edits"; either all 3 land or none do.
  • Structured log collector — every edit emits an entry, ready for the AI training data flywheel or a debugging sidebar.

This is not what most email-builder codebases look like. It’s what Klaviyo and Stensul are trying to build (their roadmaps reference "stable headless edit APIs" and "AI-callable block ops"). Mailchimp’s NUNI has it. The next 18 months are about exposing it correctly — through mc-omni-mcp as an MCP server, through a conversational sidebar, and through the schema bump in the editor. The capability is built; the productization is not.

Method: Each readiness dimension scored against the playbook’s §7.1 checklist using direct file reads from nuni-core/src/document/types.ts, nuni-core/src/document/operations.ts, nuni-core/src/edit/edit.ts, nuni-core/src/edit/types.ts, nuni-core/src/channel/email/schemas/ (31 schemas enumerated). Opportunity map cross-references Initiative Canvas P4 sub-pillar.

Architecture Review · 2-page Executive · NUNI / New Email Builder

The NUNI architecture is a story of two halves: a strategic-moat schema/edit library bolted to a version-drifted, undertested customer-facing UI

A 2-page architectural assessment for executive read. Page 1: SWOT + quality-attributes scorecard. Page 2: Implications + final recommendation, tied to the customer problem in the Editor Brief and the FY27 +$25–30M ARR commit in the Strategy Memo.
Page: 1 of 2
Frameworks: SWOT + ISO/IEC 25010 quality attributes
Aggregate score: 3.0 / 5

ASWOT analysis — the architecture in one view

Strengths · what to build on

  • Schema/edit library is a strategic moat. nuni-core/edit/edit.ts is a pure-function command-pattern API — "Pure function. Zero React deps. Zero state. Zero side effects." Klaviyo and Stensul are still trying to build this.
  • AI readiness 7/7 on the playbook checklist. Block-typed JSON tree, 31 semantic block schemas, transactional edit with pre/post validation, structured action log.
  • Real-time collab building blocks already in the deps. pusher-js@4.3.1 + TipTap 3.20 (collab-ready) + command-pattern edit(). CRDT add is a 4-week PoC, not a rebuild.
  • Visual regression infrastructure 70% built. email-render-pipeline ships calibration + screenshot diff + scoring + golden-data PNG fixtures. Just unused in CI.
  • Schema versioning institutionalized. 3 schema versions shipped this year (v20260113, v20260225, v20260316); per-block migration paths in builder-platform/src/blocks/*/migrations/. Forward-compat is engineered.
  • Library/platform test discipline excellent. 111% test/source on nuni-core, 137% on builder-platform. Substantive integration-flavored tests.

Weaknesses · what is in our way

  • 25-version schema/UI drift. nuni-core@1.74.5 vs nuni-core-ui consumes 1.49.0. The single architectural defect that gates Q2 Universal Content + Q5 unified canvas.
  • Three React versions in the live consumer chain. 17 / 18.3 / 19. Works today via backwards-compat; breaks on the first React-19-only API in nuni-core.
  • Editor UI test ratio 16.7% vs library 111% / platform 137%. Fear-driven engineering on the customer-facing layer; HVC #4 multi-author + #5 block-ordering bugs are structurally undertested.
  • 966-LOC store.ts god file. High-fan-in choke point for state, save, conflict, and presence. Gates Q5 collab story.
  • Stale UI ecosystem. react-intl@2.9 (current 7.x), styled-components@4.4 (6.x), Node 18 EOL April 2025, pusher-js@4 (current 8.x). The i18n stack alone gates the international Write with AI ungate.
  • No editor-layer feature flag harness detectable. Every Q1–Q5 strategy commit assumes incremental rollout; the harness probably lives at the API gateway, not the editor.
  • Six languages in the org + three design systems in the editor (Intuit + MC + IDS-TS) = operational complexity tax that compounds with every dependency.

Opportunities · what we should go after

  • One schema bump unlocks three quarters of roadmap. Bumping nuni-core-ui to nuni-core@^1.74 simultaneously enables Q2 Universal Content, Q5 unified email+SMS canvas, and Q6 fragment-graph governance.
  • Expose edit() as an MCP tool registry. Makes Mailchimp’s editor more AI-callable than Klaviyo’s. First-mover on conversational journey editing — Q5 ★ "Mailchimp is back" credibility moment becomes a 4–8 week effort.
  • Decompose store.ts as the highest-leverage refactor. Unlocks HVC #4 multi-author save + HVC #5 block-ordering + Q5 real-time collab simultaneously.
  • Wire email-render-pipeline into nuni-core-ui CI. Cheapest L5 retention save in the brief — closes HVC #3 ($1,820/mo cited) regression pattern with infrastructure already 70% built.
  • Q5 real-time collab ships in a 4-week PoC, not a 6-month rebuild. Pusher present, TipTap collab-extension-ready, command-pattern edit() in place. Cleanest engineering story in the FY27 roadmap.

Threats · what could hurt us

  • Hero-engineer bus factor of 2. sprioleau + ccovell carry top-3 commit share on 3 of 4 critical surfaces. FY27 commit dependent on continuity.
  • AI surface shipping ~8× faster than the editor it sits on. mc-omni-agent-ui ≈ 691 commits/6mo vs nuni-core-ui ≈ 83. Strategy Memo’s "AI cannot compensate for broken editor trust" is being violated structurally.
  • Three React versions = forced-migration latency bomb. When nuni-core uses any React-19-only API (e.g. use(), async transitions), the editor breaks unless it bumps too.
  • Klaviyo’s parity launches accelerate the timing risk. Spring 2026 Universal Content is already public; every quarter delayed compounds the migration narrative in VoC.
  • Node 18 EOL'd April 2025; nuni-core-ui/package.json still pins "node": ">= 18.0.0 < 19.0.0". Will break under future security patches.

BArchitecture quality attributes scorecard (ISO/IEC 25010 lens)

10 standard architecture quality attributes scored 1–5 against repo evidence. Aggregate 3.0/5 hides the bimodal split: library/platform layers score 4–5; the customer-facing editor UI scores 1–3.

AttributeScoreVisualizationRepo evidence
Modularity4 / 5
nuni-core splits into document/, edit/, render/, renderers/, channel/, validate/; builder-platform per-block renderers/migrations/.
AI readiness5 / 5
7/7 playbook signals. Pure-function edit() + 31 semantic blocks + transactional validation + structured action log.
Time-to-market for new blocks4 / 5
Block schema + per-block migration pattern is established; new schema versions ship every ~6 weeks.
Testability3 / 5
Library/platform 111–137%; editor UI 16.7%. Bimodal — score reflects the gap.
Observability3 / 5
@bugsnag/js + @bugsnag/browser-performance + @bugsnag/plugin-react integrated. Single-vendor; no Datadog RUM.
Security posture3 / 5
Renovate active; eslint-plugin-no-secrets enabled; Node 18 EOL near; 3 design systems = 3 supply-chain surfaces.
Reliability gates2 / 5
No E2E on a visual builder; vis-reg rig built but unwired; 16.7% test ratio on the customer surface.
Maintainability2 / 5
3 React versions; 25-version schema drift; god-class store.ts; 3 design systems.
Dependency currency2 / 5
react-intl 5 majors behind; styled-components 2 majors behind; Pusher 4 majors behind; Node 18 EOL.
Cost / op complexity2 / 5
6 languages in the org (TS, JS, Kotlin, Java, Go, Python); migration tooling alone is 3 runtimes.
Aggregate3.0 / 5Library/edit-API layer scores 4–5 (strategic asset). Customer-facing UI layer scores 1–3 (consumer-side debt). The gap is the architectural defect.

Method: SWOT framework + ISO/IEC 25010 software-quality attributes scored against the same repo evidence used in the 7-Layer Forensic and AI Readiness tabs. Each score is reproducible from the queries in Method & Sources.

Architecture Review · 2-page Executive (cont.) · NUNI / New Email Builder

Implications & final recommendation — tied to the customer problem and where the product is heading

Page 2: business + customer implications of the SWOT and the recommended actions for the next 1–2 quarters.
Page: 2 of 2
Anchor: Strategy Memo +$25–30M FY27 ARR

CCustomer problem context (one paragraph)

The Editor Brief documents $95K/mo in cited HVC MRR across 17 themes, 7 VoC hate themes, bulk-email Established users −9.4% YoY, and Write with AI Explore funnel collapsed −73.7% YoY. The customer pain decomposes into three categories: trust (NEB rendering bugs, multi-author save conflicts, Brand Kit reliability), competitiveness (Klaviyo Spring ’26 Universal Content, no real-time co-edit, geo-gated AI), and unification (NEB+Classic split, email+SMS surface split). The Strategy Memo commits the editor to +$25–30M FY27 ARR via 5 customer-benefit pillars over 6 quarters; mid scenario worked at ~$26.2M. Every Q1–Q5 commitment in the strategy is achievable on the foundation that exists today; timing is at risk because the consumer surface is undermaintained relative to the library.

DStrategic implications

  1. The library is more strategic than the UI. nuni-core’s pure-function edit() is a moat; nuni-core-ui is the bottleneck. The 25-version drift is the architectural symbol of this — engineering investment is concentrated where it should be (the schema), but customer experience lives where it shouldn’t (the consumer surface).
  2. The AI moat shrinks if we don’t expose it. The 7/7 playbook readiness is a competitive advantage in May 2026. By Q4 FY27, Klaviyo or Stensul will close it. The window to convert architectural readiness into customer-facing AI features is 12–18 months.
  3. Q5 real-time collab is the cleanest engineering story in the entire FY27 roadmap and the most important brand-narrative shift. Pusher present, TipTap collab-ready, command-pattern in place. Shipping it on time turns "Mailchimp is dated" into "Mailchimp is back, modern."
  4. One architectural defect causes three customer pains. Bifurcation (VoC #1), no Universal Content (#6), and no HTML escape (#7) all map to nuni-core-ui not consuming current schema lib. One fix → three story closures.
  5. The hero-engineer dependency converts every roadmap commitment into a continuity bet. Two engineers carry the floor of FY27. Mitigation must precede commitment, not follow it.

EFinal recommendation — five ordered actions

1 · Q1 — Bump nuni-core-ui to nuni-core@^1.74

Single highest-leverage action in the brief. Unblocks Universal Content (Q2), shared blocks (Q5), and removes the structural cause of 3 of 7 VoC hate themes. Estimate: 4–6 week spike + regression sweep. Cost: low. Strategic value: highest.

2 · Q1 — Wire visual-regression rig into nuni-core-ui CI

Cheapest L5 retention save. email-render-pipeline’s calibration + screenshot diff + scoring infrastructure is 70% built. Closes HVC #3 ($1,820/mo cited) regression pattern. Estimate: 2-week spike + ramp.

3 · Q2 — Decompose store.ts (966 LOC)

Critical-path refactor. Unblocks HVC #4 multi-author save fix + HVC #5 block-ordering fix + Q5 real-time collab moment. Decompose into presence + edit reducer + persistence; lay foundation for CRDT integration.

4 · Q2 — 2-week conversational AI PoC against edit()

Validates Strategy Memo Q5 ★ credibility moment. Expose edit(doc, edits, config) via mc-omni-mcp as an MCP tool; agent UI sends "make the hero block 20% smaller in a friendlier tone." Output: feasibility report + safety incident count.

5 · Q1+ ongoing — Name designated co-owners on all top-3 critical-path repos

Bus-factor mitigation. Pair sprioleau, ccovell, jhunsucker, and smoore16 with a designated co-owner on the next two PRs. Rotate one Q1 ship lead away from the hero pool. Cost: zero. Insurance value: highest non-technical lever in the brief.

FClosing — the one-line read

For the executive committee

The NUNI architecture is a story of two halves. The schema and edit-API layer is among the best automation/editor primitives in the SMB tier — modular, AI-ready, command-pattern, version-disciplined. The customer-facing UI layer is on stale React, undertested, version-drifted, hero-dependent. The FY27 +$25–30M commit is achievable because the foundation is right; the timing is at risk because the consumer surface is undermaintained. The single most important architectural action for Mailchimp leadership is closing the 25-version schema drift — every other Q1–Q5 strategy bet either depends on it directly or is made cheaper by it. Everything else flows from there.

Cross-references: Executive Summary for the 6 headline findings · Pain → Code Map for HVC theme → repo traceability · 7-Layer Forensic for evidence detail · AI Readiness for the 7/7 scorecard · Leverage Cheat Sheet for engineering-sync questions · Method & Sources for reproducibility.

Phase 4 · Building Technical Leverage (Playbook §6)

Specific questions to take into the next NUNI engineering sync, with the repo evidence behind each one

The playbook’s "Questions That Earn Engineering Respect" rewritten with NUNI-specific evidence. Each question is structurally informed — the engineer can’t hand-wave it away.
Format: Generic ask → NUNI-specific ask
Source: Playbook §6.1
"Why is Universal Content taking 9 months to ship?"
Better: "nuni-core is at v1.74.5 with FragmentBlockSchema already shipped, but nuni-core-ui consumes @collab-email/nuni-core@1.49.0 — a 25-version-old pin. What’s the plan to bump the schema lib in the editor before Q2? Is there a known incompatibility, or is the team scope-blocked on a regression sweep?"
"Can we add real-time multi-author collaboration?"
Better: "nuni-core-ui already declares pusher-js@4.3.1 as a top-level dep, and TipTap 3.20 supports @tiptap/extension-collaboration + yjs natively. The edit() command pattern in nuni-core/edit/edit.ts is pure-function and would round-trip through CRDT. What does a 4-week PoC look like — wiring the existing Pusher channel as transport for collab cursors and presence, decomposing the 966-LOC store.ts so presence doesn’t merge with the edit reducer?"
"Why do we have so many rendering bugs?"
Better: "email-render-pipeline ships a calibration + screenshot + scoring rig with PNG fixture sets and a generate.ts for golden data. It’s gated by 2 unit tests and isn’t wired into the nuni-core-ui CI gate. The HVC #3 rendering theme cites $1,820/mo across 4 named accounts — these are the exact regressions the rig was built for. What’s blocking us from making the visual-regression rig a CI requirement on nuni-core-ui?"
"When can we go AI-first?"
Better: "The edit/edit.ts module is documented as ‘Pure function. Zero React deps. Zero state. Zero side effects.’ with pre/post validation and transactional mode. nuni-core defines 31 semantic block schemas. The document/operations.ts CRUD primitives are already block-level. What’s blocking us from exposing edit() through mc-omni-mcp as the MCP server’s primary tool? Is the agent-side blocker prompt design, brand-context retrieval, or eval harness?"
"What’s the tech debt situation?"
Better: "Three React versions in the live consumer chain (17 / 18.3 / 19); the editor is on Node 18 (EOL April 2025); react-intl 2.9 is 5 majors behind current; styled-components 4.4 is 2 majors behind; Pusher 4 is 4 majors behind. nuni-core-ui test ratio is 16.7% vs 111% / 137% on the library and platform layers. Can we size a quarterly cleanup sprint and tie each item to the customer bug it would prevent — e.g. styled-components 4 → 6 for bundle size, react-intl 2 → 7 for the international Write with AI ungate?"
"Should we do an AI sprint?"
Better: "mc-omni-agent-ui shipped ~691 commits in the last 6 months across 4 active engineers; nuni-core-ui shipped ~83 across 2. The Strategy memo’s Guiding Principle #2 says ‘AI cannot compensate for broken editor trust.’ Are we shipping in the right priority order, given the cited HVC bug exposure on the editor side? What does a balanced 60/25/10/5 portfolio look like (per the playbook §6.2) for the next two quarters?"
"What’s our incident response on Brand Kit issues?"
Better: "Austin Milt (amilt) closed the HVC #8 Brand Kit incident with a 50% ramp; the same engineer is now top-3 contributor in mc-omni-mcp. What’s the on-call rotation that means HVC #8 doesn’t recur when Austin is heads-down on the agent backend? Where is the regression test that prevents the ‘stale Brand Kit / no colors’ pattern from coming back?"

BBalanced portfolio framework — applied to NUNI Q1 capacity

Per playbook §6.2, the 60 / 25 / 10 / 5 split. Applied to the NUNI roadmap as documented in the Initiative Canvas:

Customer-facing60%P1.1–P1.4 + P2.1 + P3
Tech debt payoff25%Schema bump · store.ts decomp · vis-reg CI
Strategic AI10%P4.1 ungate · P4.2.1 spike
Exploration5%Flag harness audit · Pusher upgrade spike
AllocationNUNI-specific work for Q1 (May–Jul ’26)Success metric
60% · Customer-facingHVC #3 rendering parity (4 cited accts) · HVC #8 Brand Kit incident closure (P1.2.1) · HVC #13 Canva sync (P1.3.1) · HVC #16 SMS TCPA $57K (P5.2.3, cross-org) · HVC #4/#5 (P1.1.2/3)Cited HVC MRR cleared this quarter; bulk churn 40.0% → 38.5% leading indicator
25% · Tech debt payoffBump nuni-core-ui from nuni-core@1.49@^1.74 (Q2 ship gate) · Decompose store.ts (966 LOC) into presence + edit reducer + persistence · Wire email-render-pipeline into nuni-core-ui CIEditor test/source ratio 17% → 35%; Q2 Universal Content ship is on its critical path
10% · Strategic AIP4.1.1 Write with AI policy track (geo-ungate scope) · P4.2.1 conversational sidebar PoC against edit() · MCP tool registry definition in mc-omni-mcpSpike report on conversational AI feasibility delivered Q1; Q4 ungate decision unblocked
5% · ExplorationFeature-flag harness audit (does it exist editor-side or only API-side?) · Pusher 4 → 8 upgrade spike for collab readiness · Node 18 → 20 migration scopingDecision document: editor-layer flag harness yes/no; if no, scope a Q2 spike

CThe "spike language" template (Playbook §6.3) — three NUNI scoping prompts

Spike 1 · 2-week schema bump dry-run. "Can we run a 2-week PoC to validate whether bumping nuni-core-ui from @collab-email/nuni-core@1.49.0 to @^1.74 breaks the editor on the top-3 customer journeys (campaign create, save, send)? Output: pass/fail + regression list."

Spike 2 · 2-week conversational AI PoC. "Can we run a 2-week PoC where mc-omni-mcp exposes edit() as a tool, the agent UI sends ‘Make the hero block 20% smaller, in a friendlier tone’, and we measure round-trip time + edit validity rate against the existing postValidate pipeline? Output: feasibility report + safety incident count."

Spike 3 · 2-week visual-regression CI integration. "Can we run a 2-week PoC wiring email-render-pipeline’s screenshot/calibration/scoring rig into nuni-core-ui CI, with the HVC #3 cited customer email patterns as the golden data set? Output: regression-rate baseline + ship/no-ship gate proposal."

Method & Sources

How this analysis was produced — reproducible, repo-first, zero-meeting

Every claim in this brief is reproducible from the queries below. No engineering interviews were conducted. Findings are drawn entirely from public-to-Intuit-employee artifacts on github.intuit.com/collab-email as of May 13 2026.
Snapshot: May 13 2026, 18:00 UTC
Repos enumerated: 62
Repos cloned: 8 (depth=1)

AFramework applied

Product Technical Intelligence Playbook — May 2026, 20-page internal reference. Specifically used:

  • §1.1 The Five Types of "We Can’t" — used in Org Failure Modes tab to classify cross-org dependencies.
  • §3 Phase 1 Repo Deep Dive: Seven-Layer Forensic Analysis — applied verbatim in the 7-Layer tab.
  • §4 Phase 2 Customer Pain → Code Mapping — direct mapping in the Pain → Code Map tab.
  • §5 Phase 3 Organizational Failure Mode Analysis — six failure modes assessed in Org tab.
  • §6 Phase 4 Building Technical Leverage (questions + balanced portfolio + spike language) — Leverage Cheat Sheet tab.
  • §7 Phase 5 AI Readiness Assessment — 7-dimension readiness scorecard in AI tab.
  • §8 Email Builder–Specific Investigation Checklist — drove the file-by-file scan of nuni-core-ui and nuni-core/src/document/.

BReproducible queries

Repo enumeration

GH_HOST=github.intuit.com gh api orgs/collab-email/repos --paginate \
  -q '.[] | "\(.name)|\(.language // "N/A")|\(.size)|\(.pushed_at)|\(.archived)|\(.default_branch)"'
# 62 repos returned

Per-repo metadata

for repo in nuni-core nuni-core-ui builder-platform nuni-api email-render-pipeline \
            html-to-nuni-parser nuni-document-store emails-nuni-editor; do
  GH_HOST=github.intuit.com gh api repos/collab-email/$repo --jq \
    '{name, language, size, pushed_at, default_branch, open_issues_count, forks, watchers_count, subscribers_count}'
done

Shallow clones (architecture + file-size + test analysis)

for repo in nuni-core nuni-core-ui builder-platform nuni-api email-render-pipeline \
            html-to-nuni-parser nuni-document-store emails-nuni-editor; do
  GH_HOST=github.intuit.com gh repo clone collab-email/$repo $repo -- --depth=1 --quiet
done

Layer 4 — file size / god-class detection

find $repo/src -type f \( -name "*.ts" -o -name "*.tsx" -o -name "*.js" -o -name "*.jsx" \) \
  -exec wc -l {} \; | awk '$1 >= 600' | sort -rn | head -25

Layer 3 — test/source LOC ratio

src_loc=$(find $repo/src -type f \( -name "*.ts" -o -name "*.tsx" \) \
          ! -name "*.test.*" ! -name "*.spec.*" -exec cat {} \; | wc -l)
test_loc=$(find $repo -type f \( -name "*.test.ts" -o -name "*.test.tsx" -o -name "*.spec.ts" \) \
           -exec cat {} \; | wc -l)
echo "$repo: src=$src_loc test=$test_loc ratio=$((test_loc * 100 / src_loc))%"

Layer 5 — contributor concentration (last 12 months)

GH_HOST=github.intuit.com gh api \
  "repos/collab-email/$repo/commits?since=2025-05-01T00:00:00Z&per_page=100" --paginate \
  -q '.[].author.login // .[].commit.author.name // "unknown"' | sort | uniq -c | sort -rn | head -8

Layer 5 — PR cycle time

GH_HOST=github.intuit.com gh api "repos/collab-email/$repo/pulls?state=closed&per_page=30" \
  | python3 -c "import json,sys,datetime; ..."  # see exec script for median + p95

CSources

TypeSourceUsed for
FrameworkProduct Technical Intelligence Playbook (Deepak — Product Management; May 2026 internal reference; 20 pages)Every section’s structural framework
Customer evidenceMailchimp Email/SMS Unified Editor & Builder Brief — 11 tabs (Executive, VOC, Klaviyo Brief, Klaviyo VoC, HVC Risk, User Research, Product Health, Growth Model, Loss Attribution, Initiative Canvas, Strategy Memo)VOC themes, HVC cited MRR, UR bets, BigQuery health metrics, FY27 commit math
Repo datagithub.intuit.com/collab-email/* via gh api + shallow clonesAll numerical findings: file LOC, dep versions, test ratios, contributor counts, PR cycle times
Architecture diagramUser-supplied image (Mailchimp New Builder (NUNI), dated May 13 2026, 9 functional layers)Reality-vs-diagram reconciliation in Repo Map tab

DCaveats & what would strengthen this analysis

  • No engineering interviews. Every interpretation is repo-evidence-only. The "schema/UI version drift is intentional" hypothesis assumes the team knows about it; confirm in the next sync.
  • Cross-org dependencies (SMS pipeline, Canva integration, Intuit Assist policy) were not deeply mapped. Three of seven HVC themes touch repos outside collab-email.
  • Bundle size, performance traces, and runtime profiles were not measured. Layer 6 findings are dep-level only. A Lighthouse pass on the editor + a webpack-bundle-analyzer run would close that gap.
  • Feature flag harness existence is inferred from grep absence. The flag service may live higher up the platform shell. Confirm in the next eng sync — this is the single most important "is it actually true" check before Q1 commits.
  • Incident frequency / on-call burden / Bugsnag dashboard data not in scope. Layer 6 reliability claims rely on dep presence, not measured uptime.
  • Some repos in the org were not cloned (proposal-builder, transact-builder, mc-omni-mcp, mc-omni-agent-ui, document-data-store, nuni-core-sdk). The findings here cover the editor-customer-path subset; broader scope would extend to those.

EHow this brief evolves

Per the playbook’s "Continuous Intelligence" mode (§9 timeline, "Ongoing"): this analysis should be re-run quarterly. Suggested cadence:

  • Q1 deliverable (Jul ’26): rerun Layer 3 + Layer 5; verify the schema bump landed; verify visual-regression CI integration; confirm the flag harness audit conclusion.
  • Q2 deliverable (Oct ’26): rerun all 7 layers post-Universal Content ship; track hero-engineer concentration trend.
  • Q3 deliverable (Jan ’27): AI readiness rescore after MCP server productionizes edit().

Confidentiality. The repo-level findings in this analysis are derived from github.intuit.com/collab-email/*, accessible to authorized Intuit employees. The Product Technical Intelligence Playbook is marked CONFIDENTIAL — Internal Reference Only. The customer-evidence sources (HVC, VOC, BigQuery) are summarized in the public-to-this-domain Editor Brief; named-customer MRR figures are cited only at theme-aggregate level. This brief is intended for executive review within the Mailchimp authoring-surface leadership audience; it should not be shared externally without redaction of the github.intuit.com URLs and named-engineer references.