AAYMA
RU
Войти

Career Quest

Streamlit-приложение Career Quest с аккаунтами и ролями (сотрудник/HR/админ): портфолио и XP, лепестковая диаграмма оценки HR, сертификаты на…

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

О проекте

Команда: NCSI
Кейс HackAlem.ai: Менеджмент — Halyk Bank · кейс 1
Стадия: Рабочий MVP

Задача кейса: «Career Quest»: AI-навигатор, связывающий навыки сотрудника с шагами развития

Суть

Streamlit-приложение Career Quest с аккаунтами и ролями (сотрудник/HR/админ): портфолио и XP, лепестковая диаграмма оценки HR, сертификаты на одобрение, интерактивная карта развития с подбором внешних курсов через GPT-5.

Как устроено

Данные кита (200 сотрудников, 60 навыков, 40 событий) загружаются в локальные SQLite (accounts, dataset, growth), core-движок строит рекомендации. HR выставляет 6 характеристик и одобряет сертификаты, которые дают XP и +1 к навыкам. Фоновый GPT-5 с бюджетом расходов подбирает 1–3 направления и курсы для карты развития с кэшем на неделю. Курсы из карты формируют общий маршрут и заявки HR.

Ключевые решения

  • scrypt-хеширование паролей
  • ролевая авторизация
  • XP-геймификация
  • бюджетирование AI-запросов
  • интерактивная карта развития

Особенности

Цикл одобрения HR (сертификат → подтверждение → XP и прирост навыка) и учёт расходов на AI-поиск курсов с журналом бюджета; граф кодовой базы задокументирован через graphify.

Стек

Python · Streamlit · SQLite · JavaScript · HTML/CSS

Модели

GPT-5


Проект создан за 5 часов на финале хакатона HackAlem.ai (23 сентября 2026, Астана). Код — BAITC-Hacks/hack-34251801-ncsi.

README

README.md

Career Quest · HackAlem AI / Halyk Bank

Карьерный навигатор с портфолио сотрудника, оценкой HR и заявками на обучение. Стартовая база: 200 сотрудников, 60 навыков, 40 событий и 2 743 записи истории из case/case_1/career_quest_dataset (срез 2026-10-01). При обычном запуске используются настоящий core и данные кита.

Установка и запуск из GitHub

Нужны Git, Python 3.11+ с поддержкой hashlib.scrypt и доступ в интернет для первоначальной установки зависимостей. База данных работает локально: сервер БД, Docker и внешние сервисы не нужны. Каждый скачавший репозиторий получает собственную базу, а не доступ к данным других установок.

git clone https://github.com/BAITC-Hacks/hack-34251801-ncsi.git
cd hack-34251801-ncsi
python -m venv .venv

Активируйте окружение: Windows PowerShell — .\.venv\Scripts\Activate.ps1, macOS/Linux — source .venv/bin/activate. Затем установите зависимости:

python -m pip install -r requirements.txt

Одна команда запуска из корня репозитория:

python -m streamlit run app.py

Откройте http://localhost:8501. Если PowerShell не разрешает активацию, вызывайте .\.venv\Scripts\python.exe вместо python; на macOS/Linux можно использовать .venv/bin/python. Другой порт задаётся аргументом --server.port 8503. Конфигурация репозитория слушает только 127.0.0.1 и отключает сбор статистики Streamlit.

При обычном первом запуске приложение создаёт локальные SQLite-файлы и предлагает создать первого администратора. Придумайте свои имя, почту и пароль: автоматического рабочего аккаунта или стандартного пароля нет. Для локального показа можно отдельно создать четыре демоаккаунта командой ниже. После создания администратор автоматически входит в «Пользователи». При следующих запусках открывается форма входа. Исходные 200 профилей сотрудников загружаются из кита один раз; аккаунты для этих профилей автоматически не создаются.

Без API-ключа работают регистрация, вход, профиль, XP, карта, импорт, сертификаты, решения HR и рекомендации core. Для поиска внешних курсов нужен ключ; вымышленные результаты не подставляются. Приложение автоматически читает локальный .env рядом с app.py. Переменные окружения процесса имеют приоритет, включая пустые значения. После установки зависимостей обычные локальные сценарии не требуют внешних сервисов.

Быстрый показ: четыре готовых демоаккаунта

После установки зависимостей выполните из корня репозитория:

python -m auth.manage seed-demo
python -m streamlit run app.py

Команда создаёт аккаунты в вашей локальной SQLite. Общий публичный пароль для всех четырёх: [скрыто]. Введите почту и пароль: приложение само откроет раздел сохранённой роли аккаунта.

ПочтаРоль аккаунтаПрофиль
[email protected]АдминистраторУправление пользователями и импорт
[email protected]HRЗаявки, обязательное обучение, оценки и обзор команды
[email protected]СотрудникE0001
[email protected]СотрудникE0002

Оставьте CAREER_QUEST_DEMO_MODE=0: эти аккаунты проходят настоящий вход с паролем, проверкой роли и сохранением прогресса. Форму создания первого администратора после seed-demo заполнять не нужно. Команда повторяется безопасно: уже созданные демоаккаунты, их пароли, роли, привязки и прогресс не сбрасываются. Если почта уже принадлежит другому аккаунту, профиль занят или в dataset нет E0001 / E0002, команда завершится с ошибкой без частичного добавления аккаунтов.

Это публичные учётные данные для локального показа. Для собственных данных используйте обычную регистрацию и личные пароли. seed-demo не запускается автоматически; каждый скачавший репозиторий выполняет её сам. Файлы SQLite и API-ключи в GitHub не публикуются.

Аккаунты и роли

  • Сотрудник регистрируется на странице входа. До привязки профиля он видит сообщение о необходимости настройки администратором; чужие профили недоступны. После привязки доступны собственные профиль и XP, сертификаты, треки, маршрут, карта, навыки и история.
  • HR получает роль от администратора: рассматривает заявки и сертификаты, назначает обязательное обучение, обновляет оценки и просматривает команду. Подбор курсов использует общий план сотрудника и тот же бюджет AI.
  • Администратор открывает «Пользователи», назначает роли и связывает аккаунт с employee_id, импортирует данные и просматривает состояние приложения.

Для входа нужны только почта и пароль. Приложение определяет роль по аккаунту в базе и открывает соответствующий раздел. Регистрация создаёт только сотрудника. Роль и привязка читаются из SQLite; при изменении аккаунта его сессии отзываются. Пароли хранятся в виде scrypt-хешей с индивидуальной солью. Подробности, локальные команды управления и ограничения — в auth/README.md.

Кнопка выхода в верхней части основной страницы доступна всем ролям, включая администратора, даже при свёрнутом боковом меню. Она завершает текущую сессию. После обновления вкладки может понадобиться повторный вход; постоянных cookies и функции «запомнить меня» нет. Сам выход и перезапуск сервера не удаляют аккаунты, импортированные профили и выполненные шаги.

Для отдельного показа интерфейса сохранён явный режим CAREER_QUEST_DEMO_MODE=1: свободный выбор роли и профиля без проверки личности. Это демонстрационная навигация, не аутентификация. По умолчанию режим выключен. В деморежиме импорт профилей и истории кита живёт в сессии; маршрут внешних курсов, назначения HR, сертификаты и расходы AI сохраняются в SQLite. Выберите отдельную папку CAREER_QUEST_DATA_HOME, если не хотите менять рабочие данные обучения. auth_app.py остаётся самостоятельным экраном проверки регистрации; для полного приложения запускайте app.py.

Где находится база и как сохранить данные

Файл по умолчаниюЧто сохраняет
.career-quest/accounts.sqlite3Аккаунты, хеши паролей, роли, привязки профилей и сессии
.career-quest/dataset.sqlite3Данные стартового кита, импортированные профили и история, завершённые активности
.career-quest/growth.sqlite3Оценки HR, сертификаты и подтверждения для XP, заявки и обязательные назначения, выбор и скрытие курсов, планы и расходы AI

SQLite создаёт файлы сама при запуске; отдельные учётные данные БД не нужны. Файлы принадлежат владельцу локальной установки и исключены из Git. Приложение не публикует их через GitHub. При обновлении кода используйте ту же папку данных: повторный запуск не пересоздаёт существующую базу и не повторяет начальную загрузку кита. Изменение CAREER_QUEST_DATA_DIR после инициализации не заменяет сохранённый dataset. Схема хранилища имеет версию; неизвестная версия вызывает ошибку, а не перезапись данных.

CAREER_QUEST_DATA_HOME меняет общую папку. Относительные пути считаются от корня проекта, где находится app.py. Переменные CAREER_QUEST_AUTH_DB, CAREER_QUEST_DATASET_DB и CAREER_QUEST_GROWTH_DB задают отдельные файлы. При стандартных путях сохраняется прежняя база аккаунтов auth/.local/auth.sqlite3, если она уже есть. Отличная от стандартной папка CAREER_QUEST_DATA_HOME создаёт отдельную установку; значения конкретных *_DB имеют приоритет над общей папкой. Фактические пути показаны администратору в «Состояние приложения».

Резервная копия: остановите сервер (Ctrl+C), скопируйте всю .career-quest/ в защищённое место, а при использовании старой базы — также auth/.local/. Если пути переопределены, копируйте указанные каталоги и файлы. Храните .env отдельно, если нужны его настройки; в нём могут быть ключи. Для восстановления при остановленном сервере верните все БД из одного комплекта копии и запустите приложение с теми же путями. Копия содержит персональные данные и хеши аккаунтов; не добавляйте её в репозиторий.

Чтобы перенести установку на другой компьютер, достаточно кода той же версии, зависимостей и этой копии данных. Чтобы начать независимую установку, используйте новую пустую CAREER_QUEST_DATA_HOME. Не удаляйте БД для обновления кода: вместе с данными теряется и накопленный журнал расходов AI.

Сценарий сотрудника и HR

  1. Войти с аккаунтом HR → Оценка сотрудника: выбрать человека в боковом меню, задать дату выхода и шесть характеристик от 0 до 5. Сохранить. Для следующего шага выйти и войти с привязанным аккаунтом сотрудника. Характеристики: стрессоустойчивость, коммуникация, инициативность, аналитика, самоорганизация, командная работа.
  2. Сотрудник → Профиль и опыт: увидеть лепестковую диаграмму и XP. Пока HR не оценил сотрудника, диаграмма показывает пустую сетку. За каждый полный день с даты выхода начисляется 10 XP; будущая дата даёт 0 XP. Каждые 1 000 XP — следующий игровой уровень. Профиль обновляется раз в минуту; XP вычисляется по текущей дате, отдельный фоновый планировщик не нужен.
  3. Мои сертификаты: указать пройденный курс, провайдера, ссылку, дату, подтверждение и темы/навыки. Заявка остаётся на рассмотрении; опыт и навыки пока не меняются.
  4. HR → Заявки и решения: одобрить сертификат или отклонить с причиной. Одобрение даёт 100 XP и выбранный HR прирост +1 для навыков каталога, максимум до уровня 5. Можно подтвердить курс без повышения навыков. Повторное начисление исключено.
  5. Карта развития: при первом открытии фоновый GPT-5 подбирает 1–3 направления и несколько вариантов курсов. Сохранённый результат используется неделю. Нажмите узел, чтобы увидеть объяснение, фактические основания и источник; доступны масштабирование, перемещение, сворачивание и клавиатура (стрелки, Enter, +/−).
  6. Хочу этот курс добавляет курс в общий маршрут и заявку HR. Можно выбрать несколько курсов, скрыть неподходящий, восстановить его, посмотреть другие варианты или предложить свою HTTPS-ссылку. Повторный выбор открывает существующую заявку.
  7. HR → Назначить обучение: выбрать сотрудника, использовать его сохранённый AI-план или запустить тот же ограниченный поиск. «Назначить обязательным» сразу добавляет курс в маршрут как согласованный; можно оставить пояснение или назначить курс по своей HTTPS-ссылке. Сотрудник видит отметку обязательности и начинает обучение; отмена и замена этого назначения ему недоступны. HR может назначить ранее отклонённый или отменённый курс: используется существующая заявка. Завершённое обучение при повторном назначении не сбрасывается.
  8. Мой маршрут: для добровольного курса доступны отмена заявки до отправки сертификата и выбор другого курса; после согласования HR — начало обучения. «Завершить обучение» открывает форму сертификата. Для добровольных и обязательных курсов только последующее подтверждение сертификата HR добавляет XP и подтверждённый прирост навыков. Отказы и отмены не уменьшают XP.

В «Треки и курсы» каждое направление выделено отдельным блоком с нумерацией, навыками и карточками курсов для сравнения. «Фильтр по направлению» показывает выбранное направление и число вариантов; «Все направления» или «Сбросить фильтр» возвращает полный список. Фильтр сохраняется при переходах. Кнопка карты «Сравнить курсы направления» сразу открывает нужный блок. На компьютере варианты стоят в двух колонках, на телефоне — друг под другом.

Карта, «Треки и курсы» и маршрут читают один план. Выбранные курсы и решения HR сохраняются после обновления AI. Новые подтверждённые навыки помечают план устаревшим и предлагают ручное обновление; изменение портфолио само не отправляет запрос.

Дата выхода, оценки, сертификаты, решения, выбранные курсы, AI-планы и журнал расходов сохраняются в growth.sqlite3. Импорт и история кита сохраняются отдельно в dataset.sqlite3. БД и секреты исключены из Git.

AI, поиск и бюджет

Новый подбор использует gpt-5 с reasoning.effort=low, OpenAI Responses, Structured Outputs и один вызов web_search. Поиск ограничен сайтами учебных провайдеров: Microsoft Learn, Coursera, edX, Cisco, TryHackMe, Hack The Box, AWS и другие. Курс допускается в ответ только при совпадении URL с источником поиска и разрешённым доменом. Это проверка источника, не независимая оценка качества курса; актуальную стоимость нужно уточнять у провайдера.

Модель получает роль, грейд, цель, навыки, подтверждённые курсы и оценки HR. Имя, employee_id, дата выхода и поле подтверждения сертификата не отправляются. Свободный текст названий/тем включается в запрос — не помещайте туда секреты. Поисковый запрос должен содержать учебную тему, без персональных данных.

Ограничение расходов

  • Общий лимит приложения: $5; на запрос: $0,10. Переменные окружения могут только уменьшить эти значения.
  • До сети проверяется консервативная оценка токенов и поиска; оценка выше лимита блокирует запрос. В транзакции SQLite резервируется полный лимит запроса. Одновременные запросы используют общий журнал расходов.
  • Один поиск, максимум 3 000 выходных токенов включая рассуждения, без автоматических повторов после ошибки. Навигация и выбор курса ничего не отправляют; исключение — первый/недельный автоподбор при открытии карты.
  • План кешируется на 7 дней на сотрудника. Ручное обновление — явный новый запрос с паузой 60 секунд между попытками. Ошибка требует ручного повтора. Устаревшие предложения остаются видимыми; выбранные курсы и HR-решения не удаляются.
  • Сотрудник и HR читают один сохранённый план. Недельный кеш, пауза между запросами и журнал расходов общие; смена роли не запускает отдельный подбор.
  • После ответа стоимость считается по usage. При таймауте или неизвестной стоимости весь резерв учитывается как потраченный. После перезапуска расход сохраняется; старый неизвестный расход 0,10 USD не обнуляется.
  • Запрос выполняется фоном, ожидание HTTP ограничено 90 секундами. Можно пользоваться другими разделами. При ошибке показаны её безопасный код и идентификатор запроса (если провайдер его вернул), сохранённый план и объяснение core.

Тарифы GPT-5: $1,25 за миллион входных и $10 за миллион выходных токенов; поиск — $0,01 за вызов плюс входные токены поискового контекста. Скидка кеширования в оценке не предполагается. Источники: модель, поиск, тарифы.

Предел оценки: web_search не предоставляет числового лимита поисковых токенов. Приложение закладывает 24 000 токенов контекста, ограничивает собственный ввод, ответ и число поисков. Поэтому 0,10 USD — лимит допуска по оценке и резерв, а не гарантированный провайдером потолок списания. Если usage всё же превысит резерв, расход записывается полностью и повтор не выполняется. Для жёсткого ограничения платежей нужен отдельный лимит проекта у провайдера.

Журнал — консервативная оценка приложения, не баланс аккаунта OpenAI. Вызовы других приложений и экземпляров с отдельной БД не входят в этот лимит. При изменении тарифов провайдера расчёт нужно обновить. При восстановлении БД из старой копии восстанавливается и старый журнал расходов.

Переменные окружения

Скопируйте .env.example в .env в корне проекта и задайте нужные значения в локальном файле. Ключи в .env.example должны оставаться пустыми. Пример без секретов:

CAREER_QUEST_DATA_DIR=case/case_1/career_quest_dataset
CAREER_QUEST_DEMO_MODE=0
# CAREER_QUEST_DATA_HOME=.career-quest
# CAREER_QUEST_AUTH_DB=.career-quest/accounts.sqlite3
# CAREER_QUEST_DATASET_DB=.career-quest/dataset.sqlite3
CAREER_QUEST_GROWTH_BUDGET_USD=5.00
CAREER_QUEST_GROWTH_REQUEST_USD=0.10
# CAREER_QUEST_GROWTH_DB=.career-quest/growth.sqlite3
OPENAI_API_KEY=
CAREER_QUEST_AI_PROVIDER=none
CAREER_QUEST_AI_MODEL=
CAREER_QUEST_AI_TIMEOUT=8
NVIDIA_API_KEY=

Локальный .env исключён из Git; не добавляйте его или ключи в отслеживаемые файлы. Настройки также можно задать в окружении сервера: они имеют приоритет над .env. После изменения .env или переменных окружения полностью перезапустите сервер Streamlit. Пример ввода ключа в PowerShell без записи значения в историю команд:

$apiSecret = Read-Host 'OpenAI API key' -AsSecureString
$env:OPENAI_API_KEY = [System.Net.NetworkCredential]::new('', $apiSecret).Password
.\.venv\Scripts\python.exe -m streamlit run app.py

CAREER_QUEST_AI_PROVIDER, CAREER_QUEST_AI_MODEL, CAREER_QUEST_AI_TIMEOUT и NVIDIA_API_KEY сохранены для старого API первой модели. Новый интерфейс использует управляемый AI-подбор из growth_ai.py; старый AI-переранжировщик при отображении страниц не запускается. Для нового поиска достаточно OPENAI_API_KEY, модель фиксирована для предсказуемого расчёта цены.

Живой GPT-5 + web_search проверен 2026-09-23. Первая попытка была отклонена валидатором (два поисковых элемента, учтено 0,05740 USD). После уточнения инструкции контрольная попытка завершилась с одним поиском: два направления и четыре курса, 10 992 входных и 2 822 выходных токена, включая 2 112 токенов рассуждений. Консервативно учтено 0,05196 USD. Все четыре страницы дополнительно открыты и проверены: IBM Back-End Development, DevOps Automation CI/CD, OpenAPI Specification, API Development and Architecture.

Итог локального журнала после проверки — 0,20936 USD, включая прежние 0,10 USD неизвестного расхода. Ключи и персональные данные в отчёт не включены. Количество результатов и релевантность для других портфолио зависят от доступных источников.

Архитектура

Streamlit / app.py
    → auth/service.py        # SQLite: аккаунты, роли, привязки, сессии
    → ui/persistent_adapter.py # проверка роли, привязки и сохранение изменений
        → ui/core_adapter.py
            → core/api.py        # детерминированные сценарии кита
            → core/growth.py # HR, SQLite, XP, подтверждённое портфолио
                → core/engine.py
                → core/growth_ai.py # GPT, поиск, валидация, кеш, бюджет
    → storage/               # сохранение dataset в локальной SQLite

UI показывает ответы backend и передаёт команды через адаптер. Требования грейда, разрывы, prerequisites и gain/max_level рассчитывает core. AI используется для объяснения направления развития и поиска внешних курсов; он не начисляет уровни и не подтверждает сертификаты. Слой хранения сохраняет результаты движка и не вводит собственных формул рекомендаций.

ФайлНазначение
app.pyВход, разделы сотрудника, HR и администратора
storage/config.pyЛокальные пути хранения и переменные окружения
auth/service.py, auth/ui.pyАккаунты, роли, сессии, формы входа и регистрации
auth/integration_ui.pyПервый администратор и управление пользователями
auth/demo_ui.py, auth/demo_session.pyЯвный демонстрационный режим
auth_app.py, auth/manage.pyОтдельный экран и серверные команды управления аккаунтами
storage/dataset.pyТранзакционное хранение dataset в SQLite
ui/persistent_adapter.pyПроверка сессии, роли и владельца профиля; актуальные данные SQLite для команд развития
ui/core_adapter.py, ui/adapter.pyИнтеграция и совместимый фасад
ui/growth_views.pyДиаграмма, XP, сертификаты, фильтр направлений, маршрут и обязательные назначения HR
ui/components.py, styles/main.cssПредставление и читаемая светлая тема
ui/map_component.py, ui/map_frontend/Интерактивная карта Streamlit v2, локальные JS/CSS/HTML
ui/development_map.pyСовместимость старой карты для изолированных тестов кита
core/growth.py, core/growth_ai.pyНовые сценарии и ограниченный AI-поиск
CORE_NOTES.mdИсходный контракт и формулы первой модели
ui/checks/, auth/checks/, storage/checks/, tests/Проверки интеграции, аккаунтов, хранения и движка
ui/demo_adapter.pyЯвная заглушка UI-тестов; обычный запуск её не использует

Прогресс и отрисовка

Исходный движок рассчитывает требования следующего грейда, навыки и детерминированные объяснения. Интерфейс использует подтверждённый снимок GrowthService.snapshot: навыки стартового кита плюс подтверждённые HR сертификаты. Предлагаемые AI будущие навыки не получают выдуманных уровней или gain.

Каждый раздел отрисовывается только когда активен. Уведомления и страница имеют постоянные контейнеры; изменения выполняются callbacks до отрисовки. Завершение обучения больше не вызывает st.rerun() из середины карточки. Выбранная вкладка и вид карты сохраняются. Обновление XP раз в минуту ограничено фрагментом профиля, опрос фонового подбора — отдельным фрагментом.

Импорт проверочного профиля

Войти с аккаунтом администратора, открыть «Импорт данных». Можно загрузить профиль JSON, историю CSV или оба файла вместе. Кнопка «Скачать пример профиля» формирует профиль с новым ID JURY_001. После импорта в «Пользователи» привязать профиль к зарегистрированному аккаунту сотрудника. Выйти и войти с этим аккаунтом: он проходит через тот же core, что профили кита. Импорт сохраняется после выхода и перезапуска приложения.

  • employees.json: объект {"employees": [...]} или массив профилей. Поля: employee_id, full_name, department, role, grade, manager_id, hire_date, tenure_months, work_format, preferred_language, career_goal, skills, last_review_date. Навыки — словарь ID → целое 0–5.
  • activity_history.csv: record_id,employee_id,event_id,date,due_date,status,completion_pct,score,feedback_rating,assigned_by.
  • Статусы: completed, in_progress, dropped, no_show, declined, overdue. UTF-8, до 10 МБ на файл.

Профили и история проверяются совместно, включая ссылки между файлами одного импорта. Существующие ID не перезаписываются; неверный импорт не меняет dataset. Каталоги навыков/событий этой формой не импортируются. Импорт сохраняется целиком в локальной SQLite только после успешной проверки core. После перезапуска дополнительный профиль остаётся доступен с тем же ID; повторный импорт для восстановления сессии не нужен.

Проверки

python -m unittest discover -s tests -v
python -m unittest discover -s ui/checks -p "test_*.py" -v
python -m unittest discover -s auth/checks -p "test_*.py" -v
python -m unittest discover -s storage/checks -p "test_*.py" -v

AI-тесты подставляют ответы API; платных вызовов не делают. Проверяются 200 профилей кита, прирост и ограничения навыков, импорт и откат ошибок, XP по дням, сохранение оценок, одобрение/отказ сертификата, защита от повторного начисления, запрос курса и решение HR, кеш, источники, таймаут и одновременное резервирование бюджета. Streamlit AppTest проходит новые сценарии целиком с отдельной временной БД.

Дополнительные браузерные проверки в ui/checks/browser_check.py, theme_check.py и growth_browser_check.py предназначены для демонстрационной навигации. Они не заменяют проверку настоящего входа и не должны выполняться на рабочей базе. Установка дополнительных инструментов:

python -m pip install playwright==1.63.0
python -m playwright install chromium
python -m ui.checks.interactive_browser_check
python -m ui.checks.track_filter_browser_check

Полный изолированный interactive_browser_check проходит: вход → настоящие клики по SVG → клавиатура/масштаб/перемещение/сворачивание → выбор двух курсов → отказ/восстановление → своя ссылка/отмена → HR → начало → сертификат → подтверждение → 200 → 300 XP без повторного начисления → все вкладки и роли → импорт профиля. Проверены сохранение узла/масштаба, отсутствие старых карточек и data-stale после отрисовки, а также два интервала таймера по 64 секунды на профиле и после ухода с него. Тест использует отдельную SQLite и подставной транспорт; платных вызовов нет.

track_filter_browser_check проверяет два направления, сохранение и сброс фильтра, переход с карты, колонки на компьютере и расположение карточек на телефоне. Дополнительный сценарий: HR назначает обязательный курс → сотрудник видит назначение без отмены и замены → начинает обучение. XP и число AI-запросов не меняются. Проверка запускает собственный сервер с временной SQLite и подставным планом; скриншоты сохраняются во временную папку.

browser_check --url <адрес> выполняет чтение экранов на отдельном сервере с CAREER_QUEST_DEMO_MODE=1. theme_check --url <адрес> также требует этот явный режим демонстрации. theme_check проверяет контраст в четырёх сочетаниях системной и сохранённой темы; минимум по выполненной проверке — 4,60:1. Старый growth_browser_check также проверяет отказ HR и сохранение после перезагрузки. Скриншоты сохраняются во временную папку из вывода команды.

Graphify

Установленный Graphify используется для карты связей проекта, документации, адаптера и core. Результаты в graphify-out/: graph.json, graph.html, GRAPH_REPORT.md, GRAPH_HEALTH.md. Это средство анализа кода; рекомендации сотрудникам рассчитывает backend. Ограничения извлечения описаны в отчётах.

Оставшиеся ограничения

  • Это локальный прототип с собственными аккаунтами, не корпоративная IAM-система. Нет подтверждения почты, восстановления пароля, SSO и MFA. Первый запуск предназначен владельцу компьютера; сервер по умолчанию доступен только локально. Режим свободного выбора роли включается только явно для демонстрации.
  • Оценки и решения сохраняются, но полной истории редактирования HR-профиля нет. Доказательство сертификата — ссылка или номер, без загрузки/автоматической проверки документа.
  • Сотрудник не создаёт новую заявку на тот же курс после отказа или отмены. HR может вернуть такую заявку в согласованное состояние, назначив курс обязательным. Повторное назначение не обнуляет уже завершённое обучение. Отклонённый сертификат можно исправить и отправить повторно; XP за курс начисляется единожды.
  • HR-обзор разрывов учитывает подтверждённые навыки. Таблица участия и «История участия» пока показывают события кита; внешние курсы доступны отдельно в маршруте и сертификатах.
  • Эвристики core не откалиброваны на скрытых профилях жюри. Проценты показывают покрытие требований, не вероятность повышения. История кита использует дату среза датасета.
  • GPT-5 может вернуть недостаточно источников или ответ, который не проходит проверку. Такой ответ не становится планом; доступны объяснение core, сохранённые курсы и ручное обновление. Ограничение оценки расходов описано выше.
Звёзды
⭐ 0
Форки
0
Язык
HTML
Последний push
в прошлом месяце
Коммиты
39
Авторы
2
Файлы
109
Ветки
8

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

nursultan-boop 28nedanilka 11

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

  • 2026-09-23 17:54docs(graphify): map merged auth storage and shared growth workflowsnursultan-boop
  • 2026-09-23 17:54merge: retain automatic account roles and accessible logoutnursultan-boop
  • 2026-09-23 17:52docs: refresh setup and complete employee HR and admin workflowsnursultan-boop
  • 2026-09-23 17:50feat(hr): assign mandatory courses through shared research and routenursultan-boop
  • 2026-09-23 17:44test(ui): verify visible direction filters on desktop and mobilenursultan-boop
  • 2026-09-23 17:41fix(ui): group course directions and expose explicit filternursultan-boop
  • 2026-09-23 17:38merge: retain authenticated roles and persistent datasets with growth workflownursultan-boop
  • 2026-09-23 17:30test(ui): verify interactive learning lifecycle and role navigationnursultan-boop
Все коммиты (39)
  • 2026-09-23 17:30fix(growth): diagnose provider responses and verify live course searchnursultan-boop
  • 2026-09-23 17:25feat(ui): connect interactive map and HR-approved personal routenursultan-boop
  • 2026-09-23 17:20feat(growth): persist shared route and background GPT-5 researchnursultan-boop
  • 2026-09-23 16:43feat(config): load ignored local env without overriding server variablesnursultan-boop
  • 2026-09-23 16:15docs(graphify): map approved growth workflow and metered AI researchnursultan-boop
  • 2026-09-23 16:11fix(ui): prevent caption overlap and show readable current AI budgetnursultan-boop
  • 2026-09-23 16:07docs(growth): document setup budgets and verified HR browser flownursultan-boop
  • 2026-09-23 16:06fix(growth): keep simulated completions outside approved portfolionursultan-boop
  • 2026-09-23 16:01fix(growth): render radar and enforce course plan validitynursultan-boop
  • 2026-09-23 15:49feat(ui): add HR radar portfolio approvals and learning requestsnursultan-boop
  • 2026-09-23 17:43Merge login role detection and accessible logout fixesnedanilka
  • 2026-09-23 17:42Fix automatic account role login and always accessible logoutnedanilka
  • 2026-09-23 15:40feat(growth): add persistent HR approvals XP and budgeted course researchnursultan-boop
  • 2026-09-23 17:29Merge reproducible demo accounts and README login instructionsnedanilka
  • 2026-09-23 17:29feat(auth): add reproducible demo accounts and documented shared credentialsnedanilka
  • 2026-09-23 17:20Merge local SQLite, authenticated roles and durable progressnedanilka
  • 2026-09-23 17:19feat(storage): add autonomous SQLite setup, account roles and persistent progressnedanilka
  • 2026-09-23 16:56Merge role entry with Career Quest employee, HR and admin workflowsnedanilka
  • 2026-09-23 14:51fix(ui): keep light surfaces readable under dark browser themesnursultan-boop
  • 2026-09-23 16:45feat(auth): integrate demo role entry with employee, HR and admin workflowsnedanilka
  • 2026-09-23 14:31docs(graphify): map verified UI core and AI integrationnursultan-boop
  • 2026-09-23 14:29fix(ui): remove collapsed HR caption margin and verify boundsnursultan-boop
  • 2026-09-23 14:28fix(ui): keep HR caption clear of its data tablenursultan-boop
  • 2026-09-23 14:27test(ui): verify real core fallback and joint jury importsnursultan-boop
  • 2026-09-23 16:20feat(auth): add standalone Halyk-style signup and role-verified loginnedanilka
  • 2026-09-23 14:18feat(integration): connect Career Quest UI to upstream core APInursultan-boop
  • 2026-09-23 14:06feat(ui): build employee HR and jury screens with tested interactionsnursultan-boop
  • 2026-09-23 13:51feat(ui): add isolated core adapter and tested preview contractnursultan-boop
  • 2026-09-23 13:42initial tasknursultan-boop
  • 2026-09-23 15:21feat(ui): integrate development map with latest light-theme designnedanilka
  • 2026-09-23 14:02Build Career Quest UI, starter-kit engine and optional guarded AI providernedanilka
Структура репозитория (109 файлов)
.env.example
.gitignore
.streamlit/config.toml
CORE_NOTES.md
README.md
app.py
auth/.gitignore
auth/README.md
auth/__init__.py
auth/checks/test_demo_seed.py
auth/checks/test_demo_session.py
auth/checks/test_profile_accounts.py
auth/checks/test_resilience.py
auth/checks/test_service.py
auth/checks/test_ui.py
auth/demo_seed.py
auth/demo_session.py
auth/demo_ui.py
auth/integration_ui.py
auth/manage.py
auth/service.py
auth/styles.css
auth/ui.py
auth_app.py
case/__MACOSX/._case_1
case/__MACOSX/case_1/._.DS_Store
case/__MACOSX/case_1/._career_quest_dataset
case/__MACOSX/case_1/career_quest_dataset/._README.kz.md
case/__MACOSX/case_1/career_quest_dataset/._README.md
case/__MACOSX/case_1/career_quest_dataset/._README.ru.md
case/__MACOSX/case_1/career_quest_dataset/._activity_history.csv
case/__MACOSX/case_1/career_quest_dataset/._employees.json
case/__MACOSX/case_1/career_quest_dataset/._events.json
case/__MACOSX/case_1/career_quest_dataset/._skills.json
case/case_1/.DS_Store
case/case_1/career_quest_dataset/README.kz.md
case/case_1/career_quest_dataset/README.md
case/case_1/career_quest_dataset/README.ru.md
case/case_1/career_quest_dataset/activity_history.csv
case/case_1/career_quest_dataset/employees.json
case/case_1/career_quest_dataset/events.json
case/case_1/career_quest_dataset/skills.json
core/__init__.py
core/ai.py
core/api.py
core/demo.py
core/engine.py
core/growth.py
core/growth_ai.py
graphify-out/BENCHMARK.md
graphify-out/GRAPH_HEALTH.md
graphify-out/GRAPH_REPORT.md
graphify-out/INTEGRATION_QUERY.md
graphify-out/VALIDATION.json
graphify-out/cost.json
graphify-out/diagnostics.final.json
graphify-out/diagnostics.json
graphify-out/extraction.json
graphify-out/graph.html
graphify-out/graph.json
graphify-out/integration_query_raw.txt
graphify-out/manifest.json
graphify-out/source_manifest.json
graphify-out/task_docx_extracted.txt
requirements.txt
storage/__init__.py
storage/checks/test_config.py
storage/checks/test_dataset.py
storage/config.py
storage/dataset.py
styles/main.css
task.docx
tests/test_ai.py
tests/test_demo_api.py
tests/test_starter_kit.py
tests/test_ui.py
ui/__init__.py
ui/adapter.py
ui/checks/__init__.py
ui/checks/browser_check.py
ui/checks/browser_login_helpers.py
ui/checks/demo_login_helpers.py
ui/checks/growth_browser_check.py
ui/checks/interactive_browser_check.py
ui/checks/test_adapter.py
ui/checks/test_app.py
ui/checks/test_core_integration.py
ui/checks/test_demo_routing.py
ui/checks/test_development_map.py
ui/checks/test_growth.py
ui/checks/test_growth_research.py
ui/checks/test_growth_ui.py
ui/checks/test_growth_workflow.py
ui/checks/test_mandatory_training.py
ui/checks/test_map_component.py
ui/checks/test_persistent_adapter.py
ui/checks/test_persistent_login.py
ui/checks/theme_check.py
ui/checks/track_filter_browser_check.py
ui/components.py
ui/core_adapter.py
ui/demo_adapter.py
ui/development_map.py
ui/growth_views.py
ui/map_component.py
ui/map_frontend/map.css
ui/map_frontend/map.html
ui/map_frontend/map.js
ui/persistent_adapter.py
Ветки (8)

Обсуждение 0 комментариев

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

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