МОСТ
Платформа: бизнес уточняет задачу, подтверждает карточку и повышает её рейтинг, любые команды подают предложения.
О проекте
Команда: 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 и запустить
- Откройте эту папку через File → Open Folder. Файл
package.jsonдолжен находиться в корне открытой папки. - На Windows можно просто запустить START-DEMO.cmd. На компьютере, где создан проект, зависимости уже установлены.
- Для запуска на другом компьютере установите Node.js 24 с npm и выполните в терминале VS Code:
npm ci
npm run demo
- Откройте http://localhost:5173. В верхней полосе выбирайте бизнес или одну из пяти команд.
- Остановите сервер сочетанием 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 приватная. Полный межпользовательский сценарий для защиты доступен в локальном деморежиме.
Авторы коммитов
История коммитов
- 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
Обсуждение 0 комментариев
Войдите, чтобы комментироватьПока нет комментариев — будьте первым.