# Launch Content Ingestion — Runbook

Owner decision (2026-06-12): seed an initial launch editorial set where it can
be done honestly in-repo, and leave clearly scoped slots for the content that
requires recording or editorial verification. This runbook is the map of those
slots — what each pipeline needs, where it lands, and which gates apply.

## Already seeded in-repo (honest, shipped)

- **Tara sitting scripts** — every Sitting Path session carries its own original
  guided script (`apps/oshun/bff/src/tara/sitting-scripts.ts`), rendered as the
  sit player transcript. Domain tests assert per-sitting scripts exist, are
  non-trivial, and match their themes.
- **Nisaba corpus** — public-domain passages with public-domain translations
  (`apps/oshun/bff/src/nisaba/state.ts`); extend with the same constraints:
  source text must be public domain AND the specific translation must be public
  domain (e.g. Legge 1891, Müller 1881, Long 1862).
- **Veritas taxonomy** — 10 categories, 16 topics, 5 real source profiles seeded
  via `libs/veritas/database/src/seed.ts` (no articles — see below).
- **Metis curated courses** — three cross-domain courses
  (`apps/oshun/bff/src/metis/room.ts`, `CURATED_COURSES`).

## Slot 1 — Veritas verified leads (editorial + verification ops)

The pipeline is live end-to-end; only content is missing. The home briefing and
the Veritas hub render their honest-empty registers until a published,
fact-checked article exists.

- **Where**: the `veritas` Postgres DB (67-table Prisma schema,
  `libs/veritas/database`). Dev bootstrap: see the header of
  `scripts/dev/run-v1-domain-services.mjs`.
- **Minimum ingestion unit** for a lead to clear the home briefing:
  1. `articles` row — `status='published'`, `published_at`, `summary`,
     `content_type`, `source_id` (must reference a real `sources` row), category
     link in `article_categories`, topics in `article_topics`.
  2. `claims` rows + `article_claims` links.
  3. `claim_verifications` — `status` must be a real `FactCheckOverallStatus`
     verdict, with `claim_evidence` rows carrying the source URLs the verdict
     rests on.
  4. `article_fact_checks` — the article-level `overall_status`.
- **Gates that are NOT optional**: the facade passes verdicts through verbatim
  and reads source credibility only from recorded assessments
  (`sources.metadata.credibilityTier/credibilityScore`) — never invent either.
  An article without claim verification renders without a verdict; the home
  briefing only promotes leads that clear grounding.
- **Serving**: no deploy step needed — the `/v1/oshun/*` facade
  (`apps/veritas/api/.../oshun-facade.ts`) serves whatever the tables hold.

## Slot 2 — Tara recorded audio (recording ops)

The player is built audio-first but honest: it fetches
`GET /v1/tara/sessions/:id/ambient.wav` (bearer-authenticated, looped ambient
bed) and discloses when audio is unavailable. Narration recordings do not exist
yet; the per-sitting scripts above are the narration source texts.

- **To ship narration**: record each of the 12 scripts (voice talent per the
  original personas policy — no real-teacher voice cloning), then extend the
  audio route family alongside `ambient.wav` and bind the player's track list.
  The scripts are the canonical narration copy; do not improvise content drift
  between script and recording (the transcript toggle shows the script
  verbatim).
- **Formats**: the dev route serves WAV; production should serve the same route
  shape from object storage (MinIO locally) with range support.

## Slot 3 — Push + LLM provider credentials (deploy ops)

- Push delivery needs APNs/FCM credentials and real device tokens (mobile
  registration dedup is fixed; ids persist via expo-secure-store).
- Assistant free-text reply depth needs the `OSHUN_LLM_API_BASE` /
  `OSHUN_LLM_API_KEY` / `OSHUN_LLM_MODEL` triple (fail-closed gate, shared with
  Sophia's synthesizer). Same pattern for verification email transport:
  `OSHUN_MESSAGING_EMAIL_FROM` + `OSHUN_WEB_BASE_URL` + `OSHUN_SMTP_HOST`
  (Mailpit locally) or `OSHUN_SENDGRID_API_KEY`.

## What must never happen

Per the repo's zero-tolerance policy: no fabricated articles, no invented
verdicts or credibility tiers, no synthetic "verified" states, no narration
attributed to real teachers. Every surface already renders an honest empty
register — absence is always the correct fallback.
