AAYMA
RU
Войти

МОСТ

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

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

О проекте

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

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

Суть

Платформа: бизнес уточняет задачу, подтверждает карточку и повышает её рейтинг, любые команды подают предложения. Бизнес выбирает 0, 1 или несколько команд и после проверки отчёта начисляет выбранной 20 баллов.

Как устроено

React-интерфейс (Vinext/Vite, shadcn) и Cloudflare Worker с базой D1 через Drizzle; локально запускается через Miniflare. Уточнение делает локальная AI-заглушка (lib/assistant.ts): она задаёт 3–7 вопросов и возвращает карточку только с сообщёнными фактами, ответ валидируется через Zod. Рейтинг считается как Σ(вес × заполнено × подтверждено). Сервер проверяет роли, владельца задачи и Origin.

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

  • правиловая AI-заглушка
  • формула рейтинга Σ(weight×completed×confirmed)
  • Zod-валидация
  • Drizzle-миграции

Особенности

README прямо говорит, что внешняя LLM не используется, и не выдаёт заглушку за модель. Черновики и отклики изолированы по ролям. В истории есть коммит «Add WIND forecasting MVP» (кейс 1), но в дереве файлов этого кода нет.

Стек

TypeScript · React 19 · Vite/Vinext · shadcn/Radix · Cloudflare Workers · D1 · Drizzle · Zod


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

README

README.md

МОСТ — задачи бизнеса и студенческие команды

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

Открыть в VS Code и запустить

  1. Откройте эту папку через File → Open Folder. Файл package.json должен находиться в корне открытой папки.
  2. На Windows можно просто запустить START-DEMO.cmd. На компьютере, где создан проект, зависимости уже установлены.
  3. Для запуска на другом компьютере установите Node.js 24 с npm и выполните в терминале VS Code:
npm ci
npm run demo
  1. Откройте http://localhost:5173. В верхней полосе выбирайте бизнес или одну из пяти команд.
  2. Остановите сервер сочетанием Ctrl+C.

npm run demo собирает приложение, применяет миграции, добавляет синтетические данные при первом запуске и запускает локальный сервер. API-ключи, отдельный сервер базы и регистрация для демонстрации не нужны. Изменения сохраняются на диске в .demo-data между перезапусками. После первого запуска готовой сборки можно использовать npm run demo:start.

Локальный демонстрационный сервер слушает только 127.0.0.1. Переключение личностей — специально для защиты проекта, а не производственная аутентификация.

Соответствие кейсу

  • Свободное описание потребности и минимум три уместных уточняющих вопроса.
  • Редактируемая карточка: контекст, потребность, пользователи, данные, ограничения, результат, критерии успеха, контакт, формат обратной связи, срок и условия.
  • Явное подтверждение человеком. При редактировании подтверждение сбрасывается.
  • Рейтинг 0–100 с расшифровкой. Пересчёт и сортировка каталога после подтверждённых изменений.
  • Низкий рейтинг не запрещает публикацию или отклик.
  • Каталог всех опубликованных задач, поиск, фильтры по теме и уровню готовности.
  • Неограниченное число предложений, в том числе несколько от одной команды: идея, план, срок, ссылка на прототип, опыт и контакты.
  • Ручное сравнение и окончательный выбор 0/1/нескольких команд. Невыбранные отклики отклоняются. Автоматического назначения нет.
  • Выбранная команда отправляет отчёт с подтверждением фактического результата. Только владелец задачи подтверждает этап и начисляет 20 баллов; повторное начисление невозможно.
  • По пять синтетических черновиков, карточек, профилей команд и предложений: data/demo.json.

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

Начисляются веса только тех критериев, чьи поля заполнены и подтверждены бизнесом. В редакторе показывается предварительный расчёт; в каталоге — сохранённый подтверждённый рейтинг.

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

rating = Σ(weight × completed × confirmed).

Длина текста — воспроизводимая эвристика полноты, не доказательство содержательного качества. Вес компании, репутация и чувствительные признаки участников не учитываются.

  • 0–39: требует уточнения (уровень «черновик» из кейса).
  • 40–69: рабочая.
  • 70–89: готовая.
  • 90–100: приоритетная, визуально выделена.

Статус личного неопубликованного черновика и уровень готовности опубликованной задачи — разные вещи. Личный черновик скрыт; опубликованная задача с 0 баллов видна всем командам и принимает предложения. Каталог сортируется по убыванию рейтинга, затем по времени создания. Фильтры не ограничивают доступ к полному каталогу. Срок в карточке информационный: приём закрывает сам бизнес.

AI-функция

Используется локальная заглушка, разрешённая условиями кейса. Внешняя модель не вызывается. Помощник анализирует полноту, учитывает направление задачи, задаёт минимум три вопроса и возвращает карточку только с уже сообщёнными значениями. Пользователь дополняет и редактирует её вручную, затем подтверждает.

Полный промпт, формат и валидация находятся в lib/assistant.ts. Вход:

{"description":"Нужен сайт","category":"Разработка","fields":{"title":"","problem":"Нужен сайт"}}

API принимает {action:"clarify", description, fields}; направление передаётся в fields.category. Выход содержит mode:"local-stub", questions (3–7 строк), draft (полный набор строковых полей карточки) и warning. Неизвестные поля остаются пустыми. Каждый предложенный факт проверяется на совпадение с входом.

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

Архитектура

  • app/workspace.tsx: React-интерфейс.
  • app/api/platform/route.ts: серверные операции и проверки прав.
  • lib/readiness.ts: единая формула рейтинга и уровни.
  • lib/assistant.ts: локальная AI-заглушка, промпт и строгая проверка ответа.
  • db/schema.ts, drizzle/: таблицы профилей, задач и предложений, миграции.
  • scripts/demo-server.mjs: локальный HTTP-шлюз, Miniflare и постоянная D1.
  • scripts/demo-data.mjs: генератор синтетических данных.
  • scripts/verify-workflows.mjs: интеграционные проверки собранного Worker.

Стек: TypeScript, React 19, Vinext/Vite, Radix/Shadcn, Cloudflare Worker + D1, Drizzle, Zod. Модель данных: профиль владеет задачами или откликами; отклик принадлежит задаче; отчёт этапа и однократные баллы хранятся в отклике.

Черновик виден только владельцу. Предложение и контакты команды видят только команда и владелец задачи. Все операции изменения проверяют роль, владельца и Origin на сервере. Повторная отправка одного запроса не создаёт дубль благодаря уникальному идентификатору предложения.

В размещённой версии используется вход через ChatGPT и заголовки доверенного шлюза Sites. Не публикуйте локальный демошлюз или Worker с доверенными auth-заголовками напрямую без соответствующей защиты.

Проверки

npx tsc --noEmit
npm run build
npm test

На момент сдачи: 88 автоматических проверок проходят. Они используют отдельную временную базу и проверяют:

  • нулевой рейтинг, рост до 100, пороги уровней и сортировку;
  • ручное подтверждение, опубликованные дополнения и некорректную дату;
  • вопросы AI и отклонение выдуманных/некорректных ответов;
  • изоляцию черновиков и откликов, права ролей, Origin и безопасные ссылки;
  • неограниченные отклики и защиту от повторной отправки;
  • выбор 0, 1 и нескольких команд;
  • отправку отчёта, подтверждение только бизнесом и однократные 20 баллов.

Для ручной проверки используйте DEMO.md.

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

AI работает по правилам, без внешней модели. Один подтверждаемый этап на отклик. Решение о выборе окончательное. Нет чата, платежей, файлов и почтовой рассылки. Профиль команды представляет её одним аккаунтом; совместное управление участниками не реализовано. Для большого каталога нужна пагинация. Все данные в локальном демо синтетические; ссылки example.com обозначают макеты.

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

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

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

sagynaiamir-svg 4chikeshka1337 2

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

  • 2026-09-23 14:52Merge branch 'main' of https://github.com/BAITC-Hacks/hack-8c85e77a-n0chancechikeshka1337
  • 2026-09-23 14:52Create project1chikeshka1337
  • 2026-09-23 15:46Document blocked cloud checks and use project Python in VS Code taskssagynaiamir-svg
  • 2026-09-23 15:42Add WIND forecasting MVP with operational NOAA archive and leakage-safe replaysagynaiamir-svg
  • 2026-09-23 14:44Merge pull request #1 from BAITC-Hacks/codex/most-mvpsagynaiamir-svg
  • 2026-09-23 14:35Build MOST MVP for HackAlem business task readiness casesagynaiamir-svg
Структура репозитория (115 файлов)
.gitignore
.npmrc
.openai/hosting.json
DEMO.md
README.md
START-DEMO.cmd
app/api/platform/route.ts
app/chatgpt-auth.ts
app/globals.css
app/layout.tsx
app/page.tsx
app/workspace.tsx
cloudflare-env.d.ts
components.json
components/ui/accordion.tsx
components/ui/alert-dialog.tsx
components/ui/alert.tsx
components/ui/aspect-ratio.tsx
components/ui/attachment.tsx
components/ui/avatar.tsx
components/ui/badge.tsx
components/ui/breadcrumb.tsx
components/ui/bubble.tsx
components/ui/button-group.tsx
components/ui/button.tsx
components/ui/calendar.tsx
components/ui/card.tsx
components/ui/carousel.tsx
components/ui/chart.tsx
components/ui/checkbox.tsx
components/ui/collapsible.tsx
components/ui/combobox.tsx
components/ui/command.tsx
components/ui/context-menu.tsx
components/ui/dialog.tsx
components/ui/direction.tsx
components/ui/drawer.tsx
components/ui/dropdown-menu.tsx
components/ui/empty.tsx
components/ui/field.tsx
components/ui/form.tsx
components/ui/hover-card.tsx
components/ui/input-group.tsx
components/ui/input-otp.tsx
components/ui/input.tsx
components/ui/item.tsx
components/ui/kbd.tsx
components/ui/label.tsx
components/ui/marker.tsx
components/ui/menubar.tsx
components/ui/message-scroller.tsx
components/ui/message.tsx
components/ui/native-select.tsx
components/ui/navigation-menu.tsx
components/ui/pagination.tsx
components/ui/popover.tsx
components/ui/progress.tsx
components/ui/radio-group.tsx
components/ui/resizable.tsx
components/ui/scroll-area.tsx
components/ui/select.tsx
components/ui/separator.tsx
components/ui/sheet.tsx
components/ui/sidebar.tsx
components/ui/skeleton.tsx
components/ui/slider.tsx
components/ui/sonner.tsx
components/ui/spinner.tsx
components/ui/switch.tsx
components/ui/table.tsx
components/ui/tabs.tsx
components/ui/textarea.tsx
components/ui/toggle-group.tsx
components/ui/toggle.tsx
components/ui/tooltip.tsx
data/demo.json
db/index.ts
db/schema.ts
drizzle.config.ts
drizzle/0000_bumpy_magma.sql
drizzle/0001_cheerful_silvermane.sql
drizzle/meta/0000_snapshot.json
drizzle/meta/0001_snapshot.json
drizzle/meta/_journal.json
eslint.config.mjs
examples/d1/app/api/notes/route.ts
examples/d1/db/schema.ts
hooks/use-mobile.ts
lib/assistant.ts
lib/readiness.ts
lib/utils.ts
next.config.ts
package-lock.json
package.json
postcss.config.mjs
project1
public/favicon.svg
public/file.svg
public/globe.svg
public/window.svg
scripts/build-verified.sh
scripts/demo-data.mjs
scripts/demo-server.mjs
scripts/execution-profile.mjs
scripts/install-ci.mjs
scripts/install-ci.sh
scripts/install-pnpm.sh
scripts/npm-install.mjs
scripts/pnpm-install.mjs
scripts/run-framework.mjs
scripts/sites-env.mjs
scripts/sites-env.sh
scripts/verify-workflows.mjs
tsconfig.json
vite.config.ts
Ветки (3)

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

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

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