Архітектура Cosmic Story v2 — детальний розбір.

Для інженерів, продакт-менеджерів, журналістів і скаутів партнерств. Повний пайплайн, чотири колекції MongoDB, EDA-події, строгість V-Model, цільові показники продуктивності, безпека й доступність — усе на одній сторінці.

  • Soulwise-story — це новий модуль NestJS поряд з наявним модулем cosmic-story. Жодних прямих імпортів між функціональними модулями.
  • Чотири колекції MongoDB: soulwise_persons, soulwise_chapters, soulwise_journal_entries, soulwise_resonances. Тіла, зашифровані AES-256, з індексами під запити, які кожна з них обслуговує.
  • Асинхронна генерація через чергу BullMQ з тайм-аутом 28 с. Події надсилаються через EventEmitter2 лише після коміту в базу даних — жодних фантомних елементів у вхідних.
  • Специфікація V-Model: 119 вимог, нуль прогалин. Цільове покриття бекенду 85% за операторами в сервісах; фронтенд — 90% на сховищах Pinia.

Пайплайн ще раз — з інженерними деталями

Кожен крок має сервіс, контракт і подію.

  1. Тригер

    Дія користувача — «створи сьогоднішній розділ для Сестри» — або запланований cron, як-от недільний підсумок о 9 ранку чи оновлення погоди кожні 6 годин.

  2. Черга

    Завдання потрапляє в чергу BullMQ під назвою soulwise-chapter-generation з жорстким тайм-аутом у 28 секунд. Завдання, що тривають надто довго, припиняються, а користувач отримує повідомлення «спробуй ще раз».

  3. Компонування

    ChapterGenerationService збирає чотирифакторний запит — контекст людини, астрологію, сигнал, ритм — в один вхід. Жодні «сирі» персональні дані користувача не потрапляють у запит дослівно; усе спершу очищується.

  4. Генерація

    Виклик AI-провайдера відбувається через символьний токен AI_GENERATION_ADAPTER — провайдер можна замінити. Відповідь перевіряється на довжину, форму й безпеку, перш ніж рухатися далі.

  5. Постобробка

    Відбувається чотири речі: класифікатор кризи перевіряє текст на тривожні формулювання; екстрактор аспект-чипів витягує від одного до трьох астрологічних чипів; антипретензійний фільтр прибирає заборонені формулювання; тіло шифрується AES-256 ключем, яким керує платформа.

  6. Збереження

    Артефакт записується у відповідну колекцію MongoDB — розділи, записи щоденника, резонанси — з індексами userId і personId для швидкого пошуку. Спершу м’яке видалення; остаточне видалення персональних даних через 30 днів.

  7. Сповіщення

    Подія EventEmitter2 — CHAPTER_COMPLETED, JOURNAL_CREATED — спрацьовує після фіксації змін у базі даних. Модуль сповіщень її підхоплює, створює елемент у вхідних і за потреби надсилає пуш (не більше одного на день, з повагою до тихих годин).

  8. Відображення

    Фронтенд отримує артефакт через автентифікований виклик API. Hub перемальовується з новим вмістом. Якщо ти був офлайн, кеш показує вчорашній вигляд, а новий артефакт з’являється після відновлення зв’язку.

Сім кроків від тригера до результату, і кожен названо за тим, що він насправді робить.

Чотири колекції

З індексами під запити, на які кожна з них відповідає.

soulwise_persons

Записи альбому. Індекси на userId, status, deletedAt. Спочатку м’яке видалення; жорстке видалення PII через 30 днів.

soulwise_chapters

Розділи, написані ШІ, зашифроване тіло. Індекси на personId, userId, generatedAt. Чипи аспектів зберігаються окремим масивом для швидкого фільтрування.

soulwise_journal_entries

Роздуми, написані користувачем, зашифроване тіло. Індекси на userId, personId, createdAt. Тіло з текстовим індексом для пошуку. Для кожного запису — позначка «приватне — не передавати Luminara».

soulwise_resonances

Оцінки за чотирма вимірами для кожного зв’язку. Унікальний індекс на personId. Перераховуються через виклик сервісу після запису розділу чи щоденника.

Події EDA

Суворе правило: події спрацьовують лише після коміту в базу даних. Залежності між модулями — через ін'єкційні токени Symbol, ніколи через forwardRef. Жодних прямих імпортів від сервісу до сервісу між функціональними модулями.

  • SoulwiseEvents.CHAPTER_COMPLETED — SoulwiseEvents.CHAPTER_COMPLETED — спрацьовує після того, як розділ зашифровано й збережено. Notifications-v2 слухає подію; створює елемент у вхідних; за потреби надсилає пуш.
  • SoulwiseEvents.JOURNAL_CREATED — SoulwiseEvents.JOURNAL_CREATED — спрацьовує після того, як запис у щоденнику зашифровано й збережено. Сервіс резонансу слухає подію; запускає переобчислення.
  • SoulwiseEvents.PERSON_BIRTH_UPDATED — SoulwiseEvents.PERSON_BIRTH_UPDATED — спрацьовує після зміни даних народження людини. Кеш синастрики скидається.
  • SoulwiseEvents.PUSH_REQUESTED — SoulwiseEvents.PUSH_REQUESTED — згідно з контрактом notifications-v2; враховує пуш-бюджет і години тиші.

Строгість специфікації за V-моделлю

119 відстежуваних вимог, нуль прогалин. Кожна вимога зіставляється вперед із тест-кейсом (UTP, ITP, STP, E2E) і назад — з історією користувача. 20 історій користувачів. 15 функціональних вимог. 12 нефункціональних категорій. 8 глобальних шлюзів приймання.

Контракт продуктивності

Генерація розділу за 30 секунд або швидше для 95% запитів, виміряно за розподілом тривалості завдань BullMQ. Затримка API p99 для GET — 500 мс або менше за 1,000 одночасних користувачів, виміряно через навантажувальний тест k6. Frontend TTI — 3 секунд або швидше на симульованому 4G, виміряно через Lighthouse CI.

Контракт безпеки

Шифрування AES-256 у стані спокою з ключами під управлінням платформи для тіл щоденників і розділів. TLS 1.2+ під час передавання; перенаправлення HTTP→HTTPS. Токени доступу JWT із терміном дії 1 години, токени оновлення з терміном дії 30 днів, ротація під час оновлення. М'яке видалення з вікном 30 днів до остаточного видалення PII.

Контракт доступності

Глобально враховуємо prefers-reduced-motion — анімації GSAP стають плавним згасанням лише через прозорість. Підписи для VoiceOver і TalkBack на кожному інтерактивному елементі. Перед кожним релізом вручну перевіряємо на iOS та Android.

Чому окремий модуль soulwise-story, а не розширення cosmic-story?

Тому що апстрім-специфікація перебудовує функцію, а перебудова всередині наявного модуля або зламала б досвід v1, або означала б розгалуження з подальшим злиттям. Новий модуль лишає v1 недоторканим, дає v2 змогу себе показати й чисто мігрує, коли все буде готово.

Чому MongoDB, а не Postgres?

Наявний бекенд My Zodiac AI працює на MongoDB; перехід означав би інфраструктурне рішення, не пов'язане з цією функцією. До того ж документна модель добре підходить для розділів і записів щоденника — вкладених, різної довжини, зашифрованих як блоб.

Чому як черга обрано BullMQ?

BullMQ працює на Redis, який уже є в стеку для сесій і обмеження частоти запитів. Жодної нової інфраструктури. Вбудовані повторні спроби, тайм-аути й спостережуваність покривають потреби генерації розділів без саморобної обв'язки.

Де насправді записана апстрім-специфікація?

У внутрішньому репозиторії. Цифри й контракти на цій сторінці переказують апстрім-артефакти V-моделі. Публічні інженерні дописи в блог-кластері My Zodiac AI (з тегом 'cosmic-story-v2') заглиблюються в окремі частини збірки.

Спробуй My Zodiac AI вже сьогодні

Поки Soulwise розгортає свої хвилі, наш флагманський астрологічний застосунок уже в твоїх руках.

Астрологічний контент створено для роздумів і розваги. Функції Cosmic Story v2, описані тут, перебувають у розробці; їхня доступність може змінитися без попередження.