| 1 | # Podcast Generation Execution Plan |
| 2 | |
| 3 | **Issue:** #310 |
| 4 | **Date:** 2026-06-07 |
| 5 | **Lead:** Leela |
| 6 | **Status:** Archived 2026-06-10 — remaining execution work is tracked by issue #355 and its linked issues; retained as reference. |
| 7 | **Companion PRD:** `docs/processed/PRD-podcast-generation.md` |
| 8 | |
| 9 | --- |
| 10 | |
| 11 | ## Recommendation Snapshot |
| 12 | |
| 13 | Build **SquadScope: Signal Check**, an 8-12 minute weekly two-host podcast generated from the published weekly article; automated MVP runs should target 8-10 minutes to honor the cost guardrail. Podcaster is a **sister product/tool**, not a SquadScope website feature, and the podcast is published to Spotify or another podcast platform. SquadScope's website MVP only exposes a configurable external link to the podcast/platform page once available. |
| 14 | |
| 15 | Select the TTS provider in Phase 2 after a listening-test POC comparing Azure Speech Standard, Azure Speech HD/OpenAI voices in Azure if available, and OpenAI `tts-1` or `gpt-4o-mini-tts`. Use Podcaster-owned Azure Blob Storage as temporary/staging artifact storage for generated MP3s, transcripts, manifests, and publishing packets, with retention and cleanup. Initial Spotify publishing is manual through an operator packet. Research whether Spotify supports podcast episode upload/publish automation before designing any automated publishing path. Keep only docs/contracts and harmless prototypes in SquadScope until the repository/project boundary is defined. |
| 16 | |
| 17 | Key references: Azure Speech TTS (https://learn.microsoft.com/en-us/azure/ai-services/speech-service/text-to-speech), Azure Blob Storage (https://learn.microsoft.com/en-us/azure/storage/blobs/storage-blobs-introduction), OpenAI TTS disclosure guidance (https://developers.openai.com/api/docs/guides/text-to-speech), FTC endorsement guidance (https://www.ftc.gov/business-guidance/resources/ftcs-endorsement-guides-what-people-are-asking). Spotify/API work must verify current Spotify for Creators and podcast delivery documentation; initial docs research suggests Spotify Web API is for streaming-service interactions such as metadata/playlists/playback, not clearly for episode upload. |
| 18 | |
| 19 | --- |
| 20 | |
| 21 | ## Guiding Constraints |
| 22 | |
| 23 | - Do not commit MP3s or generated audio binaries to git. |
| 24 | - Do not host the podcast in the SquadScope website for MVP. |
| 25 | - Website work is limited to a configurable external podcast/platform link. |
| 26 | - Zero impact on existing publishing: no changes to weekly crawl/analyze/generate/deploy behavior, no article-publish gating, no publish-manifest changes, and no audio steps in the critical path. |
| 27 | - Podcast failures must not block weekly article publishing. |
| 28 | - MVP generation must require Podcaster-owned review approval before TTS; a temporary in-repo prototype may use GitHub Environment `podcast-review`. |
| 29 | - Every substantive claim must be source-backed in a claim ledger. |
| 30 | - Disclose AI-generated voices in the first 60 seconds and in show notes/platform descriptions. |
| 31 | - Do not clone or mimic real people, Hard Fork hosts, NYT branding, segment names, jingles, or phrasing. |
| 32 | - Keep MVP to max 5 episodes/month, max $5/month total podcast spend unless manually raised, and max 10 minutes/episode. |
| 33 | - Azure Blob Storage is temporary staging with retention/cleanup, not final public hosting for MVP; Azure resources must be owned by Podcaster once implementation moves beyond prototype/docs. |
| 34 | - If an RSS feed is generated during MVP, it is for podcast-platform ingestion or future host/provider migration, not site-hosted consumption. |
| 35 | - Update privacy policy before any non-dry-run TTS provider call and before adding podcast analytics, payment providers, external players, or non-essential tracking. |
| 36 | - Define the repository/project boundary and Azure resource ownership before infrastructure code is written. |
| 37 | |
| 38 | --- |
| 39 | |
| 40 | ## Target Architecture |
| 41 | |
| 42 | ```text |
| 43 | SquadScope normal weekly publish completes unchanged |
| 44 | -> SquadScope emits stable post-publish article URL/content/artifact manifest, or operator provides it manually |
| 45 | -> Podcaster consumes that artifact/API/URL asynchronously |
| 46 | -> reject dry-run/candidate-only/restore/no-AI fallback replacement modes |
| 47 | -> Podcaster computes article hash and idempotency key |
| 48 | -> Podcaster derives claims from published article and validates against exported artifacts |
| 49 | -> Podcaster generates outline, script, show notes, transcript, publishing packet draft |
| 50 | -> Podcaster-owned review gate approves script package |
| 51 | -> selected TTS provider synthesis outside SquadScope critical path |
| 52 | -> ffmpeg normalize/transcode |
| 53 | -> upload MP3/transcript/manifest/packet to Podcaster-owned temporary Azure Blob staging |
| 54 | -> operator downloads/reviews publishing packet |
| 55 | -> operator manually publishes to Spotify or selected platform |
| 56 | -> record external episode URL and optionally update website external podcast link |
| 57 | ``` |
| 58 | |
| 59 | Idempotency key: |
| 60 | |
| 61 | ```text |
| 62 | week + article_hash + script_prompt_version + voice_config_hash |
| 63 | ``` |
| 64 | |
| 65 | --- |
| 66 | |
| 67 | ## Architecture Options and Recommendation |
| 68 | |
| 69 | | Option | Description | Pros | Cons | Recommendation | |
| 70 | | --- | --- | --- | --- | --- | |
| 71 | | Option A: temporary folder in this repo | Keep planning, contracts, sample artifacts, and possibly throwaway prototypes in SquadScope. | Fastest way to iterate on the article export contract. | Risk of accidental coupling to publishing; cannot own Azure resources or critical workflows. | Allow only for docs/prototypes that cannot affect publishing. | |
| 72 | | Option B: separate repo/project from the start | Create a `Podcaster` repo/project for implementation, tests, secrets, workflows, and releases. | Clean lifecycle and ownership; protects SquadScope publishing. | Requires setup before implementation. | Recommended before real implementation grows. | |
| 73 | | Option C: Azure-native project/resource group | Give Podcaster its own Azure resource group/subscription boundary, IaC, identities, budget alerts, and deployment lifecycle. | Best governance for Speech, Blob, costs, and secrets. | Requires infra design and ownership decisions. | Required before any Azure resource deployment. | |
| 74 | |
| 75 | **Selected path:** keep PRD, plan, and artifact/API contract documentation in SquadScope now. Move implementation to a separate **Podcaster** project/repo before Azure resource deployment. Use a temporary folder in this repo only for prototypes that are manually invoked, isolated from publish manifests, and unable to affect crawl/analyze/generate/deploy. |
| 76 | |
| 77 | --- |
| 78 | |
| 79 | ## Phase 0: Product and Contract Finalization |
| 80 | |
| 81 | **Goal:** Lock the separate-product contract and zero-impact boundary before implementation. |
| 82 | |
| 83 | ### Issues |
| 84 | |
| 85 | 1. **Define SquadScope export contract and podcast artifact schemas** |
| 86 | - SquadScope exports only stable post-publish data: week, article URL/path, article content or hash, source artifact references, run ID, publish mode, and optional artifact manifest. |
| 87 | - Podcaster owns `episode_manifest.json`, `claim_ledger.json`, `show_notes.md`, `transcript.md`, reviewed `script.md`, and `publishing_packet.md`. |
| 88 | - Include week, article URL, article hash, prompt version, voice config, provider, cost, duration, byte length, disclosure status, reviewer, temporary Blob staging path, retention expiry, external publish URL, and publish status. |
| 89 | - Acceptance: sample schema fixtures exist, document required/optional fields, and do not require changes to existing SquadScope publish manifests. |
| 90 | |
| 91 | 2. **Define repository/project boundary and Azure ownership gate** |
| 92 | - Decide whether implementation starts in a separate `Podcaster` repo/project or a temporary isolated folder for prototypes only. |
| 93 | - Decide Azure resource group/subscription, identities, Blob/Speech ownership, budget alerts, and deployment lifecycle before IaC or secrets are written. |
| 94 | - Acceptance: no infrastructure code, Azure deployment workflow, or production credential is added until this gate is resolved. |
| 95 | |
| 96 | 3. **Define editorial script prompt and style guide** |
| 97 | - Use `SquadScope: Signal Check` format. |
| 98 | - Segment order: cold open, The Signal, The Noise Check, The Gap, Receipts Round, Week Ahead, Outro. |
| 99 | - Host A Curator, Host B Skeptic. |
| 100 | - Acceptance: prompt requires citations, bans unsupported facts, bans copied podcast expression, and includes joke safety rules. |
| 101 | |
| 102 | 4. **Configure review gate for temporary prototype / Podcaster** |
| 103 | - Use required reviewers as the MVP review mechanism. |
| 104 | - A temporary SquadScope prototype or the separated Podcaster workflow uploads `script.md`, `claim_ledger.json`, `show_notes.md`, `transcript.md`, `publishing_packet.md`, and `episode_manifest.json` for inspection, then pauses before non-dry-run TTS. |
| 105 | - Acceptance: TTS cannot proceed without environment approval, and approval identity/time is recorded in the manifest. |
| 106 | |
| 107 | --- |
| 108 | |
| 109 | ## Phase 1: Script Dry Run and Publishing Packet, No Audio |
| 110 | |
| 111 | **Goal:** Prove articles can become safe, useful scripts and operator-ready publishing packets before adding TTS. |
| 112 | |
| 113 | ### Issues |
| 114 | |
| 115 | 5. **Implement claim/source extraction** |
| 116 | - Input: published weekly article plus SquadScope's exported URL/content/artifact manifest. |
| 117 | - Output: claim ledger derived from the published article, then validated against existing analysis/publish artifacts where available, with support status and source URLs. |
| 118 | - Acceptance: unsupported claims fail the gate or are marked for removal. |
| 119 | |
| 120 | 6. **Generate episode outline and script** |
| 121 | - Output 1,200-1,700 word two-host script. |
| 122 | - Include AI voice disclosure in first 60 seconds. |
| 123 | - Keep jokes aimed at hype cycles, not individuals. |
| 124 | - Acceptance: script passes length, segment, disclosure, and banned-phrase checks. |
| 125 | |
| 126 | 7. **Generate show notes, transcript, and manual publishing packet** |
| 127 | - Show notes include article link, source links, AI disclosure, corrections link, and sponsorship/support disclosure placeholder. |
| 128 | - Transcript is derived from final script. |
| 129 | - Publishing packet includes MP3 placeholder/path, title, description, transcript/show notes, disclosures, source article URL, corrections link, reviewer info, and post-publish fields. |
| 130 | - Acceptance: every source URL in the ledger appears in show notes or is intentionally excluded with reason; packet is sufficient for manual Spotify/platform publishing once audio exists. |
| 131 | |
| 132 | 8. **Add dry-run validation command** |
| 133 | - Validate ASCII filenames, required fields, claim support, disclosure, script length, packet completeness, and no fake sponsor language. |
| 134 | - Acceptance: command exits non-zero on missing ledger/support/disclosure/packet fields. |
| 135 | |
| 136 | --- |
| 137 | |
| 138 | ## Phase 2: TTS Proof of Concept |
| 139 | |
| 140 | **Goal:** Select the TTS provider using private reviewed samples before staging/publishing implementation. |
| 141 | |
| 142 | ### Issues |
| 143 | |
| 144 | 9. **Update privacy policy for TTS candidates before synthesis** |
| 145 | - Document candidate voice providers, data sent, retention/region if configurable, and operator-facing disclosure before any non-dry-run TTS call. |
| 146 | - Acceptance: privacy PR is merged before provider credentials are used for non-dry-run synthesis. |
| 147 | |
| 148 | 10. **Run TTS provider listening-test POC** |
| 149 | - Compare Azure Speech Standard neural voices, Azure Speech HD/OpenAI voices in Azure if available, and OpenAI `tts-1` or `gpt-4o-mini-tts`. |
| 150 | - Use the same reviewed sample script, record billable characters, latency, licensing/privacy notes, voice naturalness, pronunciation, SSML/control support, and estimated total monthly cost. |
| 151 | - Acceptance: provider decision is documented before production staging/publish-packet implementation; private MP3 artifacts are generated only after review approval and outside SquadScope's publishing critical path. |
| 152 | |
| 153 | 11. **Post-process audio with ffmpeg** |
| 154 | - Mono, 44.1 kHz, 64-96 kbps, `audio/mpeg`, target -16 LUFS, under 10 MB. |
| 155 | - Acceptance: validation reports duration, loudness, sample rate, bitrate, channels, and byte length. |
| 156 | |
| 157 | 12. **Add cost ledger and guardrails** |
| 158 | - Track per-episode and monthly TTS, temporary storage, script generation, validation, provider/platform costs, and any egress/download bandwidth if later introduced. |
| 159 | - Enforce max 5 episodes/month, max $5/month total podcast spend unless manually raised, max 10 minutes; call out that hosting/provider/egress costs may dominate if downloads grow. |
| 160 | - Acceptance: workflow fails before non-dry-run synthesis or publish-packet completion if limits would be exceeded. |
| 161 | |
| 162 | --- |
| 163 | |
| 164 | ## Phase 3: Temporary Staging and Manual Publish Readiness |
| 165 | |
| 166 | **Goal:** Produce validated audio and a complete manual publishing packet in Podcaster without making the website or SquadScope publishing flow the podcast host. |
| 167 | |
| 168 | ### Issues |
| 169 | |
| 170 | 13. **Provision Podcaster-owned Azure Blob Storage staging conventions** |
| 171 | - Example: `podcast-staging/YYYY/Www/squadscope-signal-check-YYYY-Www.mp3`. |
| 172 | - ASCII filenames only. |
| 173 | - Configure least-privilege workflow access, content type `audio/mpeg`, retention tags/metadata, and cleanup policy. |
| 174 | - Acceptance: uploaded MP3 is available to authorized operators for manual publish and has a documented expiry/cleanup path. |
| 175 | |
| 176 | 14. **Implement staging retention and cleanup** |
| 177 | - Delete or archive staging artifacts after successful platform publish, rejected review, or retention expiry. |
| 178 | - Keep manifest metadata needed for audit without retaining unnecessary audio forever. |
| 179 | - Acceptance: cleanup can run safely and records what was deleted or retained. |
| 180 | |
| 181 | 15. **Generate final manual Spotify/platform publishing packet** |
| 182 | - Include final MP3, title, description, transcript/show notes, AI disclosure, sponsor/affiliate/support disclosures if any, source article URL, corrections link, reviewer identity/time, and post-publish fields. |
| 183 | - Acceptance: an operator can publish using Spotify for Creators or the selected platform without reading workflow internals. |
| 184 | |
| 185 | 16. **Record external publish result** |
| 186 | - After manual publish, record external episode URL, platform/show URL, publish time, and any corrections/update notes in the manifest or issue comment. |
| 187 | - Acceptance: website link work has a reliable external target when launch is approved, without modifying article publish manifests or critical path behavior. |
| 188 | |
| 189 | --- |
| 190 | |
| 191 | ## Phase 4: Spotify/API and Podcast Host Research |
| 192 | |
| 193 | **Goal:** Determine whether publishing can be automated after the manual MVP. |
| 194 | |
| 195 | ### Issues |
| 196 | |
| 197 | 17. **Research Spotify upload/publish API support** |
| 198 | - Verify current Spotify for Creators, Spotify podcast delivery, and Spotify Web API docs. |
| 199 | - Caveat to test: initial docs research suggests Spotify Web API is for streaming-service interactions like metadata, playlists, playback, and library operations, not clearly podcast episode upload. |
| 200 | - Acceptance: documented yes/no answer with links, auth model, required accounts, limitations, and operational risk. |
| 201 | |
| 202 | 18. **Research fallback automation paths** |
| 203 | - If Spotify direct upload/publish is unavailable, evaluate podcast host/provider RSS APIs, provider-hosted distribution to Spotify, or a documented manual Spotify for Creators flow. |
| 204 | - Include privacy, retention, analytics, cost, corrections/rollback, and disclosure implications. |
| 205 | - Acceptance: recommendation chooses manual continuation, provider API, or future direct API with rationale. |
| 206 | |
| 207 | 19. **Decide whether any RSS is needed for MVP operations** |
| 208 | - If RSS is needed, scope it as platform/provider ingestion or future host migration only. |
| 209 | - Do not publish a SquadScope-site-owned feed for listener consumption as MVP. |
| 210 | - Acceptance: RSS decision explicitly states owner, consumer, URL strategy, and why it does not turn the website into the podcast host. |
| 211 | |
| 212 | --- |
| 213 | |
| 214 | ## Phase 5: Website External Link Only |
| 215 | |
| 216 | **Goal:** Make the external podcast discoverable with a simple website link only, without hosting it on SquadScope or changing article publishing. |
| 217 | |
| 218 | ### Issues |
| 219 | |
| 220 | 20. **Add configurable external podcast link** |
| 221 | - Link target can be Spotify show page or selected platform page. |
| 222 | - Link must be easy to disable until launch. |
| 223 | - Include concise AI/generated podcast disclosure if needed near the link or in methodology/privacy updates. |
| 224 | - Acceptance: site builds with link enabled/disabled and does not add an audio player, article embed, website-hosted player page, or site-owned listener feed; those website-hosted consumption patterns remain non-MVP/deferred. |
| 225 | |
| 226 | 21. **Update methodology and privacy pages** |
| 227 | - Methodology: explain article-to-podcast transformation, safety gates, manual/platform publishing, and correction path. |
| 228 | - Privacy: document selected voice provider, temporary Blob staging logs/retention, platform/provider links, analytics/payment providers if used. |
| 229 | - Acceptance: public docs match actual providers and data flows before launch. |
| 230 | |
| 231 | --- |
| 232 | |
| 233 | ## Phase 6: Launch Controls |
| 234 | |
| 235 | **Goal:** Enable reliable weekly operation with manual platform publishing while leaving SquadScope publishing unaffected. |
| 236 | |
| 237 | ### Issues |
| 238 | |
| 239 | 22. **Create post-publish handoff or Podcaster workflow** |
| 240 | - In SquadScope, any future workflow should only emit a post-publish event/artifact after confirmed normal publish, or be manually invoked for prototypes. |
| 241 | - The podcast generation workflow should live in Podcaster once separated and consume week, article path/URL, source run ID, publish mode, and artifact identifiers asynchronously. |
| 242 | - Do not naively use `workflow_run`; if used later, fetch and verify triggering run inputs/artifacts before synthesis. |
| 243 | - Dry-run, candidate-only, restore, failed, or no-AI fallback replacement runs must not synthesize audio. |
| 244 | - Must be non-blocking relative to `crawl-and-publish.yml` and must not change existing publish manifests. |
| 245 | - Acceptance: failed podcast run does not fail or roll back article publishing, and unsafe publish modes are rejected before TTS. |
| 246 | |
| 247 | 23. **Add Podcaster review gate** |
| 248 | - Require approval after script generation and before TTS; a temporary in-repo prototype may use GitHub Environment `podcast-review`, while separated Podcaster owns its equivalent gate. |
| 249 | - Reviewers inspect `script.md`, `claim_ledger.json`, `show_notes.md`, `transcript.md`, `publishing_packet.md`, and `episode_manifest.json`. |
| 250 | - Acceptance: unapproved scripts stop before synthesis. |
| 251 | |
| 252 | 24. **Add observability** |
| 253 | - Log episode key, provider, duration, cost estimate, byte length, staging path, retention expiry, validation results, and external publish URL when known. |
| 254 | - Do not log secrets or full provider credentials. |
| 255 | - Acceptance: operator can diagnose failures from workflow summary. |
| 256 | |
| 257 | 25. **Pilot launch with one back-catalog episode** |
| 258 | - Generate one recent weekly episode as a pilot. |
| 259 | - Publish manually to Spotify or selected platform after safety checks pass. |
| 260 | - Acceptance: reviewer signs off on audio quality, citations, disclosure, publishing packet, staging cleanup, and external episode URL. |
| 261 | |
| 262 | --- |
| 263 | |
| 264 | ## Phase 7: Quality and Monetization Experiments |
| 265 | |
| 266 | **Goal:** Improve quality and revenue only after trust and reliability. |
| 267 | |
| 268 | ### Issues |
| 269 | |
| 270 | 26. **Add licensed music/SFX later, if desired** |
| 271 | - MVP is voice-only. Select a licensed track/effect only in a later issue, and record license details in the episode manifest. |
| 272 | - Acceptance: no music/SFX ships until license, attribution/disclosure, loop/edit rules, and reviewer approval criteria are documented. |
| 273 | |
| 274 | 27. **Add support/donation links** |
| 275 | - GitHub Sponsors/Ko-fi/Patreon/PayPal/Stripe redirects only; do not store payment data. |
| 276 | - Website can link to support options once privacy and disclosure copy are updated. |
| 277 | - Acceptance: privacy page, website copy, and show notes make clear support does not influence coverage or rankings. |
| 278 | |
| 279 | 28. **Define sponsorship policy** |
| 280 | - FTC requires material connections to be disclosed clearly and conspicuously (https://www.ftc.gov/business-guidance/resources/ftcs-endorsement-guides-what-people-are-asking). |
| 281 | - Acceptance: sponsor copy template discloses before sponsor segment and forbids sponsor influence over rankings. |
| 282 | |
| 283 | 29. **Evaluate premium feed or dynamic ads** |
| 284 | - Defer until audience metrics justify complexity. |
| 285 | - Acceptance: privacy, consent, payment, provider, RSS/auth if applicable, and disclosure designs are approved before implementation. |
| 286 | |
| 287 | --- |
| 288 | |
| 289 | ## Existing Issue Mapping |
| 290 | |
| 291 | | Issue | Status | Role in corrected scope | |
| 292 | | --- | --- | --- | |
| 293 | | #301 Podcast: decide and enforce script human-review gate | Open | Keep; maps to `podcast-review` gate. | |
| 294 | | #302 Podcast: implement safe trigger handoff from weekly publish | Open | Amend; SquadScope may emit only a post-publish artifact/event, while generation belongs in Podcaster once separated. | |
| 295 | | #303 Podcast: add Hugo-safe episode embed shortcode | Closed | Closed as superseded by platform-podcast scope; no MVP embed. | |
| 296 | | #304 Podcast: update privacy policy before TTS provider use | Open | Keep; privacy-before-TTS and future platform/provider/payment disclosures. | |
| 297 | | #305 Podcast: decide Blob Storage public enclosure strategy | Open | Amend to staging/retention strategy; public enclosure is not MVP unless platform/provider path requires it. | |
| 298 | | #306 Podcast: run early TTS quality bakeoff | Open | Keep; Phase 2 provider listening-test POC. | |
| 299 | | #307 Podcast: add website link to external podcast only | Open | Keep; replaces site embed/player work. | |
| 300 | | #308 Podcast: research Spotify publishing API and automation path | Open | Keep; required before automated publishing. | |
| 301 | | #309 Podcast: generate weekly publishing packet after article publish | Open | Keep; manual Spotify/platform publishing packet. | |
| 302 | | #310 Correct podcast PRD scope: platform podcast, website link only | Open | This docs-only correction. | |
| 303 | |
| 304 | --- |
| 305 | |
| 306 | ## Implementation Issue Creation Gate |
| 307 | |
| 308 | Before implementation begins, create or update GitHub issues for every P0/P1 row below. This correction pass only amends docs; it does not need to create implementation issues. The P0/P1 set must include: repository/project boundary and Azure resource ownership before infrastructure code, Podcaster-owned review approval, safe post-publish artifact/event handoff, privacy-before-TTS sequencing, Phase 2 provider comparison, temporary Blob staging with retention/cleanup, manual publishing packet, Spotify/API research, website external-link-only integration, voice-only MVP/music licensing deferral, claim-ledger derivation/validation, and total podcast cost guardrails. |
| 309 | |
| 310 | ## Suggested Issue Breakdown |
| 311 | |
| 312 | | Priority | Issue | Issue title | Owner | Depends on | |
| 313 | | --- | --- | --- | --- | --- | |
| 314 | | P0 | #310 | Correct PRD/plan to platform podcast scope | Leela | User clarification | |
| 315 | | P0 | New/update | Define Podcaster repository/project boundary and Azure resource ownership | Leela/Bender | PRD approval | |
| 316 | | P0 | #301 | Decide and enforce Podcaster script human-review gate | Leela/Hermes | boundary gate | |
| 317 | | P0 | New/update | Define SquadScope export contract, podcast artifact schemas, idempotency key, and publishing packet contract | Leela/Bender | boundary gate | |
| 318 | | P0 | New/update | Define Signal Check editorial prompt and safety style guide | Farnsworth/Hermes | PRD approval | |
| 319 | | P0 | New/update | Implement claim ledger extraction and validation | Farnsworth/Fry | schemas | |
| 320 | | P0 | #309 | Generate dry-run scripts/show notes/transcripts and manual publishing packet | Farnsworth | prompt, ledger | |
| 321 | | P1 | #304 | Update privacy policy for TTS provider candidates | Hermes/Leela | prompt, ledger | |
| 322 | | P1 | #306 | Run TTS provider listening-test POC and select provider | Bender/Farnsworth | privacy update, review gate | |
| 323 | | P1 | #302 | Add safe post-publish artifact/event handoff or manual invocation | Hermes/Bender | export contract | |
| 324 | | P1 | New/update | Add ffmpeg audio validation and normalization | Bender/Fry | TTS POC | |
| 325 | | P1 | New/update | Add total podcast cost ledger and monthly guardrails | Hermes/Bender | TTS POC | |
| 326 | | P1 | #305 | Upload podcast assets to Podcaster-owned temporary Blob staging with retention/cleanup | Bender | boundary gate, audio validation | |
| 327 | | P1 | #308 | Research Spotify publish API and fallback provider/RSS/manual paths | Leela/Bender | PRD approval | |
| 328 | | P1 | #307 | Add configurable website link to external podcast/platform page | Bender | external show URL | |
| 329 | | P1 | New/update | Update methodology and privacy pages for podcast launch | Hermes/Leela | provider/platform choices | |
| 330 | | P2 | New/update | Pilot one back-catalog episode with manual Spotify/platform publish | Leela/Farnsworth | P1 complete | |
| 331 | | P2 | New/update | Add licensed music/SFX only after manifest license design | Farnsworth/Hermes | MVP pilot | |
| 332 | | P2 | New/update | Add support/donation links | Hermes | privacy update | |
| 333 | | P3 | New/update | Evaluate sponsorships, dynamic ads, premium feeds, or live events | Hermes/Leela | audience metrics | |
| 334 | |
| 335 | --- |
| 336 | |
| 337 | ## Phase Acceptance Criteria |
| 338 | |
| 339 | - Phase 0 is complete when the SquadScope export contract, Podcaster boundary, Azure ownership, schemas, prompts, review status, staging rules, and publishing packet contract are documented well enough for implementation without product ambiguity. |
| 340 | - Phase 1 is complete when a weekly article can produce a reviewed script, transcript, show notes, claim ledger, and manual publishing packet without audio synthesis. |
| 341 | - Phase 2 is complete when privacy docs are updated, reviewed sample scripts are synthesized privately across candidate providers, a listening-test decision selects the MVP provider, and output fits duration, size, loudness, and total cost limits. |
| 342 | - Phase 3 is complete when Podcaster-owned temporary Blob staging, retention, cleanup, and manual publish packet generation work for validated audio. |
| 343 | - Phase 4 is complete when Spotify/API research determines whether direct upload/publish automation exists and recommends manual, provider API, or future direct API path. |
| 344 | - Phase 5 is complete when the website can show or hide a configurable external podcast/platform link without hosting or embedding the podcast. |
| 345 | - Phase 6 is complete when Podcaster can generate a reviewed episode package from a post-publish artifact/API/URL or manual invocation, support manual platform publishing, record the external URL, and leave article publishing unaffected by podcast failures. |
| 346 | |
| 347 | ## Validation Checklist for First Public Episode |
| 348 | |
| 349 | - [ ] Script is 1,200-1,700 words and target duration fits the 8-12 minute format, with automated MVP output at or below 10 minutes. |
| 350 | - [ ] AI voice disclosure is in first 60 seconds and show notes/platform description. |
| 351 | - [ ] Claim ledger has no unsupported public claims. |
| 352 | - [ ] Podcaster review gate (or temporary prototype `podcast-review` environment) approved script artifacts before synthesis. |
| 353 | - [ ] Provider voice license/privacy terms are documented before non-dry-run TTS. |
| 354 | - [ ] No real-person voice cloning or protected podcast imitation. |
| 355 | - [ ] No fake sponsor language. |
| 356 | - [ ] No music/SFX in MVP unless a later licensed-track manifest issue is complete. |
| 357 | - [ ] Show notes include source URLs and corrections link. |
| 358 | - [ ] Publishing packet includes MP3, title, description, transcript/show notes, disclosures, source article URL, and corrections link. |
| 359 | - [ ] MP3 is mono, 44.1 kHz, 64-96 kbps, `audio/mpeg`, normalized near -16 LUFS, and under 10 MB. |
| 360 | - [ ] Audio is staged outside git in Podcaster-owned storage with retention and cleanup metadata. |
| 361 | - [ ] Manual Spotify/platform publishing path is documented for the operator. |
| 362 | - [ ] External episode URL is recorded after publish. |
| 363 | - [ ] Website, if updated, links only to the external podcast/platform page and does not host podcast consumption. |
| 364 | - [ ] Spotify/API automation remains unimplemented until research verifies support and a design is accepted. |
| 365 | - [ ] Total cost ledger is updated for TTS, staging storage, script generation, validation, platform/provider costs, and monthly guardrails pass. |
| 366 | - [ ] SquadScope weekly crawl/analyze/generate/deploy behavior, publish manifests, article gates, and deploy success criteria are unchanged. |
| 367 | - [ ] Repository/project boundary and Azure resource ownership are approved before any infrastructure code or production secret is added. |
| 368 | - [ ] Privacy and methodology pages match actual providers, storage, platform links, analytics, and support/payment options. |
| 369 | |
| 370 | --- |
| 371 | |
| 372 | ## Definition of Done for MVP |
| 373 | |
| 374 | The MVP is done when Podcaster consumes a confirmed normal weekly article's post-publish artifact/API/URL or a manual operator input and creates a reviewed, source-backed two-host episode; passes the Podcaster review gate; synthesizes it with the Phase 2-selected provider; stages validated MP3/transcript/show notes/manifests/publishing packet in Podcaster-owned Azure Blob Storage with retention/cleanup; enables an operator to manually publish to Spotify or the selected podcast platform; records the external episode URL; optionally exposes only a configurable website link to that external podcast/page; records total cost; and leaves SquadScope weekly article publishing behavior, manifests, deploys, and success criteria unchanged whether podcast generation succeeds, fails, or never runs. |