soulwise_persons
Записи альбому. Індекси на userId, status, deletedAt. Спочатку м’яке видалення; жорстке видалення PII через 30 днів.
Для інженерів, продакт-менеджерів, журналістів і скаутів партнерств. Повний пайплайн, чотири колекції MongoDB, EDA-події, строгість V-Model, цільові показники продуктивності, безпека й доступність — усе на одній сторінці.
Кожен крок має сервіс, контракт і подію.
Дія користувача — «створи сьогоднішній розділ для Сестри» — або запланований cron, як-от недільний підсумок о 9 ранку чи оновлення погоди кожні 6 годин.
Завдання потрапляє в чергу BullMQ під назвою soulwise-chapter-generation з жорстким тайм-аутом у 28 секунд. Завдання, що тривають надто довго, припиняються, а користувач отримує повідомлення «спробуй ще раз».
ChapterGenerationService збирає чотирифакторний запит — контекст людини, астрологію, сигнал, ритм — в один вхід. Жодні «сирі» персональні дані користувача не потрапляють у запит дослівно; усе спершу очищується.
Виклик AI-провайдера відбувається через символьний токен AI_GENERATION_ADAPTER — провайдер можна замінити. Відповідь перевіряється на довжину, форму й безпеку, перш ніж рухатися далі.
Відбувається чотири речі: класифікатор кризи перевіряє текст на тривожні формулювання; екстрактор аспект-чипів витягує від одного до трьох астрологічних чипів; антипретензійний фільтр прибирає заборонені формулювання; тіло шифрується AES-256 ключем, яким керує платформа.
Артефакт записується у відповідну колекцію MongoDB — розділи, записи щоденника, резонанси — з індексами userId і personId для швидкого пошуку. Спершу м’яке видалення; остаточне видалення персональних даних через 30 днів.
Подія EventEmitter2 — CHAPTER_COMPLETED, JOURNAL_CREATED — спрацьовує після фіксації змін у базі даних. Модуль сповіщень її підхоплює, створює елемент у вхідних і за потреби надсилає пуш (не більше одного на день, з повагою до тихих годин).
Фронтенд отримує артефакт через автентифікований виклик API. Hub перемальовується з новим вмістом. Якщо ти був офлайн, кеш показує вчорашній вигляд, а новий артефакт з’являється після відновлення зв’язку.
З індексами під запити, на які кожна з них відповідає.
Записи альбому. Індекси на userId, status, deletedAt. Спочатку м’яке видалення; жорстке видалення PII через 30 днів.
Розділи, написані ШІ, зашифроване тіло. Індекси на personId, userId, generatedAt. Чипи аспектів зберігаються окремим масивом для швидкого фільтрування.
Роздуми, написані користувачем, зашифроване тіло. Індекси на userId, personId, createdAt. Тіло з текстовим індексом для пошуку. Для кожного запису — позначка «приватне — не передавати Luminara».
Оцінки за чотирма вимірами для кожного зв’язку. Унікальний індекс на personId. Перераховуються через виклик сервісу після запису розділу чи щоденника.
Суворе правило: події спрацьовують лише після коміту в базу даних. Залежності між модулями — через ін'єкційні токени 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; враховує пуш-бюджет і години тиші.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.
Тому що апстрім-специфікація перебудовує функцію, а перебудова всередині наявного модуля або зламала б досвід v1, або означала б розгалуження з подальшим злиттям. Новий модуль лишає v1 недоторканим, дає v2 змогу себе показати й чисто мігрує, коли все буде готово.
Наявний бекенд My Zodiac AI працює на MongoDB; перехід означав би інфраструктурне рішення, не пов'язане з цією функцією. До того ж документна модель добре підходить для розділів і записів щоденника — вкладених, різної довжини, зашифрованих як блоб.
BullMQ працює на Redis, який уже є в стеку для сесій і обмеження частоти запитів. Жодної нової інфраструктури. Вбудовані повторні спроби, тайм-аути й спостережуваність покривають потреби генерації розділів без саморобної обв'язки.
У внутрішньому репозиторії. Цифри й контракти на цій сторінці переказують апстрім-артефакти V-моделі. Публічні інженерні дописи в блог-кластері My Zodiac AI (з тегом 'cosmic-story-v2') заглиблюються в окремі частини збірки.
Поки Soulwise розгортає свої хвилі, наш флагманський астрологічний застосунок уже в твоїх руках.
Астрологічний контент створено для роздумів і розваги. Функції Cosmic Story v2, описані тут, перебувають у розробці; їхня доступність може змінитися без попередження.