soulwise_persons
Intrări de album. Indexuri pe userId, status, deletedAt. Mai întâi soft-delete; hard-delete al datelor PII după 30 zile.
Pentru ingineri, PM-i, jurnaliști și exploratori de parteneriate. Întregul flux, patru colecții MongoDB, evenimente EDA, rigoarea V-Model, obiectivele de performanță, securitatea și accesibilitatea — toate pe o singură pagină.
Fiecare pas are un serviciu, un contract și un eveniment.
O acțiune a utilizatorului — „generează capitolul de azi pentru Sister” — sau un cron programat, precum recapitularea de duminică la 9 a.m., ori actualizarea vremii la fiecare 6 ore.
Sarcina ajunge într-o coadă BullMQ numită soulwise-chapter-generation, cu un timeout strict de 28 secunde. Sarcinile care durează prea mult sunt oprite și raportate utilizatorului ca „încearcă din nou”.
ChapterGenerationService asamblează promptul cu patru factori — contextul persoanei, astrologia, semnalul, cadența — într-un singur input. Niciun PII brut al utilizatorului nu ajunge în prompt ca atare; totul este curățat în prealabil.
Un furnizor AI este apelat prin tokenul-simbol AI_GENERATION_ADAPTER — furnizorul poate fi schimbat. Răspunsul este verificat ca lungime, formă și siguranță înainte de a continua.
Se întâmplă patru lucruri: un clasificator de criză verifică limbajul de criză; un extractor de cipuri de aspect extrage de la unul la trei cipuri astrologice; un filtru anti-afirmație elimină formulările interzise; corpul este criptat AES-256 cu o cheie gestionată de platformă.
Artefactul este scris în colecția MongoDB potrivită — capitole, intrări de jurnal, rezonanțe — cu indecși userId și personId pentru căutare rapidă. Mai întâi ștergere temporară; ștergere definitivă a datelor cu caracter personal la 30 zile.
Un eveniment EventEmitter2 — CHAPTER_COMPLETED, JOURNAL_CREATED — se declanșează după confirmarea în baza de date. Modulul de notificări îl preia, creează un element în inbox și, opțional, trimite o notificare push (limitată la una pe zi, cu respectarea orelor de liniște).
Frontend-ul preia artefactul printr-un apel API autentificat. Hub-ul se redesenează cu noul conținut. Dacă utilizatorul era offline, cache-ul oferă vizualizarea de ieri, iar noul artefact apare la reconectare.
Indexate pentru interogările la care răspunde fiecare.
Intrări de album. Indexuri pe userId, status, deletedAt. Mai întâi soft-delete; hard-delete al datelor PII după 30 zile.
Capitole scrise de AI, conținut criptat. Indexuri pe personId, userId, generatedAt. Chips-urile de aspecte sunt stocate într-un array separat pentru filtrare rapidă.
Reflecții scrise de utilizator, conținut criptat. Indexuri pe userId, personId, createdAt. Conținut text-indexat pentru căutare. Marcaj per intrare „privat — a nu se transmite către Luminara”.
Scoruri pe patru dimensiuni pentru fiecare legătură. Index unic pe personId. Recalculat printr-un apel de serviciu după scrierea unui capitol sau a unui jurnal.
Regulă strictă: evenimentele se declanșează doar după commit-ul în baza de date. Dependențele dintre module se fac prin token-uri de injecție Symbol, niciodată prin forwardRef. Fără importuri directe de la un serviciu la altul între modulele funcționale.
SoulwiseEvents.CHAPTER_COMPLETED — SoulwiseEvents.CHAPTER_COMPLETED — se declanșează după ce un capitol este criptat și salvat. Notifications-v2 ascultă; creează un element în inbox; opțional trimite notificare push.SoulwiseEvents.JOURNAL_CREATED — SoulwiseEvents.JOURNAL_CREATED — se declanșează după ce o însemnare din jurnal este criptată și salvată. Serviciul de rezonanță ascultă; declanșează recalcularea.SoulwiseEvents.PERSON_BIRTH_UPDATED — SoulwiseEvents.PERSON_BIRTH_UPDATED — se declanșează după ce se modifică datele de naștere ale unei persoane. Cache-ul de sinastrie se invalidează.SoulwiseEvents.PUSH_REQUESTED — SoulwiseEvents.PUSH_REQUESTED — conform contractului notifications-v2; respectă bugetul de push și orele de liniște.119 cerințe trasabile, zero lacune. Fiecare cerință se mapează înainte către un caz de test (UTP, ITP, STP, E2E) și înapoi către o poveste de utilizator. 20 povești de utilizator. 15 cerințe funcționale. 12 categorii non-funcționale. 8 porți globale de acceptanță.
Generarea unui capitol în 30 secunde sau mai puțin pentru 95% dintre cereri, măsurată față de distribuția duratei job-urilor BullMQ. Latența API p99 pentru GET de 500 ms sau mai puțin la 1,000 utilizatori simultani, măsurată prin testul de încărcare k6. TTI pentru frontend de 3 secunde sau mai puțin pe 4G simulat, măsurat prin Lighthouse CI.
Criptare AES-256 în repaus, cu chei gestionate de platformă, pentru conținutul jurnalului și al capitolelor. TLS 1.2+ în tranzit; redirecționare HTTP→HTTPS. Token-uri JWT de acces cu durată de viață de 1 ore, token-uri de reîmprospătare cu durată de viață de 30 zile, rotație la reîmprospătare. Ștergere temporară cu o fereastră de 30 zile înainte de ștergerea definitivă a datelor cu caracter personal.
prefers-reduced-motion este respectat global — animațiile GSAP devin simple estompări de opacitate. Etichete VoiceOver și TalkBack pe fiecare element interactiv. Verificat manual pe iOS și Android înaintea fiecărei lansări.
Pentru că specificația din amonte reconstruiește funcția, iar reconstruirea în interiorul unui modul existent fie ar strica experiența v1, fie ar duce la un fork urmat de un merge ulterior. Un modul nou păstrează v1 neatins, îi permite lui v2 să se dovedească și migrează curat când e momentul.
Backendul existent al My Zodiac AI rulează pe MongoDB; schimbarea ar însemna o decizie de infrastructură fără legătură cu această funcție. Modelul de documente se potrivește bine și capitolelor și intrărilor de jurnal — imbricate, de lungimi variabile, criptate ca blob.
BullMQ rulează pe Redis, care este deja în stack pentru sesiuni și limitarea ratei. Nicio infrastructură nouă. Reîncercarea, timeout-ul și observabilitatea integrate acoperă nevoile de generare a capitolelor fără instalații personalizate.
Repo intern. Cifrele și contractele de pe această pagină parafrazează artefactele V-Model din amonte. Articolele publice de pe blogul de inginerie al My Zodiac AI (etichetate „cosmic-story-v2”) intră mai în profunzime în anumite părți ale construcției.
În timp ce Soulwise își deschide undele, aplicația noastră astrologică emblematică este deja în mâinile tale.
Conținutul astrologic este pentru reflecție și divertisment. Funcțiile Cosmic Story v2 descrise aici sunt în dezvoltare; disponibilitatea se poate schimba fără preaviz.