Career Quest
Локальная платформа развития сотрудников.
О проекте
Команда: McQueen
Кейс HackAlem.ai: Менеджмент — Halyk Bank · кейс 1
Стадия: Рабочий MVP
Задача кейса: «Career Quest»: AI-навигатор, связывающий навыки сотрудника с шагами развития
Суть
Локальная платформа развития сотрудников. Сотрудник видит активную цель по грейду и до трёх объяснимых активностей, которые закрывают разрывы в навыках. После выполнения активности навыки и маршрут пересчитываются. HR видит дефициты навыков, сотрудников без следующего шага и участие в программах.
Как устроено
Данные кита: skills.json, events.json, employees.json, activity_history.csv. Цель определяется по career_goal или по следующему грейду. Неподходящие события отфильтровываются по аудитории, prerequisites, сессиям и повторяемости. Разрыв считается как требование минус уровень, полезность — как сумма закрываемых разрывов с двойным весом для критичных навыков. Вероятность завершения оценивает эмпирическая байесовская модель по типу и формату события со сглаживанием Beta(1,1) и отдельным учётом личной истории. Сервер на Node.js без зависимостей, с ролевым доступом (scrypt, HttpOnly-cookies).
Ключевые решения
- empirical Bayes completion model
- Beta(1,1) smoothing
- skill gap scoring
- weighted critical skills
- rule-based eligibility filtering
- scrypt auth
Особенности
Рекомендации строит статистическая модель без LLM: эмпирический Байес по типу и формату событий, личная история учитывается отдельно от групповой оценки. Проверяется корректность данных кита: повторные completed для неповторяемых событий не дают повторного прироста навыков. Приложение работает без внешних зависимостей и API.
Стек
Node.js · vanilla JS · HTML/CSS
Проект создан за 5 часов на финале хакатона HackAlem.ai (23 сентября 2026, Астана). Код — BAITC-Hacks/hack-b18d812e-mcqueen.
README
README.mdCareer Quest
Локальная платформа развития сотрудников для кейса 1 HackAlem AI. Сотрудник видит профиль, активную цель развития и до трёх объяснимых следующих шагов. После достижения цели система выбирает следующую и пересчитывает рекомендации. HR видит дефициты навыков, отсутствие следующих шагов и участие в программах.
Запуск
Требуется Node.js 20+. Зависимости устанавливать не нужно.
Windows: откройте start.cmd двойным щелчком. Файл сам выбирает папку проекта,
поэтому ошибка поиска package.json в домашней папке или System32 не возникает.
Можно создать ярлык на этот файл. Оставьте окно открытым на время работы.
Для запуска из терминала перейдите в папку репозитория и выполните:
npm.cmd start
Откройте http://127.0.0.1:3000. На других оболочках работает npm start,
альтернатива — node server.js. Остановка — Ctrl+C. После обновления кода
перезапустите сервер. PORT меняет порт. Приложение слушает только 127.0.0.1.
Без стартового кита запускается синтетический мини-пример demo.json.
Это пробная версия для проверки: ей не нужны API-ключи, платные сервисы
или данные организаторов. В ней три вымышленных сотрудника и четыре активности.
Если приложение ранее использовало стартовый кит, для отдельного демозапуска
откройте новый терминал, убедитесь, что CAREER_QUEST_DATASET не задан и
data/source.json отсутствует, затем укажите новую пустую локальную папку
в CAREER_QUEST_STORAGE. Так существующие данные не будут заменены.
Маршруты /api/... — внутренний интерфейс приложения, а не секретные ключи.
Их исходный код можно хранить в репозитории. Внешних AI API в этой версии нет:
модель рассчитывается локально. Если внешний провайдер будет добавлен позже,
его ключ должен читаться только сервером из окружения, без передачи браузеру.
Файл .env автоматически не загружается текущим сервером.
Локальные .env/.env.*, файлы доступов auth.json и hr-access.txt, состояние
и файлы приватных ключей исключены из Git; шаблоны .env.example и .env.sample
допускаются только с пустыми значениями или очевидными заглушками.
.gitignore не удаляет уже опубликованные секреты из истории: обнаруженный
опубликованный ключ необходимо отозвать у его провайдера.
Для подключения кита при первом запуске укажите папку:
$env:CAREER_QUEST_DATASET = 'C:\путь\career_quest_dataset'
npm.cmd start
В этой папке нужны skills.json, events.json, employees.json и
activity_history.csv. Локальное подключение также можно задать в игнорируемом
data/source.json: объект с полем directory. Уже сохранённое состояние имеет
приоритет над источником; заменить его можно через полный импорт или восстановление
исходного набора в HR-экране. Эти действия требуют подтверждения и сбрасывают прогресс.
Вход и права
При первом запуске создаётся HR-аккаунт с логином hr и случайным кодом.
При каждом запуске через start.cmd или npm.cmd start логин и действующий код
HR выводятся прямо в окне CMD или терминале. Введите их в форме входа.
Код также сохраняется в локальном файле hr-access.txt; путь к нему указан
в том же окне. Если файл удалён или содержит неверный код, аккаунт не сбрасывается:
используйте ранее выданный код. Не публикуйте код и не отправляйте его вместе с проектом.
HR выбирает сотрудника и нажимает «Выдать код доступа». Логин и код показываются один раз в интерфейсе для личной передачи. Повторная выдача отзывает старый код и сессии этого сотрудника. Сотрудник получает только собственный профиль, историю и рекомендации; импорт, сброс, сводки и выдача кодов защищены серверной проверкой роли. Выбор employee_id в запросе не даёт доступ к чужому профилю.
Коды хранятся как scrypt-хеши с солью. Сессии — HttpOnly / SameSite=Strict cookies на 8 часов, в памяти процесса; перезапуск требует повторного входа. Ограничение попыток входа — 20 в минуту с адреса. После импорта и сброса все коды и сессии сотрудников отзываются, HR выдаёт новые. HR-код не меняется.
Инструкция для самостоятельной проверки: docs/jury-demo.md.
На маршруте отдельно показано число завершённых шагов по истории участия. Покрытие и счётчик «навыков на нужном уровне» относятся к активной цели, а не к числу выполненных шагов.
Сценарий для жюри
Следующие цели развития
Маршрут показывает одну активную цель и шаги из каталога, которые закрывают её дефициты. Когда выполнено не менее 80% требований активной цели, появляется предварительный план дальнейшего развития. Порог проверяется по точному значению, до округления процента в интерфейсе.
После достижения всех требований активной становится следующая ещё не достигнутая цель в той же последовательности ролей/грейдов. Требования, процент покрытия и рекомендуемые шаги переключаются на неё. В конце последовательности доступны дополнительные цели по навыкам, для которых каталог содержит полезные добровольные активности. Если каталог не даёт следующего шага, интерфейс предлагает обсудить развитие с HR и дополнить каталог.
Завершение рекомендованной активности применяет её прирост навыков и сохраняет историю. Затем система заново определяет активную цель, доступные шаги и следующие ориентиры. Исходная карьерная цель и фактический грейд в профиле сохраняются: прохождение маршрута не назначает повышение. Ограничения роли, prerequisites, истории и gain/max_level действуют для всех целей. Подключения внешнего API нет.
Пример на demo.json: у «Демо: Алия» завершите «Практикум Python» и «SQL: от запроса
к решению». Покрытие требований Middle станет 87.5% (88% на экране), и появится
предварительная цель Senior. После «Демо для команды» требования Middle выполнены:
активной целью станет Senior, а следующим шагом — «Проект с наставником».
После его завершения система покажет оставшиеся дефициты и отсутствие подходящего
шага в небольшом демокаталоге. Учётные записи и коды доступа создаёт HR.
Основной сценарий
- Войти как HR. Открыть профиль: роль, стаж, фактический грейд, все навыки и требования активной цели; критичные навыки помечены звёздочкой.
- Проверить 1–3 рекомендации: активная цель, разрыв навыка, ожидаемый прирост, история завершений/пропусков/отказов и модельная вероятность завершения.
- Отметить рекомендуемую активность выполненной. Навык изменится согласно gain/max_level, появится запись истории, маршрут и HR-сводки пересчитаются.
- В HR-экране проверить частые разрывы, сотрудников без следующего шага, отсутствие участия за 90 дней и количество записей каждого статуса по событию.
- Импортировать проверочные employees.json и activity_history.csv в режиме «Добавить / заменить профили и их историю». Существующие другие сотрудники сохраняют свой прогресс. Проверить рекомендации для загруженных профилей.
- Выдать код сотруднику, выйти из HR и войти с этим кодом. Доступен только свой профиль, HR-экран отсутствует; сервер также отклоняет чужие операции.
- Перезапустить приложение и повторно войти: данные и прогресс сохраняются.
Данные и импорт
Адаптер читает исходную схему кита: employees.employees, events.events, skills.skills и skills.role_profiles, журнал CSV. Массив сотрудников допустим как отдельный JSON-массив. Уровни навыков — 0–5. Дата среза — 2026-10-01, как указано в README кита; эта дата используется для расписания и HR-аналитики.
В HR-экране выберите файлы с исходными именами (до 8 МБ суммарно):
- Частичный импорт: employees.json + activity_history.csv. Добавляет сотрудников; совпадающий employee_id заменяет профиль и всю его историю. История должна относиться только к загружаемым сотрудникам, но может быть пустой с заголовком CSV.
- Полный импорт: эти два файла + skills.json + events.json. Заменяет весь набор.
Проверяются id и ссылки, роль/грейд, шкала навыков, эффекты, статусы и даты. Ошибка не заменяет текущее состояние. В CSV поддержаны ISO-даты и дд/мм/гггг, кавычки, запятые внутри кавычек и CRLF.
Уровни профиля отражают last_review_date: завершения после этой даты применяются в хронологическом порядке. История ранее или в день оценки не начисляется снова. Повторный импорт того же профиля пересчитывается от исходной оценки, без накопления. В исходном наборе обнаружены повторные completed для неповторяемых мероприятий: они сохраняются для просмотра, но повторный прирост блокируется и учитывается в предупреждениях HR. EV_036 является повторяемым; повторное начисление в один день запрещено. Одинаковые record_id считаются ошибкой импорта.
Рекомендации и локальная AI-модель
Используется локальная эмпирическая Bayesian-модель завершения, без LLM и без внешних API. Это статистическая рекомендательная система, не генеративный чат. AI-агент Codex использовался также при разработке.
- Начальная цель определяется по career_goal, включая смену роли; без неё — по следующему грейду текущей роли: Junior → Middle → Senior → Lead. Достигнутые цели пропускаются, и рекомендации строятся для активной цели. После последнего грейда используются доступные цели по навыкам; новый грейд за пределами каталога не выдумывается.
- Исключаются обязательные события, неподходящая аудитория, невыполненные prerequisites, отсутствующие будущие сессии (кроме self_paced) и уже завершённые неповторяемые активности, а также события со статусом in_progress. Допуск проверяется по текущей роли и грейду, даже если цель предполагает смену роли. После завершения EV_036 новая рекомендация возможна со следующего дня при наличии доступной сессии.
- Разрыв = max(0, требование − уровень). Прирост = max(0, min(уровень + gain, max_level) − уровень). Навык никогда не понижается.
- Полезность = сумма закрываемых уровней разрывов, с двойным весом critical_skills.
- Модель обучается на completed и no_show/declined/dropped добровольных событий,
группируя наблюдения по типу и формату. in_progress/overdue не считаются исходом.
Средняя вероятность группы сглажена Beta(1,1). Личная история исключается
из групповой оценки, затем добавляется отдельно с весом априорной оценки 2:
p = (2 * prior + личные завершения) / (2 + личные завершения + личные неуспехи). - Оценка = полезность × (0.25 + 0.75 × p). При равенстве — порядок id. Выдаётся до трёх положительных вариантов. После завершения модель обновляется.
Минимальный вес 0.25 сохраняет возможность развития даже после пропусков. Личная история не превращается в запрет на обучение. Объяснение перечисляет реальные факторы расчёта и не генерирует неподтверждённых фактов. Для сотрудника без истории показывается, что использована сглаженная оценка. Вероятности не калиброваны на отдельной тестовой выборке; это прогноз, а не гарантия завершения.
Выбор следующего шага
На вкладке «Все шаги» сотрудник может просмотреть доступные активности, отфильтровать их по навыку и добавить один шаг в личный план. Доступность и пользу для цели проверяет сервер; выбор сохраняется после перезапуска и не начисляет навыки. После выполнения шага его место занимают актуальные рекомендации с учётом обновлённого прогресса.
Шаги берутся из подключённого каталога. При отсутствии подходящих активностей система показывает оставшиеся требования и необходимость согласовать следующий шаг с HR. Сохранённые в старых версиях отметки шаблонной практики не используются как подтверждение навыков, не учитываются в прогрессе и не отображаются в маршруте.
HR и приватность
HR получает частоту дефицитов по навыкам; список профилей без рекомендаций с причинами (последний грейд, требования выполнены, нет подходящего события); список без записей участия за 90 дней; статусы по активностям. Это записи участия, а не уникальные люди: повторные посещения клуба учитываются отдельно. Публичных рейтингов сотрудников и баллов за обязательные процессы нет. Другим сотрудникам профили и вовлечённость не выдаются. Повышение грейда не происходит автоматически.
Датасет хакатона не включён в текущее дерево файлов Git и не отправляется приложением во внешние сервисы. Файлы, добавленные в старых коммитах, остаются в истории репозитория; её переписывание не выполнялось.
Имена и записи в demo.json и тестах придуманы для этого приложения.
Состояние и доступы по умолчанию находятся вне OneDrive, в системной временной
папке career-quest-<идентификатор проекта>; точный путь печатается при старте.
Эта папка переживает перезапуск, но ОС может её очистить. Для долговременного
хранения задайте CAREER_QUEST_STORAGE на разрешённую локальную папку без
облачной синхронизации. В data/ репозитория хранятся только игнорируемая конфигурация
подключения и локальные вспомогательные файлы. Старое data/state.json предыдущей
версии автоматически не мигрируется и не удаляется.
Источник кита может находиться в OneDrive: приложение читает его локально, но не управляет синхронизацией исходной папки. Соблюдение запрета на вынос данных требует хранить сам кит в разрешённом организаторами месте без синхронизации.
Архитектура и проверка
Node.js HTTP + HTML/CSS/JavaScript, без сторонних зависимостей и сборки.
- server.js — локальный сервер, вход, сессии, права, хранение и API.
- lib/dataset.js — адаптер исходных JSON/CSV и частичный импорт.
- lib/domain.js — требования, эффекты активностей, рекомендации, HR-сводки.
- lib/intelligence.js — обучение и предсказание локальной Bayesian-модели.
- public/ — адаптивный интерфейс сотрудника и HR.
- tests/ — бизнес-логика, импорт и HTTP-проверки доступа на независимых примерах.
npm.cmd test
Тесты проверяют сложный профиль с низким навыком и повторными пропусками, критичные требования грейда, ограничения мероприятий, доначисление после оценки, идемпотентность импорта, повторы, права сотрудника/HR и сохранение при перезапуске.
API: POST /api/login, /api/logout, /api/complete, /api/plan, /api/access (HR), /api/import (HR), /api/reset (HR); GET /api/state (только разрешённые профили). POST принимает JSON, сессия передаётся cookie. Изменение из другого Origin запрещено.
Ограничения и сдача
Локальный MVP: нет SSO, производственного HTTPS, журнала аудита и подтверждения прохождения наставником. Кнопка завершения моделирует прохождение; даты фиксированы срезом набора, календарь сессий не исполняется как реальная система регистрации. Интерфейс русский, названия из кита остаются на языке источника. career_goal определяет целевые требования; без неё используется следующий грейд текущей роли. Не все дефициты смены роли можно закрыть мероприятиями, доступными в текущей роли. Рекомендации — отдельные варианты, без оптимизации совместного учебного плана. Использование именно LLM не реализовано; качество локального статистического подхода предстоит оценить на закрытых профилях жюри. Запускайте один сервер на каталог состояния; шифрования файлов на диске нет. Владельцы ОС имеют доступ к локальным файлам, серверное разграничение не защищает от владельца компьютера.
Публичной развёрнутой версии нет.
Авторы коммитов
История коммитов
- 2026-09-23 17:18Recommend continuous development steps and advance completed goalsMakerBreak3r
- 2026-09-23 17:01Distinguish completed practice from target skill requirementsdeksiplay
- 2026-09-23 16:56Complete practice without a survey and show persistent completion statusdeksiplay
- 2026-09-23 16:43prod2MakerBreak3r
- 2026-09-23 16:33Integrate task selection and supplemental practice with development goalsdeksiplay
- 2026-09-23 16:19prod1MakerBreak3r
- 2026-09-23 16:13basic3MakerBreak3r
- 2026-09-23 15:49Organize career dashboards and sort employee listsdeksiplay
Все коммиты (13)
- 2026-09-23 15:04basic2MakerBreak3r
- 2026-09-23 14:33basicMakerBreak3r
- 2026-09-23 14:04Delete career_quest_dataset directoryMakerBreak3r
- 2026-09-23 13:59Add files via uploadMakerBreak3r
- 2026-09-23 13:55testMakerBreak3r
Структура репозитория (23 файлов)
.gitignore README.md demo.json docs/api-contract.md docs/jury-demo.md docs/team-plan.md docs/verification.md lib/dataset.js lib/domain.js lib/intelligence.js package.json public/app.js public/index.html public/style.css server.js start.cmd tests/dataset.test.js tests/domain.test.js tests/growth-http.test.js tests/growth.test.js tests/hr-access.test.js tests/progression.test.js tests/server.test.js
Обсуждение 0 комментариев
Войдите, чтобы комментироватьПока нет комментариев — будьте первым.