Sana Hub
Challenge Hub: AI задаёт уточняющие вопросы и собирает карточку задачи из цитат ответов бизнеса.
О проекте
Команда: HackAI
Кейс HackAlem.ai: Образование — AI Sana
Стадия: Доведённый продукт
Задача кейса: Challenge Hub: превратить задачу бизнеса в задание для студенческих команд
Суть
Challenge Hub: AI задаёт уточняющие вопросы и собирает карточку задачи из цитат ответов бизнеса. Код считает рейтинг готовности 0–100. Дальше каталог с фильтрами, отклики команд, ручной выбор, приёмка этапов (+10), ТЗ в PDF и рекомендательные письма с QR. Сервис развёрнут на Render.
Как устроено
Бэкенд на FastAPI со статическим фронтендом. gpt-5.5 через Responses API со Structured Outputs возвращает цитаты по полям и минимум 3 вопроса. Проверка R-QUOTE отклоняет недословные и выдуманные цитаты. Рейтинг считает app/rating.py только по полям, которые подтвердил человек; сервер возвращает недостающие поля и число баллов до следующего уровня. Цепочка провайдеров: OpenAI → NVIDIA → помеченный mock. Отдельно есть «Второе мнение NVIDIA». Рекомендации командам подбираются эвристикой по совпадению слов.
Ключевые решения
- Structured Outputs
- R-QUOTE верификация цитат
- рубрика готовности с подтверждением полей
- fallback OpenAI→NVIDIA→mock
- генерация PDF (ТЗ, письма с QR)
- прогноз позиции в каталоге
- лимиты вызовов и логирование метаданных
Особенности
Идею и архитектуру команда выбирала «советом» агентов Claude, Codex и Gemini (раунды, голосование, синтез в coord/council). Модель объясняет и спрашивает, а считает и проверяет код. Первый коммит (10:26, до старта) импортировал заготовку, позже её откатили. Сгенерировано 413 синтетических задач и 417 откликов.
Стек
Python · FastAPI · SQLite · JavaScript · HTML/CSS · Docker · Render · GHCR
Модели
gpt-5.5 · NVIDIA NIM (meta-llama-3.3-70b-instruct, резерв)
Проект создан за 5 часов на финале хакатона HackAlem.ai (23 сентября 2026, Астана). Код — BAITC-Hacks/hack-a2928c88-hackai.
README
README.mdSana Hub — паспорт готовности бизнес-задачи
HackAlem AI · трек 07 «Образование» · кейс AI Sana Challenge Hub
Бизнес описывает задачу в одну строку. Sana Hub задаёт уточняющие вопросы, собирает карточку с цитатами из ответов и считает рейтинг готовности 0–100. Опубликованная задача попадает в общий каталог, студенческие команды сами откликаются, а бизнес вручную выбирает, с кем работать. После проекта участники получают проверяемое рекомендательное письмо с QR-кодом.
Демо: https://sana-hub-0ca1dc1.onrender.com/ · API: /docs · вход не нужен, роли демонстрационные, данные синтетические. Модель — OpenAI gpt-5.5.

Содержание
- Проверка за пять минут
- Соответствие кейсу
- Рейтинг готовности
- Правила каталога
- Как используется AI
- Дополнительно к MVP
- Архитектура
- Запуск
- Тестовые сценарии
- Данные
- Статус проверки и ограничения
Проверка за пять минут
Сценарий повторяет обязательную демонстрацию из п. 11 кейса. Всё происходит в интерфейсе, без слайдов.
| # | Где | Что сделать | Что должно получиться |
|---|---|---|---|
| 1 | «Бизнесу» | Ввести «Нужен чат-бот для нашего магазина, чтобы отвечал клиентам», отрасль «Розничная торговля», нажать «Уточнить задачу» | Не меньше трёх уточняющих вопросов, у каждого указано поле карточки |
| 2 | Вопросы | Ответить на 2–3 вопроса, «Собрать карточку» | Карточка с цитатами-источниками. Рейтинг 0: AI не подтверждает факты сам |
| 3 | Карточка | «Отметить все» → «Подтвердить отмеченные» | Рейтинг растёт. На пустых полях видно, сколько баллов они дадут |
| 4 | Карточка | Заполнить «Данные», подтвердить | +20, уровень меняется, панель пишет, сколько осталось до следующего |
| 5 | Карточка | «Опубликовать» | Карточка открывается в каталоге на своей позиции |
| 6 | «Командам» | Вкладка «Откликнуться»: команда, идея, план, срок, ссылка | Отклик появился во вкладке «Отклики» |
| 7 | «Отклики» | «Выбрать» или «Отклонить» | Решение ручное. Можно выбрать несколько команд или ни одной |
| 8 | «Отклики» | «Подтвердить этап» | +10 баллов прогресса команде, повторно не начисляются |
Подробный сценарий с репликами: docs/DEMO_SCRIPT.md.
Соответствие кейсу
| Требование кейса | Как реализовано |
|---|---|
| Свободный ввод, проверка полноты, ≥ 3 вопроса | Вопросы генерирует AI по недостающим полям; при сбое — явно помеченный mock |
| Редактируемая карточка, ручное подтверждение | Подтверждается точное значение поля. Любая правка снимает подтверждение |
| Все поля карточки из п. 3 | Название, контекст, потребность, пользователи, данные, ограничения, результат, критерии успеха, контакт, формат, обратная связь |
| Рейтинг 0–100, расшифровка, недостающие сведения, пересчёт | Считает код, не модель. Показаны баллы по критериям и «+N» за каждое пустое поле |
| Общий каталог, сортировка по рейтингу, фильтры | Поиск, фильтры по отрасли и уровню, страницы по 20 задач |
| Отклики без ограничения числа | Любая команда, любое число откликов, даже на черновик |
| Ручной выбор бизнеса | Только кнопки бизнеса. Автоматического назначения нет |
| Баллы за подтверждённый этап | +10 один раз на пару «задача — команда», в одной транзакции |
| AI не добавляет фактов | Каждое поле, собранное AI, — дословная цитата из ввода бизнеса. Проверка R-QUOTE отклоняет выдуманные цитаты |
| Рекомендации не ограничивают каталог | Отдельный блок «Подходят команде», общий каталог остаётся виден целиком |
| Синтетические данные, минимум по 5 записей | 413 черновиков и карточек, 10 команд, 417 откликов |
Официальный текст кейса: docs/CASE.md, PDF.
Рейтинг готовности
Формула из п. 4 кейса, реализация — app/rating.py. Баллы дают только поля, подтверждённые человеком.
| Критерий | Баллы | Поля карточки |
|---|---|---|
| Контекст и потребность | 20 | context 10 + need 10 |
| Данные и материалы | 20 | data |
| Ожидаемый результат | 15 | expected_result |
| Критерии успеха | 15 | success_criteria |
| Ограничения | 10 | constraints |
| Пользователи | 10 | users |
| Связь с бизнесом | 10 | contact 4 + interaction_format 3 + feedback_process 3 |
| Уровень | Баллы | В каталоге |
|---|---|---|
| Черновик | 0–39 | виден, помечен «Нужны уточнения», отклики принимаются |
| Рабочая | 40–69 | можно рекомендовать командам |
| Готовая | 70–89 | выше в списке |
| Приоритетная | 90–100 | выделена цветом и штампом |
Правила:
- Подтверждение привязано к точному тексту поля: изменили текст — баллы за поле снимаются до нового подтверждения.
- Название баллов не даёт, но без него карточку нельзя опубликовать.
- Сервер возвращает вместе с рейтингом список недостающих полей с баллами и расстояние до следующего уровня. Экран ничего не считает сам.
- Разделение весов внутри блоков «Контекст и потребность» и «Связь с бизнесом» выбрала команда: в кейсе задан только общий вес блока.
Правила каталога
- В каталоге все опубликованные задачи. Низкий рейтинг не скрывает задачу и не запрещает отклик.
- Порядок: рейтинг по убыванию, при равенстве — раньше опубликованная выше. Порядок задаёт сервер.
- Фильтры: текстовый поиск, отрасль, уровень готовности. У каждого фильтра видно число задач.
- Команды видят опубликованный снимок карточки. Неопубликованные правки бизнеса в каталог не попадают. Отклик сохраняет условия, на которые команда откликнулась.
- Рекомендации — только задачи от 40 баллов, отобранные по совпадению слов профиля команды (интересы, навыки, технологии) с текстом задачи. Основания совпадения показаны. Это эвристика, не AI-подбор. Команды система не ранжирует и не назначает.
- У каждой карточки показано её место в общем каталоге.

Как используется AI
Принцип: модель объясняет и спрашивает, код считает и проверяет.
| Функция | Вход | Выход | Что проверяет код |
|---|---|---|---|
| Уточнение и сборка карточки | Текст черновика и ответы бизнеса | Цитаты по полям + ≥ 3 вопроса (Structured Outputs) | R-QUOTE: источник существует, цитата дословная, одно поле — одна цитата; вопросов ≥ 3 и они разные |
| «Что помешает начать?» | Сохранённые поля карточки | До трёх замечаний: цитата, проблема, вопрос | Цитаты дословные; пустые поля и отложенные ответы находят правила, без AI |
| ТЗ для студентов (необязательно) | Подтверждённые поля карточки | Разделы ТЗ и дополнительные идеи | Идеи не выбираются автоматически; утверждает и публикует бизнес |
| Второе мнение NVIDIA | Те же поля карточки, без ответа первой модели | Независимые замечания, хранятся отдельно | Цитаты дословные; баллы и подтверждения не меняются |
| Перенос ответа в карточку | Вопрос студента и ответ бизнеса | Подходящее поле карточки | Переносится дословный ответ; поле теряет подтверждение, публикует только бизнес |
- Модель: OpenAI
gpt-5.5через Responses API со Structured Outputs,OPENAI_REASONING_EFFORT=low. Официальная документация модели. - Порядок провайдеров при сбое: OpenAI → NVIDIA (резерв, не проверен) → явно помеченный mock, если
FALLBACK_TO_MOCK=1. ЕслиFALLBACK_TO_MOCK=0, пользователь получает ошибку 503, карточка остаётся нетронутой, запрос можно повторить. - Режим видно у каждого результата:
live · openai,live · nvidiaилиmock. В проверке карточки также показана модель. - Второе мнение NVIDIA: отдельная кнопка на экране бизнеса. Получает только поля карточки, сохраняет независимый результат и не меняет баллы/подтверждения. В live без ключа возвращает понятную ошибку; скрытой замены на OpenAI/mock нет. Для обычных AI-функций NVIDIA остаётся резервом. Ключ сейчас отсутствует, реальный NVIDIA-вызов не проверен. NVIDIA API.
- Без AI: рекомендательные письма собираются из версионируемых шаблонных фраз, API отвечает
ai_used: false. Поиск похожих вопросов и рекомендации задач — сравнение слов. - Промпт, схема ответа и R-QUOTE: app/llm.py. Модели и провайдеры: app/ai_config.py.
- Защита от лишних трат: суммарный вход до 30 000 символов, лимит
MAX_CALLS_PER_HOUR, таймаутAI_TIMEOUT_SECONDS. Логиlogs/llm_calls.jsonlсодержат только метаданные, без текста и ключей. - Чего AI не делает: не подтверждает поля, не ставит баллы, не выбирает и не ранжирует команды, не использует персональные признаки.
Дополнительно к MVP
| Функция | Что даёт | Статус |
|---|---|---|
| «Что помешает начать?» | Проверка сохранённой карточки: замечания с цитатой и вопросом, кнопка «Уточнить поле» ведёт к редактору. Правка помечает анализ устаревшим. Рейтинг и подтверждения проверка не меняет | На Render |
| Рост позиции | До трёх вариантов «если дополнить поле X — будет N баллов и место M». Считает сервер по текущему каталогу. Это условный расчёт, не обещание откликов | На Render |
| Приёмка этапа | Бизнес фиксирует условия этапа, команда сдаёт ссылку, бизнес принимает или возвращает на доработку с причиной; +10 один раз | На Render; браузерный сценарий пройден локально |
| Продолжение после F5 | Можно открыть последнюю сохранённую карточку. В браузере хранится только её ID | На Render; браузерный сценарий пройден локально |
| ТЗ для студентов в PDF | Бизнес включает, генерирует, правит и утверждает ТЗ; студенты видят утверждённую версию и скачивают PDF с кириллицей. По умолчанию выключено | На Render; сценарий пройден локально в mock, отдельный запрос GPT-5.5 на синтетике прошёл. Подробно |
| Второе мнение NVIDIA | Отдельная проверка тех же исходных полей без ответа первой модели; результат хранится отдельно | На Render; без ключа NVIDIA показывает понятную ошибку. Проверено в mock |
| Вопросы по карточке | Студент задаёт публичный вопрос (не больше 5 в сутки на карточку) и видит похожие. Бизнес отвечает, правки сохраняют историю, ответ можно перенести в поле карточки. Модерация, подписка, уведомления внутри приложения | На Render; тесты и браузерный сценарий пройдены локально |
| Рекомендательное письмо | После проекта капитан задаёт роли, участники их подтверждают, бизнес заполняет опросник. Каждый участник получает личный PDF с QR-проверкой; есть перевыпуск, отзыв и жалоба на факты. Письмо на русском, казахском или английском | На Render; тесты и браузерный сценарий пройдены локально. Подробно |
| Казахский язык | Экраны вопросов и писем на русском и казахском | На Render |
Архитектура
Один процесс FastAPI отдаёт API и статический интерфейс без сборки. Данные — SQLite, каждая запись в отдельной транзакции.
flowchart LR
UI["Интерфейс<br/>index.html · business.js · catalog.js"] --> API["api.js<br/>роль демо + If-Match"]
API --> M["FastAPI · app/main.py"]
M --> L["llm.py<br/>вопросы и цитаты"]
M --> R["rating.py<br/>формула 0–100"]
M --> RV["review.py<br/>«Что помешает начать?»"]
M --> I["insights.py<br/>место и прогноз"]
M --> RC["recommend.py<br/>рекомендации"]
M --> ST["stages.py<br/>приёмка этапа"]
M --> SP["specification.py · spec_pdf.py<br/>ТЗ и PDF"]
M --> Q["questions.py<br/>вопросы и ответы"]
M --> PL["project_letters.py · letter_pdf.py<br/>письма с QR"]
M --> C["community.py<br/>сессии, аудит, уведомления"]
M --> DB[("store.py<br/>SQLite")]
L --> OAI["ai_config.py<br/>OpenAI gpt-5.5 → NVIDIA → mock"]
| Решение | Зачем |
|---|---|
If-Match с ревизией карточки | Правка из устаревшего окна получает 409 и не затирает чужие изменения |
| Опубликованный снимок | Команды откликаются на зафиксированные условия |
| Уникальная запись этапа | +10 не начисляются дважды даже при одновременных запросах |
| Баллы готовности и прогресса раздельно | Рейтинг задачи и прогресс команды не смешиваются |
| Выданный PDF письма не меняется | Исправление — новая версия, старая получает статус «заменено»; хранится SHA-256 |
Стек: Python 3.10+ (Docker — 3.12), FastAPI, Pydantic v2, SQLite, OpenAI SDK, ReportLab, чистый JavaScript без Node. QR-ссылки строятся от APP_PUBLIC_URL, а не от заголовка запроса. Точные версии — requirements.txt. Подробнее — docs/ARCHITECTURE.md.
Запуск
Нужны Git и Python 3.10+. Ключи для запуска не нужны: по умолчанию MOCK=1.
git clone https://github.com/BAITC-Hacks/hack-a2928c88-hackai.git
cd hack-a2928c88-hackai
python -m venv .venv
.\.venv\Scripts\python.exe -m pip install -r requirements-dev.txt
Copy-Item .env.example .env # только при первом запуске
.\.venv\Scripts\python.exe -m uvicorn app.main:app --host 127.0.0.1 --port 8000
Открыть http://127.0.0.1:8000 и http://127.0.0.1:8000/docs. В Linux и macOS те же команды, только ./.venv/bin/python и cp .env.example .env.
Docker:
docker build -t sana-hub .
docker run --rm -p 8000:8000 -v sana-data:/data -e MOCK=1 sana-hub
Реальный OpenAI, база данных, роли в API
- Реальный AI. В локальном
.envзадайтеOPENAI_API_KEY,OPENAI_MODEL=gpt-5.5,MOCK=0и перезапустите сервер. Проверка одним платным запросом на синтетике:python scripts/check_ai.py. Ключ в вывод не попадает. На Render эти значения задаются в Environment отдельно. - База.
data/runtime/sana.sqlite3сохраняется между запусками. При старте добавляются только недостающие демо-записи, существующие данные и решения не перезаписываются. Для чистой базы задайте другойDATABASE_PATH.SEED_DEMO=0отключает импорт примеров. В контейнере подключайте постоянный том к/data. - Вопросы и письма.
COMMUNITY_DEMO=1включает выбор учебного пользователя (заказчик, модератор, капитан и участник каждой команды) без пароля.APP_PUBLIC_URL— адрес сайта для QR-ссылок: он должен совпадать с адресом, который увидят получатели. Подробно — docs/COMMUNITY.md. - Роли в
/docs. Действия бизнеса требуют заголовкаX-Demo-Role: business, отклик —team. Правка, подтверждение и публикация требуютIf-Matchсrevisionкарточки.api.jsпередаёт это сам. Это роли для демо, а не аутентификация.
Тестовые сценарии
.\.venv\Scripts\python.exe -m pytest -q # 156 passed
Автотесты покрывают: черновик → вопросы → карточку с нулём баллов → подтверждение → публикацию → правку со снятием подтверждения; низкий рейтинг и отклик на него; ручной выбор нескольких команд; однократные +10 при одновременных запросах; конфликты версий; R-QUOTE; поиск, страницы и фильтры каталога; рекомендации; устаревание анализа; цикл приёмки этапа; ТЗ и PDF с кириллицей; второе мнение NVIDIA и ошибку без ключа; права на вопросы и ответы, лимит вопросов при одновременных запросах; письма: роли, опросник, неизменность PDF, статусы QR-проверки, сроки уведомлений; сохранение базы после перезапуска.
Браузерные сценарии (Playwright и Edge: pip install playwright==1.63.0, запускать на отдельной учебной базе с MOCK=1):
| Скрипт | Что проверяет |
|---|---|
scripts/smoke_e2e.py --url http://127.0.0.1:8000 --mode mock | Весь путь из п. 11: рейтинг 0 → 100 → 80 → 100, публикация, отклик, ручной выбор, +10 без повтора, понятная ошибка при HTTP 503 |
scripts/smoke_catalog.py --url http://127.0.0.1:8000 | Фильтр черновиков, отклик на задачу с низким рейтингом, обязательная ссылка, выбор, этап |
scripts/smoke_review.py --url http://127.0.0.1:8000 | F5 → замечание → переход к полю → правка → устаревание → повтор → опубликованный анализ и место |
scripts/smoke_stages.py --url http://127.0.0.1:8000 | Условия этапа → сдача → доработка → повторная сдача → приёмка → F5 → нет повторных баллов |
scripts/smoke_nvidia_review.py | Второе мнение отдельно от основной проверки, понятная ошибка без ключа |
scripts/smoke_questions.py --url http://127.0.0.1:8000 | Вопрос → ответ владельца → правка с историей → перенос в карточку с повторным подтверждением → дубликат → уведомления → казахский и телефон |
scripts/smoke_project_letters.py --url http://127.0.0.1:8009 --serve-isolated | Роли → опросник → выдача → PDF → все статусы QR-проверки → жалоба → согласие на публикацию. Сам поднимает отдельный сервер |
Ручная приёмка: 16 сценариев для тестировщика. Скрипты создают учебные записи. Запуск против публичного сайта требует явного флага --allow-remote. --mode live делает два платных запроса к AI.
Формула в одну команду:
.\.venv\Scripts\python.exe -c "from app.schemas import TaskCard; from app.rating import calculate_rating, confirm_fields, edit_card; c = TaskCard(draft_id='demo', industry='retail', context='Requests by email', data='Synthetic CSV', synthetic=True); print(calculate_rating(c).total); c = confirm_fields(c, ['context', 'data'], business_actor='demo-business'); print(calculate_rating(c).total); c = edit_card(c, {'context':'Requests by phone'}); print(calculate_rating(c).total)"
Результат 0 → 30 → 20: заполненное поле без подтверждения баллов не даёт, подтверждение добавляет баллы, правка снимает баллы изменённого поля.
Проверка качества AI-замечаний: python scripts/eval_review.py --live делает 12 платных запросов. Из 12 ответов 11 реальных и один fallback, ожидаемые поля совпали в 9 случаях из 12 (отчёт, первый прогон). Это диагностический набор для настройки, а не метрика точности. Прогон сделан на прежней модели gpt-4.1-mini, на GPT-5.5 его результаты не переносятся.
Данные
data/samples/ai-sana-synthetic.json: 413 черновиков, 413 карточек, 10 команд, 417 откликов. У каждой записи пометка synthetic: true.
- 13 ручных кейсов из разных отраслей: промышленность, ЖКХ, финансы, туризм, транспорт и другие. Их баллы специально стоят на границах уровней: 24, 37, 69/70, 97.
- 400 шаблонных сценариев: 10 отраслей × 10 рабочих процессов × 4 степени полноты. Баллы 20/50/75/100 означают полноту описания, а не качество решения.
- Все организации, контакты и команды вымышлены. Ссылки на
example.comникуда не ведут. Упомянутые в задачах CSV не приложены. - Карточки — учебные эталоны с подтверждениями автора набора, а не автоматически подтверждённый вывод AI.
- Источники и сборка: coord/notes/Q-132813-claude.md, synthetic-extra-source.json, generate_synthetic_bulk.py. Пересчёт баллов:
python scripts/prepare_demo_data.py.
Статус проверки и ограничения
| Что | Статус на 23.09.2026 |
|---|---|
| Версия на Render | Образ docker.io/denryyyyyyy/sana-hub:930961031024: всё описанное в README, включая вопросы, письма и второе мнение NVIDIA. /health показывает openai_model: gpt-5.5, /openapi.json — 65 эндпоинтов. Проверено 23.09.2026 |
| Полный сценарий на публичном сайте | Пройден в Edge с реальным OpenAI на предыдущей версии: 0/100/80/100, публикация, отклик, ручной выбор, +10 один раз. На текущей версии с GPT-5.5 целиком не прогонялся |
| GPT-5.5 | Реальные локальные запросы на синтетике прошли для вопросов и цитат, проверки карточки и ТЗ |
| NVIDIA | Код и mock проверены. Ключа нет (nvidia_configured: false), кнопка второго мнения в live показывает понятную ошибку |
| Текущая версия локально | 156 тестов; браузерные сценарии smoke_e2e, smoke_questions, smoke_project_letters пройдены |
| QR в письмах | Ссылка строится от APP_PUBLIC_URL; на Render он должен быть https://sana-hub-0ca1dc1.onrender.com |
| Постоянный диск на Render и доступность весь период судейства | Не подтверждены. Данные на публичном сайте считайте временными; QR-проверка писем требует постоянной базы |
Ограничения, которые мы знаем:
- Рейтинг измеряет полноту подтверждённого описания, а не его правдивость или качество.
- Совпадение цитаты не доказывает, что поле заполнено по смыслу. Результат проверяет человек. Mock переносит текст ответов в поля, но не разбирает его.
- Роли открыты для демо: нет аутентификации и изоляции компаний. В разделе вопросов и писем серверные сессии и проверки прав настоящие, но выбрать можно любого учебного пользователя, включая модератора. Используйте только учебные данные.
- Письмо — учебный документ: нет проверки личности подписанта и электронной подписи.
- Уведомления только внутри приложения, без email и мессенджеров.
- SQLite и лимит вызовов рассчитаны на один процесс.
- Нет загрузки файлов, чата, календаря и полного трекера. У проекта один проверяемый этап. Ввод — только текст.
- Рекомендации задач и поиск похожих вопросов сравнивают слова, а не смысл.
Команда и раскрытие
- Использованные библиотеки, модели, шрифты, данные и заготовки перечислены в docs/DISCLOSURE.md.
- Ход работы по часам: docs/PROGRESS.md.
- Вклад Codex: docs/CODEX_LOG.md.
- Codex и Claude использовались как инструменты разработки. Продуктовая AI-функция — только описанная выше.
- Деплой и обновление образа: docs/DEPLOY.md.
- Репозиторий: BAITC-Hacks/hack-a2928c88-hackai.
Авторы коммитов
История коммитов
- 2026-09-23 17:57docs: mark full feature set as deployed on RenderАрман
- 2026-09-23 17:54[codex] Record PR6 validation and deployment imageАрман
- 2026-09-23 17:53[codex] Merge PR #6: card questions and recommendation lettersArman Zhetessov
- 2026-09-23 17:49[codex] Align recommendation QR default with local app portNursaule
- 2026-09-23 17:46[codex] Integrate latest main and shared AI configurationNursaule
- 2026-09-23 17:44[codex] Add card Q&A and verifiable project recommendation lettersNursaule
- 2026-09-23 17:39[codex] Document GPT-5.5 image and tester handoffАрман
- 2026-09-23 17:38[codex] Upgrade to GPT-5.5 and add independent NVIDIA reviewАрман
Все коммиты (58)
- 2026-09-23 17:27docs: restructure README for jury reviewАрман
- 2026-09-23 17:19[codex] checkpoint 4: Merged conditions and approved specifications; 78 tests; verified Docker PDFАрман
- 2026-09-23 17:17[codex] Record verified Docker image after PR integrationАрман
- 2026-09-23 17:14[codex] Merge PR #5: approved specifications and PDFArman Zhetessov
- 2026-09-23 17:13[codex] Integrate specifications with stages and condition historyАрман
- 2026-09-23 17:08[codex] Merge PR #4: compare published proposal conditionsArman Zhetessov
- 2026-09-23 17:03[codex] add business-approved AI specifications and selected-idea PDF exportAidana
- 2026-09-23 17:03[codex] Document verified stage image for RenderАрман
- 2026-09-23 17:01[codex] Add saved-card recovery and verifiable stage acceptanceАрман
- 2026-09-23 16:56[codex] compare proposal snapshots with published task conditionsNursaule
- 2026-09-23 16:34[codex] document reviewed card workflow deployment imageАрман
- 2026-09-23 16:33[codex] add evidence-based card review and catalog readiness forecastsАрман
- 2026-09-23 16:21Merge pull request #3 from BAITC-Hacks/team/catalog-uiArman Zhetessov
- 2026-09-23 16:19[codex] checkpoint 3: Redesign, searchable catalog, 413 synthetic tasks and verified Docker imageАрман
- 2026-09-23 16:16[codex] reconcile catalog improvements with frontend redesignNursaule
- 2026-09-23 16:09[codex] update README and document catalog integration tasksАрман
- 2026-09-23 15:56Merge pull request #2 from BAITC-Hacks/team/frontend-redesignArman Zhetessov
- 2026-09-23 15:51Import supplied Sana frontend redesign and supporting API changesAidana
- 2026-09-23 15:50[codex] show versioned catalog readiness insights and reviewNursaule
- 2026-09-23 15:46[codex] add catalog search pagination and draft protectionNursaule
- 2026-09-23 15:43Merge remote-tracking branch 'origin/main' into team/catalog-uiNursaule
- 2026-09-23 15:29[codex] record expanded dataset verification and deployment imageАрман
- 2026-09-23 15:25[codex] merge reviewed business UI updates with expanded synthetic dataАрман
- 2026-09-23 15:24[codex] add 400 synthetic tasks and preserve records on seed upgradesАрман
- 2026-09-23 15:11[codex] integrate TASK-01 business UI reliabilityAidana
- 2026-09-23 15:10[codex] merge latest main and preserve both progress recordsAidana
- 2026-09-23 15:09[codex] verify full live OpenAI flow on public RenderАрман
- 2026-09-23 15:09[codex] prevent lost business input and stale confirmationsAidana
- 2026-09-23 14:59[codex] document full UI image and live Render configurationАрман
- 2026-09-23 14:58[codex] checkpoint 2: Live OpenAI and full local UI flow verified; Render update pendingАрман
- 2026-09-23 14:54[codex] fix catalog prototype validation and industry filtersNursaule
- 2026-09-23 14:52[codex] add live OpenAI probe and review business UIАрман
- 2026-09-23 14:52[codex] integrate reviewed business UI for end-to-end verificationАрман
- 2026-09-23 14:49[codex] split teammate assignments into separate filesАрман
- 2026-09-23 14:47[codex] assign focused follow-up tasks for both frontend developersАрман
- 2026-09-23 14:43[codex] record verified public Render deploymentАрман
- 2026-09-23 14:32[codex] verify full case and prepare private image deploymentАрман
- 2026-09-23 14:25T-001: business screen (business.js, business.css)Айдана
- 2026-09-23 14:21[codex] verify catalog in browser and document Render deploymentАрман
- 2026-09-23 14:17[codex] integrate reviewed team catalog UIАрман
- 2026-09-23 14:17[codex] verify deployed container and preserve proposal conditionsАрман
- 2026-09-23 14:13[codex] checkpoint 1: API and SQLite verified; UI integration and public deploy pendingАрман
- 2026-09-23 13:55feat: add catalog and team proposal UINursaule
- 2026-09-23 13:54[codex] Document project status setup and verification in READMEАрман
- 2026-09-23 13:49[codex] Save track research architecture and split frontend tasksАрман
- 2026-09-23 13:40[codex] Add AI Sana idea review and tested readiness foundationАрман
- 2026-09-23 10:35revert: remove imported harness and CI workflowАрман
- 2026-09-23 10:33ci: pin Python 3.12 for test stepАрман
- 2026-09-23 10:33ci: build and publish Docker image to GHCR for RenderАрман
- 2026-09-23 10:26chore: import pre-built harness (disclosed in docs/DISCLOSURE.md), track TBDАрман
Структура репозитория (271 файлов)
.dockerignore .env.example .gitignore AGENTS.md Dockerfile README.md app/__init__.py app/ai_config.py app/community.py app/insights.py app/letter_pdf.py app/llm.py app/main.py app/project_letters.py app/question_suggestion.py app/questions.py app/rating.py app/recommend.py app/review.py app/schemas.py app/spec_pdf.py app/spec_routes.py app/specification.py app/stages.py app/static/api.js app/static/business.css app/static/business.js app/static/catalog.css app/static/catalog.js app/static/community.css app/static/community.js app/static/index.html app/static/project-letters.css app/static/project-letters.js app/static/questions.js app/static/specification.css app/static/specification.js app/static/stages.js app/static/ui.css app/store.py context/README.md context/RULES.md context/ideas/track-01.md context/ideas/track-02.md context/ideas/track-03.md context/ideas/track-04.md context/ideas/track-05.md context/ideas/track-06.md context/ideas/track-07.md context/ideas/track-08.md context/ideas/track-09.md context/ideas/track-10.md context/samples/track-01/eval/kz-term-errors.json context/samples/track-01/kz-clean.txt context/samples/track-01/kz-term-errors.txt context/samples/track-02/appeal-complete.txt context/samples/track-02/appeal-incomplete.txt context/samples/track-02/eval/appeal-incomplete.json context/samples/track-03/eval/geo-report-p12.json context/samples/track-03/geo-report-p12.txt context/samples/track-04/eval/phish-bank.json context/samples/track-04/legit-notice.eml context/samples/track-04/phish-bank.eml context/samples/track-05/discharge-errors.txt context/samples/track-05/eval/discharge-errors.json context/samples/track-06/eval/smeta-vs-vor.json context/samples/track-06/smeta-vs-vor.csv context/samples/track-07/eval/transactions.json context/samples/track-07/transactions.csv context/samples/track-08/eval/quiz-errors.json context/samples/track-08/quiz-errors.txt context/samples/track-09/eval/field-ndvi.json context/samples/track-09/field-ndvi.csv context/samples/track-10/eval/project-assets.json context/samples/track-10/project-assets.csv context/tracks/track-01.md context/tracks/track-02.md context/tracks/track-03.md context/tracks/track-04.md context/tracks/track-05.md context/tracks/track-06.md context/tracks/track-07.md context/tracks/track-08.md context/tracks/track-09.md context/tracks/track-10.md coord/LOG.md coord/TASKS.md coord/agents.json coord/council/1325-idea/r0-claude.prompt.md coord/council/1325-idea/r0-codex.prompt.md coord/council/1325-idea/r0-gemini.prompt.md coord/council/1327-idea/DECISION.md coord/council/1327-idea/IDEA-auto-original.md coord/council/1327-idea/LEAD_AUDIT.md coord/council/1327-idea/decision0.md coord/council/1327-idea/decision1.md coord/council/1327-idea/r0-claude.md coord/council/1327-idea/r0-claude.prompt.md coord/council/1327-idea/r0-codex.md coord/council/1327-idea/r0-codex.prompt.md coord/council/1327-idea/r0-gemini.md coord/council/1327-idea/r0-gemini.prompt.md coord/council/1327-idea/r1-claude.extraction-original.txt coord/council/1327-idea/r1-claude.md coord/council/1327-idea/r1-claude.prompt.md coord/council/1327-idea/r1-codex.md coord/council/1327-idea/r1-codex.prompt.md coord/council/1327-idea/r1-gemini.md coord/council/1327-idea/r1-gemini.prompt.md coord/council/1327-idea/r2-claude.md coord/council/1327-idea/r2-claude.prompt.md coord/council/1327-idea/r2-codex.md coord/council/1327-idea/r2-codex.prompt.md coord/council/1327-idea/r2-gemini.md coord/council/1327-idea/r2-gemini.prompt.md coord/council/1327-idea/synth0.prompt.md coord/council/1327-idea/synth1.prompt.md coord/council/1327-idea/vote0-claude.prompt.md coord/council/1327-idea/vote0-codex.prompt.md coord/council/1327-idea/vote0-gemini.prompt.md coord/council/1327-idea/vote1-claude.md coord/council/1327-idea/vote1-claude.prompt.md coord/council/1327-idea/vote1-codex.md coord/council/1327-idea/vote1-codex.prompt.md coord/council/1327-idea/vote1-gemini.prompt.md coord/council/1343-arch/DECISION.md coord/council/1343-arch/decision0.md coord/council/1343-arch/r0-claude.md coord/council/1343-arch/r0-claude.prompt.md coord/council/1343-arch/r0-codex.md coord/council/1343-arch/r0-codex.prompt.md coord/council/1343-arch/r1-claude.md coord/council/1343-arch/r1-claude.prompt.md coord/council/1343-arch/r1-codex.md coord/council/1343-arch/r1-codex.prompt.md coord/council/1343-arch/synth0.prompt.md coord/council/1343-arch/vote0-claude.prompt.md coord/council/1343-arch/vote0-codex.prompt.md coord/council/1355-plan/DECISION.md coord/council/1355-plan/decision0.md coord/council/1355-plan/r0-claude.md coord/council/1355-plan/r0-claude.prompt.md coord/council/1355-plan/r0-codex.md coord/council/1355-plan/r0-codex.prompt.md coord/council/1355-plan/r1-claude.md coord/council/1355-plan/r1-claude.prompt.md coord/council/1355-plan/r1-codex.md coord/council/1355-plan/r1-codex.prompt.md coord/council/1355-plan/synth0.prompt.md coord/council/1355-plan/vote0-claude.prompt.md coord/council/1355-plan/vote0-codex.prompt.md coord/notes/Q-132557-gemini.md coord/notes/Q-132557-gemini.prompt.md coord/notes/Q-132558-claude.md coord/notes/Q-132558-claude.prompt.md coord/notes/Q-132808-gemini.md coord/notes/Q-132808-gemini.prompt.md coord/notes/Q-132813-claude.md coord/notes/Q-132813-claude.prompt.md coord/notes/Q-133528-claude.md coord/notes/Q-133528-claude.prompt.md coord/notes/Q-145556-claude.md coord/notes/Q-145556-claude.prompt.md coord/notes/Q-150332-claude.md coord/notes/Q-150640-claude.md coord/notes/Q-152211-claude.md coord/notes/Q-152211-claude.prompt.md coord/notes/Q-152536-claude.md coord/notes/Q-152536-claude.prompt.md coord/notes/T-008-claude.md coord/notes/T-008-claude.prompt.md coord/notes/case-pdf-audit.md coord/notes/live-ai-e2e.md coord/notes/render-smoke.md coord/notes/research-07.md coord/notes/review-T-001.md coord/notes/review-T-002.md coord/notes/scoring-07.md coord/notes/track-analysis.md coord/tasks/T-001.result.md coord/tasks/T-002-QA-LETTERS.result.md data/samples/ai-sana-synthetic.json data/samples/synthetic-extra-source.json docs/ARCHITECTURE.md docs/CASE-official.pdf docs/CASE-official.txt docs/CASE.md docs/CODEX_LOG.md docs/COMMUNITY.md docs/DEMO_SCRIPT.md docs/DEPLOY.md docs/DISCLOSURE.md docs/EVAL-REVIEW-BASELINE.md docs/EVAL-REVIEW.md docs/IDEA.md docs/INNOVATION-REVIEW.md docs/NEXT-STEPS-REVIEW.md docs/PROGRESS.md docs/REVIEW-CONTRACT.md docs/TASK-01-BUSINESS.md docs/TASK-02-CATALOG.md docs/TASK-02-CONDITIONS.md docs/TASK-02-INNOVATION.md docs/TASK-02-PR3-MERGE.md docs/TEAM.md docs/TECHNICAL-SPEC.md docs/TESTER-SCENARIOS.md docs/TRACKS_LIVE.md docs/TRACKS_PARSED.md docs/case-detail-probe.json docs/cases-probe.json docs/img/business-card.png docs/img/catalog.png docs/references/REGLAMENT.local-snapshot.md docs/references/RULES-live-extract.txt docs/references/TRACKS.local-snapshot.md docs/references/rule-1b8.txt docs/references/rule-1b9.txt docs/references/rule-1ba.txt docs/references/rule-1bb.txt docs/references/rule-1bc.txt docs/tracks-api.json docs/tracks-live/tracks/07-education-ai-sana.md docs/tracks_raw/06d09878-1838-4118-acb0-37573709bac8.json docs/tracks_raw/0af1eea3-b514-411e-a29f-684f581d4f2c.json docs/tracks_raw/3b54092a-6737-40fc-956d-b16dbefb9a0d.json docs/tracks_raw/5ada35d0-bb34-4896-9c8a-bcee60fe599d.json docs/tracks_raw/66c86f78-5afe-4432-9d75-0d188d963802.json docs/tracks_raw/70deb911-4ba6-46f9-aa3f-4a616edb4fb7.json docs/tracks_raw/74a8ded9-8f84-47ef-bd1b-4ee149a981b1.json docs/tracks_raw/850571ee-bdbb-4386-94c4-fc5e55e174ab.json docs/tracks_raw/bac534b7-cb12-41b3-bf0f-cf06031660b9.json docs/tracks_raw/c34ad17e-8366-452d-a47a-04fd55d24639.json docs/tracks_raw/d455af96-7180-4cce-934b-91061b3fb363.json docs/tracks_raw/f2c8ee70-8228-4bc5-9b97-6f00565be930.json prompts/lead.md render.yaml requirements-dev.txt requirements.txt scripts/agents.py scripts/build-image.ps1 scripts/check_ai.py scripts/checkpoint.ps1 scripts/eval_review.py scripts/fetch_public_chunks.py scripts/generate_synthetic_bulk.py scripts/prepare_demo_data.py scripts/prepare_track_review.py scripts/smoke_catalog.py scripts/smoke_e2e.py scripts/smoke_nvidia_review.py scripts/smoke_project_letters.py scripts/smoke_questions.py scripts/smoke_review.py scripts/smoke_stages.py scripts/smoke_url.py templates/IDEA_SCORING.md tests/test_agent_answers.py tests/test_api.py tests/test_catalog_ui_api.py tests/test_community.py tests/test_demo_data.py tests/test_llm.py tests/test_nvidia_review.py tests/test_project_letters.py tests/test_question_suggestion.py tests/test_questions.py tests/test_rating.py tests/test_review.py tests/test_specification.py tests/test_stages.py
Обсуждение 0 комментариев
Войдите, чтобы комментироватьПока нет комментариев — будьте первым.