AAYMA
RU
Войти

Qadam AI

React+FastAPI платформа Challenge Hub: AI-конструктор задает уточняющие вопросы, собирает карточку задачи с рейтингом 0–100, каталог, отклики…

Рабочий MVP
Команда «Qadam AI» 9💬 0 комментариевс 23 сентября 2026 г.

О проекте

Команда: Qadam AI
Кейс HackAlem.ai: Образование — AI Sana
Стадия: Рабочий MVP

Задача кейса: Challenge Hub: превратить задачу бизнеса в задание для студенческих команд

Суть

React+FastAPI платформа Challenge Hub: AI-конструктор задает уточняющие вопросы, собирает карточку задачи с рейтингом 0–100, каталог, отклики студенческих команд и голосовой ввод через Whisper.

Как устроено

Бизнес вводит черновик и отрасль; backend маскирует контакты, вызывает OpenAI Chat Completions со Structured Outputs для анализа и генерации карточки, проверяет ответ. Рейтинг считается кодом во фронтенде по 7 взвешенным критериям (качество поля по числу слов). Голосовой ввод: MediaRecorder в браузере → whisper-1 на backend. Данные хранятся в localStorage, роли бизнес/команда переключаются в одном браузере; +50 баллов за подтверждённый этап.

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

  • Structured Outputs
  • contact masking
  • scope/безопасность промптов
  • rule-based scoring
  • tag-based recommendations

Стек

React 19 · Vite 8 · Tailwind CSS 4 · Python · FastAPI · Pydantic · pytest · localStorage

Модели

gpt-5.4-mini · OpenAI whisper-1


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

README

README.md

Qadam AI

Qadam AI помогает представителю бизнеса превратить короткое описание проблемы в понятную задачу для студенческих команд. ИИ задаёт уточняющие вопросы и собирает редактируемую карточку. Бизнес дополняет и подтверждает её, видит рейтинг готовности и публикует в каталоге. Студенты отправляют предложения, а бизнес самостоятельно выбирает исполнителей.

Геймификация направлена на бизнес: полнота описания повышает рейтинг и позицию задачи. Низкий рейтинг не закрывает доступ к задаче и не запрещает отклики.

Репозиторий: BAITC-Hacks / Qadam AI.

Жюри: начните здесь. Установка и запуск → демонстрация по шагам → результаты проверок. Архитектура и формула рейтинга описаны ниже.

Ключ API для жюри. Ключ OpenAI, выданный организаторами хакатона, намеренно добавлен в Git в .env.example для проверки проекта жюри. Это согласованное решение команды, а не ошибка или случайная публикация. Скопируйте шаблон в локальный .env по инструкции запуска. Ключ используется только backend; его значение в README не дублируется.

Ссылка на демо роликҒ https://drive.google.com/file/d/1OuhPMb4sXXmjUwoYFYaZ2_nuFYbOYrRN/view?usp=sharing

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

  • Конструктор: свободный черновик и отрасль → 3–5 вопросов → редактируемая карточка → ручное подтверждение и публикация. Frontend подключён к настоящему AI backend.
  • Бизнес-консультант: «хочу денег» запускает вопросы об опыте, аудитории и ресурсах. Посторонняя тема получает объяснение границ; сообщение о личном кризисе — отдельный ответ поддержки под полем ввода. Карточка для таких отказов не создаётся.
  • Голосовой ввод черновика и каждого ответа через OpenAI Whisper, с остановкой и отменой. Текст можно исправить до дальнейшего использования.
  • Рейтинг 0–100, расшифровка баллов, подсказки о возможном приросте и история изменения рейтинга.
  • Каталог всех опубликованных задач, сортировка, поиск, фильтры по отрасли и уровню, рекомендации по навыкам и интересам.
  • Отклики команд: идея, план, срок, ссылка на прототип. Бизнес вручную выбирает одну, несколько или ни одной команды.
  • Подтверждённый этап принятой команды даёт +50 баллов один раз на отклик.
  • Три демонстрационных профиля бизнеса, пять команд, переключение ролей, интерфейс RU / KK / EN, светлая/тёмная/системная тема.
  • Сохранение демонстрационной сессии в localStorage, восстановление после перезагрузки и сброс демо.

При недоступном AI ввод и текущий шаг сохраняются, показывается сообщение. Автоматическая генерация через локальную заглушку отключена. Вопросы и сообщения backend пока формируются на русском независимо от языка интерфейса.

2. Пользовательский сценарий

  1. Представитель бизнеса выбирает профиль, вводит черновик и отрасль.
  2. ИИ анализирует описание и задаёт уточняющие вопросы.
  3. Бизнес отвечает текстом или голосом; ИИ собирает карточку.
  4. Бизнес проверяет факты и редактирует поля; предварительный рейтинг пересчитывается.
  5. После ручного подтверждения задача публикуется в общем каталоге текущей демо-сессии.
  6. Студенческая команда открывает задачу и отправляет предложение.
  7. Бизнес сравнивает отклики и вручную принимает или отклоняет их.
  8. После выполненного этапа бизнес подтверждает результат принятой команды; ей начисляется +50 баллов.

Это демонстрация ролей в одном браузере, а не многопользовательский сервис с общей серверной базой.

3. Технологии

ЧастьРеализация
FrontendJavaScript/JSX, React 19, React DOM, Vite 8
ИнтерфейсTailwind CSS 4, lucide-react, собственные компоненты и переводы
BackendPython 3.11+, FastAPI, Uvicorn, Pydantic
AI-конструкторOpenAI SDK, Chat Completions, Structured Outputs; модель задаётся через OPENAI_MODEL
Распознавание речиMediaRecorder в браузере и модель whisper-1 на backend
КонфигурацияПеременные окружения и python-dotenv
ХранениеReact state и браузерный localStorage
Проверкиpytest, TestClient/HTTPX, Ruff, встроенный node:test, Oxlint

В сохранённом живом прогоне использовалась gpt-5.4-mini. Она не зашита как обязательная модель в код конструктора: доступ к выбранной модели зависит от аккаунта OpenAI. Backend-зависимости перечислены в backend/requirements.txt, инструменты разработчика — в backend/requirements-dev.txt; frontend фиксируется через front/package-lock.json.

4. Архитектура

flowchart LR
    UI[React: конструктор, каталог, отклики] <--> Storage[localStorage]
    UI --> Rating[Расчёт рейтинга в браузере]
    UI -->|/api через Vite proxy| API[FastAPI]
    API --> Constructor[Маскировка, промпты, проверка ответа]
    Constructor --> OpenAI[OpenAI: анализ и карточка]
    UI -->|Запись после остановки| API
    API --> Whisper[OpenAI whisper-1]

Backend обслуживает AI-запросы; задачи, команды, отклики и баллы на сервере не хранятся. Публикация и выбор команды выполняются во frontend. Навигация использует состояние приложения и адреса #/builder, #/catalog, #/proposals, #/mine с учётом выбранной роли.

Основные файлы:

front/src/store/useQadam.jsx       состояние и действия приложения
front/src/features/builder/       черновик, вопросы, редактор, голосовой ввод
front/src/features/catalog/       каталог и форма отклика
front/src/features/proposals/     решения бизнеса и подтверждение этапа
front/src/lib/scoring.js          рейтинг и подсказки
front/src/lib/catalog.js          правила каталога, откликов и этапов
front/src/lib/api.js              действующий HTTP-клиент конструктора
front/src/lib/constructorAI.js    проверка AI-ответов без fallback
front/src/lib/voice.js            запись, отмена и распознавание
front/src/data/seed.js            начальные данные интерфейса
backend/app/main.py              FastAPI, health, обработчики ошибок
backend/app/services/constructor.py  обработка AI-конструктора
backend/app/prompts/             действующие промпты анализа и карточки
backend/app/llm.py               клиент OpenAI и загрузка промптов
backend/app/contact_context.py   правила дат и явного денежного контекста
backend/app/routers/voice.py     ограниченный по размеру приём аудио
backend/app/services/voice.py    обращение к Whisper

5. Рейтинг и правила каталога

Рейтинг рассчитывается кодом, без участия LLM. Для текстового поля качество q равно 0 при пустом значении, 0,35 при 1–3 словах, 0,7 при 4–9 словах и 1 при 10 и более словах. Слова разделяются пробельными символами.

КритерийВесРасчёт качества
Контекст и потребность20Среднее q(context) и q(need)
Данные и материалы20q(data)
Ожидаемый результат15q(result)
Критерии успеха15q(criteria), но не больше 0,6 без цифр
Ограничения10q(constraints)
Пользователи10q(users)
Связь с бизнесом100,6 × q(contact) + 0,4 × q(format); q(contact) ограничивается 0,5, если канал связи не распознан

Каждый критерий: Math.round(вес × качество). Сумма — от 0 до 100. До подтверждения это предварительная оценка; в каталог попадает подтверждённая карточка.

Уровни: 0–39 — «Черновик», 40–69 — «Рабочая», 70–89 — «Готовая», 90–100 — «Приоритетная». Это эвристика заполненности, а не проверка истинности или полезности текста. Повторение бессодержательных слов тоже может дать высокий балл.

Каталог сортируется по рейтингу, при равенстве — по времени создания (Date.now() для новых задач). Рекомендации содержат до трёх задач с рейтингом от 40 и совпадениями тегов/навыков или отрасли/интересов. Они не ограничивают общий каталог. Одна команда может отправить один отклик на задачу; общего лимита числа команд нет. Выбор и начисление баллов за этап не происходят автоматически.

6. Установка и запуск

Нужны Git, Python 3.11+ и Node.js, совместимый с Vite: ^20.19.0 || >=22.12.0. Проверки выполнялись на Python 3.12 и Node.js 24.19.0. Для реального AI нужны интернет и действующий ключ OpenAI с доступом к выбранной модели.

Подготовка

git clone https://github.com/BAITC-Hacks/hack-e23c8ea3-qadam-ai.git
cd hack-e23c8ea3-qadam-ai
git log -1 --oneline

Код приложения проверен на коммите 10337ec от 23 сентября 2026 года, включая исправления обработки дат/телефонов и переходов из трекера. Результаты приведены в разделе 9; последующие изменения требуют проверки затронутых сценариев.

Создайте .env в корне репозитория, сохранив уже существующий файл:

test -e .env || cp .env.example .env

В .env.example намеренно сохранён выданный организаторами ключ для проверки жюри. Его наличие в Git согласовано командой и не является ошибкой; значение здесь не дублируется. Копирование шаблона создаёт конфигурацию для этого сценария, но работоспособность и доступность квоты проверяются реальным вызовом. Существующий .env команда выше не меняет: проверьте в нём наличие непустых OPENAI_API_KEY, OPENAI_MODEL и AI_MODE=auto.

Если используете собственный ключ, заполните файл локально в редакторе. Названия переменных:

OPENAI_API_KEY=
OPENAI_MODEL=gpt-5.4-mini
AI_MODE=auto

В примере значение OPENAI_API_KEY намеренно скрыто: не заменяйте действующий ключ пустой строкой. Собственный ключ храните только в локальном окружении. AI_MODE=stub выключает AI на backend; это не включение автоматической заглушки frontend. Whisper использует ключ и AI_MODE=auto, но не зависит от OPENAI_MODEL.

Терминал 1 — backend

Из корня репозитория:

cd backend
python3.12 -m venv .venv
source .venv/bin/activate
python -m pip install -r requirements.txt
python -m uvicorn app.main:app --host 127.0.0.1 --port 8000

Если используете Python 3.11, замените python3.12 на python3.11. Терминал оставьте открытым. После изменения .env перезапустите backend.

Терминал 2 — frontend

Откройте новый терминал и перейдите в корень того же репозитория:

cd front
npm ci
npm run dev -- --host 127.0.0.1 --port 5173 --strictPort

Откройте http://127.0.0.1:5173. Vite проксирует /api на backend. Если порт 8000 занят, запустите backend с --port 8017, а frontend командой:

QADAM_API_TARGET=http://127.0.0.1:8017 npm run dev -- --host 127.0.0.1 --port 5173 --strictPort

Остановка серверов — Ctrl+C в соответствующих терминалах. Команды выше предназначены для локального демо, не для публичного размещения.

Проверка соединения

curl http://127.0.0.1:5173/api/health

Ожидаются ok: true, ai_available: true, openai_key: true, ai_mode: "auto" и выбранная model. openai_key — булев признак, не ключ. Эти признаки подтверждают настройки, но не работоспособность ключа: реальный вызов проверяется следующим сценарием. Swagger UI: http://127.0.0.1:8000/docs.

7. Пошаговая инструкция для жюри

Обязательная демонстрация по ТЗ — работа в приложении: слабый черновик → уточнения → рост рейтинга → публикация → отклик → ручное решение бизнеса. Начинайте с этого пути. Подтверждение этапа с +50 можно показать после основного сценария. Предельные пять минут требуют отдельной репетиции; приведённая инструкция не означает, что такой прогон уже выполнен.

Перед началом

Убедитесь, что backend и frontend запущены по разделу 6, а /api/health показывает непустую модель и доступную конфигурацию AI. Без OPENAI_MODEL конструктор не сможет пройти анализ и сборку. Откройте приложение, выберите русский язык, роль «Бизнес», профиль Qala Service и экран «Новая задача». Для чистого старта нажмите «Сбросить демо» внизу боковой панели: сохранённые изменения будут заменены начальными данными. Профиль бизнеса во время заполнения одной карточки не переключайте.

Трекер «Сквозной сценарий» отслеживает последнюю опубликованную задачу. Шаги 1–5 проходит бизнес; шаги 6–8 засчитываются только по откликам и этапу этой задачи. Отклик на другую задачу не продвигает этот сценарий. До завершения демонстрации не публикуйте вторую задачу.

Трекер показывает название отслеживаемой задачи и подсказывает следующее действие. После публикации кнопка «Открыть задачу как студент» открывает именно эту задачу; затем «Перейти к откликам» возвращает к её предложениям от профиля бизнеса-владельца. Ручной путь через переключатель «Бизнес» / «Студенты» и экран «Отклики» также доступен.

Шаг 1. Слабый черновик

Выберите отрасль HoReCa и вставьте:

У нас небольшая пекарня. Хотим меньше списывать непроданную выпечку в конце каждого рабочего дня.

Нажмите «Продолжить с помощником». Ожидаются 3–5 уточняющих вопросов. В инструментах разработчика браузера, Network, можно проверить POST /api/constructor/analyze, HTTP 200 и source: "ai". Если запрос завершился ошибкой, это не успешный AI-шаг: исправьте настройки и повторите.

Шаг 2. Уточняющие ответы

Заполняйте ответы по смыслу показанных вопросов. Формулировки и выбор полей могут меняться:

ПолеПодготовленный ответ
ПотребностьХотим сократить списания и планировать количество выпечки на следующий день.
ДанныеПредоставим обезличенную таблицу продаж и списаний по видам выпечки за месяц.
РезультатОжидаем таблицу с рекомендациями по количеству выпечки на следующий день.
КритерииСравним расчёты с ручным подсчётом.
ПользователиВладелец пекарни и пекарь.
ОграниченияСрок две недели, только обезличенные таблицы.
Контакт[email protected]

Ответьте на каждый показанный вопрос. Рейтинг справа пересчитывается по мере заполнения: не каждое добавленное слово обязательно повышает балл, поскольку формула использует пороги полноты. Нажмите «Собрать карточку».

Шаг 3. Проверка карточки

Ожидается редактор; /api/constructor/card возвращает HTTP 200 и source: "ai". Проверьте, что факты не придуманы. Неизвестные поля должны остаться пустыми, а замечания — видимыми.

Шаг 4. Рост рейтинга и подтверждение

Назовите задачу «План выпечки — проверка жюри». Дополните карточку:

  • Потребность: «Нужно сократить списания выпечки с помощью планирования ежедневного выпуска на завтра».
  • Пользователи: «Рекомендациями будут пользоваться владелец пекарни и пекарь при планировании ежедневного выпуска».
  • Критерии: «На контрольных данных сумма списаний совпадает с ручным подсчётом в 100% строк».
  • Ограничения: «Прототип нужно подготовить за четырнадцать дней, используя только обезличенные таблицы бизнеса».
  • Контакт: [email protected].
  • Формат взаимодействия: «Один видеозвонок по пятницам, обратная связь письмом в течение двух рабочих дней».

Проверьте данные и результат; если ИИ не спрашивал о них, внесите подготовленные сведения из таблицы выше в редактор. Покажите изменение рейтинга и его расшифровку. Точный исходный балл зависит от AI-текста. Поставьте галочку «Я проверил карточку». Изменение любого поля карточки снимает подтверждение; перед публикацией его нужно поставить снова.

Шаг 5. Публикация

Нажмите «Опубликовать». Задача появляется в каталоге с рассчитанным рейтингом, позицией и меткой «Новая». Найдите её по названию; трекер должен показывать 5/8. Задачи уровня «Черновик» тоже доступны студентам и допускают отклики.

Шаг 6. Два отклика

Нажмите в трекере «Открыть задачу как студент» либо вручную переключитесь в роль «Студенты» и откройте свою новую задачу в каталоге. Выберите команду Data Batyrs и заполните:

  • Идея: «Подготовим рекомендации на основе продаж и списаний по дням».
  • План: «Проверим данные, выполним расчёты и сравним результат с ручным подсчётом».
  • Срок: «7 дней после получения данных».
  • Ссылка: https://example.com/prototypes/bakery-data.

Отправьте предложение. Затем выберите Pixel Qanat, откройте ту же задачу и отправьте второй отклик с идеей веб-интерфейса, планом реализации, сроком «10 дней после получения данных» и ссылкой https://example.com/prototypes/bakery-web.

Это синтетические ссылки для проверки формы, не готовые прототипы. Для демо используйте https://; текущая валидация также допускает корректный http:// с доменом. Оба отклика должны иметь статус «На рассмотрении». После первого отклика на эту задачу трекер показывает 6/8.

Шаг 7. Ручное решение

Нажмите в трекере «Перейти к откликам» либо вручную вернитесь в «Бизнес», профиль Qala Service, экран «Отклики» и выберите новую задачу. Для Data Batyrs нажмите «Выбрать», для Pixel Qanat — «Отклонить». Решение по одному отклику не должно менять второй. Автоматического назначения команды нет. Трекер показывает 7/8; для этого достаточно ручного решения по хотя бы одному отклику своей новой задачи, в том числе отклонения.

Шаг 8. Этап и сохранение

После условного выполнения этапа нажмите «Подтвердить этап → +50 баллов команде» у принятой Data Batyrs. Команда получает +50 баллов один раз: в чистом seed её 90 баллов становятся 140. Повторное начисление блокируется. Трекер показывает 8/8. Перезагрузите страницу и проверьте сохранение задачи, решений, баллов и прогресса в том же браузере. Для повторного полного прохода нажмите «Сбросить демо».

Дополнительные проверки

ДействиеОжидаемое поведение
Пустой черновикАнализ не запускается; прямой API-запрос получает 422
«хочу денег»Вопросы об опыте, аудитории и ресурсах
«расскажи анекдот»Объяснение границ бизнес-темы, без карточки
Синтетическое «хочу умереть»Сообщение поддержки под вводом, без бизнес-вопросов
Не подтвердить карточкуПубликация недоступна
Пустое название карточкиПубликация отклоняется
Пустая идея, план или срок откликаОшибка соответствующего поля; минимального количества слов нет
Ссылка без http:// или https://Ошибка ссылки
Повторный отклик той же командыОтклоняется
Остановить backend и запросить AIОшибка с сохранением ввода; локальная карточка не генерируется

Голосовой ввод проверяется отдельно: нажмите кнопку микрофона, дайте разрешение, произнесите синтетический текст, остановите запись и проверьте добавление текста. Одновременно работает одна запись/расшифровка. Максимум записи — 60 секунд и 5 МиБ; по достижении 60 секунд запись автоматически отправляется. Отмена останавливает локальное ожидание, но не отзывает уже отправленное аудио у провайдера. Нужны HTTPS либо localhost и поддержка MediaRecorder.

8. API, данные и интеграции

МетодМаршрутВход → результат
GET/api/healthПризнаки конфигурации AI
POST/api/constructor/analyze{draft, industry} → {detected, missing, questions, source}
POST/api/constructor/card{draft, industry, answers} → {card, warnings, source}
POST/api/voice/transcribeСырое аудио → {text}

Черновик должен быть непустым; ограничение «минимум три слова» больше не действует. Ключи answers: need, users, data, constraints, result, criteria, contact. Публичная карточка содержит строковые title, industry, context, need, users, data, constraints, result, criteria, contact, format.

Действующие полные промпты: backend/app/prompts/analyze.md и backend/app/prompts/card.md. Анализ различает бизнес-задачу, предварительное бизнес-намерение, постороннюю тему и потребность в поддержке. Для бизнес-сценария он возвращает 3–5 вопросов с неповторяющимися полями; сборка использует только факты черновика и ответов. Внутренний intent проверяет сервер; в публичный ответ он не включается. Контакт восстанавливает сервер, а не модель.

Успешные ответы конструктора имеют source: "ai". Ошибки — {"error": "..."}; 422 применяется также для остановки вне темы, сообщения поддержки и просьбы уточнить бизнес-идею. После ошибки провайдера/валидации сервис делает не более одного повтора, затем возвращает 503. Клиент ждёт до 45 секунд; SDK использует тайм-аут 20 секунд на сетевые операции, что не является гарантированным общим пределом двух вызовов.

Голосовой маршрут принимает audio/webm, audio/mp4, audio/wav, audio/x-wav, audio/mpeg, до 5 МиБ; ошибки содержат error и code. Распознавание ограничено общим тайм-аутом 20 секунд без повторов, frontend ждёт до 30 секунд.

Рабочие данные интерфейса — front/src/data/seed.js: 5 черновиков, 5 задач, 5 команд, 5 откликов и 3 профиля бизнеса. Исходные рейтинги задач: 98, 78, 88, 48, 21. Баллы рассчитываются из полей, не доверяются сохранённому числу.

seed/*.json, DEMO.md и demo-inputs.json не загружаются приложением автоматически. В опубликованном снимке эти материалы частично относятся к старому контракту; для проверки используйте сценарий этого README и рабочий frontend seed.

Внешние сервисы — OpenAI и Google Fonts. Нет действующих интеграций с CRM, 1С, CSV/Excel-хранилищами: упоминания таких источников — текст задач, а не загрузка и обработка таблиц платформой.

Контактный ответ не передаётся модели. Распознаваемые контакты остальных полей маскируются локально и восстанавливаются сервером. На backend исправлены телефоны с точками, сбор контакта из неконтактных ответов, ошибочное распознавание явно обозначенного бюджета и обработка дат рядом с телефонами. Регрессионные тесты проверяют также сохранение даты со временем при маскировании. Маскировка не является полной анонимизацией. Аудио до отправки в OpenAI не обезличивается; для демо используйте только синтетические сведения. Приложение не сохраняет аудио на диск, но транскрипция сохраняется как обычный текст в браузере.

9. Автоматические проверки и фактические результаты

Из backend/:

source .venv/bin/activate
python -m pip install -r requirements-dev.txt
python -m pytest tests -q
python -m ruff check --no-cache app tests
python -m pip check

Из front/:

npm test
npm run lint
npm run build
npm audit

На снимке 10337ec 23 сентября прошли 211 backend-тестов и 141 frontend-тест, Ruff и сборка успешны. Oxlint — без ошибок, 7 предупреждений Fast Refresh/setState в effect. Ранее в тот же день pip check подтвердил совместимость установленных Python-зависимостей, а npm audit не нашёл известных уязвимостей в lockfile; файлы зависимостей с тех пор не менялись. Это не гарантия отсутствия всех уязвимостей.

Backend-тесты подменяют провайдера. Ранее сохранён живой прогон gpt-5.4-mini: 19 синтетических примеров, 38 операций анализа/сборки, один повтор после тайм-аута и без окончательных ошибок. Все 9 решений о границах темы соответствовали ожиданиям, но остались смысловые замечания к вопросам и отдельным полям. SHA-256 текущих промптов совпадает с сохранённым прогоном. Исходные ответы: docs/constructor-checks/2026-09-23/, ручная оценка: docs/constructor.md. После BE-01–BE-03 и последующих исправлений обработки дат/телефонов серверные регрессии проверены с подменой SDK; новый платный прогон не выполнялся.

Для повторной живой оценки из backend/, с настроенным ключом:

python -m tests.manual_constructor --suite quality --live > /tmp/qadam-quality.json
python -m tests.manual_constructor --suite security --live > /tmp/qadam-security.json
python -m tests.manual_constructor --suite scope --live > /tmp/qadam-scope.json

Это реальные платные запросы: 10/10/18 операций соответственно, до 20/20/36 вызовов с повторами. Код выхода 0 подтверждает отсутствие окончательной ошибки API/валидации, а не смысловую корректность. Ответы нужно сверять с review каждого примера.

Полный проход по кнопкам браузера с реальным AI и реальная запись микрофона пока не подтверждены. SSR-проверка подтвердила расположение сообщения под вводом и экранирование HTML. Автотесты и просмотр JSON не заменяют репетицию защиты.

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

  • Нет регистрации, серверной авторизации, общей базы и совместной работы между устройствами. Роли — демонстрационные. Другой браузер не увидит вашу сессию.
  • Нет чата, уведомлений, файлового хранилища, обучения собственной модели и полноценного управления проектами. Опубликованные карточки в интерфейсе не редактируются.
  • Рейтинг проверяет заполненность текста, а не достоверность бизнеса; высокий балл не доказывает готовность задачи.
  • AI может неверно уточнить уже известное, упустить условие или неточно сформулировать предупреждение. Перед публикацией обязательна ручная проверка.
  • Рейтинг frontend не распознаёт телефон с точками как канал связи, хотя backend сохраняет его. Для демонстрации используйте email либо телефон с пробелами.
  • Черновик общий для профилей бизнеса; не переключайте компанию посреди одной карточки. Связность повреждённой сессии проверяется не полностью; ошибка localStorage может пройти без предупреждения о несохранённых данных.
  • У AI API нет ограничения частоты запросов и полноценной защиты бюджета; текстовый ввод не ограничен по размеру. В маске адаптера и обработке исключений остаются риски производительности и попадания текста ошибки в серверный лог. Для публичного доступа нужны отдельные исправления из аудита безопасности.
  • Собственные ключи храните только в локальном окружении; ключ организаторов в шаблоне — отдельное решение команды для проверки жюри. Маскировка не гарантирует удаления имён, всех контактов и чувствительных сведений. Нельзя считать приложение готовым к обработке реальных персональных данных.
  • Свежая установка в полностью чистой среде и полный ручной браузерный сценарий в рамках этого аудита не выполнялись.

11. Развёрнутая версия и команда

Подтверждённая ссылка на публично развёрнутую версию в проверенном репозитории не указана. Для проверки используйте локальный запуск выше; localhost не является deployed-версией.

УчастникЗона ответственности
МаратПромпты и сервис AI-конструктора, маршруты, тесты своей части, демо-материалы
АйгеримОснова backend, OpenAI-адаптер, API-интеграция, окружение и общая документация
АрсенИнтерфейс, рейтинг, каталог, отклики, темы, переводы, сохранение и голосовой ввод

Сверка с исходным ТЗ

Источник — исходный PDF «Единый кейс по геймификации практических заданий», AI Sana, 6 страниц (HackAlem_AI_кейс_по_геймификации_практических_заданий.pdf, локальный файл вне репозитория).

Требование PDFГде описано в README
8 шагов от черновика до подтверждённого этапа — стр. 2, §2Разделы 2 и 7; один полный сценарий и трекер 5/8 → 8/8
Поля карточки, редактор и ручное подтверждение — стр. 3, §3Разделы 1, 7 и 8
Веса 20/20/15/15/10/10/10, уровни и доступность слабых задач — стр. 3–4, §4Раздел 5 с точной формулой кода
AI, промпты, вход/выход, ошибки и контроль фактов — стр. 4, §5Разделы 7–10; реальные промпты указаны в разделе 8
По 5 черновиков, карточек, команд и откликов — стр. 4, §6Раздел 8: фактический seed приложения
Регистрация, чат, своя ML-модель и production-инфраструктура не обязательны — стр. 5, §7Архитектура и ограничения, разделы 4 и 10
README с архитектурой, формулой, каталогом и тестами — стр. 6, §10Разделы 4, 5, 7 и 9
До 5 минут, один пример, начать со слабого описания в работающем MVP — стр. 6, §10–11Раздел 7; слайды или отдельный питч не заменяют путь в приложении

ТЗ допускает локальную AI-заглушку при недоступном API, но команда выбрала настоящий AI без автоматического fallback. Ограничение «один отклик одной команды на одну задачу» — текущее правило приложения; общего лимита числа откликов от разных команд нет. Подтверждение этапа даёт +50 по решению команды: PDF требует баллы за прогресс, но не задаёт их количество.

Перед защитой повторите сценарий в браузере на версии приложения, которую будете демонстрировать.

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

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

makonsalt 20anaiis 19Arsen Maratov 16

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

  • 2026-09-23 17:56Update README.mdanaiis
  • 2026-09-23 17:53docs: publish jury guide and explain organizer API keymakonsalt
  • 2026-09-23 17:48Merge approved main configuration before releaseArsen Maratov
  • 2026-09-23 17:41fix: mask phones after dates without losing numeric contextArsen Maratov
  • 2026-09-23 17:35Ship organizer OpenAI key in .env.example for judgesAigerim
  • 2026-09-23 17:31fix: guide scenario steps and keep proposal navigation in syncArsen Maratov
  • 2026-09-23 17:16fix: preserve explicit monetary amounts across contact masksmakonsalt
  • 2026-09-23 17:11fix: collect contact channels from clarification answersmakonsalt
Все коммиты (55)
  • 2026-09-23 17:09Merge branch 'main' into feat/constructormakonsalt
  • 2026-09-23 17:07Merge latest main history before frontend releaseArsen Maratov
  • 2026-09-23 17:07Merge latest main into feat/frontend-polishArsen Maratov
  • 2026-09-23 17:06fix: preserve dotted phones on constructor branch for reviewmakonsalt
  • 2026-09-23 17:05Revert "fix: preserve dotted phone numbers through constructor masking"makonsalt
  • 2026-09-23 17:04fix: preserve dotted phone numbers through constructor maskingmakonsalt
  • 2026-09-23 17:03fix: resolve frontend QA regressions and remove AI help buttonArsen Maratov
  • 2026-09-23 16:58feat: scope business coaching and preserve safe AI repliesmakonsalt
  • 2026-09-23 16:36feat: add voice answers to clarification questionsArsen Maratov
  • 2026-09-23 16:25feat: add Whisper voice input for task draftsArsen Maratov
  • 2026-09-23 16:07Merge branch 'main' into feat/constructormakonsalt
  • 2026-09-23 16:07fix: harden constructor contact masking and security checksmakonsalt
  • 2026-09-23 15:57feat: refine system theme controls and responsive catalogArsen Maratov
  • 2026-09-23 15:52docs: rename security audit reportmakonsalt
  • 2026-09-23 15:47docs: add security audit with owners and evidencemakonsalt
  • 2026-09-23 15:39fix: accept valid AI questions regardless of field weightAigerim
  • 2026-09-23 15:21Align AI integration with task 1 main commitAigerim
  • 2026-09-23 15:20refactor: keep draft answer reset in pure client helperAigerim
  • 2026-09-23 15:19Merge latest main theme into AI integrationAigerim
  • 2026-09-23 15:18Merge latest main into task 1 integrationAigerim
  • 2026-09-23 15:17Merge current main and task 1 into AI integrationAigerim
  • 2026-09-23 15:08feat: connect AI constructor with frontend fallbackAigerim
  • 2026-09-23 15:08Merge remote-tracking branch 'origin/main' into feat/frontend-polishArsen Maratov
  • 2026-09-23 15:07feat: add persistent light and dark interface themesArsen Maratov
  • 2026-09-23 15:06Merge backend AI foundation into mainAigerim
  • 2026-09-23 14:52Complete backend AI foundation and checksAigerim
  • 2026-09-23 14:52Merge branch 'main' into feat/constructormakonsalt
  • 2026-09-23 14:51test: sort constructor test importsmakonsalt
  • 2026-09-23 14:46docs: update frontend regression test coverageArsen Maratov
  • 2026-09-23 14:45Merge branch 'main' into feat/frontend-polishArsen Maratov
  • 2026-09-23 14:45feat: complete frontend catalog workflow and persistenceArsen Maratov
  • 2026-09-23 14:38Make AGENTS.md take precedence over Codex.mdAigerim
  • 2026-09-23 14:32test: verify backend HTTP contractAigerim
  • 2026-09-23 14:26docs: record backend contract for stage zeroAigerim
  • 2026-09-23 14:23feat: implement AI constructor endpoints with validated promptsmakonsalt
  • 2026-09-23 14:01docs: consolidate team materials at repository rootmakonsalt
  • 2026-09-23 13:59Merge branch 'main' into feat/seed-demomakonsalt
  • 2026-09-23 13:58docs: add hackathon engineering rules in Codex.mdmakonsalt
  • 2026-09-23 13:58Switch backend to AI-only API aligned with frontendAigerim
  • 2026-09-23 13:51Add backend foundationAigerim
  • 2026-09-23 13:51feat: add synthetic seed data and prepared demo scenariomakonsalt
  • 2026-09-23 13:45Build Qadam AI gamified task workflowArsen Maratov
  • 2026-09-23 13:44docs: add constructor prompt drafts and evaluation casesmakonsalt
  • 2026-09-23 13:33Clarify mixed frontend languages and pathAigerim
  • 2026-09-23 13:30Merge remote-tracking branch 'origin/main'Aigerim
  • 2026-09-23 13:28Add project agent guidanceAigerim
  • 2026-09-23 13:16Add React + Vite frontend scaffold.Arsen Maratov
Структура репозитория (137 файлов)
.cursor/rules/qadam-design.mdc
.env.example
.gitignore
AGENTS.md
Codex.md
DEMO.md
README.md
backend/app/__init__.py
backend/app/contact_context.py
backend/app/llm.py
backend/app/main.py
backend/app/prompts/analyze.md
backend/app/prompts/card.md
backend/app/routers/__init__.py
backend/app/routers/constructor.py
backend/app/routers/voice.py
backend/app/schemas.py
backend/app/services/__init__.py
backend/app/services/constructor.py
backend/app/services/voice.py
backend/requirements-dev.txt
backend/requirements.txt
backend/tests/fixtures/constructor_cases.json
backend/tests/fixtures/constructor_scope_cases.json
backend/tests/fixtures/constructor_security_cases.json
backend/tests/manual_constructor.py
backend/tests/test_constructor.py
backend/tests/test_http_contract.py
backend/tests/test_llm_adapter.py
backend/tests/test_voice.py
decisions_log.md
demo-inputs.json
design/CURSOR_PROMPT.md
design/DESIGN.md
design/QadamPrototype.jsx
design/preview.html
docs/README.md
docs/analyze.md
docs/aygerim-task-1-plan.md
docs/aygerim-task-2-plan.md
docs/backend-ai-cases.json
docs/backend-checks.md
docs/card.md
docs/constructor-checks/2026-09-23/quality.json
docs/constructor-checks/2026-09-23/scope.json
docs/constructor-checks/2026-09-23/security.json
docs/constructor.md
docs/live-ai-review-2026-09-23.md
docs/marat-roadmap.md
docs/security/2026-09-23/SECURITY-AUDIT.md
docs/security/2026-09-23/evidence/qadam-audit-logging.py
docs/security/2026-09-23/evidence/qadam-osv-query.json
docs/security/2026-09-23/evidence/qadam-osv-results.json
docs/security/2026-09-23/evidence/qadam-python-packages.json
front/.gitignore
front/.oxlintrc.json
front/README.md
front/index.html
front/package-lock.json
front/package.json
front/public/favicon.svg
front/public/icons.svg
front/src/App.jsx
front/src/api/client.ts
front/src/assets/hero.png
front/src/components/panels/GrowthCard.jsx
front/src/components/panels/ImpactPanel.jsx
front/src/components/panels/LevelLadder.jsx
front/src/components/panels/RatingPanel.jsx
front/src/components/panels/ScenarioTracker.jsx
front/src/components/shell/AssistantBubble.jsx
front/src/components/shell/Brand.jsx
front/src/components/shell/CompanyPicker.jsx
front/src/components/shell/PageHead.jsx
front/src/components/shell/RoleSwitch.jsx
front/src/components/shell/TeamPicker.jsx
front/src/components/shell/ThemeToggle.jsx
front/src/components/ui/Avatar.jsx
front/src/components/ui/Button.jsx
front/src/components/ui/Field.jsx
front/src/components/ui/LevelChip.jsx
front/src/components/ui/MiniRing.jsx
front/src/components/ui/Panel.jsx
front/src/components/ui/ScoreRing.jsx
front/src/components/ui/StatusChip.jsx
front/src/components/ui/Toast.jsx
front/src/components/ui/inputCls.js
front/src/data/seed.js
front/src/features/ai/AIModal.jsx
front/src/features/ai/Block.jsx
front/src/features/builder/Builder.jsx
front/src/features/builder/VoiceInput.jsx
front/src/features/catalog/Catalog.jsx
front/src/features/catalog/FormInput.jsx
front/src/features/catalog/TaskDrawer.jsx
front/src/features/proposals/MyProposals.jsx
front/src/features/proposals/Proposals.jsx
front/src/i18n/LangContext.jsx
front/src/i18n/en.js
front/src/i18n/kk.js
front/src/i18n/ru.js
front/src/index.css
front/src/lib/ai.js
front/src/lib/api.js
front/src/lib/catalog.js
front/src/lib/catalog.test.js
front/src/lib/constructorAI.js
front/src/lib/cx.js
front/src/lib/persist.js
front/src/lib/proposalSelection.js
front/src/lib/proposalSelection.test.js
front/src/lib/scoring.js
front/src/lib/scoring.test.js
front/src/lib/tags.js
front/src/lib/tags.test.js
front/src/lib/theme.js
front/src/lib/theme.test.js
front/src/lib/voice.js
front/src/lib/voice.test.js
front/src/main.jsx
front/src/store/useQadam.jsx
front/src/theme/ThemeContext.js
front/src/theme/ThemeProvider.jsx
front/src/types.ts
front/tests/ai.test.js
front/tests/api.test.js
front/tests/constructorAI.test.js
front/tests/draftAnswers.test.js
front/tests/mock-api.mjs
front/tests/proposalNavigation.test.js
front/vite.config.js
seed/README.md
seed/businesses.json
seed/drafts.json
seed/proposals.json
seed/tasks.json
seed/teams.json
Ветки (4)

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

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

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