Cosmic Story v2-arkitektur – en djupdykning.

För ingenjörer, projektledare, journalister och partnershipsspanare. Hela pipelinen, fyra MongoDB-samlingar, EDA-events, V-model-noggrannhet, prestandamål, säkerhet och tillgänglighet – allt på en sida.

  • Soulwise-story är en ny NestJS-modul som finns vid sidan av den befintliga cosmic-story-modulen. Noll direkta importer mellan funktionsmoduler.
  • Fyra MongoDB-samlingar: soulwise_persons, soulwise_chapters, soulwise_journal_entries, soulwise_resonances. Kropparna är AES-256-krypterade och indexerade för de sökningar de ska stödja.
  • Asynkron generering via BullMQ-kö med 28 s timeout. Händelser sänds via EventEmitter2 endast efter databas-commit – inga spökobjekt i inkorgen.
  • V-modellspecifikation: 119 krav, noll luckor. Backend-täckningsmål 85 % satser på tjänster; frontend 90 % på Pinia-butiker.

Flödet, igen, med ingenjörsdetaljer

Varje steg har en tjänst, ett kontrakt och en händelse.

  1. Utlösare

    En åtgärd från användaren – 'Generera dagens kapitel för systern' – eller en schemalagd cron-körning, som söndagssammanfattningen kl. 9 på morgonen lokal tid, eller väderuppdateringen som sker var sjätte timme.

  2. Jobbet hamnar i en BullMQ-kö med namnet soulwise-chapter-generation, med en hård tidsgräns på 28 sekunder. Långkörande jobb avbryts och rapporteras som "försök igen" till användaren.

  3. Skapa nytt

    ChapterGenerationService sammanställer prompten med fyra faktorer — personkontext, astrologi, signal, kadens — till en enda indata. Inga råa personuppgifter går ordagrant in i prompten; allt rensas först.

  4. Generera

    En AI-leverantör anropas via symbolen AI_GENERATION_ADAPTER – leverantören kan bytas ut. Svaret kontrolleras för längd, form och säkerhet innan fortsättning.

  5. Efterbehandling

    Fyra saker händer: en kris-klassificerare kontrollerar kritiska uttryck; en aspekt-chip-extractor plockar ut en till tre astrologi-chips; ett anti-claimfilter tar bort förbjudna formuleringar; och texten krypteras med AES-256 med en plattformshanterad nyckel.

  6. Behåll

    Artefakten skrivs till rätt MongoDB-samling — kapitel, dagboksinlägg, resonanser — med index för userId och personId för snabb uppslagning. Mjuk radering först; hård radering av PII efter 30 dagar.

  7. Meddela

    En EventEmitter2-händelse — CHAPTER_COMPLETED, JOURNAL_CREATED — triggas efter databascommit. Aviseringsmodulen hanterar den, skapar en inkorgspost och skickar vid behov en push-avisering (högst en per dag, tysta timmar respekteras).

  8. Yta

    Frontenden hämtar artefakten via ett auktoriserat API-anrop. Hubben renderas om med det nya innehållet. Om användaren var offline, serveras gårdagens vy från cachen, och den nya artefakten visas vid återanslutning.

Sju steg från utlösning till resultat, varje steg uppkallat efter vad det faktiskt gör.

De fyra samlingarna

Indexerad för de frågor var och en besvarar.

soulwise_persons

Albumposter. Index på userId, status, deletedAt. Mjuk radering först; hård radering av PII efter 30 dagar.

soulwise_chapters

AI-genererade kapitel, krypterat innehåll. Index på personId, userId, generatedAt. Aspectchips lagras som en separat array för snabb filtrering.

soulwise_journal_entries

Användarskrivna reflektioner, krypterad brödtext. Indexerar på userId, personId, createdAt. Textindexerad brödtext för sökning. Flagga per post 'privat — mata inte till Luminara'.

soulwise_resonances

Poäng i fyra dimensioner per band. Unikt index på personId. Omberäknas via tjänstanrop efter kapitel- eller journalinskrivning.

EDA-händelser

Strikt regel: händelser utlöses bara efter databasens commit. Beroenden mellan moduler via Symbol-injektionstokens, aldrig via forwardRef. Inga direkta tjänste-till-tjänsteimporter mellan funktionsmoduler.

  • SoulwiseEvents.CHAPTER_COMPLETED — SoulwiseEvents.CHAPTER_COMPLETED – triggas när ett kapitel har krypterats och sparas. Notifications-v2 lyssnar; skapar en inkorgspost; och kan eventuellt skicka push.
  • SoulwiseEvents.JOURNAL_CREATED — SoulwiseEvents.JOURNAL_CREATED — utlöses efter att en journalanteckning har krypterats och sparats. Resonanstjänsten lyssnar; utlöser omberäkning.
  • SoulwiseEvents.PERSON_BIRTH_UPDATED — SoulwiseEvents.PERSON_BIRTH_UPDATED — utlöses efter att en persons födelsedata ändras. Synastri-cachen ogiltigförklaras.
  • SoulwiseEvents.PUSH_REQUESTED — SoulwiseEvents.PUSH_REQUESTED — enligt notifications-v2-kontrakt; respekterar push-budget och tysta timmar.

V-Model specens noggrannhet

119 spårbara krav, noll luckor. Varje krav kopplingsbart framåt till ett testfall (UTP, ITP, STP, E2E) och bakåt till en användarhistorie. 20 användarhistorier. 15 funktionella krav. 12 icke-funktionella kategorier. 8 globala acceptansportar.

Prestandaavtal

Kapitelgenerering 30 sekunder eller bättre för 95% av förfrågningarna, mätt mot BullMQ-jobbets varaktighetsfördelning. API p99 GET-svarstid 500 ms eller bättre vid 1,000 samtidiga användare, mätt via k6-belastningstest. Frontend TTI 3 sekunder eller bättre på simulerat 4G, mätt via Lighthouse CI.

Säkerhetsavtal

AES-256-kryptering i vila med plattformshanterade nycklar för dagboks- och kapiteltexter. TLS 1.2+ under överföring; HTTP→HTTPS-omdirigering. JWT-åtkomsttokens med 1 timmes livstid, uppdateringstokens med 30 dagars livstid, rotering vid uppdatering. Mjuk borttagning med 30-dagars fönster innan hård borttagning av personlig identifieringsinformation.

Tillgänglighetsavtal

prefers-reduced-motion respekteras globalt — GSAP-animeringar blir enbart genomskinlighetsövergångar. VoiceOver- och TalkBack-beskrivningar på varje interaktivt element. Manuellt verifierade på iOS och Android före varje release.

Varför en separat soulwise-story-modul istället för att utöka cosmic-story?

Eftersom den överordnade specifikationen bygger om funktionen, och en ombyggnad inom en befintlig modul antingen skulle bryta v1-upplevelsen eller tvinga oss att göra en gren och sedan slå samman. En ny modul håller v1 orörd, låter v2 bevisa sig värdig, och kan migreras rent när den är redo.

Varför MongoDB och inte Postgres?

Den befintliga backenden för My Zodiac AI bygger på MongoDB; ett byte skulle vara ett infrastrukturbeslut som inte har med denna funktion att göra. Dokumentmodellen passar också bra för kapitel och dagboksanteckningar — nästade, varierande längd, krypterade som blob.

Varför är BullMQ ett bra val för kön?

BullMQ körs på Redis, som redan finns i stacken för session och hastighetsbegränsning. Inga nya infrastrukturbehov. Inbyggd återförsökning, tidsgräns och observabilitet täcker behoven för kapitelgenerering utan anpassad infrastruktur.

Var är den överordnade specifikationen faktiskt dokumenterad?

Internt repo. Talen och kontrakten på den här sidan parafraserar de överordnade V-Model-artefakterna. Publika tekniska blogginlägg på My Zodiac AI:s bloggkluster (taggade 'cosmic-story-v2') går djupare in i specifika delar av bygget.

Prova My Zodiac AI idag

Medan Soulwise sänder ut sina vågor finns vår flaggskepps-astrologiapp redan i dina händer.

Astrologiinnehåll är avsett för reflektion och underhållning. De funktioner i Cosmic Story v2 som beskrivs här är under utveckling; tillgängligheten kan ändras utan föregående meddelande.