soulwise_persons
Записи альбома. Индексы по userId, status, deletedAt. Сначала мягкое удаление; жёсткое удаление персональных данных через 30 дней.
Для инженеров, PM, журналистов и партнёрских скаутов. Полный конвейер, четыре MongoDB-коллекции, EDA-события, V-Model-строгость, цели производительности, безопасность и доступность — всё на одной странице.
У каждого шага есть сервис, контракт и событие.
Действие пользователя — «сгенерировать сегодняшнюю главу для Sister» — или запланированная задача cron, например воскресный обзор в 9 утра или обновление погоды каждые 6 часов.
Задача попадает в очередь BullMQ с именем soulwise-chapter-generation, с жёстким таймаутом 28 секунд. Долгие задачи останавливаются и помечаются как «попробовать ещё».
Сервис ChapterGenerationService объединяет промпт из 4 факторов — контекст человека, астрологию, сигнал и ритм — в 1 единый ввод. Никакие персональные данные пользователя не попадают в промпт в исходном виде; всё предварительно очищается.
Вызывается AI-провайдер через symbol-токен AI_GENERATION_ADAPTER — провайдер сменный. Ответ проверяется по длине, форме и безопасности перед продолжением.
Происходит четыре вещи: классификатор кризиса проверяет язык; экстрактор аспектных чипов вытягивает 1–3 чипа; фильтр anti-claim вычищает запрещённые формулировки; тело шифруется AES-256 с платформенным ключом.
Артефакт записывается в соответствующую коллекцию MongoDB — главы, записи дневника, резонансы — с индексами по userId и personId для быстрого поиска. Сначала мягкое удаление; жёсткое удаление персональных данных через 30 дней.
Событие EventEmitter2 — CHAPTER_COMPLETED, JOURNAL_CREATED — срабатывает после коммита в БД. Модуль уведомлений подхватывает, создаёт inbox-карточку, опционально отправляет push (лимит — один в день, тихие часы соблюдаются).
Фронтенд забирает артефакт через аутентифицированный API-вызов. Hub перерисовывается с новым контентом. Если пользователь был офлайн, кэш отдаёт вчерашний вид, новый артефакт появляется при восстановлении связи.
Проиндексированы под запросы, которые они обслуживают.
Записи альбома. Индексы по userId, status, deletedAt. Сначала мягкое удаление; жёсткое удаление персональных данных через 30 дней.
AI-написанные главы, тело зашифровано. Индексы на personId, userId, generatedAt. Аспектные чипы хранятся отдельным массивом для быстрой фильтрации.
Пользовательские рефлексии, тело зашифровано. Индексы на userId, personId, createdAt. Текстовый индекс по body для поиска. Per-entry флаг «приватно — не давать Luminara».
4-мерные оценки для каждой связи. Уникальный индекс по 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 находятся в разработке; доступность может измениться без уведомления.