Cosmic Story v2-arkitektur — en dyptgående gjennomgang.

For ingeniører, PM-er, journalister og partnerskapsspeidere. Hele pipelinen, fire MongoDB-samlinger, EDA-hendelser, V-Model-grundighet, ytelsesmål, sikkerhet og tilgjengelighet — alt på én side.

  • Soulwise-story er en ny NestJS-modul sammen med den eksisterende cosmic-story-modulen. Null direkte import mellom funksjonsmoduler.
  • Fire MongoDB-samlinger: soulwise_persons, soulwise_chapters, soulwise_journal_entries, soulwise_resonances. AES-256-krypterte tekstblokker, indeksert for spørringene hver av dem betjener.
  • Asynkron generering via BullMQ-kø med 28 s tidsavbrudd. Hendelser sendes via EventEmitter2 bare etter database-commit — ingen fantom-innbokselementer.
  • V-Model-spesifikasjon: 119 krav, null hull. Mål for backend-dekning 85 % setningsdekning på tjenester; frontend 90 % på Pinia-lagre.

Pipelinen, igjen, med ingeniørdetaljer

Hvert steg har en tjeneste, en kontrakt og en hendelse.

  1. Utløser

    En brukerhandling – «generer dagens kapittel for Sister» – eller en planlagt cron, som søndagens oppsummering 9, eller væroppdateringen hver 6. time.

  2. Jobben legges i en BullMQ‑kø kalt soulwise-chapter-generation, med et hardt 28‑sekunders tidsavbrudd. Langvarige jobber blir avbrutt og rapportert som «prøv igjen» til brukeren.

  3. Skriv

    ChapterGenerationService samler den fire‑faktor‑prompten — personkontekst, astrologi, signal, takt — til ett enkelt input. Ingen rå bruker‑PII legges inn i prompten ordrett; alt blir renset først.

  4. Generer

    En AI‑leverandør kalles via AI_GENERATION_ADAPTER‑symboltoken — leverandøren er utskiftbar. Responsen sjekkes for lengde, form og sikkerhet før du fortsetter.

  5. Etterbehandling

    Fire ting skjer: en krise‑klassifiserer sjekker etter krisespråk; en aspekt‑chip‑uttrekker henter én til tre astrologi‑chips; et anti‑krav‑filter fjerner forbudte formuleringer; innholdet er AES-256‑kryptert med en plattformstyrt nøkkel.

  6. Lagre

    Artefaktet skrives til riktig MongoDB-samling — kapitler, dagbokoppføringer, resonanser — med userId- og personId-indekser for raske oppslag. Myk sletting først; hard sletting av PII etter 30 dager.

  7. Varsle

    En EventEmitter2‑hendelse — CHAPTER_COMPLETED, JOURNAL_CREATED — utløses etter at databasen er skrevet. Varslingsmodulen plukker den opp, lager et innboks‑element, og sender eventuelt en push (maks én per dag, stille timer respektert).

  8. Overflate

    Frontend henter artefakten via et autentisert API‑kall. Hubben gjengir på nytt med det nye innholdet. Hvis brukeren var offline, leverer cachen gårsdagens visning, og den nye artefakten vises ved gjenkobling.

Syv trinn fra utløsning til overflate, hver med et navn som beskriver hva den faktisk gjør.

De fire samlingene

Indeksert for spørringene hver enkelt besvarer.

soulwise_persons

Albumoppføringer. Indekser på userId, status, deletedAt. Myk sletting først; hard sletting av PII etter 30 dager.

soulwise_chapters

AI-skrevne kapitler, kryptert innhold. Indekser på personId, userId, generatedAt. Aspekt-chips lagret som en separat array for rask filtrering.

soulwise_journal_entries

Bruker-skrevne refleksjoner, kryptert innhold. Indekser på userId, personId, createdAt. Tekst-indeksert innhold for søk. Per-innlegg 'privat — ikke del med Luminara'-flagg.

soulwise_resonances

Fire-dimensjons poeng per bånd. Unik indeks på personId. Beregnet på nytt via tjenestekall etter kapittel- eller dagbokskrivning.

EDA-hendelser

Streng regel: hendelser utløses bare etter database-commit. Avhengigheter mellom moduler via Symbol-injeksjonstokene, aldri via forwardRef. Ingen direkte import av tjenester mellom funksjonsmoduler.

  • SoulwiseEvents.CHAPTER_COMPLETED — SoulwiseEvents.CHAPTER_COMPLETED — utløst etter at et kapittel er kryptert og lagret. Notifications-v2 lytter; oppretter innboks-element; sender eventuelt push-varsel.
  • SoulwiseEvents.JOURNAL_CREATED — SoulwiseEvents.JOURNAL_CREATED — utløst etter at et dagbokinnlegg er kryptert og lagret. Resonansetjenesten lytter; utløser omberegning.
  • SoulwiseEvents.PERSON_BIRTH_UPDATED — SoulwiseEvents.PERSON_BIRTH_UPDATED — utløses etter at en persons fødselsdata har blitt endret. Synastri-cachen invalideres.
  • SoulwiseEvents.PUSH_REQUESTED — SoulwiseEvents.PUSH_REQUESTED — per notifications-v2 kontrakt; respekterer push-budsjett og stille timer.

V-Modell spesifikasjonsrigor

119 sporbare krav, null gap. Hvert krav kartlegger fremover til et testfall (UTP, ITP, STP, E2E) og bakover til en brukerhistorie. 20 brukerhistorier. 15 funksjonelle krav. 12 ikke-funksjonelle kategorier. 8 globale akseptanseporter.

Ytelseskontrakt

Kapittelgenerering 30 sekunder eller bedre for 95% av forespørslene, målt mot BullMQs fordeling av jobbvarighet. API p99 GET-latens 500 ms eller bedre ved 1,000 samtidige brukere, målt via k6-lasttest. Frontend TTI 3 sekunder eller bedre på simulert 4G, målt via Lighthouse CI.

Sikkerhetskontrakt

AES-256 kryptering i ro med plattform-håndterte nøkler for journal- og kapitteltekster. TLS 1.2+ i transitt; HTTP→HTTPS omadressering. JWT-tilgangstoken med 1-timers levetid, oppfriskningstoken med 30-dagers levetid, rotasjon ved oppfriskning. Soft-sletting med 30-dagers vindu før hard-sletting av PII.

Tilgjengelighetskontrakt

prefers-reduced-motion blir globalt respektert — GSAP-animasjoner blir til opasitetsbaserte overgangseffekter. VoiceOver- og TalkBack-merker på hvert interaktivt element. Manuelt verifisert på iOS og Android før hver utgivelse.

Hvorfor en separat soulwise-story-modul i stedet for å utvide cosmic-story?

Fordi oppstrømsspesifikasjonen bygger om funksjonen, og å bygge om innenfor en eksisterende modul ville enten ødelegge v1-opplevelsen eller føre til fork-og-sammenslåing senere. En ny modul holder v1 urørt, lar v2 bevise seg og migrerer rent når den er klar.

Hvorfor MongoDB og ikke Postgres?

Den eksisterende My Zodiac AI-bakenden er på MongoDB; å bytte ville bety en infrastrukturavgjørelse som ikke er relatert til denne funksjonen. Dokumentmodellen passer også godt for kapitler og dagbokinnlegg — nestede, varierende lengde, kryptert-som-blob.

Hvorfor er BullMQ valget av kø?

BullMQ kjører på Redis, som allerede er i stakken for økt og ratelimit. Ingen ny infrastruktur. Innebygd gjentakelse, tidsavbrudd og observerbarhet dekker behovene for kapittelgenerering uten tilpasset rørledning.

Hvor er oppstrømsspesifikasjonen faktisk skrevet ned?

Internt repo. Tallene og kontraktene på denne siden parafraserer de oppstrøms V-Modell-artefaktene. Offentlige tekniske blogginnlegg på My Zodiac AIs bloggkluster (merket 'cosmic-story-v2') går dypere inn i spesifikke deler av byggingen.

Prøv My Zodiac AI i dag

Mens Soulwise åpner sine bølger, ligger vår flaggskip-astrologiapp allerede i hendene dine.

Astrologiinnhold er for refleksjon og underholdning. Cosmic Story v2-funksjonene som er beskrevet her, er under utvikling; tilgjengelighet kan endres uten forvarsel.