soulwise_persons
Albumoppføringer. Indekser på userId, status, deletedAt. Myk sletting først; hard sletting av PII etter 30 dager.
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.
Hvert steg har en tjeneste, en kontrakt og en hendelse.
En brukerhandling – «generer dagens kapittel for Sister» – eller en planlagt cron, som søndagens oppsummering 9, eller væroppdateringen hver 6. time.
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.
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.
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.
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.
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.
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).
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.
Indeksert for spørringene hver enkelt besvarer.
Albumoppføringer. Indekser på userId, status, deletedAt. Myk sletting først; hard sletting av PII etter 30 dager.
AI-skrevne kapitler, kryptert innhold. Indekser på personId, userId, generatedAt. Aspekt-chips lagret som en separat array for rask filtrering.
Bruker-skrevne refleksjoner, kryptert innhold. Indekser på userId, personId, createdAt. Tekst-indeksert innhold for søk. Per-innlegg 'privat — ikke del med Luminara'-flagg.
Fire-dimensjons poeng per bånd. Unik indeks på personId. Beregnet på nytt via tjenestekall etter kapittel- eller dagbokskrivning.
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.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.
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.
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.
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.
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.
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.
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.
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.
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.