AI Experiment Depth & Creative Pipeline Hardening
Apr 27 – May 3, 2026Sprint 21 deepened the AI Experiments platform with VoltOps trace API integration, persistable prompt overrides, form polish, and end-to-end runtime model override through VoltAgent with provider-aware schema scrubbing. The sprint also shipped first-class aspect ratio control through the full raw-asset generation pipeline, Google Ads offline conversion tracking for VastAssembly-qualified leads, and the /va:mermaid engineering skill for rendering architecture diagrams directly in ClickUp. Two targeted fixes resolved the Creative mode aspect ratio propagation bug and a duplicate tab selector issue in Campaign IQ.
Shipped
- AI Experiment Console — VoltOps Trace API & Persistable Prompt Overrides — experiment runs now surface VoltOps trace data, prompt override settings persist across sessions, and the experiment form received a full polish pass. Complete
- Runtime Model Override End-to-End via VoltAgent — dynamic model selection now flows all the way through VoltAgent with provider-aware schema scrubbing to ensure each provider receives a clean, compatible payload. Complete
- Aspect Ratio as First-Class Attribute in Asset Generation Pipeline — selected aspect ratio is now propagated through every stage of the raw-asset generation pipeline, ensuring generated visuals match the chosen format from the start. Complete
- /va:mermaid Engineering Skill — new slash-command skill renders Mermaid diagrams and embeds them directly into ClickUp tasks via a catbox-to-MCP bridge, enabling visual architecture artifacts in the engineering workflow. Complete
- AI Testability Follow-Up Improvements — second-pass refinements to the AI testability framework, closing gaps surfaced during initial rollout. Complete
- Google Ads Offline Conversion Tracking for Qualified Leads — VastAssembly-qualified leads are now automatically uploaded as offline conversions to Google Ads, closing the attribution loop between platform signups and ad spend. Complete
Fixes
- Text-to-Asset Aspect Ratio Not Propagating in Creative Mode — the aspect ratio picker selection now correctly flows downstream through the Creative mode asset generation path. Complete
- [Marker.io] Duplicate Tab Selectors in Campaign IQ — two overlapping tab selector components in Campaign IQ have been resolved; the view now renders a single, correct navigation control. Complete
AI Governance Console & Platform Infrastructure
Apr 20 – Apr 26, 2026Sprint 20 delivered the full AI Governance Console — a native VoltAgent/VoltOps observability surface with a dynamic workflow registry, run history, experiment matrix, rate limiting, kill switch, cost estimation, PII boundary enforcement, and a governed prompt-promotion pipeline gated by CI regression and eng-lead approval. The sprint also shipped durable async email delivery via a Hangfire-backed queue, a fully phased user-scoped in-app notification system (4 phases, 29 tests), Eva chat widget v3 with i18n and structured error handling, the /va:council Seven Advisors decision tool and /va:review code-review skill, CI pipeline parallelization, and a targeted batch of platform bug fixes.
Shipped
- AI Testability & Observability — VoltAgent/VoltOps Native Platform — full Admin AI Console with workflow registry, run history, experiment matrix, governed prompt promotion, and AI safety controls. Complete
- /admin/ai/workflows shows all 22 workflows from GET /internal/workflows with dynamic step graph + per-step schemas; add a new workflow → appears with no Blazor code change
- /admin/ai/runs loads executions with workflow+status filter; click row → per-step state view + VoltOps deep-link
- Experiment wizard: JSON Schema-driven input form, model dropdown from GET /internal/models, prompt-label dropdown from GET /internal/prompts?workflowId=X
- 3-variant run on golden dataset → experiment persists status=Draft; matrix view populated within 120s; cells render via correct renderer (HTML iframe / JSON / Text)
- Cell-hover shows diff vs baseline; cell-click opens side-panel with VoltOps trace deep-link; budget estimate shown before Run; Run disabled over per-user budget
- Clone + iterate prefills wizard with ParentExperimentId; step-level replay from /admin/ai/runs pre-fills wizard with execution inputs
- Experiment collaboration: cell-level comments with email notification, share URL Slack unfurl card, PDF export of variant matrix + summary
- Weekly digest job emails top 5 experiments by run count
- Rate limit: 21st run/hour by same user → 429; kill switch: new RunAsync calls return "Experiments paused"; cost estimator ±10% of actual post-run cost
- Anomaly alert: user 4× 7-day rolling average → admin email fires
- Secret boundary: Eva prompt in UI has no API keys; confidential-flagged prompts filtered from client; PII detector flags email + CRD + SSN-like patterns
- AI.Console.Access permission gates /admin/ai/* with 403; all AIPermissions.cs permissions visible in ABP role editor
- Prompt promotion: "Propose Promotion" → AIPromotionRequest queued → eng-lead approval → CI regression gate → GitHub PR auto-opens against active-labels.yaml → VoltOps relabels within 5-min TTL
- Governance bypass detection: VoltOps webhook flags direct prompt-label changes not preceded by AIPromotionRequest
- Full audit log: GET /admin/ai/audit?from=... returns filtered CSV with every promotion chain transition
- All 38 agent files use dynamic model override — zero hardcoded model strings; pnpm dataset:push syncs golden.yaml to VoltOps
- Suspend/resume state survives process restart (Postgres adapter wired); JWT auth rejects unauthenticated /internal/* calls with 401
- Async Email Queue with Retry Logic — durable Hangfire-backed email delivery with stuck-email recovery and full migration pipeline. Complete
- QueuedEmail entity + EF migration; EmailQueueStatus & EmailType enums
- IEmailQueueService + EmailQueueService; EmailSendJob (Hangfire); StuckEmailRecoveryJob registered in WebModule
- Send calls replaced in 4 Email Services; Generate Migration, Build & Verify step completed
- User-Scoped In-App Notifications — Full Implementation — 4-phase architecture delivering real-time, permission-aware, bulk-optimized notification delivery with 29 tests. Complete
- Phase 1: New entities + schema migration (additive only)
- Phase 2A: Notification Dispatcher Core — interface + audience resolution
- Phase 2B: Dispatch Infrastructure — retry job, metrics, real-time, permission cache
- Phase 2C: Updated notification producers (campaign, health check, impersonation)
- Phase 3: Query layer rewrite — LEFT JOIN + lazy materialization + bulk ops + cache
- Phase 4: Legacy column cleanup (drop IsRead/IsDismissed + old indexes)
- 29 unit + integration tests; risk monitoring roadmap documented
- Eva chat widget v3 — i18n, structured errors, retry purge, resilient rendering — complete localization, structured error handling, and failure-resilient chat UX. Complete
- All Eva widget strings come from the i18n catalog
- Structured error codes render in assistant-ui's styled error slot
- Retry flag triggers orphan-memory purge before re-invoking agent
- Zero-delta stream falls back to non-streaming /agents/Eva/text
- Rehydrated interrupted turns render as error with Regenerate option
- Clear/Reset lives on last assistant action bar; footer simplified
- Markdown render crash shows localized fallback — no React crash boundary escape
- /va:council — Seven Advisors decision council slash command — structured multi-perspective deliberation tool integrated into the /va: engineering workflow palette. Complete
- Intake asks four questions in one round before deliberation begins
- Default mode prints lean synthesis only; full transcript saved to .planning/councils/
- --verbose / --deep prints full 7-advisor transcript in chat
- ask <advisor> <question> returns single-advisor response with no file save
- /va: palette lists council alongside wrap/eva-sync/membrane-log; CLAUDE.md "What to read when" table updated
- /va:review + CodeRabbit integration + /va:council epic pipeline hooks — code review skill, CodeRabbit wiring, and council callout integration into the full epic lifecycle. Complete
- /va:review reviews uncommitted diff and prints bucketed findings without committing
- /va:review --scope <glob> narrows review to matching files; focus directive re-ranks findings by relevance
- /va:wrap step 6 invokes coderabbit-run skill and maps status → changeset note correctly
- /va:wrap first-time user gets CodeRabbit install + auth walkthrough via the skill
- /va:council callouts wired into assess-epic Next block, plan-epic reconciliation gate, and verify-task 7c
- CI pipeline parallelization & .NET compile consolidation — parallelized dev/main release workflows and consolidated .NET compile via shared Docker bake base stage. Complete
- Automated Testing: CI/CD Pipeline First, Then Fix & Generate Tests — CI/CD pipeline established with automated test generation pass. Complete
Fixes
- Google Lead Form drops qualifying question over API — qualifying questions now persist through the Google Ads API lead form submission. Complete
- Stripe price cache: startup ObjectDisposedException + not shared across web instances — cache lifecycle hardened to survive startup and share correctly across multiple web nodes. Complete
- Step 5 marketing-strategy first-hit race condition — resolved "Status stream is not available" race on first marketing-strategy generation hit. Complete
- Horizontal Sub Navigation positioning — IQ Dashboard sub-nav now correctly renders above filters across all IQ Dashboard views. Complete
- [Marker.io] Campaign Builder consistently failing — root cause resolved; Campaign Builder no longer errors on entry. Complete
- [Marker.io] Application Error on dev — Dashboard & Settings navigation broken — resolved application error preventing navigation through dashboard and settings pages on dev. Complete
- Failed to Generate ICP — ICP generation no longer fails silently; root cause in generation pipeline resolved. Complete
- Wrong Vast logo being used — correct branded logo now rendered across all surfaces. Complete
Self-Service Monetization & Launch Analyzer
Apr 13 – Apr 19, 2026Sprint 19 shipped the first end-to-end commercial surface of VastAdvisor — self-service registration with Stripe billing, a full tier structure (Starter / Core / Pro / Elite) with edition-limit guards, and a Freemium path for brand-new tenants. Alongside monetization, the team delivered the AdminIQ Launch Analyzer (hybrid heuristic + AI) for cross-platform launch diagnostics, Admin Health + Platform Metrics dashboards for host operators, a full redesign of audience-targeting quality with AI-driven resolution and taxonomy caching, and Eva v2 foundations (workspace-scoped AI guide with page awareness and deep links). The sprint also closed out a large batch of ad-platform launch fixes across Google Search, Google Display, Meta, and LinkedIn, and hardened compliance batch processing and background-job hierarchy guards for production reliability.
Shipped
- Stripe Subscription Billing + Self-Service Registration — end-to-end commercial flow is live: new /Account/Register with CRD + tier cards + interval toggle, Stripe Checkout (with 7-day grace period via API callbacks), FirmProfile seeding, T&C acceptance, plan deep-linking, verification/welcome email, and a post-registration Billing page. Complete
- Registration redirects to Stripe Checkout when RequireImmediatePayment=true; lands in freemium mode when false
- Abandoning Stripe checkout leaves tenant recoverable via in-app paywall
- Onboarding wizard uses FirmProfile.CrdNumber fallback when wizard input is blank
- Stripe Dashboard seeded with 4 products + 12 prices (test mode); Dev Key Vault populated with 14 Stripe secrets
- Settings → Billing tab shows current plan; Stripe Success page shows celebration hero + embedded plan card with real tier name
- Unauthenticated /Subscription/Success now redirects to login
- VastAdvisor Editions: Starter / Core / Pro / Elite — edition seeder, limit guards, and Stripe setup-fee deltas. Five final editions with correct quotas and module toggles. Complete
- EditionLimits now supports -1 as the Unlimited sentinel (replaces int.MaxValue)
- Freemium unified into EditionLimitGuard as a CampaignLaunch action gate; campaign cap enforced on launch, not create (drafts unmetered)
- Starter tenant correctly blocked from 2nd ICP, 2nd campaign, and 2nd advisor seat with BusinessException, greyed buttons, paywall, and usage badges
- Self-registration creates Starter tenant with Freemium=true tenant override
- Reseed flag migrates legacy editions (RIA → Core, Standard → Starter, RIA Onboarding → Starter + Freemium)
- Storybook demos for EditionLimitGuard and PaywallModal render without hitting Stripe or real limits
- Manage Your Plan modal — plan-change UX with correct proration, interval-handling, and badge states. Complete
- Upgrade preview no longer over-quotes or drifts from the final charge (hourly Stripe price cache)
- API-driven proration replaces Stripe portal flow; setup-fee delta charged on monthly upgrade, skipped on annual
- Interval-only upgrades (Core Monthly → Core Annual) blocked in modal; Subscribe label reads "Upgrade Core Monthly → Core Annual" with correct preview
- Exact-match state shows green "Current plan" badge with Subscribe disabled; interval-mismatch shows grey "You're on Monthly / Annual" badge with tier card clickable
- Paywall defaults to Annual, setup fee shows strikethrough + "Waived" badge; tier cards stack 1-per-row using design system tokens; Downgrade only enabled if usage fits target tier; sticky Subscribe + 12-month term copy
- Payment history via SubscriptionInvoice entity; shadow subscription recurring amount from Stripe for real MRR
- AdminIQ Launch Analyzer — hybrid heuristic + AI analysis of every campaign launch, exposing platform drift end-to-end. Complete
- Snapshot modal opens with Analysis tab as default, score badge in tab header
- Google Search surfaces dropped landing page URL, missing keywords, and missing marketing objective
- Meta surfaces empty audience targeting, US-only location, and dropped Lead Form description
- LinkedIn surfaces missing objective, missing industry targeting, and dropped landing page URL
- Budget comparison uses per-ad-type allocated amount (not full campaign budget); overall score is weighted average of category scores
- Graceful degradation when AI workflow fails — heuristic findings still display; raw JSON tabs (Platform Snapshot, Launch Summary, Side-by-Side, Membrane Log) unchanged
- Meta lifetime-budget handling corrected inside the analyzer
- Admin Health + Platform Metrics dashboards (go-live) — host-only operational surfaces with permission-gated routing. Complete
- Host-gated menu visibility; /Admin/Health and /Admin/Platform load with empty-state widgets and tenant detail modal
- Permission gating returns 403 when ungranted; Admin AppServices not exposed via HTTP API
- Deliberate broken-state surfaces exercise the Health dashboard
- Admin Performance dashboard (host-only) for cross-tenant ad performance
- Audience targeting quality redesign — iterative, AI-driven audience resolution with taxonomy caching, 5-dimension quality scoring, and negative targeting. Complete
- Google audience sync selects segments/topics from cached taxonomy via Claude Sonnet (not search)
- Meta audience sync pools and ranks interests/behaviors with AI (no longer first-5)
- LinkedIn sync pools and ranks all facets (job titles, industries, functions, skills) with AI
- Targeting quality evaluation runs after reach, produces AIDecision with 5-dimension scoring; iteration loop re-resolves when quality below threshold, short-circuits when above
- Meta location overlap (state + city in that state) detected and removed with a warning
- Negative targeting (exclusions) generated and persisted to ResolvedTargeting["exclusions"]
- Cache TTL is 7 days on initial resolution, promoted to 30 days when quality passes
- Background Job Hierarchy Guards — parent-status validation before processing (tenant → campaign → audience). Complete
- HierarchyGuardResult contract + chain logging
- Tenant-level, campaign-level, and audience-level guards integrated
- Recurring scheduler integration (batch pickers), individual-job integration, exemption handling
- Performance/concurrency tuning and unit-test coverage
- Eva v2 foundations — AI guide moved from VoltOps RAG to workspace-scoped filesystem skills with full page awareness. Complete
- Tenant-scoped skills (Standard vs Enterprise see different Eva knowledge)
- Page-context awareness; sub-tab deep links work (e.g., /Settings?tab=compliance)
- Page references render as clickable markdown links (no bare bracketed text)
- Eva chat auto-scrolls to bottom on reload
- Launcher moved from floating pill to footer (next to Help & Documentation); Help page orders Ask Eva card first
- pnpm dev rebuilds Eva widget on file change; pnpm eva:sync pipeline provides deterministic regen + drift lint
- Pre-launch validation + launch observability framework — platform-wide reliability investments ahead of go-live. Complete
- Pre-Launch Campaign Validation Rules Engine
- Actionable Error Message & UX Framework
- Silent Mismatch Detection & Alerting
- Cross-Platform Campaign Launch Smoke Tests
- Exit Criteria Validation & Sign-Off
- Sentry SDK error logging configured
- Compliance batch-run concurrency hardening — eliminated race conditions across the compliance pipeline. Complete
- No 23505 duplicate-key errors on AppComplianceDailySnapshots during batch runs
- No "not saved due to concurrency exception" warnings on Campaign during batch compliance runs
- Campaign compliance summary reflects final batch result; single-item officer edits still trigger auto-approve / auto-revert correctly
- Daily snapshot row exists with correct metrics after a batch compliance run
- Audience bootstrap on ICP-first tenants — resolved the "no audiences" edge case when ICP is created before the first ad platform connection. Complete
- Brand-new tenant: ICP → first connection → audiences appear
- ICP created while a connection already exists still ends up with audiences
- Channel Status modal + non-blocking launch UX — campaign launch now runs with live polling and cleaner user feedback. Complete
- Non-blocking launch with live polling
- Duplicate "launch in progress" alerts merged into one
- JS confirm on Duplicate replaced with modal + spinner
- Day 1 go-live workstreams — FormADV onboarding data capture + AUM pricing, Day 1 Creative Format definition + rendering, and Lead IQ Dashboard Integration. Complete
- Global shell & Enterprise surface — command palette / search, Next Best Actions, Co-Pilot, notifications, Help; Lead IQ rollup with firm/region scoping for Enterprise. Complete
- Icons and search bar moved to header; right-hand sidebar removed; copyright moved to left nav; help support button added
- Submenu items spread evenly across full container width; maximum three cards stacked across page width
- Design system polish — color palette demo uses live CSS vars + pair visualization; theme colors drift fix + structural reorder (light mode); auth pages polish (register logo + login register link). Complete
- Localization architecture — split en.json into domain-specific files for scalable translation. Complete
- FormADV Onboarding Data Capture & AUM Pricing — tier determination tied to FormADV-reported AUM at signup. Complete
- Ad platform cap hardening — Meta 50-ad multi-ad-set split plus a cross-platform cap audit. Complete
Fixes
- Cross-platform launch reliability (Google Search / Google Display / Meta / LinkedIn) — resolved a large batch of launch-failure and drift bugs surfaced during pre-GA validation. Complete
- LinkedIn & Meta ads failed to launch
- LinkedIn ads API now includes campaign objective; new campaigns show Campaign Group objective set (not blank) in LinkedIn UI; Group objective correctly maps LeadForm → LEAD_GENERATION and LandingPage → WEBSITE_VISIT
- "With objective off your campaign won't benefit from Budget Optimization" warning no longer appears
- LinkedIn missing industry targeting
- Meta campaign would not launch due to special ads category
- Meta campaign had no audience targeting; Meta audience translation weak; Meta Interests incorrectly included "Educational Guides" etc.
- Meta location targeting USA-only; Location targeting USA appearing in addition to city targeting
- Meta Lead Form Description dropped via API
- Daily Meta budget ($105) being set for both ad sets
- Error launching Meta lead form campaign
- Google Search campaign failed to launch due to expected text format
- Google Search Default Landing Page URL dropped via API
- Google Campaign Setting missing Marketing Objective
- Google Search Network Setting: Search Partners on
- Google Display using unwanted AI ads options
- Google Display Topics search was case sensitive
- Google Display CTA input box not aligned
- Google Display audience targeting filtered by taxonomy type to prevent INVALID_USER_INTEREST
- Incorrect image size for Google Display
- Error launching Google lead form campaign
- Relaunch fails for Google campaigns after force disconnect (stale platform IDs)
- Campaign lost link with ad platform
- Keyword Ideas generator — resolved "The node already has a parent." exception; Generate Ideas now returns keyword suggestions for the connected account and inserts selections into the campaign keyword list. Complete
- Campaign lifecycle guards — external campaign compliance approval now locked; already-launched campaigns can no longer be relaunched (Marker.io); planned stop date before start date now blocked. Complete
- ICP & quota regression — ICP buttons clickable past limit and "New ICP" button not greyed fixed; ICP auto-generate respects remaining quota (min(3, Max − Current)). Complete
- Campaign list & actions — JS confirm on Duplicate replaced with modal + spinner; changing campaign theme now forces regeneration of the Marketing Strategy; "Campaign lost link with ad platform" resolved. Complete
- Light-mode theming fixes (Marker.io) — correct logo in light mode, onboarding font color, main search text visibility, date selector icon visibility. Complete
- Marker.io miscellaneous — LinkedIn integration error; Privacy Policy URL now required during onboarding; AUM value now accepts multi-character input; "Won't allow me to archive VAST-10118" resolved; "Allowed me to change and save a new ICP post-launch" closed; Save & Next button at onboarding Step 5; Facebook OAuth post-connect error message; "Failing to delete test tenant". Complete
- Campaign Builder — Ad Type Mix labels clarified; user can recover from failed Channel Mix stage when no integrations present; hover text now matches paused-item iconography count. Complete
Carryover & Deferred
- Audience sync edge cases — second connection of same type should not trigger redundant sync-all jobs; re-auth of sole connection should trigger bootstrap on update; delete + re-add of same connection type should recompute stale audience rows. Backlog
- Google Ads launch resilience — partialFailure: a single bad criterion should not tank the whole adGroup batch; stale audience refs should be stripped at launch with a user-visible warning. Backlog
- Google Display audience picker — enforce AFFINITY / IN_MARKET / LIFE_EVENT-only whitelist; Demand Gen audience picker should enforce the same Display whitelist. Backlog
- Feature gating — "Hide button" (Step 1) pending workflow definition; downstream fix (Step 2) blocked pending workflow sign-off. Blocked
Audience Hardening & Launch Auditability
Apr 6 – Apr 12, 2026Sprint 18 closed with 85 completed tasks. The team hardened audience targeting and sync across Google Display, strengthened launch auditability with deep links and OTEL-powered audit trails, added lifecycle safety guards, overhauled integrations UX, and resolved a batch of customer-facing campaign issues.
Shipped
- Google Display audience targeting — affinity / in-market audience targeting end-to-end complete for Google Display campaigns. Complete
- Google Display: affinity / in-market audience targeting end-to-end
- Audience Sync reliability — fixed stuck-in-Syncing state, added ICP placeholder auto-create, and improved dashboard polling. Complete
- Audience Sync — stuck-in-Syncing fix, ICP placeholder auto-create, dashboard polling
- Google audience insights end-to-end — AI-rerank targeting, topic display, and JSON drift hardening for Google audience insights. Complete
- Google audience insights: AI-rerank targeting, Topic display, JSON drift hardening
- Campaign Launch Summary — added deep links and Action Log view for full launch auditability. Complete
- Campaign Launch Summary: deep links + Action Log view
- OTEL logging & audit trail — OpenTelemetry logging and audit trail for every Membrane action call. Complete
- OTEL logging + audit trail for every Membrane action call
- Lifecycle guards — safety guards for connection/ICP delete, campaign archive, force-detach, and reviving soft-deleted connections. Complete
- Lifecycle guards: connection/ICP delete, campaign archive, force-detach, revive soft-deleted connections
- Integrations UX overhaul — connection identity, de-duplication, URL routing, and slim header for a cleaner integrations experience. Complete
- Integrations UX overhaul: connection identity + de-dup + URL routing + slim header
Fixes
- Meta Lead Form campaign launch — resolved failure preventing Meta Lead Form campaigns from launching. Complete
- fix: Meta Lead Form campaign failed to launch
- Location targeting — fixed location targeting not being applied effectively. Complete
- fix: Location targeting not effective
- Google Display horizontal images — fixed Google Display not generating horizontal marketing images. Complete
- fix: Google Display not generating horizontal marketing image
- Google Display targeting generation — resolved issue where no targeting was generated for Google Display campaigns. Complete
- fix: No targeting generated for Google Display
- CRD number optional — made CRD number optional and hidden from the UI. Complete
- fix: Make CRD number optional and hide from UI
Lead Intelligence & Campaign Builder
Mar 30 – Apr 5, 2026Sprint 17 expanded Lead IQ analytics and intelligence, improved launch chain observability, delivered searchable filter UX across dashboards, and iterated on Audience IQ, Dashboard Builder, and Enterprise onboarding. 80 completed items. What shipped well: dashboard/widget builder UX, design-system foundations, enterprise onboarding + view-mode improvements, and a meaningful batch of ad-platform reliability fixes.
Shipped
- Dashboard Designer UX overhaul — inline insert and per-widget resize for the dashboard designer. Complete
- Dashboard Designer UX Overhaul — Inline Insert + Per-Widget Resize
- Design System foundations — shipped color palette and typography previews for the design system. Complete
- Design System: Color Palette & Typography Previews
- Enterprise view-mode toggle — Enterprise/Standard view mode toggle for switchable tenants. Complete
- feat: Enterprise/Standard view mode toggle for switchable tenants
- Enterprise onboarding — onboarding wizard, module enablement, and workspace switcher shipped. Complete
- Enterprise: onboarding wizard + module enablement + workspace switcher
- Audience IQ workflows — lookalike and premium audiences workflows completed. Complete
- Audience IQ: lookalike + premium audiences workflows
- Lead IQ analytics expansion — completed overview analytics and AI/financial intelligence work within Lead IQ. Complete
- Lead IQ: overview analytics + AI/financial intelligence
- Launch chain observability — preserved richer error data through the launch chain by improving exception wrapping. Complete
- Preserve rich error data through launch chain + BusinessException wrapping
- Dashboard filtering UX — delivered searchable filter dropdowns (VastFilterSelect) across IQ dashboards. Complete
- Searchable filter dropdowns (VastFilterSelect) for IQ dashboards
Fixes
- Meta SAC city targeting — resolved wrong country match (Charlotte, AU instead of Charlotte, NC). Complete
- fix: Meta SAC city targeting resolves wrong country
Carryover & Deferred
- Azure Blob Storage migration — migrate blob storage from database to Azure Blob Storage. Backlog
- Migrate Blob Storage from Database to Azure Blob Storage
- Preview thumbnail caching — thumbnail caching and resize for Creative Hub & Campaign Builder. Backlog
- Preview thumbnail caching + resize for Creative Hub & Campaign Builder
- Background Job Hierarchy Guards — parent-status validation before processing. In Progress
- Background Job Hierarchy Guards — parent-status validation before processing
- AIDecision audit — eliminate all hardcoded confidence ratings. In Review
- Independent AIDecision audit — eliminate all hardcoded confidence ratings
Launch Workflows & Audience IQ
Mar 23 – Mar 29, 2026Sprint 16 hardened the campaign launch pipeline end-to-end, improved targeting generation and prefill correctness, expanded validation and error visibility, addressed DB connection pool exhaustion, and migrated observability to Better Stack.
Shipped
- Campaign launch pipeline hardening — improved launch workflow orchestration, platform sync behavior, and reduced failures due to payload size and timeouts. Complete
- Campaign launch workflow: schedule + submit + platform sync status
- Payload size validation and error handling (base64 images, CTA validation, concurrency fix)
- Split media uploads into separate membrane calls for LinkedIn/Meta (50s timeout fix)
- Fixed Membrane lead form action duplicates and Google/Meta/LinkedIn launch errors
- Fixed concurrency exception on campaign relaunch (stale entity in ambient UoW)
- Targeting generation and prefill correctness — fixed "targeting not prefilled" for Meta and LinkedIn and improved shared settings generation robustness. Complete
- Fixed targeting not pre-filled for Meta
- Fixed LinkedIn targeting failed to pre-fill
- Validation and error visibility — improved platform validation coverage and made nested validation errors visible in the campaign builder. Complete
- Fixed lead form validators: missing limits for LinkedIn/Meta description, headline, thankYou fields
- Surfaced nested shared lead-form validation errors in campaign builder
- Surfaced specific platform validation errors instead of generic friendly messages
- Infrastructure and performance — addressed DB connection pool exhaustion and migrated observability stack to Better Stack. Complete
- Capped Hangfire workers + added concurrency limits to all background jobs to fix DB connection pool exhaustion
- Replaced NewRelic with BetterStack observability
- UX polish — standardized tag/status design style and improved table interactions and responsiveness. Complete
- Standardized all tags and statuses to use semi-translucent design style
- Fixed table expand/collapse animation, set minimum width for campaign name column
Fixes
- Multiple Marker.io-reported issues resolved across compliance freshness, business name inclusion, landing page URL editability, and icon/state correctness
Known Issues & Deferred
- Items that started during Sprint 16 generally finished; any remaining gaps would be items with no activity logged during the week
Campaign IQ, Alerts & Observability
Mar 16 – Mar 22, 2026Sprint 15 focused on hardening campaign launch and targeting for LinkedIn and Meta, strengthening compliance and concurrency robustness, advancing Lead IQ list and ingestion workflows, and adding production observability with Heap.
Shipped
- Campaign launch and targeting hardening (LinkedIn & Meta) — fixed multiple urgent LinkedIn launch and configuration issues and improved Meta campaign correctness and creative constraints. Complete
- Removed/rewired invalid LinkedIn bid type handling
- Corrected LinkedIn default bidding strategy to "Maximum Delivery"
- Fixed missing location targeting and industry targeting translation for LinkedIn
- Addressed launch failures caused by account approval constraints
- Increased character limits and aligned validation across stack for Meta
- Improved audience-interest relevance and cross-platform insights pipeline for Meta
- Compliance and concurrency robustness — hardened compliance summary workflow and related concurrency behavior with shorter-lived unit-of-work patterns, better retry and error messaging. Complete
- Fixed compliance summary failure on Campaign Builder final stage
- Added ability for compliance officer actions to override system behavior when checks are running
- Dashboards and UX polish — major progress on Lead IQ list/ingestion workflow and improved chart styling for brand consistency. Complete
- Lead IQ: ingestion + Lead List with filters, search, export, and actions
- Updated color palette for charts and highlights to match Vast Assembly logo colors
- Observability and analytics — correctly configured Heap in production to ensure accurate analytics tracking. Complete
- Heap.io code snippet added to production with correct prod app ID
Fixes
- Resolved multiple Marker.io issues across navigation, uploads, compliance views, and reporting lists
- Improved notification behavior and logging reliability for UI notifications
Known Issues & Deferred
- Some new platform-level refactors were created near the end of the sprint and may have remained in backlog (e.g., move targeting to platform shared settings for LinkedIn + Meta)
Stability & Usability
Mar 9 – Mar 15, 2026Sprint 14 focused on completing the RIA dashboard, improving onboarding and ICP UX, hardening platform reliability, and resolving production bugs reported through Marker.io.
Shipped
- RIA Dashboard delivery — completed the RIA dashboard implementation and closed out related widget work, including KPI cards, funnel visualization, compliance health, and welcome header personalization. Complete
- KPI cards, funnel visualization, compliance health, and welcome header personalization
- Feature-flagged dashboard widgets brought to completion as part of the dashboard finishing pass
- ICP and onboarding UX improvements — improved onboarding flow behavior and reduced confusing actions on ICP cards until integrations are complete. Complete
- Re-ordered settings navigation to improve clarity and flow, moving ICPs ahead of Integrations
- Improved defaults and ergonomics in campaign creation (e.g., defaulting landing page URLs when missing)
- Improved menu ordering for smoother navigation
- Platform reliability and background processing — completed previously aging work on campaign metrics sync and campaign status polling, closing out long-running in-progress items and reducing production risk. Complete
- Campaign metrics sync and campaign status polling closed out
- Collapsible sections in later steps of the campaign builder UX
- Production bug fixes (Marker.io driven) — resolved key onboarding and generation issues including "duplicate AI onboarding agent" and "marketing angles generation failed" with root cause tied to operational capacity changes. Complete
- Added follow-up fixes to reduce recurrence of generation failures
Fixes
- Addressed multiple generation and session reliability issues tied to campaign angle/theme generation failures
- Improved brand color extraction behavior to avoid incorrect theme overrides
Known Issues & Deferred
- Several analytics and insight-oriented UI tasks (Target Niche, Channel Mix, Row as a Budget, optional campaign builder UX explorations) remained unassigned or without delivery movement during the sprint window
Launch Release
Through Mar 8, 2026Core capabilities shipped
Campaign Creation & Management
Full campaign lifecycle — create, view, edit, pause, duplicate, and delete campaigns from a polished management table with a streamlined actions menu.
Audience IQ & ICP Workflows
Audience Intelligence is live. Ideal Client Profile management and real-data-wired Audience IQ views give advisors sharper targeting from day one.
Compliance IQ
Compliance policies are fully implemented with a mature Compliance IQ interface — keeping every AI action governed, auditable, and explainable.
Settings & Onboarding
Firm Profile, Brand Identity, and key settings tabs fully established. Login, onboarding, and password reset flows are polished and production-ready.
Platform Infrastructure
Multi-tenant login system, Vast ID generation for human-readable identifiers, and AI decision audit logging — giving enterprises a governed, scalable foundation from the first release.