AAYMA
RU
Войти

Career Quest

Локальная платформа развития сотрудников.

Рабочий MVP
Команда «McQueen» 4💬 0 комментариевс 23 сентября 2026 г.

О проекте

Команда: 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.md

Career 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.

Основной сценарий

  1. Войти как HR. Открыть профиль: роль, стаж, фактический грейд, все навыки и требования активной цели; критичные навыки помечены звёздочкой.
  2. Проверить 1–3 рекомендации: активная цель, разрыв навыка, ожидаемый прирост, история завершений/пропусков/отказов и модельная вероятность завершения.
  3. Отметить рекомендуемую активность выполненной. Навык изменится согласно gain/max_level, появится запись истории, маршрут и HR-сводки пересчитаются.
  4. В HR-экране проверить частые разрывы, сотрудников без следующего шага, отсутствие участия за 90 дней и количество записей каждого статуса по событию.
  5. Импортировать проверочные employees.json и activity_history.csv в режиме «Добавить / заменить профили и их историю». Существующие другие сотрудники сохраняют свой прогресс. Проверить рекомендации для загруженных профилей.
  6. Выдать код сотруднику, выйти из HR и войти с этим кодом. Доступен только свой профиль, HR-экран отсутствует; сервер также отклоняет чужие операции.
  7. Перезапустить приложение и повторно войти: данные и прогресс сохраняются.

Данные и импорт

Адаптер читает исходную схему кита: 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 использовался также при разработке.

  1. Начальная цель определяется по career_goal, включая смену роли; без неё — по следующему грейду текущей роли: Junior → Middle → Senior → Lead. Достигнутые цели пропускаются, и рекомендации строятся для активной цели. После последнего грейда используются доступные цели по навыкам; новый грейд за пределами каталога не выдумывается.
  2. Исключаются обязательные события, неподходящая аудитория, невыполненные prerequisites, отсутствующие будущие сессии (кроме self_paced) и уже завершённые неповторяемые активности, а также события со статусом in_progress. Допуск проверяется по текущей роли и грейду, даже если цель предполагает смену роли. После завершения EV_036 новая рекомендация возможна со следующего дня при наличии доступной сессии.
  3. Разрыв = max(0, требование − уровень). Прирост = max(0, min(уровень + gain, max_level) − уровень). Навык никогда не понижается.
  4. Полезность = сумма закрываемых уровней разрывов, с двойным весом critical_skills.
  5. Модель обучается на completed и no_show/declined/dropped добровольных событий, группируя наблюдения по типу и формату. in_progress/overdue не считаются исходом. Средняя вероятность группы сглажена Beta(1,1). Личная история исключается из групповой оценки, затем добавляется отдельно с весом априорной оценки 2: p = (2 * prior + личные завершения) / (2 + личные завершения + личные неуспехи).
  6. Оценка = полезность × (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 не реализовано; качество локального статистического подхода предстоит оценить на закрытых профилях жюри. Запускайте один сервер на каталог состояния; шифрования файлов на диске нет. Владельцы ОС имеют доступ к локальным файлам, серверное разграничение не защищает от владельца компьютера.

Публичной развёрнутой версии нет.

Звёзды
⭐ 0
Форки
0
Язык
JavaScript
Последний push
в прошлом месяце
Коммиты
13
Авторы
2
Файлы
23
Ветки
1

Авторы коммитов

MakerBreak3r 9deksiplay 4

История коммитов

  • 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 комментариев

Войдите, чтобы комментировать

Пока нет комментариев — будьте первым.