Arhitectura Cosmic Story v2 — o analiză în profunzime.

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ă.

  • Soulwise-story este un nou modul NestJS, alături de modulul cosmic-story existent. Zero importuri directe între modulele de funcționalități.
  • Patru colecții MongoDB: soulwise_persons, soulwise_chapters, soulwise_journal_entries, soulwise_resonances. Conținuturi criptate AES-256, indexate pentru interogările pe care le deservește fiecare.
  • Generare asincronă prin coada BullMQ, cu timeout de 28 s. Evenimentele sunt emise prin EventEmitter2 doar după commit-ul în baza de date — fără elemente fantomă în inbox.
  • Specificație V-Model: 119 cerințe, zero lacune. Țintă de acoperire backend 85% la nivel de instrucțiuni pe servicii; frontend 90% pe store-urile Pinia.

Fluxul, din nou, cu detalii de inginerie

Fiecare pas are un serviciu, un contract și un eveniment.

  1. Declanșator

    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.

  2. Coadă

    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”.

  3. Compunere

    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.

  4. Generează

    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.

  5. Post-procesează

    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ă.

  6. Persistă

    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.

  7. Notifică

    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).

  8. Afișează

    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.

Șapte pași de la declanșator până la afișare, fiecare denumit după ceea ce face cu adevărat.

Cele patru colecții

Indexate pentru interogările la care răspunde fiecare.

soulwise_persons

Intrări de album. Indexuri pe userId, status, deletedAt. Mai întâi soft-delete; hard-delete al datelor PII după 30 zile.

soulwise_chapters

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ă.

soulwise_journal_entries

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”.

soulwise_resonances

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.

Evenimente EDA

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.

Rigoarea specificațiilor în Modelul V

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ță.

Contractul de performanță

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.

Contractul de securitate

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.

Contractul de accesibilitate

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.

De ce un modul separat soulwise-story în loc să extindem cosmic-story?

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.

De ce MongoDB și nu Postgres?

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.

De ce a fost ales BullMQ ca soluție de coadă?

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.

Unde este de fapt scrisă specificația din amonte?

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.

Încearcă My Zodiac AI astăzi

Î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.