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
veritasPostgres DB (67-table Prisma schema,libs/veritas/database). Dev bootstrap: see the header ofscripts/dev/run-v1-domain-services.mjs. - Minimum ingestion unit for a lead to clear the home briefing:
articlesrow —status='published',published_at,summary,content_type,source_id(must reference a realsourcesrow), category link inarticle_categories, topics inarticle_topics.claimsrows +article_claimslinks.claim_verifications—statusmust be a realFactCheckOverallStatusverdict, withclaim_evidencerows carrying the source URLs the verdict rests on.article_fact_checks— the article-leveloverall_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.wavand 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_MODELtriple (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) orOSHUN_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.