AAYMA
RU
Войти

Аким на 5 часов

Учебный симулятор городского бюджета Астаны: пользователь выбирает 5 мероприятий из 14 на бюджет 100 для 5 районов, получает Astana Quality of Life…

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

О проекте

Команда: 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 — учебный индекс, а не официальный показатель или прогноз развития Астаны. Образовательная эффективность, спрос и готовность организаций использовать продукт пока не подтверждены исследованием.

Основной сценарий

  1. Открыть исходные показатели пяти районов и базовый Score 52,56.
  2. Выбрать ровно пять мероприятий и районы для локальных мер.
  3. Проверить стоимость и остаток бюджета 100.
  4. Получить понятную причину отказа, если набор нарушает правила.
  5. Рассчитать итоговый Score, изменения районов и критические показатели.
  6. Получить AI-разбор сильных сторон, рисков и основного компромисса.
  7. Изменить решение и повторить расчёт.

При изменении выбора предыдущий результат помечается как устаревший. Запоздалый ответ старой попытки не подменяет результат новой.

Объём 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 не даёт

Сервер применяет следующие правила:

  1. Стоимость набора не превышает 100.
  2. Выбрано ровно пять мероприятий.
  3. Каждое мероприятие встречается не более одного раза.
  4. Для районной меры указан существующий район.
  5. Для городской меры район отсутствует или равен null; эффект действует на все районы.
  6. В текущей версии выбрана ровно одна мера каждого из пяти направлений.
  7. Несовместимые мероприятия запрещены.
  8. Порядок решений не влияет на результат.
  9. Невалидный набор возвращает причину отказа без Score.

Известное расхождение требований. Исходный документ допускает не более двух мероприятий одного направления. Текущие API и интерфейс реализуют более строгое правило: по одной мере каждого из пяти направлений.

Поэтому исходные примеры стоимостью 95 и 61, содержащие по две меры одного направления, сейчас отклоняются с CATEGORY_COVERAGE. Перед окончательной сдачей необходимо подтвердить допустимость ужесточения у организаторов либо согласованно обновить правила, интерфейс, контракт и тесты. Полное соответствие исходному правилу пока не заявляется.

Несовместимости и синергии

Несовместимые мерыОграничение
M1 и M3Запрещены вместе независимо от района
M4 и M7Запрещены в одном районе
M5 и M13Запрещены в одном районе
Пара с синергиейФиксированный бонус
M1 + M2T1 +2 в районе M1
M10 + M12B1 +2 в районе M10
M5 + M6E2 +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

Формула учитывает средний результат города, положение слабейшего района и количество критических дефицитов.

ПоказательT1T2E1E2S1S2B1B2C1C2
Вес0.100.100.090.110.110.110.090.090.100.10
РайонДоля населенияИсходная оценка
Есиль0.2762.99
Алматы0.2457.06
Сарыарка0.2054.65
Байконур0.1356.63
Нура0.1649.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

После запуска:

Открывайте приложение без ?demo=1. Сервер одновременно обслуживает frontend и backend; отдельная сборка интерфейса не нужна. Остановка сервера — Ctrl+C.

Без AI доступны все математические расчёты. Успешный /health подтверждает работу приложения, но не доступ к OpenAI.

Подключение AI

Для живого разбора нужны API-ключ и точный ID модели, доступной этому ключу.

ПеременнаяНазначение
AI_ENABLEDtrue включает 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, город
Стоимость8383
Остаток1717
Score53.825047555.0703475
Отображение Score53,8355,07
Критические показатели после мер21
S1 Нуры после мер3848
S2 Нуры после мер3535

Изменяется только район школы M7. При переходе A → B:

  • средняя оценка города снижается с 58.485425 до 58.364425;
  • минимальная районная оценка растёт с 49.6175 до 50.7175;
  • число критических показателей уменьшается с двух до одного;
  • итоговый Score повышается на 1.2453 при той же стоимости.

Дефицит по S1 в Нуре выходит из критической зоны, но критический S2 сохраняется. Сценарий B демонстрирует компромисс и не объявляется оптимальным.

Дополнительные контрольные наборы:

ПроверкаНаборОжидаемый результат
Ровно 100M3 Нура, M6 город, M7 Нура, M10 Есиль, M12 городУспешный расчёт, остаток 0
Перерасход 107M3 Нура, 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Датасет, независимые эталоны, тесты, воспроизводимость, документация и защита

Порядок завершения проекта:

  1. Закрыть вопрос правила направлений.
  2. Синхронизировать реализацию, контракт, тесты и материалы защиты.
  3. Проверить установку, расчёты A/B и AI на презентационном ноутбуке.
  4. Подготовить слайды и подписанный резерв демонстрации.
  5. Провести полную репетицию с кликами и вопросами.
  6. Зафиксировать финальный коммит и проверить доступность материалов для жюри.

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

Соответствие критериям хакатона

КритерийВесЧто реализовано и чем подтверждается
Соответствие задаче и работоспособность25Бюджет, пять решений, меняющиеся показатели и Score, AI-разбор; демонстрация A/B и обработка недопустимых наборов. Расхождение в правиле категорий отмечено отдельно
Техническая реализация25Детерминированная модель, серверная валидация, неизменяемые данные, согласованный API, отдельный AI-адаптер и сохранение чисел при его отказе
README и воспроизводимость25Закреплённые зависимости, команды запуска и тестирования, конфигурация AI, JSON-примеры, эталоны и отчёты проверок
Ценность и применимость15Понятный учебный сценарий: исследование компромисса между средним результатом, слабейшим районом и критическими дефицитами
Потенциал развития и оригинальность10Цикл «выбор → последствия → объяснение → пересмотр» и план проверки образовательной пользы с преподавателем

Таблица связывает реализованные возможности с критериями оценки. Она не является прогнозом баллов жюри.

Практический вклад проекта — готовый сценарий эксперимента с едиными данными, обязательными ограничениями и воспроизводимым расчётом. Пользователь может проверить изменение своего решения без ручного переноса таблиц и подготовки отдельного запроса к AI.

После хакатона

Первый шаг — пилотное занятие с преподавателем и небольшой группой пользователей.

План проверки пользы:

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

После подтверждения пользы можно развивать историю попыток, задания преподавателя, новые учебные кейсы и проверенные рекомендации альтернатив.

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

Потенциальные заказчики — образовательные программы и организации, проводящие обучение городскому управлению. Это гипотеза развития; внедрения и платящие клиенты пока не заявляются.

Команда HackAlem

Abdulla · Nurasyl · Nurdaulet

«Аким на пять часов» — учебный эксперимент, в котором решение можно проверить и защитить.

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

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

abdu11aa 15assignment 6almanac13 3

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

  • 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
Ветки (9)

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

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

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