AAYMA
RU
Войти

TaskReady

Next.js-приложение: мастер превращает черновик бизнес-задачи в карточку из 10 полей через 3–6 уточняющих вопросов AI, код считает рейтинг готовности…

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

О проекте

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

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

Суть

Next.js-приложение: мастер превращает черновик бизнес-задачи в карточку из 10 полей через 3–6 уточняющих вопросов AI, код считает рейтинг готовности с геймификацией, задача публикуется в каталог, команды откликаются, бизнес выбирает вручную.

Как устроено

Описание проблемы → LLM извлекает известные сведения и спрашивает о недостающих по весу в рейтинге → карточка с source/evidence для каждого поля. Провайдеры в цепочке OpenAI Responses API → NVIDIA NIM → локальная заглушка, ответ проверяется Zod и проверкой цитат. Рейтинг считает lib/scoring.ts по словарям и длинам только за подтверждённые поля; данные хранятся в JSON-файле с атомарной записью, история баллов и +50 команде за подтверждённый этап.

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

  • OpenAI Responses API
  • NVIDIA NIM guided_json
  • цепочка фолбэков провайдеров
  • Zod + JSON Schema
  • проверка цитат (evidence)
  • детерминированный скоринг по словарям
  • атомарная запись JSON

Особенности

Цепочка из трёх AI-провайдеров с локальной заглушкой, поэтому сценарий работает без ключей; у каждого поля карточки хранится источник и цитата-доказательство; панель отладки ИИ показывает промпт, сырой ответ и результат проверки.

Стек

TypeScript · Next.js · React · Tailwind CSS · shadcn/ui · Radix UI · Zod · Vitest

Модели

gpt-6-luna · nvidia/nemotron-3-super-120b-a12b · OpenAI Responses API · NVIDIA NIM


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

README

README.md

TaskReady

От черновика бизнес-задачи до понятного задания и выбора студенческой команды.

Проект для HackAlem AI, кейс AI Sana «Рейтинг качества бизнес-задач и открытый выбор команд». Команда R2C: ddigreen и saimonsetish. Репозиторий проекта.

Бизнесу часто сложно описать задачу так, чтобы команда могла оценить объём работы и начать её решать. Студентам трудно понять, какие данные доступны, какой результат нужен и насколько заказчик готов к взаимодействию. TaskReady помогает уточнить исходный запрос, собрать карточку и увидеть её готовность по прозрачной формуле от 0 до 100.

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

Быстрый старт (2 минуты, ключи не нужны)

Нужен Node.js 20.9+.

git clone https://github.com/BAITC-Hacks/hack-4fa785fd-r2c.git
cd hack-4fa785fd-r2c
npm install
npm run dev

Откройте http://localhost:3000 и пройдите сценарий из раздела «Как проверить решение». Без ключей ИИ работает через локальную заглушку

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

  • Мастер создания задачи: черновик → 3–6 уточняющих вопросов → редактируемая карточка из десяти полей.
  • Предварительный рейтинг, текущий подтверждённый балл, уровень готовности, расшифровка и подсказки «Что добавить».
  • Геймификация для бизнеса: показ оставшихся баллов до следующего уровня; подсказки с возможным приростом баллов; история роста рейтинга списком изменений с датами, включая снижение; празднование нового уровня с уведомлением, кубком и конфетти; анимация изменения балла.
  • Подтверждение всех непустых полей одной кнопкой «Всё верно — подтвердить карточку» и одним PATCH-запросом. Ручные правки сохраняются автоматически и подтверждают изменённое поле; очистка снимает подтверждение.
  • Пересчёт рейтинга на сервере при сохранении и запись его истории. При повышении уровня появляется короткое уведомление.
  • Публикация задачи с расчётом её места в каталоге. Кабинет бизнеса показывает название, статус, рейтинг, уровень и число откликов.
  • Открытый каталог с фильтрами отрасли и уровня, сортировкой по рейтингу и отдельными рекомендациями для выбранной команды.
  • Отклики с идеей, планом, сроком и ссылкой на прототип. Бизнес принимает или отклоняет их вручную и подтверждает выполненный этап.
  • За подтверждённый этап команда однократно получает +50 баллов; таблица команд отсортирована по баллам.
  • Переключение демонстрационных ролей «Бизнес» и «Команда» с сохранением выбора в cookie.
  • Панель «Как работает ИИ»: провайдер, промпт, входные данные, сырой ответ и результат проверки. Полный журнал попыток хранится на сервере.

Как работает решение

  1. Бизнес вводит название компании, отрасль и описание проблемы на /business/new.
  2. Анализатор извлекает известные сведения и спрашивает о недостающих, начиная с наиболее весомых для рейтинга.
  3. Из черновика и ответов собирается карточка. Мастер сохраняет задачу со статусом draft; все полученные от ИИ поля первоначально имеют confirmed: false.
  4. Бизнес видит предварительный рейтинг, проверяет текст и нажимает «Всё верно — подтвердить карточку». Сервер пересчитывает подтверждённый балл. Непустые ручные правки подтверждаются сразу, пустые поля — нет.
  5. Когда указано название, все непустые поля подтверждены и изменения сохранены, интерфейс разрешает публикацию. Задача попадает в каталог независимо от её рейтинга.
  6. Команда выбирает задачу и отправляет отклик. Бизнес принимает одну, несколько или ни одной команды. Подтверждение этапа принятого отклика начисляет команде баллы.

Технологии

ЧастьРеализация
Язык и приложениеTypeScript, Next.js 16 с App Router, React 19, Node.js
ИнтерфейсTailwind CSS 4, shadcn/ui, Radix UI, Lucide React
ВалидацияZod 4: схемы данных, входы API и структурированные ответы ИИ
ИИOpenAI SDK 6; OpenAI Responses API; NVIDIA NIM через OpenAI-совместимый Chat Completions API
МоделиИдентификаторы задаются через OPENAI_MODEL и NVIDIA_MODEL; конкретная модель в коде не закреплена; в демо использовались gpt-6-luna (OpenAI) и nvidia/nemotron-3-super-120b-a12b (NVIDIA)
ХранениеЛокальный JSON-файл, файловый API Node.js, последовательная очередь записи и атомарная замена файла
ПроверкиVitest 4, ESLint 9, TypeScript; запуск служебных TypeScript-скриптов через tsx

Архитектура проекта

Браузер: мастер / редактор / каталог / отклики / команды
    │
    ├── Серверные страницы Next.js ── readDb ── data/db.json
    │
    └── /api/* ── Zod-валидация
          ├── Задачи ── calculateScore ── updateDb
          ├── Отклики и баллы команд ── updateDb
          └── ИИ ── промпт + JSON Schema
                      └── OpenAI → NVIDIA → локальная заглушка
                            └── Zod + проверка цитат → результат + журнал
ПутьНазначение
app/page.tsx, app/layout.tsxГлавная страница, навигация и выбор роли
app/business/Создание задачи, список задач бизнеса, редактирование и обработка откликов
app/catalog/, app/teams/Каталог, карточки для команд, форма отклика и рейтинг команд
app/api/HTTP-обработчики задач, откликов, команд и ИИ
components/BusinessTaskWizard.tsx, components/TaskEditor.tsxМастер и общий редактор карточки с подтверждением и публикацией
components/AiDebugPanel.tsxПросмотр результатов вызовов ИИ в мастере
lib/types.tsОбщие типы, Zod-схемы и JSON Schema для моделей
lib/scoring.ts, lib/levels.tsДетерминированная формула и границы уровней
lib/card-confirmation.ts, lib/task-client.tsПравила подтверждения и клиентские запросы сохранения/публикации
lib/catalog.ts, lib/recommend.tsСортировка каталога и рекомендации
lib/ai/Промпты, анализ, сборка, проверка цитат и переключение провайдеров
lib/store.tsЧтение, валидация, обновление и сброс базы
data/seed.json, scripts/db.tsИсходные демо-данные и команды инициализации/сброса

data/db.json содержит задачи, команды, отклики и aiLogs. В задаче сохраняются карточка, рассчитанный рейтинг и scoreHistory. Каждое поле карточки имеет текст value, признак confirmed, источник source и необязательную цитату evidence. Источники: ai_extracted, user_answer, user_edited.

Записи в базу выполняются последовательно внутри одного Node.js-процесса. Новая версия сначала записывается во временный файл, затем заменяет основной через rename. Если существующая база повреждена, приложение сообщает ошибку, а не перезаписывает её автоматически.

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

Нужны Node.js 20.9 или новее, npm и Git. Отдельный сервер базы данных не требуется.

1. Получить проект и установить зависимости

git clone https://github.com/BAITC-Hacks/hack-4fa785fd-r2c.git
cd hack-4fa785fd-r2c
npm install

2. При необходимости подключить внешние модели

Этот шаг необязателен. Без .env.local и без ключей приложение использует локальную заглушку: можно пройти весь сценарий, опубликовать задачу и обработать отклики.

Для подключения провайдеров:

cp .env.example .env.local

Заполните параметры нужного провайдера в .env.local:

OPENAI_API_KEY=
OPENAI_MODEL=
NVIDIA_API_KEY=
NVIDIA_MODEL=

Для каждого включённого провайдера нужны и ключ, и имя модели. Модель OpenAI должна поддерживать Responses API, JSON Schema и reasoning.effort: "low". Модель NVIDIA должна поддерживать nvext.guided_json. Можно подключить только одного провайдера; без доступного внешнего ответа приложение перейдёт к локальному варианту. После изменения настроек перезапустите сервер.

.env* исключены из Git, кроме пустого шаблона .env.example. Ключи читаются только на сервере.

3. Запустить приложение

npm run dev

Откройте http://localhost:3000. Перед запуском predev автоматически создаёт data/db.json из data/seed.json, если базы ещё нет. Существующие данные сохраняются между перезапусками.

4. Сбросить демо-данные

Остановите dev-сервер через Ctrl+C, затем выполните:

npm run reset
npm run dev

Сброс заменяет локальную базу исходным набором: созданные вами задачи, отклики, изменения баллов и журнал ИИ удаляются. Cookie выбранной роли в браузере сохраняется.

Дополнительные команды

npm test              # автоматические тесты
npm run typecheck     # проверка типов
npm run lint          # проверка кода
npm run build         # production-сборка
npm start             # запуск собранного приложения

Развёрнутой версии нет: приложение запускается локально по инструкции выше

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

Рейтинг рассчитывает код, а не языковая модель: lib/scoring.ts. Это оценка полноты описания и готовности к работе, а не доказательство качества идеи или достоверности сведений.

Для получения баллов поле должно быть подтверждено человеком (confirmed: true) и содержать не менее 15 символов после trim. Это условие относится ко всем проверкам, включая контакт. Дополнительные проверки суммируются с базовыми.

БлокМаксимумПроверки и баллы
Контекст и потребность (contextNeed)20context заполнен — 6; need заполнен — 6; длина context ≥ 80 — 4; длина need ≥ 60 — 4
Данные и материалы (data)20Поле заполнено — 10; тип или источник из DATA_WORDS — 5; есть цифра — 5
Ожидаемый результат (expectedResult)15Поле заполнено — 9; артефакт из ARTIFACT_WORDS — 6
Критерии успеха (successCriteria)15Поле заполнено — 8; есть цифра, % или предусмотренный маркер измеримости — 7
Ограничения (constraints)10Поле заполнено — 5; есть срок из TIME_WORDS, технология/доступ из TECH_OR_ACCESS_WORDS или дата с разделителями -, . либо / — 5
Пользователи (users)10Поле заполнено — 6; длина ≥ 40, есть цифра или роль из USER_ROLE_WORDS — 4
Связь с бизнесом (businessLink)10contact содержит email, телефон с минимум 7 цифрами или Telegram @username из 5–32 латинских букв, цифр и подчёркиваний — 5; interactionFormat заполнен — 3; указан формат или частота обратной связи — 2
Итого100Сумма баллов всех пройденных проверок

Примеры словарных маркеров: CSV, Excel, JSON, SQL, API, таблица, выгрузка, CRM — для данных; прототип, бот, дашборд, отчёт, приложение, MVP — для результата; день, неделя, срок, Python, доступ — для ограничений; менеджер, оператор, клиент — для пользователей. Измеримость распознаётся, в частности, по «не менее», «до», «сократить», «увеличить». Для взаимодействия учитываются «раз в», еженедельный созвон, встреча, онлайн, офлайн, чат и другие маркеры из кода.

Словари содержат русские, казахские и английские варианты; поиск не учитывает регистр и использует слова либо их начала. Полные условия и регулярные выражения находятся в lib/scoring.ts. Наличие числа формально засчитывается как объём/период или измеримость; смысл числа код не проверяет.

  • score.total — фактически начисленные баллы подтверждённых полей.
  • score.potential — результат той же формулы, если подтвердить все заполненные поля. Он показывается как «Предварительный рейтинг: N / 100» и не начисляет баллы сам по себе.
  • score.level определяется по подтверждённому total. Рядом с предварительной оценкой интерфейс отдельно показывает уровень для potential.
  • score.missing — все непройденные проверки подтверждённого рейтинга, отсортированные по убыванию баллов. В редакторе список «Что добавить» рассчитывается для предварительной оценки, чтобы показывать недостающие сведения.
  • title баллов не даёт, но непустое название необходимо для публикации.

Уровни из lib/levels.ts:

БаллыКодНазвание
0–39draftЧерновик · требует уточнения
40–69workableРабочая
70–89readyГотовая
90–100priorityПриоритетная

Общее подтверждение устанавливает confirmed: true у всех непустых полей, но текст короче 15 символов по-прежнему не даёт баллов. Ручная правка сохраняется с source: user_edited; непустое поле подтверждается, пустое — нет. Рейтинг обновляется из ответа сервера после сохранения.

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

  • Каталог содержит все задачи со статусом published, включая уровень draft. Статус неопубликованной задачи и уровень её готовности — разные признаки.
  • Сначала идут задачи с большим score.total. При равенстве выше более новая публикация: сравнивается publishedAt, при его отсутствии — createdAt.
  • Пользователь может фильтровать основной список по отрасли и уровню. Низкий балл сам по себе не скрывает задачу и не запрещает отклик.
  • priority визуально выделяется; draft имеет пометку «требует уточнения».
  • Рекомендации находятся в отдельном блоке и не ограничивают основной список. В них попадают опубликованные задачи с баллом от 40 и хотя бы одним совпадением.
  • Совпадения — точное равенство после удаления пробелов по краям и приведения к нижнему регистру: интересы, навыки и технологии команды сопоставляются с отраслью и тегами задачи. Сортировка рекомендаций: число совпадений, рейтинг, дата создания — по убыванию. Показывается причина рекомендации.
  • На публичной странице задачи отображаются подтверждённые непустые поля. Отклик включает идею, план, срок и обязательную HTTP(S)-ссылку на прототип.
  • Число откликов не ограничено, в том числе от одной команды. Автоматического назначения исполнителей нет.
  • После публикации API возвращает position и total по всему каталогу. При публикации из мастера происходит переход в кабинет задачи; повторная кнопка «Обновить позицию в каталоге» на этой странице показывает сообщение «Ваша задача на N месте из M».

Как работает ИИ

Провайдеры и модели

Цепочка: OpenAI → NVIDIA NIM → локальная заглушка. Провайдер без ключа пропускается. Если ключ есть, но модель не задана, ошибка конфигурации записывается в журнал и выбирается следующий провайдер.

ПровайдерAPI и настройки
OpenAIhttps://api.openai.com/v1, Responses API, модель из OPENAI_MODEL, reasoning.effort: "low", store: false, строгий JSON Schema в text.format; temperature и top_p не передаются
NVIDIA NIMhttps://integrate.api.nvidia.com/v1, Chat Completions, модель из NVIDIA_MODEL, temperature: 0.1, top_p: 1, JSON Schema через nvext.guided_json
Локальная заглушкаРаботает без сети и ключей: шаблонные вопросы и извлечение текста по правилам в lib/ai/local.ts; это не языковая модель

Промпты и источники фактов

Промпты находятся в lib/ai/prompts.ts: ANALYZE_PROMPT для вопросов и BUILD_CARD_PROMPT для карточки. Они требуют считать пользовательский JSON данными, использовать только черновик и ответы, сохранять цитаты, отрицания и условия, не придумывать факты и возвращать JSON по схеме. Отрасль помогает сформулировать вопросы, но не служит источником фактов карточки.

Анализ задаёт 3–6 вопросов с приоритетом недостающих полей большого веса. Код дополнительно проверяет уникальность вопросов, их язык и охват приоритетных полей; неподходящий набор заменяет шаблонными вопросами. Язык определяется эвристически: русский, казахский или английский. Интерфейс приложения — русский.

Формат входа и выхода

POST /api/ai/analyze:

{
  "draftText": "Клиенты стали реже возвращаться, хотим понять почему и что с этим сделать",
  "industry": "Общепит"
}

Ответ содержит:

{
  extracted: { [field]: { value: string, evidence: string } },
  missing: FieldKey[],
  questions: [{ id, field, question, why }],
  debug: { id, at, provider, prompt, input, rawOutput, validation, rejectedFields }
}

В публичном extracted неизвестные поля отсутствуют. В схеме ответа модели предусмотрены все ключи с возможностью null.

POST /api/ai/build-card:

{
  "draftText": "Клиенты стали реже возвращаться, хотим понять почему и что с этим сделать",
  "answers": [
    {
      "questionId": "question-data",
      "field": "data",
      "answer": "Есть CSV с 1200 заказами за 6 месяцев"
    }
  ]
}

Ответ: { card, debug }. В card всегда десять ключей: title, context, need, users, data, constraints, expectedResult, successCriteria, contact, interactionFormat. Каждое значение — { value, evidence } или null. Пустой массив ответов допустим; последний ответ по полю имеет приоритет. AI API не создаёт задачу и не подтверждает её: это отдельные действия мастера.

Проверка цитат и некорректных ответов

  1. Выход проходит разбор JSON и Zod-валидацию по схемам из lib/types.ts.
  2. lib/ai/evidence.ts проверяет, что evidence входит в один исходный текст: черновик или отдельный ответ. Регистр и последовательности пробелов нормализуются.
  3. value должен совпадать с evidence после той же нормализации. Поле с неподтверждённой цитатой отбрасывается, фиксируется rejected_unsupported. Неизвестные сведения остаются пустыми; это не обязательно запускает смену провайдера, если остальной ответ пригоден.
  4. При невалидном JSON, нарушении схемы или незавершённом ответе выполняется один повтор у того же провайдера с уточнением промпта.
  5. Сетевая ошибка, HTTP-ошибка, отказ провайдера или таймаут переключают на следующего провайдера. Текущий PROVIDER_TIMEOUT_MS — 12 000 мс на попытку. Встроенные повторы SDK отключены; максимум — четыре внешние попытки, затем локальная обработка.
  6. Локальный результат проходит такую же валидацию. Невалидный вход API возвращает HTTP 400; ошибка локальной обработки или сохранения журнала — HTTP 500 с сообщением.

Все попытки, включая ошибки, записываются в data/db.json → aiLogs: промпт, вход, сырой ответ, провайдер, результат валидации и отброшенные поля. API возвращает debug итогового провайдера; панель мастера показывает полученные результаты анализа и сборки, а не всю цепочку серверных попыток. Значения настроенных ключей маскируются. Если журнал сохранить не удалось, дополнительный внешний запрос не выполняется.

Проверка цитат подтверждает происхождение текста, но не его истинность или корректную интерпретацию. Финальная проверка остаётся за человеком.

Данные и интеграции

Исходный набор data/seed.json содержит 10 задач: 5 черновиков и 5 опубликованных, а также 5 команд и 5 откликов. Опубликованные задачи представлены во всех четырёх уровнях готовности. Данные синтетические; исходный журнал ИИ пуст.

Новые данные поступают из форм бизнеса и команд. Упоминание CSV, CRM или API в карточке описывает доступные бизнесу материалы: приложение не подключается к этим системам и не загружает из них данные. Ссылка на прототип хранится как URL; приложение не размещает прототип.

Единственные внешние интеграции приложения — необязательные OpenAI и NVIDIA NIM. При их подключении черновик и ответы передаются выбранному провайдеру. Локальная заглушка выполняет обработку на сервере приложения.

Основные HTTP-методы:

Метод и путьНазначение
POST /api/ai/analyzeАнализ черновика и вопросы
POST /api/ai/build-cardСборка полей с цитатами
GET /api/tasks?industry=&level=&teamId=Каталог и отдельный массив рекомендаций
POST /api/tasksСоздание задачи: { businessName, industry, draftText, card }; статус draft, рейтинг и первая запись истории
PATCH /api/tasks/:idЗамена всей карточки: { card }; пересчёт рейтинга и дополнение истории
POST /api/tasks/:id/publishПубликация; возвращает задачу, position и total; повтор сохраняет исходную дату публикации
GET /api/tasks/:id/proposalsОтклики с данными команд
POST /api/tasks/:id/proposalsОтклик: { teamId, idea, plan, timeline, prototypeUrl }; только для опубликованной задачи
PATCH /api/proposals/:id{ action: "accept" / "reject" / "confirmMilestone" }
GET /api/teamsКоманды по убыванию баллов; при равенстве — по названию

Входы проверяются Zod. Создание задачи/отклика возвращает HTTP 201. Ошибки входных данных и бизнес-правил — HTTP 400, отсутствующие записи в операциях по идентификатору — HTTP 404. Подтверждение этапа разрешено только для accepted и только один раз на отклик: повтор не начисляет баллы и возвращает HTTP 400.

Как проверить решение

Для проверки жюри достаточно npm install и npm run dev, ключи не нужны. Откройте главную, выберите бизнес «Кофейня «Дала»», затем пройдите сценарий ниже. Если база уже изменялась, сначала выполните сброс по инструкции выше.

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

1. Черновик → вопросы → подтверждение одним кликом

  1. Откройте /business/new, оставьте отрасль «Общепит» и введите: «Клиенты стали реже возвращаться, хотим понять почему и что с этим сделать».
  2. Нажмите «Уточнить задачу». Должно появиться 3–6 вопросов. Раскройте «Как работает ИИ»: без ключей итоговый провайдер — «Локальная заглушка».
  3. Ответьте на вопросы о данных, результате, контексте, потребности и пользователях текстами из таблицы ниже, если такие вопросы заданы. Вопрос о критериях успеха пока пропустите.
  4. Нажмите «Собрать карточку». Сразу видны предварительный рейтинг и подтверждённый балл 0 / 100: автоматически собранные поля ещё не подтверждены.
  5. Проверьте текст и нажмите «Всё верно — подтвердить карточку» один раз. У непустых полей появляются галочки; рейтинг обновляется по ответу сервера. Точный балл на этом шаге зависит от извлечённых полей.
  6. Дополните или исправьте карточку до значений из таблицы. Критерии успеха оставьте полностью пустыми. Дождитесь «Все изменения сохранены». Ручные правки уже подтверждены, отдельного подтверждения каждого поля не требуется.

Используйте следующие синтетические данные:

ПолеТекст для проверки
НазваниеАнализ повторных покупок кофейни Дала
КонтекстКофейня ведёт продажи в кассовой системе, но сотрудники не анализируют повторные покупки. За последние месяцы гости стали возвращаться реже, причины снижения пока неизвестны.
ПотребностьХотим выявить причины снижения повторных покупок и подготовить конкретные действия, которые помогут вернуть постоянных гостей.
ПользователиВладелец кофейни и 2 менеджера будут смотреть отчёты о повторных покупках и выбирать действия для возвращения гостей.
Данные и материалыЕсть CSV с 1200 заказами за 6 месяцев: дата покупки, сумма и обезличенный идентификатор клиента.
ОграниченияСрок работы — 3 недели. Использовать Python; доступ только к обезличенной выгрузке, без подключения к кассе.
Ожидаемый результатДашборд повторных покупок и отчёт с причинами снижения и рекомендациями для владельца кофейни.
Критерии успехаОставить поле пустым, не вводить эту инструкцию
КонтактПредставитель кофейни: [email protected]
Формат взаимодействияЕженедельный онлайн-созвон с владельцем и обратная связь в чате по рабочим дням.

Ожидаемый рейтинг после сохранения этих значений: 85 / 100, «Готовая». В «Что добавить» остаются проверки критериев успеха.

2. Повышение до 100 и публикация

  1. В поле «Критерии успеха» введите: «Сократить время подготовки отчёта на 30% по сравнению с текущим ручным процессом.»
  2. Дождитесь сохранения: поле имеет отметку «подтверждено», рейтинг становится 100 / 100, уровень — «Приоритетная». Появляется уведомление о повышении уровня.
  3. Нажмите «Опубликовать». Из мастера откроется /business/tasks/:id. Нажмите «Обновить позицию в каталоге», чтобы увидеть конкретное место среди опубликованных задач.
  4. Откройте /catalog: новая задача присутствует, имеет 100 баллов и выделение приоритетного уровня. В /business/tasks она отображается со статусом «Опубликована».

3. Отклики и баллы команд

  1. Переключитесь в режим «Команда», выберите профиль. На /teams запомните его текущие баллы.
  2. Откройте созданную задачу в каталоге и отправьте отклик: идея — «Проанализируем повторные покупки»; план — «Проверим CSV, рассчитаем показатели, соберём дашборд»; срок — «3 недели»; ссылка — https://example.com/prototype.
  3. Выберите другую команду и отправьте второй отклик.
  4. Вернитесь в режим бизнеса и откройте задачу через «Мои задачи». Примите один отклик и отклоните другой.
  5. У принятого отклика нажмите «Подтвердить этап». На /teams у этой команды должно стать на 50 баллов больше. Повторное начисление за тот же отклик недоступно.

4. Проверка правил и работы без ключей

  • На существующей задаче очистите подтверждённое поле «Данные и материалы»: галочка исчезает, рейтинг уменьшается на баллы этого блока. Верните текст — баллы восстановятся после сохранения.
  • В каталоге выберите уровень «Черновик · требует уточнения»: опубликованные задачи остаются открыты для отклика.
  • Переключите команду: рекомендации, если есть совпадения, показываются отдельно с объяснением; общий каталог остаётся доступным.
  • Чтобы проверить локальный режим при ранее подключённых провайдерах, очистите оба API-ключа в локальных настройках и перезапустите сервер. Анализ и сборка должны завершаться через local.
  • Выполните npm test. Тесты покрывают формулу и границы уровней, подтверждение/очистку полей, хранилище, рекомендации, проверку цитат, переключение провайдеров и HTTP-обработчики. Внешние вызовы заменяются тестовыми ответами; ключи и рабочая база не нужны.

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

  • Это демонстрационное приложение без регистрации, паролей и проверки прав доступа. Cookie выбирает роль интерфейса, но не защищает данные или API от действий другого посетителя.
  • Интерфейс требует подтвердить все непустые поля до публикации; endpoint публикации самостоятельно проверяет только наличие названия. Флаги подтверждения поступают от клиента, поэтому отдельного серверного доказательства человеческого подтверждения нет.
  • Хранилище рассчитано на один Node.js-процесс с доступной для записи постоянной файловой системой. Межпроцессных блокировок и распределённой БД нет; несколько экземпляров приложения не координируют записи.
  • Формула использует длины, регулярные выражения и словари. Она не оценивает реализуемость задачи, реальное наличие материалов или достоверность метрик.
  • Проверка цитат не гарантирует правильный смысл извлечённого фрагмента. Локальное извлечение и определение языка работают по правилам и могут пропускать сведения; поля можно исправить вручную.
  • Качество и доступность внешних ответов зависят от выбранной модели, её поддержки структурированного вывода, сети и лимитов провайдера. Смена провайдера может увеличить ожидание.
  • Рекомендации используют точные совпадения строк, без семантического поиска. Новые задачи создаются с пустым tags; редактора тегов и автоматической разметки нет, поэтому для них сопоставление идёт по отрасли.
  • Нет создания/редактирования профилей команд в интерфейсе, чата, отправки уведомлений, загрузки файлов и интеграций с CRM. Доступные команды берутся из демо-базы.
  • На отклик предусмотрено одно подтверждение этапа с фиксированной наградой +50; системы нескольких этапов, проверки результата и отката награды нет.
  • История рейтинга показывается списком изменений на странице задачи; отдельного графика нет. Полный журнал попыток ИИ доступен в локальном файле, а не на отдельной странице администрирования.
  • Входные тексты и сырые ответы сохраняются в журнале без автоматической очистки или шифрования. Для демонстрации используйте синтетические сведения.

Команда

Show Image

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

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

saimonsetish 20ddigreen 12

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

  • 2026-09-23 17:57Add team photoddigreen
  • 2026-09-23 17:45Add next-step guidance and saved progress feedbacksaimonsetish
  • 2026-09-23 17:43Document business gamification and score historyddigreen
  • 2026-09-23 17:38Fix layout jumps while editing tasksaimonsetish
  • 2026-09-23 17:34Add catalog position previews and animated readiness celebrationssaimonsetish
  • 2026-09-23 17:31Add quick start instructions to READMEddigreen
  • 2026-09-23 17:26Clarify demo models, local launch and contributor nameddigreen
  • 2026-09-23 17:23Show readiness milestones and business score historysaimonsetish
Все коммиты (32)
  • 2026-09-23 17:22Document TaskReady features, scoring, AI and jury demo in Russianddigreen
  • 2026-09-23 17:06Merge remote-tracking branch 'origin/main'saimonsetish
  • 2026-09-23 17:05Improve main actions and role switchingsaimonsetish
  • 2026-09-23 17:03Simplify card confirmation and show preview ratingsddigreen
  • 2026-09-23 16:54Redesign homepage and navigation in mint stylesaimonsetish
  • 2026-09-23 16:31Use server scores and redirect after publicationsaimonsetish
  • 2026-09-23 16:30Use server scores and redirect after publicationsaimonsetish
  • 2026-09-23 16:27Show business task list and update application brandingddigreen
  • 2026-09-23 16:24Connect business wizard and editor to task APIssaimonsetish
  • 2026-09-23 16:13Merge origin/main business interface updatessaimonsetish
  • 2026-09-23 16:11Merge origin/main and resolve README documentationsaimonsetish
  • 2026-09-23 16:10Connect business task actions and team rankings to APIddigreen
  • 2026-09-23 16:07Document scoring, catalog rules and demo scenariossaimonsetish
  • 2026-09-23 16:02Implement task and proposal mutation endpointsddigreen
  • 2026-09-23 15:54Merge origin/mainsaimonsetish
  • 2026-09-23 15:48Use OpenAI Responses API with low reasoning effortddigreen
  • 2026-09-23 15:37Build business and task catalogsaimonsetish
  • 2026-09-23 15:01Implement TaskReady scaffold, scoring, storage and AI pipelineddigreen
  • 2026-09-23 14:40Добавила фильтры и сортировку каталогаsaimonsetish
  • 2026-09-23 14:31Create package-lock.jsonsaimonsetish
  • 2026-09-23 14:30Update README.mdDiasbek
  • 2026-09-23 14:22feat: add task catalog and team proposalssaimonsetish
  • 2026-09-23 14:20feat: add business task intake and readiness scoresaimonsetish
  • 2026-09-23 14:20chore: add AI Sana web app foundationsaimonsetish
Структура репозитория (96 файлов)
.env.example
.gitignore
AGENTS.md
README.md
app/api/ai/analyze/route.ts
app/api/ai/build-card/route.ts
app/api/proposals/[id]/route.ts
app/api/tasks/[id]/proposals/route.ts
app/api/tasks/[id]/publish/route.ts
app/api/tasks/[id]/route.ts
app/api/tasks/route.ts
app/api/teams/route.ts
app/business/new/page.tsx
app/business/tasks/[id]/page.tsx
app/business/tasks/page.tsx
app/catalog/[id]/page.tsx
app/catalog/page.tsx
app/globals.css
app/layout.tsx
app/not-found.tsx
app/page.tsx
app/teams/page.tsx
components.json
components/AiDebugPanel.tsx
components/AnimatedScore.tsx
components/BusinessProposals.tsx
components/BusinessTaskWizard.tsx
components/CatalogBrowser.tsx
components/LevelBadge.tsx
components/LevelCelebration.tsx
components/Navigation.tsx
components/PagePlaceholder.tsx
components/ProposalCard.tsx
components/ProposalForm.tsx
components/RoleEntryLink.tsx
components/RoleSwitcher.tsx
components/ScoreBreakdown.tsx
components/ScoreHistory.tsx
components/ScoreMeter.tsx
components/TaskCard.tsx
components/TaskEditor.tsx
components/score-display.test.tsx
components/ui/badge.tsx
components/ui/button.tsx
components/ui/card.tsx
components/ui/input.tsx
components/ui/label.tsx
components/ui/separator.tsx
components/ui/table.tsx
components/ui/textarea.tsx
data/seed.json
docs/team.jpg
eslint.config.mjs
lib/ai/analyze.ts
lib/ai/buildCard.ts
lib/ai/content.test.ts
lib/ai/evidence.test.ts
lib/ai/evidence.ts
lib/ai/local.ts
lib/ai/prompts.ts
lib/ai/provider.test.ts
lib/ai/provider.ts
lib/ai/routes.test.ts
lib/api.ts
lib/business-tasks-page.test.ts
lib/business-ui.test.ts
lib/card-confirmation.test.ts
lib/card-confirmation.ts
lib/catalog.test.ts
lib/catalog.ts
lib/client-api.ts
lib/levels.ts
lib/recommend.ts
lib/role-client.test.ts
lib/role-client.ts
lib/scoring.test.ts
lib/scoring.ts
lib/seed.test.ts
lib/store.test.ts
lib/store.ts
lib/task-client.test.ts
lib/task-client.ts
lib/task-progress.test.ts
lib/task-progress.ts
lib/task-routes.test.ts
lib/types.test.ts
lib/types.ts
lib/utils.ts
next.config.ts
package-lock.json
package.json
postcss.config.mjs
scripts/db.ts
scripts/dev.mjs
tsconfig.json
vitest.config.ts
Ветки (3)

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

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

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