V1 Web PWA · Conventions

Journeys

Conventions and reading guide for the V1 Web PWA walkthrough.

4sections13 minread13tables

On this page

End-to-end multi-view flows for the Oshun V1 PWA. Per-view checklists verify that each view individually works; journeys catch the bugs that hide between views — broken bridges, role-transition gaps, state that doesn't persist across a navigation, audit trails that miss a step.

Read ../00-conventions.md for the file shape and the walking discipline. Every journey opens with # Journey: <name> (no frontmatter) and follows: Personas → Pre-conditions → numbered Steps → Post-conditions → Failure modes → E2E coverage → Per-view files touched → Cross-references → Open questions.

This index lists all 58 V1 PWA journeys. The six admin-app journeys live in the separate Admin journey index, bringing the Docs Center registry total to 64.

When to walk a journey#

  • Before a release — walk the journeys whose pre-conditions match the surfaces you're shipping. The per-view files won't catch a broken handoff; the journey will.
  • After a structural change — middleware rewrite, auth refactor, SW cache version bump, BFF route move. Walk the journeys that touch the affected substrate.
  • When a customer reports something weird — find the journey that describes their flow; the failure mode is probably already listed there.

Bucket map#

First-time and PWA infrastructure (6)#

Journey What it walks
first-time-anonymous-visitor.md Anonymous browser visit → landing → welcome → sign-up → verify → 10-step onboarding → first home. Catches public-surface gates and SEO.
first-tara-sit.md First-time user's very first Tara sit. Home rail → hub → Begin → mid-sit → completion → reflection. Walkable end-to-end (2026-05-26) — TaraRoom Begin links to /tara/sit/[id]; TaraSitPlayer ships timer/transcript/reflection.
install-as-pwa.md Browser visit → install eligibility → A2HS / native prompt → cold start → relaunch target → offline → reconnect → SW update → push → sign-out.
offline-first-time-use.md Newly-installed PWA, network drops mid-session. Banner → cached read → queued write → reconnect → sync.
pwa-update-flow.md SW waiting detected → PwaUpdatePromptOSHUN_SKIP_WAITINGcontrollerchange reload → old caches purged.
onboarding-ten-steps.md /welcome mode tabs → 10-step onboarding wizard (lineage / pace / sensitivities / accessibility / memory) → patchProfilePreferencesresolveFirstRunEntryTarget → first home with OnboardingResumeBanner. Distinct from the omnibus first-visit walk.

Customer-domain entries (6, one per V1 domain)#

Journey What it walks
tara-daily-ritual.md Home rail continuation → Tara → today's sit → complete → reflection → return.
arete-create-habit.md New habit creation flow. Goal → plan → habit setup → first check-in → streak begins.
veritas-evidence-trail.md Story → claim → evidence sources → counterclaim → save to library. Sophia citation flow embedded.
nyx-tonight-observation.md Tonight's sky event → detail → observation log entry.
nisaba-scholarly-read.md Real search opens an Epictetus passage in the live workspace; the compact daily Dhammapada room and static Marcus Aurelius lanes remain separate, while the room retains a mismatched save id and no joined notebook/plan completion record.
metis-lesson-completion.md Course pick → lesson → assessment → tutor question → results.

Customer-domain follow-ons (5)#

Journey What it walks
arete-living-offering-create.md /arete/offering intent → Lilith crisis pre-screen → coach scoring (CBT/ACT/Stoic/Reflective) → keep → optional share. Uses real POST /v1/arete/coach/responses.
weekly-review-arete.md Sunday push/reminder → /arete/review four acts (look back / acknowledge / pivot / commit) → KPIs + journal → continuity card → next-week plan.
veritas-retraction-cascade-customer-view.md Editorial retract → cascade fan-out → veritas-retraction banner on story → saved-claim banner → notebook drill-down → kept-Living-Offering banner. Customer side of editorial-review-approval.md.
metis-byom-ingest-to-course.md Tenant teacher uploads BYOM → safety scan → Sophia ingestion → KG anchor → tenant teacher approval gate → published CourseBuild appears inline in /metis (the MetisSchoolroom course list — /metis/courses is not a route; only /metis/courses/new exists).
psyche-tutor-live-session-to-graded-record.md /metis/tutor → Psyche real-time envelope → transcript auto-persists → Iris memory bridge → adaptive-loop mastery update → optional operator-metis review lane → optional Nisaba scholarly handoff. Distinct from metis-lesson-completion (quiz/assessment path).

Discovery, messages, library (7)#

Journey What it walks
messages-center-deliver-and-unsubscribe.md Message arrives via channel adapter → /messages inbox → deep-link to artifact → delivery receipt → unsubscribe per channel × category.
messages-quiet-hours-and-channel-binding.md Bind a channel (Telegram / WhatsApp / SMS / email) → consent → quiet-hours setup → Lilith persona-policy gate → first delivery respecting quiet hours.
telegram-bot-assistant-delivery.md Bound Telegram user sends text or voice note to the bot → BFF webhook → Sophia-grounded composer → reply with disclosure footer + optional TTS audio. Delivery-side counterpart to messages-quiet-hours-and-channel-binding.md.
library-save-collection-share.md In-domain Save → /library → create collection → multi-item add → share collection with permissions (private / link-with-key / public).
search-explore-deep-read-library-save.md /search query → filter facets → deep-read view → save to library → continue across devices (overlaps with multi-device-workspace-handoff.md).
nyx-event-calendar-sync-reminder.md Dynamic agenda feed, fixed rich detail, action preferences, durable member reminders, provider export, opt-in worker, service-worker tap, and observation are separate authorities. No joined detail-action → reminder → event-open → observation receipt exists. Complements nyx-tonight-observation.md.
nisaba-notebook-capture-and-cite.md Legacy reading durably associates annotations with BFF notebook items, while Studio separately authors Nisaba-native Postgres notebooks/cards and study-trail exports; local notes, client citations, silent fixtures, and the id-ignoring specimen remain other authorities. Complements nisaba-scholarly-read.md.

Cross-domain bridges (4)#

Journey What it walks
tara-to-nisaba-handoff.md Tara sit completion → contemplative reading hand-off to Nisaba. Bridge: buildTaraNisabaPassageCompanion + NisabaPassageCompanionCard.
nyx-to-tara-bridge.md Fixed Nyx event → static content relationship → Tara timer → generic Nyx suggestion. The hub cue is dormant; event identity, audio, emitted telemetry, member policy, durable completion, and exact return are not joined.
veritas-to-nisaba-deeper.md Veritas grounded story → claim's primary source → Nisaba scholarly passage / commentary. Bridge: resolveVeritasNisabaClaimRelationship, buildNisabaSourceLineageHref.
arete-streak-recovery.md Broken Arete streak → humane recovery copy → resumption. Tests Lilith tone policy as applied to Arete.

Lilith policy (1)#

Journey What it walks
crisis-aware-tone-policy.md User input expresses distress → Lilith substrate intercepts → safety surface → escalation. Includes false-positive, missed-true, and recovery failure modes.

Account, billing, identity (4)#

Journey What it walks
account-deletion-and-dsar.md /profile → DSAR/export request → identity verification → tombstone fan-out across domains → audit attestation → receipt. Covers GDPR right-to-deletion.
memory-edit-pause-forget.md /profile/memory → review entries → edit → conflict prompt → pause (off-the-record) → forget with step-up auth → 7-day grace. Iris memory UX per features.md.
sign-up-and-pay-crypto.md /welcome sign-up → entitlement gate → /billing/crypto invoice → fiat-rate lock → settlement → payment.invoice.confirmed event → entitlement grant. Crypto payments + Aje bridge state machine.
aaa-upgrade-entitlement-bounce.md Customer hits AAA-only surface → middleware redirects to /aaa-upgrade → "Continue in Yemaya AAA Studio" → cross-app landing. AAA tier gating via proxy.ts + studio-boundary.ts.

Scene + atelier authoring (7)#

Journey What it walks
scene-keep-and-share.md Living Scene completion → keep (private) → opt-in share → privacy level (private link / password / public) → /scene/<id> viewer → embed code → revoke. Uses LivingScene unlock-token cookie (P1.3 / P3).
public-scene-abuse-report.md Anonymous viewer at /scene/<id> → "Report" link → /scene/<id>/report form → Lilith review queue → operator triage. Read-side counterpart for unauthenticated visitors.
scene-public-viewer-anonymous.md /scene/<id> consumption by an anonymous visitor: password gate, OG preview, accessibility chrome, captions/transcript, watermark, retire-status fall-through.
atelier-image-to-library.md /atelier index → pick image room → generate → "Save plate to notebook" → library appearance with provenance.
atelier-video-render-queue.md /atelier/video → inspect twelve storyboard shots → verify sh 06 render progress and queued shots → confirm Cut timeline remains an honest placeholder.
atelier-motion-to-cinematheque.md /atelier/motion → inspect rigged stage/timeline/bake/takes → placeholder draft actions stay disabled → "Open in Cinematheque" routes to /atelier/video.
lilith-studio-tara-scene-publish.md /lilith-studio → scene editor → zone placement → simulate → accessibility checks → publish through editorial release branch → consumer sees the new scene on /tara.

Agentic pipelines (1)#

Journey What it walks
agentic-pipeline-customer-invocation.md Single template walking any of the six Cross-Domain Autonomous Pipelines (veritas.story_drafting, metis.course_from_byom, tara.seasonal_program, nyx.event_explainer_set, arete.weekly_review_draft, nisaba.edition_study_guide) end-to-end. Includes per-pipeline variants table.

Assistant, operator, tenant — extended (7)#

Journey What it walks
assistant-handoff-context-carry.md Assistant dock invocation from any domain → assistant panel → context handoff (current view, recent reads/sits, persona) → cross-domain persona switch → Iris memory recall → disclosure rendering.
tenant-bulk-member-invite-scim.md /operator/tenant → Export CSV / Invite / "+ Add member" / SCIM 2.0 batch → identity-provider provision callback → role assignment defaults → per-invitee first-login. Bulk path, distinct from per-member tenant-onboard.
tenant-bulk-operations-export.md Platform operator drafts, validates, dry-runs, stages, and commits a tenant users bulk operation; generates and verifies bulk export manifests; and checks audit/search read-back.
tenant-integrations-api-keys-webhooks.md Tenant/operator integration admin creates, rotates, and revokes API keys; uses one against a scoped tenant resource; creates signed webhook subscriptions; fires sandbox simulator deliveries; and verifies audit/search read-back.
tenant-oneroster-roster-sync.md Tenant operator dry-runs OneRoster users/enrollments, inspects the operator diff table, commits a conflict-free import, reconciles a periodic SIS pull, and verifies roster summaries.
tenant-sso-config-saml-oidc-claim-mapping.md Tenant admin uploads SAML metadata XML / OIDC discovery URL → maps external claims onto tenant role templates → sets MFA / IP allowlist / device-posture policy → test sign-in → enable. Setup-side of tenant-bulk-member-invite-scim Step 5 (consumption-side).
tenant-audit-log-investigation.md Operator opens /operator/admin audit explorer → filter audit events (editorial.* / incident.* / drift.* / tenant.* / flag.*) → save investigation → add notes → export bundle with chain-of-custody hash.

Operator + studio + cross-surface (8)#

Journey What it walks
editorial-review-approval.md Author submits → operator-studio review queue → approve / request changes → publish → audit. Studio authoring + operator surface.
incident-triage.md Auto-INC fires → admin inbox → operator triages → resolves → audit.
citation-drift-resolution.md Citation drift detected on artifact → INC routes → Isis provenance inspector → hash chain checked → resolve.
tenant-onboard.md Tenant admin invites member → SCIM provision → role assignment → first-login → first-action. Multi-surface (operator → email → customer → operator).
user-flag-to-review.md Customer flags content → routed to admin inbox → operator action → user notified. The first-pass flag affordance now ships on Veritas / Nisaba / Tara surfaces and browser E2E reads the submitted live report back from the admin moderation queue; operator decision + reporter notification remain open.
sophia-grounded-answer.md Query needing citations → Sophia composes answer with citation trail → user verifies sources → optional pin.
themis-assessment-appeal.md Student receives assessment verdict with Themis academic-integrity flag → opens appeal with rationale + evidence → tenant teacher reviews in /operator/metis → override / upheld → student notified → audit chain captures full lifecycle.
persona-voice-avatar-approval-workflow.md Creator proposes new persona (role + lineage + voice profile + avatar pack) in /lilith-studio/personas → Lilith quality eval → voice-quality + avatar reviewer checks → operator-studio publish gate → deployed to session-selection → eventual deprecation / supersession.

Platform integrations (1)#

Journey What it walks
lms-connectors-operator.md Operator lists, validates, creates, overrides, and removes LMS connectors; verifies LTI launch boundaries, capability health, source precedence, and fail-closed provider behavior.

Workspace shell (1)#

Journey What it walks
multi-device-workspace-handoff.md Desktop researcher captures a six-item Iris packet, stores one latest per-user BFF record, and can expose it on native Home. Current return stops at an assistant prompt; responsive browser restoration, fixture Library, device inventory, and profile sync are separate evidence.

Cross-cutting findings from the journey sweep#

These findings came from tracing multi-view paths rather than reading each route in isolation. Their status below is reconciled against the current source.

  1. The historic ghost-button sweep is nearly closed. Tara start actions; Arete ritual, coach, and navigation actions; Veritas save/source/share actions; Nyx event and cross-domain links; Nisaba save, speech, citation, and navigation actions; Metis quiz, assessment, course, citation, and composer actions; Trust & Safety reporting; studio review decisions; Admin inbox filtering and row selection; tenant export/invite/member actions; and Nyx event persistence now have concrete handlers or links. The remaining known inert controls are Not now, Tell me more, and Apply for one week in the deeper Arete coaching letter (components/lilith/arete.tsx). Relevant journey failure-mode sections carry the exact open checks.
  2. user-flag-to-review cannot be walked at all. Resolved. A TrustSafetyFlagButton flag affordance now ships on Tara (TaraSitPlayer.tsx:320), Veritas (VeritasArticleActions.tsx:115, VeritasClaimDetailWorkspace.tsx), and Nisaba (NisabaPassageActions.tsx:109), and the BFF exposes POST /v1/user-reports (apps/oshun/bff/src/routes/user-reports.ts:107). The intake-to-admin-queue segment is now walkable and verified against the moderation workspace; see shell/07-trust-safety.md.
  3. Lilith crisis substrate is intentionally not a single route. The substrate lives in libs/oshun/persona-policy-lilith/src/crisis-recovery/ (incident-record, stillness-window, reentry-flow, reframe-protection, locales, check-ins) and is wired through each Lilith-using surface; the safety surface mounts in-place on the active surface. User-facing audit lives at /profile/safety. A dedicated /lilith/crisis route would conflict with the cascade design.
  4. LCustomerNav active inconsistency in Veritas. Resolved — both the hub (rooms.tsx#VeritasRoom) and the depth views in components/lilith/veritas.tsx now mount LCustomerNav active="library". The earlier "Hub mounts explore; depth mounts library" claim was stale by the time the journey sweep landed.
  5. Polished vs internal namespace drift carries between views. /arete reads getArete() fixture; /domains/arete/habits reads sampleHabits. Habits created in one are invisible in the other. Same dual-fixture pattern in Tara, Nyx, Veritas. Affects how journeys land after navigation.
  6. Display specimens posing as live editors. /nisaba/notebook claims "last edit, 11 min ago" without an edit affordance. The former /metis/lesson quiz specimen and /metis/assessment blinking-cursor answer specimen have shipped as real interactive components; the Metis journey docs track their remaining product gaps separately.
  7. Operator audit trail is the universal stamp. Every operator journey writes to apps/oshun/bff/src/routes/admin-audit-log.ts (routes /admin/audit-log/events and /admin/audit-log/investigations). Audit-event taxonomies are documented per journey: editorial.*, incident.*, drift.*, tenant.*, flag.*.
  8. One previously grouped BFF gap remains. The tenant invitation and T&S report writes now ship at POST /v1/admin/tenant-console/members/invite and POST /v1/user-reports; the author-side editorial submit route remains a documented journey gap. (The SCIM 2.0 endpoint also ships — /v1/scim/v2/Users in apps/oshun/bff/src/routes/domain-stubs.ts: GET list, GET /:id, POST, PATCH /:id, DELETE tombstone; no PUT.)
  9. Recommendation engine BFF target undocumented. The recommendation engine surfaces in cross-domain bridges (Tara → Nisaba, Nyx → Tara) but the BFF endpoint is referenced only obliquely (apps/oshun/bff/src/recommendations/). Each cross-domain journey flags this.

Adding a new journey#

  1. Pick a flow that traverses ≥ 2 views and has a clear pre-condition and post-condition.
  2. Confirm every view it touches has a per-view walkthrough; if not, write those first.
  3. Copy install-as-pwa.md as a starting shape.
  4. Ground every step in real component / route / contract names from the per-view files. Don't invent.
  5. Use ls to confirm every per-view link target exists before committing.
  6. Add the new entry to the bucket map above with a one-line summary.