soulwise_persons
Albumposter. Indekser på userId, status, deletedAt. Blød sletning først; permanent sletning af PII efter 30 dage.
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.
Hvert trin har en tjeneste, en kontrakt og en begivenhed.
En brugerhandling — 'generér dagens kapitel for Søster' — eller en planlagt cron, som søndagens recap kl. 9, eller vejropdateringen hver 6. time.
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.
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.
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.
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.
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.
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).
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.
Indekseret til de forespørgsler, som hver især besvarer.
Albumposter. Indekser på userId, status, deletedAt. Blød sletning først; permanent sletning af PII efter 30 dage.
AI-skrevne kapitler, krypteret brødtekst. Indekser på personId, userId, generatedAt. Aspekt-chips gemt som et separat array til hurtig filtrering.
Brugerens egne refleksioner, krypteret brødtekst. Indeks på userId, personId, createdAt. Tekstindekseret brødtekst til søgning. Per-post 'privat — fodr ikke Luminara'-flag.
Fire-dimension-score pr. bånd. Unikt indeks på personId. Genberegnet via servicekald efter kapitel- eller dagbogsskrivning.
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.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.
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.
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.
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.
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.
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.
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.
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.
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.