# LocalVoice Media — Master Session Index > Maintained by P9 | Updated: 2026-03-09 | Sessions: Feb 18 – Mar 9, 2026 --- ## 2026-02-18 | Session: Week 1 Planning — Business Setup & Dev Foundation **Master HEAD:** pre-code (no repo yet) **Pipeline:** v0 (not started) **Topics:** incorporation, Delaware C-Corp, dev environment, project structure, legal setup **Decisions:** #1 Stripe Atlas for incorporation ($500, EIN + 83b). #2 Company name LocalVoice Media Inc. #3 Equity 8M/2M shares, $0.00001 par. #4 Mercury Bank as primary bank. #5 Wave for accounting. #6 Python project structure locked. #7 .env for all secrets, never committed. **Commits:** None **Issues Opened:** None **Issues Resolved:** None **CEO Actions:** Submit Stripe Atlas application, create business Gmail, set up Bitwarden, scan passport, prepare proof of address, create private GitHub repo. **File:** /sessions/2026-02-18.md --- ## 2026-02-19 | Session: Day 9 — HeyGen Integration & Jordan Taylor First Broadcast **Master HEAD:** post-commit (multiple commits same day) **Pipeline:** v1.0 (first full pipeline — data → script → HeyGen → video) **Topics:** HeyGen API, Jordan Taylor anchor persona, pipeline automation, RSS, domain setup **Decisions:** #8 HeyGen Pro $99/mo subscribed. #9 Jordan Taylor persona locked: Brandon_expressive2_public avatar + Jack Sterling Broadcaster voice. #10 Smart casual look over formal. #11 Views-only revenue model. #12 Full redundancy doctrine established. #13 Domain localvoicenews.com purchased. #14 Google Workspace set up. **Commits:** RSS + Idaho history database; HeyGen integration complete; full pipeline automation with run.py. **Issues Opened:** HeyGen API credits vs dashboard discrepancy. Open-Meteo added as weather fallback. **Issues Resolved:** None **CEO Actions:** Subscribe HeyGen Pro, purchase domain, set up Google Workspace, configure DNS. **File:** /sessions/2026-02-19.md --- ## 2026-02-20a | Session: Week 3c — Overlay Pipeline, HTML Cards & Brand Identity **Master HEAD:** post-session (video_assembler.py v3, graphic_generator.py v2 delivered) **Pipeline:** v3.0 (overlay architecture — Jordan video base layer, graphics overlaid via FFmpeg) **Topics:** video assembly, brand identity, Playwright rendering, overlay architecture **Decisions:** #15 Overlay architecture locked: Jordan HeyGen video is base layer, graphics overlaid via FFmpeg filter_complex. #16 Playwright + HTML/CSS over Pillow for graphic generation. #17 Brand identity LOCKED: Red #E63946, Gold #F4A523, Navy #0A0E1A, White. Font: Outfit. #18 Universal card templates for all cities. #19 Sports card uses brand colors not team colors. #20 Outro card 4 seconds. **Commits:** video_assembler.py v3, run_hybrid.py v2, graphic_generator.py v2 — delivered, not yet committed. **Issues Opened:** Weather card showing no H/L (Open-Meteo forecast not yet wired). **Issues Resolved:** Audio sync issue — overlay approach confirmed near-perfect by CEO. **CEO Actions:** None **File:** /sessions/2026-02-20a.md --- ## 2026-02-20b | Session: Week 3e — Pause Detection Breakthrough **Master HEAD:** post-session (pause detection proven in test files) **Pipeline:** v4.0 (ellipsis markers → FFmpeg silencedetect → precise overlay timestamps) **Topics:** pause detection, captions, HeyGen timing, FFmpeg silencedetect, Whisper hybrid **Decisions:** #21 Pause detection system locked: ellipsis markers in script → FFmpeg silencedetect finds timestamps → overlay graphics at exact pause points. #22 SSML tags rejected (HeyGen doesn't support). #23 Whisper hybrid captions: Whisper for timing, script text for content. #24 Caption sentence boundary splitting with 1.2s minimum per segment. **Commits:** Multiple test files; run_hybrid.py, captions.py, graphic_generator.py modified — not yet committed. **Issues Opened:** Breath pause filter fix not yet verified. **Issues Resolved:** Caption sync drift. Sentence mid-thought splits. Events mismatch between script and graphics. **CEO Actions:** None (~5 HeyGen credits used this session) **File:** /sessions/2026-02-20b.md --- ## 2026-02-21 | Session: Week 3g — Strategy, Operations Documents, Logo & Manual Kit **Master HEAD:** post-session (PROJECT_CONTEXT.md updated to Week 3g) **Pipeline:** v3.0 (no code changes — strategy + docs only) **Topics:** AI operations playbook, business strategy, anchor scripts, logo design, document kit **Decisions:** #25 AI-first org locked: zero human staff in pre-sponsor phase. #26 4-layer QA system designed. #27 Multi-anchor strategy: each anchor covers 3-5 cities max. #28 Generic intro/closing scripts: no city/day/time references. #29 Logo locked: 3-Band Bold variant, Navy bg, gradient border, Outfit/Sora font. #30 Acquisition-first strategy confirmed. #31 Global 1,000 cities target. **Commits:** None (docs only) **Issues Opened:** Evening + breaking news templates not yet built. HeyGen credits not yet granted after purchase (support case open). **Issues Resolved:** None **CEO Actions:** Record 40 intros + 40 closings via HeyFish (87 credits). Set up YouTube LocalVoice Boise. **File:** /sessions/2026-02-21.md --- ## 2026-02-22a | Session: Week 4 — Evening Broadcast, ElevenLabs, Hybrid Captions **Master HEAD:** post-session (run_broadcast.py v6.2, script_generator.py modified) **Pipeline:** v6.1 → v6.2 **Topics:** evening broadcast, ElevenLabs upgrade, hybrid captions, pronunciation system **Decisions:** #32 ElevenLabs Creator Plan $22/mo (Starter insufficient). #33 Hybrid Caption System locked: Whisper timestamps + script spelling. #34 TTS_PRONUNCIATION dictionary for phonetic fixes (Boise → Boy-see). #35 Segment deletion over broadcast cancellation on QA fail. #36 ElevenLabs voice settings: stability 0.65, similarity_boost 0.70, style 0.15. #37 Cost correction: actual ~$0.12-0.32/broadcast (not $0.02). **Commits:** run_broadcast.py v6.2, script_generator.py evening markers fixed, test_hybrid_captions.py — git commit pending. **Issues Opened:** FFmpeg PATH not permanent. Edge-TTS fallback for dev not yet built. 4-layer QA not yet coded. **Issues Resolved:** Evening broadcast markers mismatch. SerpAPI package conflict. Whisper c10.dll failure. Boise pronunciation. Captions showing "Boy C." ElevenLabs quota exhausted. **CEO Actions:** Subscribe ElevenLabs Creator. Install vc_redist.x64.exe. **File:** /sessions/2026-02-22a.md --- ## 2026-02-22b | Session: Week 4b — Broadcast Differentiation, Rotation System, SESSION_STARTER **Master HEAD:** post-session (run_broadcast.py v6.4, script_generator.py v5.3, SESSION_STARTER.md v1.0 created) **Pipeline:** v6.2 → v6.4 **Topics:** morning/evening differentiation, rotation system, SESSION_STARTER, AI playbook v2 **Decisions:** #38 Morning = UTILITY broadcast (no news): Weather → Events → Rotating → Close. #39 Evening = NEWS broadcast: Top Story + Why It Matters → More News → Events → Rotating. #40 Events date split: morning = today, evening = tomorrow+. #41 Rotation pools separated: Morning (History/Wardrobe/Gas/Motivation), Evening (Sports/Weekend Preview/Neighborhood/New Business). #42 SESSION_STARTER.md created, PROJECT_CONTEXT.md retired. #43 Edge-TTS test mode as standard dev workflow. **Commits:** run_broadcast.py v6.4, script_generator.py v5.3, SESSION_STARTER.md v1.0 — git commit pending. **Issues Opened:** All v6.4 features built but not production-tested. Motivation segment not yet coded. Safety/Alert data source not yet built. **Issues Resolved:** Morning/evening broadcasts too similar. Weather too short. Caption mid-sentence breaks. Thread context loss. **CEO Actions:** None — all code delivered for testing. **File:** /sessions/2026-02-22b.md --- ## 2026-02-22c | Session: Week 4c — Operations Docs, Multi-Platform Publisher, Reference Cleanup **Master HEAD:** post-session (publishers/ module created, 5 new reference docs) **Pipeline:** v6.5.2 → v6.6 (publisher integration pending) **Topics:** multi-platform publisher, operations docs, roadmap creation, reference cleanup **Decisions:** #44 Multi-platform from day one: YouTube + TikTok + Instagram, parallel uploads. #45 Publisher architecture: threaded, 120s timeout, independent failure, 3 retries. #46 --publish flag prevents accidental publishes during development. #47 HeyGen to be cancelled after anchor clip recording session. #48 SerpAPI paid plan needed at scale. #49 OPERATIONS_GUIDE split from TROUBLESHOOTING_AND_SAFETY_GUIDE. **Commits:** publishers/ module (6 files), publish.py, OPERATIONS_GUIDE v2.0, TROUBLESHOOTING guide, ROADMAP.md (69 items) — all delivered, git commit pending. **Issues Opened:** run_broadcast.py v6.6 publisher integration not yet applied. YouTube/TikTok/Instagram API approval not started. **Issues Resolved:** Reference folder cleaned of old duplicates. **CEO Actions:** Archive old reference docs. Start YouTube channel setup. **File:** /sessions/2026-02-22c.md --- ## 2026-02-22d | Session: Week 6 — Broadcast Structure Overhaul in Code, Repo Cleanup, Roadmap **Master HEAD:** post-session (run_broadcast.py v6.5.2, script_generator.py v5.4, ROADMAP.md created) **Pipeline:** v6.4 → v6.5.2 **Topics:** morning/evening code overhaul, rotation system fix, city config architecture, roadmap **Decisions:** #50 ROADMAP.md as single home for all planned features — 69 items across P0-P4. #51 City config architecture locked: per-city JSON in config/cities/{city}.json, social tokens from city config not .env. #52 Hold city background skyline until after launch. #53 Session closeout checklist formalized. **Commits:** run_broadcast.py v6.5.2, script_generator.py v5.4, ROADMAP.md, SESSION_STARTER.md v2.0 — git commit pending. **Issues Opened:** Root folder stale files cleanup not executed. Reference/ folder old/new doc duplicates. **Issues Resolved:** Rotation segment generating audio but no graphic card. run_broadcast.py stuck at v6.3 with missing features. Morning prompt still including news. **CEO Actions:** Clean up root and reference/ folder duplicates. **File:** /sessions/2026-02-22d.md --- ## 2026-02-23 | Session: Week 5a — Twin Falls Bug Fixes, City Onboarding Engine Design, Platform Accounts **Master HEAD:** v6.7 commit pushed to GitHub **Pipeline:** v6.5.2 → v6.7 **Topics:** Twin Falls bugs, city onboarding engine design, platform accounts, Slack webhook **Decisions:** #54 Twin Falls = test city before Boise public launch. #55 City Onboarding Engine to be built before city #3+ (~$1.40/city, 15 languages). #56 Catch-all email routing: any city@localvoicenews.com → sami@ inbox. #57 YouTube Brand Channels for multi-city. #58 @LocalVoice{City} naming convention locked. #59 No-greeting rule added to script generator. **Commits:** "v6.7: Multi-city history fix, UTF-8 graphics, no-greeting scripts, Twin Falls config" — pushed. **Issues Opened:** YouTube not yet unlocked (~24h wait). TikTok pending TOS/privacy pages. Facebook Page not started. **Issues Resolved:** Boise history loading in Twin Falls. Greeting added to wrong segment. Garbled em dashes in graphic cards. **CEO Actions:** Set up Slack workspace + #broadcasts webhook. Create Instagram accounts. Complete TikTok dev app setup. **File:** /sessions/2026-02-23.md --- ## 2026-02-23a | Session: Week 7 — Twin Falls Bug Fixes + Platform Accounts + DigitalOcean Deployment (Part 1) **Master HEAD:** v6.7 commit pushed to GitHub **Pipeline:** v6.5.2 → v6.7 **Topics:** Twin Falls bugs, platform accounts, city onboarding engine, DigitalOcean deployment **Decisions:** #60 DigitalOcean production server: 1 vCPU 2GB RAM 48GB disk, Ubuntu 24, America/Boise timezone. #61 Cron: 4AM morning + 3PM evening MT. #62 3-hour buffer before publish time for QA retries. #63 UTF-8 charset meta tag added to all 13 HTML templates. **Commits:** "v6.7: Multi-city history fix, UTF-8 graphics, no-greeting scripts, Twin Falls config" — pushed. **Issues Opened:** YouTube not yet unlocked. TikTok blocked on TOS/privacy pages. Facebook not started. **Issues Resolved:** Boise history in Twin Falls. Wrong greeting segment. Garbled em dashes. **CEO Actions:** Slack workspace created. Create Instagram @LocalVoiceMedia + @LocalVoiceTwinFalls. Activate Gemini API key. **File:** /sessions/2026-02-23a.md --- ## 2026-02-23b | Session: Week 8 Session 3 — Jordan Taylor 80 Clips + DigitalOcean Production Deployment **Master HEAD:** v6.8 commit pushed (4382f76) **Pipeline:** v6.7 → v6.8 **Topics:** HeyGen anchor clips, DigitalOcean deployment, Gemini QA, anchor selection guidebook **Decisions:** #64 Jordan Taylor avatar locked: Brandon Warner expressive, office background, 540x960. #65 Ellipsis pauses in all 80 anchor scripts. #66 Gemini added as video/audio QA Layer 5. #67 Anchor scaling model: 4-6 cities per anchor, ~35-50 total at 200 cities. #68 GitHub PAT for server auth stored in .env. #69 LocalVoice_Anchor_Selection_Guidebook.docx created. **Commits:** "v6.8: Platform selection, Slack notifications, anchor clips generator" — pushed to server. **Issues Opened:** Jordan clips 21/80 complete at session end. YouTube still blocked. Instagram Graph API token not on server. TikTok in review. **Issues Resolved:** DigitalOcean server deployed and production pipeline running. generate_jordan_clip.py built. **CEO Actions:** SCP all 80 clips to server when complete. Cancel HeyGen after clips generated. **File:** /sessions/2026-02-23b.md --- ## 2026-02-24 | Session: Week 9 Day 1 — First Production Broadcast + Instagram API + Monitoring **Master HEAD:** 8 commits pushed (final state v6.9) **Pipeline:** v6.8 → v6.9 **Topics:** first production broadcast, QA v1.1, audio normalization, Instagram API, cron, health_check.py **Decisions:** #70 FIRST COMPLETE PRODUCTION BROADCAST: Twin Falls morning, 51.8s, $0.15, QA 3/3 pass. #71 QA philosophy: expand source_data, never relax rules. #72 Random clip selection pattern locked. #73 All audio standardized: 48kHz stereo AAC. #74 health_check.py built: runs 11PM nightly. #75 Cron --publish flag REMOVED until platforms ready. #76 TikTok app submitted for review. **Commits:** 8 commits: random clip selection, audio normalization, QA v1.1, Slack CITY crash fix, health_check.py, Instagram token, cron update. **Issues Opened:** ElevenLabs health endpoint 401. KLIX RSS may be down. Eventbrite HTTP 405. Times-News 429. KMVT 404. HeyGen not yet cancelled. YouTube still blocked. **Issues Resolved:** All 80 Jordan Taylor clips uploaded to server. Audio normalization. Events hallucination. L2 QA false positives. Slack CITY crash. JSON datetime crash. **CEO Actions:** Cancel HeyGen NOW. Check YouTube unlock. Rotate API keys. Monitor cron via Slack. **File:** /sessions/2026-02-24.md --- ## 2026-02-24a | Session: Week 10 — RSS Feed Overhaul, QA v1.3, Full Evening Broadcast Restored **Master HEAD:** v6.9.2 commit pushed **Pipeline:** v6.9.1 → v6.9.2 **Topics:** RSS feed diagnosis, QA v1.3, server dependency reinstall, first full evening broadcast **Decisions:** #77 All 3 Twin Falls RSS feeds were dead — replaced with 4 server-verified working feeds: KLIX, KIVI, KTVB, KBOI. #78 Never trust LLM-provided URLs without server-side verification. #79 QA v1.3: ACCEPTABLE rules listed first and dominant, FAIL criteria narrowed. #80 Dedup limit must exceed local story count. **Commits:** "v6.9.2" — pushed to GitHub. **Issues Opened:** QA v1.3 residual strict language. Whisper/PyTorch missing from server. Eventbrite 405. Obituary entries leaking into broadcasts. **Issues Resolved:** All 3 RSS feeds dead (4 working replacements). Short/broken broadcasts (root cause: missing headline data). Server ModuleNotFoundError. First full 5-segment evening broadcast: 141.8s. **CEO Actions:** SCP changed files to laptop and push to GitHub. **File:** /sessions/2026-02-24a.md --- ## 2026-02-25a | Session: Week 10 Day 4 — YouTube LIVE, IG/TikTok Research, All P0 Complete **Master HEAD:** v6.9.3 commit **Pipeline:** v6.9.2 → v6.9.3 **Topics:** YouTube first video, QA v1.4, news.py v2.0, Instagram/TikTok research **Decisions:** #81 All 3 platforms launch together or none — CEO overruled partial launch. #82 QA v1.4 COMPLETE REWRITE: default is PASS, only 5 specific FAIL triggers, "if unsure PASS IT". #83 news.py v2.0: deleted CITY_FEEDS dict, rewrote to import from config/cities.py — single source of truth. #84 Obituary filter added. #85 Broadcast date timezone bug identified: all datetime.now() = UTC not city local. **Commits:** news.py v2.0, QA v1.4, Boise RSS fix, teaser logging fix — all in v6.9.3. **Issues Opened:** Broadcast date timezone bug. Instagram blocked (resumable upload 400 error). TikTok needs OAuth flow. **Issues Resolved:** Obituary entries leaking. news.py duplicate CITY_FEEDS dict. QA false positives. Boise RSS 404. First YouTube video published live. **CEO Actions:** Complete go-live sprint next session. **File:** /sessions/2026-02-25a.md --- ## 2026-02-25b | Session: Week 11 Day 1 — 83(b) Verified, ROADMAP v1.6 **Master HEAD:** v6.9.3 (unchanged — documentation session) **Pipeline:** v6.9.3 (no code changes) **Topics:** 83(b) election verification, ROADMAP v1.6, corporate records **Decisions:** #86 83(b) CONFIRMED FILED: Stripe Atlas mailed USPS Certified Feb 23, 2026. 8M shares at $80.00 FMV. Tax basis locked at $80.00 total. #87 ROADMAP v1.6: 22 P0 items total, 18 complete. **Commits:** None (docs only) **Issues Opened:** None new **Issues Resolved:** P0 #22 (83(b) filing confirmed). **CEO Actions:** Attach 83(b) copy to 2026 tax return when filing. **File:** /sessions/2026-02-25b.md --- ## 2026-02-25c | Session: Week 12 — Go-Live Sprint, All P0 Complete, Twin Falls LIVE **Master HEAD:** v6.9.4 — all publishers operational **Pipeline:** v6.9.3 → v6.9.4 **Topics:** TikTok OAuth, Nginx/SSL media server, Instagram video_url fix, timezone fix, dotenv fix, first 3-platform simultaneous publish **Decisions:** #88 All 22 P0 items COMPLETE — Twin Falls on full autopilot. #89 TikTok Upload API (drafts) over Direct Post. #90 Nginx on DigitalOcean: /root needs 755. #91 media.localvoicenews.com deployed with Let's Encrypt SSL (exp. May 26, 2026). #92 city_now() helper using zoneinfo — all 12 datetime.now() calls replaced. #93 load_dotenv() added to run_broadcast.py top for cron env fix. #94 TikTok drafts visible on mobile only — CEO taps publish daily. **Commits:** v6.9.4: TikTok OAuth, Nginx, Instagram video_url, timezone fix, dotenv fix. **Issues Opened:** ElevenLabs health check 401. SERPAPI_KEY missing from .env. Eventbrite 405. HeyGen still not cancelled. **Issues Resolved:** TikTok OAuth obtained. Instagram HTTPS media server. Instagram 2207076 error. Broadcast timezone wrong. Cron env vars. First 3-platform simultaneous publish. **CEO Actions:** Cancel HeyGen NOW. Check TikTok inbox daily. Reboot server (82 pending security updates). Regenerate ElevenLabs key. **File:** /sessions/2026-02-25c.md --- ## 2026-02-26 | Session: Week 13 — Instagram Error 2207089 Debug (UNRESOLVED) **Master HEAD:** v6.9.4 (no new commits — debug session only) **Pipeline:** v6.9.4 (unchanged) **Topics:** Instagram error 2207089, Meta Graph API, Facebook account restriction aftermath **Decisions:** #95 Error 2207089 root cause: Facebook account restriction set flag causing REELS containers to be created as VIDEO type. #96 New Meta app created: LocalVoice Publisher v2 (App ID: 2372521639888302). #97 System User "Sami" created with never-expire token. #98 Official APIs only — instagrapi or unofficial libraries never to be used. **Commits:** None **Issues Opened:** Instagram error 2207089 UNRESOLVED (5 token types, 2 apps, 3 API versions attempted). cost variable UnboundLocalError crashing Slack notifications. **Issues Resolved:** None (full debug session — unresolved) **CEO Actions:** Try instagrapi in next session (pre-official-APIs-only decision). Consider fresh Instagram account as fallback. **File:** /sessions/2026-02-26.md --- ## 2026-02-27a | Session: Week 14 — Safe Zone Card Redesign + Caption Fix **Master HEAD:** post-session (run_broadcast.py v6.9, graphic_generator.py v4.0 deployed) **Pipeline:** v6.8 → v6.9 **Topics:** safe zone redesign, caption repositioning, Jordan Taylor removed, TikTok region lock discovery **Decisions:** #99 SAFE ZONE LOCKED: top 200px, bottom 420px, right 150px, left 50px — content area 880×1300px. #100 All 13 card templates rescaled to safe zone. #101 Caption ASS style LOCKED: Alignment=2, MarginL=80, MarginR=190, MarginV=420, 40px font. #102 Caption 45-char hard limit checked before sentence-ending. #103 Jordan Taylor clips REMOVED from pipeline. #104 TikTok Saudi Arabia region lock discovered — all production US TikTok accounts must use US VPN. **Commits:** run_broadcast.py v6.9, graphic_generator.py v4.0 — deployed via SCP, no git commit. **Issues Opened:** QA word limit killing events at 73/70 words. Weather QA false positive on paraphrased temp. YouTube double captions. Instagram 2207089 deferred. **Issues Resolved:** Platform UI overlay covering card content. Caption text covered by platform UI. **CEO Actions:** Create US VPN accounts for all production city TikTok accounts. **File:** /sessions/2026-02-27a.md --- ## 2026-02-27b | Session: Week 15 — Monitoring Overhaul + Critical Bug Fixes **Master HEAD:** post-session (platform_health.py v1.0 created, run_broadcast.py v6.9.6) **Pipeline:** v6.9.5 → v6.9.6 **Topics:** platform_health.py, TikTok token refresh, Instagram self-resolved, Slack fix, cron timing **Decisions:** #105 OFFICIAL APIS ONLY permanently locked — acquisition-clean, scalable, zero compliance risk. No unofficial libraries ever. #106 Instagram 2207089 self-resolved after ~48hrs — lesson: build retry/alerting, don't panic-rebuild. #107 platform_health.py v1.0: monitors 11 services, auto-refresh TikTok + Instagram tokens, runs 1hr before each broadcast. #108 Cron updated: 4AM→7AM MT morning, 3PM→6PM MT evening (makes sense for viewers). #109 Weather H/L triple fallback: Open-Meteo → OpenWeather → estimate ±5°. **Commits:** run_broadcast.py v6.9.6, qa_system.py (word limits raised), platform_health.py — git commit pending. **Issues Opened:** health_check.py full rewrite needed. Email alerting needs Google Workspace app password. Server 70 pending security updates. **Issues Resolved:** TikTok token expired (auto-refresh now in platform_health). Instagram 2207089 self-resolved. Slack cost variable crash. QA word limit deleting events. Cron timing wrong for viewers. **CEO Actions:** Set up Google Workspace app password for email. Add SERPAPI_KEY to server .env. Schedule server security updates + restart. **File:** /sessions/2026-02-27b.md --- ## 2026-02-28a | Session: Week 16 — Bug Fixes, Git Sync Workflow, Music Plan, Organic Marketing Playbook **Master HEAD:** v6.9.7, v6.9.8 commits pushed **Pipeline:** v6.9.6 → v6.9.8 **Topics:** teaser removal, weather QA fuzzy match, git workflow, music pipeline, organic marketing playbook **Decisions:** #110 Git sync ritual locked: Server → SCP to laptop → push to GitHub — every session end. #111 Teaser fully dead: removed from all 4 files — saves ~$0.25/morning in TTS credits. #112 Weather QA fuzzy match: ±2°F tolerance replaces exact string match. #113 YouTube auto-captions non-issue (off by default). #114 Weekend preview segment KILLED permanently. #115 Music pipeline: Suno Pro $10/mo (commercial rights) selected. CEO to generate intro sting, background bed, outro sting. #116 Organic marketing playbook v1.0: algorithm-driven organic only, zero ad spend until PMF. **Commits:** v6.9.7 (teaser removal, weather QA), v6.9.8 (events card 3 items max, weekend preview removal) — pushed. **Issues Opened:** None new **Issues Resolved:** Teaser wasting TTS credits. Weather QA false positive. YouTube double captions (non-issue). Weekend preview duplicating events. Events card unreadable on mobile. **CEO Actions:** Generate Suno audio clips (music pipeline blocked on this). Execute organic marketing playbook on Twin Falls. **File:** /sessions/2026-02-28a.md --- ## 2026-02-28b | Session: Week 17 — Weather Fix, Sports Permanent, Broadcast Structure, Card Redesign **Master HEAD:** v6.9.9 committed and pushed **Pipeline:** v6.9.8 → v6.9.9 **Topics:** 7-day forecast cache, sports permanent segment, 24-month growth plan, broadcast structure locked **Decisions:** #117 7-day forecast cache: forecast.py fetches Open-Meteo daily, caches to data/weather/forecast_{city_id}.json. Weather H/L definitively fixed. #118 Sports promoted to PERMANENT segment: morning + evening both include sports. #119 Broadcast structure LOCKED: Morning [weather, sports, events, rotating], Evening [weather, sports, top_headlines, more_news, events, rotating]. #120 24-month growth plan: M1-3 (1-10 cities) → M4-6 (10-50) → M7-12 (50-200) → M13-18 (200-500) → M19-24 (500-1000). #121 Acquisition floor at 1,000 cities: $30M-$50M floor, $200M-$500M+ with engagement. **Commits:** v6.9.9: 7-day forecast cache, sports permanent, broadcast structure, card redesign (weather + motivation). **Issues Opened:** Sports card placeholder showing "Boise State vs Opponent". History + wardrobe + sports cards need safe zone treatment. Music pipeline blocked on Suno clips. **Issues Resolved:** Weather H/L showing identical values. Morning broadcast too short at 39s. **CEO Actions:** Generate Suno clips (still blocking). Add Gemini API key to server .env. **File:** /sessions/2026-02-28b.md --- ## 2026-03-01a | Session: Week 18 Part 1 — Sports Card Redesign + Health Check Rewrite **Master HEAD:** post-session (4 commits pushed — v7.0.1) **Pipeline:** v6.9.9 → v7.0.1 **Topics:** sports card 3-state system, sports_local.py v1.0, health_check.py v2.0 **Decisions:** #122 Sports card 3-state system: Score Card (ESPN API) → News Card (KMVT RSS) → Trivia Card (fallback, always available). #123 sports_local.py v1.0 built: ESPN API (Boise State ID:68) → KMVT Sports RSS → trivia fallback. #124 health_check.py v2.0: 7 automated checks, full subscription tracker (15 services), correct costs ($268/mo). **Commits:** 4 commits — sports card 3-state, sports_local.py, health_check v2.0, weather card height. **Issues Opened:** None new **Issues Resolved:** Sports card placeholder "Boise State vs Opponent." health_check.py outdated hardcoded credentials. health_check.py missing TikTok. **CEO Actions:** None **File:** /sessions/2026-03-01a.md --- ## 2026-03-01b | Session: Week 18 Part 2 — Evening Crash Hotfix + V2 Vision **Master HEAD:** v7.0.1 (hotfix applied live via sed, NOT committed) **Pipeline:** v7.0.1 (hotfix only) **Topics:** evening broadcast crash hotfix, marketing strategy locked, LocalVoice V2 vision **Decisions:** #125 Marketing strategy LOCKED: zero human interference, algorithm-driven organic only, no Reddit/Facebook Groups/Nextdoor/blog/SEO, paid ads at scale only. #126 CEO philosophy LOCKED: no human involvement ever (Plan A), AI-only 1→1,000 cities, Plan B only if acquisition fails. #127 LocalVoice V2 Vision defined: broadcasts are V1 hook, V2 = local infrastructure platform with AI Concierge, Local Pulse, AI Town Hall, marketplace, etc. Real acquisition asset = local data graph across 1,000 cities. $20B thesis. #128 Evening crash root cause: sports_local.py returned flat dict, script_generator iterated dict keys as strings. **Commits:** None (hotfix via sed on server only — pending git commit). **Issues Opened:** Crash notification gap (pipeline fails silently). Sports prompt hallucination (evening). Hotfix not committed to git. **Issues Resolved:** Evening broadcast crash (sports dict iteration). **CEO Actions:** Generate Suno audio clips (still blocking). **File:** /sessions/2026-03-01b.md --- ## 2026-03-01c | Session: Week 19 Session 1 — QA Critical Fix + City Onboarding Engine v2.0 Architecture **Master HEAD:** post-session (v7.0.2 — QA rewrite, sports skip, onboarding engine files) **Pipeline:** v7.0.1 → v7.0.2 **Topics:** 26-second broadcast emergency, QA L2 triple-redundancy, sports skip logic, City Onboarding Engine v2.0 design **Decisions:** #129 QA L2 REWRITTEN: triple-redundancy — Gemini 2.5 Flash primary → Claude Sonnet fallback → pass-all last resort. 6 specific FAIL triggers only. #130 Sports skip logic: cities with sports_teams=[] skip sports entirely. Twin Falls set to [] (CSI not in ESPN). #131 City Onboarding Engine v2.0: 9 independent data sources, dual USA/Global engine, all legally cleared. #132 City lifecycle: Phase 1 Onboard (~60s, ~$1.35) → Phase 2 Activate (~20min) → Phase 3 Monitor → Phase 4 Optimize. #133 Claude named 'C' by CEO. **Commits:** v7.0.2: QA L2 rewrite, sports skip logic, 6 onboarding engine files. **Issues Opened:** Gemini L2 latency ~5s per broadcast. SSH typo risk. **Issues Resolved:** 26-second morning broadcast (sports data never passed to QA). QA single point of failure. Sports failing QA on live scores. **CEO Actions:** Sign up NewsData.io, World News API, Google Places (enable billing), Yelp Fusion. **File:** /sessions/2026-03-01c.md --- ## 2026-03-02a | Session: Week 19 Session 2 — City Onboarding Engine v2.0 Full Build + Austin Broadcast **Master HEAD:** v7.0.3 committed and pushed **Pipeline:** v7.0.2 → v7.0.3 **Topics:** 26 onboarding engine files deployed, 3 new API keys, 6 cities tested, Austin TX first onboarded broadcast **Decisions:** #134 City Onboarding Engine v2.0 COMPLETE: 26 files, 9 source fetchers, orchestrator, CLI. #135 CITIES dict REWIRED: reads JSON only, CITIES = {} (empty). Boise removed (re-onboard via engine later). #136 3 new API keys: NEWSDATA (200/day), WORLDNEWS (50/day, backlink required), GOOGLE_PLACES ($300 GCloud credits). #137 Gemini upgraded to paid tier: $300 credits, 6+ months at current usage. #138 Yelp Fusion evaluated and skipped ($229/mo minimum). #139 World News API backlink required on website footer. **Commits:** v7.0.3: 26 engine files, cities.py rewire, 3 API keys, Austin TX test. **Issues Opened:** Events fetcher defaulting to Boise for all cities. OpenWeather rejecting "Austin, TX" format. Local keyword filter too strict. Twin Falls all RSS dead. GitHub PAT exposed in terminal. **Issues Resolved:** City Onboarding Engine v2.0 deployed. First onboarded city broadcast (Austin TX 67.9s). Git merge conflicts in 6 files. **CEO Actions:** Rotate GitHub PAT. Add World News API backlink to website footer. Set GCP budget alert at $50. **File:** /sessions/2026-03-02a.md --- ## 2026-03-02b | Session: Week 20 — Local Source System Live + Sensitivity Filter + CITIES JSON Migration **Master HEAD:** v7.0.4 committed and pushed **Pipeline:** v7.0.3 → v7.0.4 **Topics:** CITIES JSON migration, local sources pipeline, sensitivity filter, SerpAPI fallback, first organic TikTok follower **Decisions:** #140 CITIES dict emptied permanently: twin_falls.json created with all fields. All cities JSON only — CITIES = {} forever. #141 Browser User-Agent adopted: Chrome 131 UA for all fetchers. #142 SerpAPI fallback for blocked sites (school districts, etc.) using site:{domain} syntax. #143 Sensitivity filter: blocks 30+ terms in 8 categories (violence, politics, religion, crime, etc.). #144 Manual audit required for every new city before first broadcast. #145 Broadcast tier system: Auto Tier 1/2/3 based on city population. #146 Auto-replacement segments expanded: 4→10 rotating segments. **Commits:** v7.0.4: JSON-only cities, ai_clients.py, sensitivity filter, SerpAPI fallback, local sources wired, tier system, auto-replacement. **Issues Opened:** Gemini JSON parse errors (8/14 sources fail). Stale news from local sources (date validation needed). Events fetcher still using Boise. BREAKING tag fires on listicles. **Issues Resolved:** CITIES dict migration. Local sources pipeline wired. National/violent content (sensitivity filter). School district fetch blocks. First organic TikTok follower. **CEO Actions:** Decide next city to onboard. Rotate GitHub PAT. **File:** /sessions/2026-03-02b.md --- ## 2026-03-03 | Session: Week 21 — Dayton Onboarded + Multi-City Unlock (Parallel 4-Tab) **Master HEAD:** b183249 pushed to master **Pipeline:** v7.0.4 → v7.1.0 **Topics:** Dayton OH City #2 onboarded, 4-tab parallel Claude workflow, multi-city dynamic config, BlueStacks TikTok fix **Decisions:** #147 4-tab parallel Claude workflow: Tab 1 Maestro (strategy/orchestration), Tab 2 Accounts, Tab 3 Segment audit, Tab 4 Heavy code. No deploy without Maestro approval. #148 Dayton OH = City #2: 136K pop, WDTN RSS, 4 sports teams, 313 keywords, 19 neighborhoods. #149 100K+ cities only. #150 No Dayton cron until: Voice EQ deployed, music pipeline, CEO final review. #151 BlueStacks + Windscribe VPN = PERMANENT TikTok solution for all future US city accounts. #152 MULTI-CITY UNLOCK: all 4 data fetchers dynamically load from city JSON config — zero code changes per new city. #153 Date validation: 48hr news, 24hr sports, 72hr community. **Commits:** b183249 "Week 21: Dayton onboarded + multi-city dynamic config unlock" **Issues Opened:** Voice EQ not integrated. Dayton only 1 RSS feed (WDTN). Twin Falls eventbrite_url invalid. Caption desync on longer segments. **Issues Resolved:** OpenWeather rejecting non-hardcoded city names. Events fetcher defaulting to Boise. News filter only knowing TF keywords. Sports trivia hardcoded to TF. BREAKING badge on every story. 5 broken autofill segments disabled. Gemini JSON 57% failure rate fixed. **CEO Actions:** Run Voice EQ deploy next session. Add Dayton RSS feeds. Watch full Dayton broadcast before approving live. **File:** /sessions/2026-03-03.md --- ## 2026-03-03b | Session: Week 22 — Broadcast Polish + Dayton Go-Live Prep (Parallel 3-Tab) **Master HEAD:** b183249 (unchanged — all deploys queued) **Pipeline:** v7.1.0 (no bump — staged) **Topics:** Voice EQ deployment, music pipeline architecture locked, 13 card designs locked, Dayton data enrichment **Decisions:** #154 Voice EQ 5-stage FFmpeg filter deployed: highpass 120Hz → presence boost 2.5kHz +4dB → low-mid cut 180Hz -3dB → acompressor 2:1 → loudnorm EBU R128 -16 LUFS. Patched at 3 locations. #155 Music pipeline architecture LOCKED: audio/music_mixer.py, 3 layers, single FFmpeg pass, graceful fallback. BLOCKED on CEO Suno clips. #156 13 card templates designed and CEO-approved — all safe zone compliant. New design: SVG logo, radial glow backgrounds. #157 Dayton RSS expanded 1→4: WDTN + Spectrum News 1 Ohio + City of Dayton Alerts + Flyer News. #158 Minimum 3 active data sources per city before launch. #159 Deploy sequence for next session defined. **Commits:** None (Dayton config updated on server only). **Issues Opened:** Spectrum News 1 returns empty XML. Voice EQ needs real Brandon Warner validation. generate_account_kit.py typos. **Issues Resolved:** local_sources flat string format mismatch. Dayton RSS 1→4. Server 70 security updates applied. Laptop backup / disaster recovery gap. Git case collision (Tools/ vs tools/). **CEO Actions:** Generate 3 Suno clips (intro sting ~3-5s, background bed ~60s, outro sting ~3-5s). Run deploy sequence next session. **File:** /sessions/2026-03-03b.md --- ## 2026-03-03c | Session: Week 23 — Voice EQ Confirmed + Card v5.0 Deployed (Parallel 2-Tab) **Master HEAD:** post-session (graphic_generator.py v5.0 live, run_broadcast.py Voice EQ live, v7.1.1) **Pipeline:** v7.1.0 → v7.1.1 **Topics:** Voice EQ real ElevenLabs validation, graphic_generator.py v5.0 deployment, 12-month financial model, ElevenLabs scaling plan **Decisions:** #160 Voice EQ CONFIRMED: CEO phone test approved ("better than before"). Filter specs finalized. ~1,140 credits/broadcast confirmed. #161 ElevenLabs scaling plan LOCKED: Creator $22/mo (2-4 cities) → Pro $99/mo (5) → Scale $330/mo (25) → Enterprise (50+). #162 Revenue decision moved to M12: no sponsors for 12 months. At 200 cities $300/mo/city = $60K/mo instant profitability. #163 12-month burn: ~$13K-$15K total. #164 graphic_generator.py v4.1→v5.0: 949 lines (26% smaller), 13 cards redesigned, inline styles, SVG logo. #165 Card v5.0 key changes documented (dual badge, 5-day forecast, simplified events, etc.). **Commits:** Pending (live on server, git commit queued). **Issues Opened:** Top Story + History pipeline wiring must use correct dict keys. Caption overlay not tested on v5.0. Music pipeline still blocked on Suno. **Issues Resolved:** Voice EQ validation with real Brandon Warner voice. graphic_generator.py v5.0 all 13 cards rendering. Card dict key mismatch bugs confirmed non-issues. **CEO Actions:** Generate Suno clips (still blocking). Wire Top Story + History data keys. Run full v5.0 end-to-end broadcast test. **File:** /sessions/2026-03-03c.md --- ## 2026-03-04 | Session: Week 24 — Full Data Audit + Phase A Critical Fixes (4-Tab Parallel) **Master HEAD:** f07c8f4 pushed to master **Pipeline:** v7.1.1 → v7.2.0 (Phase A) **Topics:** data quality audit, safety gate deployed, Twin Falls RSS fix, Dayton config cleanup, events cache built, local sources wired, channels-not-cities strategy locked **Decisions:** #166 CHANNELS NOT CITIES strategy LOCKED: 182 US cities 150K+ = 500-700 channels. NYC = 10-12 channels. Stealth bottom-up rollout: Tier 1 (M1-6, 150-300K) → Tier 2 (M6-12, 300K-1M) → Tier 3 (M12-18, 1M+ districts) → Tier 4 (M18-24, international). #167 Safety gate deployed: Gate 1 = weather empty → block + Slack. Gate 2 = evening headlines < 2 → block + Slack. --test bypasses. #168 Dayton keywords cleaned 313→140. #169 events_cache.py built: SerpAPI once/day, 24h freshness, stale fallback. #170 Local sources wired into pipeline morning + evening with full try/except. **Commits:** 2156fae (12 files, pre-Phase A), f07c8f4 (Phase A: safety gate + local sources + key fixes + RSS + events cache). **Issues Opened:** Local sources wiring not activating in tests (city_cfg string vs dict). Evening prompt doesn't skip headline sections when empty. community_heroes not wired into rotating segment. morning_headlines.json persistent stale data leak. discover_local_sources.py not in orchestrator. ai_clients.py zero retry logic. **Issues Resolved:** Top Story + History card dict key mismatches. Safety gate deployed. Twin Falls RSS fixed (4 feeds). Dayton keywords 313→140. Dayton 3 trivia errors. Server kernel update + reboot. Git sync. **CEO Actions:** Monitor local sources activation in next Dayton test. Generate Suno clips. **File:** /sessions/2026-03-04.md --- ## 2026-03-05 | Session: Week 25 — Engine Hardening + Dayton Go-Live Prep (5-Tab Parallel) **Master HEAD:** 868a6bd (8 commits this session) **Pipeline:** v7.1.1 → v7.3.0 **Topics:** ElevenLabs fallback wired, per-city TTS engine, data source monitor agent, Dayton go-live unblocked, Community Heroes feature, events cache wired, discover_local_sources into orchestrator, ai_clients retry, Eventbrite removed, truncation fix, keyword bleed fix **Decisions:** #171 ElevenLabs → edge-tts fallback wired for ANY production failure (401, 429, 500, exception). #172 Per-city tts_engine config field: Twin Falls assigned 'edge-tts' permanently to stop burning credits. #173 Data Source Monitor v1.0 built (368 lines): checks all RSS + local_sources URLs, ThreadPoolExecutor, Slack alerts, cron 08:00 UTC. #174 Dayton cron added: forecast 10:30 UTC, morning 11:00 UTC, evening 22:00 UTC. #175 Spokane config patched: RSS feeds, sports teams, weather_units, date_format, history_file. #176 Community Heroes feature built end-to-end with random entity selection + real vs generic prompt. #177 Top Story truncation fix: _truncate_to_sentence() helper replaces 250-char slice. #178 Wikipedia keyword bleed fixed: GEO_TERMS + CAT_STRIP constants added to discover_keywords.py. #179 discover_local_sources.py wired into orchestrator as step 6/11. #180 ai_clients.py 3-attempt exponential backoff (1s/2s/4s). #181 Eventbrite REMOVED permanently (HTTP 405, bot protection — no fix). #182 Events cache wired into run_broadcast.py as 4-level fallback chain. **Commits:** 1f0840e (ElevenLabs fallback), 0f5f341 (per-city TTS), 707d884 (data source monitor), d2e1687 (Dayton JSON fix), 46ac6b9 (Dayton go-live checklist), d7c8fad (Community Heroes), a539a62 (top story truncation), b395d74 (keyword bleed fix). **Issues Opened:** morning_headlines.json city leak persists. edge-tts also failing = None kills broadcast (no tertiary). Dayton BREAKING tag on listicles. SerpAPI phase-out pending. **Issues Resolved:** ElevenLabs production failure had no fallback. Twin Falls burning credits unnecessarily. Zero visibility on data source health. Dayton local sources silent JSONDecodeError. Community Heroes generic only. Top Story truncating mid-sentence. Wikipedia keywords polluting onboarding. discover_local_sources.py never called. ai_clients.py crashing on transient errors. Eventbrite 405 noise. History card crash on empty path. **CEO Actions:** Watch Dayton broadcast and approve before live cron. Generate Suno clips. **File:** /sessions/2026-03-05.md --- ## 2026-03-05b | Session: 05.03.26 02:00 AST — Cache Architecture + Spokane Prep + Bulletproof Directive **Master HEAD:** 868a6bd (10 commits this session) **Pipeline:** v7.3.0 (v7.4.0 pending bump) **Topics:** 10-tab system locked, cache-first local sources architecture, morning_headlines fix, .gitignore cleanup, multi-city publisher credential bug, production crashes x2, bulletproof directive issued **Decisions:** #183 10-tab permanent system LOCKED: Tab 1 Maestro A, Tab 2 Maestro B (server verification only), Tabs 3-10 assigned Workers P2-P9. Session naming convention changed to DD.MM.YY HH:MM AST. #184 Cache-first local sources architecture: local_sources_cache.py (new cron, every 4hrs), run_broadcast.py reads cache ≤6hr old. #185 NO NEW LAUNCHES until pipeline bulletproof: 7 consecutive stable days for TF + Dayton, all P0/P1 resolved. #186 3-environment system designed: dev → staging → master. #187 Multi-city publisher credential bug: all cities publishing to same Twin Falls .env credentials. Fix: per-city platform_credentials dict in JSON. #188 P7 QA must always run git log before auditing — non-negotiable protocol. #189 Spokane.json naming bug: should be spokane_wa.json. **Commits:** 3d0a220 (local_sources_cache.py NEW), 86cbbe4 (cache-read logic in run_broadcast.py), 9249e99 (LocalSourceFetcher class fix), 117877e (slack_notifier import fix), 7b37577 (morning_headlines.json wipe at broadcast start), d43e5ef (.gitignore +10 entries), 8145b60 (Spokane RSS fixes), 808277b (build_stats typo), 4bd2c55 (GeminiClient pass-through fix), 868a6bd (HOTFIX _truncate_to_sentence NameError). **Issues Opened:** Multi-city publisher credentials P0 (blocking all growth). 3-environment system not yet deployed. Spokane.json rename needed. GCP $50 budget alert overdue. Dayton platform credential IDs needed. **Issues Resolved:** morning_headlines.json cross-city leak. .gitignore missing 10 directories. Spokane dead RSS feeds. local_sources_cache gemini_client=None. _truncate_to_sentence NameError (production hotfix). **CEO Actions:** GCP $50 budget alert (OVERDUE). Provide Dayton YouTube channel ID, Instagram user ID, TikTok open ID. **File:** /sessions/2026-03-05b.md --- ## 2026-03-07 PM | Session: Facebook Migration Sprint — TikTok Dropped, Facebook Publisher Built **Master HEAD:** 8a4a53f (staging, 13 commits ahead of master — merge pending P7 pass) **Pipeline:** v7.4.0 (staging branch) **Topics:** TikTok dropped permanently, facebook_publisher.py built (286 lines), Instagram token regeneration, long-lived token strategy **Decisions:** #190 TikTok DROPPED PERMANENTLY: tiktok.py disabled, all TikTok fields stripped. New Platform #3 = Facebook Page + Facebook Group cross-post. #191 Long-lived token strategy: always exchange Graph API Explorer tokens for 60-day tokens immediately. #192 Business Manager architecture deferred (messy, fix next session). #193 Staging = production server (no separate server). #194 Token security: paste tokens directly into server terminal, never through chat. #195 Dayton Facebook Page ID: 1036288106230539. Instagram user ID: 17841443618505968. **Commits (staging):** TikTok fully stripped, facebook_publisher.py built (286 lines), FacebookPublisher wired into platform loop, rotating sub-type alias fix (history/wardrobe/motivation/community no longer dropped), Facebook video upload endpoint fixed to graph-video.facebook.com, long-lived tokens stored. **Issues Opened:** P7 Test 2 not yet run (required before merge). 4-level fetch chain wiring pending. Logger bug: logs/app files empty. Business Manager cleanup needed. **Issues Resolved:** Evening broadcast crash via rotating sub-type aliases. Facebook upload endpoint (#100 no permission). Both tokens expired mid-session (exchanged for 60-day). Instagram token missing instagram_content_publish. **CEO Actions:** GCP $50 alert (OVERDUE). Merge staging→master after P7 Tests 1+2 pass. Migrate city assets to Business Manager. Twin Falls Facebook token setup. HeyGen ~101 credits before Mar 23. **File:** /sessions/2026-03-07-pm.md --- ## 2026-03-08 Early | Session: 07-08.03.26 Late Night — Docs + Lessons Learned + Worker Dispatch **Master HEAD:** daa58a0 (master) | 0ea1b5a (staging, 10 commits ahead) **Pipeline:** v7.4.0 (staging) → v7.5.0 (pending merge) **Topics:** cache architecture killed permanently, 5-level fetch chain wired, ClaudeNewsFetcher + ClaudeEventsFetcher deployed, logger bug fixed, LESSONS_LEARNED.md created **Decisions:** #196 Cache architecture KILLED PERMANENTLY: local_sources_cache.py deleted. At 2 cities complexity >> savings. Cache miss → stale → 0 headlines → broadcast blocked. Never revert. #197 5-level news fetch chain LOCKED: Gemini → Claude → RSS → National Safe → Contingency. Safety gate = WARN ONLY, never block. Degraded broadcast > no broadcast. #198 4-level events fetch chain: ClaudeEventsFetcher → EventsFetcher → cache (read-only) → empty list. #199 Never poll _poll_processing before Facebook post (causes is_transient error every time). #200 LESSONS_LEARNED.md created as permanent reference — 15 hard-won lessons. P9 checks before every session. #201 TikTok re-entry only at City #50 via official TikTok Media Partner Program. #202 7 platforms per channel planned: YouTube + Instagram + Facebook + Threads + Telegram + LinkedIn + Dailymotion. **Commits:** TikTok refs removed from pipeline (master). ClaudeNewsFetcher + ClaudeEventsFetcher added (285 lines, 2 new files). 5-level news + 4-level events chain wired. events_cache.py stripped to read-only. local_sources_cache.py deleted. Logger bug fixed. facebook_publisher polished. **Issues Opened:** P7 Test 2 not yet run. Logger cherry-pick to master needed. Protocol violations (P6, P2 committed to master — cleanup only). **Issues Resolved:** Cache complexity eliminated. 5-level fetch chain wired. Logger bug (all modules now write to logs/app_YYYYMMDD.log). facebook_publisher _poll_processing race condition prevented. **CEO Actions:** GCP $50 alert (OVERDUE). Merge staging after P7 Test 2 passes. Migrate to Business Manager. HeyGen credits before Mar 23. **File:** /sessions/2026-03-07-late.md --- ## 2026-03-08 | Session: 08.03.26 — Facebook Root Cause + Platform Health + Merge **Master HEAD:** 17f2ae2 (post-merge — master = staging = origin/master = origin/staging) **Pipeline:** v7.5.0 LIVE **Topics:** Facebook race condition fixed, 5-level fetch chain confirmed working, safety gate WARN-only regression fixed, Haiku for script generation, Tier 2 API unlocked, Mercury bank approved, full merge **Decisions:** #203 Script generation on Haiku LOCKED: claude-haiku-4-5-20251001 for script_generator.py. Sonnet reserved for QA + Level 2 news fetch. 5x cheaper, no quota competition. #204 ANTHROPIC_API_KEY_STAGING: staging tests use separate key, production quota untouched. #205 Anthropic Tier 2 unlocked: 450K TPM (was 30K, 15x increase). #206 THE SCALE RULE (Decision #18): every fix and feature must work for 1,000 channels without modification. #207 Three-tier infrastructure: Tier 1 (now→City 20) = DO backups + .env in password manager. Tier 2 (20-200) = Terraform IaC. Tier 3 (200-1000) = Kubernetes + multi-region. #208 Facebook race condition fixed: wire _poll_processing() BETWEEN upload and post. #209 Safety gate WARN-only regression fixed: removed publish_blocked flag, replaced with safety_warnings list. Both gates warn + Slack + broadcast continues. #210 analytics_tracker.py rebuilt (230 lines): YouTube + Instagram + Facebook Graph APIs, per-city JSON, daily Slack summary, cron 23:00 UTC. #211 platform_health.py: refresh_facebook_page_tokens() built for scale (reads all city JSONs, checks 60-day expiry, refreshes within 7 days). #212 Mercury bank account APPROVED same day. #213 GCP budget alerts set at $25, $45, $50. **Commits (all staging→master via merge):** Facebook race condition fix, events.py SerpAPI fully removed, analytics_tracker rebuilt, discover_keywords.py fixes, Gemini _close_truncated_json() helper, safety gate WARN only, ClaudeClient.generate_with_search() added, platform_health + health_check full audit, publisher NoneType guard, SCALING_ISSUES.md (13 issues), script_generator Haiku + 429 retry, ai_clients staging key preference. **Issues Opened:** Facebook standalone test still needed (rate limit clearing). Meta app pages_manage_posts full review. Gemini fallback for script generation. Publisher result.error NoneType line 62. Spokane evening QA. Facebook token refresh cron not scheduled. Business Manager migration. Threads/Telegram/LinkedIn/Dailymotion accounts not started. DO backups + .env backup needed. **Issues Resolved:** Facebook race condition (is_transient 1363030). Publisher NoneType crash. Safety gate block regression. 5-level fetch chain confirmed working (Twin Falls evening 146.5s, 6 clips, QA 5/5). Gemini JSON truncation. Claude Level 2 crashes. TikTok fully stripped from platform_health. events.py SerpAPI removed. 429 quota crisis. Mercury bank. GCP alerts. **CEO Actions:** Submit Meta app for pages_manage_posts full review. Migrate city assets to Business Manager. Twin Falls Facebook token setup. DO backups. Store .env in password manager. Create Threads/Telegram/LinkedIn/Dailymotion accounts (TF + Dayton). HeyGen ~101 credits before Mar 23. **File:** /sessions/2026-03-08.md --- ## 2026-03-09 | Session: 08-09.03.26 Late Night — Memory Architecture + Bulletproofing Audit + Growth Strategy **Master HEAD:** 17f2ae2 (unchanged — no code commits) **Pipeline:** v7.5.0 LIVE **Topics:** memory/log server architecture planned, events cache killed, event truncation bug, auto growth strategy, 20-per-cluster confirmed, pipeline bulletproofing audit **Decisions:** #214 Events cache KILLED: same rationale as news cache. Past events showing in broadcasts. ClaudeEventsFetcher is primary live fetch every broadcast. #215 Memory architecture PLANNED: logs.localvoicenews.com static nginx server. INDEX.md + DECISIONS_LOG.md + OPEN_ISSUES.md + sessions/{date}.md + reference/ (symlink to GitHub). P9 indexes every session end. #216 20-per-cluster architecture confirmed: 500 channels ÷ 20 = 25 clusters, each with own server/Meta app/GCP/Anthropic key. Blast radius 4%. Cost $150/mo at scale. #217 7 platforms per channel confirmed: YouTube + Instagram + Facebook + Threads + Telegram + LinkedIn + Dailymotion. #218 Auto growth strategy: YouTube AI auto-replies, Facebook Group seeding on launch, cold start ads $5-10/city, AI-optimized titles. Growth curve: M1-3 = 50-200 followers/channel → M12+ = 2,000 avg × 200 cities = 400K total. #219 Pipeline bulletproofing audit: score ~6.2/10, target 9.5/10. DO backups DONE. .env in password manager DONE. **Commits:** None **Issues Opened:** Events date filter bug — past events slipping through to graphics (P3). Event name truncation mid-word in graphics (P5) — _truncate_to_sentence() needs word boundary logic. Events cache kill task (P3 next session). Cron watchdog + missed broadcast detection (P6). Playwright crash recovery (P5). Memory server deployment (P6 — full dedicated session). Historical log indexing (this session — complete). **Issues Resolved:** None (planning/audit session) **CEO Actions:** Bring all raw chat logs for memory indexing. Create Threads/Telegram/LinkedIn/Dailymotion for TF + Dayton. Submit Meta app pages_manage_posts review. **File:** /sessions/2026-03-09.md