AAYMA
RU
Войти

Career Quest

Геймифицированная платформа карьерного развития на Go с кабинетами сотрудника, HR и L&D: считает разрывы навыков до целевой роли и грейда…

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

О проекте

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

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

Суть

Геймифицированная платформа карьерного развития на Go с кабинетами сотрудника, HR и L&D: считает разрывы навыков до целевой роли и грейда, рекомендует активности и строит учебный путь с предпосылками.

Как устроено

Go-сервер при старте применяет SQL-миграции PostgreSQL, импортирует датасет кейса (employees.json, skills.json, events.json, activity_history.csv) и отдаёт API и фронтенд на чистом JS. Движок рекомендаций считает разрывы навыков и готовность по требованиям роли, отбирает подходящие активности по эффектам, предпосылкам и истории, а planner строит последовательность до трёх активностей с базовыми курсами. LLM не используется. L&D проставляет результаты PASSED/FAILED, и навыки начисляются в транзакции без повторов; HR видит ранжированных кандидатов на мероприятие.

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

  • rule-based skill gap engine
  • prerequisite-aware learning path planner
  • candidate targeting
  • gamification (quests)
  • role-based access

Особенности

Полностью детерминированное решение без LLM, при этом три роли и workflow одобрения регистрации через HR. Карьерная цель подаётся как main quest, а активности — как квесты. Награды за навыки начисляются транзакционно с защитой от двойного начисления.

Стек

Go · PostgreSQL · Docker Compose · HTML · CSS · JavaScript


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

README

README.md

Career Quest

Career Quest is a gamified employee career development platform built for a hackathon. It connects courses, workshops, certifications, mentoring, and other development activities to an employee's career goal and measurable skill gaps.

Employees can see what to learn next and why it matters. HR can review career progress and find suitable participants for activities. Learning & Development (L&D) specialists maintain the catalog and record course results.

The application uses Go, PostgreSQL, and plain HTML/CSS/JavaScript. Its recommendation engine and course planner work without an LLM or API key.

Contents

What Career Quest does

The central workflow is:

flowchart LR
    A[Current role and assessed skills] --> B[Career goal]
    B --> C[Missing skills and critical requirements]
    C --> D[Recommended courses and learning path]
    D --> E[Complete external training]
    E --> F[L&D assessment and skill rewards]
    F --> C

For example, a Junior Backend Engineer aiming for Middle might need to improve API Design from level 2 to 3 and System Design from level 1 to 2. Career Quest looks for eligible activities that develop those skills, explains the projected improvement, and can identify a foundation course needed before a later activity.

Career goals are presented as a main quest. Development activities become quests, skill gaps show the remaining work, and career readiness makes progress visible. Required training is tracked separately from voluntary recommendations.

Run locally

Requirements

  • Go 1.23 or later.
  • Docker with Docker Compose, or an existing PostgreSQL instance. The included Compose configuration uses PostgreSQL 16.
  • A browser. Node.js is only needed to run the frontend tests.

From the repository root:

docker compose up -d db
go run ./cmd/server

Open Career Quest locally.

On startup, the server connects to PostgreSQL, applies embedded SQL migrations, imports the supplied seed data, and serves both the API and frontend. Seeding uses stable IDs and conflict handling so repeated starts do not duplicate the imported records. Database data persists in the Compose volume careerquest_postgres.

The default local connection is:

postgres://careerquest:careerquest@localhost:55432/careerquest?sslmode=disable

The container exposes PostgreSQL on host port 55432; the web server listens on 8081. To use another database or HTTP port:

$env:DATABASE_URL = "postgres://user:password@localhost:5432/careerquest?sslmode=disable"
go run ./cmd/server -addr :8090

Server configuration

FlagDefaultPurpose
-addr:8081HTTP listen address
-database-urlDATABASE_URL, otherwise the local connection abovePostgreSQL connection; the flag overrides the environment variable
-datacase_1/career_quest_datasetSeed dataset directory
-webwebFrontend asset directory
-seedtrueImport seed data; use -seed=false to skip import on an initialized database

Migrations still run when seeding is disabled. A fresh installation needs the initial seed to load role requirements, the skill catalog, and demo accounts.

Demo accounts and registration

All three seeded demo accounts use the password demo.

WorkspaceEmailMain purpose
Employee[email скрыт]Personal career workspace for employee E0001
HR[email protected]Employee development, registrations, and candidate targeting
L&D Specialist[email скрыт]Activity catalog, sessions, and course assessments

Signing in redirects each account to its workspace. These shared credentials are intended for the local demonstration.

Registration approval

  1. A person submits a registration request from the sign-in page.
  2. The account stays PENDING and cannot sign in yet.
  3. HR opens Registration requests and reviews the applicant.
  4. HR either creates a new employee record with a role and grade or links an existing employee record to the account.
  5. Approval changes the account to ACTIVE; HR can also reject the request.

New employee IDs are generated in the E0001 format when an ID is not supplied. Optional profile details can remain empty. An employee ID supplied by an applicant is a request for HR to verify; it does not grant access to that record.

Employee features

FeatureWhat the employee can do
My Career dashboardView the current role, target, readiness, next suggested activity, critical gaps, and current activities
Career goalsSet, change, or clear a target role and grade; recommendations and skill gaps recalculate for the new target
My QuestsBrowse recommended, planned/enrolled, in-progress, completed, and mandatory activities
Suggested learning pathFollow an ordered sequence of up to three activities, including prerequisite courses
Skills viewCompare current and required levels, with separate views for critical blockers and other growth skills
Career PathSee the learning sequence, projected skill gains, total study hours, remaining gaps, and projected readiness
Course searchSearch the activity catalog and open external training links when configured
Career NavigatorRead explanations of recommendations, promotion blockers, and suggested next steps
My ProfileView personal details, department, team, manager, career goal, last review date, and effective skill levels

Skills use levels 0–5, from no knowledge to expert. Effective skill levels include applicable completed activities after the employee's last review, while avoiding rewards already applied to the stored skill record.

When no career goal is set, recommendations use requirements for the current role and grade. Career readiness is shown after the employee selects a goal.

HR features

FeatureWhat HR can do
Employee directorySearch by name, email, employee ID, department, team, role, or grade, and apply department/team/role/grade filters
Employee creationCreate an employee record with an automatic or supplied ID and optional contact and organization details
Registration requestsApprove or reject applications and create or link employee records during approval
Employee overviewSwitch between employees to inspect readiness, skill gaps, recommendations, and activity history
Goal managementSet, change, or clear an employee's career target
Activity statusReview completed, planned/in-progress, and mandatory activity records
Events and coursesBrowse and search the learning catalog
Candidate targetingOpen an event's ranked eligible employees and jump to their development profiles
Development analyticsView employee counts, career-goal adoption, voluntary activity counts, session counts, and workforce distribution by role
Recommendation explanationsInspect the evidence behind a selected employee's recommendation

Candidate targeting uses the same eligibility and skill-gap rules as employee recommendations. It returns employees for whom the activity is currently useful and eligible; it does not enroll or assign them automatically.

Learning & Development features

Course and event management

L&D specialists can create and edit activities with:

  • A title, description, duration, and external learning link.
  • An activity type: course, workshop, mentoring, certification, meetup, compliance, or onboarding.
  • A delivery format: online, offline, or self-paced.
  • A mandatory flag and target roles and grades.
  • Skills developed, the gain for each skill, and the maximum level the activity can teach.
  • Prerequisite skills and minimum entry levels.
  • Upcoming session dates for scheduled activities.

The dashboard summarizes catalog size, optional development activities, session counts, configured external links, and the mix of delivery formats. The Upcoming Sessions view lists scheduled learning opportunities.

Participants and assessments

L&D can inspect an activity's enrolled participants and record:

  • A PASSED or FAILED result.
  • An optional score from 0 to 100.
  • Written feedback.

A passing assessment marks the enrollment completed and applies the configured skill rewards in a database transaction. Failed assessments award no skills. Rewards cannot be applied twice to the same enrollment, and a course's level cap cannot reduce an existing skill level. Updated results are reflected when career data is loaded again.

Course analytics

Activity analytics report participation records, unique participants, average completion percentage, and counts by status. The participant view also shows assessment results and scores. L&D has access to this course information without access to the HR directory or private career profiles.

How recommendations and planning work

The backend uses structured employee skills, role requirements, course effects, prerequisites, and activity history. Course selection does not require language generation or model inference.

1. Calculate skill gaps and readiness

The engine compares effective skill levels with the selected target profile. Critical requirements receive twice the weight of other requirements.

For each required skill, fulfillment is the current level divided by its required level, capped at 1. Career readiness is the weighted average of these fulfillment values, expressed as a percentage. It measures the recorded skill requirements for the target; promotion decisions remain outside the app.

2. Filter eligible activities

An immediate recommendation must:

  • Be voluntary and develop at least one useful skill.
  • Match the employee's current role and grade or the career goal's role and grade.
  • Have prerequisites the employee already meets.
  • Be self-paced or have a session on or after the dataset snapshot date.
  • Have no recorded completion, except the explicitly recurring club EV_036.
  • Have no latest activity status of planned, enrolled, or in_progress.
  • Close at least part of a target skill gap within the course's level cap.

Mandatory activities are displayed through their assignment history and are excluded from voluntary recommendations and learning plans.

3. Rank individual recommendations

The match score combines three factors:

score = 70 × weighted gap coverage
      + 20 × useful share of available skill gains
      + 10 × role/goal alignment
      − previous-attempt penalty

Coverage is the fraction of the employee's total weighted missing skill levels that the course can close. The useful share compares those gains with all gains the course could still provide. Critical skills count twice in both measures. Alignment is 1 for a career-goal match, or for a current-role match when no goal is set; it is 0.5 for a current-role-only match when a goal exists.

A latest failed, dropped, declined, or no-show attempt subtracts 10 points. Scores are bounded to 0–100. Ties favor greater projected readiness improvement, then fewer study hours, then event ID. The score is a ranking measure, not a probability of success.

Each recommendation includes the relevant skills, current/projected/required levels, critical requirements, session availability, and an explanation. When a goal exists, it also includes projected readiness before and after completion.

4. Plan several courses ahead

The planner searches sequences of up to three activities, keeping up to 64 candidate paths at each depth. After each simulated completion it checks the next activity's prerequisites against the projected skills.

This allows a foundation course to be useful even when it does not directly close a career-goal gap. An illustrative path is:

SQL Foundations → Cloud Basics → Advanced Architecture

The planner favors the highest projected weighted readiness, then fewer total study hours, fewer steps, and earlier progress for otherwise equivalent paths. It avoids repeating an event within the path and checks scheduled session order. The result is a useful short plan, not a guaranteed globally optimal curriculum or a booked calendar.

The API returns the plan as learning_plan alongside individual recommendations when a useful path is found. The employee dashboard, My Quests, Career Path, and Navigator's next-step prompt use it. Planned gains are projections and do not change the employee's actual skills.

Career Navigator

The interface calls this feature AI Career Navigator. Its current implementation uses deterministic explanations and keyword-based question routing, with no external LLM connection.

Supported prompts include:

  • “What should I do next?” — explains the suggested learning sequence.
  • “What blocks my promotion?” — summarizes missing target requirements.
  • “Why this quest?” — explains a selected recommendation's skill impact.
  • “What happens if I change my career goal?” — describes how the target changes the assessment and recommendations.

The answers use computed career data and templates. The Navigator is a focused career explanation tool; arbitrary conversational understanding is not part of the current implementation.

Data and persistence

PostgreSQL is the application's persistent store for employees, skills, role requirements, goals, courses, sessions, enrollments, activity history, accounts, and assessments. The JSON/CSV dataset is used for initial seeding and automated tests.

The supplied synthetic dataset contains:

DataSize
Employee profiles200
Skills60
Job roles8
GradesJunior, Middle, Senior, Lead
Role/grade requirement profiles32
Activities40
Participation history records2,743

The dataset snapshot is 2026-10-01, which the recommendation engine treats as its availability reference date. History covers 2024-10-01 to 2026-09-30. These are demo snapshot dates, rather than a continuously advancing calendar.

See the dataset documentation for field definitions and the product context for the original design brief. The runtime implementation uses PostgreSQL; the in-memory dataset adapter remains available to tests and the seed loader.

Access control

CapabilityEmployeeHRL&D
Browse activity catalogYesYesYes
View career profile, gaps, recommendations, and historyOwn recordAll employeesNo
Change career goalsOwn goalAny employee goalNo
Use Navigator for career dataOwn recordAny employeeNo
Search/create employee recordsNoYesNo
Approve/reject registrationsNoYesNo
View ranked event candidatesNoYesNo
Create/edit courses and sessionsNoNoYes
View aggregate course analyticsNoYesYes
View participants and submit assessmentsNoNoYes

Passwords are stored as bcrypt hashes. Authentication uses session cookies with HttpOnly and SameSite=Lax; the cookie's Secure flag is set when the request uses TLS. Logout ends the session. Authorization is enforced on the backend, including checks that employee accounts access only their linked record.

API reference

The frontend and API are served by the same Go application. Requests and responses use JSON, and authenticated calls use the login session cookie. “Owner/HR” below means the employee who owns the record or an HR account.

MethodEndpointAccessPurpose
GET/healthPublicService health response
POST/auth/registerPublicSubmit a pending employee account request
POST/auth/loginPublicSign in with an active account
GET/auth/meSigned inGet current user and workspace redirect
POST/auth/logoutSigned inEnd the session
GET/catalogSigned inGet skills, roles, grades, and reference data
GET/registrationsHRList requests; optional status, default PENDING
POST/registrations/{id}/approveHRCreate and link a new employee or link an existing one
POST/registrations/{id}/rejectHRReject a request
GET/employeesHRSearch with q, department, team, role, and grade
POST/employeesHRCreate an employee record
GET/employees/{id}Owner/HRGet employee details and effective skills
GET/employees/{id}/career-pathOwner/HRGet career target, readiness, and gap summary
GET/employees/{id}/skill-gapsOwner/HRGet the full skill assessment
GET/employees/{id}/recommendationsOwner/HRGet ranked activities and optional learning plan
GET/employees/{id}/mandatory-questsOwner/HRGet recorded mandatory assignments, with overdue items first
GET/employees/{id}/activitiesOwner/HRGet activity history and status categories
PUT/employees/{id}/career-goalOwner/HRSet a target or clear it with {"clear": true}
GET/eventsSigned inSearch with q, type, role, and grade
GET/events/{id}Signed inGet activity details
POST/eventsL&DCreate an activity
PUT/events/{id}L&DUpdate activity metadata and sessions
GET/events/{id}/candidatesHRGet ranked eligible employees
GET/events/{id}/analyticsHR/L&DGet participation and completion aggregates
GET/events/{id}/participantsL&DGet enrolled participants and assessment details
POST/enrollments/{id}/assessmentL&DRecord pass/fail, score, feedback, and applicable skill rewards
POST/navigator/chatOwner/HRExplain career data for the requested employee

Example career-goal body:

{
  "target_role": "Backend Engineer",
  "target_grade": "Middle"
}

Example Navigator body:

{
  "employee_id": "E0001",
  "question": "What should I do next?"
}

Add event_id to ask about a specific currently recommended activity.

Project structure

cmd/server/                    Server startup and configuration
internal/auth/                 Accounts, sessions, and authorization
internal/career/               Effective skills, gaps, and readiness
internal/recommendation/       Activity ranking and course sequence planning
internal/navigator/            Deterministic career explanations
internal/events/               Activity history and analytics
internal/assessment/           Assessment validation and service
internal/domain/               Shared data models
internal/repository/           Persistence interfaces
internal/postgres/             PostgreSQL implementation and seed import
internal/postgres/migrations/  Embedded SQL migrations
internal/dataset/              Dataset loading, validation, and test adapter
internal/httpapi/              Routes, JSON handlers, and frontend serving
web/                          Employee, HR, and L&D interfaces
web/tests/                    Frontend regression and startup checks
case_1/career_quest_dataset/   Synthetic seed data
docs/PROJECT_CONTEXT.md        Original product brief

The backend uses Go's HTTP server and PostgreSQL through pgx. The frontend uses browser JavaScript and static assets, so running the application does not require an npm install or a frontend build step.

Testing

Run Go tests and compile all packages:

go test ./...
go build ./...

Run the frontend tests with Node.js:

node --test web/tests/*.test.cjs

To include PostgreSQL integration checks against the local Compose database:

$env:TEST_DATABASE_URL = "postgres://careerquest:careerquest@localhost:55432/careerquest?sslmode=disable"
go test ./internal/postgres -count=1

These checks create and remove isolated test schemas. They cover registration approval and skill reward persistence, including protection against duplicate rewards and reduced skill levels. They are skipped when TEST_DATABASE_URL is not set.

With a seeded server running, include frontend startup checks for all three workspaces:

$env:CAREER_QUEST_TEST_URL = "http://localhost:8081"
node --test web/tests/*.test.cjs

The live startup checks sign in with the demo accounts and exercise frontend startup against the API. They are skipped without CAREER_QUEST_TEST_URL. Other tests cover career assessments, recommendation eligibility and ranking, prerequisite paths, Navigator plan explanations, API access rules, and UI state.

Suggested demo walkthrough

  1. Sign in as the employee and review My Career, including the target, readiness, critical gaps, and suggested next step.
  2. Open Career Path to explain the course order and projected skill gains.
  3. Change the career goal and show the recalculated gaps and recommendations.
  4. Ask Navigator “What should I do next?” and inspect a quest explanation.
  5. Sign in as HR, search for an employee, and open an event's candidate list.
  6. Submit a new registration and show HR approving it with a newly created or existing employee record.
  7. Sign in as L&D, edit a course's skill effects and prerequisites, then inspect its sessions, analytics, and participant assessments. Submitting a passing assessment changes the participant's stored skills and activity status.

Current scope and limitations

  • Training is delivered externally through configured learning links. The app manages career planning and results; it does not host course lessons.
  • Enrollments and mandatory assignments are tracked from existing records. There is currently no self-enrollment or HR assignment creation endpoint/UI. Marking a course mandatory does not create assignments for employees.
  • The planner searches up to three steps ahead and estimates skill progress. Employees must confirm session timing and successfully complete the training before those gains become actual results.
  • Recommendation quality depends on accurate employee skill assessments, role requirements, course effects, and prerequisites. Missing employee skill entries are treated as level 0.
  • Navigator supports its defined career prompts through templates and keyword routing. A general conversational assistant is not connected.
  • Availability is evaluated using the dataset snapshot date. The current demo does not advance that reference date automatically with the wall clock.
Звёзды
⭐ 0
Форки
0
Язык
Go
Последний push
в прошлом месяце
Коммиты
8
Авторы
1
Файлы
56
Ветки
1

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

rpavlov 8

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

  • 2026-09-23 17:55feat: v2.0rpavlov
  • 2026-09-23 17:50feat: v1.1rpavlov
  • 2026-09-23 17:46feat: v1.0rpavlov
  • 2026-09-23 17:01feat: v0.3rpavlov
  • 2026-09-23 16:50feat: v0.2rpavlov
  • 2026-09-23 15:48feat: v0.2rpavlov
  • 2026-09-23 14:35feat: v0.1rpavlov
  • 2026-09-23 11:58aarpavlov
Структура репозитория (56 файлов)
.env.example
.gitignore
AGENTS.md
README.md
case_1/.DS_Store
case_1/career_quest_dataset/README.kz.md
case_1/career_quest_dataset/README.md
case_1/career_quest_dataset/README.ru.md
case_1/career_quest_dataset/activity_history.csv
case_1/career_quest_dataset/employees.json
case_1/career_quest_dataset/events.json
case_1/career_quest_dataset/skills.json
cmd/server/main.go
docker-compose.yml
docs/PROJECT_CONTEXT.md
go.mod
go.sum
internal/assessment/service.go
internal/auth/auth.go
internal/career/service.go
internal/career/service_test.go
internal/dataset/store.go
internal/dataset/store_test.go
internal/domain/models.go
internal/events/service.go
internal/httpapi/api.go
internal/httpapi/api_test.go
internal/navigator/service.go
internal/navigator/service_test.go
internal/postgres/migrations/001_init.sql
internal/postgres/migrations/002_registration_employee_request.sql
internal/postgres/migrations/003_employee_id_sequence.sql
internal/postgres/registration_test.go
internal/postgres/seed.go
internal/postgres/skill_rewards_test.go
internal/postgres/store.go
internal/recommendation/planner.go
internal/recommendation/planner_test.go
internal/recommendation/ranking_test.go
internal/recommendation/service.go
internal/recommendation/service_test.go
internal/repository/repository.go
web/app.js
web/employee.html
web/employee.js
web/hr.html
web/i18n.js
web/index.html
web/ld.html
web/ld.js
web/login.js
web/styles.css
web/tests/hr-registrations.test.cjs
web/tests/i18n.test.cjs
web/tests/learning-plan.test.cjs
web/tests/role-startup.test.cjs

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

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

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