Cosmic Story v2-architectuur — een diepgaande blik.

Voor ingenieurs, productmanagers, journalisten en partnershipverkenners. De volledige pipeline, vier MongoDB-collecties, EDA-events, V-model-nauwgezetheid, prestatiedoelen, beveiliging en toegankelijkheid – alles op één pagina.

  • Soulwise-story is een nieuwe NestJS-module naast de bestaande cosmic-story-module. Zero directe imports tussen feature modules.
  • Vier MongoDB-verzamelingen: soulwise_persons, soulwise_chapters, soulwise_journal_entries, soulwise_resonances. AES-256 versleutelde objecten, geïndexeerd voor de door elk bediende query's.
  • Async generatie via BullMQ-wachtrij met een time-out van 28 s. Events worden alleen uitgegeven via EventEmitter2 na een databasecommit — geen spookinboxitems.
  • V-model-specificatie: 119 vereisten, nul hiaten. Backend-dekkingsdoel 85% statements op services; frontend 90% op Pinia-stores.

De pipeline, opnieuw, met technische details

Elke stap heeft een dienst, een contract en een evenement.

  1. Aanleiding

    Genereer het dagelijkse hoofdstuk voor Sister — of een geplande cron, zoals de terugblik op zondagochtend 9 a.m., of de weer-actualisatie die elke 6 uur wordt uitgevoerd.

  2. Wachtrij

    De taak belandt in een BullMQ-wachtrij met de naam soulwise-chapter-generation, met een harde 28-seconden time-out. Langlopende taken worden afgebroken en als 'probeer opnieuw' aan de gebruiker gemeld.

  3. Stel samen

    De ChapterGenerationService combineert de ⟦CA:KIND:N⟧-factorenprompt — persoonscontext, astrologie, signaal, cadans — tot één enkele invoer. Geen onbewerkte gebruikersgegevens gaan verbatim in de prompt; alles wordt eerst geschoond.

  4. Genereer

    Een AI-provider wordt aangeroepen via het symbooltoken AI_GENERATION_ADAPTER — de provider is verwisselbaar. Het antwoord wordt gecontroleerd op lengte, vorm en veiligheid voordat er verder wordt gegaan.

  5. Nabewerking

    Er zijn vier stappen: een crisisklassificeerder detecteert crisistaal; een aspect-chip-extractor haalt één tot drie astrologiechips; een anti-claim-filter verwijdert verboden bewoordingen; en de inhoud wordt AES-256 versleuteld met een door het platform beheerde sleutel.

  6. Volharden

    Het artefact wordt naar de juiste MongoDB-collectie geschreven — hoofdstukken, dagboeknotities, resonanties — met userId- en personId-indexen voor snel opzoeken. Eerst soft-delete; hard-delete van PII na 30 dagen.

  7. Melding

    Een EventEmitter2-gebeurtenis — CHAPTER_COMPLETED, JOURNAL_CREATED — wordt afgevuurd na de database-commit. Het meldingensysteem pakt deze op, maakt een inbox-item aan, en stuurt optioneel een pushmelding (maximaal één per dag, stille uren worden gerespecteerd).

  8. Tonen

    De frontend haalt het artifact op via een geauthentificeerde API-aanroep. De Hub rendert opnieuw met de nieuwe inhoud. Als de gebruiker offline was, dient de cache het beeld van gisteren aan en verschijnt het nieuwe artifact bij herstel van de verbinding.

Zeven stappen van trigger tot oppervlak, elk vernoemd naar wat het daadwerkelijk doet.

De vier collecties

Geïndexeerd op basis van de vragen die ze beantwoorden.

soulwise_persons

Albumvermeldingen. Indexen op userId, status, deletedAt. Eerst soft-delete; hard-delete van PII na 30 dagen.

soulwise_chapters

AI-geschreven hoofdstukken, versleutelde inhoud. Indexen op personId, userId, generatedAt. Aspect chips worden opgeslagen als aparte array voor snel filteren.

soulwise_journal_entries

Gebruiker-geschreven reflecties, versleutelde inhoud. Indexering op userId, personId, createdAt. Tekstgeïndexeerde inhoud voor zoeken. Per-item vlag 'privé — niet voeden aan Luminara'.

soulwise_resonances

4-dimensie scores per band. Unieke index op personId. Wordt herberekend via serviceaanroep na het schrijven van een hoofdstuk of journaalitem.

EDA evenementen

Strikte regel: gebeurtenissen worden pas afgevuurd na de databasecommit. Kruismodule-afhankelijkheden via Symbol-injectietokens, nooit via forwardRef. Geen directe service-naar-service-import tussen functiemodules.

  • SoulwiseEvents.CHAPTER_COMPLETED — SoulwiseEvents.CHAPTER_COMPLETED — wordt geactiveerd na het versleutelen en opslaan van een hoofdstuk. Notifications-v2 luistert; maakt een inboxitem aan; stuurt optioneel een pushbericht.
  • SoulwiseEvents.JOURNAL_CREATED — SoulwiseEvents.JOURNAL_CREATED — wordt uitgevoerd nadat een journalitem is versleuteld en opgeslagen. De Resonantiedienst luistert; activeert herberekening.
  • SoulwiseEvents.PERSON_BIRTH_UPDATED — SoulwiseEvents.PERSON_BIRTH_UPDATED — wordt uitgestuurd na wijzigingen in de geboortedata van een persoon. Synastrie-cache wordt ongeldig.
  • SoulwiseEvents.PUSH_REQUESTED — SoulwiseEvents.PUSH_REQUESTED — volgens het notifications-v2 contract; respecteert pushbudget en rusturen.

V-Model specificatienauwkeurigheid

119 traceerbare vereisten, nul hiaten. Elke vereiste verwijst vooruit naar een testgeval (UTP, ITP, STP, E2E) en achterwaarts naar een gebruikersverhaal. 20 gebruikersverhalen. 15 functionele vereisten. 12 niet-functionele categorieën. 8 globale acceptatiepoorten.

Prestatiecontract

Hoofdstukgeneratie 30 seconden of sneller voor 95% van de verzoeken, gemeten tegen de BullMQ jobduurverdeling. API p99 GET-latentie 500 ms of beter bij 1,000 gelijktijdige gebruikers, gemeten via een k6 loadtest. Frontend TTI 3 seconden of beter op gesimuleerde 4G, gemeten via Lighthouse CI.

Beveiligingscontract

AES-256 versleuteling in rust met platform-beheerde sleutels voor dagboek- en hoofdstukteksten. TLS 1.2+ voor transport; HTTP→HTTPS redirect. JWT-toegangstokens met een levensduur van 1 uur, verversingstokens met een levensduur van 30 dagen, rotatie bij verversing. Zachte verwijdering met een venster van 30 dagen voor de harde verwijdering van PII.

Toegankelijkheidscontract

Voorkeur voor verminderde animaties wordt wereldwijd gerespecteerd — GSAP-animaties worden doorzichtige vervagingen. VoiceOver- en TalkBack-labels op elk interactief element. Handmatig geverifieerd op iOS en Android voor elke release.

Waarom een aparte soulwise-story-module in plaats van het uitbreiden van cosmic-story?

Omdat de upstream-specificatie de functionaliteit herbouwt, en bouwen binnen een bestaande module ofwel de v1-ervaring zou verbreken of een fork-then-merge later zou veroorzaken. Een nieuwe module houdt v1 onaangeroerd, laat v2 zich bewijzen, en schakelt schoon over wanneer het zover is.

Waarom MongoDB en niet Postgres?

De huidige backend van My Zodiac AI draait op MongoDB; overschakelen zou een infrastructuurbeslissing vereisen die losstaat van deze functionaliteit. Het documentmodel past ook goed bij hoofdstukken en journaalnotities — geneste structuur, van variabele lengte, versleuteld als blob.

Waarom is BullMQ de keuze voor wachtrijen?

BullMQ draait op Redis, dat al in de stack zit voor sessies en snelheidslimieten. Geen nieuwe infrastructuur. Ingebouwde herpoging, time-out en observeerbaarheid dekken de behoeften voor hoofdstukgeneratie zonder maatwerk.

Waar staat de upstream-specificatie eigenlijk beschreven?

Interne repo. De cijfers en contracten op deze pagina parafraseren de upstream V-Model-artefacten. Openbare technische blogposts op de blogcluster van My Zodiac AI (getagd 'cosmic-story-v2') gaan dieper in op specifieke onderdelen van de bouw.

Ontdek My Zodiac AI vandaag nog

Terwijl Soulwise zijn golven opent, is onze vlaggenschip-astrologie-app al in jouw handen.

Astrologie-inhoud is bedoeld voor reflectie en vermaak. De hier beschreven functies van Cosmic Story v2 zijn in ontwikkeling; beschikbaarheid kan zonder voorafgaande kennisgeving worden gewijzigd.