Cosmic Story v2 mimarisi — derinlemesine bir inceleme.

Mühendisler, ürün yöneticileri, gazeteciler ve iş birliği arayanlar için. Tüm pipeline, dört MongoDB koleksiyonu, EDA olayları, V-Model titizliği, performans hedefleri, güvenlik ve erişilebilirlik — hepsi tek bir sayfada.

  • Soulwise-story, mevcut cosmic-story modülünün yanında yer alan yeni bir NestJS modülüdür. Özellik modülleri arasında 0 doğrudan içe aktarma (import) vardır.
  • Dört MongoDB koleksiyonu: soulwise_persons, soulwise_chapters, soulwise_journal_entries, soulwise_resonances. AES-256 ile şifrelenmiş içerikler, her birinin hizmet verdiği sorgular için indeksli.
  • BullMQ kuyruğu üzerinden 28 sn zaman aşımıyla eşzamansız üretim. Olaylar, EventEmitter2 ile yalnızca veritabanı işlemi tamamlandıktan sonra yayılır — gelen kutusunda hayalet öğe kalmaz.
  • V-Model spesifikasyonu: 119 gereksinim, sıfır boşluk. Backend kapsama hedefi servislerde 85% ifade; frontend'de Pinia store'larında 90%.

Süreç akışı, yine, mühendislik detaylarıyla

Her adımın bir hizmeti, bir sözleşmesi ve bir olayı vardır.

  1. Tetikleyici

    Bir kullanıcı işlemi — 'Sister için bugünün bölümünü oluştur' — ya da zamanlanmış bir cron; örneğin Pazar günü 9 özeti veya her 6 saatte bir yapılan hava durumu güncellemesi gibi.

  2. Sıra

    İş, soulwise-chapter-generation adlı bir BullMQ kuyruğuna düşer ve kesin bir 28 saniyelik zaman aşımı uygulanır. Uzun süren işler sonlandırılır ve kullanıcıya 'tekrar dene' olarak bildirilir.

  3. Oluştur

    ChapterGenerationService, dört faktörlü istemi (kişi bağlamı, astroloji, sinyal, ritim) tek bir girdide birleştirir. İsteme ham kullanıcı PII'si olduğu gibi girmez; her şey önce temizlenir.

  4. Oluştur

    AI sağlayıcısı, AI_GENERATION_ADAPTER sembol token'ı üzerinden çağrılır — sağlayıcı değiştirilebilir. Yanıt, devam etmeden önce uzunluk, biçim ve güvenlik açısından kontrol edilir.

  5. Son işlem

    Dört şey olur: bir kriz sınıflandırıcısı kriz diline bakar; bir aspekt-çip çıkarıcısı bir ila üç astroloji çipi alır; bir karşı-iddia filtresi yasak ifadeleri ayıklar; metin gövdesi, platform tarafından yönetilen bir anahtarla AES-256 ile şifrelenir.

  6. Kaydet

    Yapı, uygun MongoDB koleksiyonuna yazılır — bölümler, günlük kayıtları, rezonanslar — hızlı erişim için userId ve personId indeksleriyle birlikte. Önce yumuşak silme; PII'nin kalıcı silinmesi ise 30 gün sonra gerçekleşir.

  7. Bildir

    Bir EventEmitter2 olayı — CHAPTER_COMPLETED, JOURNAL_CREATED — veritabanı commit'inden sonra tetiklenir. Bildirim modülü bunu yakalar, bir gelen kutusu öğesi oluşturur ve isteğe bağlı olarak bir push gönderir (günde bir ile sınırlı, sessiz saatlere uyularak).

  8. Yüzey

    Ön yüz, kimliği doğrulanmış bir API çağrısıyla içeriği çeker. Hub yeni içerikle yeniden oluşturulur. Kullanıcı çevrimdışıysa önbellek dünkü görünümü sunar ve yeni içerik, yeniden bağlanınca görünür.

Tetikten yüzeye yedi adım, her biri gerçekte ne yaptığına göre adlandırılmış.

Dört koleksiyon

Yanıtladığı her sorgu için indekslendi.

soulwise_persons

Albüm kayıtları. userId, status ve deletedAt üzerinde dizinler. Önce yumuşak silme; kişisel verilerin kalıcı silinmesi 30 gün sonra.

soulwise_chapters

Yapay zekânın yazdığı bölümler, şifrelenmiş gövde. personId, userId ve generatedAt üzerinde indeksler. Hızlı filtreleme için açı çipleri ayrı bir dizi olarak saklanır.

soulwise_journal_entries

Kullanıcının yazdığı düşünceler, şifrelenmiş gövde. userId, personId ve createdAt üzerinde dizinler. Arama için metin dizinli gövde. Her giriş için 'gizli — Luminara'ya verme' işareti.

soulwise_resonances

Her bağ için dört boyutlu puanlar. personId üzerinde benzersiz indeks. Bölüm veya günlük yazımının ardından servis çağrısıyla yeniden hesaplanır.

EDA olayları

Katı kural: olaylar yalnızca veritabanı commit'inden sonra tetiklenir. Modüller arası bağımlılıklar Symbol enjeksiyon token'ları üzerinden kurulur, asla forwardRef ile değil. Özellik modülleri arasında doğrudan servisten servise import yapılmaz.

  • SoulwiseEvents.CHAPTER_COMPLETED — SoulwiseEvents.CHAPTER_COMPLETED — bir bölüm şifrelenip kaydedildikten sonra tetiklenir. Notifications-v2 bunu dinler; gelen kutusu öğesi oluşturur; isteğe bağlı olarak push bildirimi gönderir.
  • SoulwiseEvents.JOURNAL_CREATED — SoulwiseEvents.JOURNAL_CREATED — bir günlük girişi şifrelenip kaydedildikten sonra tetiklenir. Resonance servisi dinler; yeniden hesaplamayı başlatır.
  • SoulwiseEvents.PERSON_BIRTH_UPDATED — SoulwiseEvents.PERSON_BIRTH_UPDATED — bir kişinin doğum verileri değiştiğinde tetiklenir. sentezastrolojisi önbelleği geçersiz kılınır.
  • SoulwiseEvents.PUSH_REQUESTED — SoulwiseEvents.PUSH_REQUESTED — notifications-v2 sözleşmesi gereği; bildirim bütçesine ve sessiz saatlere uyar.

V-Model spesifikasyon titizliği

119 izlenebilir gereksinim, sıfır boşluk. Her gereksinim ileriye doğru bir test senaryosuna (UTP, ITP, STP, E2E) ve geriye doğru bir kullanıcı hikâyesine eşlenir. 20 kullanıcı hikâyesi. 15 işlevsel gereksinim. 12 işlevsel olmayan kategori. 8 global kabul kapısı.

Performans sözleşmesi

Bölüm üretimi, isteklerin 95%'inde 30 saniye veya daha kısa; BullMQ iş süresi dağılımına göre ölçülür. API p99 GET gecikmesi 1,000 eşzamanlı kullanıcıda 500 ms veya daha düşük; k6 yük testiyle ölçülür. Frontend TTI, simüle edilmiş 4G üzerinde 3 saniye veya daha kısa; Lighthouse CI ile ölçülür.

Güvenlik sözleşmesi

Günlük ve bölüm içerikleri için platform tarafından yönetilen anahtarlarla beklemede AES-256 şifreleme. İletim sırasında TLS 1.2+; HTTP→HTTPS yönlendirmesi. 1 saat ömürlü JWT erişim token'ları, 30 gün ömürlü yenileme token'ları ve yenilemede rotasyon. PII'nin kalıcı silinmesinden önce 30 günlük bir pencereyle yumuşak silme.

Erişilebilirlik sözleşmesi

prefers-reduced-motion ayarına her yerde saygı gösterilir — GSAP animasyonları yalnızca opaklık geçişlerine dönüşür. Her etkileşimli öğede VoiceOver ve TalkBack etiketleri bulunur. Her sürümden önce iOS ve Android üzerinde manuel olarak doğrulanır.

Cosmic-story'yi genişletmek yerine neden ayrı bir soulwise-story modülü?

Çünkü üst akış spesifikasyonu özelliği baştan inşa ediyor ve mevcut bir modülün içinde yeniden inşa etmek ya v1 deneyimini bozar ya da sonradan dallanıp-birleştirmeye yol açar. Yeni bir modül v1 sürümüne dokunmadan kalmasını sağlar, v2 sürümünün kendini kanıtlamasına imkân verir ve hazır olunca temiz bir geçiş yapar.

Neden Postgres değil de MongoDB?

Mevcut My Zodiac AI arka ucu MongoDB üzerinde çalışıyor; geçiş yapmak, bu özellikle ilgisi olmayan bir altyapı kararı anlamına gelirdi. Doküman modeli ayrıca bölümlere ve günlük kayıtlarına da iyi uyuyor — iç içe geçmiş, değişken uzunlukta ve blob olarak şifrelenmiş.

BullMQ neden kuyruk olarak seçildi?

BullMQ, oturum ve hız sınırlama için zaten yığında bulunan Redis üzerinde çalışır. Yeni altyapı yok. Dahili yeniden deneme, zaman aşımı ve gözlemlenebilirlik özellikleri, bölüm üretimi ihtiyaçlarını özel bir kurulum gerektirmeden karşılar.

Yukarı akış spesifikasyonu aslında nerede yazılı?

Dahili repo. Bu sayfadaki sayılar ve sözleşmeler, yukarı akış V-Model artefaktlarını özetler. My Zodiac AI'nin blog kümesindeki herkese açık mühendislik blog yazıları ('cosmic-story-v2' etiketli) yapının belirli kısımlarını daha derinlemesine ele alır.

My Zodiac AI'ı bugün dene

Soulwise dalgalarını açarken, amiral gemimiz astroloji uygulaması çoktan elinin altında.

Astroloji içeriği yansıma ve eğlence amaçlıdır. Burada açıklanan Cosmic Story v2 özellikleri geliştirme aşamasındadır; kullanılabilirlik önceden bildirilmeksizin değişebilir.