Cosmic Story v2-arkitekturen — en dybdegående gennemgang.

For ingeniører, produktchefer, journalister og partnerskabsansvarlige. Hele pipelinen, fire MongoDB-samlinger, EDA-begivenheder, V-Model-strenge, ydeevnemål, sikkerhed og tilgængelighed — alt på én side.

  • Soulwise-story er et nyt NestJS-modul ved siden af det eksisterende cosmic-story-modul. Nul direkte import mellem funktionsmoduler.
  • Fire MongoDB-samlinger: soulwise_persons, soulwise_chapters, soulwise_journal_entries, soulwise_resonances. AES-256-krypterede brødtekster, indekseret efter de forespørgsler, de hver især understøtter.
  • Asynkron generering via BullMQ-kø med 28 s timeout. Events udsendes via EventEmitter2 først efter databasecommit — ingen fantomelementer i indbakken.
  • V-Modellens spec: 119 krav, nul huller. Backend-dækningsmål 85% sætningsdækning på tjenester; frontend 90% på Pinia-butikker.

Pipelinen, igen, med tekniske detaljer

Hvert trin har en tjeneste, en kontrakt og en begivenhed.

  1. Udløser

    En brugerhandling — 'generér dagens kapitel for Søster' — eller en planlagt cron, som søndagens recap kl. 9, eller vejropdateringen hver 6. time.

  2. Jobbet placeres i en BullMQ-kø ved navn soulwise-chapter-generation med en hård timeout på 28 sekunder. Langvarige jobs afbrydes og rapporteres som 'prøv igen' til brugeren.

  3. Komponér

    ChapterGenerationService samler firefaktor-prompten — personkontekst, astrologi, signal, kadence — til ét enkelt input. Ingen rå brugerpersondata indgår ordret i prompten; alt bliver renset først.

  4. Generér

    En AI-udbyder påkaldes via symboltokenet AI_GENERATION_ADAPTER — udbyderen kan skiftes ud. Responsen tjekkes for længde, form og sikkerhed, før der fortsættes.

  5. Efterbehandling

    Fire ting sker: en kriseklassifikator checker for krisesprog; en aspekt-chip-ekstraktor trækker en til tre astrologi-chips; et anti-påstandsfilter fjerner forbudte formuleringer; brødteksten krypteres med AES-256 med en platform-administreret nøgle.

  6. Gem

    Artefakten skrives til den relevante MongoDB-samling — kapitler, dagbogsindlæg, resonanser — med userId- og personId-indekser for hurtigt opslag. Soft-delete først; hard-delete af PII efter 30 dage.

  7. Underret

    En EventEmitter2-begivenhed — CHAPTER_COMPLETED, JOURNAL_CREATED — udløses efter database-commit. Meddelelsesmodulen fanger den, opretter en indbakkepost og sender eventuelt en push-besked (begrænset til en om dagen, stille timer respekteres).

  8. Vis frem

    Frontenden henter artefaktet via et autentificeret API-opkald. Hubben genindlæser med det nye indhold. Hvis brugeren var offline, serverer cachen forrige dags visning, og det nye artefakt vises, når der genetableres forbindelse.

Syv trin fra udløser til overflade, hvor hvert trin er navngivet efter, hvad det faktisk gør.

De fire samlinger

Indekseret til de forespørgsler, som hver især besvarer.

soulwise_persons

Albumposter. Indekser på userId, status, deletedAt. Blød sletning først; permanent sletning af PII efter 30 dage.

soulwise_chapters

AI-skrevne kapitler, krypteret brødtekst. Indekser på personId, userId, generatedAt. Aspekt-chips gemt som et separat array til hurtig filtrering.

soulwise_journal_entries

Brugerens egne refleksioner, krypteret brødtekst. Indeks på userId, personId, createdAt. Tekstindekseret brødtekst til søgning. Per-post 'privat — fodr ikke Luminara'-flag.

soulwise_resonances

Fire-dimension-score pr. bånd. Unikt indeks på personId. Genberegnet via servicekald efter kapitel- eller dagbogsskrivning.

EDA-hændelser

Strikt regel: events udløses først efter database-commit. Afhængigheder på tværs af moduler håndteres via Symbol-injektionstokens, aldrig via forwardRef. Ingen direkte service-til-service-import mellem funktionsmoduler.

  • SoulwiseEvents.CHAPTER_COMPLETED — SoulwiseEvents.CHAPTER_COMPLETED — udløses efter et kapitel er krypteret og gemt. Notifications-v2 lytter; opretter indbakkeelement; sender eventuelt push.
  • SoulwiseEvents.JOURNAL_CREATED — SoulwiseEvents.JOURNAL_CREATED — udløses efter en journalpost er krypteret og gemt. Resonance-tjenesten lytter; udløser genberegning.
  • SoulwiseEvents.PERSON_BIRTH_UPDATED — SoulwiseEvents.PERSON_BIRTH_UPDATED — udløst efter en persons fødselsdata ændres. Synastri-cache ugyldiggøres.
  • SoulwiseEvents.PUSH_REQUESTED — SoulwiseEvents.PUSH_REQUESTED — pr. notifications-v2-kontrakten; overholder push-budget og stille timer.

V-Model-specifikationens stringens

119 sporbare krav, nul huller. Hvert krav spores frem til en testcase (UTP, ITP, STP, E2E) og tilbage til en user story. 20 user stories. 15 funktionelle krav. 12 ikke-funktionelle kategorier. 8 globale acceptkriterier.

Ydelseskontrakt

Kapitelgenerering på 30 sekunder eller bedre for 95% af anmodninger, målt mod BullMQ-jobvarighedsfordeling. API p99 GET-latenstid 500 ms eller bedre ved 1.000 samtidige brugere, målt via k6 belastningstest. Frontend TTI 3 sekunder eller bedre på simuleret 4G, målt via Lighthouse CI.

Sikkerhedskontrakt

AES-256-kryptering i hvile med platformadministrerede nøgler til journal- og kapitelbrødtekster. TLS 1.2+ i transit; HTTP→HTTPS-omdirigering. JWT-adgangstokens med 1 times levetid, opfriskningstokens med 30 dages levetid, rotation ved opfriskning. Blød sletning med 30 dages vindue før permanent sletning af personoplysninger.

Tilgængelighedskontrakt

prefers-reduced-motion overholdes globalt — GSAP-animationer bliver kun til fade med opacitet. VoiceOver- og TalkBack-etiketter på hvert interaktivt element. Manuelt verificeret på iOS og Android før hver udgivelse.

Hvorfor et separat soulwise-story-modul i stedet for at udvide cosmic-story?

Fordi upstream-specifikationen genopbygger funktionen, og genopbygning i et eksisterende modul enten ville ødelægge v1-oplevelsen eller kræve en fork-og-merge senere. Et nyt modul holder v1 upåvirket, lader v2 bevise sin værdi og migrerer rent, når det er klart.

Hvorfor MongoDB og ikke Postgres?

Den eksisterende My Zodiac AI-backend kører på MongoDB; et skifte ville betyde en infrastrukturbeslutning, der ikke er relateret til denne funktion. Dokumentmodellen passer også godt til kapitler og journalnoter — indlejrede, af varierende længde, krypteret som blob.

Hvorfor er BullMQ køvalget?

BullMQ kører på Redis, som allerede er i stakken til session og rate-limit. Ingen ny infrastruktur. Indbygget retry, timeout og observability dækker behovene for kapitelgenerering uden brugerdefineret plumbing.

Hvor er upstream-specifikationen egentlig nedskrevet?

Internt repo. Tallene og kontrakterne på denne side parafraserer de opstrøms V-Model-artefakter. Offentligt tilgængelige ingeniørblogindlæg på My Zodiac AI's blog-kluster (tagget 'cosmic-story-v2') går dybere ind i specifikke dele af buildet.

Prøv My Zodiac AI i dag

Mens Soulwise åbner sine bølger, har du allerede vores flagskib blandt astrologi-apps lige ved hånden.

Astrologisk indhold er til refleksion og underholdning. Cosmic Story v2-funktioner, der er beskrevet her, er under udvikling; tilgængelighed kan ændres uden varsel.