Arquitectura Cosmic Story v2 — una immersió profunda.

Per a enginyers, PMs, periodistes i reclutadors de col·laboracions. La cadena completa, quatre col·leccions MongoDB, esdeveniments EDA, rigor del V-Model, objectius de rendiment, seguretat i accessibilitat — tot en una sola pàgina.

  • Soulwise-story és un nou mòdul NestJS al costat del mòdul existent cosmic-story. Zero imports directes entre mòduls de funcionalitat.
  • Quatre col·leccions MongoDB: soulwise_persons, soulwise_chapters, soulwise_journal_entries, soulwise_resonances. Cossos xifrats amb AES-256, indexats per les consultes que cadascuna serveix.
  • Generació asíncrona via cua BullMQ amb un límit de temps de 28 s. Esdeveniments emesos via EventEmitter2 només després del commit a la base de dades — sense elements fantasma a la safata d'entrada.
  • Especificació V-Model: 119 requisits, zero buits. Objectiu de cobertura del backend 85% en declaracions sobre serveis; frontend 90% en magatzems Pinia.

El flux, de nou, amb detalls d'enginyeria

Cada pas té un servei, un contracte i un esdeveniment.

  1. Desencadenador

    Una acció d'usuari — 'genera el capítol d'avui per a Sister' — o un cron programat, com el resum del diumenge 9 a.m., o l'actualització meteorològica cada 6 hores.

  2. Cua

    La tasca entra a una cua BullMQ anomenada soulwise-chapter-generation, amb un límit estricte de 28 segons. Les tasques de llarga durada es cancel·len i es notifica a l'usuari amb 'torna a intentar-ho'.

  3. Composar

    El ChapterGenerationService combina l'indicador de quatre factors — context de la persona, astrologia, senyal, ritme — en una única entrada. Cap dada personal identificable entra al prompt tal qual; tot es neteja prèviament.

  4. Genera

    Un proveïdor d'IA es crida mitjançant el símbol token AI_GENERATION_ADAPTER — el proveïdor és intercanviable. La resposta es comprova per longitud, forma i seguretat abans de continuar.

  5. Processa posteriorment

    Passen quatre coses: un classificador de crisi detecta llenguatge de crisi; un extractor de fitxes d'aspecte selecciona d'una a tres fitxes astrològiques; un filtre anti-afirmacions elimina les expressions prohibides; el cos es xifra amb AES-256 amb una clau gestionada per la plataforma.

  6. Persisteix

    L'artefacte s'escriu a la col·lecció MongoDB corresponent — capítols, entrades de diari, ressonàncies — amb índexs userId i personId per a una cerca ràpida. S'aplica una supressió suau primer; supressió definitiva de PII a 30 dies.

  7. Notifica

    Un esdeveniment EventEmitter2 — CHAPTER_COMPLETED, JOURNAL_CREATED — s'activa després del compromís a la base de dades. El mòdul de notificacions el captura, crea un element a la safata d'entrada i, opcionalment, envia una push (limitada a una al dia, respectant les hores silencioses).

  8. Mostra

    El frontal recupera l'artefacte mitjançant una crida API autenticada. El Hub es torna a renderitzar amb el nou contingut. Si l'usuari estava fora de línia, la memòria cau mostra la vista d'ahir i el nou artefacte apareix en reconnectar-se.

Set passos des del desencadenador fins a la superfície, cadascun anomenat segons la seva funció real.

Les quatre col·leccions

Indexades per les consultes que cadascuna respon.

soulwise_persons

Entrades d'àlbum. Índexs per userId, status, deletedAt. Suavement eliminat primer; eliminació definitiva de dades personals a 30 dies.

soulwise_chapters

Capítols escrits per IA, cos xifrat. Índexs per personId, userId, generatedAt. Els xips d'aspecte s'emmagatzemen en una matriu separada per a un filtratge ràpid.

soulwise_journal_entries

Reflexions escrites per l'usuari, cos xifrat. Índexs per userId, personId, createdAt. Cos indexat per text per a la cerca. Marca per entrada 'privada — no alimentar a Luminara'.

soulwise_resonances

Puntuacions de quatre dimensions per enllaç. Índex únic per personId. Recalculades via crida de servei després d'escriure un capítol o una entrada de diari.

Esdeveniments EDA

Regla estricta: els esdeveniments s’activen només després del commit de la base de dades. Dependències entre mòduls a través de tokens d’injecció Symbol, mai via forwardRef. No hi ha imports directes de servei a servei entre mòduls de funcionalitat.

  • SoulwiseEvents.CHAPTER_COMPLETED — SoulwiseEvents.CHAPTER_COMPLETED — s’activa després que un capítol es xifri i es persisteixi. Notifications-v2 escolta; crea un element de safata d’entrada; opcionalment envia una notificació push.
  • SoulwiseEvents.JOURNAL_CREATED — SoulwiseEvents.JOURNAL_CREATED — s’activa després que una entrada de diari es xifri i es persisteixi. El servei Resonance escolta; desencadena una recomputació.
  • SoulwiseEvents.PERSON_BIRTH_UPDATED — SoulwiseEvents.PERSON_BIRTH_UPDATED — s’activa després que les dades de naixement d’una persona canviïn. La memòria cau de sinastría s’invalida.
  • SoulwiseEvents.PUSH_REQUESTED — SoulwiseEvents.PUSH_REQUESTED — segons el contracte de notifications-v2; respecta el pressupost de push i les hores de silenci.

Rigor de l’especificació V-Model

119 requisits traçables, sense buits. Cada requisit es mapja cap endavant a un cas de prova (UTP, ITP, STP, E2E) i cap enrere a una user story. 20 user stories. 15 requisits funcionals. 12 categories no funcionals. 8 portes d’acceptació globals.

Contracte de rendiment

Generació de capítols 30 segons o menys per al 95% de les sol·licituds, mesurat respecte la distribució de durada de tasques BullMQ. Latència GET de l’API p99 500 ms o menys amb 1,000 usuaris concurrents, mesurat via la prova de càrrega k6. TTI del frontend 3 segons o menys en simulació de 4G, mesurat amb Lighthouse CI.

Contracte de seguretat

Xifratge AES-256 en repòs amb claus gestionades per la plataforma per a cossos de diaris i capítols. TLS 1.2+ en trànsit; redirecció HTTP→HTTPS. Tokens d’accés JWT amb vida útil de 1 hores, tokens de refresc amb vida útil de 30 dies, rotació en refrescar. Suavitzat (soft-delete) amb una finestra de 30 dies abans del supressió definitiva de PII.

Contracte d'accessibilitat

prefers-reduced-motion globalment respectat — les animacions GSAP es converteixen en desvaniments només d'opacitat. Etiquetes VoiceOver i TalkBack a cada element interactiu. Verificat manualment a iOS i Android abans de cada llançament.

Per què un mòdul soulwise-story separat en comptes d'ampliar cosmic-story?

Perquè l'especificació ascendent reconstrueix la funcionalitat, i reconstruir dins d'un mòdul existent trencaria l'experiència v1 o requeriria un fork‑then‑merge més endavant. Un mòdul nou manté v1 intacta, permet que v2 es provi i migri netament quan estigui llest.

Per què MongoDB i no Postgres?

El backend existent de My Zodiac AI funciona sobre MongoDB; canviar implicaria una decisió d'infraestructura que no té relació amb aquesta funcionalitat. El model de documents també s'adapta bé a capítols i entrades de diari — imbricat, de longitud variable, encriptat com a blob.

Per què BullMQ és l'opció de cua?

BullMQ s'executa sobre Redis, que ja forma part de la pila per a sessions i límits de taxa. No cal nova infraestructura. La reintenta, el temps d'espera i l'observabilitat integrats cobreixen les necessitats de generació de capítols sense cap canalització personalitzada.

On està escrita realment l'especificació ascendent?

Repositori intern. Els números i contractes d'aquesta pàgina parafrasegen els artefactes V‑Model ascendent. Les publicacions del blog d'enginyeria de My Zodiac AI (etiquetades 'cosmic-story-v2') aprofundeixen en parts específiques del desenvolupament.

Prova My Zodiac AI avui

Mentre Soulwise obre les seves ones, la nostra aplicació estrella d'astrologia ja és a les teves mans.

El contingut d'astrologia és per a reflexió i entreteniment. Les funcions de Cosmic Story v2 descrites aquí estan en desenvolupament; la disponibilitat pot canviar sense avís.