soulwise_persons
Записи альбома. Индексы на userId, status, deletedAt. Сначала soft-delete; hard-delete PII через 30 дней.
Для инженеров, PM, журналистов и партнёрских скаутов. Полный конвейер, четыре MongoDB-коллекции, EDA-события, V-Model-строгость, цели производительности, безопасность и доступность — всё на одной странице.
У каждого шага есть сервис, контракт и событие.
Действие пользователя — «сгенерировать главу для сестры сегодня» — или плановая cron-задача, как воскресный recap или обновление погоды каждые 6 часов.
Задача попадает в очередь BullMQ с именем soulwise-chapter-generation, с жёстким таймаутом 28 секунд. Долгие задачи останавливаются и помечаются как «попробовать ещё».
ChapterGenerationService собирает четырёхфакторный промпт — контекст человека, астрологию, сигнал, ритм — в один вход. Сырых PII в промпте нет, всё чистится заранее.
Вызывается AI-провайдер через symbol-токен AI_GENERATION_ADAPTER — провайдер сменный. Ответ проверяется по длине, форме и безопасности перед продолжением.
Происходит четыре вещи: классификатор кризиса проверяет язык; экстрактор аспектных чипов вытягивает 1–3 чипа; фильтр anti-claim вычищает запрещённые формулировки; тело шифруется AES-256 с платформенным ключом.
Артефакт записывается в соответствующую MongoDB-коллекцию — chapters, journal entries, resonances — с индексами по userId и personId для быстрого поиска. Сначала soft-delete; hard-delete PII через 30 дней.
Событие EventEmitter2 — CHAPTER_COMPLETED, JOURNAL_CREATED — срабатывает после коммита в БД. Модуль уведомлений подхватывает, создаёт inbox-карточку, опционально отправляет push (лимит — один в день, тихие часы соблюдаются).
Фронтенд забирает артефакт через аутентифицированный API-вызов. Hub перерисовывается с новым контентом. Если пользователь был офлайн, кэш отдаёт вчерашний вид, новый артефакт появляется при восстановлении связи.
Проиндексированы под запросы, которые они обслуживают.
Записи альбома. Индексы на userId, status, deletedAt. Сначала soft-delete; hard-delete PII через 30 дней.
AI-написанные главы, тело зашифровано. Индексы на personId, userId, generatedAt. Аспектные чипы хранятся отдельным массивом для быстрой фильтрации.
Пользовательские рефлексии, тело зашифровано. Индексы на userId, personId, createdAt. Текстовый индекс по body для поиска. Per-entry флаг «приватно — не давать Luminara».
Четырёхмерные баллы по отношениям. Уникальный индекс на personId. Пересчёт через сервисный вызов после записи главы или дневника.
Строгое правило: события стреляют только после коммита в БД. Кросс-модульные зависимости через symbol-токены, никогда через forwardRef. Никаких прямых service-to-service импортов между feature-модулями.
SoulwiseEvents.CHAPTER_COMPLETED — SoulwiseEvents.CHAPTER_COMPLETED — стреляет после того, как глава зашифрована и сохранена. Notifications-v2 слушает; создаёт inbox-карточку; опционально шлёт push.SoulwiseEvents.JOURNAL_CREATED — SoulwiseEvents.JOURNAL_CREATED — стреляет после того, как запись дневника зашифрована и сохранена. Resonance-сервис слушает; триггерит пересчёт.SoulwiseEvents.PERSON_BIRTH_UPDATED — SoulwiseEvents.PERSON_BIRTH_UPDATED — стреляет после смены birth-data человека. Кэш синастрии инвалидируется.SoulwiseEvents.PUSH_REQUESTED — SoulwiseEvents.PUSH_REQUESTED — по контракту notifications-v2; уважает push-бюджет и тихие часы.119 трассируемых требований, ноль пробелов. Каждое требование мапится вперёд к тест-кейсу (UTP, ITP, STP, E2E) и назад к user-story. 20 user-story. 15 функциональных требований. 12 категорий NFR. 8 глобальных гейтов приёмки.
Генерация главы 30 секунд или быстрее в 95% случаев, измеряется по распределению длительности задачи BullMQ. p99 GET-латентность API ≤ 500 мс при 1000 одновременных пользователях, через k6. Frontend TTI ≤ 3 с на симулированном 4G, через Lighthouse CI.
AES-256-шифрование в покое с платформенным ключом для тел дневника и глав. TLS 1.2+ при передаче; HTTP→HTTPS-редирект. JWT access-токены с 1-часовым lifetime, refresh с 30-дневным, ротация при refresh. Soft-delete с окном 30 дней до hard-delete PII.
prefers-reduced-motion соблюдается глобально — GSAP-анимации становятся opacity-only fades. Метки VoiceOver и TalkBack на каждом интерактивном элементе. Ручная проверка на iOS и Android перед каждым релизом.
Потому что верхний спек переписывает фичу, и переписывание внутри существующего модуля либо сломает v1, либо потребует fork-then-merge позже. Новый модуль оставляет v1 нетронутым, даёт v2 проявиться и чисто мигрирует, когда готов.
Существующий бэкенд My Zodiac AI на MongoDB; переключение — инфра-решение, не связанное с этой фичей. Документная модель также хорошо ложится под главы и записи дневника — вложенные, разной длины, шифрованные как blob.
BullMQ работает на Redis, который уже в стеке для сессий и rate-лимита. Никакой новой инфры. Встроенные retry, timeout, observability покрывают нужды генерации глав без custom-водопровода.
Во внутреннем репо. Числа и контракты на этой странице парафразируют верхние V-Model артефакты. Публичные инженерные посты в блоге My Zodiac AI (тег «cosmic-story-v2») идут глубже в конкретные части сборки.
Пока Soulwise открывает свои волны, наш флагман по астрологии уже у вас в руках.
Астрологический контент предназначен для рефлексии и развлечения. Описанные здесь функции Cosmic Story v2 находятся в разработке; доступность может измениться без уведомления.