AAYMA
RU
Войти

Fifth Move

Streamlit-симулятор городского бюджета: пользователь выбирает 5 инициатив из 14 для 5 районов Астаны в пределах 100 у.е., движок считает Astana…

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

О проекте

Команда: Turtle
Кейс HackAlem.ai: Спецтрек — Astana Innovations
Стадия: Доведённый продукт

Задача кейса: «Аким на 5 часов»: городской симулятор, распределяющий бюджет по 5 направлениям и 5 районам

Суть

Streamlit-симулятор городского бюджета: пользователь выбирает 5 инициатив из 14 для 5 районов Астаны в пределах 100 у.е., движок считает Astana Quality of Life Score, LLM объясняет результат на русском.

Как устроено

Районы, меры и правила загружаются из JSON; валидатор проверяет бюджет, количество, повторы, лимит направлений и несовместимые пары мер. Движок применяет эффекты с лагом (эффект × (8−лаг)/8 на горизонте 8 кварталов), три синергии, clip 0–100 и считает Score = 0.7·D_avg + 0.3·min(D_d) − N_crit. Подготовленный контекст уходит в OpenAI Chat Completions; ответ проверяется по схеме, числовые факты подставляются из расчёта, при ошибке показывается резервное объяснение.

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

  • rule-based валидация
  • лаги эффектов
  • синергии мер
  • взвешенный Score со штрафом за критические значения
  • JSON Schema проверка ответа LLM
  • fallback-объяснение
  • Streamlit AppTest
  • pytest

Особенности

Числа считает только Python-движок, LLM лишь интерпретирует готовый результат; ответ модели валидируется, числа подставляются из расчёта. Формула Score учитывает слабейший район и штрафует за каждое значение ниже 40, чтобы нельзя было выиграть только за счёт среднего. UI покрыт тестами Streamlit AppTest.

Стек

Python · Streamlit · OpenAI Python SDK · JSON · pytest · Render

Модели

gpt-4o-mini · gpt-4.1-mini · gpt-4.1


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

README

README.md

Fifth Move — симулятор городских решений

AI-симулятор управления городским бюджетом для спецтрека Astana Innovations на HackAlem AI.

Пять районов, 14 инициатив, бюджет 100 условных единиц и ровно пять решений. Пользователь распределяет средства, видит изменения городских показателей и получает Astana Quality of Life Score с объяснением выбранного сценария.

Числа рассчитывает Python-движок. AI интерпретирует готовый результат.

Проект Fifth Move реализует кейс «Аким на 5 часов» спец-трека Astana Innovations.

О проекте

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

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

В проекте используется синтетический датасет с названиями районов Астаны. Результат симуляции не является прогнозом реального развития города.

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

  • Выбор пяти инициатив из каталога: для районной меры выбирается район, городская действует на весь город.
  • Обзор исходных районов: карточки показывают долю населения, синтетический профиль и стартовые критические показатели; полная матрица значений раскрывается отдельно из датасета.
  • Контроль правил: стоимость и остаток бюджета, повторы, направления, корректность районов и несовместимость мер. Невалидный набор не получает Score; интерфейс показывает причину.
  • Расчёт эффектов: лаги реализации, три синергии, ограничение показателей диапазоном 0–100. Исходные данные сохраняются неизменными.
  • Панель результата: итоговый Score и изменение относительно базы, средний балл города, слабейший район, число критических значений.
  • Таблицы: баллы всех районов, показатели выбранного района до и после, сработавшие синергии.
  • AI-объяснение на русском: улучшения, оставшиеся проблемы и компромиссы. В интерфейсе доступны gpt-4o-mini, gpt-4.1-mini, gpt-4.1 и модель из настройки окружения.
  • Резервное объяснение: при отсутствии ключа, ошибке API или непрошедшем проверку ответе. Есть отдельный демонстрационный режим «Показать работу без AI».
  • Удобство интерфейса: заметный индикатор расхода виртуального бюджета, различие между районными и городскими мерами, единая светлая тема с синим акцентом, оригинальный SVG-логотип, компактная сводка результата и шкалы баллов районов. Короткие анимации отключаются при системной настройке уменьшения движения.
  • Автотесты движка, AI-интеграции и интерфейса через Streamlit AppTest.

При изменении выбранных решений прежний расчёт и объяснение сбрасываются: пользователь рассчитывает новый сценарий явно.

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

  1. Приложение загружает районы, каталог мер и правила из data/*.json.
  2. Пользователь выбирает пять инициатив и районы для районных мер. Счётчик показывает стоимость и остаток бюджета.
  3. По кнопке «Рассчитать сценарий» валидатор проверяет набор. При нарушении правила расчёт останавливается.
  4. Движок применяет эффекты с учётом лагов, добавляет синергии, ограничивает значения и рассчитывает районные баллы и итоговый Score.
  5. Интерфейс показывает результат и таблицы изменений.
  6. По кнопке «Получить AI-объяснение» подготовленный контекст отправляется в OpenAI. Приложение проверяет формат ответа и добавляет числовые факты из расчёта. При ошибке отображается подписанный резервный текст.

Правила выбора

ПравилоУсловие
БюджетСтоимость не более 100 у.е.; ровно 100 допустимо
КоличествоРовно 5 решений
ПовторыКаждый ID можно выбрать только один раз
НаправленияНе более 2 мер одного направления
Районная мераОбязателен один существующий район
Городская мераРайон не указывается; эффект действует во всех пяти районах
M1 и M3Несовместимы при любом размещении
M4 и M7; M5 и M13Несовместимы только при выборе одного и того же района

Все пять направлений доступны в каталоге, но выбирать по одной мере каждого направления не требуется. Остаток бюджета не добавляет бонус к Score. Порядок решений не влияет на результат.

Формула и синергии

Горизонт модели — 8 кварталов. Лаг задаёт задержку начала действия меры:

реализованный эффект = полный эффект × (8 − лаг) / 8
новый показатель = clip(исходное значение + сумма эффектов + синергии, 0, 100)

D_d    = сумма показателей района с весами
D_avg  = сумма районных баллов с весами по доле населения
N_crit = число пар «район × показатель» со значением строго ниже 40

Score = 0.7 × D_avg + 0.3 × min(D_d) − N_crit

Участие слабейшего района в формуле не позволяет оценивать сценарий только по среднему. Каждое критическое значение уменьшает результат на один балл; значение ровно 40 критическим не считается.

Выбранная параДополнительный эффект
M1 + M2T1 +2 в районе M1
M10 + M12B1 +2 в районе M10
M5 + M6E2 +2 в районе M5

Бонусы фиксированы и не уменьшаются лагом. Ограничение 0–100 применяется после суммирования эффектов и бонусов. В таблице изменений синергия уже включена в итоговую дельту.

Технологии

КомпонентИспользование в проекте
Python 3.10+Валидация, расчёты, подготовка контекста, обработка ответа
StreamlitВеб-интерфейс, формы выбора, метрики, таблицы, состояние сессии
OpenAI Python SDKВызов OpenAI Chat Completions API
gpt-4o-miniМодель по умолчанию в коде
gpt-4.1-mini, gpt-4.1Дополнительные варианты выбора в интерфейсе
JSON / JSON SchemaЛокальные исходные данные и структура ответа модели
pytest, unittest.mock, Streamlit AppTestАвтоматические проверки, в том числе с подменой ответов API
Git / GitHubХранение исходного кода в репозитории команды

Проверенные версии основных зависимостей: Streamlit 1.64.0, OpenAI SDK 3.19.0, pytest 9.1.1; среда проверки — Python 3.14.7. Они зафиксированы в requirements-tested.txt. Общие нижние границы версий находятся в requirements.txt.

Выбор модели не подтверждает наличие доступа к ней у конкретного API-ключа. В проекте нет отдельного REST-сервера или базы данных: интерфейс и расчётные модули работают в Python-процессе Streamlit.

Архитектура

flowchart TD
    UI[Streamlit: выбор решений] --> ENGINE[Валидация и расчёт эффектов]
    DATA[Локальные JSON-данные] --> ENGINE
    ENGINE --> RESULT[Score, изменения и синергии]
    RESULT --> VIEW[Метрики и таблицы в интерфейсе]
    RESULT --> CONTEXT[Подготовка AI-контекста и промпта]
    CONTEXT --> API[OpenAI API]
    API --> CHECK[Проверка ответа и вывод объяснения]
    API -->|Ошибка| FALLBACK[Локальное резервное объяснение]
    CONTEXT -->|Нет ключа или режим без AI| FALLBACK
    CHECK -->|Ответ не прошёл проверку| FALLBACK

Основные файлы:

data/
  districts.json          районы, показатели и доли населения
  initiatives.json        14 мер: типы, цены, лаги и эффекты
  rules.json              бюджет, веса, синергии и контрольные значения
engine/
  scoring.py              validate_decisions → apply_effects → compute_score; run
  changes.py              изменения показателей, синергии и вклады мер
  test_*.py               проверки правил, эффектов и Score
frontend/
  app.py                  точка входа Streamlit и сборка сценария
  selection.py            выбор мер, районов и отображение бюджета
  result.py               Score, среднее, слабейший район и баллы районов
  changes.py              таблицы изменений и синергий
  theme.py                визуальная тема и адаптивные стили
  test_app.py             командные проверки интерфейса
  test_ardak_ui.py        проверки исходных районных данных и выбора решений
ai/
  context.py              подготовка контекста из данных и результатов
  prompt.py               инструкции модели и отбор передаваемых полей
  explain.py              API-вызов, настройки и резервное объяснение
  response.py             проверка ответа и подстановка числовых фактов
  test_*.py               проверки промпта, ответа и интеграции
tools/
  check_ai.py             ручная проверка живых ответов выбранных моделей
  demo.py                 тесты, контрольный сценарий и запуск одной командой
docs/
  SPEC_CHECK.md           проверка соответствия заданию
requirements.txt          основные зависимости
requirements-tested.txt   проверенные версии основных зависимостей

Движок не зависит от OpenAI: сбой объяснения не меняет рассчитанный Score. Состояние текущего сценария хранится в st.session_state. Числовые расчёты сохраняют полную точность; округление выполняется для отображения и AI-контекста.

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

1. Получить исходный код

Нужны Git, Python 3.10 или новее и доступ к репозиторию команды. Репозиторий приватный: для клонирования может потребоваться авторизация в GitHub.

git clone https://github.com/BAITC-Hacks/hack-fa5087f9-turtle.git
cd hack-fa5087f9-turtle

Все последующие команды выполняются из корня проекта.

2. Создать виртуальное окружение

macOS / Linux:

python3 -m venv .venv
source .venv/bin/activate

Windows PowerShell:

py -3 -m venv .venv
.\.venv\Scripts\Activate.ps1

3. Установить зависимости

Для версий основных библиотек, использованных при проверке:

python -m pip install -r requirements-tested.txt

Также доступен python -m pip install -r requirements.txt, который разрешает более новые версии зависимостей. Файл requirements-tested.txt фиксирует основные библиотеки, но не является полным списком закреплённых транзитивных зависимостей.

4. Настроить AI — необязательно для расчёта

Расчёт и резервное объяснение работают без API-ключа. Для ответа модели создайте .env в корне проекта.

В редакторе создайте файл с именем .env рядом с README.md и добавьте:

OPENAI_API_KEY=ваш_ключ_OpenAI
OPENAI_MODEL=gpt-4o-mini

Настройки можно передать и через переменные окружения; они имеют приоритет над .env. Файл .env исключён из Git. Настоящий ключ не нужно добавлять в исходный код или README.

Для живого AI нужны интернет и ключ с доступом к выбранной модели. После изменения .env перезапустите приложение. Модель для следующего запроса можно переключить непосредственно в интерфейсе. Смена модели сбрасывает прежнее объяснение, но сохраняет Score и таблицы; новый ответ запрашивается кнопкой. Автоматического переключения на другую модель нет.

Предлагаемые варианты используют один OpenAI API-ключ. Их совместимость с Chat Completions и структурированным ответом описана в официальной документации: GPT-4.1 mini, GPT-4.1. Качество и время ответа на нашем сценарии нужно сравнивать живыми запросами; доступность зависит от проекта ключа.

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

Проверить тесты и контрольный сценарий, затем открыть приложение:

python -m tools.demo

Для проверки настоящего AI перед запуском добавьте --live-ai. Это запрос к модели из .env; если ответ не прошёл проверку, допускается одна попытка переформулировать его. Максимум два запроса расходуют API-токены. При ошибке появится причина и резервный ответ, а приложение всё равно запустится. Только проверка без веб-сервера: python -m tools.demo --check-only. Проверка конкретной модели: python -m tools.demo --check-only --live-ai --model gpt-4.1-mini.

Прямой запуск без предварительных тестов:

python -m streamlit run frontend/app.py

Откройте http://localhost:8501 либо адрес, указанный Streamlit в терминале. Терминал должен оставаться открытым. Остановка приложения — Ctrl+C.

Если браузер сообщает ERR_CONNECTION_REFUSED, проверьте, что процесс Streamlit запущен и в терминале нет ошибки. Если порт занят, используйте другой:

python -m streamlit run frontend/app.py --server.port 8502

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

Контрольный сценарий для жюри

При первом открытии интерфейса уже выбран следующий набор:

МераРазмещениеСтоимость, у.е.
M7 — школа и детсадНура24
M8 — центр семейного здоровья / поликлиникаНура20
M10 — освещение и камерыНура12
M12 — цифровая платформа обращенийВесь город, район не выбирается14
M5 — переход на чистое топливоСарыарка25
Всего95
  1. Нажмите «Рассчитать сценарий».
  2. Сопоставьте результат с таблицей ниже.
  3. Откройте изменения Нуры и таблицу сработавших синергий.
  4. Нажмите «Получить AI-объяснение». При настроенном и доступном API появится AI-комментарий с названием модели. Иначе будет явно подписанное резервное объяснение.
ПроверкаОжидаемый результат
Стоимость / остаток95 / 5 у.е.
Итоговый Score56.54; до округления 56.54307
Изменение Score к базе+3.99
Средний балл города58.08
Слабейший районНура
Критических значений0
СинергияM10 + M12 → B1 +2 в Нуре
Изменения НурыS1 +10, S2 +8.75, B1 +12.5, B2 +1.75, C2 +4.375
Изменения СарыаркиE2 +8.75, C1 +2.5, C2 +4.375
Эффект M12 во всех районахC2 +4.375, на экране +4.38

Базовый Score — 52.55768, на экране 52.56. Дельта считается до округления: 56.54307 − 52.55768 = 3.98539, поэтому отображается +3.99. Полная дельта B1 +12.5 уже включает синергию +2.

Дополнительные проверки в интерфейсе

  • Отказ AI (проверка устойчивости): раскройте «Настройки объяснения», включите «Показать работу без AI» и снова запросите объяснение. API не вызывается; Score и три таблицы остаются, текст подписан как резервный. После проверки снимите отметку.
  • Изменение решения: замените M5 на M11 в Сарыарке. Старый результат исчезнет; после нового расчёта Score станет 56.48.
  • Превышение бюджета: выберите M3/Есиль, M5/Сарыарка, M8/Нура, M12/город и M10/Алматы. Стоимость составит 101, расчёт должен быть заблокирован.
  • Повтор меры: во втором решении выберите M7 вместо M8. Интерфейс сообщит «Мероприятие M7 выбрано больше одного раза», Score не рассчитывается.
  • Несовместимость: выберите M1/Есиль, M3/Нура, M9/Сарыарка, M10/Алматы и M12/город. Стоимость 84, но M1/M3 несовместимы, поэтому Score не рассчитывается.

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

python -m pytest -q

Для версии, на которой подготовлен этот README, результат — 110 пройденных тестов. Проверяются контрольные числа, бюджет, несовместимости, лаги всех 14 мер, три синергии, городские эффекты, границы 0–100, неизменность исходных данных, все 120 перестановок контрольного набора, AI-ответы, проверка ответов модели, сохранение результатов в интерфейсе при отказе API и использование районного датасета в интерфейсе.

Точечная проверка эффектов, синергий и передачи рассчитанных чисел в AI-контекст:

python -m pytest engine/test_effects.py engine/test_spec_audit.py ai/test_prompt.py ai/test_integration.py -q

Эта группа тестов проверяет лаги всех 14 мер, районные и городские эффекты, три синергии, итоговые дельты показателей и запрет на самостоятельный расчёт чисел языковой моделью.

Служебный вызов run([]) вычисляет базовый Score без мер. Это отдельный режим для сравнения и тестов: пустой набор не становится допустимым игровым решением.

Для проверки реальных запросов к трём моделям:

python -m tools.check_ai --models gpt-4o-mini gpt-4.1-mini gpt-4.1

Команда выводит ответ, длительность запроса и статус «ЖИВОЙ AI» или «РЕЗЕРВНЫЙ ОТВЕТ». Она расходует API-токены; если хотя бы одна модель возвращает резервный ответ, команда завершается с кодом 1. Автотесты используют подменённые ответы и не подтверждают доступ к живому API.

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

Источники расчёта — три файла в репозитории:

ФайлСодержимое
data/districts.jsonЕсиль, Алматы, Сарыарка, Байконур, Нура; доли населения и десять показателей каждого района
data/initiatives.jsonКаталог из 14 мер с направлениями, типами, ценами, лагами и полными эффектами
data/rules.jsonБюджет, горизонт, веса, порог критичности, несовместимости, синергии и контрольные сценарии
НаправлениеПоказатели
ТранспортT1 — разгрузка дорог; T2 — доступность общественного транспорта
ЭкологияE1 — озеленение; E2 — качество воздуха
Социальная сфераS1 — школы и детсады; S2 — поликлиники
БезопасностьB1 — безопасность улиц; B2 — безопасность дорожного движения
Городские сервисыC1 — надёжность ЖКХ; C2 — скорость решения обращений

Все показатели имеют шкалу 0–100, где больше — лучше. Их изменения измеряются в баллах модели.

OpenAI API используется только для текстового объяснения. В запрос передаются выбранные меры, стоимость и остаток бюджета, лаги, итоговые показатели, изменения и синергии. Вклады отдельных мер передаются после учёта лага и отдельно от итоговых дельт. Исходные эффекты каталога до лага исключаются из списка выбранных мер в промпте. Для объяснения код выделяет крупнейшие положительные изменения и передаёт понятные названия показателей; неизменность показателя не рассматривается как доказательство проблемы.

Ответ запрашивается по JSON-схеме с тремя текстовыми разделами. Приложение подставляет числовые факты из расчёта, отклоняет некорректную структуру, числовые утверждения в комментариях и некоторые явные противоречия переданным данным. Коды выбранных мер и показателей из контекста разрешены как ссылки на данные. Если полный ответ отклонён, приложение один раз просит модель переформулировать его с указанием причины; повторно некорректный ответ заменяется резервным. Каждый вызов API ограничен таймаутом 20 секунд; сетевые повторы SDK отключены.

Интеграций с городскими информационными системами, датчиками или внешними источниками статистики в текущей версии нет. Для локального расчёта после установки зависимостей внешние сервисы не нужны.

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

  • Синтетическая модель: фиксированные цены, эффекты, веса и горизонт не описывают всю сложность реального городского управления.
  • Фиксированный каталог: интерфейс не поддерживает загрузку собственного датасета или редактирование правил.
  • Один текущий сценарий: нет постоянного хранения истории, таблицы результатов команд, авторизации или отдельного экрана сравнения сохранённых сценариев.
  • Нет поиска оптимального набора: приложение оценивает выбор пользователя. Автоматический подбор мер и моделирование случайных городских событий не реализованы.
  • AI зависит от внешнего API: возможны ошибки ключа, доступа, лимитов и сети. Резервное объяснение формируется локально и не выдаётся за ответ модели.
  • Проверка текста не гарантирует смысловую безошибочность AI. Модель может неточно интерпретировать факты даже при корректном формате; результат требует содержательной проверки.
  • Границы воспроизводимости: в отчёте проверки зафиксированы локальные автотесты и проверенные версии. На компьютере команды подтверждены запуск Streamlit и живой ответ GPT-4o mini. Свежая установка через интернет в ограниченной среде проверки не выполнялась; доступ к остальным моделям отдельно не подтверждён.

Развёртывание на Render

В репозитории есть render.yaml с настройками веб-сервиса: проверенные зависимости, Python 3.14.7, порт из окружения и проверка здоровья Streamlit. Приложение запускается из корня репозитория.

  1. В Render выберите New → Blueprint, подключите GitHub-репозиторий команды BAITC-Hacks/hack-fa5087f9-turtle и ветку main.
  2. Render прочитает render.yaml. Для OPENAI_API_KEY введите рабочий ключ в закрытое поле сервиса. В Git ключ не добавляется. OPENAI_MODEL уже задан как gpt-4o-mini.
  3. Проверьте настройки и запустите развёртывание. Дождитесь статуса Live.
  4. Откройте выданную Render ссылку, рассчитайте контрольный набор и запросите объяснение. Проверьте Score 56.54, стоимость 95, синергию M10 + M12 и отсутствие подписи резервного ответа.

Если сервис создаётся вручную через New → Web Service, используйте:

ПолеЗначение
RepositoryBAITC-Hacks/hack-fa5087f9-turtle
Branchmain
Language / RuntimePython 3
Root Directoryоставить пустым
Build Commandpip install -r requirements-tested.txt
Start Commandpython -m streamlit run frontend/app.py --server.address 0.0.0.0 --server.port $PORT --server.headless true
Health Check Path/_stcore/health
EnvironmentPYTHON_VERSION=3.14.7, OPENAI_MODEL=gpt-4o-mini, OPENAI_API_KEY — секретное значение

Сокомандникам не нужны локальные ключи для работы через общий сайт: запросы к OpenAI отправляет сервер Render. Локальные копии проекта по-прежнему требуют собственного окружения. Наличие ключа не гарантирует доступ к API: возможны ограничения баланса, прав или сети. Причина резервного ответа выводится в его начале.

Конфигурация использует тариф Free. Доступность и ограничения тарифа проверяются в Render при создании сервиса. Секреты задаются через переменные окружения Render; настройки описаны в документации Blueprint.

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

Публичная ссылка на развёрнутое приложение в текущем репозитории не указана. Для проверки используйте инструкцию локального запуска выше. localhost:8501 — адрес приложения на компьютере, где запущен Streamlit, а не публичная демоверсия.

Репозиторий команды: BAITC-Hacks/hack-fa5087f9-turtle.

Команда

УчастницаЗона ответственности
АрдакВыбор решений, валидация, бюджет, подготовка AI-контекста
АйсанаЭффекты, лаги, синергии, изменения районов и содержание промпта
ТомирисScore, сборка сценария, панель результата, AI-интеграция и резервный режим
Звёзды
⭐ 0
Форки
0
Язык
Python
Последний push
в прошлом месяце
Коммиты
59
Авторы
4
Файлы
40
Ветки
1

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

tmrszh 24icyaa06 19ghoulvon 15ghoulvon 1

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

  • 2026-09-23 17:50feat: brand Fifth Move with unified colors, logo and subtle motiontmrszh
  • 2026-09-23 17:40Merge branch 'main' of https://github.com/BAITC-Hacks/hack-fa5087f9-turtleicyaa06
  • 2026-09-23 17:40Record verified live GPT-4.1 resulticyaa06
  • 2026-09-23 17:38style: simplify typography and organize simulator content for readabilitytmrszh
  • 2026-09-23 17:37docs: add duplicate-measure check to README UI scenariosghoulvon
  • 2026-09-23 17:29style: keep initiative prices compact across screen sizestmrszh
  • 2026-09-23 17:26docs: mention API-failure UI check in README test listghoulvon
  • 2026-09-23 17:24feat: refine city dashboard and prepare Render deploymenttmrszh
Все коммиты (59)
  • 2026-09-23 17:21Document targeted effects verificationicyaa06
  • 2026-09-23 17:08fix: focus AI explanations and finalize checks without defense materialstmrszh
  • 2026-09-23 17:03feat: polish Ardak city simulator dashboardghoulvon
  • 2026-09-23 16:58fix: accept valid AI explanations and retry rejected wording oncetmrszh
  • 2026-09-23 16:49Merge branch 'main' of https://github.com/BAITC-Hacks/hack-fa5087f9-turtleicyaa06
  • 2026-09-23 16:49fix: address review feedback and extract result paneltmrszh
  • 2026-09-23 16:48Document complete control scenario effectsicyaa06
  • 2026-09-23 16:46feat: finish AI model selection and verified demo launchtmrszh
  • 2026-09-23 16:34docs: write jury-ready Russian README and remove environment templatetmrszh
  • 2026-09-23 16:30feat: read city-wide incompatible pairs from rulesghoulvon
  • 2026-09-23 16:25Complete grounded AI integration, spec audit and Tomiris demo materialstmrszh
  • 2026-09-23 16:23Merge branch 'main' of https://github.com/BAITC-Hacks/hack-fa5087f9-turtleicyaa06
  • 2026-09-23 16:16Harden grounded AI explanationsicyaa06
  • 2026-09-23 15:57test: match filtered contribution exactlytmrszh
  • 2026-09-23 15:57fix: send only final engine facts to AItmrszh
  • 2026-09-23 15:55fix: round AI context for displaytmrszh
  • 2026-09-23 15:52fix: keep AI explanation groundedtmrszh
  • 2026-09-23 15:46test: isolate missing OpenAI key casetmrszh
  • 2026-09-23 15:45feat: load OpenAI settings from local envtmrszh
  • 2026-09-23 15:43Prevent AI metric mislabelingicyaa06
  • 2026-09-23 15:25Merge branch 'main' of https://github.com/BAITC-Hacks/hack-fa5087f9-turtleicyaa06
  • 2026-09-23 15:24Align synergy data across engine UI and AIicyaa06
  • 2026-09-23 15:22feat: include synergies in AI fallbacktmrszh
  • 2026-09-23 15:16docs: attribute simulator module ownershipghoulvon
  • 2026-09-23 15:13fix: open results on the weakest districtghoulvon
  • 2026-09-23 15:11feat: integrate grounded AI explanation and result viewghoulvon
  • 2026-09-23 15:01Merge remote-tracking branch 'origin/main'ghoulvon
  • 2026-09-23 14:59my commit at 14:49ghoulvon
  • 2026-09-23 14:58Merge branch 'main' of https://github.com/BAITC-Hacks/hack-fa5087f9-turtleicyaa06
  • 2026-09-23 14:56Add grounded AI explanation prompticyaa06
  • 2026-09-23 14:53test: verify integrated simulation payloadtmrszh
  • 2026-09-23 14:51feat: show score delta and district resultstmrszh
  • 2026-09-23 14:51feat: expose complete simulation resulttmrszh
  • 2026-09-23 14:46Merge branch 'main' of https://github.com/BAITC-Hacks/hack-fa5087f9-turtleicyaa06
  • 2026-09-23 14:46Add district changes view and synergy detailsicyaa06
  • 2026-09-23 14:43fix: show confirmed synergy in result viewghoulvon
  • 2026-09-23 14:31Merge branch 'main' of https://github.com/BAITC-Hacks/hack-fa5087f9-turtleicyaa06
  • 2026-09-23 14:31Implement initiative effects with lag and synergiesicyaa06
  • 2026-09-23 14:30test: cover score breakdown and critical thresholdtmrszh
  • 2026-09-23 14:29feat: implement quality of life score calculationtmrszh
  • 2026-09-23 14:25docs: rewrite project READMEtmrszh
  • 2026-09-23 14:20feat: enrich simulator decision contextghoulvon
  • 2026-09-23 14:14feat: improve decision selection flowghoulvon
  • 2026-09-23 14:07Merge remote-tracking branch 'origin/main'ghoulvon
  • 2026-09-23 14:05feat: connect decision selection and AI contextghoulvon
  • 2026-09-23 14:01ghoulvon
  • 2026-09-23 14:00Merge branch 'main' of https://github.com/BAITC-Hacks/hack-fa5087f9-turtleicyaa06
  • 2026-09-23 14:00Add simulator validation rulesicyaa06
  • 2026-09-23 13:33chore: scaffold "Акым на 5 часов" project — data, engine/AI/frontend skeletontmrszh
  • 2026-09-23 10:41Delete .env.exampleghoulvon
  • 2026-09-22 17:16chore: add environment setupicyaa06
Структура репозитория (40 файлов)
.gitignore
.streamlit/config.toml
README.md
ai/context.py
ai/explain.py
ai/prompt.py
ai/response.py
ai/test_explain.py
ai/test_focus.py
ai/test_integration.py
ai/test_prompt.py
ai/test_response_guard.py
ai/test_settings.py
config/simulation_rules.json
data/districts.json
data/initiatives.json
data/rules.json
docs/FINAL_HANDOFF.md
docs/SPEC_CHECK.md
docs/TOMIRIS_DEFENSE.md
docs/tomiris-slide.pptx
engine/changes.py
engine/scoring.py
engine/test_effects.py
engine/test_scoring.py
engine/test_spec_audit.py
engine/test_validation.py
frontend/app.py
frontend/changes.py
frontend/favicon.svg
frontend/result.py
frontend/selection.py
frontend/test_app.py
frontend/test_ardak_ui.py
frontend/theme.py
render.yaml
requirements-tested.txt
requirements.txt
tools/check_ai.py
tools/demo.py

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

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

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