AAYMA
RU
Войти

Career Quest

Полноценное веб-приложение карьерного навигатора: профиль, цель, 1–3 AI-рекомендации с объяснением, preview эффекта, подтверждение завершения с…

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

О проекте

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

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

Суть

Полноценное веб-приложение карьерного навигатора: профиль, цель, 1–3 AI-рекомендации с объяснением, preview эффекта, подтверждение завершения с пересчётом навыков, HR-аналитика дефицитов и импорт JSON/CSV.

Как устроено

Python-бэкенд с SQLite и миграциями считает прогресс детерминированно и формирует контекст для AI-модуля (prompts, provider, validation). Модуль вызывает OpenAI gpt-4.1-mini с таймаутом и проверяет ответ по JSON-схемам контрактов. Если модель недоступна, показывается ошибка с ручным повтором, заранее заготовленные ответы не подставляются. Фронтенд на React/TypeScript (Vite, pnpm), в публичном Docker-режиме у каждого посетителя своя SQLite-копия синтетических данных. HR видит частые дефициты, причины отсутствия следующего шага и участие по статусам.

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

  • LLM recommendations with JSON-schema validation
  • deterministic skill progression
  • atomic batch imports
  • OpenAPI contracts
  • per-visitor sandbox workspaces

Особенности

Контрактная разработка (API/AI-контракты, JSON-схемы, синтетические примеры) и отдельные отчёты по latency, интеграции и готовности. Публичный демо-режим изолирует данные каждого посетителя в отдельной SQLite. AI не подменяется заранее подготовленными ответами при сбое.

Стек

Python · SQLite · React · TypeScript · Vite · pnpm · Docker Compose · GitHub Actions CI

Модели

gpt-4.1-mini-2025-04-14 (OpenAI)


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

README

README.md

Career Quest

AI-навигатор развития сотрудника для кейса Halyk Bank на HackAlem AI. Приложение связывает карьерную цель, текущие навыки и историю участия с конкретным следующим действием: предлагает 1–3 подходящие активности, объясняет выбор и пересчитывает прогресс после выполнения. HR видит дефициты компетенций, сотрудников без актуальной рекомендации и участие в мероприятиях.

Основной путь: профиль → цель → рекомендация с основаниями → выполнение → новые навыки и прогресс. Процент показывает соответствие требованиям выбранной роли, а не вероятность или гарантию повышения.

В main объединены frontend, backend и AI. Обязательный сценарий проверен в Docker и браузере с настоящим OpenAI на собственных синтетических данных. Результаты относятся к проверке 23 сентября 2026: итоговый отчёт, исходное ТЗ, сценарий защиты.

Содержание

Возможности

ПользовательЧто доступно
СотрудникПрофиль, роль/грейд, карьерная цель и её изменение, текущие навыки, разрывы до цели, история участия
СотрудникДо трёх AI-рекомендаций с объяснением, каталог с поиском и фильтрами, предварительный расчёт эффекта активности
СотрудникПодтверждение завершения, обновление навыков и прогресса, сохранение истории; отдельная явно обозначенная симуляция
HRСводка по команде, частые дефициты, критичные для целей навыки, причины отсутствия актуального следующего шага
HRУчастие по мероприятиям и статусам за выбранный период, список сотрудников с пагинацией, просмотр профиля
HRЗагрузка профилей и истории в JSON/CSV с проверкой всей партии перед записью

Интерфейс обрабатывает ожидание, отсутствие цели или кандидатов, недоступность AI, устаревшие рекомендации, конфликт версии и истёкшую сессию. Ошибка API не переключает приложение на подготовленные демо-ответы.

Публичных рейтингов сотрудников нет — они запрещены ТЗ. Отсутствие истории или пропуски не трактуются как доказательство низкой мотивации. Баллы, награды, прогноз оттока и полная локализация относятся к возможным расширениям и не заявляются готовыми функциями. Voice Router — другой кейс хакатона.

Быстрый запуск с настоящим AI

Нужны Git, доступ к этому репозиторию, Docker с работающим daemon и Docker Compose. Python и Node на хосте для этого пути не требуются: зависимости и frontend собираются внутри образа.

git clone https://github.com/BAITC-Hacks/hack-d59a47be-67.git career-quest
cd career-quest
# Создать конфигурацию только при отсутствии существующей:
test -f .env || cp .env.example .env

В локальном .env установите:

AI_ENABLED=true
OPENAI_API_KEY=<ваш существующий ключ>
OPENAI_MODEL=gpt-4.1-mini-2025-04-14
AI_TIMEOUT_SECONDS=6.0

Запустите из корня репозитория:

docker compose --env-file .env -f compose.public.yaml up --build

Откройте http://localhost:8080. Первая сборка скачивает зависимости. Кнопки «Кабинет сотрудника» и «Кабинет HR» создают серверную сессию без общего пароля. Для каждого посетителя создаётся отдельная SQLite-копия собственных вымышленных данных проекта. Переключение кабинета в одном браузере сохраняет эту копию; другой браузер или независимая приватная сессия получает свою.

Модель получает контекст от backend; ключ не попадает в frontend, Git или Docker image. Вызовы модели используют ваш API-аккаунт. .env не нужно загружать через интерфейс или добавлять в коммит.

Если пока нужен запуск без AI:

AI_ENABLED=false docker compose -f compose.public.yaml up --build

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

Проверка доступности и управление запущенной копией:

curl --fail http://localhost:8080/api/health/ready
curl --fail http://localhost:8080/api/version
docker compose -f compose.public.yaml restart web
docker compose -f compose.public.yaml down

restart сохраняет данные того же контейнера; down удаляет контейнер вместе с временными public-данными. Режим имеет ограниченный срок сессии и квоты. Это учебная копия, не постоянное хранилище. Compose привязывает порт к localhost; команда сама по себе не публикует сервис в интернете.

Сценарий демонстрации

  1. Открыть сотрудника. Показать роль/грейд, цель, текущие навыки, историю и процент соответствия требованиям.
  2. Нажать «Подобрать шаги». Получить 1–3 карточки. Раскрыть «Почему вам подходит»: цель и грейд, разрыв навыка, критичность для цели, история участия и доступность активности.
  3. Открыть «Посмотреть результат». Preview показывает ожидаемый прирост, ещё не меняя данные. Для вымышленной активности подтвердить завершение; симуляцию выбирать отдельно, если нужен именно учебный результат.
  4. Сверить изменения. В проверенном примере «Проектирование систем» выросло с 2 до 3, прогресс — с 56,25% до 62,5%. Появилась запись истории, предыдущий подбор стал устаревшим.
  5. Перейти в HR. Убедиться, что уменьшился разрыв навыка, добавилось участие и показана причина «Рекомендация устарела». До первого подбора отображается «Подбор ещё не выполнен».
  6. Проверить импорт. В HR скачать «Пример профилей JSON» и «Пример истории CSV», выбрать оба файла в импорте, проверить и подтвердить. В новой учебной копии сотрудников станет 6 вместо 3; во втором независимом браузере останется 3.
  7. Перезагрузить страницу или перезапустить контейнер. В пределах действующей сессии и того же контейнера сохранить профиль, историю и рассчитанный прогресс.

Скриншот HR после выполнения · Подробный сценарий защиты по ТЗ.

Режимы запуска

Все команды в таблице выполняются из корня после соответствующей подготовки.

РежимКомандаДанные и AI
Учебный public Dockerdocker compose --env-file .env -f compose.public.yaml up --buildUI+API на localhost:8080; временная копия на посетителя; настоящий AI при явном включении
Частный Dockerdocker compose up --buildUI+API на localhost:8000; постоянный volume sqlite_data; нужны первоначальный импорт и accounts
Локальный UI+APIpnpm --dir frontend startСуществующая база и корневой .env; backend на 8000, Vite на 5173
Локальное серверное демоpnpm --dir frontend start:demoОтдельная синтетическая SQLite и случайные accounts; AI принудительно выключен
Только frontendpnpm --dir frontend devVite на 5173; /api проксируется на отдельно запущенный backend
Готовые примеры интерфейсаpnpm --dir frontend dev → «Посмотреть демо»Backend не нужен; подготовленные браузерные ответы, без настоящего AI, импорта и общей HR-аналитики

compose.public.yaml используется самостоятельно, а не как дополнение к compose.yaml. Для профилей жюри с идентификаторами исходного кита нужен частный режим с совместимым каталогом.

Частная база и данные жюри

Исходный набор организаторов хранится локально и не входит в репозиторий или образ. Он содержит 200 сотрудников, 40 мероприятий, 60 навыков, 32 профиля ролей/грейдов и 2743 записи истории. Дата сценария — 2026-10-01. Собственные public-примеры не заменяют этот набор.

Для частного Docker подготовьте .env по примеру и локальную папку с четырьмя файлами: skills.json, events.json, employees.json, activity_history.csv. Для офлайн-проверки ограниченного кита оставьте AI_ENABLED=false. Передача этих данных внешнему AI требует разрешения организаторов; наши live-проверки используют только собственные fixtures.

Однократная подготовка из корня:

docker compose build
# Замените абсолютный путь локальной папкой с четырьмя файлами:
docker compose run --rm --volume "/absolute/path/to/dataset:/kit:ro" backend python -m backend.app.cli import-kit /kit
# После успешной проверки записать всю партию:
docker compose run --rm --volume "/absolute/path/to/dataset:/kit:ro" backend python -m backend.app.cli import-kit /kit --commit
docker compose run --rm backend python -m backend.app.cli create-account --username demo-hr --role hr
docker compose run --rm backend python -m backend.app.cli create-account --username demo-employee --role employee --employee-id EXISTING_EMPLOYEE_ID
docker compose up --build

Замените EXISTING_EMPLOYEE_ID идентификатором импортированного сотрудника. Пароль вводится скрыто дважды, длина 12–256 символов. Общих логинов/паролей в Git нет; роль назначает сервер. Каталог монтируется read-only и не копируется в образ. CLI и приложение используют один volume sqlite_data.

После подготовки достаточно docker compose up --build и входа на http://localhost:8000. Обычный docker compose down сохраняет именованный volume; down --volumes удаляет его вместе с данными. Не включайте PUBLIC_DEMO_MODE для частной базы кита.

Жюри может загрузить дополнительные профили и связанную историю через HR-интерфейс. Правила формата и конфликтов описаны ниже; дополнительные операционные команды — в HANDOFF.

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

Нужны Python 3.12, Node.js ≥ 22.12.0 и pnpm 11.25.0. Команды для macOS/Linux:

python3.12 -m venv .venv
.venv/bin/python -m pip install -r requirements-dev.lock
pnpm --dir frontend install --frozen-lockfile
test -f .env || cp .env.example .env

Для быстрого серверного демо на собственных данных:

PUBLIC_DEMO_MODE=false pnpm --dir frontend start:demo

Откройте http://127.0.0.1:5173. Локальные логины и случайные пароли находятся в игнорируемом frontend/.local-demo.json, база — в frontend/.qa/demo.sqlite3. Повторный запуск сохраняет данные. Этот режим использует настоящий API, но принудительно выключает AI; завершение можно проверить через каталог.

Для существующего кита сначала импортируйте его и создайте accounts по HANDOFF, затем используйте pnpm --dir frontend start. Он читает корневой .env и DATABASE_PATH, не создавая демонстрационную базу. Если backend уже работает, достаточно pnpm --dir frontend dev; другой API-адрес задаётся через API_PROXY_TARGET.

Ctrl+C останавливает процессы текущего запуска. CQ_API_PORT, CQ_UI_PORT, CQ_PYTHON задаются в окружении команды Node для смены портов или Python; занятые порты не освобождаются автоматически. Для Windows и просмотра frontend-сборки см. frontend/README.md.

Архитектура

Приложение — модульный монолит: React + TypeScript + Vite → FastAPI/Pydantic → SQLite. AI вызывается внутри backend; отдельный AI-сервер не нужен. Docker собирает frontend и раздаёт готовые файлы вместе с API с одного origin, от непривилегированного пользователя.

flowchart LR
    User[Сотрудник / HR] --> UI[React + TypeScript]
    UI -->|HTTP /api, cookie, CSRF| API[FastAPI]
    API --> Domain[Навыки, цели, допуск, прогресс]
    API --> Import[Проверка и импорт JSON/CSV]
    API --> HR[HR-аналитика]
    Domain <--> DB[(SQLite)]
    Import --> DB
    HR --> DB
    Domain -->|Подготовленный контекст| AI[AI-модуль]
    AI -->|Выбор ID| LLM[OpenAI]
    LLM --> Validate[Проверка ответа и фактов]
    Validate --> Cards[Карточки и объяснения]
    Cards --> DB
    Cards --> API
КомпонентОтветственность
FrontendФормы, навигация, карточки, прогресс и HR-срезы; серверные значения не пересчитываются самостоятельно
Domain/serviceВосстановление навыков, выбор цели, разрывы, допуск активности, preview и транзакционное завершение
AIМногофакторный выбор из допустимых кандидатов, структурная и смысловая проверка ответа, контролируемый timeout
SQLiteИсходные записи, локальные действия, accounts/сессии, revision, идемпотентные ответы и сохранённые рекомендации
Общие контрактыPydantic-модели → OpenAPI → генерируемые frontend-типы

Прототип рассчитан на один процесс/реплику с локальным SQLite. WAL включается только при явном подтверждении локального диска одного хоста. Переход к нескольким репликам или production-нагрузке требует отдельного решения по хранению и эксплуатации.

Как выбираются рекомендации

  1. Backend восстанавливает состояние сотрудника: оценка навыков, последующая история, карьерная цель и требования нужной роли/грейда.
  2. Отбирает полезные допустимые активности: текущая роль/грейд, prerequisites, расписание, уже выполненные события и ожидаемый эффект. Желаемая роль не расширяет текущую аудиторию мероприятия. Обязательные активности исключены из рекомендательного подбора.
  3. Собирает факты: критичность навыка для цели, разрывы, история конкретного события и отдельная история других событий того же типа/формата. Отсутствие записей передаётся как отсутствие данных.
  4. Модель выбирает 1–3 ID из переданных кандидатов. Правильный ответ и рубрика оценки в prompt не передаются.
  5. Валидатор проверяет результат. Посторонние ID, несвязанные факты и некорректная структура не становятся рекомендацией. Пользовательские объяснения строятся из подтверждённых серверных данных, а не свободных утверждений модели.
  6. Backend сохраняет полные карточки. Перед записью повторно сверяется revision; изменение профиля во время запроса не даёт сохранить результат как актуальный. Транзакция БД не удерживается во время сетевого AI-вызова.

Например, самый низкий навык может быть Public Speaking, но для цели критичен System Design, а похожие выступления неоднократно пропускались. Контекст позволяет учитывать все эти обстоятельства, не сводя выбор к минимальному числу в профиле. Пропуски не объявляются предпочтениями или оценкой мотивации.

Ответ APIЗначение
ok / olegПроверенные рекомендации получены
no_target / noneНет разрешённой карьерной цели
no_candidates / noneНет полезных допустимых кандидатов
not_configured / noneAI выключен или модуль не подключён
unavailable / olegВызов не удался, превысил время или ответ отклонён проверкой
stale=trueСохранённый ответ относится к прежней версии данных; нужен новый подбор

oleg — техническое имя движка в контракте. Текущая модель в конфигурации — gpt-4.1-mini-2025-04-14. Deadline AI — 6 секунд внутри 7-секундного backend adapter; ТЗ допускает до 10 секунд. В приложении нет автоматической подмены результата эвристикой и скрытых повторов для улучшения показателей.

Расчёт навыков и прогресса

employees.skills — оценка на last_review_date. Сервер последовательно применяет только завершённые активности после этой оценки и не позднее даты сценария. Пропуск, отказ или незавершённое участие прирост не дают. Неизвестный ID навыка — ошибка; отсутствующий известный навык имеет уровень 0.

Для каждого эффекта мероприятия:

новый уровень = max(текущий, min(текущий + gain, max_level, 5))
прогресс = 100 × Σ min(текущий уровень, требование цели) / Σ требований цели

Уровень не снижается, если уже выше cap. Избыток одного навыка не компенсирует дефицит другого. Выполненные критичные требования показываются отдельно; при отсутствии цели процент не вычисляется. Явная цель имеет приоритет, иначе используется следующий грейд текущей роли. Lead без явной цели получает состояние «нет цели».

Историческая дата CSV — приблизительная дата, а не подтверждённый timestamp завершения. Новые действия получают серверное время сценария; реальное время записи сохраняется отдельно. Интерфейс отличает импортированную историю, обычное завершение и симуляцию.

Preview не изменяет навыки и историю. Completion, изменение цели и изменяющий импорт увеличивают state_version и делают прежние рекомендации устаревшими. Точный повтор completion с тем же Idempotency-Key и телом возвращает сохранённый ответ без повторного начисления, даже после изменения revision или исчерпания public-квоты. Другое тело с прежним ключом — конфликт 409.

HR-аналитика

HR получает три среза одной версии данных; запрос аналитики сам не вызывает AI:

  • Частые дефициты. Для навыка показаны сотрудники с разрывом, доля среди тех, чья цель требует этот навык, средний разрыв и число критичных дефицитов.
  • Кому нужен следующий шаг. Различаются отсутствующий, устаревший, неуспешный подбор, отключённый AI, отсутствие цели или кандидатов. Успешный актуальный подбор снимает соответствующий сигнал; достигнутая цель не считается проблемой.
  • Участие в активностях. Уникальные участники, число записей и статусы по мероприятиям; повторные назначения сохраняются. В UI доступны периоды 30/90/180 дней, заканчивающиеся датой сценария.

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

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

ФайлСтруктура и назначение
skills.jsonmeta, proficiency_scale, skills, role_profiles: каталог навыков и требования ролей/грейдов
events.jsonmeta, events: аудитория, формат, prerequisites, сессии и эффекты gain/max_level
employees.jsonmeta, employees: профили, baseline навыков, дата оценки и цель
activity_history.csvУчастие: record_id,employee_id,event_id,date,due_date,status,completion_pct,score,feedback_rating,assigned_by

JSON содержит объект-обёртку, а не голый массив. meta включает dataset, version, as_of_date. Точные поля и примеры transport — в HTTP-контракте, синтетические примеры — в contracts/examples.

HR-интерфейс принимает дополнительные профили JSON и историю CSV в UTF-8; связанные новые профили и историю следует выбрать вместе. Импорт проходит два этапа:

  1. Проверка: структура, значения, ссылки между файлами и конфликты; возвращаются количества, предупреждения и preview_token. Предметные данные не меняются.
  2. Подтверждение: те же файлы и token записываются атомарно. Token связан с содержимым и revision и действует 15 минут. Если данные изменились, требуется новая проверка.

Невалидная строка отменяет всю партию. Повтор неизменённых записей не создаёт дубликаты. Новые employee_id/record_id добавляются; изменённые существующие записи отклоняются, режим произвольной замены профиля/истории не реализован. Разные record_id сохраняются даже при совпадении сотрудника, события и даты. Повтор исходного импорта не стирает локальные завершения и изменения целей.

API/CLI также поддерживают каталоги навыков и событий; их замена проверяет ссылки всех сохранённых данных и предупреждает о пересчёте. Исходный кит, профили жюри, БД и ZIP исключены из Git.

Конфигурация и API

Основа локальной конфигурации — .env.example. Docker передаёт только явно указанные в Compose переменные; путь БД и настройки public-изоляции заданы самим выбранным Compose-файлом.

ПеременнаяНазначение
AI_ENABLEDВключение AI; по умолчанию false
OPENAI_API_KEYСуществующий ключ только на стороне backend
OPENAI_MODELМодель; проверенный snapshot указан выше
AI_TIMEOUT_SECONDSDeadline вызова AI, по умолчанию 6.0
DATABASE_PATHSQLite-файл для локального запуска; Docker использует /data/career_quest.sqlite3
ALLOWED_ORIGINSJSON-массив точных разрешённых origin; wildcard не используется
SESSION_TTL_SECONDSВремя сессии, по умолчанию 3600 секунд
PUBLIC_DEMO_MODEИзолированные учебные копии; в частной среде false, в public Compose задан true
APP_ENV / COOKIE_SECUREПрофиль среды и cookie; HTTPS-staging требует Secure
COMMIT_SHAВерсия сборки в /api/version; при отсутствии — unknown

Источник схем — backend/app/contracts.py; экспорт — OpenAPI. На локальном сервере доступен Swagger UI: /docs.

МаршрутНазначение
GET /api/health, GET /api/health/readyЖивой процесс и готовность БД/миграций
GET /api/versionВерсия API и commit сборки
POST /api/auth/login, POST /api/auth/logout, GET /api/meЧастная сессия, выход и текущая identity
GET /api/catalog, GET /api/employees/{id}Каталог и профиль
PATCH /api/employees/{id}/goalИзменение карьерной цели
POST /api/employees/{id}/recommendationsЗапрос нового подбора
GET /api/employees/{id}/recommendations/latestСохранённый результат и его актуальность
POST /api/employees/{id}/preview, POST /api/employees/{id}/completionsПредварительный эффект и запись завершения
GET /api/employees, GET /api/hr/summary, GET /api/hr/analyticsСписок и сводки HR
POST /api/hr/importПроверка и подтверждение импорта

Права проверяет сервер: employee видит только свой профиль, HR — данные своей области доступа. Используются HttpOnly-cookie, Origin и CSRF; frontend не назначает себе рабочую роль. В public-режиме выбор employee/HR относится только к собственной вымышленной копии. Подробности public endpoints и квот — в API.

Успешная readiness подтверждает доступность БД, но не успешность AI или наличие кита. В public-режиме служебная БД и пользовательские копии разделены. configured/oleg означает загрузку модуля; доступность провайдера подтверждает только фактический вызов.

Проверки и результаты

После установки зависимостей:

make check
.venv/bin/python -m pytest backend/tests/oleg_backend_handoff_acceptance.py -q
.venv/bin/python scripts/smoke.py --ai
.venv/bin/python scripts/check_container.py --require-ai
pnpm --dir frontend test
pnpm --dir frontend build
pnpm --dir frontend format:check

Обычные тесты работают на собственных fixtures без ключа и отправки данных модели. TCP-smoke использует настоящее приложение, подменяя только удалённый selector в тестовом процессе. Container checker требует Docker, создаёт отдельные проверочные ресурсы и проверяет образ, права, сессии, volume и повтор завершения после пересоздания.

При изменении контрактов:

scripts/export-openapi
pnpm --dir frontend generate:api
git diff -- contracts/openapi.json frontend/src/api/schema.ts

Отдельная opt-in проверка настоящего AI:

.venv/bin/python -m backend.app.ai.latency_evaluation --live --env-file .env --rounds 3

Это девять API-запросов с использованием вашего аккаунта на собственных синтетических контекстах: критичный навык против самого низкого, повторные пропуски формата при наличии альтернативы, отсутствие истории. Без --live evaluator проверяет fixtures без сети.

Приёмка от 23.09.2026Результат
Backend/AI538 pytest, отдельно 19 handoff, 21 dataset unittest, 9 групп schema checks, Ruff — PASS
Frontend69 тестов, TypeScript/Vite build, форматирование и согласованность OpenAPI-типов — PASS
Live AI9/9, медиана 1,28 s, максимум 3,27 s; отдельный браузерный вызов — 3 карточки за 1,69 s
Docker/браузерПрофиль → AI → completion → новые навыки → HR → restart; точный replay и изоляция импорта — PASS
Исходный кит офлайн200 профилей валидны; 3075 записей импортированы, повтор — 0 изменений; внешних AI-вызовов не было

Полные версии, команды, замеры и границы проверки — FINAL_REPORT, девять отдельных AI-попыток — final-live-ai.json. Эти результаты не выдаются за новый тестовый прогон после каждой правки документации.

ТЗ задаёт UI ≤ 2 s и AI ≤ 10 s. Локальные замеры не доказывают SLA под нагрузкой; исторический timeout модели сохранён в отчётах. GitHub Actions имеет подтверждённую ранее блокировку биллинга организации: локальные PASS не означают зелёный CI. AMD64, production-нагрузка, скрытые профили жюри и постоянный публичный хостинг не объявляются проверенными.

Решение типичных проблем

СимптомЧто проверить
Docker не запускается или порт занятЗапущен ли daemon; свободен ли 8080 для public / 8000 для private; не запущена ли другая копия
Профиль отвечает DATASET_NOT_LOADEDВ private-режиме импортировать четыре файла с --commit; наличие файлов рядом с кодом не загружает их в БД
not_configuredФлаг AI_ENABLED, наличие AI-модуля; для настоящего подбора не использовать start:demo
unavailableКлюч, доступ/квота провайдера, сеть, timeout или отклонённый ответ; показать ошибку и при необходимости выполнить ручной повтор
«Нет подходящих активностей»Цель, текущая аудитория/грейд, prerequisites, расписание, полезный прирост и уже выполненные события
Устаревшие рекомендации или 409Обновить профиль; для нового действия использовать текущую revision. При повторе потерянного completion сохранять прежние body и key
401 / 403Войти заново; проверить роль, Origin и CSRF. При локальной разработке не смешивать hostname localhost и 127.0.0.1
Импорт отклонёнUTF-8, JSON-обёртка, точные имена файлов, совместимый каталог, связанные JSON+CSV в одной партии; при истёкшем token повторить preview
429 в public-демоДостигнута квота; учитывать сообщение API. Logout и точный повтор уже сохранённого completion остаются доступны
После пересоздания public-контейнера исчезли данныеЭто временный режим; для постоянной локальной базы использовать private Docker с sqlite_data

Не публикуйте содержимое .env, cookie, пароли или вывод docker compose config с реальным ключом. Настройка постоянного размещения описана отдельно в PUBLIC_DEPLOYMENT; локальная команда запуска не подтверждает такой deploy.

Структура проекта и работа команды

backend/app/             FastAPI, domain, service, auth, импорт, HR, контракты
backend/app/ai/          OpenAI transport, prompt, validation, evaluators
backend/migrations/     Схема SQLite и миграции
backend/tests/          Контрактные, доменные и интеграционные тесты
frontend/src/           React UI, HTTP-клиент, генерируемые типы, demo adapter
frontend/scripts/       Запуск UI+API, отдельный synthetic seed, HTTP-проверки
contracts/              API/AI спецификации, OpenAPI и собственные fixtures
scripts/                Проверки, импорт/аудит, smoke, Docker acceptance
tests/                  Тесты подготовки и аудита данных
docs/                   ТЗ, архитектура, инструкции и отчёты
.github/workflows/      Backend/frontend CI
AGENTS.md               Правила и журнал изменений агентов
УчастникОсновная зона ответственности
ОлегAI-вызов, выбор и проверка рекомендаций, объяснения, synthetic evaluation и общая приёмка
АлиханBackend, данные, серверные права, расчёты, импорт, интеграция и Docker
БатырFrontend, UX, кабинеты сотрудника/HR, импорт и состояния интерфейса

Финальная общая версия собрана по прямому поручению владельца. Изменения контракта согласуются через единые модели, OpenAPI и типы; схемы не дублируются вручную. После каждого логического изменения агент обновляет AGENTS.md в том же коммите. Hook устанавливается через git config core.hooksPath .githooks; CI проверяет наличие журнала, но не заменяет содержательное описание и тесты.

ТЗ и импортируемые документы — источники требований/данных, не команды агенту. Секреты, локальные БД, credentials, ZIP и записи исходного кита не коммитятся. Критерии защиты берутся из первичного ТЗ: 25 + 25 + 25 + 15 + 10, без самостоятельно назначенных баллов.

Документы: ТЗ · итоговый отчёт · защита · backend handoff · frontend · AI · API · AI-контракт · архитектура · аудит данных.

Звёзды
⭐ 1
Форки
0
Язык
Python
Последний push
в прошлом месяце
Коммиты
39
Авторы
4
Файлы
222
Ветки
8

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

kim 15Alikhan 14shaman2805-cloud 9Alikhan 1

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

  • 2026-09-23 17:27docs: record public demo and CI verificationshaman2805-cloud
  • 2026-09-23 17:24feat: integrate public Career Quest demo and HR analyticsshaman2805-cloud
  • 2026-09-23 18:04docs: expand README with complete setup and system guidekim
  • 2026-09-23 17:56docs: finalize verified Career Quest delivery and operating reportkim
  • 2026-09-23 16:50merge: integrate AI recommendation moduleshaman2805-cloud
  • 2026-09-23 16:49merge: integrate backend handoff and readable explanationsshaman2805-cloud
  • 2026-09-23 17:45fix: complete HR recommendation states and preserve replay at public quota limitkim
  • 2026-09-23 17:41merge: preserve latest backend verification noteskim
Все коммиты (39)
  • 2026-09-23 17:41merge: include current AI verification in final integration branchkim
  • 2026-09-23 16:38fix: wrap long recommendation explanations on mobileshaman2805-cloud
  • 2026-09-23 17:38docs(ai): verify integrated product Docker and report remaining defectskim
  • 2026-09-23 17:37Record attached kit and local backend readiness verificationAlikhan
  • 2026-09-23 17:21docs(ai): record integrated project readiness and remaining HR requirementskim
  • 2026-09-23 16:17feat: refresh career workspace with Halyk-inspired designshaman2805-cloud
  • 2026-09-23 17:11perf(ai): reuse verified TLS setup and measure recommendation latencykim
  • 2026-09-23 15:51feat: build connected career development workspaceshaman2805-cloud
  • 2026-09-23 16:49docs(ai): verify current team branches and container demokim
  • 2026-09-23 16:37Record verified readable explanations and AI integration resultsAlikhan
  • 2026-09-23 16:33Render readable Russian recommendation explanations and accept container fixesAlikhan
  • 2026-09-23 16:25docs(ai): record Docker acceptance and verified infrastructure fixeskim
  • 2026-09-23 15:15docs: clarify frontend ownership and planned deliverablesshaman2805-cloud
  • 2026-09-23 16:07fix(ai): retain history evidence and verify backend frontend integrationkim
  • 2026-09-23 16:06Record combined TCP integration and unavailable Docker resultAlikhan
  • 2026-09-23 16:05Add reproducible AI TCP and isolated container acceptance commandsAlikhan
  • 2026-09-23 15:01docs: clarify frontend ownership and planned deliverablesshaman2805-cloud
  • 2026-09-23 15:50Record AI handoff PR and conflict-free branch verificationAlikhan
  • 2026-09-23 15:48Enrich backend AI facts and verify PR3 integrationAlikhan
  • 2026-09-23 15:45Prepare optional AI runtime dependencies and container configurationAlikhan
  • 2026-09-23 15:34docs: record AI pull request and CI blockerkim
  • 2026-09-23 15:33feat: implement validated OpenAI recommendation modulekim
  • 2026-09-23 15:05Merge pull request #2 from BAITC-Hacks/codex/backend-foundationAlikhan
  • 2026-09-23 15:03Document published backend PR and local runtime verificationAlikhan
  • 2026-09-23 15:00Implement transactional career API and acceptance workflowsAlikhan
  • 2026-09-23 14:41Unify approved backend contracts and generated AI schemasAlikhan
  • 2026-09-23 14:35Integrate assigned team repository history and ownershipAlikhan
  • 2026-09-23 14:34Implement deterministic progression and atomic source importsAlikhan
  • 2026-09-23 14:14docs: record published architecture and external CI blockerkim
  • 2026-09-23 14:12Add Career Quest backend foundation and shared v1 contractsAlikhan
  • 2026-09-23 14:12docs: establish Career Quest architecture and validated contractskim
Структура репозитория (222 файлов)
.dockerignore
.env.example
.gitattributes
.githooks/pre-commit
.github/workflows/checks.yml
.gitignore
.python-version
AGENTS.md
Dockerfile
Makefile
README.md
backend/README.md
backend/__init__.py
backend/app/__init__.py
backend/app/ai/DOCKER_REPORT.md
backend/app/ai/INTEGRATION_REPORT.md
backend/app/ai/LATENCY_REPORT.md
backend/app/ai/PRODUCT_REPORT.md
backend/app/ai/READINESS_REPORT.md
backend/app/ai/README.md
backend/app/ai/SYSTEM_REPORT.md
backend/app/ai/__init__.py
backend/app/ai/backend_evaluation.py
backend/app/ai/backend_evaluation_sources.py
backend/app/ai/backend_verification.json
backend/app/ai/config.py
backend/app/ai/container_verification.json
backend/app/ai/evaluation.py
backend/app/ai/evaluation_cases.json
backend/app/ai/latency_evaluation.py
backend/app/ai/latency_verification.json
backend/app/ai/prompts.py
backend/app/ai/provider.py
backend/app/ai/requirements.txt
backend/app/ai/service.py
backend/app/ai/system_verification.json
backend/app/ai/validation.py
backend/app/ai/verification.json
backend/app/ai/verification/container-fixes.patch
backend/app/ai/verification/current-desktop.png
backend/app/ai/verification/current-mobile.png
backend/app/ai/verification/docker-after-restart.png
backend/app/ai/verification/history-mobile.png
backend/app/ai/verification/product-hr-completed.png
backend/app/ai/verification/readiness-hr.png
backend/app/ai/verification/recommendation-evidence-mobile.png
backend/app/ai_adapter.py
backend/app/auth.py
backend/app/cli.py
backend/app/config.py
backend/app/contracts.py
backend/app/database.py
backend/app/demo_seed.py
backend/app/domain.py
backend/app/errors.py
backend/app/explanations.py
backend/app/export_openapi.py
backend/app/hr_analytics.py
backend/app/hr_routes.py
backend/app/imports.py
backend/app/main.py
backend/app/public_demo.py
backend/app/run.py
backend/app/serve.py
backend/app/service.py
backend/app/source_models.py
backend/migrations/001_initial.sql
backend/migrations/002_domain.sql
backend/migrations/003_operations.sql
backend/migrations/004_source_profiles.sql
backend/migrations/005_public_workspaces.sql
backend/tests/ai_smoke_server.py
backend/tests/fixtures.py
backend/tests/oleg_backend_handoff_acceptance.py
backend/tests/test_ai_adapter.py
backend/tests/test_api.py
backend/tests/test_cli.py
backend/tests/test_container_check.py
backend/tests/test_context_handoff.py
backend/tests/test_contracts.py
backend/tests/test_database.py
backend/tests/test_domain.py
backend/tests/test_explanations.py
backend/tests/test_hr_analytics.py
backend/tests/test_imports.py
backend/tests/test_oleg_evaluation.py
backend/tests/test_oleg_integration.py
backend/tests/test_oleg_latency_evaluation.py
backend/tests/test_oleg_provider.py
backend/tests/test_oleg_service.py
backend/tests/test_oleg_tls.py
backend/tests/test_oleg_validation.py
backend/tests/test_public_demo.py
backend/tests/test_public_replay.py
backend/tests/test_smoke_evidence.py
backend/tests/test_workflow.py
compose.public.yaml
compose.yaml
contracts/AI_CONTRACT.md
contracts/API.md
contracts/README.md
contracts/examples/ai_context.synthetic.json
contracts/examples/ai_enriched_context.synthetic.json
contracts/examples/ai_enriched_result.synthetic.json
contracts/examples/ai_no_candidates.synthetic.json
contracts/examples/ai_not_configured.synthetic.json
contracts/examples/ai_result.synthetic.json
contracts/examples/batch_import_commit.synthetic.json
contracts/examples/batch_import_request.synthetic.json
contracts/examples/catalog.synthetic.json
contracts/examples/completion_assigned_request.synthetic.json
contracts/examples/completion_request.synthetic.json
contracts/examples/completion_response.synthetic.json
contracts/examples/employee.synthetic.json
contracts/examples/employee_no_target.synthetic.json
contracts/examples/employees.synthetic.json
contracts/examples/error.synthetic.json
contracts/examples/goal_request.synthetic.json
contracts/examples/health.synthetic.json
contracts/examples/hr_summary.synthetic.json
contracts/examples/import_request.synthetic.json
contracts/examples/import_response.synthetic.json
contracts/examples/login_request.synthetic.json
contracts/examples/login_response.synthetic.json
contracts/examples/logout.synthetic.json
contracts/examples/me.synthetic.json
contracts/examples/preview_request.synthetic.json
contracts/examples/preview_response.synthetic.json
contracts/examples/readiness.synthetic.json
contracts/examples/recommendation-context.json
contracts/examples/recommendation-result.json
contracts/examples/recommendation_no_candidates.synthetic.json
contracts/examples/recommendation_no_target.synthetic.json
contracts/examples/recommendation_request.synthetic.json
contracts/examples/recommendation_response.synthetic.json
contracts/examples/recommendation_stale.synthetic.json
contracts/examples/version.synthetic.json
contracts/openapi.json
contracts/recommendation-context.schema.json
contracts/recommendation-result.schema.json
data/README.md
docs/CONTRACT_CHANGE_PROPOSAL.md
docs/FINAL_REPORT.md
docs/HANDOFF.md
docs/LOCAL_BACKEND.md
docs/PUBLIC_DEPLOYMENT.md
docs/SOURCES.md
docs/VERIFICATION.md
docs/WORK_PLAN.md
docs/acceptance.md
docs/ai-recommendations.md
docs/api-contract.md
docs/architecture.md
docs/data-audit.md
docs/data-model.md
docs/requirements/README.md
docs/requirements/original-spec.txt
docs/team-plan.md
docs/verification/final-hr.png
docs/verification/final-live-ai.json
frontend/.gitignore
frontend/JURY.md
frontend/README.md
frontend/VERIFICATION.md
frontend/index.html
frontend/package.json
frontend/pnpm-lock.yaml
frontend/public/favicon.svg
frontend/scripts/seed-demo.py
frontend/scripts/start.mjs
frontend/scripts/test-live.py
frontend/src/App.test.tsx
frontend/src/App.tsx
frontend/src/api/client.test.ts
frontend/src/api/client.ts
frontend/src/api/demo.test.ts
frontend/src/api/demo.ts
frontend/src/api/fixtures.ts
frontend/src/api/index.ts
frontend/src/api/schema.ts
frontend/src/api/types.ts
frontend/src/components/Ornament.tsx
frontend/src/components/PublicAccess.tsx
frontend/src/components/public-access.css
frontend/src/components/ui.tsx
frontend/src/context.tsx
frontend/src/design.css
frontend/src/features/employee/EmployeeWorkspace.test.tsx
frontend/src/features/employee/EmployeeWorkspace.tsx
frontend/src/features/hr/HrAnalytics.test.tsx
frontend/src/features/hr/HrAnalytics.tsx
frontend/src/features/hr/HrPage.tsx
frontend/src/features/hr/hr.css
frontend/src/features/import/ImportPage.test.tsx
frontend/src/features/import/ImportPage.tsx
frontend/src/features/import/import.css
frontend/src/features/import/importFiles.test.ts
frontend/src/features/import/importFiles.ts
frontend/src/main.tsx
frontend/src/styles.css
frontend/src/test-setup.ts
frontend/tsconfig.json
frontend/vite.config.ts
pyproject.toml
render.yaml
requirements-dev.lock
requirements-dev.txt
requirements.lock
scripts/audit_dataset.py
scripts/check-container
scripts/check_agent_log.py
scripts/check_container.py
scripts/check_contracts.py
scripts/dev
scripts/export-openapi
scripts/prepare_dataset.py
scripts/smoke
scripts/smoke.py
scripts/test
scripts/verify-integration
scripts/verify_integration.py
tests/test_dataset_tools.py
Ветки (8)

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

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

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