AAYMA
RU
Войти

Sim Astana («Аким на 5 часов»)

Игровой симулятор Астаны на карте: 5 решений в рамках бюджета 100 у.е., объяснимый итог, AI-аким, реакция 5 000 синтетических жителей, карта жалоб…

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

О проекте

Команда: 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 →

Запустить локально · Пройти сценарий проверки · Техническая документация · Условия кейса

Прохождение: задача, пять решений на карте, итог плана с AI-акимом

Основной игровой сценарий воспроизводится без API-ключей. Живые ответы AI и поиск публикаций подключаются отдельно. Целевой формат интерфейса — десктоп, 1440 px. Публичный сайт обновляется отдельным деплоем и может отставать от кода в репозитории.

Зачем это нужно

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

Симулятор помогает городскому управленцу, аналитику или участнику обучения сравнить такие решения в общей модели. Все начинают с одинаковыми данными и бюджетом. Результат можно объяснить, сопоставить с другим вариантом и оформить в записку руководству.

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

Возможности

ВозможностьЧто получает пользователь
Игра на картеВведение → брифинг → выбор пяти мер по районам → итог поверх карты. Стоимость и ограничения видны во время выбора.
Объяснимый итогБалл, достижение целей, изменения десяти показателей в каждом районе, вклад мер, риски и следующая возможная замена.
Сравнение сценариевДо трёх сохранённых вариантов с переименованием и загрузкой. Сравнение балла, бюджета, целей, поддержки и районов; ссылка на оба плана.
AI-акимСовет по замене, автопилот и подбор плана по цели: приоритеты, резерв бюджета, защита районов, обязательные и запрещённые меры. Предложение применяется по действию пользователя. На итоговом листе совет озвучивает пиксельный аким: во время проверки он рассказывает о каждом шаге, затем произносит вывод.
Реакция жителей5 000 синтетических жителей-агентов, распределённых по районам пропорционально реальному населению; один агент ≈ население города ÷ 5 000 (по живым данным stat.gov). Шесть профилей интересов в каждом районе. Расчёт поддержки и объяснение того, кому помогает план.
«Что если»Паводок, отключение ТЭЦ и рост цен на 20%. Пересчёт по правилам движка с открытыми допущениями и вкладом выбранных мер.
Записка руководствуОдин лист A4: план, стоимость, балл, цели, риски и поддержка жителей. Печать или сохранение в PDF.
МобильностьСравнение одних и тех же поездок до и после транспортных мер: время, доля автомобилей, перегрузка улиц и маршруты на карте.
Карта жалобПоиск публичных публикаций, проверка связи с Астаной и темой жалобы через Jev, привязка подтверждённого места к карте.
Данные городаПогода, воздух, ДТП, население и реестр районов с источниками, датами и статусом доступности.

Демонстрация за пять минут

Для чистого старта откройте приложение в приватном окне: обычный браузер может восстановить прошлый план и три сохранённых варианта. Для проверки без платных AI-вызовов используйте локальный запуск без ключей.

  1. Откройте приложение и нажмите «Стать акимом». Ознакомьтесь с брифингом, при желании выберите до двух приоритетов и нажмите «Начать: район Нура».
  2. Нажмите на Нуру на карте. Через панель района добавьте «Школа и детсад», «Поликлиника», «Освещение и камеры», затем городскую «Платформу обращений». Для пятого решения выберите «Чистое топливо» в Сарыарке. Если нужной меры нет среди предложенных, нажмите «Все 14 мер», затем «Построить» рядом с ней.
  3. Нажмите «Подвести итог». Этот план стоит 95 у.е. и даёт 56,54 балла вместо исходных 52,56. Все четыре базовые цели выполнены. Тот же план доступен через «Посмотреть готовый пример» на первом экране.
  4. Нажмите «Сохранить как вариант», затем «Изменить план». Уберите «Чистое топливо» из корзины, откройте Нуру и постройте «ЛРТ» через «Все 14 мер». Снова подведите итог: расход станет 100 у.е., балл — 57,21. Сравнение покажет усиление транспорта Нуры и потерю улучшения экологии Сарыарки. В локальном режиме ту же замену можно применить кнопкой «Применить замену». Параметры plan и vs позволяют передать сравнение ссылкой.
  5. Через «Варианты» загрузите сохранённый исходный план, снова подведите итог и откройте «Что если». На этом плане рост цен на 20% увеличивает расход с 95 до 114 у.е.: приложение показывает дефицит 14 у.е. и не присваивает недопустимому плану балл.
  6. Нажмите «Скачать записку» и выберите в системном окне печати сохранение в 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 и ограничения частоты запросов
AIOpenAI 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/explainAI-объяснение результатов плана
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: правила, серверная логика, население, сравнение, стресс, мобильность и проверка жалоб
Playwright17/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/serverExpress API, AI, источники и кеш
akim/ui/workerCloudflare Worker
akim/ui/testsUnit- и браузерные тесты
akim/PROJECT.mdКонцепция и направления развития; содержит также планы, а не только реализованные функции

Команда и дальнейшее развитие

Stroit AI: Диас Халниязов — капитан, движок, API, AI-аким и деплой; Ардан — продукт, интерфейсы, проверка и документация.

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

Источники графики и лицензии

Карта и граф улиц: © участники OpenStreetMap, ODbL 1.0. Спрайты жителей: работа @route1rodent, CC BY-SA 3.0. Происхождение, ссылки и условия использования перечислены в ATTRIBUTION.md, MAP.md и лицензии спрайтов. Эти лицензии относятся к соответствующим ресурсам и не задают лицензию всего кода проекта.

Звёзды
⭐ 1
Форки
0
Язык
TypeScript
Последний push
в прошлом месяце
Коммиты
96
Авторы
3
Файлы
152
Ветки
22

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

Ardan 39Dias 34Dias 23

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

  • 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 комментариев

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

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