О проекте
Команда: Bolme
Кейс HackAlem.ai: Спецтрек — Astana Innovations
Стадия: Доведённый продукт
Задача кейса: «Аким на 5 часов»: городской симулятор, распределяющий бюджет по 5 направлениям и 5 районам
Суть
Игровой симулятор на 3D-карте Астаны (OpenStreetMap, 42 311 зданий): игрок выбирает 5 мер из 14 в 5 направлениях при бюджете 100 и подписывает план. Затем идёт облёт «Прошло 2 года», итоговый AI-анализ, реакция жителей в соцсетях и сравнение с оптимальным планом.
Как устроено
Датасет кейса перенесён 1:1 в data.ts. Движок engine.ts считает Astana QoL Score по формуле кейса и проверяет правила: бюджет, 5 решений, лимит направления, конфликты. Exhaustive solver перебирает 694 395 допустимых планов: даёт ранг плана, долю реализованного потенциала, вклад каждой меры по Шепли и одиночные замены «как улучшить». /api/analyze пересчитывает план на сервере и вызывает OpenAI Responses API со Structured Outputs только по фактам движка; без ключа выводится детерминированный офлайн-отчёт. 3D-сцена на three.js собрана из OSM-пайплайна, с транспортом на графе дорог, ЧС и seeded-лентой соцсети.
Ключевые решения
- exhaustive solver (694 395 планов)
- значения Шепли
- OpenAI Responses API + Structured Outputs
- OSM-пайплайн 3D-города
- seeded детерминированная социальная лента
- режим живого прогноза Score
Метрики
Эталонный план: Score 56,54 (+3,99 к базе 52,56), критических показателей 2 → 0, лучше 99,9% из 694 395 планов, реализовано 85,2% возможного прироста
Особенности
Полный перебор пространства решений даёт ранг плана, «призрак оптимума» на карте и вклад мер по Шепли. Независимая сверка движка с документом кейса (npm run sim:verify). Кинематографичная 3D-карта реального города, обучение из 14 шагов, «ловушка M11» для демонстрации компромиссов. Лог использования Codex приложен.
Стек
Next.js 16 · TypeScript · React · three.js · OpenStreetMap · Vercel
Модели
OpenAI GPT (Responses API) · Codex
Проект создан за 5 часов на финале хакатона HackAlem.ai (23 сентября 2026, Астана). Код — BAITC-Hacks/hack-614786e3-bolme.
README
README.mdАКИМ — AI-симулятор управления Астаной
HackAlem AI · кейс «Аким на 5 часов» · команда Bolme: Сабыржан и Али Назар
Вы — аким Астаны. У вас два года, бюджет 100 единиц и ровно пять решений. Вы выбираете меры на настоящей 3D-карте города (OpenStreetMap, 42 311 зданий) и подписываете бюджет. Затем видите, как изменились районы.
Точный движок считает Astana Quality of Life Score по формуле кейса. AI-аналитик объясняет сильные стороны, риски, последствия и компромиссы, но ни одного числа не придумывает: все цифры он берёт из расчёта движка.

Демо и доступ для жюри
| Демо | https://hackalem.vercel.app |
| Логин | reviewer |
| Пароль | Akim-Astana-2026 |
| Браузер | Chrome, Edge или Safari с WebGL 2, экран от 1280 px |
Демо открывается со страницы входа для жюри. После входа начинается интро и обучение. Локально (npm run dev) страницы входа нет, приложение открывается сразу.
Навигация: Проверка за 3 минуты · Возможности · Соответствие кейсу · Код и AI · Моды · Дизайн · Архитектура · Эталонные расчёты · Запуск · Деплой · Codex · Развитие
Проверка за 3 минуты
-
Откройте демо и войдите:
reviewer/Akim-Astana-2026. -
Интро. За карточкой «Вы — аким Астаны» камера облетает город. Нажмите «Показать, как всё устроено».
-
Обучение из 14 шагов подсвечивает каждую часть интерфейса:
- красное кольцо Нуры;
- «События» и колокольчик, который сворачивает правую панель;
- Score;
- район, бюджет, режимы, каталог мер, моды;
- подпись бюджета и режимы камеры.
Пройти его снова можно кнопкой «Как играть» справа вверху.
-
Нажмите на метку Нура → «Смотреть в 3D» и добавьте меры прямо из карточки района. Или слева: «Быстрый старт → Пример из кейса». Затем «Подписать бюджет и прожить 2 года».
-
Облёт «Прошло 2 года». Камера пролетает над районами, где изменения сильнее всего. У каждого района подпись с баллом «до → после».
-
Итоговый анализ. Ожидаемо:
- звание «Сильный аким»;
- потрачено 95 / 100;
- Score 56,54 (+3,99 к базе 52,56);
- критических показателей 2 → 0;
- план лучше 99,9% из 694 395 допустимых планов, реализовано 85,2% возможного прироста.
-
«Ловушка M11». Нажмите «Новый план» → «Ловушка M11» и подпишите. Безопасные переходы в Алматы опускают «Дороги» с 40 до 38,25, появляется новый провал. Score 52,42 оказывается ниже, чем если ничего не делать.
AI-анализ работает и без ключа OpenAI: показывается детерминированный отчёт движка с пометкой «офлайн-отчёт». С ключом отчёт пишет GPT по тем же фактам.
Возможности
Интро и обучение
| Интро поверх облёта | Обучение со спотлайтом |
|---|---|
![]() | ![]() |
- Интро. Первый экран объясняет правила, пока за стеклянной карточкой идёт облёт Астаны по ориентирам.
- Обучение. 14 шагов. Экран затемняется, нужный элемент подсвечивается рамкой, рядом карточка с объяснением. Управление: «Далее», «Назад», стрелки,
Esc. - «Как играть» в правом верхнем углу запускает обучение заново.
Карта и события
-
Кольца-«камни в воде». Кольцо пульсирует над каждым районом:
- красное — показатель ниже критической черты 40 (в Нуре: школы 38 и медпомощь 35);
- оранжевое — слабые места без провала;
- после подписи — зелёное там, где стало заметно лучше.
На карте под кольцом только короткая метка с названием района, у ЧС — значок молнии, поэтому подписи не перекрывают друг друга. Клик по метке открывает карточку с деталями и кнопкой «Смотреть в 3D».
-
Карточка «События». Что требует внимания: провалы ниже 40 по районам и ЧС за два года. У ЧС есть оценка тяжести: «Высокий», «Средний» или «Умеренный». Тяжесть считается из суммарной потери показателей. После подписи карточка показывает, как вы отреагировали на каждую ЧС. Клик по событию наводит на него камеру.
-
Колокольчик «События» справа вверху сворачивает правую панель, чтобы видеть город целиком. События продолжают прилетать в него: счётчик показывает, сколько их, и краснеет, если есть срочные.
-
Режимы камеры:
M— карта сверху,3— объёмный 3D-вид,F— полёт (WASD,E/Spaceвыше,Q/Cниже,Shiftбыстрее),T— кинематографичный облёт.Escвозвращает к карте.
Решения прямо в 3D

-
Карточка района в 3D. Клик по метке района → «Смотреть в 3D». Камера подлетает к району, а карточка показывает:
- слабые места района (ниже 50, провалы ниже 40 — красным);
- ЧС, которая ждёт район;
- до пяти мер, которые закрывают эти места или смягчают ЧС, с ценой, затронутыми показателями и кнопкой «В план».
Недоступные меры уходят вниз с причиной: превышение бюджета, конфликт, лимит направления. Здание меры сразу появляется на карте. Когда набрано 5 решений, бюджет можно подписать прямо из карточки.
-
ЧС в 3D после подписи. Клик по значку молнии → «Смотреть в 3D» → выбор реакции: «Не вмешиваться», временные меры или полная ликвидация. Реакция оплачивается из резерва — неподписанного остатка бюджета. Score с учётом ЧС пересчитывается сразу.
План акима
-
Бюджет города: потрачено из 100, остаток и число выбранных решений из 5.
-
Выбранные решения: у каждой меры код, иконка, район, квартал начала работы и стоимость.
-
14 мер в 5 направлениях: транспорт, экология, социальная сфера, безопасность, городской сервис. На карточке меры:
- цена;
- с какого квартала мера заработает;
- какие показатели поднимет ↑ или опустит ↓;
- синергии ⚡ и конфликты ⛔.
Районную меру назначают в выбранный район, городская действует сразу на все пять.
-
Проверка правил. Карточку, нарушающую правила, система не примет и объяснит причину: превышение бюджета, шестое решение, повтор, третья мера одного направления или несовместимость.
-
«Аким» и «Аналитик». В режиме «Аким» (по умолчанию) результат скрыт до подписи, как у настоящего акима. «Аналитик» включает живой прогноз: Score плана пересчитывается под бюджетом при каждом клике, на каждой карточке виден прирост «+X к Score, если добавить сейчас», у выбранных решений — их вклад, а кольца на карте меняют цвет по прогнозу.
-
Район под микроскопом: десять показателей района, критическая черта 40 и шкала недовольства жителей.
После подписи
| Облёт «Прошло 2 года» | Итоговый анализ |
|---|---|
![]() | ![]() |
-
Облёт «Прошло 2 года». Камера пролетает до четырёх районов, где прирост больше всего. Подписи считает движок:
- какие меры построены;
- балл района «до → после»;
- главные изменения показателей;
- устранённые провалы.
Облёт можно пропустить или повторить.
-
Итоговый анализ на весь экран:
- звание акима по доле реализованного потенциала: от «Аким-стажёр» до «Легендарный аким»;
- Score, эффективность на 10 единиц бюджета, критические показатели, слабейший район;
- вывод AI: сильные стороны, риски, последствия для жителей, компромиссы, рекомендации;
- куда ушли деньги по направлениям;
- как поступил бы лучший аким.
-
Реакция в соцсетях. Вымышленные жители пишут о ваших мерах, обещаниях и ЧС. Кто пишет, шанс одобрения, лайки и дизлайки считает код. Результат детерминирован: seed берётся из плана, поэтому один и тот же план даёт одну и ту же ленту.
-
Место среди всех планов: доля реализованного потенциала, ранг среди 694 395 допустимых планов, районы до и после, точный вклад каждой меры по Шепли.
-
«Как улучшить». Проверенные движком одиночные замены с приростом Score. Каждую можно применить одной кнопкой.
-
«Призрак оптимума» показывает на карте лучший из 694 395 планов.
-
Бриф для презентации собирает решение на одну страницу для печати или PDF.
Соответствие кейсу
Must have
| Требование кейса | Реализация |
|---|---|
| Единый виртуальный бюджет | 100 единиц; датасет кейса перенесён 1:1 в src/domain/data.ts |
| Решения по 5 направлениям | 14 мер в пяти направлениях, ровно 5 решений, выбор района для районных мер |
| Автоматический контроль бюджета | Карточка сверх бюджета блокируется с причиной; сервер /api/analyze пересчитывает план и отклоняет недопустимый |
| AI-анализ решений | /api/analyze: OpenAI Responses API + Structured Outputs по фактам движка (route.ts) |
| Итоговый Astana QoL Score | Точная формула в src/domain/engine.ts |
| Сильные стороны, риски, последствия | Экран «Итоговый анализ»: звание акима, ключевые показатели, вывод AI (сильные стороны, риски, последствия для жителей, компромиссы, рекомендации), сравнение с лучшим планом |
Опционально
| Опция кейса | Реализация |
|---|---|
| Визуализация изменений районов | 3D-карта: здания мер, кольца с баллом «до → после», облёт «Прошло 2 года», таблица районов и показателей |
| AI-рекомендации по улучшению | Движок перебирает все одиночные замены и переносы; AI объясняет только проверенные варианты. Плюс «призрак» глобального оптимума |
| Неожиданные городские события | Мод «ЧС»: паводок, порыв теплотрассы, смог. Реагирование оплачивается из остатка бюджета |
| Краткая презентация решения | «Бриф для презентации» → печать / PDF |
| Сравнение нескольких команд | Не реализовано, в планах развития |
Независимая сверка с документом кейса
npm run sim:verify (scripts/sim/verify-case.ts) читает таблицы прямо из документа кейса, а не из кода.
- Сверяет с
data.tsвсе 127 чисел: 50 исходных значений, доли населения, веса, стоимость, лаги и эффекты 14 мер, синергии, несовместимости. - Реализует правила 1–8 и формулу заново, по тексту документа, и прогоняет эталон и движок на всех 1 407 054 планах: все сочетания пяти мер во всех районах, допустимые и недопустимые.
- Результат: одинаковые решения «допустим / не допустим», одинаковые причины отказа, расхождение Score = 0.
- Проверку проверили на ошибках: неверный лаг M7 и синергия, умноженная на лаг, обе ловятся.
Критерии проверки → автоматические тесты
42 теста, запуск npm test. Критерии кейса проверяются в src/domain/engine.test.ts, лента соцсетей — в src/domain/social.test.ts.
| Критерий кейса | Тест |
|---|---|
| Все начинают с одинакового бюджета и данных | A1 same budget and data: бюджет 100, базовый Score 52.55768, баллы всех районов по таблице |
| Нельзя превысить бюджет | A2 budget cannot be exceeded: план > 100 получает ok:false, код BUDGET, Score нет; карточка сверх бюджета блокируется |
| Решения влияют на показатели | A3 decisions change indicators: районный и городской охват, лаг, синергия, клиппинг, порог ровно 40, отрицательный эффект M11 |
| AI объясняет результат и компромиссы | Отчёт строится только из фактов движка; пункты с числами вне расчёта отбрасываются (report.ts); офлайн-отчёт при сбое |
| Другие решения → другой Score | A5 changing decisions changes the Score: пример кейса 56.54307 против оптимума 57.236735 |
Что считает код и что делает AI
| Код (детерминированно) | AI (GPT через OpenAI Responses API) |
|---|---|
Валидация плана, бюджет, лаги (8−L)/8, синергии, клиппинг, D районов, Score | Объясняет, почему Score изменился, простым языком для управленца |
| Полный перебор 694 395 допустимых планов: максимум, ранг, доля потенциала | Формулирует сильные стороны, риски, последствия и компромиссы |
| Точный вклад мер по Шепли (32 подмножества, сумма = прирост) | Выбирает, какие рассчитанные факты важны для вывода |
| Лучшие одиночные замены плана | Рекомендует только из проверенных движком замен |
| Моды: ЧС, недовольство, обещания; лента соцсетей: авторы, шансы, реакции | Упоминает нарушенные обещания и реакцию на ЧС; переписывает тексты постов живым языком |
Защита от выдуманных чисел.
- Сервер пересчитывает план и собирает реестр фактов с
id. - Модель пишет числа только плейсхолдерами (
{{score}},{{nura_S1_after}}), формат ответа задаёт строгая JSON-схема. - Код подставляет значения из реестра.
- Пункт с неизвестным
idили с «сырым» числом вне реестра отбрасывается. - В постах соцсетей (
/api/reactions) GPT меняет только текст. Если в тексте появилась цифра, которой нет среди фактов поста, остаётся шаблонный текст движка. - Без ключа, при ошибке или таймауте показывается отчёт, собранный кодом из тех же фактов.
Моды города
Моды включаются справа до подписи бюджета. Официальный Score они не меняют: у них отдельный, явно подписанный результат. Коэффициенты модов — игровые допущения команды, а не прогноз для Астаны. События одинаковы для всех игроков.
-
ЧС. Три события за два года:
- паводок на Нуре (весна, 2-й квартал);
- порыв теплотрассы в Алматы (зима, 5-й квартал);
- смог над Сарыаркой (зима, 5-й квартал).
Реагировать можно из остатка бюджета, поэтому неиспользованный резерв становится страховкой. Выбранные меры смягчают удар: M13 в районе, M14 по городу, M5 и M6 против смога. Итог — «Score с учётом ЧС» (игровой, не официальный).
-
Шкала недовольства (0–100 по району). Растёт от критических показателей, отставания от города, брошенных ЧС и нарушенных обещаний. Падает, когда проблемы устранены и жизнь заметно улучшилась.
-
Память народа. До подписи вы даёте до трёх публичных обещаний, например «Выведу школы Нуры из критической зоны». После подписи код проверяет каждое обещание по показателям. Нарушенное обещание злит район, и AI-анализ его припоминает.
-
Реакция в соцсетях на экране итогового анализа:
- код (
src/domain/social.ts) решает, кто пишет и о чём; - шанс одобрения зависит от результата района, недовольства, обещаний и реакции на ЧС;
- исход — «бросок» с фиксированным seed от плана;
- лайки и дизлайки тоже считает код, а GPT только переписывает текст.
- код (
Дизайн
-
Настоящая Астана 1:1. 42 311 зданий, дороги, река, парки и ориентиры из OpenStreetMap. Байтерек, Хан Шатыр, Ак Орда, Нур Алем и другие смоделированы по реальным контурам. По дорожному графу ездят машины, автобусы и поезда ЛРТ.
-
«Тёплый атлас». Светлые полупрозрачные панели поверх карты, кнопки-пилюли, линейные иконки у мер и событий.
Бумага Карточка Чернила Олива #F3F0E8#FFFDF8#292B26#576349 -
Цвет несёт смысл:
- красный — провал ниже 40;
- оранжевый — слабое место;
- зелёный — улучшение;
- оливковый — действие.
-
Шрифты: Unbounded для заголовков и цифр, Onest для текста.
Архитектура
flowchart LR
subgraph Browser[Браузер: Next.js + React Three Fiber]
MAP[3D-город OSM<br/>src/scene, src/city]
UI[Панели, интро, обучение<br/>src/ui]
SIM[Состояние игры, мост к сцене<br/>src/sim]
ENG[Движок, перебор, Шепли, моды, соцсети<br/>src/domain]
end
API["/api/analyze, /api/reactions<br/>пересчёт + реестр фактов"]
GPT[OpenAI Responses API<br/>Structured Outputs]
UI --> SIM --> ENG
SIM -->|кольца-события, здания мер, облёт| MAP
UI -->|план + моды| API
API --> ENG
API -->|факты с id| GPT
GPT -->|текст с плейсхолдерами| API
API -->|проверенный отчёт| UI
| Путь | Назначение |
|---|---|
src/domain/ | Чистый TypeScript без React: датасет, типы, engine.ts (валидация и формула), solver.ts (перебор, замены, Шепли), rank.ts, mods.ts, social.ts, тесты |
src/domain/generated/solver.json | Результат npm run sim:solve: оптимумы, Парето-фронт, гистограмма 694 395 планов |
src/sim/ | Состояние игры (zustand), факты и офлайн-отчёт, мост «движок → кольца на карте», 3D-слой мер |
src/ui/sim/ | Панели: бюджет и выбранные решения, каталог, «События», район и моды, результат, облёт, итоговый анализ, соцсети, бриф |
src/ui/onboarding/ | Интро поверх облёта и обучение со спотлайтом; шаги — в steps.ts |
src/app/api/ | analyze — AI-анализ с проверкой фактов; reactions — тексты постов соцсетей |
src/scene/, src/city/, scripts/city/ | 3D-Астана 1:1 из OpenStreetMap: камера «карта / 3D / полёт / облёт», ориентиры, районы, транспорт. Подробно — гайд сцены |
Сцена и симулятор связаны только через стор src/city/store.ts. Симулятор выставляет кольца-события по районам, ведёт камеру в облёте и подключает свой 3D-слой одной строкой в CityCanvas.tsx.
Эталонные расчёты
Все значения проверяются в npm test и совпадают с кейсом.
| Сценарий | Стоимость | Критических | Score |
|---|---|---|---|
| Без решений (база) | 0 | 2 | 52.55768 |
| Пример из кейса: M7, M8, M10 в Нуре + M12 + M5 в Сарыарке | 95 | 0 | 56.54307 |
| Глобальный оптимум: M2 + M3, M8, M9 в Нуре + M14 | 98 | 0 | 57.236735 |
| Ловушка: M9, M10, M4 в Байконуре + M11 в Алматы + M12 | 61 | 3 | 52.42382 |
| Та же ловушка, M11 перенесена в Байконур | 61 | 2 | 53.36453 |
| Строгое прочтение «одна мера на направление», оптимум | 93 | 0 | 56.34451 |
I′ = clip(I + Σ эффект × (8 − L) / 8 + синергия, 0, 100)
D = Σ w_k × I′_k (веса показателей, сумма 1)
Score = 0.7 × Σ pop_d × D_d + 0.3 × min(D) − 1 × (число пар «район × показатель» < 40)
Интерпретации правил.
- «Не более двух мер одного направления» — по детальным правилам кейса. В его же примере нет транспортной меры. Строгий вариант поддерживает движок (
strictDirections), его оптимум указан в таблице. - Промежуточного округления нет.
- Порядок решений не влияет на результат.
- Неполный или недопустимый план итогового Score не получает.
Локальный запуск
Нужны Node.js 20+ и npm.
git clone https://github.com/BAITC-Hacks/hack-614786e3-bolme.git
cd hack-614786e3-bolme
npm ci
cp .env.example .env.local # ключ OpenAI необязателен
npm run dev # http://localhost:3000
npm test # 42 теста: критерии кейса A1–A5, эталоны, правила, полный перебор, соцсети
npm run sim:verify # сверка с документом кейса: 127 чисел датасета, 1 407 054 плана против эталона
npm run typecheck && npm run lint
npm run sim:solve # пересчитать src/domain/generated/solver.json (~5 с)
npm run build && npm start # production-сборка
| Переменная | Назначение |
|---|---|
OPENAI_API_KEY | Ключ OpenAI для живого AI-анализа и текстов соцсетей. Без него работает офлайн-отчёт движка |
OPENAI_MODEL | Модель, по умолчанию gpt-6-luna |
REVIEWER_LOGIN, REVIEWER_PASSWORD | Логин и пароль страницы входа. Вход включается, только когда заданы обе переменные; без них приложение открывается сразу |
Полезное:
?nointroв адресе пропускает интро;?debugпоказывает FPS и статистику сцены.
Деплой
Демо развёрнуто на Vercel: https://hackalem.vercel.app.
vercel --prod
В настройках проекта Vercel заданы REVIEWER_LOGIN и REVIEWER_PASSWORD: так включается страница входа для жюри. OPENAI_API_KEY и OPENAI_MODEL можно добавить там же. Без ключа AI-анализ показывает офлайн-отчёт движка.

Codex в разработке
Codex (OpenAI) использовался на всех этапах:
- четыре независимых анализа кейса: жюри, реализм, геймдизайн, архитектура;
- реализация движка, перебора и тестов по контракту
src/domain/types.ts; - лента соцсетей и её тесты.
Журнал с id сессий: docs/codex-log.md. Исходные ответы Codex: docs/research/akim-analysis/codex/.
Ограничения и развитие
Ограничения.
- Показатели синтетические, из кейса. Симулятор не прогнозирует фактическое развитие Астаны.
- Геометрия города реальная (OSM), но игровые районы — это пять районов кейса. В Астане с 2024 года шесть районов (добавлен Сарайшык).
- Модель кейса не зависит от порядка решений. Соседние районы влияют друг на друга только через городские меры и общий балл.
Развитие (спроектировано в анализе).
- Сравнение команд — ссылка-вызов с планом и дуэль планов с AI-комментатором.
- Мод «Подрядчики» — госзакупки: задержки, удорожание, контроль исполнения.
- Мод «Последствия»:
- перетоки между соседними районами через Есиль;
- строительный шум и помехи во время лага;
- эксплуатационные расходы на 3–5-й годы.
- Публичные слушания. Житель самого слабого района оспаривает план, AI проверяет возражения инструментами движка; голос через TTS.
- Реальные данные и 6 районов — открытые данные Астаны вместо синтетики.
Документация
- Постановка задачи и критерии оценки
- Датасет, мероприятия и правила расчёта, исходные материалы кейса
- Анализ кейса: полный перебор, четыре анализа Codex, выбор концепции
- Спецификация симулятора
- 3D-город: устройство сцены и подключение симулятора
- Концепция и визуальный pipeline команды
Команда Bolme
| Сабыржан | 3D-город Астаны из OpenStreetMap, камера и облёт, интерфейс, интро и обучение, деплой |
| Али Назар | Движок и формула кейса, полный перебор, AI-анализ, моды, облёт «Прошло 2 года», итоговый анализ, соцсети |
Карта: © OpenStreetMap contributors, ODbL.
Авторы коммитов
История коммитов
- 2026-09-23 17:49feat(sim): staged game — world settings and promises before the planAlinazavrr
- 2026-09-23 17:29feat(sim): make decisions from the 3D viewSabyrzhan
- 2026-09-23 17:22docs: document sim:verify and log the Codex compliance auditAlinazavrr
- 2026-09-23 17:22test: independent verification against the case document (npm run sim:verify)Alinazavrr
- 2026-09-23 17:22fix(sim): close the gaps found by the Codex compliance auditAlinazavrr
- 2026-09-23 17:22feat(sim): make analyst mode useful — live Score forecast and per-measure gainsSabyrzhan
- 2026-09-23 17:17feat: reviewer login, calmer map and HUD, Vercel deploy, README in RussianSabyrzhan
- 2026-09-23 17:01feat(ui): intro over the flyover, spotlight walkthrough and warm light-glass HUDSabyrzhan
Все коммиты (28)
- 2026-09-23 16:52docs: document reveal, final analysis and social feed; log Codex sessionAlinazavrr
- 2026-09-23 16:52feat(domain): seeded social-network reactions to a signed planAlinazavrr
- 2026-09-23 16:52feat(sim): cinematic reveal, final analysis screen and social feedAlinazavrr
- 2026-09-23 16:37docs: rewrite README around the working simulator and log Codex usageAlinazavrr
- 2026-09-23 16:37docs: add case analysis, Codex research sessions and simulator specAlinazavrr
- 2026-09-23 16:37feat(domain): exact scoring engine, exhaustive solver and case testsAlinazavrr
- 2026-09-23 16:37feat(sim): playable simulator on the 3D city with grounded AI analysisAlinazavrr
- 2026-09-23 16:35feat: add colour accents for glass towers, schools, clinics and tracksSabyrzhan
- 2026-09-23 16:35feat: model Northern Lights towers and Astana ArenaSabyrzhan
- 2026-09-23 16:35feat: add cars, buses and LRT trains on the real road graphSabyrzhan
- 2026-09-23 16:35feat: keep hotspot rings readable on the city overviewSabyrzhan
- 2026-09-23 16:08docs: refresh scene guide status; improve tour caption contrastSabyrzhan
- 2026-09-23 16:08feat: keep roads and rails readable on the zoomed-out mapSabyrzhan
- 2026-09-23 16:05fix: make sun shadows visible and quiet distant markers in 3DSabyrzhan
- 2026-09-23 15:59feat: render Astana 1:1 3D map with camera modes and hotspotsSabyrzhan
- 2026-09-23 15:59docs: add city scene integration guide and planning docsSabyrzhan
- 2026-09-23 15:59chore: scaffold Next.js 16 app with three.js stackSabyrzhan
- 2026-09-23 15:59feat: add OpenStreetMap pipeline for Astana city dataSabyrzhan
- 2026-09-23 14:58docs: add case brief and consolidated simulator data and rulesAlinazavrr
- 2026-09-23 12:29docs: add preliminary creative industries researchSabyrzhan
Структура репозитория (174 файлов)
.env.example
.gitignore
.vercelignore
AGENTS.md
CLAUDE.md
README.md
docs/case/HackAlem AI_ «Аким на 5 часов» - AI-симулятор управления городом.md
docs/case/README.md
docs/case/akim-simulator-dataset-and-rules.md
docs/case/source/01-indicators.png
docs/case/source/02-districts.png
docs/case/source/03-measures-1.png
docs/case/source/04-measures-2.png
docs/case/source/05-score.png
docs/case/source/06-example-rules.png
docs/case/source/07-rules.png
docs/case/source/08-case.png
docs/case/source/09-requirements.png
docs/case/source/10-acceptance.png
docs/case/source/11-rubric.png
docs/case/{162C4C59-EE9A-4F03-9B1E-131B72793AE1}.png
docs/case/{5130A968-8A4D-4883-8F2C-337CFA1DB3BF}.png
docs/case/{64BBABC9-DCAC-4142-8C12-3A4D5BDBAEFD}.png
docs/case/{E1A7EE5A-E0B6-4021-9244-0624B1B2FA32}.png
docs/case/{FF0E7AE5-A1EE-4BAC-A360-3CCB83ECCA2A}.png
docs/city-scene-guide.md
docs/codex-log.md
docs/design/astana-clay-reference.png
docs/design/city-concept-v1-prompt.md
docs/design/city-concept-v1.png
docs/media/debrief.png
docs/media/decide-3d.png
docs/media/hero.png
docs/media/intro.png
docs/media/login.png
docs/media/reveal.png
docs/media/walkthrough.png
docs/planning/astana-open-data-visual.md
docs/planning/city-simulator-concept.md
docs/planning/visual-voice-pipeline.md
docs/research/README.md
docs/research/akim-analysis/README.md
docs/research/akim-analysis/codex/audit-report.md
docs/research/akim-analysis/codex/audit-task-prompt.md
docs/research/akim-analysis/codex/engine-task-prompt.md
docs/research/akim-analysis/codex/engine-task-report.md
docs/research/akim-analysis/codex/lens-A-jury-strategy.md
docs/research/akim-analysis/codex/lens-A-prompt.md
docs/research/akim-analysis/codex/lens-B-prompt.md
docs/research/akim-analysis/codex/lens-B-simulation-realism.md
docs/research/akim-analysis/codex/lens-C-game-design.md
docs/research/akim-analysis/codex/lens-C-prompt.md
docs/research/akim-analysis/codex/lens-D-architecture.md
docs/research/akim-analysis/codex/lens-D-prompt.md
docs/research/akim-analysis/codex/sessions.txt
docs/research/akim-analysis/codex/shared-brief-prompt.md
docs/research/akim-analysis/codex/social-task-prompt.md
docs/research/akim-analysis/codex/social-task-report.md
docs/research/akim-analysis/solve-space-output.txt
docs/research/akim-analysis/solve-space.mjs
docs/research/astana-osm-sample.json
docs/research/creative-industries-preliminary-research.md
docs/superpowers/specs/2026-09-23-akim-simulator-design.md
eslint.config.mjs
next.config.ts
package-lock.json
package.json
postcss.config.mjs
public/city/buildings.json
public/city/ground.json
public/city/manifest.json
public/city/trees.bin
public/login/backdrop.jpg
scripts/city/build-city.ts
scripts/city/config.ts
scripts/city/fetch-osm.ts
scripts/city/lib/classify.ts
scripts/city/lib/geo.ts
scripts/city/lib/osm.ts
scripts/city/lib/raster.ts
scripts/sim/solve.ts
scripts/sim/try-analyze.mts
scripts/sim/verify-case.ts
src/app/api/analyze/route.ts
src/app/api/login/route.ts
src/app/api/reactions/route.ts
src/app/favicon.ico
src/app/globals.css
src/app/layout.tsx
src/app/login/login.css
src/app/login/page.tsx
src/app/page.tsx
src/auth/session.ts
src/city/decode.ts
src/city/demoHotspots.ts
src/city/geo.ts
src/city/geometry/buildings.ts
src/city/geometry/ground.ts
src/city/geometry/ribbon.ts
src/city/geometry/traffic.ts
src/city/geometry/trees.ts
src/city/geometry/triangulate.ts
src/city/geometry/writer.ts
src/city/landmarks.ts
src/city/loader.ts
src/city/prepare.ts
src/city/schema.ts
src/city/store.ts
src/domain/data.ts
src/domain/engine.test.ts
src/domain/engine.ts
src/domain/generated/solver.json
src/domain/mods.ts
src/domain/rank.ts
src/domain/social.test.ts
src/domain/social.ts
src/domain/solver.ts
src/domain/types.ts
src/proxy.ts
src/scene/CityCanvas.tsx
src/scene/CityExperience.tsx
src/scene/DebugGroundPicker.tsx
src/scene/FpsProbe.tsx
src/scene/camera/CameraRig.tsx
src/scene/camera/cameraState.ts
src/scene/camera/poses.ts
src/scene/camera/useKeyboard.ts
src/scene/fpsState.ts
src/scene/fx/Effects.tsx
src/scene/labels/LabelProjector.tsx
src/scene/labels/anchors.ts
src/scene/markers/Districts.tsx
src/scene/markers/Ripples.tsx
src/scene/palette.ts
src/scene/world/Atmosphere.tsx
src/scene/world/Buildings.tsx
src/scene/world/Ground.tsx
src/scene/world/Landmarks.tsx
src/scene/world/Traffic.tsx
src/scene/world/Trees.tsx
src/scene/world/landmarks/AstanaArena.tsx
src/scene/world/landmarks/NorthernLights.tsx
src/scene/world/materials.ts
src/sim/SimBridge.tsx
src/sim/analysis.ts
src/sim/labels.ts
src/sim/report.ts
src/sim/scene/SimLayer.tsx
src/sim/store.ts
src/sim/useAnalysis.ts
src/ui/hud/Hud.tsx
src/ui/hud/LoadingScreen.tsx
src/ui/hud/ViewSwitcher.tsx
src/ui/icons.tsx
src/ui/labels/MapLabels.tsx
src/ui/onboarding/Intro.tsx
src/ui/onboarding/Walkthrough.tsx
src/ui/onboarding/onboarding.css
src/ui/onboarding/steps.ts
src/ui/onboarding/store.ts
src/ui/sim/AiReport.tsx
src/ui/sim/BriefSheet.tsx
src/ui/sim/EventsCard.tsx
src/ui/sim/FinalDebrief.tsx
src/ui/sim/FocusActions.tsx
src/ui/sim/InfoPanel.tsx
src/ui/sim/PlanPanel.tsx
src/ui/sim/ResultView.tsx
src/ui/sim/Reveal.tsx
src/ui/sim/SimHud.tsx
src/ui/sim/SocialFeed.tsx
src/ui/sim/WorldSetup.tsx
src/ui/sim/sim.css
tsconfig.jsonОбсуждение 0 комментариев
Войдите, чтобы комментироватьПока нет комментариев — будьте первым.



