ALL MEMOS Download .docx

Newsletter Voice Standardization + Content-Quality Audit — 2026-05-21

Owner: TITAN · Status: Phase 1 shipped (voice unified, guards in place), Phase 2 = first live run.

Decisions (Harnoor, 2026-05-21)

1. Template standard = comic rotation (the current Agent Stack look).

2. Agent Stack = commercial flagship; OpenClaw / Agentic-AI / Claude weeklies stay as free feeders.

3. Audio format = two-host NotebookLM-style dialogue (ALEX + MAYA), via newsletter_to_audio.py.

Problem found (the "fix inconsistencies with playing voice" ask)

Voice playback was fragmented across 7 mechanisms:

What shipped (this pass)

Google-Podcasts widget (cover, play/pause, scrubber, current/total time, ±15s, 1×/1.25×/1.5×/2×

speed). email_card_html() = email-safe card (cover + native <audio controls> + "Open full

player" link). Cool-blue brand (#6aa9ff, dark cards). Verified live in Chrome — playback works.

polly_url param now carries the two-host MP3; dialogue pre-warm removed (redundant).

only as fail-soft fallback.

now use ONE audio path: newsletter_to_audio (2-host) → build_player_page. The parallel Polly

player path is retired.

standard); TITAN_NEWSLETTER_AUDIO=1 explicit.

Content-quality guards

source_url (rejects our own domains), drops infrastructure/promo/self kinds, requires

headline+summary. No news today → no send (filler self-promo seed removed).

(SQLite, shared across all 4 newsletters). Verified present and wired.

on-by-default (!= "0") to == "1", so they render exactly once per issue and never alongside

the legacy single-callout block. daily_callouts is deterministic per (slug+date) = one joke/tip

per issue, and different across the day's newsletters.

Verified

real MP3 streams, play/pause confirmed in Chrome.

Production-readiness — remaining before commercial launch

(cost: Gemini TTS via deepdive, ~$2-3/issue — confirm budget cadence; daily = ~$60-90/mo).

player/ S3 prefix so the email "Open full player" link resolves on a branded domain.

separate real-time paradigm — left as-is).

Refinement pass (2026-05-21, testing on real 05-19/05-20 indexes)

Two production defects found by rendering real issues and fixed:

agent-stack was frequently empty. agent_stack_daily.load_research_for_date now pulls

across ALL topics (agent-stack-native first, then by freshness) — the flagship is genuinely

cohesive/cross-topic.

New shared module newsletter_quality.py (is_quality_source + cap_per_source) blocks

aggregator/landing pages (crescendo, google news, github/trending, /tag//category/ etc.),

requires a specific article path, and caps ≤2 stories per domain. Wired into ALL 4 newsletters

(Agent Stack via is_news_item; openclaw/agentic/claude in their gather()).

Key files

F:/TITAN/scripts/: newsletter_player.py, build_player_page.py, titan_email.py,

agent_stack_daily.py, openclaw_newsletter.py, agentic_ai_newsletter.py, claude_newsletter.py,

newsletter_templates.py, newsletter_to_audio.py, newsletter_ledger.py, daily_callouts.py.