soulwise_persons
Albumposter. Index på userId, status, deletedAt. Mjuk radering först; hård radering av PII efter 30 dagar.
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.
Varje steg har en tjänst, ett kontrakt och en händelse.
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.
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.
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.
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.
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.
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.
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).
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.
Indexerad för de frågor var och en besvarar.
Albumposter. Index på userId, status, deletedAt. Mjuk radering först; hård radering av PII efter 30 dagar.
AI-genererade kapitel, krypterat innehåll. Index på personId, userId, generatedAt. Aspectchips lagras som en separat array för snabb filtrering.
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'.
Poäng i fyra dimensioner per band. Unikt index på personId. Omberäknas via tjänstanrop efter kapitel- eller journalinskrivning.
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.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.
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.
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.
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.
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.
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.
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.
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.
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.