AAYMA
RU
Войти

Career Quest — «Мой рост»

Веб-приложение в оболочке Halyk «Мой рост»: сотрудник видит профиль, грейд, карьерную цель, навыки против требований роли и историю активностей.

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

О проекте

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

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

Суть

Веб-приложение в оболочке Halyk «Мой рост»: сотрудник видит профиль, грейд, карьерную цель, навыки против требований роли и историю активностей. Есть экран оператора для смены даты сценария.

Как устроено

При старте официальный набор (200 сотрудников, 60 навыков, 40 активностей, 2 743 записи истории) загружается в PostgreSQL через Alembic и seed. FastAPI с серверными сессиями (HttpOnly cookie, хэш токена в БД) отдаёт /api/me/profile, React-SPA через nginx показывает сравнение уровней навыков с требованиями роли и грейда. По README дерево пока декоративное, рекомендации и тесты не реализованы. Коммиты при этом упоминают рекомендации активностей с AI и rules fallback, генерацию тестов через OpenAI и RAG-поиск.

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

  • сравнение навыков с требованиями роли и грейда
  • серверные сессии с хэшированным токеном
  • слоистая архитектура domain/application/infrastructure
  • RAG-поиск (по коммитам)

Особенности

Подробные QA-отчёты с доказательствами (тайминги браузера, sha256 датасета, логи рестарта). README честно разделяет реализованное и дизайн-прототипы. Команда начала с прототипа ветрового прогноза и потом переключилась на Career Quest.

Стек

React 19 · Vite 6 · Lucide React · nginx · Python 3.12 · FastAPI · SQLAlchemy 2 · psycopg 3 · PostgreSQL 16 · Alembic · Docker Compose

Модели

OpenAI


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

README

README.md

Career Quest — «Мой рост»

Career Quest — демонстрационное веб-приложение для карьерного развития сотрудников с интерфейсом Halyk «Мой рост». Оно объединяет текущую должность и грейд, карьерную цель, навыки, требования роли и историю обучающих активностей. Сотрудник может увидеть свою текущую позицию, сопоставить навыки с требованиями и понять, на что обратить внимание при дальнейшем развитии.

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

В репозитории реализованы вход через синтетические учётные записи, навигация по сервису «Мой рост», просмотр личного профиля и управление датой демонстрации. Все люди и компании в наборе вымышлены.

Быстрый запуск для проверяющего

Что потребуется

  • Docker Desktop либо Docker Engine с плагином Docker Compose v2; Docker должен быть запущен.
  • Браузер и свободный локальный порт 8080.
  • Интернет при первой сборке для загрузки образов и зависимостей.

Устанавливать Python, Node.js или PostgreSQL на компьютер отдельно не нужно. Для текущего инкремента внешние API-ключи и файл .env не требуются.

Запуск

  1. Скачайте репозиторий или распакуйте архив проекта.

  2. Откройте терминал в корне проекта — рядом с docker-compose.yml.

  3. Проверьте доступность Docker и запустите приложение:

    docker --version
    docker compose version
    docker compose up -d --build
    
  4. Проверьте состояние контейнеров:

    docker compose ps
    

    Ожидается: db и api имеют статус healthy, web — Up. Первая сборка может занять несколько минут.

  5. Откройте http://localhost:8080.

При старте автоматически создаётся база PostgreSQL, применяются миграции Alembic и загружается официальный набор данных версии 1.0. Повторный запуск не дублирует исходные записи.

Дополнительная проверка API (в браузере или через curl):

curl -fsS http://localhost:8080/api/health

Ответ должен содержать "status":"ok", "dataset_version":"1.0" и "as_of_date":"2026-10-01". Если оператор ранее менял дату, вернётся сохранённая дата сценария.

Сценарий проверки

1. Вход и профиль сотрудника

  1. На стартовом экране введите в поиск E0003 или другой ID, имя, роль либо подразделение из набора.
  2. Нажмите на найденного сотрудника. Пароль не нужен: это демонстрационный выбор учётной записи.
  3. В оболочке Halyk откройте сервис «Мой рост», затем вкладку «Профиль». Проверьте ID, имя, должность, грейд и подразделение выбранного сотрудника.
  4. Посмотрите карьерную цель, навыки с текущими уровнями и требованиями роли, а также историю активностей со статусами.
  5. Обновите страницу: выбранная учётная запись должна сохраниться в пределах срока сессии (4 часа).
  6. Нажмите «Выйти», чтобы вернуться к выбору аккаунта и открыть другого сотрудника, например E0174.

Отсутствие карьерной цели у части сотрудников — допустимое состояние исходных данных. Профиль показывает все навыки и записи истории, возвращённые API. Поиск доступен по всем 200 сотрудникам, одновременно в списке выводятся до 8 результатов.

2. Дата демонстрации

  1. Вернитесь к выбору учётной записи и нажмите «Войти как оператор».
  2. Установите дату 2026-10-15 и нажмите «Сохранить дату».
  3. Вернитесь к выбору аккаунта и откройте профиль сотрудника: в верхней панели должна отображаться новая дата.
  4. Снова войдите оператором и нажмите «Вернуть 1 октября», чтобы восстановить исходный сценарий.

Дата сценария хранится в базе. Её изменение не затрагивает системные часы, официальные файлы данных и само по себе не пересчитывает навыки.

3. Проверка ограничения доступа

Запрос без cookie сессии:

curl -i http://localhost:8080/api/me/profile

Ожидаемый статус — 401 Unauthorized. Учётная запись сотрудника может читать только собственный профиль; запрос чужого профиля через /api/employees/{employee_id} возвращает 403 Forbidden. Демо-оператор имеет отдельные права. Выбор аккаунта без пароля предназначен для демонстрации и не является производственной аутентификацией.

Возможности и границы текущей версии

Реализованы:

  • поиск и выбор из 200 синтетических учётных записей;
  • оболочка Halyk и сервис «Мой рост» с вкладками «Дерево», «Тесты», «Цели», «Профиль» и «Halyk»;
  • профиль с данными сотрудника из синтетического набора, карьерной целью, навыками и историей;
  • сравнение текущих уровней навыков с требованиями текущей роли и грейда, отметки критичных навыков;
  • просмотр сохранённой карьерной цели и истории активностей со статусами, процентом завершения и оценками;
  • серверные сессии: в HttpOnly cookie хранится случайный токен, в PostgreSQL — его хэш;
  • отдельный экран оператора для изменения и сброса даты сценария;
  • сохранение данных между перезапусками контейнеров;
  • адаптивная вёрстка веб-клиента.

Дерево пока декоративное: XP и уровни дерева не рассчитываются. Вкладка «Тесты» показывает состояние недоступности, а «Цели» позволяет только читать сохранённую цель. Прохождение и генерация тестов, редактирование целей, персональный план развития, рекомендации активностей и подтверждение рабочего результата не реализованы.

Отдельные рабочие представления руководителя, HR и аналитика относятся к следующим инкрементам. Хотя API распознаёт руководителей в наборе данных, их учётные записи сейчас также открывают только собственный профиль. Банковские операции не подключены. Android WebView запланирован, готового Android-приложения в репозитории нет.

HTML-файлы career-quest-*.html и career-tree-*.html в корне — отдельные дизайн-прототипы, включая варианты для сотрудника, руководителя, HR и мобильного экрана. Их возможности не означают наличие соответствующих функций в React-приложении. Для проверки работающего приложения используйте Docker Compose и адрес http://localhost:8080.

Технологии и архитектура

  • Frontend: React 19, Vite 6, Lucide React; собранный клиент раздаёт nginx.
  • Backend: Python 3.12, FastAPI, SQLAlchemy 2, psycopg 3.
  • База данных: PostgreSQL 16, миграции Alembic.
  • Запуск: Docker Compose, три сервиса: web, api, db.

Браузер обращается к nginx на порту 8080; nginx раздаёт SPA и проксирует /api/ в FastAPI. API работает с PostgreSQL. Наружу опубликован только веб-сервис на 127.0.0.1:8080.

flowchart LR
    Browser["Браузер · React SPA"] -->|"HTTP · localhost:8080"| Web["web · nginx"]
    Web -->|"/api/*"| API["api · FastAPI"]
    API -->|"SQLAlchemy / psycopg"| DB[("db · PostgreSQL")]
    Dataset["data/official"] -->|"Загрузка при старте API"| DB

Backend организован в несколько небольших слоёв:

  • HTTP — api/app/main.py: маршруты API, вход и выход, проверка сессий и прав, управление датой демонстрации.
  • Прикладной слой — application/: ProfileService получает профиль через интерфейс ProfileRepository и формирует подпись карьерной цели.
  • Домен — domain/: модель CareerGoal и правила представления цели без зависимости от HTTP и базы.
  • Хранение — infrastructure/, models.py, db.py: реализация репозитория на SQLAlchemy, модели таблиц и подключение к PostgreSQL. Репозиторий собирает сотрудника, требования роли, названия навыков, историю и дату сценария.

При открытии профиля React запрашивает /api/me/profile; FastAPI проверяет cookie сессии, вызывает прикладной сервис и возвращает данные из PostgreSQL. Управление сессиями и датой пока работает непосредственно в HTTP-слое. При старте контейнера API последовательно выполняются миграции Alembic, загрузка набора через app.seed и запуск Uvicorn.

Данные и структура репозитория

Официальный синтетический набор версии 1.0 содержит 200 сотрудников, 40 активностей, 60 навыков, 32 профиля роли/грейда и 2 743 записи истории. Дата среза — 1 октября 2026 года, период истории — с 1 октября 2024 года по 30 сентября 2026 года.

Остановка и повторный запуск

Остановить и удалить контейнеры, сохранив данные:

docker compose down

Повторно запустить:

docker compose up -d --build

Данные и дата сценария сохраняются в Docker volume postgres_foundation_data (Compose добавляет к имени префикс проекта). Обычный docker compose up пересобирает API и веб-интерфейс с использованием кеша сборки, затем запускает миграции и загружает исходные данные только при первом запуске.

Эта версия использует отдельный том для схемы foundation. Старый том postgres_data, который мог использоваться ветками с более новыми миграциями, сохраняется без изменений и автоматически не подключается. При первом запуске после перехода на отдельный том приложение получит новый демо-набор; данные старой базы не переносятся. При добавлении несовместимой линии миграций используйте отдельный том, а не общую базу для разных версий схемы.

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

docker compose down -v
docker compose up -d --build

Если приложение не запускается

  • Docker недоступен: запустите Docker Desktop или службу Docker и повторите запуск.

  • Порт 8080 занят: остановите использующее его приложение или измените привязку в docker-compose.yml, например на 127.0.0.1:8081:80, затем откройте http://localhost:8081.

  • Страница не открывается или API возвращает ошибку: проверьте состояние и логи:

    docker compose ps
    docker compose logs --tail=100 api db web
    
  • Ошибка загрузки образов или зависимостей: проверьте интернет и повторите docker compose up -d --build.

  • После изменения пароля PostgreSQL API не подключается: переменная окружения не меняет пароль в уже созданной базе. Верните прежний пароль либо выполните полный сброс демо, если сохранённые данные не нужны.

Для локальной демонстрации используются значения по умолчанию из Compose. При настройке другого окружения задайте собственные POSTGRES_PASSWORD и случайный SESSION_SECRET в .env до первого запуска. Текущий вход без пароля рассчитан на локальную проверку синтетических данных.

Проверки и описание интерфейса

Основной React-интерфейс использует вариант A «Живое дерево» из ui-three-askarbek. Источник UI, ограничения и порядок проверок описаны отдельно.

  • scripts/acceptance/foundation.py — HTTP-проверка входа, профиля, прав доступа и даты демонстрации.
  • scripts/acceptance/growth-ui.cjs — браузерные проверки интерфейса, состояний ошибок и адаптивной вёрстки.
  • npm --prefix web run build — проверка production-сборки клиента после установки зависимостей в web/.

Проверки даты меняют данные: для них используйте отдельный Compose-проект и базу, как описано в инструкции по проверкам.

Звёзды
⭐ 0
Форки
0
Язык
HTML
Последний push
в прошлом месяце
Коммиты
53
Авторы
5
Файлы
97
Ветки
15

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

killthistinker 38ilayqq 9Maxim Popovich 4Kana Ybyrayev 2Akana92 1

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

  • 2026-09-23 17:59updatekillthistinker
  • 2026-09-23 17:48update readmekillthistinker
  • 2026-09-23 17:43Show full-screen Higgsfield trees with earned test badgesilayqq
  • 2026-09-23 17:42fix: isolate foundation database and rebuild Compose serviceskillthistinker
  • 2026-09-23 17:37Merge remote-tracking branch 'origin/main'killthistinker
  • 2026-09-23 17:34Merge pull request #31 from BAITC-Hacks/codex/issue-30-halyk-growth-uiMaxim Popovich
  • 2026-09-23 17:33test: reuse foundation acceptance checks for #30killthistinker
  • 2026-09-23 17:33feat: migrate Halyk growth UI from variant A for #30killthistinker
Все коммиты (53)
  • 2026-09-23 17:30feat: migrate Halyk growth UI from variant A for #30killthistinker
  • 2026-09-23 17:28Build full-screen skill tree, live demo controls and author-managed testsilayqq
  • 2026-09-23 17:24feat: add interactive career skill tree demo and launch guideAkana92
  • 2026-09-23 17:18test: record scoped main acceptance evidence for #27killthistinker
  • 2026-09-23 17:11Merge pull request #29 from BAITC-Hacks/codex/prototype-career-map-10Maxim Popovich
  • 2026-09-23 17:10fix: wire private comparisons into API and role screens (#25)killthistinker
  • 2026-09-23 17:10Merge pull request #28 from BAITC-Hacks/codex/issue-15-app-foundationMaxim Popovich
  • 2026-09-23 17:08feat: add private cohort comparisons (#25)killthistinker
  • 2026-09-23 17:08feat: add independent direct-manager development consents (#24)killthistinker
  • 2026-09-23 17:07feat: explain personal and team demo work scores (#23)killthistinker
  • 2026-09-23 17:05Add role-based OpenAI skill test generation labilayqq
  • 2026-09-23 17:00feat: preview apply and reset jury dataset imports (#20)killthistinker
  • 2026-09-23 16:59feat: approve quarterly employee work goals (#21)killthistinker
  • 2026-09-23 16:54feat: add privacy-protected HR learning summary (#19)killthistinker
  • 2026-09-23 16:54Ignore local RAG configuration and Python cachesilayqq
  • 2026-09-23 16:51Prototype Halyk employee growth mini-appilayqq
  • 2026-09-23 16:47fix: address recommendation review and startup readiness (#18)killthistinker
  • 2026-09-23 16:44feat: recommend verified career activities with AI and rules fallback (#18)killthistinker
  • 2026-09-23 16:40Prototype four separate Career Quest reference screens; verdict pending user reviewkillthistinker
  • 2026-09-23 16:39Address forecast review and imported participation completion (#17)killthistinker
  • 2026-09-23 16:37docs: add employee UI features and monthly skill-tree assessmentKana Ybyrayev
  • 2026-09-23 16:36Implement activity forecast and completion lifecycle (#17)killthistinker
  • 2026-09-23 16:31feat: show career trajectory and calculated skill levels (#16)killthistinker
  • 2026-09-23 16:28feat: add Career Quest application foundation for issue #15killthistinker
  • 2026-09-23 16:03Adapt career map prototype for desktop webkillthistinker
  • 2026-09-23 15:58Refresh career route prototype from UI referencekillthistinker
  • 2026-09-23 15:48Place AI explanation inside career route stepkillthistinker
  • 2026-09-23 15:47Make career route the primary prototype layoutkillthistinker
  • 2026-09-23 15:42docs(career-quest): add consolidated requirements and gamification planKana Ybyrayev
  • 2026-09-23 15:39Prototype career map decision flowskillthistinker
  • 2026-09-23 15:38Add local RAG workflow UI prototypeilayqq
  • 2026-09-23 15:35update contextkillthistinker
  • 2026-09-23 15:12Build Dockerized RAG search engine with API and QAilayqq
  • 2026-09-23 14:49docs: verify Career Quest requirements and starter datasetkillthistinker
  • 2026-09-23 14:39updatew skillskillthistinker
  • 2026-09-23 14:27Replace wind Halyk concept with Career Quest research and UIkillthistinker
  • 2026-09-23 14:20Merge Halyk SuperApp prototype workkillthistinker
  • 2026-09-23 14:19Add Halyk SuperApp wind dashboard research and prototypekillthistinker
  • 2026-09-23 14:15docs: expand repository READMEilayqq
  • 2026-09-23 14:14docs: add Codex write checkilayqq
  • 2026-09-23 14:14Merge pull request #1 from BAITC-Hacks/prototypesMaxim Popovich
  • 2026-09-23 14:11added prototypeskillthistinker
  • 2026-09-23 14:10Prototype Career Quest feature extensionskillthistinker
  • 2026-09-23 13:43Add Career Quest UI prototypekillthistinker
  • 2026-09-23 13:42Add throwaway wind forecast UI prototypekillthistinker
Структура репозитория (97 файлов)
.gitignore
README.md
api/.dockerignore
api/Dockerfile
api/alembic.ini
api/app/__init__.py
api/app/application/__init__.py
api/app/application/ports.py
api/app/application/profiles.py
api/app/config.py
api/app/db.py
api/app/domain/__init__.py
api/app/domain/career.py
api/app/infrastructure/__init__.py
api/app/infrastructure/sql_profiles.py
api/app/main.py
api/app/models.py
api/app/one_to_ones.py
api/app/seed.py
api/app/session.py
api/migrations/env.py
api/migrations/script.py.mako
api/migrations/versions/0001_initial.py
api/migrations/versions/0002_optional_activity_due_date.py
api/migrations/versions/0003_one_to_one.py
api/requirements.txt
career-quest-features-prototype.html
career-quest-prototype.html
career-tree-employee-prototype.html
career-tree-hr-prototype.html
career-tree-manager-prototype.html
career-tree-mobile-prototype.html
career-tree-prototype-assets/README.md
career-tree-prototype-assets/app.js
career-tree-prototype-assets/style.css
career-tree-prototype-assets/tree-after.jpg
career-tree-prototype-assets/tree-before.jpg
data/official/README.kz.md
data/official/README.md
data/official/README.ru.md
data/official/activity_history.csv
data/official/employees.json
data/official/events.json
data/official/skills.json
docker-compose.yml
docs/specs/one-to-one-backend.md
docs/specs/ui-three-askarbek.md
qa-reports/issue-15-smoke-2026-09-23/evidence/api-and-data.md
qa-reports/issue-15-smoke-2026-09-23/evidence/browser-profile.md
qa-reports/issue-15-smoke-2026-09-23/evidence/containers.md
qa-reports/issue-15-smoke-2026-09-23/report.md
qa-reports/issue-27-main-2026-09-23/browser-timing.js
qa-reports/issue-27-main-2026-09-23/evidence/browser-environment.json
qa-reports/issue-27-main-2026-09-23/evidence/browser-profile.png
qa-reports/issue-27-main-2026-09-23/evidence/browser-profile.txt
qa-reports/issue-27-main-2026-09-23/evidence/browser-restart.json
qa-reports/issue-27-main-2026-09-23/evidence/browser-timings.json
qa-reports/issue-27-main-2026-09-23/evidence/cleanup.log
qa-reports/issue-27-main-2026-09-23/evidence/database-counts.txt
qa-reports/issue-27-main-2026-09-23/evidence/dataset-sha256.json
qa-reports/issue-27-main-2026-09-23/evidence/environment.json
qa-reports/issue-27-main-2026-09-23/evidence/http.jsonl
qa-reports/issue-27-main-2026-09-23/evidence/restart.log
qa-reports/issue-27-main-2026-09-23/evidence/startup.log
qa-reports/issue-27-main-2026-09-23/evidence/test-inventory.txt
qa-reports/issue-27-main-2026-09-23/evidence/unit-tests.log
qa-reports/issue-27-main-2026-09-23/protocol.csv
qa-reports/issue-27-main-2026-09-23/report.md
qa-reports/issue-30/evidence/browser.log
qa-reports/issue-30/evidence/build.log
qa-reports/issue-30/evidence/design-detector.json
qa-reports/issue-30/evidence/desktop-tree.png
qa-reports/issue-30/evidence/foundation.jsonl
qa-reports/issue-30/evidence/mobile-tree.png
qa-reports/issue-30/evidence/persistence.log
qa-reports/issue-30/report.md
research/hackalem-2026/analysis.md
research/hackalem-2026/prototype-ui.html
research/hackalem-2026/sources/brief-1.bin
research/hackalem-2026/sources/brief-2.bin
research/hackalem-2026/sources/hackalem.html
research/hackalem-2026/sources/regulations.txt
research/hackalem-2026/sources/wind-spec.txt
research/hackalem-2026/wind-audit.json
scripts/acceptance/foundation.py
scripts/acceptance/growth-ui.cjs
web/.dockerignore
web/Dockerfile
web/UI-MIGRATION.md
web/index.html
web/nginx.conf
web/package-lock.json
web/package.json
web/public/trees/oak.png
web/src/main.jsx
web/src/style.css
web/vite.config.js
Ветки (15)

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

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

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