О проекте
Команда: Stroit AI
Кейс HackAlem.ai: Спецтрек — Astana Innovations
Стадия: Доведённый продукт
Задача кейса: «Аким на 5 часов»: городской симулятор, распределяющий бюджет по 5 направлениям и 5 районам
Суть
Игровой симулятор Астаны на карте: 5 решений в рамках бюджета 100 у.е., объяснимый итог, AI-аким, реакция 5 000 синтетических жителей, карта жалоб из Threads, сценарии «что если» и записка руководству в PDF.
Как устроено
Детерминированный движок engine.ts считает балл по датасету кейса: проверки бюджета и конфликтов, 10 показателей по каждому району. AI-аким на OpenAI Responses API подбирает планы под цель с инструментами и структурированными ответами, без ключа работает локальный поиск замен. 5 000 агентов-жителей распределены по районам пропорционально населению из stat.gov и оценивают поддержку плана. Публикации из Threads классифицируются через Jev и привязываются к карте. Стресс-сценарии: паводок, отключение ТЭЦ, рост цен на 20%. Модуль мобильности в web worker сравнивает поездки до и после транспортных мер.
Ключевые решения
- детерминированный движок оценки
- агентная симуляция жителей
- tool calling
- web search
- стресс-тесты
- локальный поиск планов
- классификация жалоб
Метрики
План из примера: 95 у.е., 56,54 против исходных 52,56; с ЛРТ вместо чистого топлива: 100 у.е., 57,21
Особенности
Модель привязана к реальности двумя путями: 5 000 синтетических жителей, распределённых по живым данным stat.gov, и карта реальных жалоб из Threads с проверкой места. Есть публичный деплой на Cloudflare Workers и пиксельный аким, который озвучивает вывод. Сначала команда параллельно делала кейс Beeline, потом его убрала.
Стек
TypeScript · React · Vite · Express · Cloudflare Workers · Playwright · OSM
Модели
OpenAI gpt-6-luna · Jev jev-1.13.0
Проект создан за 5 часов на финале хакатона HackAlem.ai (23 сентября 2026, Астана). Код — BAITC-Hacks/hack-5caf5332-stroit-ai.
README
README.md«Аким на 5 часов» — AI-симулятор управления Астаной
Пять решений. Бюджет 100 у.е. Один город, в котором важно улучшить жизнь каждого района.
Проект команды Stroit AI для кейса Sim Astana на HackAlem AI 2026. Пользователь распределяет бюджет между городскими инициативами, видит изменения на карте и получает итоговый Astana Quality of Life Score с объяснением сильных сторон, рисков и компромиссов. Главное в проекте — симуляция горожан: 5 000 AI-жителей реагируют на каждый план, а карта жалоб из Threads привязывает модель к реальным проблемам районов.
Try this out →
Запустить локально · Пройти сценарий проверки · Техническая документация · Условия кейса

Основной игровой сценарий воспроизводится без API-ключей. Живые ответы AI и поиск публикаций подключаются отдельно. Целевой формат интерфейса — десктоп, 1440 px. Публичный сайт обновляется отдельным деплоем и может отставать от кода в репозитории.
Зачем это нужно
Развитие города требует выбора между транспортом, экологией, социальной инфраструктурой, безопасностью и городскими сервисами. При ограниченном бюджете недостаточно улучшить среднюю цифру: решение может оставить слабый район позади, снизить поддержку жителей или не выдержать роста цен.
Симулятор помогает городскому управленцу, аналитику или участнику обучения сравнить такие решения в общей модели. Все начинают с одинаковыми данными и бюджетом. Результат можно объяснить, сопоставить с другим вариантом и оформить в записку руководству.
Это прототип для исследования сценариев и обучения. Он не заменяет городское планирование, инженерные расчёты или реальный опрос жителей.
Возможности
| Возможность | Что получает пользователь |
|---|---|
| Игра на карте | Введение → брифинг → выбор пяти мер по районам → итог поверх карты. Стоимость и ограничения видны во время выбора. |
| Объяснимый итог | Балл, достижение целей, изменения десяти показателей в каждом районе, вклад мер, риски и следующая возможная замена. |
| Сравнение сценариев | До трёх сохранённых вариантов с переименованием и загрузкой. Сравнение балла, бюджета, целей, поддержки и районов; ссылка на оба плана. |
| AI-аким | Совет по замене, автопилот и подбор плана по цели: приоритеты, резерв бюджета, защита районов, обязательные и запрещённые меры. Предложение применяется по действию пользователя. На итоговом листе совет озвучивает пиксельный аким: во время проверки он рассказывает о каждом шаге, затем произносит вывод. |
| Реакция жителей | 5 000 синтетических жителей-агентов, распределённых по районам пропорционально реальному населению; один агент ≈ население города ÷ 5 000 (по живым данным stat.gov). Шесть профилей интересов в каждом районе. Расчёт поддержки и объяснение того, кому помогает план. |
| «Что если» | Паводок, отключение ТЭЦ и рост цен на 20%. Пересчёт по правилам движка с открытыми допущениями и вкладом выбранных мер. |
| Записка руководству | Один лист A4: план, стоимость, балл, цели, риски и поддержка жителей. Печать или сохранение в PDF. |
| Мобильность | Сравнение одних и тех же поездок до и после транспортных мер: время, доля автомобилей, перегрузка улиц и маршруты на карте. |
| Карта жалоб | Поиск публичных публикаций, проверка связи с Астаной и темой жалобы через Jev, привязка подтверждённого места к карте. |
| Данные города | Погода, воздух, ДТП, население и реестр районов с источниками, датами и статусом доступности. |
Демонстрация за пять минут
Для чистого старта откройте приложение в приватном окне: обычный браузер может восстановить прошлый план и три сохранённых варианта. Для проверки без платных AI-вызовов используйте локальный запуск без ключей.
- Откройте приложение и нажмите «Стать акимом». Ознакомьтесь с брифингом, при желании выберите до двух приоритетов и нажмите «Начать: район Нура».
- Нажмите на Нуру на карте. Через панель района добавьте «Школа и детсад», «Поликлиника», «Освещение и камеры», затем городскую «Платформу обращений». Для пятого решения выберите «Чистое топливо» в Сарыарке. Если нужной меры нет среди предложенных, нажмите «Все 14 мер», затем «Построить» рядом с ней.
- Нажмите «Подвести итог». Этот план стоит 95 у.е. и даёт 56,54 балла вместо исходных 52,56. Все четыре базовые цели выполнены. Тот же план доступен через «Посмотреть готовый пример» на первом экране.
- Нажмите «Сохранить как вариант», затем «Изменить план». Уберите «Чистое топливо» из корзины, откройте Нуру и постройте «ЛРТ» через «Все 14 мер». Снова подведите итог: расход станет 100 у.е., балл — 57,21. Сравнение покажет усиление транспорта Нуры и потерю улучшения экологии Сарыарки. В локальном режиме ту же замену можно применить кнопкой «Применить замену». Параметры
planиvsпозволяют передать сравнение ссылкой. - Через «Варианты» загрузите сохранённый исходный план, снова подведите итог и откройте «Что если». На этом плане рост цен на 20% увеличивает расход с 95 до 114 у.е.: приложение показывает дефицит 14 у.е. и не присваивает недопустимому плану балл.
- Нажмите «Скачать записку» и выберите в системном окне печати сохранение в PDF. Для дополнительных сценариев откройте «Мобильность», «Спросить жителей» или «AI-аким».
План сохраняется в браузере и URL. Стресс-сценарий не меняет сохранённые решения и обычный балл. Поддержка жителей в отчёте — результат модели, не социологический опрос.
Быстрый запуск
Нужен Git. Проверенная среда: Node.js 25.8.2 и npm 11.11.1. Ранние версии Node.js 22 не подходят части зависимостей в lock-файле: для ветки 22 используйте как минимум 22.20.0. Из нового каталога:
git clone https://github.com/BAITC-Hacks/hack-5caf5332-stroit-ai.git
cd hack-5caf5332-stroit-ai/akim/ui
npm ci
npm run build
npm start
Откройте http://127.0.0.1:8791. Express обслуживает собранный интерфейс и API. Сообщение OpenAI not configured ожидаемо при запуске без ключа: игра, расчёт балла, сравнение, стресс-тест, печать и мобильность работают.
Если репозиторий уже скачан, начните с cd akim/ui. Для другого порта:
API_PORT=8792 npm start
Для разработки после установки зависимостей:
npm run dev
Интерфейс: http://127.0.0.1:5173, API: http://127.0.0.1:8791. Vite проксирует /api; при смене порта API нужно обновить vite.config.ts. npm run preview показывает только статическую сборку и не заменяет API-сервер.
Интернет нужен для установки зависимостей, фоновой карты, обновления внешних данных и живых AI-функций. Основной расчёт плана не обращается к LLM.
Режимы и настройка AI
| Функция | Без ключей | С настроенными ключами |
|---|---|---|
| Балл, правила, сравнение, стресс, PDF, мобильность | Полностью доступны | Тот же детерминированный расчёт |
| Советник и автопилот | Локальный поиск допустимых замен и планов | AI использует инструменты и объясняет проверенный результат |
| Цель AI-акима | Структурированные ограничения | Дополнительно разбор цели, сформулированной словами |
| Спросить жителей | Локальная модель и шаблонные реплики | Структурированные ответы LLM по профилям жителей |
| Публичные публикации Threads | Живой поиск недоступен | Поиск через OpenAI; карта жалоб дополнительно требует Jev |
В серверном адаптере по умолчанию задана модель gpt-6-luna через OpenAI Responses API. Используются структурированные ответы, вызовы инструментов и веб-поиск. Модель можно изменить через OPENAI_MODEL, если она доступна в вашем аккаунте. Классификатор жалоб настроен на Jev jev-1.13.0.
| Переменная | Назначение |
|---|---|
OPENAI_API_KEY | Живой AI-аким, объяснения, ответы жителей и поиск публикаций |
OPENAI_MODEL | Модель OpenAI; по умолчанию gpt-6-luna |
JEV_API_KEY | Проверка жалоб и подтверждение места для карты |
API_PORT | Порт Express; по умолчанию 8791 |
API_HOST | Адрес Express; по умолчанию 127.0.0.1 |
SESSION_SECRET | Секрет подписи токенов запросов в Cloudflare Worker |
Передавайте ключи через серверное окружение из хранилища секретов. На macOS, если записи уже созданы в Keychain:
export OPENAI_API_KEY="$(security find-generic-password -s OPENAI_API_KEY -w)"
export JEV_API_KEY="$(security find-generic-password -s JEV_API_KEY -w)"
npm start
Для AI без карты жалоб достаточно первого ключа. Альтернатива — менеджер секретов или защищённый файл вне репозитория, например в ~/.secrets/ с правами 600. Не размещайте ключи в клиентских переменных VITE_*, исходниках или коммитах. После изменения окружения перезапустите сервер. Живые обращения используют квоты и тарификацию провайдеров.
При настроенном OpenAI приложение автоматически включает живой режим. Открытие итогового листа и изменение плана на нём запускают AI-советника и объяснение с контекстом городских данных и сохранённых жалоб. Это платные вызовы без отдельной кнопки запуска. В панели AI-акима или опроса можно переключиться кнопкой «Локально». Локальный балл и печатная записка от AI-ответов не зависят.
Как считается результат
Источник правил — датасет кейса, реализация — engine.ts.
- Пять игровых районов: Есиль, Алматы, Сарыарка, Байконур и Нура.
- Четырнадцать доступных мер по пяти направлениям; итоговый план содержит ровно пять уникальных мер.
- Бюджет — 100 условных единиц, не более двух мер на направление. Районные меры требуют район; городские применяются ко всему городу.
- До расчёта итога проверяются бюджет, конфликты и корректность выбора. Недопустимый план не получает итоговый балл.
- У каждого района десять индексов от 0 до 100: по два на транспорт, экологию, соцсферу, безопасность и сервисы. Чем выше индекс, тем лучше.
- Горизонт оценки — 8 кварталов. Эффекты учитывают задержку запуска:
эффект × (8 − lag) / 8. Далее добавляются синергии, показатели ограничиваются диапазоном 0–100.
Score = 0,7 × средний балл районов с весами населения
+ 0,3 × балл самого слабого района
− число показателей строго ниже 40
Балл района — взвешенная сумма его десяти индексов. Каждый показатель ниже 40 даёт штраф в один балл. Базовые цели: допустимые пять решений, прирост минимум на три балла, отсутствие ухудшения районов и уменьшение числа критических показателей.
Числа считает движок; AI анализирует и предлагает. Сервер проверяет предложенные планы и ограничения цели. Одинаковый план даёт одинаковый игровой балл; тексты и живые ответы LLM могут различаться. Локальный поиск предлагает улучшения, но не доказывает глобальный оптимум.
В стресс-тесте шок применяется после эффектов мер и синергий, перед ограничением показателей и расчётом Score. Его допущения показаны в интерфейсе и stress.ts. Вклад меры считается сравнением с тем же событием без этой меры; скрытых бонусов защиты нет.
Архитектура
flowchart LR
UI["React: карта, решения, итог"] --> Engine["Движок: правила, балл, сравнение"]
UI --> Mobility["Web Worker: маршруты и нагрузка"]
UI --> API["API: Express локально / Cloudflare Worker"]
API --> Engine
API --> OpenAI["OpenAI: объяснения, инструменты, поиск"]
API --> Jev["Jev: классификация жалоб"]
API --> Sources["Открытые городские источники"]
API --> Cache["Кеш: локальное хранилище / Cloudflare KV"]
| Часть | Технологии и ответственность |
|---|---|
| Интерфейс | React 19, TypeScript, Vite, Lucide; игровой путь и отчёты |
| Карта | Leaflet, OpenStreetMap, Canvas; жители с уровнями детализации при зуме |
| Модель | Общий TypeScript-движок для браузера и сервера, синтетическое население |
| Анализ мобильности | Web Worker, граф улиц OSM, сравнение фиксированного спроса на поездки |
| Локальный сервер | Express 5, tsx, проверка схем через Zod |
| Публичная версия | Cloudflare Worker, статические ресурсы, KV и ограничения частоты запросов |
| AI | OpenAI Responses и Jev; ключи остаются на сервере |
| Проверки | Node test runner через tsx, Playwright, TypeScript |
API
| Метод и маршрут | Назначение |
|---|---|
GET /api/health | Доступность интеграций, модель и токен для запросов |
GET /api/city | Нормализованные городские данные с датами и источниками |
GET /api/complaints | Последняя сохранённая подборка жалоб |
POST /api/ask | Реакция модели жителей на предложение или план |
POST /api/akim | Советник, автопилот или подбор по цели |
POST /api/explain | AI-объяснение результатов плана |
POST /api/threads/ingest | Поиск публичных публикаций по теме |
POST /api/complaints/ingest | Поиск, классификация и привязка жалоб к карте |
Точный контракт задают схемы запросов, клиент API и серверные обработчики. Для изменяющих запросов клиент использует X-Sim-Token, полученный через /api/health. Внешний веб-поиск запускается по действию пользователя.
Данные и ограничения модели
| Источник | Использование | Ограничение |
|---|---|---|
| Синтетический датасет | Индексы, бюджет, меры, эффекты и синергии | Сценарные допущения, не измерения реального города |
| OpenStreetMap и геопортал map.gov.kz | Подложка, улицы и границы районов | В игре пять районов; Сарайшык показан без игрового балла |
| Open-Meteo и CAMS | Погода и качество воздуха | Модельные данные; источник и дата показаны в панели |
| KGP ArcGIS | Записи ДТП за 2026 год | Выборка в ограничивающем прямоугольнике, не официальный итог по границе Астаны |
| Бюро национальной статистики | Справочные данные о населении | Датированное наблюдение, не счётчик в реальном времени |
| Публичные Threads и СМИ с цитатами | Контекст городских жалоб | Неполная индексация; AI-пересказ не подтверждает актуальность проблемы |
Для городских данных интерфейс показывает источник, дату наблюдения и статус live, cached или unavailable. Недоступный источник даёт датированный снимок либо явное отсутствие данных. Погода, воздух и внешние публикации не переписывают исходные индексы игрового движка.
Жители вымышленные; игровые профили не содержат персональных данных. Публичные публикации — отдельный источник с прямыми ссылками. Jev проверяет принадлежность к Астане, наличие жалобы, направление и место. Сомнительные результаты отделены; неподтверждённые адресные привязки не получают пинов. Пин обозначает приблизительное место улицы или района, а не домашний адрес автора.
Мобильность сравнивает фиксированные синтетические пары дом–работа внутри района. Модель не учитывает межрайонные поездки, правила одностороннего движения и реальную трассу ЛРТ. Стоимость мер — условный бюджет, не строительная смета. Стресс-события — допущения для сравнения устойчивости, не прогноз ЧП.
Проверка и воспроизводимость
Из akim/ui:
npx tsc --noEmit
npx tsc -b --noEmit
npx tsc -p tsconfig.worker.json --noEmit
npm test
npm run build
npx playwright install chromium
npx playwright test --project=desktop --reporter=line
Последний полный прогон, результаты которого приведены ниже: da0dd85, включён в main через PR #30. Результаты на 23.09.2026:
| Проверка | Результат |
|---|---|
| Unit-тесты | 61/61: правила, серверная логика, население, сравнение, стресс, мобильность и проверка жалоб |
| Playwright | 17/17: десктоп 1440 × 1000, игровой путь, панели, варианты, зум, мобильность, жалобы и печать |
| TypeScript | Приложение и Cloudflare Worker проходят проверку |
| Production build | Проходит; Vite предупреждает о размере основного JS-пакета |
| Печатная записка | PDF на одной странице A4 |
Playwright сам запускает Vite на порту 5178. API и платные AI-вызовы в браузерных проверках заменены фикстурами. Это проверка поведения приложения, а не доступности провайдеров. Живые OpenAI/Jev-вызовы в этом прогоне не выполнялись. Мобильные форматы не входили в проверку. Эти результаты относятся к указанному коммиту; более поздние изменения AI-итога и размеров жителей требуют собственного полного прогона. При повторной проверке документации на основе ff4009d отдельно выполнены чистый npm ci, npm run build и npm start: интерфейс и /api/health доступны без ключей. Контрольные цифры демо повторно проверены движком.
Проверка внешних городских источников: npm run data:check. Отдельный npx tsx server/check-jev.ts выполняет платные проверки Jev на синтетических примерах; он не входит в стандартный npm test.
Развёртывание на Cloudflare
Настройки находятся в wrangler.jsonc. Один Worker обслуживает интерфейс и /api/*. Нужны аккаунт Cloudflare, KV-пространство и серверные секреты. Для другого аккаунта создайте собственное KV командой npx wrangler kv namespace create CACHE, замените ID привязки CACHE в конфигурации и проверьте имя Worker name, чтобы выбрать нужный проект.
Из akim/ui, в нужном аккаунте:
npx wrangler login
npm run build
npx wrangler secret put OPENAI_API_KEY
npx wrangler secret put JEV_API_KEY
npx wrangler secret put SESSION_SECRET
npm run check:cloud
npm run deploy
Секреты вводятся интерактивно из вашего хранилища. Для SESSION_SECRET нужен случайный стойкий секрет. Все три переменные объявлены обязательными в текущей конфигурации. check:cloud проверяет Worker и выполняет dry-run без публикации; deploy повторно собирает приложение и публикует его. При изменении привязок обновите типы через npm run types:cloud.
После деплоя проверьте /api/health, загрузите готовый пример и пройдите сценарий выше. Локальный Express не требует Cloudflare или KV: он использует локальный кеш.
Если что-то не запускается
| Симптом | Что проверить |
|---|---|
OpenAI not configured | Основная игра доступна. Для живого AI передайте серверу ключ и перезапустите процесс. |
| Занят порт 8791 | Выберите другой API_PORT; для режима Vite также обновите адрес прокси. |
| Открывается страница, но API недоступен | Запускайте npm start после сборки или npm run dev. Один npm run preview API не поднимает. |
| Playwright не находит браузер | Выполните npx playwright install chromium. |
| AI или Jev возвращает ошибку | Проверьте серверные ключи, доступ к модели, сеть и квоты. Подробности ключей не должны попадать в клиентские логи. |
| Поиск не нашёл жалоб | Это отсутствие подходящих индексируемых результатов; оно не означает отсутствие проблем в городе. |
| Источник города недоступен | Посмотрите дату кеша и статус в «Данных города»; выполните npm run data:check. |
| Публичное демо отличается от README | Сверьте развёрнутую версию с main; для воспроизводимой проверки запустите код локально. |
Навигация по репозиторию
| Путь | Содержание |
|---|---|
| akim/tz.md | Задача и критерии оценки хакатона |
| akim/file.md | Исходные данные и правила расчёта |
| akim/ui/README.md | Подробности приложения и интеграций |
| akim/ui/src/game | Игровой путь, панель района, корзина и варианты |
| akim/ui/src/planner | Итог, сравнение, стресс-тест и печатная записка |
| akim/ui/src/engine.ts | Общий детерминированный движок |
| akim/ui/server | Express API, AI, источники и кеш |
| akim/ui/worker | Cloudflare Worker |
| akim/ui/tests | Unit- и браузерные тесты |
| akim/PROJECT.md | Концепция и направления развития; содержит также планы, а не только реализованные функции |
Команда и дальнейшее развитие
Stroit AI: Диас Халниязов — капитан, движок, API, AI-аким и деплой; Ардан — продукт, интерфейсы, проверка и документация.
Следующие направления: калибровка эффектов на городских данных, расширение районной и транспортной модели, оценка качества поиска жалоб на размеченной выборке. Это планы развития, а не заявленные возможности текущего прототипа.
Источники графики и лицензии
Карта и граф улиц: © участники OpenStreetMap, ODbL 1.0. Спрайты жителей: работа @route1rodent, CC BY-SA 3.0. Происхождение, ссылки и условия использования перечислены в ATTRIBUTION.md, MAP.md и лицензии спрайтов. Эти лицензии относятся к соответствующим ресурсам и не задают лицензию всего кода проекта.
Авторы коммитов
История коммитов
- 2026-09-23 17:49Merge pull request #41 from BAITC-Hacks/feat/report-ai-akimDias
- 2026-09-23 17:47docs(readme): centered 'Try this out' demo linkDias
- 2026-09-23 17:47chore: remove beeline case files, dummy.txt and UI promptDias
- 2026-09-23 17:43Merge pull request #40 from BAITC-Hacks/feat/report-ai-akimDias
- 2026-09-23 17:43docs(readme): 5000 resident agents and the pixel akim on the reportDias
- 2026-09-23 17:34Merge pull request #39 from BAITC-Hacks/feat/report-ai-akimDias
- 2026-09-23 17:33feat(residents): simulate 5000 agents scaled to the real populationDias
- 2026-09-23 17:33Merge pull request #37 from BAITC-Hacks/feat/report-ai-akimDias
Все коммиты (96)
- 2026-09-23 17:32Merge remote-tracking branch 'origin/feat/report-ai-akim' into HEADDias
- 2026-09-23 17:31merge: resolve conflicts with mainDias
- 2026-09-23 17:31docs: добавить GIF и видео демонстрации в READMEArdan
- 2026-09-23 17:31docs(readme): refresh screenshots and walkthrough GIF, drop unused shotsDias
- 2026-09-23 17:29feat(report): portrait-on-top layout for the pixel akimDias
- 2026-09-23 17:22Merge pull request #36 from BAITC-Hacks/feat/pixel-akimDias
- 2026-09-23 17:22feat(report): pixel-art talking akim replaces the AI loaderDias
- 2026-09-23 17:22Merge pull request #34 from BAITC-Hacks/docs/readme-productDias
- 2026-09-23 17:21feat(report): pixel-art talking akim replaces the AI loaderDias
- 2026-09-23 17:19docs: уточнить окружение, демо и автоматические AI-вызовыArdan
- 2026-09-23 17:18Merge pull request #35 from BAITC-Hacks/feat/report-ai-akimDias
- 2026-09-23 17:17feat(map): keep idle residents walking, freeze only the selected oneDias
- 2026-09-23 17:16Merge remote-tracking branch 'origin/main' into docs/readme-productArdan
- 2026-09-23 17:13Merge pull request #33 from BAITC-Hacks/feat/report-ai-akimDias
- 2026-09-23 17:12docs: полный продуктовый README для защиты Sim AstanaArdan
- 2026-09-23 17:12Merge pull request #31 from BAITC-Hacks/feat/bigger-residentsDias
- 2026-09-23 17:12feat(report): run AI akim on the report instead of local-only analysisDias
- 2026-09-23 17:12Merge pull request #32 from BAITC-Hacks/feat/prompt-cacheDias
- 2026-09-23 17:11fix(cache): hide live/cached source status from LLM contextDias
- 2026-09-23 17:08feat(map): draw simulated residents largerDias
- 2026-09-23 17:04feat(llm): add OpenAI prompt cache keys and keep agent tools stableDias
- 2026-09-23 16:54Merge pull request #30 from BAITC-Hacks/akim-v2Dias
- 2026-09-23 16:52merge: сохранить мобильность и жалобы main в игровом интерфейсеArdan
- 2026-09-23 16:47docs: актуальный запуск и проверки локальной akim-v2Ardan
- 2026-09-23 16:43feat(report): балл, цели и следующий шаг на первом экранеArdan
- 2026-09-23 16:43Merge branch 'docs/readme-akim' into akim-v2Ardan
- 2026-09-23 16:39feat(report): записка руководству на одном листе для печатиArdan
- 2026-09-23 16:38feat(game): детерминированный стресс-тест трёх событийArdan
- 2026-09-23 16:36fix(game): диалоги поверх итога и понятное сравнение вариантовArdan
- 2026-09-23 16:36Merge branch 'fix/residents-zoom' into akim-v2Ardan
- 2026-09-23 16:35fix(map): жители не пропадают после зумаArdan
- 2026-09-23 16:34research: first-time walk of Sim Astana (#21)Dias
- 2026-09-23 16:33Merge pull request #19 from BAITC-Hacks/docs/readme-akimDias
- 2026-09-23 16:31Merge branch 'akim-cleanup' into akim-v2Ardan
- 2026-09-23 16:31Merge branch 'akim-compare' into akim-v2Ardan
- 2026-09-23 16:29game: compare scenarios (saved variants, side-by-side report, ?vs= link)Ardan
- 2026-09-23 16:29chore: remove legacy shell and planner page, trim styles, rewrite READMEArdan
- 2026-09-23 16:28fix(map): жители при зуме — уровни детализации и перерисовкаArdan
- 2026-09-23 16:27research: real Astana mobility data options (#24)Dias
- 2026-09-23 16:26Merge pull request #28 from BAITC-Hacks/sim-astana-ui-20260923-135841Dias
- 2026-09-23 16:25Merge branch 'main' into docs/readme-akimDias
- 2026-09-23 16:25Resolve duplicate street aliases and verify public deploymentDias
- 2026-09-23 16:25Merge pull request #6 from BAITC-Hacks/sim-astana-ui-20260923-135841Dias
- 2026-09-23 16:21Add mobility comparison and Jev complaint mapDias
- 2026-09-23 16:20Merge branch 'akim-codex' into akim-v2Ardan
- 2026-09-23 16:19Add goal tab, Russian Threads labels and adapt live UI testsArdan
- 2026-09-23 16:17docs: README без служебной пометки о веткеArdan
- 2026-09-23 16:17Merge remote-tracking branch 'origin/sim-astana-ui-20260923-135841' into akim-v2Ardan
- 2026-09-23 16:16Merge pull request #18 from BAITC-Hacks/docs/drop-beelineDias
- 2026-09-23 16:16docs: README под единственный кейс „Аким на 5 часов"Ardan
- 2026-09-23 16:13docs: drop Beeline case, remove its docsDias
- 2026-09-23 16:11Merge branch 'main' into sim-astana-ui-20260923-135841Dias
- 2026-09-23 16:11game: entrance animations for panels and report sheetArdan
- 2026-09-23 16:10tests: marker locatorsArdan
- 2026-09-23 16:08game: district jump links, block reason casing, new desktop flow testsArdan
- 2026-09-23 16:08Merge branch 'akim-codex' into akim-v2Ardan
- 2026-09-23 16:06Add constrained goal-driven AI akim and local goal searchArdan
- 2026-09-23 16:04game: toast, reaction animations, tray labels, mobile trayArdan
- 2026-09-23 15:55wip: game shell on real map, scoped report sheet, muted OSM tilesArdan
- 2026-09-23 15:54feat(beeline): фронт под агента команды — объединённые кампании, оценки без пилотов, статусы ячеекArdan
- 2026-09-23 15:49wip: rebase onto real map, port markers and explain endpointArdan
- 2026-09-23 15:47wip: budget per file.md, plan analysis, planner page, game shell (in progress)Ardan
- 2026-09-23 15:43docs(beeline): verified data analysis report and scriptsDias
- 2026-09-23 15:43Deploy Astana simulator with real maps and public Threads evidenceDias
- 2026-09-23 15:42feat(beeline): UI работает поверх агента команды через адаптер, файлы кейса не трогаемArdan
- 2026-09-23 15:30feat(beeline): финальный снимок Codex — агент, тесты, AUDIT-CONNECTEDArdan
- 2026-09-23 15:24Merge pull request #4 from BAITC-Hacks/worktree-beeline-agentDias
- 2026-09-23 15:21feat(beeline): UI подключён к агенту через server.py + контракт auditArdan
- 2026-09-23 15:18feat(beeline): интерфейс Campaign Studio + README под два кейсаArdan
- 2026-09-23 15:09research: constraints on OpenAI call inside act() (#12)Dias
- 2026-09-23 15:09research: hidden env scoring and pilot mechanics (#11)Dias
- 2026-09-23 14:59Connect live city data, resident routines and GPT-6 Luna decisionsDias
- 2026-09-23 14:52Merge pull request #8 from BAITC-Hacks/docs/checkpoint-ardanDias
- 2026-09-23 14:52docs: README — статус работ на 15:30Ardan
- 2026-09-23 14:23Build Sim Astana interactive city decision simulatorDias
- 2026-09-23 14:19chore: record all-caps-body exception for flow.html labelsDias
- 2026-09-23 14:19chore: ignore hook cache at any depthDias
- 2026-09-23 14:19chore: drop design-hook cache files from gitDias
- 2026-09-23 14:18feat(beeline): flow dashboard for one agent runDias
- 2026-09-23 14:10Merge pull request #5 from BAITC-Hacks/feat/beeline-akimDias
- 2026-09-23 14:08docs: add Beeline and Akim case filesDias
- 2026-09-23 14:08feat(beeline): tariff campaign agent with adaptive pilots and budgeted planDias
- 2026-09-23 13:55Merge pull request #3 from BAITC-Hacks/docs/readme-ardanDias
- 2026-09-23 13:47docs: README — задача, команда, статусArdan
- 2026-09-23 13:38Merge pull request #2 from BAITC-Hacks/chore/add-dummy-fileDias
- 2026-09-23 13:37chore: add dummy fileDias
- 2026-09-23 12:41Merge pull request #1 from BAITC-Hacks/chore/claude-skillsDias
- 2026-09-23 12:37Add Claude Code skills: worktree-submodules, worktree-cleanup, ship-ui-feature, create-skillDias
Структура репозитория (152 файлов)
.claude/.DS_Store .claude/skills/create-skill/SKILL.md .claude/skills/create-skill/scripts/validate-skill.sh .claude/skills/create-skill/scripts/validate-skill.test.sh .claude/skills/ship-ui-feature/SKILL.md .claude/skills/ship-ui-feature/package-lock.json .claude/skills/ship-ui-feature/package.json .claude/skills/ship-ui-feature/playwright.config.ts .claude/skills/ship-ui-feature/scripts/capture-lock.sh .claude/skills/ship-ui-feature/scripts/capture.ts .claude/skills/ship-ui-feature/scripts/ensure-playwright.sh .claude/skills/ship-ui-feature/scripts/playwright-runtime.ts .claude/skills/ship-ui-feature/scripts/post-to-pr.ts .claude/skills/ship-ui-feature/scripts/prune-evidence-releases.ts .claude/skills/ship-ui-feature/scripts/slot-claim.sh .claude/skills/worktree-cleanup/SKILL.md .claude/skills/worktree-cleanup/scripts/audit.sh .claude/skills/worktree-cleanup/scripts/audit.test.sh .claude/skills/worktree-cleanup/scripts/check-superseded.sh .claude/skills/worktree-cleanup/scripts/check-superseded.test.sh .claude/skills/worktree-cleanup/scripts/remove-worktree.sh .claude/skills/worktree-cleanup/scripts/remove-worktree.test.sh .claude/skills/worktree-submodules/MANUAL.md .claude/skills/worktree-submodules/SKILL.md .claude/skills/worktree-submodules/scripts/create-worktree.sh .claude/skills/worktree-submodules/tests/help-output.sh .claude/skills/worktree-submodules/tests/install-dependencies.sh .env.example .gitignore README.md akim/PROJECT.md akim/file.md akim/reference/simfrancisco/NOTES.md akim/reference/simfrancisco/screenshots/1-map-loading.jpg akim/reference/simfrancisco/screenshots/2-about-modal.jpg akim/reference/simfrancisco/screenshots/2b-map-with-residents.jpg akim/reference/simfrancisco/screenshots/3-ask-box.jpg akim/reference/simfrancisco/screenshots/4-predicting.jpg akim/reference/simfrancisco/screenshots/5-poll-result.jpg akim/reference/simfrancisco/screenshots/6-sprites-zoom.png akim/reference/simfrancisco/screenshots/7-district-chatter.jpg akim/reference/simfrancisco/src/api.js akim/reference/simfrancisco/src/app.js akim/reference/simfrancisco/src/config.js akim/reference/simfrancisco/src/map.js akim/reference/simfrancisco/src/verdict.js akim/tz.md akim/ui/.env.example akim/ui/.gitignore akim/ui/README.md akim/ui/docs/ATTRIBUTION.md akim/ui/docs/MAP.md akim/ui/docs/complaints-desktop.png akim/ui/docs/mobility-desktop.png akim/ui/docs/plan.png akim/ui/docs/report.png akim/ui/docs/residents.png akim/ui/docs/stress.png akim/ui/docs/walkthrough.gif akim/ui/index.html akim/ui/package-lock.json akim/ui/package.json akim/ui/playwright.config.ts akim/ui/public/SPRITES-LICENSE.txt akim/ui/public/residents.png akim/ui/scripts/prepare-gazetteer.ts akim/ui/scripts/prepare-roads.ts akim/ui/scripts/readme-media.ts akim/ui/server/akim.ts akim/ui/server/ask.ts akim/ui/server/astana-places.json akim/ui/server/check-data.ts akim/ui/server/check-jev.ts akim/ui/server/city-data.ts akim/ui/server/complaints.ts akim/ui/server/explain.ts akim/ui/server/goal.ts akim/ui/server/index.ts akim/ui/server/jev.ts akim/ui/server/llm.ts akim/ui/server/local-store.ts akim/ui/server/locations.ts akim/ui/server/polls.ts akim/ui/server/schemas.ts akim/ui/server/storage.ts akim/ui/server/threads.ts akim/ui/src/AkimPanel.tsx akim/ui/src/AskPanel.tsx akim/ui/src/CityDataPanel.tsx akim/ui/src/CityMap.tsx akim/ui/src/ComplaintPanel.tsx akim/ui/src/MobilityPanel.tsx akim/ui/src/PlanBuilder.tsx akim/ui/src/ResidentCard.tsx akim/ui/src/ThreadsResults.tsx akim/ui/src/astana-districts.json akim/ui/src/astana-roads.json akim/ui/src/city-data.ts akim/ui/src/complaints.ts akim/ui/src/data.ts akim/ui/src/engine.ts akim/ui/src/game/DistrictPanel.tsx akim/ui/src/game/Game.tsx akim/ui/src/game/Tray.tsx akim/ui/src/game/VariantsDialog.tsx akim/ui/src/game/game.css akim/ui/src/game/labels.ts akim/ui/src/game/variants.ts akim/ui/src/geography.ts akim/ui/src/main.tsx akim/ui/src/mobility.ts akim/ui/src/mobility.worker.ts akim/ui/src/money.ts akim/ui/src/planner/Comparison.tsx akim/ui/src/planner/LeadershipMemo.tsx akim/ui/src/planner/Matrix.tsx akim/ui/src/planner/PixelMayor.tsx akim/ui/src/planner/Report.tsx akim/ui/src/planner/ScoreGauge.tsx akim/ui/src/planner/StressTest.tsx akim/ui/src/planner/analysis.ts akim/ui/src/planner/memo.css akim/ui/src/planner/pixel-mayor.css akim/ui/src/planner/planner-sheet.css akim/ui/src/planner/stress.ts akim/ui/src/population.ts akim/ui/src/profiles.ts akim/ui/src/residents-map.css akim/ui/src/residents.ts akim/ui/src/residentsLod.ts akim/ui/src/services.tsx akim/ui/src/styles.css akim/ui/src/threads.ts akim/ui/src/vite-env.d.ts akim/ui/tests/analysis-ui.spec.ts akim/ui/tests/analysis.test.ts akim/ui/tests/compare.spec.ts akim/ui/tests/engine.test.ts akim/ui/tests/flows.spec.ts akim/ui/tests/live-ui.spec.ts akim/ui/tests/planner.test.ts akim/ui/tests/population.test.ts akim/ui/tests/report.spec.ts akim/ui/tests/residentsLod.test.ts akim/ui/tests/server.test.ts akim/ui/tests/stress.test.ts akim/ui/tsconfig.json akim/ui/tsconfig.worker.json akim/ui/vite.config.ts akim/ui/worker-configuration.d.ts akim/ui/worker/index.ts akim/ui/wrangler.jsonc
Ветки (22)
Обсуждение 0 комментариев
Войдите, чтобы комментироватьПока нет комментариев — будьте первым.