Career Quest
Веб-приложение для развития сотрудника: карьерная цель, дерево развития с модулями, практические задания с проверкой HR, начисление навыков и EXP…
О проекте
Команда: RadiVaiba
Кейс HackAlem.ai: Менеджмент — Halyk Bank · кейс 1
Стадия: Доведённый продукт
Задача кейса: «Career Quest»: AI-навигатор, связывающий навыки сотрудника с шагами развития
Суть
Веб-приложение для развития сотрудника: карьерная цель, дерево развития с модулями, практические задания с проверкой HR, начисление навыков и EXP, HR-аналитика дефицитов навыков.
Как устроено
Данные организаторов (skills.json, employees.json, events.json, activity_history.csv) загружаются в PostgreSQL. Go-движок считает навыки, разрывы до цели, 1–3 рекомендации, траекторию и EXP по фиксированным правилам (20/40/60 EXP в зависимости от часов, надбавки за prerequisites). LLM через OpenAI-совместимый Chat Completions объясняет пользу модуля, предлагает первый шаг или альтернативу, а ответ проверяется по ID и фактам; без ключа работает резервный режим. AI не определяет размер награды.
Ключевые решения
- rule-based рекомендации по разрывам навыков
- геймификация EXP/дерево развития
- проверка ID и фактов в ответе LLM
- fallback без LLM
- SQL-миграции, транзакционный импорт
Особенности
Жёсткое разделение: игровой уровень дерева, реальные навыки и грейд — разные показатели; EXP начисляется только после подтверждения HR, с защитой от двойной награды, версиями доказательств и аудитом. Интерфейс на RU/KZ/EN, OpenAPI-контракт.
Стек
Go net/http · pgx v5 · PostgreSQL 18 · React · TypeScript · Vite · Docker Compose · GitHub Actions
Модели
OpenAI-совместимый Chat Completions API (модель задаётся LLM_MODEL)
Проект создан за 5 часов на финале хакатона HackAlem.ai (23 сентября 2026, Астана). Код — BAITC-Hacks/hack-4a947dc4-radivaiba.
README
README.mdCareer Quest
Персональный AI-помощник для развития сотрудника: выбрать цель, найти полезный следующий шаг, применить навык в работе и получить подтверждение результата от HR.
Цель → дерево развития → модуль → практический результат → проверка HR → навыки и EXP.
Сотрудник видит, зачем ему конкретный модуль, с чего начать и как результат пригодится в работе. HR открывает профили, проверяет доказательства и видит, где команде нужна поддержка. Интерфейс доступен на русском, казахском и английском; названия исходного каталога сохраняются.
Возможности
- Персональные профили и учётные записи для сотрудников, отдельный доступ HR.
- Карьерная цель, реальные навыки, объяснение разрывов и 1–3 рекомендации.
- Дерево развития: ветки — направления, яблоки — модули. Доступен обычный список.
- Практические задания, отправка текста, ссылки или файла, очередь проверки HR.
- Подтверждение или возврат с комментарием; версии результата и решения сохраняются.
- Monthly EXP, общий опыт, энергия дерева и рейтинг «Лидер месяца по EXP».
- AI-помощь: объяснить пользу, предложить первый шаг, упростить задачу или найти альтернативу. При недоступности модели работает явный резервный режим.
- HR-аналитика дефицитов навыков, участия и сотрудников без следующего шага; импорт JSON/CSV.
Игровой уровень дерева, реальные навыки и должностной грейд — разные показатели. Рост дерева не означает повышения. EXP показывает подтверждённые активности, а не полную оценку качества работы человека.
Интерфейс
Скриншоты сделаны в работающем приложении на отдельном авторском наборе: все имена, модули и доказательства на них вымышлены. Закрытые данные организаторов не использовались.


Быстрый запуск: Docker
Нужны Git, Node.js 24, Go не ниже 1.25, Docker Desktop с Linux Engine и стартовый набор организаторов. Данные не публикуются в репозитории.
Для новой установки с пустой БД, PowerShell:
git clone https://github.com/BAITC-Hacks/hack-4a947dc4-radivaiba.git
cd hack-4a947dc4-radivaiba
npm run setup -- --data-dir "C:\папка\стартового-набора"
docker compose up -d --wait postgres
$env:BUILD_VERSION = git rev-parse --short HEAD
docker compose build careerquest
docker compose run --rm --no-deps careerquest /app/provision-accounts --output /app/data/credentials/accounts.json
docker compose up -d careerquest
docker compose cp careerquest:/app/data/credentials/accounts.json ./data/credentials/accounts.json
npm run credentials
Откройте http://localhost:8080. Команда credentials показывает первоначальные логины и пароли E0001 и hr. Другой сотрудник: npm run credentials -- --login E0002.
В Bash задайте версию через export BUILD_VERSION=$(git rev-parse --short HEAD) и используйте свой путь к данным. Остальные команды совпадают.
Если вы уже пользовались JSON-версией, сначала выполните перенос сохранённого прогресса. Запуск нового сервера с seed сам по себе не переносит старый runtime.
setup принимает skills.json, employees.json, events.json, activity_history.csv и варианты с (1). Он проверяет набор, готовит .env, сохраняет существующие настройки и устанавливает зависимости по lock-файлу. Provision создаёт только отсутствующие аккаунты и не сбрасывает пароли. Первоначальные пароли находятся в приватном экспорте; храните его вне Git.
Локальная разработка
PostgreSQL остаётся в Docker, Go и Vite запускаются локально. На одной БД должен работать один экземпляр приложения.
docker compose stop careerquest
docker compose up -d --wait postgres
npm run accounts:provision
npm run credentials
npm run dev
Интерфейс: http://localhost:5173; Vite проксирует /api к Go на 8080. npm run demo собирает frontend и отдаёт интерфейс вместе с API через Go на 8080. Остановка — Ctrl+C.
Если аккаунты уже созданы в Docker, скопируйте их приватный экспорт. Повторный provision не восстанавливает существующие пароли из хешей. Для добавленного через HR профиля остановите приложение, выполните npm run accounts:provision -- --employee <ID> --output data/credentials/new-accounts.json, затем перезапустите приложение, чтобы обновить снимок. Пароль: npm run credentials -- --file data/credentials/new-accounts.json --login <ID>.
Конфигурация
| Переменная | Назначение | По умолчанию |
|---|---|---|
DATABASE_URL | Обязательное подключение Go к PostgreSQL | Генерируется setup, локальный порт 5433 |
POSTGRES_DB, POSTGRES_USER | БД и пользователь контейнера | careerquest |
POSTGRES_PASSWORD | Пароль PostgreSQL | Генерируется локально |
POSTGRES_PORT | Порт БД на компьютере | 5433 |
HOST, PORT | Адрес Go | 127.0.0.1, 8080 |
EVIDENCE_DIR | Приватные доказательства | data/evidence |
ORG_TIMEZONE | Часовой пояс | Asia/Qyzylorda |
APP_MODE | demo — фиксированная дата; live — календарь организации | demo |
DEMO_DATE | Бизнес-дата демо | Пусто: meta.as_of_date набора |
DATA_DIR | Каталог seed при первом заполнении БД | data/seed |
WEB_DIR | Production-сборка frontend | frontend/dist |
DEV_ORIGIN | Разрешённый origin Vite при разработке | Задаётся npm run dev |
BUILD_VERSION | Версия Docker-сборки | Короткий SHA коммита |
LLM_BASE_URL | Префикс Chat Completions API | https://api.openai.com/v1 |
LLM_MODEL | Модель провайдера | Пусто: резервный режим |
LLM_API_KEY | Серверный ключ | Пусто: резервный режим |
LLM_TIMEOUT_MS | Таймаут AI | 8000 |
Не включайте /chat/completions в LLM_BASE_URL: адаптер добавляет маршрут. Ключ не передаётся браузеру. После изменения окружения перезапустите приложение. Изменение .env не меняет пароль пользователя уже созданной PostgreSQL.
Проверка результата и EXP
Сотрудник отправляет доказательство; до HR-подтверждения навыки, энергия и EXP не начисляются. Возвращённое задание можно исправить и отправить новой версией. HR не подтверждает собственную работу. Повторный или одновременный запрос не создаёт вторую награду. Ошибочное подтверждение отменяется отдельным решением с сохранением истории.
Награда добровольного модуля: 20 EXP до 4 часов, 40 EXP свыше 4 до 12 часов, 60 EXP свыше 12 часов. Надбавка за prerequisites: 10 EXP при начальном требовании либо 20 EXP при требуемом уровне 3 и выше; надбавки не складываются. Размер фиксируется при начале модуля и виден заранее. Обязательные события не дают EXP и не входят в добровольное дерево.
EV_036 можно завершать один раз за бизнес-день; EXP начисляется не более раза в месяц. Исторические завершения сохраняют влияние на навыки, но не получают новый EXP задним числом. AI не выбирает сумму награды.
Monthly EXP относится к месяцу подтверждения по бизнес-дате; реальное время решения хранится для аудита. Дата набора 2026-10-01 означает демонстрационный октябрь 2026. Общий EXP и дерево не сбрасываются ежемесячно. Уровень дерева: 1 + floor(total_exp / 100), энергия до следующего уровня: остаток от деления на 100.
В режиме APP_MODE=demo календарь фиксирован; для следующего месяца задайте DEMO_DATE=2026-11-01 и перезапустите приложение. В APP_MODE=live дата и месяц меняются автоматически по ORG_TIMEZONE, без перезапуска. Нельзя включать live-режим раньше даты набора: сентябрьские часы компьютера не подходят для октябрьского демонстрационного каталога.
При равном EXP сотрудники разделяют место. Авторизованным сотрудникам в рейтинге доступны только имя, место и EXP. Чужие профили и доказательства остаются закрыты; HR видит служебные сведения и фильтры. При нулевом результате победитель не назначается.
Архитектура
flowchart LR
Employee[Сотрудник] --> UI[React + TypeScript + Vite]
HR[HR] --> UI
UI -->|HTTP /api + HttpOnly cookie| API[Go net/http]
API --> Auth[Аккаунты и права]
API --> Engine[Навыки, рекомендации, дерево, EXP]
API --> Store[Транзакция и ревизия]
Store --> PG[(PostgreSQL)]
API --> Files[Приватные доказательства]
API --> LLM[OpenAI-совместимый AI]
LLM --> Check[Проверка ID и фактов]
Check --> UI
Стек: React/TypeScript/Vite, Go net/http, PostgreSQL 18, драйвер pgx v5. SQL-миграции встроены в бинарный файл. Запись сначала фиксируется в БД, затем публикуется в неизменяемом снимке Go. В БД находятся каталог, профили, история, аккаунты, заявки, решения и журнал EXP. Доказательства хранятся приватно; скачивание проверяет права.
frontend/src/ экраны, дерево, API, переводы и стили
backend/cmd/ сервер, перенос JSON, подготовка аккаунтов
backend/internal/model/ данные и API
backend/internal/store/ PostgreSQL, миграции, импорт и workflow
backend/internal/engine/ расчёты навыков, рекомендаций и EXP
backend/internal/llm/ AI и резервные объяснения
backend/internal/auth/ пароли и серверные сессии
backend/internal/httpapi/ маршруты и права
contracts/ OpenAPI
scripts/ подготовка, запуск и проверки
docs/ архитектура, эксплуатация, команда и защита
Подробные правила: ARCHITECTURE.md. Контракт запросов: OpenAPI.
Импорт, сохранение и обновление
HR загружает employees JSON и/или history CSV. Сотрудники объединяются по employee_id, история — по record_id. Весь пакет проверяется до записи: ошибка не применяет часть данных, повторная загрузка не создаёт дубли. Аккаунт для нового профиля готовится отдельно. Служебные решения и EXP не редактируются импортом организаторской истории.
После первого заполнения PostgreSQL становится источником истины. Изменение seed не перезаписывает БД. Данные сохраняются после перезапуска. OPERATIONS.md содержит команды переноса JSON, резервного копирования, восстановления и обновления без удаления volumes, а также диагностику старого frontend, портов, БД, миграций и AI.
Проверки
npm run check
go -C backend vet ./...
npm run test:postgres
check запускает Go-тесты, TypeScript и production-сборку. test:postgres создаёт отдельные случайные тестовые БД и удаляет только их; нужен PostgreSQL и право CREATEDB. Обычный go test без TEST_DATABASE_URL пропускает DB-тесты. Race detector выполняется в поддерживающей среде Linux. Подтверждённые результаты, версии инструментов и ограничения: VERIFICATION.md.
Команда и защита
| Разработчик | Область | Ветка |
|---|---|---|
| №1 | React, дерево, формы, переводы, доступность | codex/frontend |
| №2 | PostgreSQL, API, права, файлы, интеграция, документация | codex/backend |
| №3 | Навыки, EXP, рекомендации, AI, тесты алгоритма | codex/ai-engine |
Работайте в отдельных клонах. Интегратор объединяет проверенные изменения в codex/mvp, запускает проверки, затем готовит PR в main. Контракт согласуется до параллельной реализации. Подробнее: AGENTS.md, TEAM_PLAN.md.
За 5–7 минут покажите личную цель, дерево, пользу следующего шага, отправку доказательства, HR-подтверждение, обновление EXP и HR-аналитику. Порядок демонстрации: DEMO.md.
Ограничения и следующие шаги
Локальный MVP рассчитан на один сервер. Нет SSO, реального бронирования мероприятий, магазина наград, автоматического повышения или принятия решений AI вместо HR. Практические критерии задаёт приложение поверх каталога; это не дополнительные требования организаторов. Редактор заданий, уведомления, расширенный диалог и несколько серверов — последующие этапы.
Никогда не публикуйте .env, датасет, runtime, дампы БД, первоначальные пароли или доказательства сотрудников. Внешнюю AI-модель и восстановление резервной копии отмечайте проверенными только после реального выполнения соответствующего сценария.
Авторы коммитов
История коммитов
- 2026-09-23 17:47Deliver Career Quest growth tree, HR reviews and monthly EXPakazykha
- 2026-09-23 17:00Integrate PostgreSQL persistence with current frontendakazykha
- 2026-09-23 16:18Merge frontend glass redesign into mainB07pvl
- 2026-09-23 16:15Redesign frontend with smoked glass workspace and office backdropB07pvl
- 2026-09-23 16:09Add PostgreSQL persistence with migrations and transactional importsDreeeamed
- 2026-09-23 15:21Merge main into MVP before integrationakazykha
- 2026-09-23 15:03Build Career Quest MVP with explainable recommendations and team workflowakazykha
- 2026-09-23 14:26First commitDreeeamed
Структура репозитория (100 файлов)
.dockerignore .env.example .gitattributes .github/workflows/check.yml .gitignore .prettierignore .prettierrc.json AGENTS.md Dockerfile README.md backend/cmd/demo-fixture/main.go backend/cmd/migrate-legacy/main.go backend/cmd/provision-accounts/main.go backend/cmd/server/main.go backend/go.mod backend/go.sum backend/internal/auth/auth.go backend/internal/auth/password.go backend/internal/engine/analytics.go backend/internal/engine/development.go backend/internal/engine/development_test.go backend/internal/engine/engine_test.go backend/internal/engine/experience.go backend/internal/engine/experience_test.go backend/internal/engine/locale.go backend/internal/engine/recommendations.go backend/internal/engine/skills.go backend/internal/engine/trajectory.go backend/internal/httpapi/attachments_test.go backend/internal/httpapi/server.go backend/internal/httpapi/server_test.go backend/internal/httpapi/workflow.go backend/internal/llm/assistant.go backend/internal/llm/assistant_test.go backend/internal/llm/client.go backend/internal/llm/client_test.go backend/internal/model/model.go backend/internal/model/workflow.go backend/internal/store/clock_test.go backend/internal/store/legacy.go backend/internal/store/legacy_test.go backend/internal/store/migrations/001_initial.sql backend/internal/store/migrations/002_event_description.sql backend/internal/store/migrations/003_workflow.sql backend/internal/store/parse.go backend/internal/store/postgres.go backend/internal/store/postgres_test.go backend/internal/store/seed.go backend/internal/store/store.go backend/internal/store/store_test.go backend/internal/store/validate.go backend/internal/store/workflow.go backend/internal/store/workflow_postgres.go backend/internal/store/workflow_test.go backend/internal/testfixture/fixture.go compose.yaml contracts/openapi.yaml data/runtime/.gitkeep data/seed/.gitkeep docs/ARCHITECTURE.md docs/DEMO.md docs/OPERATIONS.md docs/TEAM_PLAN.md docs/VERIFICATION.md docs/images/employee-tree.png docs/images/hr-review.png frontend/index.html frontend/package.json frontend/src/App.tsx frontend/src/api/client.ts frontend/src/api/types.ts frontend/src/assets/office-atrium.png frontend/src/assets/office-atrium.txt frontend/src/components/DevelopmentTree.tsx frontend/src/components/ModulePanel.tsx frontend/src/components/ReviewQueue.tsx frontend/src/components/Shared.tsx frontend/src/i18n/index.tsx frontend/src/main.tsx frontend/src/pages/Employee.tsx frontend/src/pages/HR.tsx frontend/src/pages/Leaderboard.tsx frontend/src/pages/Login.tsx frontend/src/styles-responsive.css frontend/src/styles.css frontend/src/vite-env.d.ts frontend/tsconfig.json frontend/vite.config.ts go.work package-lock.json package.json scripts/admin.mjs scripts/check-postgres.mjs scripts/check.mjs scripts/credentials.mjs scripts/process.mjs scripts/run.mjs scripts/setup.mjs scripts/smoke-workflow.mjs scripts/smoke.mjs
Обсуждение 0 комментариев
Войдите, чтобы комментироватьПока нет комментариев — будьте первым.