Task Hub
Платформа, где бизнес превращает описание проблемы в карточку задачи для студенческих команд с рейтингом готовности 0–100.
О проекте
Команда: 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.mdTask 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.
Тестовые сценарии
- Сквозное демо: «Создать задачу» → пример «Кофейня» → ответы на вопросы → карточка → проверка и подтверждение полей → публикация → отклик команды → принятие или отклонение бизнесом.
- Пересчёт: подтвердить заполненный контекст — получить 20 баллов; изменить его — снять подтверждение и соответствующие баллы; подтвердить снова.
- Низкий рейтинг: опубликовать задачу с рейтингом 20/100, найти в каталоге и отправить предложение.
- Защита данных: публикация без подтверждённого названия не проходит; устаревшая версия при сохранении возвращает конфликт, введённый текст остаётся в форме.
- Прогресс: выбранной команде создать этап, сдать отчёт, вернуть на доработку, сдать повторно и подтвердить. Баллы появляются только после подтверждения; повторное подтверждение не начисляет их снова.
Ограничения MVP
Авторизации и ограничения частоты AI-запросов нет: роли демонстрационные. Создание команды доступно через API, в интерфейсе выбираются готовые профили. JSON-хранилище рассчитано на один локальный сервер с постоянным диском. Не открывайте экземпляр с приватными данными или платным AI-ключом в интернет без защиты доступа.
Чат, уведомления, загрузка файлов, рекомендации по навыкам и production-инфраструктура не реализованы и не обязательны для кейса.
Подробности: соответствие ТЗ · API · подключение фронтенда · проверка AI.
Авторы коммитов
История коммитов
- 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 комментариев
Войдите, чтобы комментироватьПока нет комментариев — будьте первым.