AAYMA
RU
Войти

Career Quest

Full-stack навигатор развития на Next.js: профиль, дефициты до цели, до 3 рекомендаций с причинами, завершение с пересчётом, HR-обзор и импорт…

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

О проекте

Команда: Radiants
Кейс HackAlem.ai: Менеджмент — Halyk Bank · кейс 1
Стадия: Доведённый продукт

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

Суть

Full-stack навигатор развития на Next.js: профиль, дефициты до цели, до 3 рекомендаций с причинами, завершение с пересчётом, HR-обзор и импорт профилей.

Как устроено

Официальные JSON/CSV валидируются через Zod и импортируются в SQLite. Движок восстанавливает текущие навыки (оценка + завершения после last_review_date), проверяет допуск (роль, грейд, пререквизиты, сессии) и ранжирует: закрытие критичного уровня даёт 40, обычного 10, плюс корректировки по истории за 365 дней. Readiness = взвешенная доля выполненных требований (критичные ×2). OpenAI Responses API отдельным запросом объясняет уже выбранные рекомендации; ответ проверяется на eventId и ссылки на факты, иначе используется fallback, таймауты 8 и 9,5 с. Завершение и пересчёт идут в одной транзакции.

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

  • эвристический скоринг 40/10 с поправкой на историю
  • readiness по взвешенным требованиям
  • валидация LLM-ответа по фактам
  • транзакционное завершение
  • CSRF и сессии

Особенности

98 коммитов и 4 автора, работа через PR и handoff-документы между ролями; обширная доказательная база (live AI proof, privacy validation, final rehearsal), в LLM не передаются ФИО и данные аккаунта.

Стек

Next.js 16 · React 19 · TypeScript · Node.js · SQLite (better-sqlite3) · Zod · csv-parse · Vitest · Docker Compose

Модели

OpenAI Responses API (gpt-6-astra по умолчанию)


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

README

README.md

Career Quest

Навигатор развития сотрудников для кейса Halyk Bank на HackAlem AI.

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

Подбор мероприятий и расчёт прогресса выполняются по воспроизводимым правилам. OpenAI дополняет выбранные рекомендации объяснениями. Без API-ключа профиль, рекомендации, импорт и завершение обучения продолжают работать.

Что реализовано

Для сотрудникаДля HR
Личный профиль, текущая роль, грейд и карьерная цельПросмотр профилей сотрудников
Текущие навыки, требования цели и критические дефицитыФильтры по роли, грейду и подразделению со сбросом
До трёх вариантов развития с причинами и ожидаемыми изменениями навыковОбзор дефицитов навыков и сотрудников без следующего шага
Длительность, формат и ближайшая дата занятия из каталогаСтатистика участия и завершения активностей
Завершение рекомендованной активности с пересчётом профиляИмпорт JSON-профилей и CSV-истории
История со статусами, датами и инициаторами; отдельный блок обязательного обученияСоздание личного доступа для существующего или импортированного сотрудника

Интерфейс на русском языке, с адаптацией для узкого экрана и локальным шрифтом Manrope. Названия из датасета и объяснения могут оставаться на исходном языке. Рекомендации добровольны; публичных рейтингов сотрудников нет. HR не может завершать обучение за сотрудника.

Быстрый запуск

Через Docker — основной способ

Нужны Git и Docker с Compose. На Windows сначала запустите Docker Desktop. Для закрытого репозитория необходим доступ команды в GitHub.

git clone https://github.com/BAITC-Hacks/hack-29a4db0a-radiants.git
cd hack-29a4db0a-radiants
docker compose up --build

Откройте http://localhost:3000. Frontend, API и SQLite работают в одном сервисе; отдельно устанавливать Node.js или запускать СУБД не требуется.

Первый запуск автоматически создаёт базу и загружает стартовые данные. Готовность можно посмотреть командой docker compose ps и по адресу /api/health.

# Запуск в фоне
docker compose up --build -d

# Логи приложения
docker compose logs --tail=100 app

# Остановка с сохранением данных
docker compose down

Данные, аккаунты и история сохраняются в именованном volume career-quest-db даже после пересоздания контейнера. docker compose down -v удаляет этот volume вместе с данными; для обычной остановки эта опция не нужна.

Вход: имя и фамилия + пароль admin

Для демонстрации сотрудник вводит только имя и фамилию, пароль — admin. Примеры:

Имя и фамилияПароль
Yerlan Kaliyevadmin
Ksenia Pavlovaadmin

На новом запуске включите этот режим: создайте .env в корне проекта на основе .env.example и установите:

DEMO_EMPLOYEE_LOGIN=true

Примените настройку командой docker compose up --build -d.

ID вводить не нужно. Если имя совпадает у нескольких сотрудников, появятся карточки с подразделением, должностью и грейдом. Выберите нужный профиль. Импортированные сотрудники также доступны по имени. Регистр и лишние пробелы в имени нормализуются.

Общий пароль предназначен для демонстрации и не подтверждает личность сотрудника: по имени можно открыть чужой синтетический профиль. Приложение явно обозначает этот режим. HR входит как hr-admin со своим индивидуальным паролем; admin не даёт права HR.

Для возвращения к личному входу установите DEMO_EMPLOYEE_LOGIN=false и пересоздайте контейнер. Демо-сессии перестанут допускаться к API; индивидуальные аккаунты сохранятся.

Доступ HR и личные аккаунты

Для HR используйте логин hr-admin и его отдельный пароль. Начальные личные пароли генерируются случайно; оператор получает их локально:

docker compose exec app cat /app/.data/initial-access.json

Файл не отдаётся через HTTP и не включён в Git. Передавайте каждому сотруднику только его данные входа; при демонстрации не выводите весь файл на общий экран. Существующий volume сохраняет ранее созданные аккаунты и пароли. В конфигурации по умолчанию демо-режим выключен и используются личные аккаунты.

Как работает решение

  1. Сотрудник входит и получает свой профиль с историей обучения.
  2. Сервер восстанавливает текущие навыки, определяет цель и сравнивает навыки с требованиями роли.
  3. Из каталога выбираются до трёх подходящих добровольных мероприятий. Каждое сопровождается причинами, влиянием на навыки и учётом истории участия.
  4. Отдельный запрос получает AI-объяснения. Пока он выполняется или недоступен, рассчитанный план уже можно использовать.
  5. Сотрудник отмечает допустимую рекомендацию завершённой. Сервер сохраняет историю и пересчитывает навыки, соответствие цели и следующие рекомендации.
  6. После отдельного входа HR видит обновлённые данные команды и при необходимости импортирует новые профили и историю.

Правила подбора

  • Текущие навыки: исходная оценка плюс завершённые активности строго после last_review_date. Отсутствующий навык считается равным 0. Оценённые employee.skills не перезаписываются после каждого завершения.
  • Эффект занятия: max(current, min(current + gain, max_level)). Потолок курса ограничивает прирост, но не понижает уже достигнутый уровень.
  • Цель: заданная career_goal, иначе следующий грейд в текущей роли. У Lead без цели навыки и история видны, а следующий грейд не придумывается.
  • Допуск: проверяются роль и грейд, предварительные навыки, доступность, завершённость и участие в процессе. Обязательные занятия исключены из рекомендаций. Повторное прохождение разрешено только для EV_036.
  • Ранжирование: закрытие уровня критического дефицита даёт 40 баллов, обычного — 10. История за предыдущие 365 дней корректирует результат с учётом похожих тем, типа, формата, пропусков, отказов и оценок. Это явные эвристики, а не обученная модель мотивации.
  • Пустой результат: интерфейс показывает серверную причину и доступную диагностику исключений, например отсутствие цели, достижение требований или отсутствие подходящих занятий.

Все правила доступности используют дату снимка датасета 2026-10-01. Реальный срок действия сессии рассчитывается по текущему времени. Эти даты используются для разных задач.

Что означает процент соответствия цели

readiness показывает, какая доля требований к навыкам выполнена:

100 × сумма(вес × min(текущий уровень / требуемый уровень, 1)) / сумма(весов)

Вес критического навыка — 2, остальных — 1. Нулевое требование считается выполненным; при пустом списке требований результат равен 100%. Сервер округляет результат до одного знака после запятой. Без цели сервер возвращает 0 и отдельный статус отсутствия цели.

Это показатель соответствия навыков, не вероятность или обещание повышения. «Вариант 1/2/3» — альтернативы для текущего состояния, а не рассчитанная последовательность курсов. Ожидаемый эффект занятия отделён в интерфейсе от подтверждённых навыков.

AI и внешние сервисы

Используется серверный OpenAI Responses API. Модель по умолчанию в коде и Compose — gpt-6-astra; её можно переопределить через OPENAI_MODEL.

Модель получает целевую роль/грейд и уже выбранные рекомендации с фактами о навыках и истории. ФИО, данные аккаунта, cookie и полная история сотрудника в этот запрос не включаются. Модель формулирует объяснение; список мероприятий, порядок, баллы и прогресс определяет код.

Сервер проверяет структуру ответа, допустимые и уникальные eventId, длину текста и ссылки на факты о цели, истории и реально улучшаемом навыке. Только принятый непустой ответ получает explanationSource: "llm"; иначе сохраняется объяснение по правилам (fallback). Проверка ссылок на факты не гарантирует истинность каждого предложения модели.

Ожидание провайдера ограничено 8 секундами, общий бюджет AI-обработки — 9,5 секунды. Ошибки, отказ модели, отсутствие ключа или таймаут не блокируют основной сценарий. Просроченные ответы не заменяют данные после смены профиля, импорта, завершения активности или выхода.

Для подключения заполните серверный OPENAI_API_KEY в игнорируемом .env, затем пересоздайте контейнер. Ключ не следует помещать в NEXT_PUBLIC_*, VITE_* или Git. AI_EXPLANATIONS_ENABLED=false отключает внешние AI-запросы. Автоматической отправки email, интеграции с календарём или корпоративной системой обучения в MVP нет.

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

КомпонентТехнологии
ИнтерфейсReact 19, TypeScript, CSS, Lucide, локальный Manrope
Приложение и APINext.js 16, Node.js 22+
ХранениеSQLite, better-sqlite3, транзакции и миграции
Валидация и импортZod, csv-parse
ОбъясненияOpenAI Responses API через серверный HTTP-запрос
ПроверкиVitest, TypeScript, ESLint
УпаковкаDocker, Docker Compose
flowchart LR
    Data[JSON и CSV] --> Import[Валидация и импорт]
    Import --> DB[(SQLite)]
    UI[React: сотрудник и HR] <-->|Сессия и CSRF| API[Next.js API]
    API <--> DB
    API --> Engine[Навыки, цель, допуск и ранжирование]
    DB --> Engine
    Engine --> API
    Engine --> Evidence[Факты выбранных рекомендаций]
    Evidence --> AI[OpenAI: объяснения]
    AI --> Validation[Проверка ответа или fallback]
    Validation --> API

Завершение активности проверяется и сохраняется в одной транзакции с пересчётом профиля. Обращение к AI выполняется отдельно от записи в базу. Общие доменные типы используются на всех слоях.

src/app/                  Next.js: страницы и API-маршруты
src/components/           Вход, профиль, рекомендации, HR, импорт, аккаунты
src/hooks/                Загрузка и отмена запросов
src/lib/frontend/         Транспорт API и жизненный цикл сессии
src/lib/recommendation/   Навыки, readiness, рекомендации, правила completion
src/lib/analytics/        HR-аналитика
src/lib/ai/               OpenAI и проверка объяснений
src/lib/data/             Адаптация и нормализация датасета
src/server/               Авторизация, SQLite, репозитории и сервисы
src/contracts/            Контракты API и валидация
src/types/                Доменные типы
data/                     Стартовый датасет
tests/                    Модульные и интеграционные проверки
docs/                     Контракты, сценарии и отчёты

Данные и импорт

В репозитории находится синтетический датасет кейса:

ФайлСодержимое
employees.json200 сотрудников
skills.json60 навыков и 32 профиля требований: 8 ролей × 4 грейда
events.json40 мероприятий
activity_history.csv2 743 записи истории

Это начальные количества для новой базы. Импорт и завершение занятий меняют их. Источник текущего состояния после запуска — SQLite; изменения сохраняются между перезапусками.

HR может загрузить JSON с одним сотрудником, массивом сотрудников или объектом { "employees": [...] }, затем CSV истории. Полные примеры: jury-employee.json и jury-history.csv. Произвольные корректные профили обрабатываются тем же алгоритмом, без привязки к заранее заданным ID.

Существующие профили обновляются, новые добавляются. Повторные record_id истории пропускаются. Ошибка валидации откатывает весь запрос и возвращает файл, строку и поле. UI загружает по одному файлу; POST /api/import также принимает оба файла вместе в multipart-полях employees и history. Лимит импорта — 10 MiB. Изменение каталога навыков и мероприятий через этот endpoint не предусмотрено.

После JSON-импорта действие «Создать доступ» открывает форму с выбранным сотрудником. HR подтверждает привязку, задаёт логин и пароль, затем передаёт их сотруднику приватно. Логин: 3–80 символов из a-z, A-Z, 0-9, _, ., -; пароль: 12–128 символов. Пароль очищается после ответа и не показывается в списке аккаунтов. CSV можно импортировать до или после создания доступа.

Как проверить решение: сценарий для жюри

Профиль → рекомендация → результат

На новой базе с исходными данными:

  1. Включите демо-режим по инструкции выше. Введите имя и фамилию Yerlan Kaliyev и пароль admin. ID сотрудника не требуется.
  2. Откройте цель Backend Engineer → Senior, навыки и историю. Для исходного профиля Yerlan Kaliyev соответствие цели — 71,3%.
  3. Найдите System Design Fundamentals (EV_005). Покажите причину рекомендации, критический дефицит, историю и ожидаемый эффект. Метка источника объяснения позволяет отличить AI от расчёта по правилам.
  4. Нажмите «Отметить завершённым». Ожидаемый результат на чистой базе: System Design 1 → 2, API Design остаётся 4, соответствие цели 71,3% → 74,1%. Обновляются история и варианты рекомендаций.
  5. Обновите страницу: сохранённый результат должен остаться. На базе с уже пройденным EV_005 начальные значения будут другими; повторное завершение неповторяемого занятия сервер отклонит.

HR → импорт → личный доступ

  1. Выйдите из аккаунта сотрудника и отдельно войдите как hr-admin со своим паролем.
  2. Импортируйте профиль Jury Demo, затем его историю через «Загрузить ещё файл».
  3. Нажмите «Создать доступ» после JSON-импорта или откройте «Доступ сотрудников». Выберите Jury Demo и создайте личный аккаунт. Сохраните пароль для приватной передачи.
  4. Выйдите из HR и войдите созданным сотрудником. Ему доступны собственный профиль, рекомендации и завершение рекомендованной активности; элементов HR нет.
  5. Снова войдите как HR и откройте «Обзор команды». Проверьте фильтры, дефициты навыков, сотрудников без следующего шага и участие в обучении.

Дополнительные кейсы для жюри: три профиля и история. Они показывают критический дефицит против самого низкого навыка, восстановление навыков по истории и Lead без карьерной цели. Подробный сценарий — в JURY_DEMO.md.

Настройки

.env необязателен для стандартного запуска. Доступные настройки перечислены в .env.example; в Git файл с секретами не попадает.

ПеременнаяЗначение по умолчаниюНазначение
APP_PORT3000Порт приложения в Compose
APP_BIND_ADDRESS127.0.0.1Адрес привязки порта на хосте
APP_ORIGINhttp://localhost:3000Точный адрес браузера для проверки Origin; Compose учитывает порт, если переменная не задана явно
DEMO_EMPLOYEE_LOGINfalseОбщий демо-вход по имени с паролем admin
AI_EXPLANATIONS_ENABLEDtrueРазрешение внешних запросов объяснений
OPENAI_API_KEYНе заданСерверный ключ; без него используются объяснения по правилам
OPENAI_MODELgpt-6-astraМодель объяснений
CAREER_QUEST_DB_PATH.data/career-quest.sqliteПуть базы при локальном запуске
CAREER_QUEST_DATA_DIRdataКаталог стартовых файлов при локальном запуске

Compose задаёт пути /app/.data/career-quest.sqlite и /app/data. Если порт занят и вы скопировали .env.example, измените обе настройки:

APP_PORT=3001
APP_ORIGIN=http://localhost:3001

После этого пересоздайте контейнер и откройте http://localhost:3001. localhost и 127.0.0.1 считаются разными Origin. Для .env.local в Docker используйте docker compose --env-file .env.local up --build.

Локальная разработка без Docker

Нужен Node.js 22+:

npm ci
npm run dev

Откройте http://localhost:3000. После первого запроса стартовые пароли находятся в локальном .data/initial-access.json. Зависимости SQLite могут потребовать C++ build tools, если для платформы нет готового бинарного пакета.

Для production-сборки: npm run build, затем npm start. Вспомогательные dev:demo / build:demo запускают Vite-frontend с прокси /api к Next.js на порту 3000; это не отдельный полный backend. Для Vite нужен запущенный Next.js и APP_ORIGIN, совпадающий с адресом Vite, например http://localhost:5173.

API и разграничение доступа

Успех возвращается как { "data": ... }, ошибка — { "error": { "code", "message", "details" } }. Полные типы находятся в src/contracts и src/types/career.ts.

Метод и маршрутНазначение и доступ
GET /api/healthПубличная готовность сервера и количества записей
POST /api/auth/loginВход; сессия или выбор одноимённого демо-профиля
GET /api/auth/sessionПроверка текущей сессии
POST /api/auth/logoutОтзыв сессии и удаление cookie
GET /api/catalogКаталог навыков, ролей и мероприятий после входа
GET /api/employeesСотруднику — собственная карточка, HR — список
GET /api/employees/:idПрофиль, навыки, история и диагностика
GET /api/employees/:id/recommendationsТот же профиль с отдельным запросом AI-объяснений
POST /api/employees/:id/activities/:eventId/completeЗавершение допустимой активности только самим сотрудником
PATCH /api/employees/:id/career-goalИзменение своей цели; backend готов, форма в UI ещё не подключена
GET /api/hr/summaryАналитика, только HR
GET /api/hr/accounts, POST /api/hr/accountsСписок аккаунтов и создание доступа, только HR
POST /api/importИмпорт профилей и истории, только HR

Сотрудник читает только свой профиль, историю и рекомендации. HR в текущем MVP видит все профили. Фильтры HR — role, grade, department, применяются совместно; список сотрудников дополнительно поддерживает search.

Сессия действует 8 часов. Используются HttpOnly/SameSite=Strict cookie, проверка Origin и CSRF для защищённых изменений; при HTTPS в APP_ORIGIN cookie получает Secure. Сессионные данные frontend находятся в памяти, без localStorage. Выход и истечение сессии убирают защищённый интерфейс и отменяют запросы; выход синхронизируется между вкладками.

Completion принимает {} для стандартного сценария. Сервер проверяет допуск внутри транзакции: неподходящее занятие возвращает 422 EVENT_NOT_ELIGIBLE, повторное неповторяемое завершение — 409. Для обязательного занятия нужно сохранённое активное назначение HR/руководителя. UI блокирует повторное нажатие; после неопределённого результата требуется обновить профиль, а не автоматически повторять запись.

Контракты и подробные ошибки: авторизация, completion и карьерная цель, создание аккаунтов.

Проверки и сохранённые результаты

После npm ci:

npm test
npm run typecheck
npm run lint
npm run build

В репозитории есть проверки рекомендаций, истории, ограничений completion, импорта с откатом, авторизации, frontend-состояний и защиты от устаревших AI-ответов. Интеграционные проверки используют временные SQLite-базы. lint охватывает перечисленные в package.json frontend-каталоги. Обычный npm test использует подменённые AI-транспорты и по умолчанию пропускает live-проверки.

Отдельно можно запустить настоящий OpenAI для двух синтетических профилей; команда требует ключ и выполняет платные запросы:

npm run test:ai-live

Сохранённые отчёты привязаны к указанным в них ревизиям и не означают, что каждый последующий коммит прошёл тот же прогон:

Ограничения текущей версии

  • Редактор карьерной цели ещё не подключён к UI, хотя соответствующий API готов. Без цели система показывает состояние и навыки, но не предлагает фиктивный следующий грейд.
  • Кнопка завершения есть на карточках рекомендаций. Таблицы истории и обязательного обучения пока доступны для просмотра.
  • Дата бизнес-логики фиксирована на 2026-10-01. Отметка прохождения моделирует обновление истории; реальная LMS не подтверждает обучение. Записи на занятия и календарной интеграции нет.
  • Варианты рекомендаций оцениваются отдельно. Прогноз срока повышения и последовательный учебный маршрут не рассчитываются; влияние продукта на вовлечённость не измерено.
  • AI-проверки ограничивают допустимые данные ответа, но не доказывают полную фактическую точность текста. Доступность модели зависит от ключа, сети и прав API-проекта.
  • Общий демо-пароль снимает индивидуальную защиту профилей. Для личных данных предназначен отдельный режим персональных аккаунтов.
  • Корпоративные SSO/MFA, восстановление пароля, управление жизненным циклом аккаунтов и права HR по подразделениям не реализованы. Публичного обмена профилями коллег и согласий на него нет.
  • Docker по умолчанию доступен только локально. Для внутреннего размещения оператор должен настроить HTTPS, точный APP_ORIGIN, сетевой доступ и хранение данных; сам контейнер не создаёт защищённый корпоративный контур.

Развёрнутая версия и материалы

Локальный адрес после запуска — http://localhost:3000. Подтверждённый публичный URL в репозитории не указан; для воспроизведения используйте Docker-инструкцию выше.

Язык объяснений

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

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

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

tomiris 33luxaeternaaaa 30Magzhan 20silence99999 11luxaeternaaaa 4

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

  • 2026-09-23 17:58Merge pull request #25 from BAITC-Hacks/codex/frontend-plain-languageluxaeternaaaa
  • 2026-09-23 17:57Merge remote-tracking branch 'origin/main' into codex/frontend-plain-languageluxaeternaaaa
  • 2026-09-23 17:57Merge pull request #24 from BAITC-Hacks/codex/readiness-plain-russiansilence99999
  • 2026-09-23 17:57Merge remote-tracking branch 'origin/main' into codex/readiness-plain-russiantomiris
  • 2026-09-23 17:56docs: make full-name and admin demo login the primary instructionsMagzhan
  • 2026-09-23 17:54feat(frontend): simplify development flow and explain recommendations plainlyluxaeternaaaa
  • 2026-09-23 17:54fix: explain recommendations in plain Russiantomiris
  • 2026-09-23 17:54docs: write Russian project README for HackAlem juryMagzhan
Все коммиты (98)
  • 2026-09-23 17:43test: bound integration fixture setup for slow Docker diskstomiris
  • 2026-09-23 17:40test: serialize crypto and SQLite integration suites on demo hoststomiris
  • 2026-09-23 17:36fix: explain career readiness in plain Russiantomiris
  • 2026-09-23 17:30Merge pull request #22 from BAITC-Hacks/fix/demo-name-loginJubby786
  • 2026-09-23 17:30test: verify final private import and production completion flowluxaeternaaaa
  • 2026-09-23 17:26docs: record Docker delivery and current main integrationMagzhan
  • 2026-09-23 17:25fix: sign in to demo profiles by full name without typed IDsMagzhan
  • 2026-09-23 17:25Merge remote-tracking branch 'origin/main' into fix/demo-name-loginMagzhan
  • 2026-09-23 17:21Merge backend completion, career goals and private frontend integrationsilence99999
  • 2026-09-23 17:19test: allow full catalog history sweep on constrained demo hoststomiris
  • 2026-09-23 17:18Merge private employee UI and explain completion refusalstomiris
  • 2026-09-23 17:17Merge canonical completion policy and align preview replay with SQLitetomiris
  • 2026-09-23 17:17feat(ai): harden grounded multilingual explanations and quality gatesluxaeternaaaa
  • 2026-09-23 17:02fix: enforce transactional completion eligibility and scoped career goalstomiris
  • 2026-09-23 17:01merge: integrate current main and preserve private frontend lifecycleMagzhan
  • 2026-09-23 17:00docs: verify completion handoff against current mainluxaeternaaaa
  • 2026-09-23 16:59Merge remote-tracking branch 'origin/main' into codex/completion-policyluxaeternaaaa
  • 2026-09-23 16:58feat(frontend): add private HR account flow and explainable Russian UIMagzhan
  • 2026-09-23 16:58feat(ai-data): add completion policy and exact progress previewluxaeternaaaa
  • 2026-09-23 16:54feat: add optional full-name employee demo login (#17)silence99999
  • 2026-09-23 16:53feat: add opt-in employee demo login by full nametomiris
  • 2026-09-23 16:41docs: save authenticated real AI proof and live-test output (#16)silence99999
  • 2026-09-23 16:41docs: save authenticated real AI screenshots and live test evidencetomiris
  • 2026-09-23 16:38Merge current authenticated rehearsal documentationtomiris
  • 2026-09-23 16:36docs: merge authenticated demo rehearsal and independent Docker acceptancesilence99999
  • 2026-09-23 16:32docs: verify independent Docker startup and persistenceluxaeternaaaa
  • 2026-09-23 16:32docs: add recorded rehearsal and final speaker handoffluxaeternaaaa
  • 2026-09-23 16:32docs: rehearse current employee and HR authorization flowluxaeternaaaa
  • 2026-09-23 16:31fix(frontend): remove Halyk logo and retain Career Quest identityMagzhan
  • 2026-09-23 16:26Merge remote-tracking branch 'origin/main' into docs/demo-rehearsalluxaeternaaaa
  • 2026-09-23 16:25docs: add recorded rehearsal and final speaker handoffluxaeternaaaa
  • 2026-09-23 16:22feat: private employee and HR access, diagnostics and frontend handoffsilence99999
  • 2026-09-23 16:21docs: record clean-clone build and data-preserving auth rollouttomiris
  • 2026-09-23 16:20docs: verify independent Docker startup and persistenceluxaeternaaaa
  • 2026-09-23 16:20feat(frontend): redesign Career Quest with Halyk styling and Russian UIMagzhan
  • 2026-09-23 16:19feat: enforce private employee and HR sessions with explainable next-step diagnosticstomiris
  • 2026-09-23 16:19merge: synchronize reviewed main acceptance reporttomiris
  • 2026-09-23 16:18docs: verify independent Docker startup and persistenceluxaeternaaaa
  • 2026-09-23 16:15docs: merge independent acceptance reportsilence99999
  • 2026-09-23 16:06docs: include reviewed independent acceptance reporttomiris
  • 2026-09-23 15:56docs: record independent final-main acceptance and AI race checksluxaeternaaaa
  • 2026-09-23 15:55feat(frontend): add cancellable async recommendations and profile detailsMagzhan
  • 2026-09-23 15:52merge: sync verified backend AI endpoint from mainMagzhan
  • 2026-09-23 15:52Merge PR #12: complete Career Quest product and verified Docker demosilence99999
  • 2026-09-23 15:51docs: record complete Docker, browser and live AI acceptancetomiris
  • 2026-09-23 15:51merge: integrate main full-stack backend into frontend branchMagzhan
  • 2026-09-23 15:50Merge PR #11: reviewed recommendation quality and jury scenariossilence99999
  • 2026-09-23 15:49fix: display all effective skills and finalize teammate integrationtomiris
  • 2026-09-23 15:46merge: integrate reviewed recommendation quality PR 11tomiris
  • 2026-09-23 15:44feat: finish async AI, activity history and jury import flowtomiris
  • 2026-09-23 15:43docs: mark PR 6 server adaptation as resolved by merged AI integrationluxaeternaaaa
  • 2026-09-23 15:42docs: verify goal upsert and full HTTP HR consistencyluxaeternaaaa
  • 2026-09-23 15:38merge: integrate refined teammate frontend designtomiris
  • 2026-09-23 15:38docs: record persisted jury rehearsal and remaining release gatesluxaeternaaaa
  • 2026-09-23 15:37test: validate recommendation quality and jury import scenariosluxaeternaaaa
  • 2026-09-23 15:37Merge remote-tracking branch 'origin/main' into feat/recommendation-qualityluxaeternaaaa
  • 2026-09-23 15:35Merge pull request #10: verified backend AI integrationsilence99999
  • 2026-09-23 15:35feat: bound persisted AI requests and verify live backend integrationtomiris
  • 2026-09-23 15:31merge: integrate teammate persisted AI service from PR 9tomiris
  • 2026-09-23 15:26feat: connect persisted recommendations to validated OpenAI explanationsluxaeternaaaa
  • 2026-09-23 15:21Merge pull request #8: verified Career Quest full-stack integrationsilence99999
  • 2026-09-23 15:21merge: include reviewed AI reliability fixes and document PR blockerstomiris
  • 2026-09-23 15:16docs(frontend): avoid conflict with backend startup guideMagzhan
  • 2026-09-23 15:16refactor(frontend): simplify visual design and improve product UXMagzhan
  • 2026-09-23 15:08Merge remote-tracking branch 'origin/main' into feature/backend-dockertomiris
  • 2026-09-23 15:07test: verify frontend API SQLite integration and document handofftomiris
  • 2026-09-23 15:04Merge pull request #2 from BAITC-Hacks/test/imported-profile-consistencyluxaeternaaaa
  • 2026-09-23 15:03merge: adopt teammate frontend API flow and map SQLite transporttomiris
  • 2026-09-23 15:02Merge pull request #4 from BAITC-Hacks/feat/starter-dataset-adapterluxaeternaaaa
  • 2026-09-23 15:02feat: integrate shared domain adapter and persistent product APItomiris
  • 2026-09-23 14:59feat: connect product recommendations to server-side OpenAIluxaeternaaaa
  • 2026-09-23 14:58fix(frontend): unify decimal readiness and completion feedbackMagzhan
  • 2026-09-23 14:52feat: make frontend consume typed career API responsesMagzhan
  • 2026-09-23 14:52feat: adapt official starter files into validated career dataluxaeternaaaa
  • 2026-09-23 14:52merge: include official starter dataset adapter from PR 4tomiris
  • 2026-09-23 14:52Merge remote-tracking branch 'origin/test/imported-profile-consistency' into feature/backend-dockertomiris
  • 2026-09-23 14:52Merge remote-tracking branch 'origin/docs/frontend-integration-handoff' into feature/backend-dockertomiris
  • 2026-09-23 14:52merge: integrate main domain types and frontend scaffoldtomiris
  • 2026-09-23 14:51feat: implement SQLite backend API and Docker foundationtomiris
  • 2026-09-23 14:51fix: enforce AI explanation deadlines and validate response statusluxaeternaaaa
  • 2026-09-23 14:46feat: adapt official starter files into validated career dataluxaeternaaaa
  • 2026-09-23 14:41docs: record frontend integration checks and team handoffluxaeternaaaa
  • 2026-09-23 14:36Merge Career Quest frontendMagzhan
  • 2026-09-23 14:35test: cover imported profiles and HR completion consistencyluxaeternaaaa
  • 2026-09-23 14:33Merge pull request #1 from BAITC-Hacks/feat/ai-data-engineluxaeternaaaa
  • 2026-09-23 14:32Merge latest AI data engine into frontend branchMagzhan
  • 2026-09-23 14:31feat: build Career Quest frontend demoMagzhan
  • 2026-09-23 14:27fix: preserve attained skills and count partial career progressluxaeternaaaa
  • 2026-09-23 14:07feat: add deterministic Career Quest recommendation engineluxaeternaaaa
  • 2026-09-23 13:53docs: add Career Quest hackathon contextluxaeternaaaa
Структура репозитория (156 файлов)
.dockerignore
.env.example
.gitignore
AGENTS.md
Dockerfile
HACKATHON_CONTEXT.md
README.md
compose.yaml
data/activity_history.csv
data/employees.json
data/events.json
data/skills.json
docs/AI_VERIFICATION.md
docs/BACKEND_HANDOFF.md
docs/BACKEND_PRIVACY.md
docs/BACKEND_VALIDATION.md
docs/COMPLETION_POLICY_HANDOFF.md
docs/DEMO.md
docs/FINAL_REHEARSAL.md
docs/FINAL_VALIDATION.md
docs/FRONTEND_ACCOUNTS_HANDOFF.md
docs/FRONTEND_API.md
docs/FRONTEND_COMPLETION_GOAL_HANDOFF.md
docs/FRONTEND_DESIGN.md
docs/FRONTEND_INTEGRATION_REVIEW.md
docs/FRONTEND_PLAIN_LANGUAGE.md
docs/FRONTEND_PRIVACY_PLAN.md
docs/FRONTEND_PRIVATE_UI.md
docs/INDEPENDENT_ACCEPTANCE.md
docs/JURY_DEMO.md
docs/LIVE_AI_PROOF.md
docs/MERGE_REVIEW.md
docs/PRIVACY_VALIDATION.md
docs/PROGRESS_VALIDATION.md
docs/RELEASE_CHECKLIST.md
docs/REQUIREMENTS.md
docs/STARTER_DATASET_ADAPTER.md
docs/evidence/completion-policy-2026-09-23/npm-test.txt
docs/evidence/live-ai-2026-09-23/.gitattributes
docs/evidence/live-ai-2026-09-23/E0058-ai-explanation-closeup.jpg
docs/evidence/live-ai-2026-09-23/E0058-authenticated-ai-full.jpg
docs/evidence/live-ai-2026-09-23/E0058-visible-explanations.txt
docs/evidence/live-ai-2026-09-23/live-tests.txt
docs/evidence/live-ai-2026-09-23/manifest.json
docs/fixtures/employee.json
docs/fixtures/employees.json
docs/fixtures/hr.json
docs/fixtures/jury-employee.json
docs/fixtures/jury-history.csv
docs/fixtures/recommendations.json
docs/jury/activity_history.csv
docs/jury/employees.json
eslint.config.js
index.html
next-env.d.ts
next.config.ts
package-lock.json
package.json
public/.gitkeep
public/fonts/Manrope-Variable.ttf
public/fonts/OFL-Manrope.txt
src/app/api/auth/login/route.ts
src/app/api/auth/logout/route.ts
src/app/api/auth/session/route.ts
src/app/api/catalog/route.ts
src/app/api/employees/[employeeId]/activities/[eventId]/complete/route.ts
src/app/api/employees/[employeeId]/career-goal/route.ts
src/app/api/employees/[employeeId]/recommendations/route.ts
src/app/api/employees/[employeeId]/route.ts
src/app/api/employees/route.ts
src/app/api/health/route.ts
src/app/api/hr/accounts/route.ts
src/app/api/hr/summary/route.ts
src/app/api/import/route.ts
src/app/globals.css
src/app/layout.tsx
src/app/page.tsx
src/components/AccountsDialog.tsx
src/components/App.tsx
src/components/AuthBoundary.tsx
src/components/EmployeeScreen.tsx
src/components/HRDashboard.tsx
src/components/HRFilters.tsx
src/components/ImportDialog.tsx
src/components/NoNextStepState.tsx
src/components/States.tsx
src/contracts/api.ts
src/contracts/auth.ts
src/contracts/schemas.ts
src/contracts/types.ts
src/env.d.ts
src/hooks/ai-recommendation-request.ts
src/hooks/useAiRecommendations.ts
src/hooks/useApiResource.ts
src/lib/ai/explanations.ts
src/lib/ai/openai-explainer.ts
src/lib/analytics/hr-summary.ts
src/lib/data/normalize.ts
src/lib/data/starter-dataset.ts
src/lib/frontend/api.ts
src/lib/frontend/auth-api.ts
src/lib/frontend/plain-language.ts
src/lib/frontend/readiness.ts
src/lib/frontend/response-validation.ts
src/lib/recommendation/completion.ts
src/lib/recommendation/eligibility.ts
src/lib/recommendation/index.ts
src/main.tsx
src/server/auth/demo-login.ts
src/server/auth/index.ts
src/server/data/parsers.ts
src/server/db/database.ts
src/server/errors.ts
src/server/http.ts
src/server/repositories/index.ts
src/server/services/career-quest.ts
src/server/services/import.ts
src/styles/global.css
src/styles/presentation.css
src/types/career.ts
tests/ai-explanations.test.ts
tests/ai-runtime.test.ts
tests/auth.test.ts
tests/availability-diagnostics.test.ts
tests/backend.test.ts
tests/career-goal-api.test.ts
tests/completion-eligibility-api.test.ts
tests/completion-integration.test.ts
tests/completion-official.test.ts
tests/completion-order.test.ts
tests/completion-policy.test.ts
tests/fixtures/career-dataset.ts
tests/fixtures/completion-dataset.ts
tests/frontend-accounts.test.ts
tests/frontend-ai-control.test.ts
tests/frontend-api.test.ts
tests/frontend-auth-lifecycle.test.ts
tests/frontend-auth.test.ts
tests/frontend-hr-filters.test.ts
tests/frontend-import.test.ts
tests/frontend-plain-language.test.ts
tests/frontend-readiness.test.ts
tests/frontend-render.test.ts
tests/helpers/auth.ts
tests/hr-summary.test.ts
tests/http.test.ts
tests/imported-account-access.test.ts
tests/imported-profiles.test.ts
tests/jury-import.test.ts
tests/openai-live.test.ts
tests/recommendation-quality.test.ts
tests/recommendation.test.ts
tests/starter-dataset.test.ts
tsconfig.json
vite.config.ts
vitest.config.ts
Ветки (29)

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

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

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