Home / Ops / More in this area
Demo + Beta Ops status (2026-06-30)
Updated Jul 01, 2026 · Affirmology_DemoBetaOps_Status_v1.md
Summary. Marathon ops day on the live demo (demo.affirmology.ai). Snapshot + open items.
Demo + Beta Ops status (2026-06-30)
Marathon ops day on the live demo (demo.affirmology.ai). Snapshot + open items.
Audience (CRM appSuTUcOQbpkxLUR, People tblOOWgEjVfX21NT3) - EXCLUDE founders Jeff + Sol in all counts
23 external people signed the NDA. Breakdown:
- 15 completed a song -> sent the Welcome email (subject was "Your Origin Soul Song is ready").
- 5 stopped at the intake form -> sent the Form Stopper re-engagement email (link to the form).
- 3 had failed renders (Taylor Pascoe, Alex de Carvalho, Leandro Jubilut) -> re-rendered + sent the Oops+Welcome email.
- 3 came in WITHOUT Jeff inviting them (organic): Patrick Hilsbos, Tracie Briggs, Leandro. No referral tracking exists.
- Phones: 0 collected. Email is the only channel.
What got fixed/shipped today (studio auto-deploys from github main; site from master)
- Anthropic key: the engine's key (sk-ant-...HxcgAA) ran dry -> every render failed at script generation. Root cause of "renders not happening." Jeff funded the CORRECT account (console.anthropic.com API billing, NOT claude.ai). Working now. Set auto-reload when cash allows.
- Failed-render recovery: chart_integrity.py now whitespace-normalizes the name (double-space names like "Leandro Serpa Jubilut" were failing the PDF name check). Added token-gated POST /rerender-demo (reconstructs birth from a stored job, re-runs, returns a fresh page link). Re-rendered the 3.
- PDF cost: run_audio now passes --no-pdf -> renders skip the never-delivered Opus PDF report. Big per-render saving.
- Beta opt-in (was a silent data-loss bug): the results-page "I'm in" posted to a nonexistent /api/beta-signup that 404'd and was swallowed, so EVERY beta opt-in was lost. Built POST /api/beta-signup (studio) writing Beta committed + Is Tester + Stage to the CRM; pointed result.html at it. LIVE + verified. NOTE: there is intentionally NO investor self-identify button (only beta tester); the investor mention is a soft "grab a time" Calendly CTA.
- Diagnostics: added token-gated GET /api/demo-jobs (durable demo render list: name, email, job_id, state).
- Welcome email subject: decided to change to "Welcome to Affirmology" (reads better, esp. when delivery is delayed). Canonical template doc updated. Worker live-send subject CHANGED in worker/src/index.js line 207 but NOT deployed (see open item).
Email mechanics (locked)
- Demo Welcome (Origin Soul Song delivery) auto-sends from the worker on render-complete (studio _webhook -> worker /api/job-complete; auth confirmed working). Canonical body: Affirmology_WelcomeEmail_Template_v1.html. Other lane owns the worker.
- Re-engagement batch (this session, sent via Resend, from hello@affirmology.ai, BCC jeff@affirmology.ai): Affirmology_FormStopperEmail_v1.html (5), Affirmology_RenderFix_OopsWelcome_v1.html (3). All require the browser User-Agent header (Cloudflare 1010).
OPEN ITEMS
- Cloudflare token - RESOLVED (2026-06-30): Jeff issued a working "Edit Cloudflare Workers" token (cfut_..., saved to affirmology-studio/.env as CLOUDFLARE_API_TOKEN). Worker
affirmology-demo-worker redeployed; the "Welcome to Affirmology" subject (worker/src/index.js line 207) is LIVE. Future worker deploys are now self-serve via cd affirmology-demo-site/worker && CLOUDFLARE_API_TOKEN=... npx wrangler deploy.
- Recover lost beta opt-ins: opt-ins clicked before today's fix were dropped (no record). Re-solicit the demo-takers by email to opt in again (now records). Draft pending.
- Attribution + phone capture: add "How did you hear about us?" + optional phone to the NDA gate -> CRM (same pattern as the beta fix). Jeff asked to advise+solve; build pending his go.
- Funnel tracking gap: "Demo listened" (and the beta field) only get set by explicit writes; the /api/track funnel events were never wired. The demo-taker reconciliation is manual.
INCIDENT 2026-06-30: blank results page on emailed links (RESOLVED, real-phone verified)
Demo-takers opening their emailed result link saw a blank green page (header + footer only).
Affected: the 18 people who got a song link (15 completers + 3 re-renders). The 5 form-stoppers
were NOT affected (their email links to the intake form, not a results page). Three independent
bugs in the chain, all fixed in affirmology-site/result.html + the worker:
1. Status fetch aborted on load - the cross-device returning poll fired the /api/status fetch
while page media loaded; Chrome threw net::ERR_ABORTED and the poll treated it as "not ready"
and hung on the loader forever. Fix: _pollReturning retries fast through the transient abort
window (700ms x8 then ease off); hidden media (orrery video, teaser audio) set preload="none".
2. Inline display:none never cleared (the true blank) - showReturningLoading() set an INLINE
style.display='none' on #delivered; showReturning() only added the .active class, which an inline
style overrides, so the song hub stayed invisible even when data resolved. Fix: showReturning()
now clears the inline display before revealing (_dl.style.display='').
3. 307 dropped the #id on mobile - emailed links are result.html#; the clean-URL 307 to
/result dropped the #fragment on mobile email webviews. Fix: worker route
demo.affirmology.ai/result.html now serves a 200 hash->query shim that reads the #id (no redirect
to drop it) and forwards to /result?j=. wrangler.toml + worker/src/index.js. Deployed.
Verified by faithful CDP renders (real network, not DOM dumps) + screenshots on desktop AND iPhone
emulation (Alex + Taylor songs render via their ORIGINAL result.html#id links), and Jeff confirmed
on his real phone. NO re-send / "sorry" email needed; the existing 18 links work as-is on reopen.
TOOLING NOTE: the validator must screenshot-render (prove the song paints), not just check HTTP 200;
a 200 page was still blank. Verify tooling: scratchpad/cdp_probe.js, cdp_mobile.js (node + built-in
WebSocket drives Chrome via CDP). Future delivery emails already use the robust /result?j= form.
INCIDENT 2026-07-01: Welcome email never auto-sent (RESOLVED)
The automatic Welcome email had NEVER fired in production. Root cause: the studio signals
completion by POSTing to the Cloudflare worker (demo.affirmology.ai/api/job-complete), but that
call was silently failing from the studio's Render datacenter IP (Cloudflare bot protection is the
strong hypothesis; auth token matched, worker sends fine when called from a laptop/phone). Every
Welcome to date (the 15, the 3 re-renders, and the tonight stragglers Amy/Arezu/Elizabeth) was
sent by hand. Jeanette was a false alarm: her CRM email has a .con typo but she got hers at the
corrected .com.
FIX (affirmology-studio/api/demo_render.py): on render success, the studio now sends the Welcome
DIRECTLY via Resend (no worker hop) on a Timer, delay = WELCOME_DELAY_SECONDS (default 300 = 5 min),
with 4 retries + BCC to jeff@affirmology.ai. Canonical body embedded as _WELCOME_HTML (matches
Affirmology_WelcomeEmail_Template_v1.html). Added token-gated POST /api/send-welcome (studio
onrender) to reconcile/re-send any job so a welcome can never be permanently lost. No customer
email on render failure. VERIFIED: deployed studio POST /api/send-welcome returned ok:true and
delivered. Worker sendDeliveryEmail path still exists but is no longer the primary; the worker also
now BCCs jeff@affirmology.ai. Edge case: a studio redeploy inside a person's 5-min window drops that
Timer; reconcile via /api/send-welcome (durable startup sweep is a pending nice-to-have).
Launch
Market: Aug 11 2026. Until then a confidential beta. Priority: get investors + beta testers through a flawless experience. NDA-bypass (fake names/emails) is a minor, accepted risk; email is naturally self-validating (the song only reaches a real inbox).