AAYMA
RU
Войти

AI Sana Challenge Hub

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

Доведённый продукт
Команда «TayMas Systems» 20💬 0 комментариевс 22 сентября 2026 г.

О проекте

Команда: TayMas Systems
Кейс HackAlem.ai: Образование — AI Sana
Стадия: Доведённый продукт

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

Суть

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

Как устроено

LLM-обёртка с единым вызовом для OpenAI и NVIDIA возвращает JSON, проверяет его по схеме и повторяет запрос при невалидном ответе, а без ключа переходит на заглушку. Модель задаёт не менее трёх вопросов по показателям с недобором и собирает карточку, не добавляя новых фактов. Рейтинг в app/rating.py детерминирован: 7 показателей, уровни 0, половина или полный вес. Засчитанный балл обновляется только после подтверждения человеком. «Испытание»: виртуальная команда из сида планирует первую неделю по карточке, вердикт о блокерах детерминирован. Рекомендации командам строятся без модели, от 40 баллов.

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

  • JSON schema validation с повтором
  • провайдер-свитч OpenAI/NVIDIA
  • детерминированный рейтинг
  • vision (задача по фото)
  • virtual team trial
  • live catalog feed

Особенности

Хорошо подготовленный процесс команды: шаблоны и регламент дня накануне, Linear MCP, навыки для Codex/Claude (case-start), тикеты HAC-N и снимки PROGRESS по времени. Оригинальная фича «испытание задачи»: виртуальная студенческая команда пробует взять карточку и называет блокеры с ценой в баллах. В репозитории 12 скриншотов сквозного сценария.

Стек

Python · FastAPI · Jinja2 templates · JavaScript · Docker · Docker Compose · pytest · Makefile

Модели

OpenAI · NVIDIA


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

README

README.md

AI Sana Challenge Hub — от бизнес-задачи к решению

Трек 07 «Образование». Кейс: «AI Sana Challenge Hub: от бизнес-задачи к решению» (владелец задачи — МНВО, AI Sana). Команда TayMas Systems, хакатон HackAlem AI, 23.09.2026.

Быстрая проверка: docker compose up → http://localhost:8000 → раздел «Тестовые сценарии». Без ключа API весь сквозной путь работает на локальной заглушке; с ключом OpenAI в .env включаются функции модели.

Краткое описание

Бизнес описывает задачу для студентов слишком коротко, и командам непонятно, за что браться. Приложение помогает представителю бизнеса превратить черновик в полноценную карточку задачи: ИИ задаёт уточняющие вопросы, система считает прозрачный рейтинг готовности от 0 до 100 по шкале кейса и публикует карточку в открытом каталоге. Студенческие команды сами выбирают задачи и откликаются, а бизнес вручную решает, с кем работать. Чем полнее описана задача, тем выше её рейтинг и позиция в каталоге — это и есть геймификация для бизнеса.

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

  • Рейтинг готовности задачи: 0–100 по семи показателям кейса, расшифровка каждого начисления, список недостающих сведений, четыре уровня готовности. Детерминированный, без языковой модели
  • Обёртка над LLM: один вызов для OpenAI и NVIDIA, JSON-ответ с проверкой по схеме, повтор при невалидном ответе, работа без ключа
  • Уточняющие вопросы и сборка карточки: модель определяет пробелы по показателям рейтинга и задаёт не менее трёх вопросов, а затем собирает из черновика и ответов карточку, не добавляя фактов, которых не сообщил пользователь. Без ключа API обе функции работают на локальной заглушке
  • Каталог задач: все опубликованные задачи, сортировка по подтверждённому рейтингу, фильтры по отрасли и уровню готовности, выделение приоритетных задач и пометка «требует уточнения» у черновиков
  • Страница задачи: все поля карточки, расшифровка рейтинга по показателям, блок «Подходящие команды» по профилям из каталога (с уровня «Рабочая», подсказка, а не назначение), отклики команд без ограничения числа и ручное решение бизнеса по каждому отклику
  • Рекомендации командам: в каталоге команда выбирает себя и видит до трёх подходящих задач с объяснением совпадения по интересам, технологиям и отрасли. Только задачи с баллом от 40 — уровень «Рабочая», с которого кейс разрешает рекомендовать; каталог ниже остаётся полным. Детерминированно, без модели
  • Испытание задачи: до публикации карточку «пробует взять» виртуальная студенческая команда из сида — план первой недели только по карточке, «Стоп» на первом блокере, цена каждого блокера в баллах и следующий шаг. Вердикт детерминирован, тексты пишет модель, без ключа — заглушка. Баллов не начисляет
  • Сравнение откликов: отклики колонками с фактами (срок, прототип, шаги плана, технологии из профиля) и разбором модели по тексту — сильное, вопросы команде, риски. Без ранжирования и рекомендаций, выбор за бизнесом; без ключа только факты
  • Задача из текста и фото: цель бизнеса + снимок → значимые наблюдения, предлагаемая постановка и уточняющие вопросы; перенос только после проверки человеком. Только с ключом OpenAI
  • Живой каталог: каталог и главная обновляются без перезагрузки — строки переставляются по рейтингу, приходит уведомление о новой задаче или росте позиции, на главной лента последних событий; catalog.json и feed.json только читают хранилище
  • Помощники на модели: AI-навигатор студента подбирает до трёх задач от 40 баллов с дословной цитатой из карточки и планом старта; AI-тренер бизнеса в редакторе раскладывает семь показателей в задания и маршрут к следующему уровню; наставник отклика разбирает отклик команды и сверяет его с карточкой. Общий каталог и ручной выбор бизнеса не меняются; без ключа — честный режим без выдумок
  • Оформление: три переключаемых цветотипа, редактор с кольцом рейтинга и «наклейками» по семи показателям, которые открываются по мере заполнения
  • Хранилище с синтетическими данными кейса (5 черновиков, 5 карточек, 5 команд, 5 откликов), /health для проверки состояния
  • Запуск одной командой через Docker и запасной путь без Docker

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

Сквозной сценарий кейса, восемь шагов; в MVP реализованы шаги 1–7 (шаг 8 «баллы команде за прогресс» кейсом не требуется — «полный проектный трекер не нужен»):

  1. Черновик. Представитель бизнеса вводит короткое описание потребности и выбирает отрасль.
  2. Уточнение. Система определяет, каких сведений не хватает для рейтинга, и задаёт не менее трёх уточняющих вопросов, привязанных к тексту черновика.
  3. Карточка. Из черновика и ответов собирается редактируемая карточка с десятью полями: название, контекст, потребность, пользователи, данные, ограничения, ожидаемый результат, критерии успеха, контакт, формат взаимодействия.
  4. Рейтинг. По семи показателям кейса начисляются баллы; панель показывает, сколько начислено за каждый и что дописать. После каждого сохранения балл пересчитывается.
  5. Каталог. После ручного подтверждения карточка публикуется. Каталог сортирует задачи по рейтингу и фильтрует по отрасли и уровню готовности; низкий рейтинг задачу не скрывает, а помечает.
  6. Выбор студентов. Любая команда открывает задачу и отправляет отклик: идея, план, срок, ссылка на прототип. Число откликов не ограничено.
  7. Выбор бизнеса. Бизнес видит список откликов и вручную выбирает или отклоняет каждый. Автоматического назначения нет.

Сверх кейса между шагами 4 и 5 бизнес может запустить испытание задачи: виртуальная команда планирует первую неделю только по карточке и называет блокеры с ценой в баллах (раздел «AI-функции»). А команда на шаге 6 может выбрать себя в каталоге и увидеть рекомендованные задачи с объяснением.

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

Рейтинг считается детерминированно, без языковой модели: правила видны в app/rating.py и покрыты тестами tests/test_rating.py. Веса — из раздела 4 кейса.

У каждого показателя три уровня начисления: 0, половина веса или полный вес. Половина — поле заполнено осмысленным текстом. Полный вес — в тексте есть конкретика, которую требует кейс. Поле считается заполненным, если после обрезки пробелов его длина не меньше порога и текст не является отговоркой («нет», «не знаю», «уточняется», «n/a» и подобными): иначе любая непустая строка засчитывалась бы как ответ.

ПоказательВесПоловина весаПолный вес
Контекст и потребность20описан контекст (10)описана и потребность (ещё 10)
Данные и материалы20данные описаныуказан формат, объём или пример: CSV, Excel, PDF, API, число записей
Ожидаемый результат15результат описанназван конкретный артефакт: прототип, сервис, отчёт, дашборд, бот, интерфейс
Критерии успеха15критерии описаныесть измеримый признак: число, процент, «не менее», «снизить», «время», «точность»
Ограничения10ограничения описаныназван срок, технология, доступ или бюджет
Пользователи10пользователи описаныназваны роли или количество
Связь с бизнесом10есть контакт: почта, телефон или имя (5)описан формат консультаций и обратной связи (ещё 5)

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

Подтверждение. Кейс: «Баллы начисляются только за заполненные и подтверждённые поля». Поэтому балл, записанный у задачи и влияющий на её позицию в каталоге, обновляется только при подтверждении человеком. После обычного редактирования показывается предварительный балл, а подтверждённый остаётся прежним, пока представитель бизнеса не нажмёт подтверждение. Так же обрабатываются правки уже опубликованной задачи.

Примеры начисления. «Есть какие-то данные по продажам» — 10 из 20, потому что нет формата и объёма. «Выгрузка 50 000 заявок за 18 месяцев в CSV» — 20 из 20. «Сделать удобно и быстро» — 8 из 15, нет измеримого признака. «Доля ручных проверок падает с 40% до 20%» — 15 из 15.

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

  • В каталоге видны все опубликованные задачи, всем командам, без регистрации.
  • Порядок — по убыванию рейтинга; при равном балле выше более свежая публикация.
  • Фильтры: отрасль и уровень готовности. Фильтры сужают показ, но не скрывают задачи навсегда.
  • Низкий рейтинг не запрещает отклик и не прячет задачу — он показывает командам, насколько реально начать работу без дополнительных уточнений.
  • Рейтинг пересчитывается после каждого подтверждённого редактирования, и позиция в каталоге меняется вместе с ним.
  • У каждой неполной задачи прямо в списке подсказка «Не хватает: …» — самый весомый недобор рейтинга, чтобы команда видела, чего не хватает, не открывая карточку.
  • Команда может выбрать себя в блоке «Я команда» и получить до трёх рекомендованных задач с объяснением совпадения; рекомендуются только задачи с баллом от 40. Каталог ниже остаётся полным и в том же порядке.
  • Знак «прошла испытание» у задачи означает, что её подтверждённую версию виртуальная команда смогла спланировать без блокеров (раздел «AI-функции»). На позицию знак не влияет.

AI-функции

Кейс требует минимум одну содержательную AI-функцию и просит показать промпт, формат входа, формат выхода и обработку некорректного ответа. Ниже всё это по каждой из трёх функций.

Генерация уточняющих вопросов

Что делает. По черновику бизнеса система считает рейтинг, находит показатели с недобором и просит модель задать вопросы именно по ним. Вопрос закрывает ровно одно поле карточки, поэтому ответ сразу попадает в нужное место.

Вход модели — черновик, отрасль и список показателей с недобором, отсортированный по величине пробела (app/prompts.py, build_questions_user_prompt):

Отрасль: Образование
Черновик задачи от бизнеса:
Хотим чат-бота для студентов, чтобы отвечал на вопросы.

Показатели рейтинга с недобором (более важные — выше):
- Данные и материалы: начислено 0 из 20 баллов
- Критерии успеха: начислено 0 из 15 баллов
- Ожидаемый результат: начислено 0 из 15 баллов

Системный промпт (app/prompts.py, константа QUESTIONS_SYSTEM, приводится дословно):

Ты помогаешь представителю бизнеса дополнить черновик задачи для студенческой команды.
Правила:
- Задай от 3 до 6 уточняющих вопросов, каждый закрывает ровно одно поле карточки.
  Поле — строго одно из: title, context, need, users, data, constraints,
  expected_result, success_criteria, contact, interaction_format.
- Вопрос должен опираться на конкретные детали черновика, а не быть общим шаблоном.
- Никогда не предлагай готовых вариантов ответа и не добавляй фактов, которых нет
  в черновике или в списке пробелов ниже.
- Не спрашивай про персональные данные конкретных людей (студентов, сотрудников).
- Пиши только на русском языке.

Выход модели — JSON по схеме QuestionsResponse, проверяется через pydantic:

{"questions": [{"field": "data", "question": "...", "why": "Данные и материалы — 20 баллов"}]}

Обработка некорректного ответа. Три рубежа, каждый ниже предыдущего:

  1. Ответ не по схеме или не JSON — обёртка app/llm.py делает один повторный запрос с текстом ошибки и просьбой прислать исправленный JSON.
  2. Ответ формально валиден, но бессмысленен — проверяется количество вопросов, принадлежность поля списку полей карточки, непустые тексты и отсутствие дублей по полю. Не прошло — результат отбрасывается.
  3. Модель недоступна, ключа нет или проверки не пройдены — включается локальная заглушка: вопросы собираются по тем же показателям с недобором из заранее заготовленных формулировок.

Во всех трёх случаях пользователь получает рабочие вопросы, а приложение не падает. Текущий режим виден в подвале страницы и в ответе /health: openai, nvidia или stub.

Сборка карточки из ответов

Что делает. Черновик и ответы на уточняющие вопросы раскладываются по десяти полям карточки. Это вторая содержательная AI-функция: кейс требует минимум одну, у нас обе рекомендованные — и анализ полноты с вопросами, и преобразование ответов в карточку.

Вход модели — черновик, отрасль и пары «вопрос — ответ» (app/prompts.py, build_card_user_prompt):

Отрасль: Образование
Черновик задачи от бизнеса:
Хотим чат-бота для студентов, чтобы отвечал на вопросы.

Ответы на уточняющие вопросы:
- [data] Какие данные, примеры или источники вы можете передать команде?
  Есть FAQ на 120 вопросов в Google Docs, расписание на семестр в Excel,
  лог обращений за год — около 3 000 сообщений.

Системный промпт (app/prompts.py, константа CARD_SYSTEM, приводится дословно):

Ты собираешь карточку задачи для студенческой команды из черновика бизнеса и его ответов на уточняющие вопросы.
Правила:
- Используй только сведения, явно указанные в черновике и в ответах. Ничего не додумывай.
- Если для поля во входе нет информации, оставь его пустой строкой "".
- Не придумывай сроки, объёмы, контакты, названия и другие факты, которых не назвал пользователь.
- Поле title — не длиннее 80 символов, отражает суть задачи.
- Пиши только на русском языке.
- Ответ строго JSON с ключами: title, context, need, users, data, constraints, expected_result, success_criteria, contact, interaction_format.

Выход модели — JSON с десятью полями карточки, проверяется через pydantic по схеме CardFields.

Защита от выдуманных фактов. Главное требование кейса к этой функции. После ответа модели каждое непустое поле проверяется на «укоренённость»: длинные слова из него ищутся по корням в исходном тексте — черновике и ответах. Поле, в котором слишком много слов не из источника, отбрасывается и заменяется значением заглушки, то есть тем, что человек написал сам. Поэтому модель физически не может дописать в карточку цифру, срок или название, которых не было.

Проверено на реальном вызове: из черновика про чат-бота и одного ответа про данные модель заполнила три поля, остальные семь оставила пустыми — ровно так и должно быть.

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

Испытание задачи: виртуальная команда

Что делает. Сверх требований кейса. До публикации бизнес может «дать» карточку одной из студенческих команд сида: команда, зная только текст карточки, планирует первую неделю и останавливается там, где сведений нет. Результат: вердикт «выдержала / не выдержала», план с шагом «Стоп», блокеры с ценой в баллах и следующий шаг вида «заполните „Данные и материалы“ (+20) — балл станет 55, уровень „Рабочая“». Это ответ на вопрос «можно ли по этой карточке начать в понедельник», а не оценка: баллы за испытание не начисляются, рейтинг по-прежнему только за подтверждённые поля.

Что решает правило, а что модель. Вердикт и состав блокеров — детерминированное правило поверх рейтинга (app/trial.py, BLOCKING_KEYS): старт блокируют недоборы по показателям «Контекст и потребность», «Данные и материалы», «Ожидаемый результат», «Пользователи»; недоборы по «Критериям успеха», «Ограничениям» и «Связи с бизнесом» — риски, начать можно. Поэтому карточка на 60 баллов без данных испытание не выдержит, а на 55 с данными — выдержит: испытание и рейтинг измеряют разное. Модель пишет только тексты — план первой недели и формулировки причин.

Вход модели (app/trial.py, build_trial_user_prompt) — профиль команды, карточка целиком и списки блокеров и рисков с тем, чего не хватает. Реальный пример для слабой карточки и команды DataBee из сида:

Команда DataBee. Интересы: образование, рекомендательные системы, чат-боты. Навыки: анализ данных, бэкенд, интерфейсы. Технологии: Python, FastAPI, PostgreSQL, React.

Карточка задачи (отрасль: Образование):
- Название: Подбор наставников для первокурсников
- Контекст: что происходит сейчас: В первый семестр около трети первокурсников не находят наставника, кураторы распределяют вручную по спискам групп.
- Потребность: что нужно изменить: Нужен сервис, который предлагает куратору трёх подходящих наставников на каждого первокурсника.
- Пользователи: для кого решение: Кураторы факультетов и первокурсники.
- Данные и материалы: — не заполнено
- Ограничения: сроки, технологии, доступы: — не заполнено
- Ожидаемый результат: — не заполнено
- Критерии успеха: — не заполнено
- Контакт: — не заполнено
- Формат взаимодействия и обратной связи: — не заполнено

Блокеры — сведения, без которых начать нельзя:
- key=data — Данные и материалы: Нет данных, примеров или источников: команде не с чем начать разбор в первую неделю. Что добавить: Опишите доступные данные: формат, объём и пример.
- key=expected_result — Ожидаемый результат: Не описан результат работы: команда не поймёт, что именно сдавать. Что добавить: Опишите ожидаемый результат: что именно должно получиться.

Риски — начать можно, но работа может уйти не туда:
- key=success_criteria — Критерии успеха: Нет измеримых критериев: команда не поймёт, когда задача решена, а бизнес — принимать ли результат. Что добавить: Опишите критерии успеха: как поймёте, что решение сработало.
- key=constraints — Ограничения: Не указаны сроки, технологии и доступы: команда может выбрать стек или срок, которые бизнесу не подойдут. Что добавить: Укажите ограничения: сроки, технологии или доступы.
- key=business_link — Связь с бизнесом: Нет контакта или формата связи: вопросы команды останутся без ответа. Что добавить: Укажите контакт (почта или телефон), формат консультаций и порядок обратной связи.

Системный промпт (app/trial.py, константа TRIAL_SYSTEM, приводится дословно):

Ты — студенческая команда, которая получила карточку бизнес-задачи и пробует взять её в работу.
Правила:
- Опирайся ТОЛЬКО на карточку. Не добавляй фактов, чисел, названий, сроков и контактов, которых в ней нет.
- Составь план первой недели из 3–5 коротких шагов, по одному предложению. Где уместно, цитируй карточку в «кавычках».
- Если в списке есть блокеры, последний шаг плана — «Стоп: …» с blocked=true: дальше планировать нельзя. Если блокеров нет, у всех шагов blocked=false.
- Для каждого блокера и риска из списка напиши одной фразой, почему без этих сведений нельзя начать или что пойдёт не так, ссылаясь на то, чего именно нет в карточке. Ключи (key) бери из списка, новых не добавляй.
- Не оценивай бизнес и не предлагай готовых значений для пустых полей.
- Пиши только на русском языке.

Выход модели — JSON по схеме TrialLLMResponse: steps (3–5 шагов, у каждого text и blocked) и blockers (key из списка выше и reason):

{"steps": [
   {"text": "Разобрать, почему «около трети первокурсников не находят наставника»", "blocked": false},
   {"text": "Описать сценарий куратора: «трёх подходящих наставников на каждого первокурсника»", "blocked": false},
   {"text": "Стоп: в карточке нет ни анкет наставников, ни списков групп", "blocked": true}],
 "blockers": [{"key": "data", "reason": "Нет ни выгрузки, ни примера анкеты — начать разбор не с чего"}]}

Защита от выдуманных фактов. Все числа в ответе модели должны быть в карточке или в профиле команды (номера дней и шагов 1–7 фактами не считаются); ответ с посторонним числом отбрасывается целиком, ключи блокеров вне списка игнорируются, план короче трёх или длиннее пяти шагов — отбраковка. Во всех этих случаях, как и при сетевой ошибке или невалидном JSON, включается заглушка: тот же вердикт и те же блокеры, план из цитат карточки. Причина отката видна в подвале страницы и в /health (ai_fallback). Проверяется в tests/test_trial.py.

Где видно. Кнопка «Проверить глазами команды» в редакторе и страница /business/cards/{id}/trial. Знак «прошла испытание» в каталоге и на странице задачи показывается, только пока подтверждённая версия карточки совпадает с испытанной: правка после испытания снимает знак, а страница испытания предупреждает, что результат устарел.

Задача из текста и фото

HAC-58: сначала бизнес пишет, что хочет улучшить (10–4000 символов), затем прикладывает фото, скриншот или изображение из буфера. Кнопка «Собрать задачу из текста и фото» передаёт оба источника модели. Она выделяет цель, выбирает только значимые детали снимка и предлагает постановку задачи для студенческой команды. Например, запрос о потерях материалов и снимок стройки могут привести к предложению прототипа учёта расположения материалов, а не к описи всех предметов на площадке.

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

Черновик переносится в основное поле только по кнопке «Использовать этот черновик». Изменённый во время запроса исходный текст не перезаписывается. Файл, ответ и черновик не записываются в хранилище этим маршрутом; дальнейшие вопросы, редактирование, сохранение и подтверждение идут по обычному сценарию.

Код и контракт: describe_photo(data, industry="", context="") -> PhotoResult в app/vision.py, маршрут POST /business/photo в app/web_vision.py. Multipart-поля: photo, industry, обязательный context. JPEG/PNG/WebP/GIF до 5 МБ, тип определяется по сигнатуре. Схема PhotoDescription: intent, seen, problem, proposal, draft, unclear, questions (до трёх). Ответ: {ok, mode, message, context, description, draft}. В черновик не добавляется дублирующий блок «На фото». Длина предлагаемого черновика ограничена 1500 символами. SYSTEM_PROMPT отделяет наблюдения от гипотез и запрещает придумывать факты; LLM вызывается через app/llm.py, синхронный вызов вынесен из event loop в thread pool.

Интерфейс: photo.js/css, _photo_attach.html. Отдельные шаги «Ваша цель → Фото → Предложение», сканирующая анимация, источники, таймер реального ожидания и индикатор без фиктивных процентов. Статус не является внутренними рассуждениями модели и не помечает серверные стадии выполненными по таймеру. Навигатор, тренер и наставник отклика также показывают панель AI-запроса. prefers-reduced-motion отключает анимации.

Пустой/неподходящий файл или контекст — 422 JSON до вызова модели. Без ключа OpenAI, при текстовом NVIDIA-провайдере, сбое или неверной схеме — честное сообщение 503; визуальной заглушки нет. Транспортные подробности в ответ не выводятся. Без JavaScript постановка из фото недоступна, обычная текстовая форма продолжает работать.

Сравнение откликов без ранжирования

Надстройка после закрытия обязательной части (HAC-59), шаг 7 кейса: «Бизнес сравнивает предложения и сам выбирает». Со страницы задачи ссылка «Сравнить отклики рядом» ведёт на /tasks/{id}/compare: отклики стоят колонками, по каждому — факты и разбор. Решение «принять / отклонить» остаётся на странице задачи, вручную и по каждому отклику отдельно.

Факты считаются детерминированно и показываются всегда: срок указан или нет, есть ли ссылка на прототип, сколько шагов в плане (предложения и пункты списка, нумерация шагом не считается), объём идеи и плана в словах, какие технологии из профиля команды названы в самом отклике. Без ключа API страница показывает только их и говорит об этом прямо.

Разбор моделью — по каждому отклику только по его тексту и карточке: 1–3 сильные стороны, 2–3 вопроса команде, которые помогут бизнесу решить, 0–2 риска, видных в тексте. Модель не ранжирует, не называет лучший отклик и не рекомендует, кого выбрать — это правило промпта и проверка после ответа.

Где в коде. app/compare.py (compare_proposals, proposal_facts, SYSTEM_PROMPT, схемы ProposalReview и CompareLLMResponse), маршрут — app/web_compare.py, страница — app/templates/compare.html, тесты — tests/test_compare.py.

Промпт — SYSTEM_PROMPT: писать только по тексту отклика и карточки; не додумывать опыт команды и прототип по ссылке; не ранжировать и не рекомендовать; по каждому отклику сильные стороны, вопросы, риски; числа только из отклика или карточки; коротко, proposal_id копировать из входа.

Формат входа. Одно сообщение: карточка задачи (название, потребность, ожидаемый результат, критерии успеха, ограничения, данные) и все отклики блоками: proposal_id, команда, идея, план, срок, есть ли ссылка.

Формат выхода. Строгая схема CompareLLMResponse{reviews: [ProposalReview]}, где ProposalReview{proposal_id, strengths[], questions[], risks[]}.

Обработка некорректного ответа. Построчно: строка с формулировкой выбора («лучший», «рекомендую», «стоит выбрать», «победитель»…) отбрасывается; строка с числом, которого нет ни в отклике, ни в карточке, отбрасывается (та же проверка, что в испытании задачи); proposal_id, которого нет среди откликов, и повторы отбрасываются; строки режутся до 160 символов и до 3/3/2. Сбой модели или ответ не по схеме — страница остаётся с фактами и причиной в подписи; compare_proposals не бросает исключений. Ничего не сохраняется.

Живой прогон на карточке из сида с двумя откликами (gpt-4.1-mini): по отклику с планом из одного предложения модель отметила риск «план без проверки результата по критериям успеха», по обоим — вопросы про данные и измерение эффекта; ни одной формулировки выбора.

Границы ИИ, заданные кейсом

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

Живой каталог и игровые моменты

GET /catalog.json?industry=&level= возвращает опубликованные карточки в порядке рейтинга с глобальными позициями, числом откликов и результатом испытания. Каталог проверяет изменения каждые 2,5 секунды: обновляет строки, плавно переставляет их и показывает уведомление о новой задаче или росте позиции. Активные фильтры сохраняются. GET /feed.json собирает 10 последних событий публикации, откликов и решений бизнеса из существующих временных отметок; главная обновляет ленту раз в 5 секунд.

В редакторе переход через границы 40/70/90 отмечается баннером. Прогноз позиции использует сохранённый предварительный балл и фактическое правило каталога: при равенстве выше более свежая публикация; повторное подтверждение не меняет её дату. Это прогноз, баллы засчитываются только после подтверждения бизнесом. Анимации учитывают prefers-reduced-motion, скрытые вкладки не опрашивают сервер. Без JavaScript основной серверный сценарий полностью работает; лента и автоматические обновления отключены. Новые зависимости, записи в хранилище и внешние сервисы не нужны.

AI-навигатор студента и наставник отклика

Вход: «AI-навигатор» на главной/в каталоге, прямая ссылка /assistants/student. Студент описывает навыки и интересы, при желании выбирает профиль команды и уточняет запрос в диалоге (последние пять запросов). Помощник читает опубликованные карточки от 40 баллов, подбирает до трёх вариантов и показывает проверенную дословную цитату из каждой карточки. Названия, ссылки и баллы берутся из хранилища, а не генерируются. Общий каталог и его порядок не меняются.

Можно отметить до трёх задач для сравнения доступных данных, ограничений, ожидаемого результата и критериев успеха. «План старта» раскрывает четыре предлагаемых этапа с фактами из карточки. Студент пишет свою идею и редактирует план; AI-наставник отклика задаёт до трёх вопросов для самопроверки относительно задачи. Проверка заполненности не является оценкой качества решения или вероятности принятия. Кнопка переноса открывает обычную форму отклика: ещё одним нажатием заполняются только пустые поля, команда и отправка остаются за студентом. Бизнес решает вручную.

AI-тренер бизнеса и предпросмотр

Вход: «AI-тренер задачи» в редакторе, /business/cards/{id}/coach. Сервер разбирает семь показателей в задания: что уточнить, какие поля дополнить, какой максимальный прирост возможен. Отдельно выделяется короткий маршрут к следующей цели 40/70/90/100. Модель помогает выбрать фокус и задаёт уточняющий вопрос по карточке.

«Проверь правку» позволяет последовательно изменить несколько полей в песочнице: настоящая compute_rating показывает балл до/после, уровень и прогноз позиции. Это не сохранение. Проверенные тексты можно перенести в редактор через sessionStorage, затем явно применить к полям. Если поле успели изменить в редакторе или другой сессии, его новая версия не затирается. Сохранение и подтверждение выполняются обычными кнопками. Рейтинг не повышается за обращение к помощнику, число сообщений или прохождение проверки.

Контракт и честный режим работы помощников

МаршрутРезультат
GET/POST /assistants/studentHTML-диалог, работает и без JavaScript
POST /assistants/student.jsonmessage, history (≤5), team_id → рекомендации, цитаты, режим, шаги проверки
GET /assistants/compare.json?ids=...&ids=...Сравнение 1–3 опубликованных карточек
GET /assistants/tasks/{id}/plan.jsonПлан-шаблон старта, факты карточки, заготовка отклика
POST /assistants/tasks/{id}/review.jsonidea, plan → вопросы AI-наставника для самопроверки
GET/POST /business/cards/{id}/coachHTML-тренер и уточняющий вопрос
POST /business/cards/{id}/coach.jsonmessage → задания, прирост, маршрут, вопрос, режим
POST /business/cards/{id}/preview.jsonfields → настоящий предварительный рейтинг без записи
POST /business/cards/{id}/coach/previewПроверка одного поля HTML-формой без JavaScript
GET /business/cards/{id}/position.json?score=70Позиция по правилам Store, включая дату публикации и равные ключи

Промпты STUDENT_PROMPT, COACH_PROMPT, REVIEW_PROMPT и схемы ответов находятся в app/assistants.py; SDK вызывается только через существующий app/llm.py. Подбор получает запрос, историю, профессиональные интересы/навыки и максимум 40 карточек; контакт бизнеса отдельным полем в модель не передаётся. Выход модели — ID карточки, поле и цитата. Все ID и цитаты проверяются против переданного каталога, повторные цитаты одной карточки объединяются. Невалидный ответ целиком заменяется локальным поиском по словам. Модель не получает права менять каталог или хранилище.

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

Без JavaScript работают страницы, поиск с уточнениями, тренер и проверка одного поля. Сравнение, наставник отклика в плане и перенос нескольких правок требуют JavaScript. История диалога не хранится на сервере; перенос текста живёт только в текущей вкладке. Как и основной MVP, помощники не добавляют авторизацию и промышленное ограничение частоты запросов. Это демонстрационная реализация, не готовая публичная AI-платформа.

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

  1. Открыть /assistants/student, ввести «интересует образование», получить ссылки и цитаты; уточнить запрос. Отметить задачи, сравнить, раскрыть план, написать идею, проверить с наставником и перенести черновик в форму. До ручной отправки отклика нет.
  2. Открыть тренера у слабой карточки. В «Проверь правку» добавить реальные данные, увидеть прирост, перенести в редактор и применить. До сохранения карточка не изменена, до подтверждения балл каталога не изменён.
  3. Во второй вкладке открыть каталог; подтвердить улучшение и увидеть новое положение и уведомление. На главной появляются события публикаций и откликов.
  4. python -m pytest -q tests/test_live.py tests/test_assistants.py проверяет схемы, неизвестные ID, точность цитат, сбои модели, HTML-экранирование, порог рекомендаций, отсутствие записи в предпросмотре и ревью, а также прогноз при равном рейтинге.

Технологии

КомпонентЧто используетсяЗачем
ЯзыкPython 3.12Основной опыт команды, быстрый старт
ВебFastAPI 0.141, Jinja2 3.1, UvicornСерверный HTML без JS-сборки: один процесс, один порт
Модели данныхpydantic 2.13, pydantic-settingsВалидация форм, сериализация хранилища, настройки из .env
ХранилищеJSON-файл data/store.jsonОбъём данных кейса — один файл; сброс к исходному состоянию одной командой
LLMOpenAI SDK 3.19; провайдер OpenAI или NVIDIA (OpenAI-совместимый эндпоинт)Уточняющие вопросы и сборка карточки; переключение провайдера через .env
Тестыpytest 9, httpxПроверка основного сценария
ЗапускDocker, docker compose, MakefileВоспроизводимость в чистом окружении

Разработка велась с использованием AI-агентов — Claude Code и Codex, — как предписано инструкцией для участников и разрешено п. 6.9 Положения. Результаты, выданные агентами, участники проверяли сами: тестами, запуском и чтением кода. Рабочие инструкции для агентов лежат в репозитории: CLAUDE.md и AGENTS.md, процедуры дня — в .claude/skills/case-start и .agents/skills/case-start.

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

Подробно, со схемой: docs/architecture.md.

Коротко: браузер отправляет обычные HTML-формы в FastAPI (app/main.py). Маршруты зовут три модуля: app/ai.py (вопросы и карточка; внутри app/llm.py — единственная точка вызова модели, без ключа — заглушка), app/rating.py (детерминированный рейтинг) и app/store.py (JSON-хранилище четырёх сущностей). Модели и словари — в app/models.py.

Карта кода

Что за что отвечает — чтобы читать репозиторий без пояснений.

ФайлОтвечает за
app/__main__.pyЗапуск сервера: python -m app
app/main.pyПриложение FastAPI, конструктор задачи и редактор карточки, подключение роутеров, обработчики ошибок в HTML
app/config.pyНастройки из переменных окружения; единственное место, где читается .env
app/models.pyPydantic-модели: черновик, карточка, рейтинг, команда, отклик, испытание; словари отраслей и уровней
app/store.pyJSON-хранилище data/store.json с сидом из data/seed.json
app/rating.pyДетерминированный рейтинг 0–100 по семи показателям кейса, расшифровка и недостающее
app/llm.pyОбёртка над OpenAI и NVIDIA: JSON по схеме, повтор при невалидном ответе, режим без ключа
app/prompts.pyПромпты и схемы ответов для вопросов и сборки карточки
app/ai.pyУточняющие вопросы и сборка карточки; заглушка без ключа; защита от выдуманных фактов
app/recommend.pyРекомендации задач командам по интересам и технологиям, детерминированно, от 40 баллов
app/web_catalog.pyКаталог с сортировкой и фильтрами, страница задачи, отклики, ручное решение бизнеса
app/web_live.pyJSON-срезы для живого каталога и ленты событий
app/trial.py, app/web_trial.pyИспытание задачи виртуальной командой и его страница
app/assistants.py, app/web_assistants.pyAI-навигатор студента, тренер бизнеса, наставник отклика
app/vision.py, app/web_vision.pyПостановка задачи по тексту и фото
app/compare.py, app/web_compare.pyСравнение откликов без ранжирования
app/templates/, app/static/Шаблоны Jinja2, стили и скрипты; данные и рейтинг считает сервер
data/seed.jsonСинтетические данные кейса, читаются при первом запуске
ТестыЧто проверяют
tests/test_e2e.pyГейт демо-пути: все переходы раздела 11 кейса за один проход, make gate
tests/test_rating.pyФормула рейтинга, уровни, расшифровка
tests/test_ai.py, tests/test_llm.pyВопросы и карточка, заглушка, защита от выдуманных фактов; обёртка модели, путь с реальным ключом при его наличии
tests/test_store.py, tests/test_seed.pyХранилище и целостность сида
tests/test_web.py, tests/test_web_catalog.pyКонструктор, редактор и валидация; каталог, страница задачи, отклики, решение
tests/test_smoke.pyСквозной смоук страниц
tests/test_recommend.py, tests/test_trial.py, tests/test_live.pyРекомендации, испытание, живой каталог
tests/test_assistants.py, tests/test_vision.py, tests/test_compare.pyПомощники, фото, сравнение откликов

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

Системные требования

  • Docker с docker compose — основной путь; либо Python 3.12+ — запасной. Проверено на Python 3.12 в образе и на Python 3.14 в локальном окружении
  • Ключ OpenAI API — необязателен: без него приложение работает в режиме локальной заглушки ИИ, и основной сценарий проходит целиком

Переменные окружения

ПеременнаяОбязательнаНазначение
LLM_PROVIDERнет, по умолчанию openaiopenai или nvidia
OPENAI_API_KEYнетКлюч OpenAI. Пусто — режим заглушки
OPENAI_BASE_URL, OPENAI_MODELнетЭндпоинт и модель, по умолчанию gpt-4.1-mini
NVIDIA_API_KEY, NVIDIA_BASE_URL, NVIDIA_MODELнетРезервный провайдер
APP_HOST, APP_PORTнетПо умолчанию 0.0.0.0:8000
DATA_PATH, SEED_PATHнетФайл состояния и исходные данные

Пример заполнения — в .env.example. Реальные ключи в репозитории отсутствуют.

Основной путь: Docker

cp .env.example .env      # при желании вписать OPENAI_API_KEY
make run                  # = docker compose up --build

После запуска открыть http://localhost:8000.

Проверка состояния — curl localhost:8000/health:

{
  "status": "ok",
  "ai_mode": "stub",
  "ai_fallback": null,
  "cards_total": 40, "cards_published": 40,
  "teams": 20, "proposals": 73, "drafts": 40,
  "store": "data/store.json",
  "version": "dev"
}

ai_mode — какой провайдер в работе: openai, nvidia или stub (без ключа). ai_fallback не пуст, если ключ есть, но конкретный вызов модели не прошёл и сработала заглушка — режим виден честно, а не выглядит так, будто модель отработала штатно.

Сброс данных к исходным: make reset (удаляет data/store.json, при следующем старте он создаётся из data/seed.json).

Запасной путь: без Docker

python -m venv .venv && source .venv/bin/activate   # Windows: .venv\Scripts\activate
pip install -r requirements.txt
cp .env.example .env
python -m app

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

Четыре сценария: первый — обязательная демонстрация из раздела 11 кейса, остальные закрывают требования, которые в демонстрацию не попадают. Каждый проверен руками и покрыт автотестом.

Сценарий 1 — обязательная демонстрация: слабый черновик → рост рейтинга → публикация → отклик → решение

Полный прогон с готовыми текстами и ожидаемыми баллами — data/demo-scenario.md. Коротко: ввести черновик «Хотим чат-бота для студентов, чтобы отвечал на вопросы», ответить только на первый из шести уточняющих вопросов — про данные и материалы, — получить карточку с рейтингом 30 («Черновик»), дописать в редакторе оставшиеся поля и увидеть 100 («Приоритетная»), подтвердить и опубликовать, найти задачу первой в каталоге, отправить отклик от студенческой команды и вручную принять его. Числа сверены прогоном по коду, а не обещаны.

Автоматически: make gate — tests/test_e2e.py проходит все девять переходов за один запуск и проверяет в хранилище, что балл записывается только после подтверждения человеком.

Сценарий 2 — правка опубликованной задачи и пересчёт

Открыть любую задачу из каталога → «Редактировать карточку» → изменить или дописать поле → «Сохранить». Ожидаемо: предварительный балл пересчитан и показан рядом с подтверждённым, подтверждённый и позиция в каталоге не изменились. Затем «Подтверждаю» → балл, уровень и позиция обновились. Так выполняется требование «рейтинг пересчитывается после каждого подтверждённого дополнения».

Сценарий 3 — несколько откликов и ручной выбор бизнеса

На странице задачи отправить два отклика от разных команд → у бизнеса принять первый. Ожидаемо: первый «выбрана», второй по-прежнему «на рассмотрении» — решение по одному отклику не трогает остальные. Принять второй → оба «выбрана». Третий отклик отклонить → первые два не изменились. Повторное решение по уже решённому отклику не перезаписывается, выводится сообщение.

Автоматически: tests/test_web_catalog.py.

Сценарий 4 — некорректный ввод

ВводОжидаемо
Пустой или пробельный черновиксообщение на той же странице, черновик не создан
Отклик без идеи или планасообщение, введённое сохранено, отклик не создан
Отклик с неизвестной командойсообщение
Ссылка на прототип не http(s)://сообщение, отклик не создан
Значения фильтров каталога не из справочниковфильтр игнорируется, каталог полный, код 200
Несуществующий id задачи или отклика404

Запасные примеры черновиков разной полноты — data/examples.md.

Если приложение уже запускали раньше, состояние лежит в data/store.json и сид повторно не читается. Чтобы пройти сценарии с чистыми исходными данными кейса — make reset перед запуском.

Сценарий 5 — испытание задачи виртуальной командой

Открыть редактор слабой карточки (например, сразу после ответов на вопросы) → «Проверить глазами команды» → выбрать команду → отправить. Ожидаемо: «Не выдержала», план первой недели с шагом «Стоп», блокеры с ценой (за данные +20), следующий шаг с целевым баллом и уровнем. Заполнить названное поле, сохранить → на странице испытания предупреждение «результат устарел» → повторить: блокер исчез. Для карточки сида «Рекомендации курсов для студентов колледжа» (100 баллов): «Выдержала», блокеров нет, в каталоге у задачи знак «прошла испытание». Баллы карточки от испытания не меняются.

Автоматически: tests/test_trial.py.

Сценарий 6 — задача из текста и фото (нужен ключ OpenAI)

  1. На /business/new описать проблему, например: «На стройке теряем материалы, хотим упростить их учёт и поиск». Приложить соответствующий снимок.
  2. Нажать «Собрать задачу из текста и фото». Увидеть источники и статус AI-обработки.
  3. Проверить исходный запрос, значимые детали фото, предлагаемую постановку и вопросы. В основном поле пока остаётся исходный текст.
  4. Поправить предложение и нажать «Использовать этот черновик». Только теперь поле заменяется; дальше — обычные уточняющие вопросы и карточка.
  5. Если изменить исходный текст во время анализа, перенос не должен его затереть. Без контекста кнопка анализа недоступна; API возвращает 422. Без ключа — честное сообщение о недоступности, исходный текст остаётся в форме.

Сценарий 7 — сравнение откликов без ранжирования

  1. Открыть в каталоге задачу с откликами из сида (например, «Рекомендации курсов для студентов колледжа») и под заголовком «Отклики команд» нажать «Сравнить отклики рядом».
  2. Ожидание: колонки по числу откликов, в каждой факты (срок, прототип, шаги плана, слова, технологии из профиля команды), с ключом — «Сильное в тексте», «Спросить команду», «Риск по тексту». Ни «лучшего», ни рекомендации кого выбрать нет нигде на странице.
  3. Без ключа: те же колонки только с фактами и подпись «Разбор моделью недоступен».
  4. Вернуться по ссылке к задаче и принять или отклонить отклик вручную — сценарий 3.

Автоматическая проверка

make gate       # сквозной сценарий кейса, tests/test_e2e.py
make check      # все тесты внутри контейнера
make test       # то же без Docker, из активированного .venv
make verify     # сборка образа без кеша + тесты — проверка воспроизводимости

Демонстрация

Сценарий на 5 минут по разделу 11 кейса: слабое описание → дополнение → рост рейтинга → публикация → отклик команды → решение бизнеса. Полные тексты ответов — data/demo-scenario.md.

Перед показом: make reset && make run — состояние возвращается к исходным данным кейса.

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

ШагВремяЧто показываемЧто говорим
10:00–0:20Главная → «Я представитель бизнеса»Два входа: бизнес размещает задачу, команда ищет её в каталоге
20:20–0:50Форма черновика: «Хотим чат-бота для студентов, чтобы отвечал на вопросы»Так задачу описывает реальный бизнес — одной строкой, и командам непонятно, за что браться
30:50–1:20Шесть уточняющих вопросовПервый вопрос цитирует черновик и приводит примеры для отрасли «Образование», четвёртый помечен «описано частично» — система видит, что контекст в черновике уже есть. У каждого вопроса вес показателя: видно, что дороже. И всё это без ключа API, на локальной заглушке
41:20–2:10Редактор, 30 «Черновик»Отвечаем только на один вопрос — про данные. Карточка собрана только из сказанного, пустые поля остались пустыми. Справа видно, за что начислено: контекст 10 из 20, данные 20 из 20, остальное по нулю, и что дописать
52:10–3:00Дозаполнили, 100 «Приоритетная»Балл вырос с 30 до 100. Главное правило кейса: баллы засчитываются только за подтверждённые поля — до подтверждения балл предварительный и в каталог не уходит
63:00–3:30Каталог: задача перваяРейтинг определяет позицию. Задача с 20 баллами тоже видна — с пометкой «требует уточнения»: низкий рейтинг не скрывает задачу и не запрещает отклик
73:30–4:00Страница задачиКоманда видит карточку целиком, расшифровку рейтинга и позицию «1 из 6»
84:00–4:30Два отклика на рассмотренииОткликнуться может любая команда, число откликов не ограничено
94:30–5:00Решение бизнесаБизнес выбирает вручную: одну, несколько или ни одной. Решение по одному отклику не трогает остальные. Система исполнителей не назначает
10сверх 5 минутИспытание слабой карточкиВиртуальная команда DataBee планирует первую неделю только по карточке на 35 баллов: два блокера с ценой, «Стоп» пятым шагом, следующий шаг «заполните данные (+20) — 55, „Рабочая“». На снимке реальный ответ модели; без ключа тот же вердикт и блокеры даёт заглушка
11сверх 5 минутИспытание полной карточкиКарточка на 100: «Выдержала», план из четырёх шагов с цитатами карточки, блокеров нет. Баллы от испытания не меняются
12сверх 5 минутКаталог со знакомУ задачи знак «прошла испытание»; порядок каталога по-прежнему задаёт только рейтинг. Каталог живой: перестраивается без F5, когда в другой вкладке подтверждают карточку

Шаги 10–12 — сверх пяти минут кейса: показать, если жюри спрашивает про геймификацию глубже рейтинга.

Все переходы работают в приложении, а не на слайдах. Проверить одной командой: make gate.

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

  • Исходные данные — синтетические, созданы командой по разделу 6 кейса: data/seed.json содержит 40 черновиков, 40 опубликованных карточек, 20 профилей команд и 73 отклика. По 5 задач в каждой из 8 отраслей. Организации, люди и контакты вымышленные (example.kz, example.org). Описанные CSV, фотографии и PDF — условия учебных кейсов; реальные файлы таких наборов не поставляются.
  • Карточки в сиде заполнены по-разному намеренно — от 20 до 100 баллов, все четыре уровня готовности. Часть полей пуста для проверки уточнений и коуча; баллы вычислены существующей формулой и проверяются tests/test_seed.py. Первые пять карточек и исходный демо-путь сохранены.
  • Учебная активность — 58 ожидающих, 9 принятых и 6 отклонённых откликов с разными подходами и сроками. Это подготовленные примеры ручного выбора бизнеса, а не реальные пользователи или решения ИИ. Результаты испытаний не подставлены: испытание карточки нужно действительно запустить. Запросы и сценарии проверки расширенного каталога.
  • LLM — OpenAI API (модель по умолчанию gpt-4.1-mini), опционально NVIDIA Build как OpenAI-совместимый резерв. Персональные данные участников в модель не передаются.
  • Других внешних сервисов и баз данных нет.

Ограничения

Честный список того, чего в проекте нет и почему. Там, где это наше решение, а не требование кейса, указано основание.

Сознательно не делали — кейс прямо разрешает

  • Шаг 8 сценария «Результат» — баллы команде за фактический прогресс. Раздел 7 кейса: «полный проектный трекер — для демонстрации достаточно отклика и решения бизнеса по нему». Сквозной сценарий закрыт шагами 1–7.
  • Регистрация, восстановление пароля, ролевая модель. Роль «бизнес» или «команда» — это раздел на странице, а не учётная запись. Раздел 7 кейса.
  • Чат, уведомления, календарь, файловое хранилище. Раздел 7 кейса.
  • Своя ML-модель и векторная база. Раздел 7 кейса; используется внешний API либо локальная детерминированная заглушка.
  • Мобильная адаптация. Раздел 7 кейса. Вёрстка переживает узкий экран, но специально под телефон не проектировалась.

Ограничения реализации

  • Без ключа API работает локальная заглушка. Вопросы подбираются детерминированно по пробелам рейтинга, карточка собирается из ответов без переформулировки. Сквозной сценарий проходит целиком, но формулировки вопросов с реальной моделью богаче. Режим виден в подвале страницы и в /health.
  • Черновик из фото работает только с ключом OpenAI. Локальной заглушки для изображений нет: без ключа функция честно отказывает, остальной путь от неё не зависит. Модель описывает только наблюдения отдельно от предложенной задачи; неизвестные масштаб, сроки и данные уточняет у автора.
  • Сравнение откликов считает шаги плана по предложениям и пунктам. Это грубая мера объёма, а не качества; разбор модели ограничен текстом отклика и не заглядывает в прототип по ссылке.
  • Рейтинг пересчитывается после сохранения, а не вживую в браузере по мере ввода. Требование кейса «пересчёт после редактирования» выполнено; живой пересчёт — вопрос удобства, не функции.
  • JSON-хранилище, один процесс. Демонстрационный набор — 40 задач, 20 команд и 73 отклика; файл проще и прозрачнее базы. Для нескольких одновременных пользователей понадобится СУБД: запись сериализована блокировкой внутри процесса, но несколько процессов один файл безопасно не поделят.
  • Состояние переживает перезапуск в data/store.json, и сид повторно не читается. Чтобы вернуть исходные данные кейса — make reset.
  • NVIDIA как резервный провайдер описан и реализован через ту же обёртку, но в соревновательное окно не проверялся. Критический путь — только OpenAI.
  • Каталог без пагинации и поиска. При 5–50 задачах не нужны; сортировка и два фильтра есть.

Что дальше

Куда развивается решение, если работа продолжится.

  • Шаг 8 кейса целиком: подтверждение этапов работы командой и бизнесом, баллы за фактический прогресс, история этапов — превращает каталог задач в трекер сотрудничества.
  • История испытаний и рекомендаций. Хранить все испытания карточки, показывать, как менялся план по мере заполнения, и считать совпадение команды с задачей в процентах с учётом навыков
  • Живой пересчёт рейтинга в браузере по мере ввода — бизнес сразу видит цену каждого абзаца.
  • Роли и организации: несколько представителей одной компании, несколько задач у одной организации, права на редактирование.
  • СУБД вместо файла и фоновая очередь для вызовов модели — когда задач станет сотни.
  • Экспорт карточки в PDF и ссылку для внешнего согласования, уведомления об откликах, история изменений карточки с диффом по полям.

Развёрнутая версия

Нет. Запуск из репозитория по инструкции выше.

Ранее созданные материалы

Создано до начала соревновательной части (23.09.2026, до 13:00):

  • Шаблоны инфраструктуры из prep/templates/ — Dockerfile, docker-compose, Makefile, пример переменных окружения, стартовый requirements.txt, каркасы BRIEF.md и этого README. Доменной логики не содержат; в корень репозитория развёрнуты после публикации кейса.
  • prep/SETUP.md, prep/ACTIVATION.md — чеклисты настройки машин участников.
  • CLAUDE.md, HACKALEM-CONTEXT.md, PROGRESS.md, скилл .claude/skills/case-start — рабочая документация и процедура дня команды. AGENTS.md и .agents/ написаны уже в соревновательное окно.

Сторонние библиотеки: перечислены в requirements.txt, все с открытыми лицензиями.

Модели и внешние сервисы: перечислены в разделе «Данные и интеграции».

Весь доменный код (app/, data/, tests/, scripts/), скриншоты в docs/screenshots/ и все разделы этого README, кроме структуры заголовков, созданы в соревновательное окно 23.09.2026. По расписанию организатора оно объявлено как 13:00–18:00; фактически на площадке объявлено 13:30–18:30, история коммитов соответствует фактическому окну.

Команда

TayMas Systems

  • Azamat Yessimkhanuly — капитан, обвязка: данные, хранилище, тесты, README, подача
  • Дарья — ядро: рейтинг, обёртка LLM, AI-функции
  • Анель Алибек — поверхность: веб-интерфейс
Звёзды
⭐ 0
Форки
0
Язык
Python
Последний push
в прошлом месяце
Коммиты
146
Авторы
3
Файлы
106
Ветки
3

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

AzamatYessimkhanily 88Anel 40Darya 18

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

  • 2026-09-23 17:46[HAC-45] README: снять пометки «в работе», добавить быструю проверку для эксперта и пункты про живой каталог и помощников в «Что реализовано»AzamatYessimkhanily
  • 2026-09-23 17:43[HAC-48] README: карта кода по модулям и тестам; PROGRESS: финальная проверка — 290 тестов, секреты чистые, смоук без 5xx, Docker без кешаAzamatYessimkhanily
  • 2026-09-23 17:41[HAC-60] Наполнить каталог 40 задачами и учебными откликамиAzamatYessimkhanily
  • 2026-09-23 17:36[HAC-55] Каталог: кнопки и списки в фильтрах одной высотыAnel
  • 2026-09-23 17:35[PROGRESS] Дарья: независимая проверка Docker и venv, найден медленный тест-багDarya
  • 2026-09-23 17:26[HAC-55] Ещё 4 студенческие команды в стартовых данных (согласовано с капитаном)Anel
  • 2026-09-23 17:24[HAC-59] README: вернуть разделы, снятые ошибочным коммитом b04c21f; добавить сравнение откликов, сценарий 7, ограничение; PROGRESS: строка и инцидентAzamatYessimkhanily
  • 2026-09-23 17:22[HAC-55] Подходящие команды: тёмные карточки с пояснением «почему подходит»Anel
Все коммиты (146)
  • 2026-09-23 17:22[HAC-59] Сравнение откликов без ранжирования: факты по каждому отклику и разбор модели по тексту, выбор остаётся за бизнесомAzamatYessimkhanily
  • 2026-09-23 17:21Merge remote-tracking branch 'origin/main'AzamatYessimkhanily
  • 2026-09-23 17:21[HAC-58] Постановка задачи по тексту и фото с подтверждением и видимыми этапами AIAzamatYessimkhanily
  • 2026-09-23 17:19[HAC-55] Страница задачи: рейтинг плитками, итог плашкой, подсказки и пустые состоянияAnel
  • 2026-09-23 17:15[HAC-55] Уголок программы AI-Sana на главной: факты МНВО и место Challenge Hub в пути программыAnel
  • 2026-09-23 17:10[HAC-55] Блок ценности для AI Sana на главной, компактные фильтры каталогаAnel
  • 2026-09-23 17:07[HAC-55] Каталог: сетка карточек вместо длинных строкAnel
  • 2026-09-23 17:04[HAC-57] AI-навигатор студента, тренер бизнеса и наставник отклика с проверкой фактовAzamatYessimkhanily
  • 2026-09-23 17:04[HAC-58] README: черновик из фото — промпт, форматы входа и выхода, обработка сбоев, сценарий 6, ограничение; PROGRESS: надстройка и инцидент автостэшаAzamatYessimkhanily
  • 2026-09-23 17:02[HAC-55] Страница задачи: карточка в две колонки, действия отдельными кнопкамиAnel
  • 2026-09-23 16:58[HAC-58] Черновик из фото: модель описывает только видимое, текст ложится в поле черновикаAzamatYessimkhanily
  • 2026-09-23 16:57[HAC-55] Отступ у полосы статистики и сетка показателей 4+3 в редактореAnel
  • 2026-09-23 16:57Merge branch 'main' of https://github.com/BAITC-Hacks/hack-4a84a5e5-taymas-systemsAnel
  • 2026-09-23 16:57[HAC-55] Главная: короче тексты, заголовки разделов и воздух между блокамиAnel
  • 2026-09-23 16:56[ядро] Главная: заметная статистика каталога — 4 плитки в стиле дизайн-системыDarya
  • 2026-09-23 16:52[HAC-48] PROGRESS: снимок надстроек на 16:55 — испытание закрыто, живой каталог влит, assistants вне тикетаAzamatYessimkhanily
  • 2026-09-23 16:52[HAC-56] Подходящие команды на странице задачи и подсказка команды на странице испытанияAzamatYessimkhanily
  • 2026-09-23 16:52[HAC-56] README: подходящие команды на странице задачиAzamatYessimkhanily
  • 2026-09-23 16:50Merge branch 'main' of https://github.com/BAITC-Hacks/hack-4a84a5e5-taymas-systemsAnel
  • 2026-09-23 16:50[HAC-55] Сворачиваемые пояснения, окно «Как считается рейтинг» и тур «Как это работает»Anel
  • 2026-09-23 16:49[HAC-24] Чеклист приёмки: блок надстроек — испытание, рекомендации, живой каталогAzamatYessimkhanily
  • 2026-09-23 16:48[HAC-45] README: правила каталога — подсказка «Не хватает», рекомендации командам, знак испытанияAzamatYessimkhanily
  • 2026-09-23 16:46[HAC-56] Скриншоты испытания для README и Demo Day, шаги 10–12 в демонстрации, шаг 7 в демо-сценарииAzamatYessimkhanily
  • 2026-09-23 16:44[ядро] Каталог: подсказка «Не хватает» в списке задач по next_best_actionDarya
  • 2026-09-23 16:42Merge branch 'main' of https://github.com/BAITC-Hacks/hack-4a84a5e5-taymas-systemsAnel
  • 2026-09-23 16:42[HAC-55] Выпадающие списки в каталоге и отклике больше не перекрашиваются в кнопкиAnel
  • 2026-09-23 16:42[HAC-55] ИИ-агент в интерфейсе: консоль с примером запуска, экран работы агента, вопросы по одному, поздравление с новым уровнемAnel
  • 2026-09-23 16:42[HAC-56] README: испытание задачи с промптом и форматами, рекомендации и оформление в «Что реализовано», сценарий 5AzamatYessimkhanily
  • 2026-09-23 16:40[HAC-57] Живой каталог, лента событий и прогноз позиции с анимацией ростаAzamatYessimkhanily
  • 2026-09-23 16:40[HAC-56] BRIEF и PROGRESS: контракт испытания и живого каталога, рекомендации закрыты, правило общего рабочего каталогаAzamatYessimkhanily
  • 2026-09-23 16:38[HAC-56] Испытание задачи: виртуальная команда планирует первую неделю по карточке, блокеры с ценой, знак в каталогеAzamatYessimkhanily
  • 2026-09-23 16:37[HAC-55] Переключатель цветотипа показывает новые цвета палитрAnel
  • 2026-09-23 16:36Merge branch 'anelalibek69/hac-55-redizain-veba-tri-cvetotipa-animirovannii-redaktor-obshchii'Anel
  • 2026-09-23 16:36[HAC-55] Выпадающие списки в стиле сайта вместо системныхAnel
  • 2026-09-23 16:36[HAC-55] Строже и взрослее: шрифты Onest и IBM Plex Mono, спокойные палитрыAnel
  • 2026-09-23 16:31Merge branch 'dreaminginadream108/small-core-features-rating-recommend'Darya
  • 2026-09-23 16:31[ядро] Небольшие доработки: сводка рейтинга и прозрачнее объяснение рекомендацийDarya
  • 2026-09-23 16:29[HAC-56] Скелет надстроек: модель Trial, роутеры испытания и живого каталога, /catalog.json, подключение live.jsAzamatYessimkhanily
  • 2026-09-23 16:26[HAC-55] Каталог и страница задачи под три цветотипаAnel
  • 2026-09-23 16:26[HAC-55] Редактор: кольцо рейтинга, маскот, наклейки-достижения и заданияAnel
  • 2026-09-23 16:23[HAC-55] Главная, конструктор и вопросы в новом дизайнеAnel
  • 2026-09-23 16:21[HAC-55] Дизайн-система: три цветотипа, шапка с переключателем, фон и подвалAnel
  • 2026-09-23 16:19Merge branch 'anelalibek69/hac-52-kataloh-blok-podkhodit-komande-veb-chast-rekomendacii'Anel
  • 2026-09-23 16:06[HAC-26] Рекомендации задач командам по интересам и навыкамDarya
  • 2026-09-23 15:54[HAC-52] Каталог: блок «Подходит команде» — веб-часть рекомендацийAnel
  • 2026-09-23 15:51Merge branch 'anelalibek69/hac-50-demo-day-zapis-ekrana-i-zahotovka-otvetov-na-voprosi-zhyuri'Anel
  • 2026-09-23 15:51[HAC-50] Шпаргалка Demo Day: подготовка к выходу, роли, ответы на вопросы жюриAnel
  • 2026-09-23 15:51[HAC-45] Два пропуска по ТЗ: ссылки в откликах сида и промпт сборки карточки в READMEAzamatYessimkhanily
  • 2026-09-23 15:50[HAC-53] Перенос длинных строк без пробелов на всех страницахAnel
  • 2026-09-23 15:42[HAC-48] PROGRESS: фаза 3 закрыта полностью, инцидент с ключом, фаза 4 нарезанаAzamatYessimkhanily
  • 2026-09-23 15:41[HAC-19] Граница app/ai.py: непредвиденная ошибка SDK не уходит наружуAzamatYessimkhanily
  • 2026-09-23 15:34[HAC-24] BRIEF: контракт приведён к коду — маршрут страницы вопросов и расширенный /healthAzamatYessimkhanily
  • 2026-09-23 15:31[HAC-24] Чеклист ручной приёмки перед заморозкойAzamatYessimkhanily
  • 2026-09-23 15:29[HAC-32] Тесты HAC-33 тоже не мокали llm_available — тот же баг воспроизводимостиDarya
  • 2026-09-23 15:24[HAC-18] README: пример ответа /health, уточнение про AGENTS.md и фактическое окноAzamatYessimkhanily
  • 2026-09-23 15:24Merge branch 'dreaminginadream108/hac-32-prohon-s-realnim-klyuchom-openai-edinstvennii-skipped-test'Darya
  • 2026-09-23 15:24[HAC-32] Тесты заглушки не должны зависеть от наличия ключа в окруженииDarya
  • 2026-09-23 15:22[HAC-18] PROGRESS: фаза 3 закрыта кроме HAC-32, снимок на 15:45AzamatYessimkhanily
  • 2026-09-23 15:22[HAC-33] Заглушка вопросов: цитата из черновика, отраслевые примеры, пометка частичного покрытияAzamatYessimkhanily
  • 2026-09-23 15:18[HAC-18] PROGRESS: снимок на 15:30 — лейн капитана и лейн поверхности закрытыAzamatYessimkhanily
  • 2026-09-23 15:17[HAC-42] README: раздел «Демонстрация» — тайминг на 5 минут и девять скриншотовAzamatYessimkhanily
  • 2026-09-23 15:16[HAC-23] Скриншоты: латинские имена файлов вместо кириллическихAzamatYessimkhanily
  • 2026-09-23 15:16[HAC-23] Скриншоты девяти шагов демо-сценария для README и Demo DayAzamatYessimkhanily
  • 2026-09-23 15:16[HAC-36] Подвал: честный индикатор резервного режима ИИ после сбоя вызоваAnel
  • 2026-09-23 15:13[HAC-18] PROGRESS: снимок на 15:20, таблица известных проблем заполненаAzamatYessimkhanily
  • 2026-09-23 15:12[HAC-41] README: разделы «Ограничения» и «Что дальше»AzamatYessimkhanily
  • 2026-09-23 15:12[HAC-40] README: сценарий 1 приведён к фактическим числам прогонаAzamatYessimkhanily
  • 2026-09-23 15:11[HAC-40] Демо-сценарий: сверен дословным прогоном, исправлена таблица ответовAzamatYessimkhanily
  • 2026-09-23 15:07[HAC-39] Позиция «N из M» на странице задачи и число откликов в каталогеAzamatYessimkhanily
  • 2026-09-23 15:02[HAC-43] .dockerignore: data/store.json — локальное состояние не попадает в образAzamatYessimkhanily
  • 2026-09-23 15:02[HAC-37] Тест согласованности сида: баллы равны формуле, ссылки откликов валидны, все уровни представленыAzamatYessimkhanily
  • 2026-09-23 15:02[HAC-38] Тесты безопасности вывода: экранирование пользовательского текста, noopener, отсутствие |safeAzamatYessimkhanily
  • 2026-09-23 15:02[HAC-35] /health для эксперта: резервный режим ИИ, счётчики, путь хранилища, версияAnel
  • 2026-09-23 15:01[HAC-34] Редактор: подсказки в полях из шкалы ТЗ и вес показателя у каждого поляAnel
  • 2026-09-23 14:59[HAC-18] PROGRESS: полная нарезка фазы 3 — 12 новых тикетов, порядок и зависимостиAzamatYessimkhanily
  • 2026-09-23 14:56[HAC-21] Полировка демо-пути: крупный рост рейтинга, заметные недостающие сведенияAnel
  • 2026-09-23 14:53Merge branch 'dreaminginadream108/hac-19-ustoichivost-ii-taimaut-nevalidnii-otvet-pustoi-i-musornii'Darya
  • 2026-09-23 14:53[HAC-19] Устойчивость ИИ: мусорный ввод, сбой LLM, честный last_fallback_reasonDarya
  • 2026-09-23 14:53Merge branch 'anelalibek69/hac-20-validaciya-form-i-ponyatnie-oshibki-na-vsekh-stranicakh'Anel
  • 2026-09-23 14:53[HAC-20] Валидация форм и понятные ошибки: лимиты длины, отрасль, 404/500 в HTMLAnel
  • 2026-09-23 14:53[HAC-18] PROGRESS: поправлены метки времени стыка — были сняты с UTC Linear без +5AzamatYessimkhanily
  • 2026-09-23 14:51[HAC-18] README: раздел «Тестовые сценарии» — четыре сценария с ожидаемым результатомAzamatYessimkhanily
  • 2026-09-23 14:51[HAC-31] Валидация отклика: ссылка только http(s), идея и план не длиннее 2000 символовAzamatYessimkhanily
  • 2026-09-23 14:50[HAC-30] Русский интерфейс конструктора: убраны английские подписиAnel
  • 2026-09-23 14:49[HAC-18] PROGRESS: стык фаз 2→3 по полному ТЗ, фаза 3 началась в 15:05AzamatYessimkhanily
  • 2026-09-23 14:46[HAC-18] BRIEF: требования кейса переписаны по полному тексту ТЗ, рубрика раздела 9AzamatYessimkhanily
  • 2026-09-23 14:40[HAC-16] PROGRESS: фаза 2 закрыта — гейт зелёный, контрольная проверка пройденаAzamatYessimkhanily
  • 2026-09-23 14:38Merge branch 'main' into yessimkhanuly/hac-16-smokeAzamatYessimkhanily
  • 2026-09-23 14:38[HAC-18] README: сброс к исходным данным перед прогоном сценарияAzamatYessimkhanily
  • 2026-09-23 14:35[HAC-11] Редактор карточки: панель рейтинга, пересчёт, публикацияAnel
  • 2026-09-23 14:35[HAC-16] make gate — приёмка демо-пути одной командойAzamatYessimkhanily
  • 2026-09-23 14:30[HAC-16] Смоук: пустой черновик — принимаем любой ответ кроме 5xx, плюс проверка что он не сохранилсяAzamatYessimkhanily
  • 2026-09-23 14:30Merge branch 'main' into yessimkhanuly/hac-16-smokeAzamatYessimkhanily
  • 2026-09-23 14:30[HAC-16] PROGRESS: критерий закрытия фазы 2 — зелёный tests/test_e2e.py в mainAzamatYessimkhanily
  • 2026-09-23 14:29[HAC-16] Переименовать смоук в tests/test_e2e.py — имя из тикетаAzamatYessimkhanily
  • 2026-09-23 14:29[HAC-16] Сквозной смоук обязательной демонстрации кейса: черновик → отклик принятAzamatYessimkhanily
  • 2026-09-23 14:28[HAC-10] Implement task constructorAnel
  • 2026-09-23 14:26[HAC-18] README: в «Что реализовано» добавлены каталог, страница задачи и AI-функцииAzamatYessimkhanily
  • 2026-09-23 14:26[HAC-18] PROGRESS: снимок на 14:40 — хвост демо-пути закрыт, перенарезка поверхностиAzamatYessimkhanily
  • 2026-09-23 14:24[HAC-12][HAC-13] Каталог задач и страница задачи с откликами и ручным решением бизнесаAzamatYessimkhanily
  • 2026-09-23 14:19[HAC-9] PROGRESS: ядро (HAC-6/7/8/9) закрыто целиком, снимок на 14:16Darya
  • 2026-09-23 14:16[HAC-9] Сборка карточки из ответов через LLM с защитой от выдуманных фактовDarya
  • 2026-09-23 14:11[HAC-18] PROGRESS: снимок на 14:11 — ядро и обвязка идут с опережением, поверхность не влитаAzamatYessimkhanily
  • 2026-09-23 14:11[HAC-18] README: раздел AI-функций с промптом, форматами входа и выхода, обработкой некорректного ответаAzamatYessimkhanily
  • 2026-09-23 14:10[HAC-29] Инструкции для Codex: AGENTS.md, навык case-start, развод подключения Linear в SETUPAzamatYessimkhanily
  • 2026-09-23 14:07Merge branch 'dreaminginadream108/hac-8-heneraciya-utochnyayushchikh-voprosov-cherez-llm-s-lokalnoi'Darya
  • 2026-09-23 14:07[HAC-8] Уточняющие вопросы по пробелам рейтинга: LLM + заглушкаDarya
  • 2026-09-23 14:07[HAC-22] Проверки воспроизводимости: чистая сборка, запуск без Docker на 3.14, отсутствие секретов; образ почищен от рабочей документацииAzamatYessimkhanily
  • 2026-09-23 14:05[HAC-18] README: формула рейтинга с правилами начисления и примерами, порядок проверки решенияAzamatYessimkhanily
  • 2026-09-23 14:04[HAC-15] Демо-сценарий с точными баллами по настоящей формуле: рост 30 «Черновик» → 100 «Приоритетная»AzamatYessimkhanily
  • 2026-09-23 14:00Merge branch 'HAC-7-rating'Darya
  • 2026-09-23 14:00[HAC-7] Рейтинг готовности: правила по 7 показателям, подсказкиDarya
  • 2026-09-23 13:57[HAC-18] PROGRESS: чистая сборка без кеша прошла, HAC-27/28 закрыты, HAC-10 ждёт слиянияAzamatYessimkhanily
  • 2026-09-23 13:56[HAC-28] Запасные примеры черновиков для живого показа: слабый, средний, подробныйAzamatYessimkhanily
  • 2026-09-23 13:51[HAC-18] PROGRESS: состояние на 13:55 — HAC-6 в main, HAC-7/10 в работе, 14 тестовAzamatYessimkhanily
  • 2026-09-23 13:50[HAC-27] Сид: даты за вчера, чтобы новые записи сортировались позже сидовых; main снова зелёныйAzamatYessimkhanily
  • 2026-09-23 13:50[HAC-27] Тесты хранилища: сид, сортировка каталога, фильтры, решение по отклику, персистентностьAzamatYessimkhanily
  • 2026-09-23 13:50[HAC-18] Уточнения по ревью брифа: семантика подтверждения рейтинга, несколько выбранных команд, запрет персональных данных, окно 13:30–18:30AzamatYessimkhanily
  • 2026-09-23 13:46[HAC-6] Обёртка над LLM с переключением провайдераDarya
  • 2026-09-23 13:41[HAC-18] PROGRESS: время фазы 0 по gitAzamatYessimkhanily
  • 2026-09-23 13:40[HAC-18] PROGRESS: состояние на конец первого получаса фазы 1AzamatYessimkhanily
  • 2026-09-23 13:39[HAC-25][HAC-18] Схема архитектуры и первый проход README: описание, сценарий, правила каталога, запускAzamatYessimkhanily
  • 2026-09-23 13:37[HAC-15] Сид-данные по кейсу: 5 черновиков, 5 карточек, 5 команд, 5 откликов; демо-сценарий; скрипт пересчёта сидаAzamatYessimkhanily
  • 2026-09-23 13:27[HACKAI-0] Фаза 0: бриф по кейсу AI Sana Challenge Hub, каркас FastAPI, модели, хранилище, заглушки ядра, смоук-тестAzamatYessimkhanily
  • 2026-09-23 12:36Инструктаж по активации OpenAI и NVIDIA для участниковAzamatYessimkhanily
  • 2026-09-23 12:15Перезапуск сессии посреди дня, материал для Demo Day, замена на стыкеAzamatYessimkhanily
  • 2026-09-23 12:13git pull — первое действие при взятии задачи, не четвёртоеAzamatYessimkhanily
  • 2026-09-23 12:12Протокол следов: что агент пишет, закончив задачуAzamatYessimkhanily
  • 2026-09-23 11:59Merge branch 'main' of https://github.com/BAITC-Hacks/hack-4a84a5e5-taymas-systemsAnel
  • 2026-09-23 11:59Добавлена пустая строка в README.md для улучшения форматированияAnel
  • 2026-09-23 11:56Каркас брифа — первый артефакт дняAzamatYessimkhanily
  • 2026-09-23 11:35Чеклист настройки машины участникаAzamatYessimkhanily
  • 2026-09-23 11:33Шаблоны проверены на живом проекте, добавлен requirements с реальными версиямиAzamatYessimkhanily
  • 2026-09-23 11:06Linear MCP в .mcp.json, чтобы подключался при клонеAzamatYessimkhanily
  • 2026-09-23 07:29Нарезка работы выводится из кейса, а не задаётся заранееAzamatYessimkhanily
  • 2026-09-23 07:21Ветки по усмотрению исполнителя, без предписаний по gitAzamatYessimkhanily
  • 2026-09-23 01:11Подготовка к соревновательной части: регламент, процедура дня, шаблоныAzamatYessimkhanily
  • 2026-09-22 23:10Added a blank line to README.md for improved formattingAzamatYessimkhanily
Структура репозитория (106 файлов)
.agents/skills/case-start/SKILL.md
.agents/skills/case-start/references/tickets.md
.claude/skills/case-start/SKILL.md
.dockerignore
.env.example
.gitignore
.mcp.json
AGENTS.md
BRIEF.md
CLAUDE.md
Dockerfile
HACKALEM-CONTEXT.md
HackAlem_AI_кейс_по_геймификации_практических_заданий.pdf
Makefile
PROGRESS.md
README.md
app/__init__.py
app/__main__.py
app/ai.py
app/assistants.py
app/compare.py
app/config.py
app/llm.py
app/main.py
app/models.py
app/prompts.py
app/rating.py
app/recommend.py
app/static/app.js
app/static/assistants.css
app/static/assistants.js
app/static/catalog.css
app/static/live.css
app/static/live.js
app/static/photo.css
app/static/photo.js
app/static/style.css
app/store.py
app/templates/_photo_attach.html
app/templates/assistants.html
app/templates/base.html
app/templates/business_card_edit.html
app/templates/business_new.html
app/templates/business_questions.html
app/templates/business_trial.html
app/templates/catalog.html
app/templates/compare.html
app/templates/error.html
app/templates/index.html
app/templates/task.html
app/trial.py
app/vision.py
app/web_assistants.py
app/web_catalog.py
app/web_compare.py
app/web_live.py
app/web_trial.py
app/web_vision.py
data/catalog-demo.md
data/demo-scenario.md
data/examples.md
data/seed.json
docker-compose.yml
docs/acceptance.md
docs/architecture.md
docs/demo-day.md
docs/screenshots/01-home.png
docs/screenshots/02-draft-form.png
docs/screenshots/03-questions.png
docs/screenshots/04-editor-30-draft.png
docs/screenshots/05-editor-100-priority.png
docs/screenshots/06-catalog-first.png
docs/screenshots/07-task-page.png
docs/screenshots/08-proposals-pending.png
docs/screenshots/09-business-decision.png
docs/screenshots/10-trial-failed.png
docs/screenshots/11-trial-passed.png
docs/screenshots/12-catalog-trial-badge.png
prep/ACTIVATION.md
prep/README.md
prep/SETUP.md
prep/templates/BRIEF.md
prep/templates/Dockerfile
prep/templates/Makefile
prep/templates/README-PROJECT.md
prep/templates/docker-compose.yml
prep/templates/dockerignore
prep/templates/env.example
prep/templates/requirements.txt
requirements.txt
scripts/rescore_seed.py
tests/test_ai.py
tests/test_assistants.py
tests/test_compare.py
tests/test_e2e.py
tests/test_live.py
tests/test_llm.py
tests/test_rating.py
tests/test_recommend.py
tests/test_seed.py
tests/test_smoke.py
tests/test_store.py
tests/test_trial.py
tests/test_vision.py
tests/test_web.py
tests/test_web_catalog.py
Ветки (3)

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

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

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