# Falah Cast Episode 19 — Published **Live:** https://iqra.falahos.my/ibn-khaldun-and-the-muqaddimah-the-science-of-empires/ Published 2026-09-24 via manual end-to-end pipeline test (no cloud routine, run directly from this machine since the cloud environment egress block is still unresolved): 1. Script written by Notion AI's Content Studio Custom Agent (see `falahcast-e19-muqaddimah.md` in this repo for the raw script). 2. Audio generated locally via `edge-tts` (`pip3 install edge-tts`), voice `en-US-AriaNeural` — matches the host voice used in all prior Falah Cast episodes (confirmed from `philosophy_series.json`'s `"voice": "en-US-AriaNeural"` field). 3. Uploaded to Ghost via `POST /ghost/api/admin/media/upload/` (multipart, `purpose=media`) → returned hosted URL. 4. Post created via `POST /ghost/api/admin/posts/` with a `lexical` body matching the exact structure of prior episodes (an `audio` node + a short intro paragraph), tagged Falah Cast / Podcast / Ibn Khaldun / Islamic Philosophy. **Notable:** no dedicated Odysseus or Hermes TTS tool was available in this session's MCP connectors — checked both, neither exposed one. `edge-tts` (free, local, matches established voice) was the practical choice over Higgsfield's paid TTS engines, which would have introduced a different, inconsistent host voice. This proves the full content pipeline works end-to-end when not blocked by network policy. Once the "Falah" cloud environment's egress allow-list is actually fixed (see gumroad-file-hosting-gotcha.md and prior session notes), this flow is a candidate for a scheduled routine. ## Episode 20 — Rumi's Masnavi **Live:** https://iqra.falahos.my/rumis-masnavi-the-reeds-cry-and-the-logic-of-the-heart/ Same pipeline as episode 19. Note: first `curl` publish attempt appeared to fail with a local JSON-parse error (caused by mixing `-w` status output into the same stream as the response body) but had actually succeeded server-side — retrying created a duplicate post (`-2` slug). Caught by checking `filter=slug:~'masnavi'` and deleted the duplicate via `DELETE /ghost/api/admin/posts/{id}/` (204 confirmed). Lesson: always write API response bodies to a separate file/variable from status-code output before parsing, and check for existing posts before assuming a "failed" call didn't actually go through. ## Episode 21 — Sejarah Melayu (Malay Annals) **Live:** https://iqra.falahos.my/sejarah-melayu-memory-daulat-and-how-a-people-tells-its-story/ Same pipeline. Also this session (2026-09-25): investigated the episode numbering duplication flagged earlier — root cause found in the campaign repo's commit history: episodes 11-18 exactly repeat the topics of episodes 2-8, in order, offset by 9 (e11=e02's topic, e13=e03's, ..., e18=e08's), with only e09/e10/e12 being genuinely new. This points to a topic-cycling/wraparound bug in the old `daily-cron.py`/`content-engine.py` pipeline. No fix needed/attempted — that pipeline is confirmed dormant (not scheduled anywhere on this Mac, per earlier pi diagnostic), and the current manual Notion-AI-driven episodes (19+) draw from never-used book-repo topics, sidestepping the bug entirely. Also: wired the researched 30-day topic calendar directly into the Iqra Times Daily Article routine (trig_01NjWBVBaDrtBbCU6mMq8xgf) — it now works through the fixed list in order (tracking position via the "Islamic Tech" Ghost tag) instead of self-picking topics each run. And: archived two empty/stale Gitea repos found in the earlier infra sweep (`wmj/mautic-mcp-server`, `wmj/ihya-migration-test`) via `PATCH /api/v1/repos/{owner}/{repo}` with `{"archived": true}` — reversible, non-destructive. `falah-mobile`'s earlier "partial API response" flag turned out to be a non-issue on re-check (69KB, healthy).