AI-интервьюер собирает профиль за разговор. Затем выгружает PDF под каждую вакансию.
«Один профиль. Резюме под каждую позицию.» Подробный профиль заполняется один раз (разговором с AI-интервьюером или импортом), дальше под каждую вакансию AI собирает отдельный PDF с нужными акцентами.
Из чего состоит продукт
DevMatch AI — приложение для подготовки профиля кандидата. Ядро ценности — профиль: он заполняется один раз и переиспользуется бесконечно — под каждую целевую роль AI генерирует отдельное PDF-резюме, сам расставляя акценты. Разговор с AI-интервьюером — механизм, который делает глубокое заполнение безболезненным.
Авторизация и хранение резюме — через внешний сервис nefron-mic. У каждого пользователя один профиль; роли user/admin приходят с сервера.
От разговора до PDF
aАвторизация и сессия⌄
bПрофиль пользователя⌄
cAI-интервьюер (двухпроходный агент)⌄
dХранение переписок (чатов)⌄
eИмпорт резюме (PDF / DOCX → профиль)⌄
fЭкспорт PDF под роль (двухпроходный: составитель + рецензент)⌄
gСинхронизация резюме с сервером⌄
hРоли и админ-функции⌄
iОнбординг и обучающий тур (короче до продукта)⌄
jВзвешенный прогресс, стадии и «Следующий шаг»⌄
kEvent-лог для фокус-группы⌄
Что готово, что ограничено
Выкатано в прод (весь nefron-стек, проверено вживую)
Реальная авторизация через nefron (AES-256-CBC)
Профили на пользователя + гидрация резюме при логине
Роли user/admin
Синхронизация всего резюме + стоимость на сервер — проверено вживую
Резюме целиком (все секции: контакты, роли, навыки, опыт, проекты, образование, ожидания + накопленная стоимость в overview.cost) отправляется на сервер пакетом с гэпом (5с после последнего изменения, ретраи при сбое) и подтягивается обратно при входе. Проверено на проде: полный round-trip без потерь. Пол кодируется в 1 символ под серверную колонку.
Накопленная стоимость запросов — только админу (бейдж в баре + сумма в чате)
Экспорт всех чатов в CSV (только админ)
Трекинг токенов по сообщениям
Кинопоказ-онбординг (заполняет профиль из ответов) + обучающий тур (по разу, галочки в настройках)
Автосохранение полей без кнопки «Сохранить» + отметка «Сохранено» у поля
Единый формат дат (ДД.ММ.ГГГГ в UI, ISO на сервер) + аккуратный выбор в календаре
Загрузка резюме и экспорт PDF вынесены в шапку
Редактирование профиля в нескольких вкладках (блокировка убрана, last-write-wins)
Карточки категорий показывают полный текст (перенос, без обрезки)
Публичный лендинг на «/» для гостей + обогащённая страница входа
Незалогиненный гость на «/» видит лендинг (демо «разговор → поля заполняются», «один профиль → резюме под роль», призыв попробовать); залогиненный — сразу редактор. Страница входа: фактура, ценности, показ/скрытие пароля. Навигация между «/», /about и /login замкнута в обе стороны.
Полноценная мобильная версия редактора
На экранах уже 1024px редактор перестраивается: вместо сайдбара — горизонтальная рельса разделов с кольцами прогресса, чат с AI-интервьюером открывается снизу выезжающим листом по кнопке в нижнем баре. Пока агент пишет в профиль, лист сам сжимается в полоску — «магия» заполнения полей видна и на телефоне. Лендинг, вход, /about и онбординг тоже адаптированы; раскладка на 390px проверяется автоматически (layout-чекер).
Плавная анимация записи агентом (без «дёрганья»)
Подсветка раздела и поля при записи AI теперь включается и гаснет плавно (мягкий вход свечения, эластичные переходы между фазами), смена раздела — спокойный кроссфейд, автоподстройка высоты текстовых полей больше не «резинит» при печати.
Синхронизация: локально сразу, на сервер — с гэпом, при входе побеждает полная версия
Каждая правка мгновенно сохраняется локально (в шапке — «сохранено»), а на сервер nefron резюме уходит целиком пакетом: через 5 секунд после последнего изменения, максимум через 15 секунд непрерывной активности — сервер не бомбардируется запросом на каждое поле. Если отправка падает, в шапке появляется «сервер недоступен · повторяем» и отправка ретраится до успеха; ошибки логируются. При входе локальная и серверная версии сравниваются по количеству заполненных полей — источником правды становится более полная (в норме они одинаковы; это защита от потери данных: если сервер отдал огрызок, локальная копия не затирается, а отправляется на сервер). Версии резюме хранит сервер — локальных бэкапов нет. Корректность закреплена тестами (пустой, частичный, полный профиль, мусорные значения, потолок отправки) и живым round-trip на реальном сервере.
Фото профиля: загрузка, круговой кроп, локальное хранение
В «Общих сведениях» вместо текстовой ссылки на фото — настоящая загрузка: кликом или перетаскиванием файла (JPEG/PNG/WebP). Фото ужимается до 1280px по длинной стороне ещё в браузере, затем пользователь выбирает в круге нужную область (двигает и приближает). На сервере приложения хранится необрезанный оригинал под уникальным именем (UUID), привязанный к пользователю; в интерфейсе показывается выбранный круг. Область круга можно поменять в любой момент без повторной загрузки файла. На сервер nefron фото не отправляется.
Компактные карточки полей: два состояния и поля по два в ряд
Короткие поля (пол, дата рождения, город, гражданство, уровень, зарплата и т.п.) больше не растягиваются на всю ширину карточки — они идут парами в ряд. Карточки разделов с несколькими записями (места работы, проекты, образование) получили два состояния: свёрнутая — одна строка со сводкой (например, «Компания · Должность» и счётчик заполненности) без полей ввода, развёрнутая — привычные поля. Заполненные карточки по умолчанию свёрнуты (три места работы — три строки вместо трёх экранов), новые пустые открыты, а когда AI пишет в свёрнутую карточку — она раскрывается сама, чтобы запись была видна.
Связи между карточками — настоящий пикер
Поле «Кейсы» в «Рабочем опыте» и «Методах и инструментах» теперь привязывает существующие карточки раздела «Проекты и кейсы» через выпадающий список с галочками (раньше было текстовое поле с подсказкой, которая на телефонах не работала). Ссылка на переименованную/удалённую карточку подсвечивается жёлтым. На сервер связи уходят прежним форматом — списком названий.
Новое позиционирование: «Один профиль. Резюме под каждую позицию.»
По плану продакт-менеджера (демо для фокус-группы): hero лендинга продаёт актив (профиль) и результат (резюме под позицию), а не механизм («поговори с AI»); секция «1 профиль → 3 резюме» поднята сразу под hero с болевым заголовком «Хватит переписывать резюме под каждую вакансию» и контр-аргументом к «а я просто попрошу ChatGPT»; тексты STATS, карточки «Под вакансию» и финального CTA переписаны честно; кикер логина повторяет слоган.
Гейт экспорта: чек-лист вместо «заполните на 80%»
Вместо абстрактного процента — конкретный минимум: имя, целевая роль, место работы (компания + должность), навыки. Закрытая кнопка показывает прогресс («PDF · 46%»), поповер — чек-лист недостающего, каждый пункт кликабелен («спросить в чате» — открывает раздел и кидает вопрос агенту). После минимума экспорт разрешён с честной подсказкой, что добавить; с «Хорошего резюме» — полный режим.
Взвешенная полнота + стадии + виджет «Следующий шаг»
Процент — по весам fill-priority (важные поля двигают сильнее), стадии «Минимум/Хорошее/Сильное» с тостами на пересечении, в сайдбаре и на мобильной рельсе — одна детерминированная подсказка «Дальше: …» с кнопкой «спросить в чате».
Онбординг 5→3 сцены, тур 7→4 шага, развилка «импорт или разговор»
Кино сокращено до «результат → общайся → попробуй сам» (~90 секунд), тур — до 4 шагов с честным текстом про экспорт. Починена гонка: интервью стартует только после записи собранного онбордингом (агент не переспрашивает имя/роль). Пустому профилю чат один раз предлагает загрузить старое резюме вместо разговора — самый быстрый путь к ценности.
Резюме: тезисы + кейсы по местам работы + агент-рецензент
Промпт экспорта требует по каждому месту работы 3–5 конкретных тезисов и привязанные кейсы из «Проектов»; шаблонные фразы запрещены; саммари — из авторского «О себе». После генерации — второй проход агента-рецензента (соответствие роли, шаблонность, выдумки) с возвратом исправленного документа.
Event-лог воронки (для фокус-группы) + админ-выгрузка
События login / onboarding / tour / first_message / import / fill_percent-чекпоинты / export_locked_click / export_done / session_end пишутся в сайдкар рядом с профилем; админ скачивает общий JSON одной кнопкой. Внешних аналитик-SDK нет.
HTTPS: истёкший TLS-сертификат
TLS-сертификат nefron-mic истёк (+ не загружен pdo_mysql) — работаем по http (server-to-server, на работу приложения не влияет). Нужен новый сертификат на стороне nefron.
saveresume падает целиком из-за одного «неподходящего» поля (robustness)
Если поле не лезет в колонку БД, весь запрос падает PHP-фаталом и не сохраняется ничего. Наши известные триггеры устранены (пустой массив — пофикшен на сервере; gender — кодируем в 1 символ у нас). Остаётся пожелание серверу: не ронять весь save из-за одного поля. Отчёт: docs/nefron-save-robustness-report.md.