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