AAYMA
RU
Войти

Task Hub

Платформа, где бизнес превращает описание проблемы в карточку задачи для студенческих команд с рейтингом готовности 0–100.

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

О проекте

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

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

Суть

Платформа, где бизнес превращает описание проблемы в карточку задачи для студенческих команд с рейтингом готовности 0–100. Команды откликаются, бизнес вручную выбирает исполнителей и принимает этапы работы.

Как устроено

Из описания проблемы LLM формирует минимум три уточняющих вопроса, затем черновик карточки. Извлечённые факты проверяются по исходному тексту (grounding), и человек подтверждает каждое поле. Рейтинг складывается из весов подтверждённых показателей (контекст 20, данные 20, результат 15 и т.д.), правка поля снимает подтверждение. Данные лежат в JSON-файле с file-lock. Отклики, этапы с отчётами и баллы команд обрабатывает API на Next.js, по умолчанию с mock-провайдером AI и шаблонным fallback.

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

  • clarifying questions generation
  • structured card extraction
  • source grounding check
  • weighted readiness scoring
  • mock/OpenAI provider fallback
  • milestone workflow

Метрики

223 теста, сборка и HTTP smoke прошли (23.09.2026)

Особенности

Рейтинг готовности считается только по полям, подтверждённым человеком, а правка поля снимает подтверждение. AI не публикует задачи и не выбирает команды. Есть отдельные eval-сценарии качества извлечения (evals/quality.eval.ts).

Стек

Next.js 16 · React 19 · TypeScript · Tailwind CSS 4 · Zod · OpenAI SDK · Vitest · JSON file storage

Модели

OpenAI (OPENAI_MODEL, настраивается)


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

README

README.md

Task Hub

MVP по кейсу HackAlem AI / AI Sana: бизнес превращает описание проблемы в подтверждённую карточку с рейтингом готовности, команды предлагают решения, а бизнес выбирает исполнителей вручную.

Возможности

  • Описание → минимум 3 уточняющих вопроса → редактируемая карточка → ручное подтверждение и публикация.
  • Рейтинг 0–100 с расшифровкой баллов и подсказками о недостающих сведениях.
  • Каталог с поиском, сортировкой и фильтрами; отклики с идеей, планом, сроком и необязательной ссылкой на прототип.
  • Выбор одной, нескольких или ни одной команды.
  • Этапы работы: отчёт команды → проверка бизнеса → подтверждение или доработка. За подтверждённый этап — 10 баллов команды, отдельно от рейтинга задачи.

Запуск

Нужны Node.js 22, pnpm 11 и Git. Команды для PowerShell:

git clone https://github.com/BAITC-Hacks/hack-cb606f99-zsa.git
cd hack-cb606f99-zsa
corepack enable
pnpm install --frozen-lockfile
if (-not (Test-Path .env.local)) { Copy-Item .env.example .env.local }
pnpm dev

На macOS/Linux вместо строки с Copy-Item: test -f .env.local || cp .env.example .env.local.

Открыть localhost:3000. Фронтенд и API запускаются одним процессом, отдельная БД не нужна.

По умолчанию AI_PROVIDER=mock: AI работает по локальным шаблонам без внешних запросов. При этом NEXT_PUBLIC_DATA_MODE=api оставляет задачи, отклики и этапы на настоящем backend.

Для внешнего AI в .env.local задайте AI_PROVIDER=openai, OPENAI_API_KEY и OPENAI_MODEL, затем перезапустите сервер. Остальные настройки — в .env.example. Ключи не должны иметь префикс NEXT_PUBLIC_ или попадать в Git.

При первом обращении к API данных создаётся data/db.json: 5 карточек с исходными описаниями, 5 команд и 5 откликов. Четыре задачи опубликованы, одна — черновик. Существующая база не сбрасывается; путь задаётся через DATA_FILE_PATH. Локальная база исключена из Git.

Архитектура

Next.js 16 (App Router), React 19, TypeScript, Tailwind CSS 4, Zod, OpenAI SDK, Vitest.

src/app/              Страницы; app/api — HTTP API
src/components/       Интерфейс бизнеса и команд
src/lib/client/       Клиент API и автономный деморежим
src/server/           AI, бизнес-правила, рейтинг и JSON-хранилище
src/shared/           Общие схемы данных и веса рейтинга
docs/                 Контракты API и подробная документация

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

Промпты, схемы входа и выхода и форматы запросов. При сбое AI используется явно обозначенный шаблонный fallback; при AI_FALLBACK_TO_MOCK=false API возвращает ошибку 502. Карточку можно заполнить вручную.

Формула рейтинга

Рейтинг задачи — сумма весов заполненных и подтверждённых человеком показателей. Каждый показатель даёт полный вес или 0.

ПоказательБаллы
Контекст и потребность20
Данные и материалы20
Ожидаемый результат15
Критерии успеха15
Ограничения10
Пользователи10
Связь с бизнесом10
Всего100

Для «Связи с бизнесом» нужны подтверждённые контакт и формат взаимодействия. Редактирование поля в интерфейсе снимает его подтверждение; после повторного подтверждения рейтинг пересчитывается. Рейтинг оценивает полноту сведений, а не их истинность.

Уровни: 0–39 — черновик, 40–69 — рабочая, 70–89 — готовая, 90–100 — приоритетная. Это уровни готовности, а не статусы публикации. Веса и границы заданы в src/shared/scoring.ts.

Правила каталога

  • Все опубликованные задачи доступны всем командам независимо от рейтинга.
  • По умолчанию выше задачи с большим рейтингом; при равенстве — более новые. Есть поиск, фильтры по теме и готовности, сортировка по новизне.
  • Для публикации нужны название, его ручное подтверждение и согласие на публикацию. Низкий рейтинг не блокирует публикацию или отклик.
  • Число откликов не ограничено. Решения принимает бизнес, автоматического назначения нет.
  • Архивные задачи исключаются из каталога; история откликов и подтверждённого прогресса сохраняется.

Проверка

pnpm check
pnpm test:smoke

check выполняет lint, проверку типов, тесты и production-сборку. test:smoke использует эту сборку и временную базу: проверяет HTTP-сценарий и сохранение данных после перезапуска. Оба запуска обходятся без платных AI-запросов и не меняют рабочую базу.

Последний полный прогон 23.09.2026: 223 теста, сборка и HTTP smoke прошли. Отдельная платная проверка AI — pnpm test:ai; сценарии и результаты. Health проверяет хранилище, но не доступность внешнего AI.

Тестовые сценарии

  1. Сквозное демо: «Создать задачу» → пример «Кофейня» → ответы на вопросы → карточка → проверка и подтверждение полей → публикация → отклик команды → принятие или отклонение бизнесом.
  2. Пересчёт: подтвердить заполненный контекст — получить 20 баллов; изменить его — снять подтверждение и соответствующие баллы; подтвердить снова.
  3. Низкий рейтинг: опубликовать задачу с рейтингом 20/100, найти в каталоге и отправить предложение.
  4. Защита данных: публикация без подтверждённого названия не проходит; устаревшая версия при сохранении возвращает конфликт, введённый текст остаётся в форме.
  5. Прогресс: выбранной команде создать этап, сдать отчёт, вернуть на доработку, сдать повторно и подтвердить. Баллы появляются только после подтверждения; повторное подтверждение не начисляет их снова.

Ограничения MVP

Авторизации и ограничения частоты AI-запросов нет: роли демонстрационные. Создание команды доступно через API, в интерфейсе выбираются готовые профили. JSON-хранилище рассчитано на один локальный сервер с постоянным диском. Не открывайте экземпляр с приватными данными или платным AI-ключом в интернет без защиты доступа.

Чат, уведомления, загрузка файлов, рекомендации по навыкам и production-инфраструктура не реализованы и не обязательны для кейса.

Подробности: соответствие ТЗ · API · подключение фронтенда · проверка AI.

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

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

Sanjar 10Zhalgas Askarov 8

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

  • 2026-09-23 17:40fix: balance score indicator in how-it-works previewSanjar
  • 2026-09-23 17:33fix: center readiness score independently from its captionSanjar
  • 2026-09-23 17:28fix: soften composer focus and align filter chevronsSanjar
  • 2026-09-23 17:24Merge remote-tracking branch 'origin/main' into frontend/task-builderSanjar
  • 2026-09-23 17:21refactor: simplify home and move guide to a dedicated pageSanjar
  • 2026-09-23 17:17docs: simplify README to hackathon requirementsZhalgas Askarov
  • 2026-09-23 17:11feat: complete milestone workflow and integrate verified MVPZhalgas Askarov
  • 2026-09-23 17:10fix: align frontend controls and preserve unsaved form stateSanjar
Все коммиты (18)
  • 2026-09-23 16:43fix: complete frontend integration with backend task lifecycleSanjar
  • 2026-09-23 16:36merge: integrate latest backend updates from mainSanjar
  • 2026-09-23 16:35feat: polish Task Hub interface and add light themeSanjar
  • 2026-09-23 16:02fix: harden task builder, AI extraction and storage recoveryZhalgas Askarov
  • 2026-09-23 15:05chore: combine frontend and backend for local previewZhalgas Askarov
  • 2026-09-23 15:02feat: build Task Hub frontend and integrate backend APISanjar
  • 2026-09-23 14:54feat: improve AI fact extraction and add quality evaluationsZhalgas Askarov
  • 2026-09-23 14:31fix: harden AI card extraction after live validationZhalgas Askarov
  • 2026-09-23 14:15feat: implement functional hackathon backendZhalgas Askarov
  • 2026-09-23 13:50chore: initialize hackathon project scaffoldZhalgas Askarov
Структура репозитория (153 файлов)
.editorconfig
.env.example
.gitattributes
.gitignore
AGENTS.md
CLAUDE.md
README.md
data/.gitkeep
docs/AI-QUALITY.md
docs/API.md
docs/REQUIREMENTS.md
docs/frontend-integration.md
eslint.config.mjs
evals/cases.ts
evals/quality.eval.ts
next.config.ts
package.json
pnpm-lock.yaml
pnpm-workspace.yaml
postcss.config.mjs
public/file.svg
public/globe.svg
public/hackalem-ai.png
public/images/tasks/GENERATED-COVERS.md
public/images/tasks/bakery-inventory.png
public/images/tasks/bakery-stock.png
public/images/tasks/service-queue-people.png
public/images/tasks/service-queue.png
public/images/tasks/volunteer-assistant.png
public/logo.png
public/next.svg
public/vercel.svg
public/window.svg
scripts/smoke.mjs
src/app/api/ai/card/route.ts
src/app/api/ai/questions/route.ts
src/app/api/health/route.ts
src/app/api/milestones/[id]/review/route.ts
src/app/api/milestones/[id]/submit/route.ts
src/app/api/proposals/[id]/milestones/route.ts
src/app/api/proposals/[id]/status/route.ts
src/app/api/proposals/route.ts
src/app/api/tasks/[id]/archive/route.ts
src/app/api/tasks/[id]/milestones/route.ts
src/app/api/tasks/[id]/proposals/route.ts
src/app/api/tasks/[id]/publish/route.ts
src/app/api/tasks/[id]/route.ts
src/app/api/tasks/route.ts
src/app/api/teams/[id]/route.ts
src/app/api/teams/route.ts
src/app/business/new/page.tsx
src/app/business/page.tsx
src/app/business/tasks/[id]/edit/page.tsx
src/app/business/tasks/[id]/proposals/page.tsx
src/app/business/tasks/[id]/published/page.tsx
src/app/catalog/page.tsx
src/app/error.tsx
src/app/favicon.ico
src/app/fonts/Manrope-Variable.ttf
src/app/fonts/OFL.txt
src/app/fonts/README.md
src/app/globals.css
src/app/how-it-works/page.tsx
src/app/icon.svg
src/app/layout.tsx
src/app/loading.tsx
src/app/not-found.tsx
src/app/page.tsx
src/app/tasks/[id]/page.tsx
src/app/tokens.css
src/app/ui-system.css
src/components/catalog.module.css
src/components/catalog.tsx
src/components/feature-placeholder.tsx
src/components/how-it-works.tsx
src/components/landing-preview.module.css
src/components/landing.module.css
src/components/landing.tsx
src/components/milestones.tsx
src/components/page-transition.tsx
src/components/proposals.tsx
src/components/published-task.tsx
src/components/reveal.tsx
src/components/rotating-idea-input.tsx
src/components/site-shell.tsx
src/components/task-artwork.module.css
src/components/task-builder.tsx
src/components/task-details.tsx
src/components/theme-controls.module.css
src/components/theme-controls.tsx
src/components/ui.tsx
src/lib/client/api-error.ts
src/lib/client/builder-draft.test.ts
src/lib/client/builder-draft.ts
src/lib/client/builder-session.test.ts
src/lib/client/builder-session.ts
src/lib/client/builder-workflow.test.ts
src/lib/client/builder-workflow.ts
src/lib/client/milestone-ui.test.tsx
src/lib/client/mock-service.test.ts
src/lib/client/mock-service.ts
src/lib/client/model.ts
src/lib/client/proposal-draft.test.ts
src/lib/client/proposal-draft.ts
src/lib/client/schemas.ts
src/lib/client/seeds.ts
src/lib/client/service.test.ts
src/lib/client/service.ts
src/lib/client/task-artwork.ts
src/lib/client/theme.test.ts
src/lib/client/theme.ts
src/lib/client/use-resource.test.ts
src/lib/client/use-resource.ts
src/server/README.md
src/server/ai/analysis.test.ts
src/server/ai/errors.test.ts
src/server/ai/errors.ts
src/server/ai/fields.ts
src/server/ai/grounding.test.ts
src/server/ai/grounding.ts
src/server/ai/mock.ts
src/server/ai/openai.test.ts
src/server/ai/openai.ts
src/server/ai/prompts.ts
src/server/ai/provider.ts
src/server/ai/questions.test.ts
src/server/ai/questions.ts
src/server/ai/result-quote.test.ts
src/server/ai/result-quote.ts
src/server/ai/service.test.ts
src/server/ai/service.ts
src/server/bootstrap.ts
src/server/domain/readiness.test.ts
src/server/domain/readiness.ts
src/server/env.ts
src/server/errors.ts
src/server/http.test.ts
src/server/http.ts
src/server/repositories/database.ts
src/server/repositories/file-lock.test.ts
src/server/repositories/file-lock.ts
src/server/repositories/json-repository.test.ts
src/server/repositories/json-repository.ts
src/server/repositories/readiness.test.ts
src/server/repositories/seed.ts
src/server/services/platform.test.ts
src/server/services/platform.ts
src/shared/contracts.ts
src/shared/scoring.test.ts
src/shared/scoring.ts
tsconfig.json
vitest.ai.config.mts
vitest.config.mts
Ветки (2)

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

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

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