All 28 audit items resolved.
AddedInternal admin dashboard (/internal/admin) — summary tiles, customer cards, per-Wingman status rows, Grant Beta + Set Plan actions
AddedReferral program — unique 8-character codes, 30-day tracking cookie, $10 Stripe balance credit applied to both referrer and new subscriber on checkout
AddedPer-Wingman status line on dashboard cards — posts today, last post time, ⚠️ silent 48h warning
AddedFull Wingman config edit UI — 7 editable sections: Brand Info, Voice & Tone, Search Topics, Content Mix, Required Hashtags, Guardrails, Product Feed
AddedEmpty states with sample content — five distinct brand voices in Dashboard, Activity, and Analytics empty states to demonstrate the product
Addeddaily_mix job type — 4 product + 3 original posts per day; order deterministically shuffled per-agent per-day using seeded RNG (same all day, different every day)
AddedAdmin stats: Posts This Week, All-Time Posts, and plan subscriber breakdown (Solo/Founder/Studio/Agency) as tiled grid
FixedUrgency language ('Only X left!') now limited to manual Post Now triggers only — scheduled posts never include scarcity language
FixedProduct posts now filtered by configured brand allowlist — uses real category names from the DB; prevents off-brand products from being posted
FixedZero-inventory products excluded from all product posts (both cron and manual trigger paths)
Fixedproduct_post_task was recording content_type='original_promo' — corrected to 'product_tweet'
FixedNextAuth credentials provider session was dropping user email — email now propagated through jwt and session callbacks
FixedAdmin page email allowlist was ghost@engagewingman.com — corrected to ghost@engagewingman.io in both frontend and backend
FixedAdmin page client-side redirect loop removed — backend 403 enforces access; no more redirect on valid admin sessions
FixedLogin now redirects admin emails directly to /internal/admin instead of /dashboard
PerformanceDispatcher Redis client: 5s socket timeout + retry_on_timeout; dedup failure no longer drops the job (fires anyway, logs warning)
ChangedBranding corrected to ENGAGE WINGMAN throughout — 9 files updated across frontend and backend