AAYMA
RU
Войти

Career Quest

Веб-приложение для развития сотрудника: карьерная цель, дерево развития с модулями, практические задания с проверкой HR, начисление навыков и EXP…

Доведённый продукт
Команда «RadiVaiba» 8💬 0 комментариевс 23 сентября 2026 г.

О проекте

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

Career Quest

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

Цель → дерево развития → модуль → практический результат → проверка HR → навыки и EXP.

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

Возможности

  • Персональные профили и учётные записи для сотрудников, отдельный доступ HR.
  • Карьерная цель, реальные навыки, объяснение разрывов и 1–3 рекомендации.
  • Дерево развития: ветки — направления, яблоки — модули. Доступен обычный список.
  • Практические задания, отправка текста, ссылки или файла, очередь проверки HR.
  • Подтверждение или возврат с комментарием; версии результата и решения сохраняются.
  • Monthly EXP, общий опыт, энергия дерева и рейтинг «Лидер месяца по EXP».
  • AI-помощь: объяснить пользу, предложить первый шаг, упростить задачу или найти альтернативу. При недоступности модели работает явный резервный режим.
  • HR-аналитика дефицитов навыков, участия и сотрудников без следующего шага; импорт JSON/CSV.

Игровой уровень дерева, реальные навыки и должностной грейд — разные показатели. Рост дерева не означает повышения. EXP показывает подтверждённые активности, а не полную оценку качества работы человека.

Интерфейс

Скриншоты сделаны в работающем приложении на отдельном авторском наборе: все имена, модули и доказательства на них вымышлены. Закрытые данные организаторов не использовались.

Дерево сотрудника и полезный следующий шаг

HR проверяет результат по понятным критериям

Быстрый запуск: 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Адрес Go127.0.0.1, 8080
EVIDENCE_DIRПриватные доказательстваdata/evidence
ORG_TIMEZONEЧасовой поясAsia/Qyzylorda
APP_MODEdemo — фиксированная дата; live — календарь организацииdemo
DEMO_DATEБизнес-дата демоПусто: meta.as_of_date набора
DATA_DIRКаталог seed при первом заполнении БДdata/seed
WEB_DIRProduction-сборка frontendfrontend/dist
DEV_ORIGINРазрешённый origin Vite при разработкеЗадаётся npm run dev
BUILD_VERSIONВерсия Docker-сборкиКороткий SHA коммита
LLM_BASE_URLПрефикс Chat Completions APIhttps://api.openai.com/v1
LLM_MODELМодель провайдераПусто: резервный режим
LLM_API_KEYСерверный ключПусто: резервный режим
LLM_TIMEOUT_MSТаймаут AI8000

Не включайте /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.

Команда и защита

РазработчикОбластьВетка
№1React, дерево, формы, переводы, доступностьcodex/frontend
№2PostgreSQL, 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-модель и восстановление резервной копии отмечайте проверенными только после реального выполнения соответствующего сценария.

Звёзды
⭐ 0
Форки
0
Язык
Go
Последний push
в прошлом месяце
Коммиты
8
Авторы
3
Файлы
100
Ветки
6

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

akazykha 4B07pvl 2Dreeeamed 2

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

  • 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
Ветки (6)

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

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

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