О проекте
Команда: BrainBlitz
Кейс HackAlem.ai: Спецтрек — Astana Innovations
Стадия: Рабочий MVP
Задача кейса: «Аким на 5 часов»: городской симулятор, распределяющий бюджет по 5 направлениям и 5 районам
Суть
Учебный симулятор городского бюджета Астаны: пользователь выбирает 5 мероприятий из 14 на бюджет 100 для 5 районов, получает Astana Quality of Life Score, изменения по районам и AI-разбор компромиссов.
Как устроено
Данные (districts.json, measures.json) проверяются на целостность при старте. Сервер валидирует набор: стоимость ≤100, ровно 5 мер, по одной на направление, существующие районы, несовместимости. Детерминированный расчёт: realized_effect = effect×(8−lag)/8, синергии, clip 0–100, взвешенный district_score, Score = 0.7·city_average + 0.3·min(district) − critical_count. После расчёта OpenAI пишет разбор сильных сторон, рисков и компромисса; числовой результат сохраняется и при недоступности AI, а устаревшие ответы старых попыток отбрасываются.
Ключевые решения
- детерминированная модель эффектов с лагами
- синергии и конфликты мер
- серверная валидация правил
- AI-разбор рассчитанного сценария
- защита от устаревших ответов
Метрики
285 Python-тестов и 12 браузерных тестов; базовый Score 52,56; пример: перенос школы из Есиля в Нуру 53,83 → 55,07
Особенности
Формула Score прописана явно и проверена эталонами, а AI объясняет только уже рассчитанный сценарий. Команда честно фиксирует расхождение с ТЗ: реализовано более строгое правило «одна мера на направление», из-за чего исходные примеры отклоняются. Есть независимый аудит датасета.
Стек
Python · JavaScript · HTML/CSS · pytest
Модели
OpenAI (модель не указана)
Проект создан за 5 часов на финале хакатона HackAlem.ai (23 сентября 2026, Астана). Код — BAITC-Hacks/hack-ffe55ead-brainblitz.
README
README.mdАким на 5 часов
Учебный AI-симулятор управления городским бюджетом.
100 условных единиц → 5 решений → последствия для районов → AI-разбор → пересмотр решения.
Пользователь выбирает городские инициативы, распределяет ограниченный бюджет и получает Astana Quality of Life Score: итоговую оценку сценария с изменениями показателей районов, сохраняющимися проблемами и объяснением компромиссов.
Например, перенос одной школы из Есиля в Нуру при одинаковых расходах повышает Score с 53,83 до 55,07 и уменьшает число критических показателей с двух до одного. При этом средняя оценка города немного снижается — симулятор помогает понять, почему итог всё равно улучшился.
Статус: реализован локальный MVP с интерфейсом, математической моделью, серверной валидацией и OpenAI-интеграцией. Зафиксированные проверки: 285 Python-тестов и 12 браузерных тестов. Живые AI-разборы сценариев A/B проверены отдельно; сведения о версиях и границах проверок приведены ниже.
Перед финальной сдачей остаётся закрыть расхождение в правиле направлений и провести полную репетицию защиты.
Запуск · Контрольные сценарии · Питч и ответы жюри · API-контракт
Документы для разработки
| Документ | Что содержит |
|---|---|
| Спецификация | Сценарий пользователя, исходные данные, правила, формула и критерии готовности |
| API-контракт | Запросы, ответы, ошибки и полные JSON-примеры |
| Архитектура | Компоненты приложения и границы их ответственности |
| Backend | Реализация математической модели и серверных проверок |
| Frontend | Интерфейс, обработка состояний и демонстрационный режим |
| AI-интеграция | Настройка OpenAI, ошибки, ограничения и живая приёмка |
| Проверка исходных данных | Независимая сверка датасета и математических эталонов |
| Независимая приёмка | Окружение, команды, результаты тестов и проверка настоящего интерфейса |
| Материалы защиты | План шести слайдов, речь, минутное демо и ответы на вопросы жюри |
Документы backend/frontend содержат описание ранних этапов. Упоминания отсутствующего /api/analyze в них относятся к состоянию до AI-интеграции. Актуальная настройка AI находится в этом README и docs/ai.md.
Версии текущей реализации:
- API-контракт —
2.0; - исходные данные —
city-v1; - правила —
five-directions-v1.
Проблема и пользователь
Транспорт, озеленение, социальная инфраструктура, безопасность и городские сервисы конкурируют за один бюджет. Решение может улучшить среднее значение по городу, но оставить критические потребности отдельного района нерешёнными.
Симулятор позволяет исследовать такие ситуации в коротком воспроизводимом упражнении: выбрать меры, увидеть последствия, прочитать объяснение и проверить другую комбинацию.
Основная учебная аудитория — студенты и слушатели программ городского управления, урбанистики и экономики. Преподаватель может использовать приложение для обсуждения бюджетных решений; управленец или аналитик — для знакомства с учебной моделью компромиссов.
Польза текущего продукта:
- одинаковые исходные условия позволяют сопоставлять решения;
- ограничения проверяются автоматически;
- последствия видны по отдельным районам и показателям;
- AI объясняет конкретный рассчитанный сценарий;
- повторная попытка позволяет проверить собственную гипотезу.
Границы применения: данные синтетические, стоимости и эффекты условные. Astana Quality of Life Score — учебный индекс, а не официальный показатель или прогноз развития Астаны. Образовательная эффективность, спрос и готовность организаций использовать продукт пока не подтверждены исследованием.
Основной сценарий
- Открыть исходные показатели пяти районов и базовый Score 52,56.
- Выбрать ровно пять мероприятий и районы для локальных мер.
- Проверить стоимость и остаток бюджета 100.
- Получить понятную причину отказа, если набор нарушает правила.
- Рассчитать итоговый Score, изменения районов и критические показатели.
- Получить AI-разбор сильных сторон, рисков и основного компромисса.
- Изменить решение и повторить расчёт.
При изменении выбора предыдущий результат помечается как устаревший. Запоздалый ответ старой попытки не подменяет результат новой.
Объём MVP
P0 — обязательный результат
- Полный синтетический датасет: пять районов, десять показателей, четырнадцать мероприятий.
- Единый бюджет и ровно пять решений.
- Серверные проверки стоимости, повторов, районов и несовместимостей.
- Детерминированный расчёт эффектов, лагов, синергий и Score.
- Отображение исходного и итогового состояния районов.
- AI-разбор рассчитанного сценария.
- Отдельная живая проверка AI для A/B.
- Сохранение числового результата при недоступности AI.
- Независимые математические и API-тесты.
- Проверенный запуск в чистом окружении.
- Текст питча, сценарий демо и ответы жюри.
- Закрыть расхождение между исходным и реализованным правилом направлений.
- Подготовить окончательные слайды и провести полную репетицию с хронометражем.
- Повторить проверку AI на ноутбуке и в сети, используемых для защиты.
После готового P0
Следующие улучшения по мере подтверждения их пользы:
- сравнение текущей и предыдущей попытки;
- предложение альтернативного набора с предварительной серверной проверкой его допустимости и результата;
- более удобная настройка локального запуска;
- расширение проверки смысловой точности AI-разборов.
Эти возможности не заявляются как уже реализованные.
За пределами пяти часов
Аккаунты, рейтинг команд, кабинет преподавателя, история занятий, GIS-карта, случайные события, экспорт презентаций и дополнительные учебные кейсы.
Данные и правила
Источник модели — предоставленный для задачи документ «Датасет районов». Машиночитаемые данные находятся в:
- data/districts.json — районы, исходные показатели, веса и доли населения;
- data/measures.json — мероприятия, цены, эффекты, лаги, конфликты и синергии.
Сервер проверяет целостность данных при запуске и использует неизменяемую конфигурацию. Каждая попытка рассчитывается от исходного состояния: эффекты предыдущих запросов не накапливаются.
| Параметр | Значение |
|---|---|
| Бюджет | 100 условных единиц для всех пользователей |
| Районы | Есиль, Алматы, Сарыарка, Байконур, Нура |
| Направления | Транспорт, экология/озеленение, соцсфера, безопасность, сервисы |
| Показатели | 10; от 0 до 100, больше — лучше |
| Каталог | 14 мероприятий |
| Горизонт | 8 кварталов |
| Число решений | Ровно 5 |
| Остаток бюджета | Отображается, бонуса к Score не даёт |
Сервер применяет следующие правила:
- Стоимость набора не превышает 100.
- Выбрано ровно пять мероприятий.
- Каждое мероприятие встречается не более одного раза.
- Для районной меры указан существующий район.
- Для городской меры район отсутствует или равен
null; эффект действует на все районы. - В текущей версии выбрана ровно одна мера каждого из пяти направлений.
- Несовместимые мероприятия запрещены.
- Порядок решений не влияет на результат.
- Невалидный набор возвращает причину отказа без Score.
Известное расхождение требований. Исходный документ допускает не более двух мероприятий одного направления. Текущие API и интерфейс реализуют более строгое правило: по одной мере каждого из пяти направлений.
Поэтому исходные примеры стоимостью 95 и 61, содержащие по две меры одного направления, сейчас отклоняются с CATEGORY_COVERAGE. Перед окончательной сдачей необходимо подтвердить допустимость ужесточения у организаторов либо согласованно обновить правила, интерфейс, контракт и тесты. Полное соответствие исходному правилу пока не заявляется.
Несовместимости и синергии
| Несовместимые меры | Ограничение |
|---|---|
| M1 и M3 | Запрещены вместе независимо от района |
| M4 и M7 | Запрещены в одном районе |
| M5 и M13 | Запрещены в одном районе |
| Пара с синергией | Фиксированный бонус |
|---|---|
| M1 + M2 | T1 +2 в районе M1 |
| M10 + M12 | B1 +2 в районе M10 |
| M5 + M6 | E2 +2 в районе M5 |
Бонусы синергий не масштабируются лагом. При текущем правиле категорий пары M1+M2 и M5+M6 недоступны через API; они сохранены в исходной модели и проверяются отдельно на уровне расчётных функций.
Расчёт Score
Расчёт выполняется Python-кодом по фиксированной модели:
realized_effect = full_effect × (8 − lag) / 8
new_indicator =
clip(initial_indicator + sum(realized_effects) + synergies, 0, 100)
district_score = sum(weight × new_indicator)
city_average = sum(population_share × district_score)
critical_count =
число пар «район × показатель» со значением строго меньше 40
Score = 0.7 × city_average + 0.3 × min(district_score) − critical_count
Формула учитывает средний результат города, положение слабейшего района и количество критических дефицитов.
| Показатель | T1 | T2 | E1 | E2 | S1 | S2 | B1 | B2 | C1 | C2 |
|---|---|---|---|---|---|---|---|---|---|---|
| Вес | 0.10 | 0.10 | 0.09 | 0.11 | 0.11 | 0.11 | 0.09 | 0.09 | 0.10 | 0.10 |
| Район | Доля населения | Исходная оценка |
|---|---|---|
| Есиль | 0.27 | 62.99 |
| Алматы | 0.24 | 57.06 |
| Сарыарка | 0.20 | 54.65 |
| Байконур | 0.13 | 56.63 |
| Нура | 0.16 | 49.18 |
Базовое среднее — 56.8624, слабейший район — Нура, критических показателей — 2.
Базовый Score: 52.55768, отображение в интерфейсе — 52,56.
Особенности расчёта:
- ограничение показателей диапазоном 0–100 применяется один раз, после суммирования эффектов и синергий;
- значение ровно 40 не является критическим;
- промежуточные результаты не округляются;
- итоговый Score дополнительно не ограничивается диапазоном 0–100;
- интерфейс округляет числа только для отображения;
- транспортные и экологические показатели уже приведены к шкале «больше — лучше» и повторно не инвертируются.
Архитектура и роль AI
Backend: Python, FastAPI, Pydantic, httpx.
Frontend: HTML, CSS и JavaScript без обязательных внешних CDN.
Данные: версионируемые JSON-файлы.
Один FastAPI-процесс обслуживает интерфейс и API. Для локального MVP не требуются база данных и авторизация.
Выбор пользователя
│
▼
/api/simulate → проверка правил → Python-расчёт → числа в интерфейсе
│
└─ после успешного расчёта:
/api/analyze → повторная проверка и расчёт
→ OpenAI → проверка ответа → объяснение
Python отвечает за числа: стоимость, допустимость набора, эффекты, изменения показателей и Score. Клиент передаёт только ID выбранных мероприятий и районов.
AI отвечает за интерпретацию: итог, сильные стороны, сохраняющиеся проблемы, компромисс и вопрос для следующей попытки. AI получает результат текущего расчёта; история попыток и автоматический поиск оптимального сценария не реализованы.
Используется OpenAI Responses API со Structured Outputs. Модель задаётся через AI_MODEL; значения по умолчанию нет. Для зафиксированной живой приёмки использована gpt-4.1.
Сервер проверяет:
- структуру и допустимые поля ответа;
- ограничения длины;
- существование ссылок на факты в результате расчёта;
- корректность формата ответа провайдера.
Числовые поля итогового ответа формируются сервером. AI не может заменить Score собственным числом.
Проверка структуры и ссылок не гарантирует правильную интерпретацию. Ключевые выводы живых A/B проверены вручную; качество на широком наборе сценариев ещё предстоит оценить.
При отказе, timeout или некорректном ответе AI интерфейс сохраняет рассчитанные показатели и показывает статус недоступности. Общий предел ожидания по умолчанию — 12 секунд, автоматических повторов нет.
API и состояние реализации
| Метод | Путь | Назначение |
|---|---|---|
| GET | /api/config | Бюджет, районы, каталог, правила, версии и базовый Score |
| POST | /api/simulate | Валидация и расчёт сценария |
| POST | /api/analyze | Повторная проверка и расчёт, затем AI-разбор |
| GET | /health | Проверка доступности приложения |
Оба POST принимают один формат:
{
"selections": [
{"measure_id": "M1", "district_id": "esil"},
{"measure_id": "M4", "district_id": "saryarka"},
{"measure_id": "M7", "district_id": "nura"},
{"measure_id": "M10", "district_id": "esil"},
{"measure_id": "M12", "district_id": null}
]
}
Ответ /api/simulate содержит SimulationResult: версии, нормализованные решения, стоимость, остаток, Score до/после, районные изменения, критические показатели, эффекты и синергии.
Невалидный запрос получает HTTP 422:
{
"detail": [
{
"code": "BUDGET_EXCEEDED",
"message": "Стоимость решений 107 превышает бюджет 100 на 7 единиц.",
"path": ["selections"],
"context": {
"budget": 100,
"total_cost": 107,
"over_by": 7
}
}
]
}
Возвращается одна первая ошибка. Score отсутствует, провайдер AI не вызывается.
Недоступность AI для допустимого набора возвращается отдельно: HTTP 200, status="unavailable", причина в unavailable_reason. Математический результат при этом сохраняется.
Полные схемы и порядок проверок описаны в API-контракте.
Структура
app/
main.py # HTTP API, запуск, загрузка конфигурации
models.py # Схемы запросов и ответов
validator.py # Правила допустимости и ошибки
simulation.py # Математическая модель
ai.py # OpenAI, проверка ответа, обработка сбоев
prompts/
analyst.txt # Инструкции AI-аналитику
data/
districts.json # Районы, показатели, веса, население
measures.json # Каталог, стоимость, лаги, правила
static/
index.html
styles.css
app.js
demo/ # Явно обозначенные примеры контракта
tests/
test_api.py
test_simulation.py
test_validation_order.py
test_dataset_startup.py
test_source_data.py
test_qa_measure_effects.py
test_ai.py
test_analyze_api.py
frontend.cjs
examples/
scenario_a.json
scenario_b.json
docs/
spec.md
api-contract.md
architecture.md
ai.md
pitch.md
...
README.md
requirements.txt
.env.example
.gitignore
Запуск и конфигурация
Для воспроизведения на Windows рекомендуется Python 3.12: чистая установка проверена с CPython 3.12.14. AI-адаптер использует возможности Python 3.11 и новее.
Нужен современный браузер. Node.js требуется только для дополнительных браузерных тестов, но не для запуска приложения.
Получение проекта
При первом запуске:
git clone --branch main https://github.com/BAITC-Hacks/hack-ffe55ead-brainblitz.git
cd hack-ffe55ead-brainblitz
Для приватного репозитория необходим доступ через GitHub. Следующие команды выполняются из корня проекта.
Windows — установка и запуск без AI
В PowerShell:
python -m venv .venv
.\.venv\Scripts\python.exe -m pip install -r requirements.txt
.\.venv\Scripts\python.exe -m pip check
$env:AI_ENABLED = 'false'
.\.venv\Scripts\python.exe -m uvicorn app.main:app --host 127.0.0.1 --port 8000
macOS / Linux — установка и запуск без AI
В bash или zsh:
python3 -m venv .venv
.venv/bin/python -m pip install -r requirements.txt
.venv/bin/python -m pip check
AI_ENABLED=false .venv/bin/python -m uvicorn app.main:app --host 127.0.0.1 --port 8000
После запуска:
- Приложение — интерфейс с реальными расчётами.
- Документация API — интерактивные запросы.
- Конфигурация — исходные данные и правила.
- Проверка сервера —
{"status":"ok"}.
Открывайте приложение без ?demo=1. Сервер одновременно обслуживает frontend и backend; отдельная сборка интерфейса не нужна. Остановка сервера — Ctrl+C.
Без AI доступны все математические расчёты. Успешный /health подтверждает работу приложения, но не доступ к OpenAI.
Подключение AI
Для живого разбора нужны API-ключ и точный ID модели, доступной этому ключу.
| Переменная | Назначение |
|---|---|
AI_ENABLED | true включает AI, false явно отключает; по умолчанию true |
AI_API_KEY | Секретный ключ, доступный только backend |
AI_MODEL | Обязательный ID модели; значения по умолчанию нет |
AI_BASE_URL | По умолчанию https://api.openai.com/v1 |
AI_TIMEOUT_SECONDS | Общий предел ожидания; по умолчанию 12 |
Настройки читаются при запуске сервера. После их изменения сервер нужно перезапустить. Файл .env автоматически не загружается.
На Windows остановите предыдущий сервер и выполните в том же PowerShell:
$env:AI_ENABLED = 'true'
$env:AI_MODEL = 'gpt-4.1'
$env:AI_BASE_URL = 'https://api.openai.com/v1'
$env:AI_TIMEOUT_SECONDS = '12'
$aiSecret = Read-Host 'OpenAI API key' -AsSecureString
$aiKeyPointer = [Runtime.InteropServices.Marshal]::SecureStringToBSTR($aiSecret)
try {
$env:AI_API_KEY =
[Runtime.InteropServices.Marshal]::PtrToStringBSTR($aiKeyPointer)
} finally {
[Runtime.InteropServices.Marshal]::ZeroFreeBSTR($aiKeyPointer)
$aiSecret.Dispose()
Remove-Variable aiSecret, aiKeyPointer
}
.\.venv\Scripts\python.exe -m uvicorn app.main:app --host 127.0.0.1 --port 8000
gpt-4.1 использовалась в зафиксированной приёмке. Доступ к ней необходимо проверить для своего ключа.
На macOS / Linux создайте локальный .env по образцу .env.example, заполните AI_API_KEY, AI_MODEL и установите AI_ENABLED=true. Затем загрузите свой файл в том же терминале:
set -a
source .env
set +a
.venv/bin/python -m uvicorn app.main:app --host 127.0.0.1 --port 8000
source выполняет содержимое файла как команды оболочки: используйте только собственный доверенный .env.
Ключи не передаются браузеру и не должны попадать в Git. .env исключён из репозитория. После git pull настройки другого участника команды автоматически не появляются.
Адаптер использует /responses и Structured Outputs. Совместимости провайдера только с Chat Completions недостаточно. Подробности — в инструкции AI.
Если AI не работает
| Симптом | Что проверить |
|---|---|
not_configured | Установлены ли AI_API_KEY и AI_MODEL в окружении процесса сервера; перезапущен ли сервер |
disabled | Значение AI_ENABLED; для живого разбора требуется true |
provider_error | Ключ, доступ к модели, адрес API и соединение |
rate_limited | Доступную квоту и лимиты провайдера |
timeout | Доступность провайдера и установленное время ожидания |
invalid_response | Совместимость модели и результат проверки структуры/ссылок |
HTTP 404 на /api/analyze | Версию локального кода и процесс, запущенный на выбранном порту |
Режим ?demo=1 использует заранее подготовленные примеры контракта. Полный демонстрационный ответ доступен для B; этот режим не подтверждает работу backend или живого AI.
Контрольные сценарии
Готовые запросы: сценарий A и сценарий B.
| Направление / показатель | Сценарий A | Сценарий B |
|---|---|---|
| Транспорт | M1, Есиль | M1, Есиль |
| Экология | M4, Сарыарка | M4, Сарыарка |
| Соцсфера | M7, Есиль | M7, Нура |
| Безопасность | M10, Есиль | M10, Есиль |
| Сервисы | M12, город | M12, город |
| Стоимость | 83 | 83 |
| Остаток | 17 | 17 |
| Score | 53.8250475 | 55.0703475 |
| Отображение Score | 53,83 | 55,07 |
| Критические показатели после мер | 2 | 1 |
| S1 Нуры после мер | 38 | 48 |
| S2 Нуры после мер | 35 | 35 |
Изменяется только район школы M7. При переходе A → B:
- средняя оценка города снижается с
58.485425до58.364425; - минимальная районная оценка растёт с
49.6175до50.7175; - число критических показателей уменьшается с двух до одного;
- итоговый Score повышается на 1.2453 при той же стоимости.
Дефицит по S1 в Нуре выходит из критической зоны, но критический S2 сохраняется. Сценарий B демонстрирует компромисс и не объявляется оптимальным.
Дополнительные контрольные наборы:
| Проверка | Набор | Ожидаемый результат |
|---|---|---|
| Ровно 100 | M3 Нура, M6 город, M7 Нура, M10 Есиль, M12 город | Успешный расчёт, остаток 0 |
| Перерасход 107 | M3 Нура, M5 Сарыарка, M7 Нура, M10 Есиль, M14 город | 422, BUDGET_EXCEEDED |
| Конфликт участка | В B перенести M4 в Нуру | 422, INCOMPATIBLE_MEASURES |
Проверки и воспроизводимость
В Windows:
.\.venv\Scripts\python.exe -m pytest -q
.\.venv\Scripts\python.exe -m pip check
В macOS / Linux:
.venv/bin/python -m pytest -q
.venv/bin/python -m pip check
Зафиксированные результаты проверки версии 9b768d4 от 23 сентября 2026 года:
| Проверка | Результат | Что подтверждает |
|---|---|---|
| Python-тесты | 285 passed, 1 warning | Данные, расчёты, валидацию, API и обработку AI-ответов |
| Браузерные тесты | 12 passed | Поведение интерфейса с подменёнными API-ответами |
| Зависимости | No broken requirements found | Совместимость установленных зависимостей |
Предупреждение Starlette относится к будущему переходу TestClient с httpx на httpx2. Оно не скрывается и не стало причиной падения тестов.
Python-тесты проверяют:
- точные исходные данные, стоимости, лаги и эффекты;
- базу и A/B с абсолютным допуском
1e-8; - бюджет 100/107, количество, повторы, категории, ID и районы;
- несовместимости, синергии и отрицательные эффекты;
- применение clip после всех изменений;
- границу критичности 40;
- все 120 перестановок решений одного сценария;
- неизменность данных между запросами;
- полные ответы API и точную структуру ошибок 422;
- отказ запуска при повреждённом датасете;
- AI timeout, отказ, неверный формат и ссылки;
- сохранение математического результата при сбое AI.
AI-тесты подменяют транспорт провайдера и не требуют платных запросов.
Для браузерного набора нужны Node.js, Playwright и поддерживаемый Chromium-браузер:
node tests/frontend.cjs
Настройка браузера и зависимостей описана в документации frontend. Эти тесты не заменяют проверку настоящего взаимодействия браузера, FastAPI и OpenAI.
Отдельно проведены проверки настоящего интерфейса с backend и ручная живая приёмка A/B на gpt-4.1. В зафиксированных AI-запросах получены status=ok и времена 3,57 с / 2,62 с. Это результаты двух конкретных запросов, а не гарантия доступности, скорости или качества будущих ответов.
Отчёты: данные и математика, независимая приёмка, живая AI-приёмка.
После изменения кода, правил, модели или промпта соответствующие проверки нужно повторить.
Demo на 60 секунд
Перед выступлением запустите приложение на презентационном ноутбуке, проверьте AI и откройте интерфейс без ?demo=1.
| Время | Действие | Что показать |
|---|---|---|
| 0–10 сек. | Объяснить исходную проблему | Бюджет 100; критические S1=38 и S2=35 в Нуре |
| 10–25 сек. | Загрузить пример и рассчитать A | Стоимость 83, Score 53,83, две критические пары |
| 25–35 сек. | Показать AI-разбор и изменить район M7 | Перенос школы из Есиля в Нуру |
| 35–50 сек. | Рассчитать B | Стоимость 83, Score 55,07, одна критическая пара |
| 50–60 сек. | Объяснить компромисс | S1 улучшился, S2 остаётся критическим; почему изменился Score |
Сравнение A/B объясняет выступающий. Приложение показывает текущую попытку относительно исходного города и пока не хранит историю результатов.
Если AI недоступен, продолжайте по числовым карточкам. Резервную запись предыдущего успешного запуска показывайте с явной подписью; она не считается живым ответом.
Полный сценарий защиты рассчитан на шесть слайдов и 2 минуты 40 секунд, включая минутное демо. Это текст для подготовки презентации. Готовность слайдов, резервного видео и соблюдение времени нужно подтвердить репетицией. Фактический регламент выступления определяется организаторами.
Командная работа и готовность
| Роль | Ответственность |
|---|---|
| Frontend / UX | Выбор решений, бюджет, отображение результата, состояния ошибок и ожидания |
| Backend / AI | Валидация, формула, API, интеграция OpenAI и обработка сбоев |
| Data / QA / Docs / Pitch | Датасет, независимые эталоны, тесты, воспроизводимость, документация и защита |
Порядок завершения проекта:
- Закрыть вопрос правила направлений.
- Синхронизировать реализацию, контракт, тесты и материалы защиты.
- Проверить установку, расчёты A/B и AI на презентационном ноутбуке.
- Подготовить слайды и подписанный резерв демонстрации.
- Провести полную репетицию с кликами и вопросами.
- Зафиксировать финальный коммит и проверить доступность материалов для жюри.
Код проекта рассчитан на локальное конкурсное использование. Публичный deployment, нагрузочная проверка и защита общего AI-бюджета не входят в подтверждённые возможности текущего MVP.
Соответствие критериям хакатона
| Критерий | Вес | Что реализовано и чем подтверждается |
|---|---|---|
| Соответствие задаче и работоспособность | 25 | Бюджет, пять решений, меняющиеся показатели и Score, AI-разбор; демонстрация A/B и обработка недопустимых наборов. Расхождение в правиле категорий отмечено отдельно |
| Техническая реализация | 25 | Детерминированная модель, серверная валидация, неизменяемые данные, согласованный API, отдельный AI-адаптер и сохранение чисел при его отказе |
| README и воспроизводимость | 25 | Закреплённые зависимости, команды запуска и тестирования, конфигурация AI, JSON-примеры, эталоны и отчёты проверок |
| Ценность и применимость | 15 | Понятный учебный сценарий: исследование компромисса между средним результатом, слабейшим районом и критическими дефицитами |
| Потенциал развития и оригинальность | 10 | Цикл «выбор → последствия → объяснение → пересмотр» и план проверки образовательной пользы с преподавателем |
Таблица связывает реализованные возможности с критериями оценки. Она не является прогнозом баллов жюри.
Практический вклад проекта — готовый сценарий эксперимента с едиными данными, обязательными ограничениями и воспроизводимым расчётом. Пользователь может проверить изменение своего решения без ручного переноса таблиц и подготовки отдельного запроса к AI.
После хакатона
Первый шаг — пилотное занятие с преподавателем и небольшой группой пользователей.
План проверки пользы:
- предложить сопоставимые задания до и после упражнения;
- оценить, насколько участники объясняют средний результат, положение слабейшего района и критические проблемы;
- собрать трудности использования и ошибки понимания;
- отдельно сравнить работу с AI-разбором и без него.
После подтверждения пользы можно развивать историю попыток, задания преподавателя, новые учебные кейсы и проверенные рекомендации альтернатив.
Для публичного сервиса дополнительно потребуются управление доступом, ограничения AI-запросов, контроль расходов, мониторинг и нагрузочная проверка. Интеграция реальных городских данных потребует отдельной проверки их качества, прав использования и обоснованности модели.
Потенциальные заказчики — образовательные программы и организации, проводящие обучение городскому управлению. Это гипотеза развития; внедрения и платящие клиенты пока не заявляются.
Команда HackAlem
Abdulla · Nurasyl · Nurdaulet
«Аким на пять часов» — учебный эксперимент, в котором решение можно проверить и защитить.
Авторы коммитов
История коммитов
- 2026-09-23 17:57last readmeassignment
- 2026-09-23 17:26Merge pull request #8 from BAITC-Hacks/codex/pitchabdu11aa
- 2026-09-23 17:26Merge pull request #9 from BAITC-Hacks/codex/card-heading-alignmentabdu11aa
- 2026-09-23 17:25Fix decision card headings inside bordersabdu11aa
- 2026-09-23 17:05Document hackathon pitch, demo script and jury answersabdu11aa
- 2026-09-23 16:43Merge pull request #7 from BAITC-Hacks/qa/acceptance-main-0957371Nurdau
- 2026-09-23 16:37test(qa): verify integrated main and cover M9 effectsalmanac13
- 2026-09-23 16:19Merge pull request #6 from BAITC-Hacks/codex/qa-data-auditabdu11aa
Все коммиты (24)
- 2026-09-23 16:15Add independent source dataset audit and missing effect testsabdu11aa
- 2026-09-23 16:06Merge pull request #5 from BAITC-Hacks/codex/openai-analysisabdu11aa
- 2026-09-23 16:03Refine AI explanations and record live A/B acceptanceabdu11aa
- 2026-09-23 16:03Merge remote-tracking branch 'origin/main' into codex/openai-analysisabdu11aa
- 2026-09-23 15:56updating team nameassignment
- 2026-09-23 15:31feat(ai): add validated OpenAI scenario analysisabdu11aa
- 2026-09-23 15:10Merge pull request #3 from BAITC-Hacks/nurdauletNurdau
- 2026-09-23 15:04feat(backend): implement contract v2 city simulator with validated full datasetNurdau
- 2026-09-23 14:58docs: record frontend mock test results on latest mainabdu11aa
- 2026-09-23 14:56test: prepare independent QA fixtures and readiness checklistabdu11aa
- 2026-09-23 14:52Merge pull request #2 from BAITC-Hacks/frontendalmanac13
- 2026-09-23 14:49feat(frontend): implement city budget simulator UI against API v2almanac13
- 2026-09-23 14:31docs: finalize single-app architecture and API contract v2abdu11aa
- 2026-09-23 14:25docs: define MVP requirements and API contractabdu11aa
- 2026-09-23 14:13docs: expand MVP plan, scoring rules, and demo guideabdu11aa
- 2026-09-23 13:55initial readme planassignment
Структура репозитория (45 файлов)
.env.example .gitignore README.md app/__init__.py app/ai.py app/main.py app/models.py app/prompts/analyst.txt app/simulation.py app/validator.py data/districts.json data/measures.json docs/ai.md docs/api-contract.md docs/architecture.md docs/backend.md docs/frontend.md docs/pitch.md docs/qa-acceptance-2026-09-23.md docs/qa-checklist.md docs/spec.md examples/scenario_a.json examples/scenario_b.json requirements.txt static/app.js static/demo/analysis-b.json static/demo/analysis-unavailable-b.json static/demo/config.json static/demo/error-budget.json static/demo/error-conflict.json static/demo/scenario-a.json static/demo/scenario-b.json static/demo/simulation-b.json static/index.html static/styles.css tests/conftest.py tests/frontend.cjs tests/test_ai.py tests/test_analyze_api.py tests/test_api.py tests/test_dataset_startup.py tests/test_qa_measure_effects.py tests/test_simulation.py tests/test_source_data.py tests/test_validation_order.py
Обсуждение 0 комментариев
Войдите, чтобы комментироватьПока нет комментариев — будьте первым.