Disciplines · Runbooks

Launch Content Ingestion — Runbook

guided script (apps/oshun/bff/src/tara/sitting-scripts.ts), rendered as the sit player transcript.

5sections3 minread

On this page

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_verificationsstatus 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.