О проекте
Команда: Söz
Кейс HackAlem.ai: Спецтрек — Astana Innovations
Стадия: Доведённый продукт
Задача кейса: «Аким на 5 часов»: городской симулятор, распределяющий бюджет по 5 направлениям и 5 районам
Суть
Пошаговый изометрический симулятор управления Астаной: игрок за 5 ходов распределяет 100 единиц бюджета по 14 мерам и 5 районам и получает Astana Quality of Life Score с разбором по каждому показателю.
Как устроено
Чистый модуль src/game/engine.ts валидирует решения (ровно 5 уникальных мер, не более 2 в направлении, конфликты) и считает показатели по формуле clip(база + Σэффект×(8−лаг)/8 + синергии), затем районный балл по весам, городской по долям населения и Score = 0.7×город + 0.3×слабейший район − штрафы за показатели ниже 40. Вклад каждой меры раскладывается по Шепли, советник ищет план лучевым перебором (до 180 промежуточных планов на шаг). Интерфейс на React + Canvas (IsoCity), всё упаковано в один офлайн-HTML; опционально LLM-объяснения через локальный сервер.
Ключевые решения
- распределение Шепли
- лучевой поиск плана (до 180 кандидатов)
- детерминированная формула Score с лагами и синергиями
- rule-based советник
- JSON Schema контракты AI
- Playwright e2e
Особенности
Прозрачная модель: вклады мер по Шепли складываются ровно в изменение Score, базовое значение 52.55768 и пример организаторов (56.54307) пересчитываются из данных; вся игра работает офлайн одним HTML-файлом, есть «Лаборатория сценариев» для изменения бюджета и добавления своих мер, интерфейс на 3 языках.
Стек
TypeScript · React · Vite · Canvas (IsoCity) · Phaser · Node.js · Playwright · GitHub Actions
Модели
OpenAI (опционально)
Проект создан за 5 часов на финале хакатона HackAlem.ai (23 сентября 2026, Астана). Код — BAITC-Hacks/hack-708a66ce-s-z.
README
README.mdQALA
Астана
Большой город. Пять решений.
Пошаговый симулятор управления городом.
Играть офлайн · Запустить проект · Инструкция для агента · Демо за две минуты
100 единиц бюджета · 5 решений · 5 районов · 14 мер · 3 языка

Sauce Code · HackAlem AI 2026 · «Аким на 5 часов» · Astana Innovations
Город — это люди
Построить парк кажется простым решением. Пока не выясняется, что тот же участок нужен школе, новому району не хватает поликлиники, а бюджета должно хватить на пять решений.
QALA превращает таблицу городских показателей в понятную стратегическую игру. Изучайте районы, выбирайте карточки проектов и заранее смотрите последствия. В конце получите Astana Quality of Life Score с разбором до каждого показателя.
От Civilization — исследование районов. От Balatro — карточки и синергии. От Plague Inc — наглядные последствия. Математика соответствует выданному датасету.
Начните за 30 секунд
- Скачайте play/QALA.html кнопкой Download raw file на GitHub или скачайте ZIP репозитория.
- Откройте файл в современном браузере. Установка, интернет, аккаунт и API-ключ не нужны.
- Познакомьтесь с Айдой, выберите район, изучите прогноз и примите первое решение. Русский язык включён по умолчанию; EN и ҚАЗ доступны в игре.
Код, Canvas-рендерер, стили, данные и изображение включены в один HTML. Офлайн работает даже при первом открытии. Город использует Canvas и не требует WebGL. Текущая партия сохраняется в браузере, если его настройки разрешают; результат можно экспортировать в JSON.
Для разработки нужен Node.js 22.18+:
npm ci
npm run demo
npm run check # Тесты, TypeScript и сборка
npm run test:e2e # Браузерные сценарии, офлайн и мобильная версия
npm run package # Готовый play/QALA.html
При необходимости установите тестовый браузер: npx playwright install chromium. Интернет нужен для установки зависимостей, но не для готовой игры.
Откройте http://localhost:8789. demo собирает игру и запускает локальный сервер с опциональным AI. .env не обязателен. Для разработки с горячим обновлением используйте npm run dev и адрес из терминала.
Для coding agent: начните с AGENTS.md. Там команды запуска, проверочные значения, границы модулей и работа с ключами. Пошаговый запуск и диагностика.
Что умеет QALA
- Изометрическая сцена на основе IsoCity: пять районов из датасета, шесть узнаваемых зданий Астаны, движение машин, автобусов и пешеходов, масштабирование, день/ночь и видимые изменения после решений.
- Обучение с Айдой прямо в первом ходе: выбрать потребность → проверить прогноз → принять решение → понять результат. Можно пропустить или пройти заново.
- На основном экране — город, три варианта и компактная подсказка Айды с переходом к прогнозу. Книга, история и настройки собраны в «Кабинете мэра».
- Достижения за устранение критических проблем, синергию и улучшение всех районов; скрытых бонусов к баллу нет.
- Книга мэра: восемь оригинальных советов, связанных с игровыми мерами.
- Четырнадцать карточек с ценой, задержкой, эффектом за два года и выбором района.
- Пять ходов, контроль бюджета, запрет конфликтов, отмена последнего решения и защита от невозможности завершить партию.
- Три синергии: полосы + светофоры, освещение + обращения, чистое топливо + зелёный пояс.
- Прозрачный отчёт: средний балл, слабейший район, штрафы, все 50 показателей и вклад каждой меры.
- Локальный советник, сохранение до десяти сценариев, сравнение и экспорт JSON.
- Русский, английский и казахский интерфейсы; опциональное объяснение от LLM.
От живого города к обоснованному решению
| Инструмент | Что он даёт мэру |
|---|---|
| Паспорт района | Доля населения, все 10 показателей до и после, критический порог 40 |
| График проблем | Видно, какой дефицит по показателям до порога 40 остался и какой удалось закрыть |
| Сравнение и матрица | Изменения пяти районов и все 50 показателей рядом, без скрытых агрегатов |
| Вклад каждой меры | Точное распределение Шепли: вклады складываются в общее изменение Score до округления |
| Поиск плана | Советник перебирает допустимые продолжения и предлагает лучший найденный вариант |
| Открытая модель | Текущие слагаемые формулы, веса, лаги, доли населения, синергии и ограничения |
Поиск сохраняет уже принятые решения, на каждом шаге удерживает до 180 промежуточных планов и показывает число проверенных вариантов. Найденную меру можно сначала рассмотреть. Программа не расходует бюджет автоматически и не объявляет результат доказанным глобальным оптимумом.
Лаборатория сценариев
Откройте Кабинет мэра → Лаборатория сценариев или значок изменения лимита у бюджета. Здесь можно изменить бюджет от 1 до 1 000, число решений от 1 до 10 и добавить собственную проблему с мерой: описание, цена, задержка, районный или городской охват, положительные и отрицательные эффекты.
Статистика районов, график проблем, матрица и формула пересчитываются вместе. Если уменьшить лимит ниже уже потраченного, прогноз остаётся виден, а нарушение правил объясняется. Эксперимент хранится отдельно и экспортируется как песочница.
Конкурсная партия сохраняет 100 единиц и ровно пять решений. Лаборатория не меняет её сохранение, архив или официальный AI-контракт. Эффекты собственной меры — допущения автора, а не подтверждённые городские данные. Идеи аналитики и экспериментов перенесены из прототипа коллеги akim_5_hr; что и почему интегрировано.

Посмотреть матрицу и расчётную модель


Астана, которую узнаёшь
Используются реальные модули отрисовки и графические ресурсы IsoCity под MIT. Все нужные файлы включены в офлайн-сборку, авторство сохранено. Ось Хан Шатыр — Бәйтерек — Ақорда и переход через Есиль к Пирамиде помогают узнать город. Интеграция и лицензия · Географические ориентиры.
Бәйтерек, Ақорда, Хан Шатыр, мечеть Әзірет Сұлтан, Дворец мира и согласия и Нұр Әлем нарисованы как отдельные игровые спрайты. Застройка различается по кварталам: старый город, современная левая сторона, набережные, дворы и район EXPO. Машины, автобусы и пешеходы используют единый визуальный стиль и движутся по связанным улицам и тротуарам. Набережные, мосты, жилые дворы и площади формируют город. Новые здания занимают участки района; отмена восстанавливает прежнюю застройку. Визуальные эффекты иллюстрируют решения, а расчёт остаётся воспроизводимым.

Советы в книге мэра — оригинальные тексты QALA по темам «100 советов мэру» Ильи Варламова и Максима Каца (2020). Предоставленный фрагмент содержит вступление и оглавление, а не полные главы. PDF книги не публикуется в репозитории.

Правила без скрытой магии
У всех 100 единиц бюджета и одинаковые синтетические данные. Нужно ровно пять уникальных мер, не более двух в одном направлении. Районная мера требует район; городская действует везде. Несовместимости проверяются автоматически. Остаток бюджета не даёт бонуса.
Каждый ход — выбор, а не прошедший квартал. Горизонт всех мер — восемь кварталов, поэтому порядок решений не меняет результат.
Показатель = clip(база + Σ эффект × (8 − лаг) / 8 + синергии, 0, 100)
Район = Σ вес показателя × показатель
Город = Σ доля населения × балл района
Score = 0.7 × город + 0.3 × слабейший район − критические показатели
Критический показатель — строго ниже 40. Бонусы синергии фиксированы и не уменьшаются из-за лага. Невалидный набор не получает итоговый Score; до пяти решений показывается только прогноз.
База: 52.55768. Пример организаторов (M7 Нура, M8 Нура, M10 Нура, M12 город, M5 Сарыарка) стоит 95 и даёт 56.54307. Числа вычисляются из исходных показателей, а не подставляются.
Как устроен проект и где AI
React + TypeScript + Vite + IsoCity Canvas. Чистый модуль src/game/engine.ts валидирует решения и считает все числа. Интерфейс и карта читают его результат. База данных и CDN не нужны; сборка упаковывает приложение в один HTML.
Офлайн-советник использует правила, а не LLM. Он объясняет критические показатели и предлагает допустимый следующий ход по немедленному приросту Score. Это не доказанный глобальный оптимум.
Если игра уже запущена, откройте http://localhost:8789/#ai: форма ключа появится сразу, повторно запускать сервер не нужно. В офлайн HTML есть кнопка «Открыть AI-версию»; она открывает локальную игру в другой вкладке. У файла и localhost отдельные сохранения.
В обучении и панели советника можно опционально подключить API-ключ. Ключ сессии хранится только в памяти локального сервера до отключения или перезапуска; он не попадает в хранилище браузера, JSON или HTML. Подключение само по себе не вызывает платную модель. В офлайн-файле остаётся локальный анализ.
Разработчики могут использовать .env для подключения Jev и LLM:
cp .env.example .env
# TYPESAFE_API_KEY — выбор Jev; OPENAI_API_KEY — объяснения OpenAI.
# Ключи только в .env, без префикса VITE_.
npm run demo
Откройте http://localhost:8789: Кабинет мэра → AI-советник → Получить совет. Можно подключить один или оба сервиса. Jev выбирает только из рассчитанных допустимых вариантов; OpenAI объясняет последствия. Сервер и браузер проверяют JSON Schema, а числа заново вычисляются движком. Предложение не принимается автоматически. При ошибке остаётся явно обозначенный локальный анализ.
Настраиваемые модели по умолчанию: jev-1.13.0 и gpt-4.1-mini. Ключи остаются на localhost-сервере и не попадают в офлайн-файл. Уверенность Jev не означает вероятность реального городского результата. Восемь схем и границы проверки.
Интеграции проверены на имитации ответов. Реальные платные вызовы без ваших ключей не проверены. Сервер предназначен для локальной демонстрации.
Карта проекта
| Файл | Назначение |
|---|---|
src/game/engine.ts | Конкурсные правила и точный расчёт |
src/game/data.ts | Датасет организаторов и тексты RU/EN/KK |
src/game/planSearch.ts | Поиск допустимого плана и вклады Шепли |
src/game/sandbox.ts | Отдельные правила лаборатории и пользовательские меры |
src/components/MayorExperience.tsx | Игровой цикл: прогноз → решение → последствия |
src/components/CityAnalytics.tsx | Общая аналитика отчёта и лаборатории |
schemas/ · server/ | Контракты AI, проверка ответов и локальное подключение |
tests/ | Воспроизводимые проверки модели, API и браузера |
Проверка и развитие
Тесты покрывают формулу, официальный пример, лаги, синергии, несовместимости, порог 40, все 120 перестановок примера и 60 воспроизводимых партий. Браузерные проверки проходят пять ходов, проверяют сохранение, экспорт, мобильный интерфейс, отсутствие WebGL и первый запуск HTML без сети.
npm run checkpoint проверяет проект, фиксирует завершённые изменения и отправляет их в командный репозиторий без force-push и пустых коммитов.
Данные синтетические; карта не повторяет реальные границы районов. Это учебная модель, не прогноз реальной Астаны. Следующие шаги: случайные события в лаборатории, реальные GIS-слои и общая таблица результатов.
План на пять часов · Модель · Демо для жюри · Исходный датасет
Авторы коммитов
История коммитов
- 2026-09-23 17:56fix: allow ordinary navigation to the local game pageusernamx42
- 2026-09-23 17:48docs: preserve team README edits alongside AI setup improvementsusernamx42
- 2026-09-23 17:48fix: open AI setup directly and clarify local launch errorsusernamx42
- 2026-09-23 17:39Update README.mdOlzhas
- 2026-09-23 17:38Update README.mdOlzhas
- 2026-09-23 17:30feat: integrate team analytics, scenario lab and plan search with Russian-first docsusernamx42
- 2026-09-23 17:13feat: expand Astana and polish guided gameplay, AI setup and agent quick startusernamx42
- 2026-09-23 16:47feat: build offline IsoCity Astana experience with guided decisions and typed AI adviceusernamx42
Все коммиты (12)
- 2026-09-23 15:05feat: add living Phaser Astana, mayor onboarding and handbookusernamx42
- 2026-09-23 14:27chore: polish verified core and document CI account blockerusernamx42
- 2026-09-23 14:20feat: build QALA offline mayor simulation and trilingual pitchusernamx42
- 2026-09-08 14:38Update README.mdOlzhas
Структура репозитория (121 файлов)
.env.example .gitattributes .github/workflows/check.yml .gitignore .prettierignore .prettierrc.json AGENTS.md README.en.md README.kk.md README.md README.ru.md THIRD-PARTY-NOTICES.md docs/AI-CONTRACTS.md docs/ASSETS.md docs/ASTANA-MAP.md docs/CASE-AUDIT.md docs/CITY-ART.md docs/DEMO.md docs/DESIGN.md docs/EXPERIENCE-V3.md docs/FINAL-HOUR.md docs/ISOCITY.md docs/MODEL.md docs/NEXT-3-HOURS.md docs/PLAN.md docs/RUNBOOK.md docs/TEAM-INTEGRATION.md docs/VERIFICATION.md docs/screenshots/ai-connection.png docs/screenshots/analytics-mobile-ru.png docs/screenshots/analytics-ru.png docs/screenshots/briefing-en.png docs/screenshots/city-en.png docs/screenshots/city-kk.png docs/screenshots/city-ru.png docs/screenshots/finale-en.png docs/screenshots/handbook-en.png docs/screenshots/matrix-ru.png docs/screenshots/mobile-kk.png docs/screenshots/model-ru.png docs/screenshots/night-en.png docs/screenshots/onboarding-en.png docs/screenshots/plan-search-en.png docs/screenshots/policy-preview.png docs/screenshots/report-en.png docs/supplied-dataset.ru.txt index.html package-lock.json package.json play/QALA.html playwright.config.ts schemas/advisor-narration.schema.json schemas/advisor-request.schema.json schemas/advisor-response.schema.json schemas/decision-event.schema.json schemas/decision.schema.json schemas/jev-request.schema.json schemas/jev-response.schema.json schemas/scenario.schema.json scripts/capture.mjs scripts/checkpoint.mjs scripts/package.mjs server/advisor.ts server/decisionSupport.ts server/sessionCredentials.ts src/App.tsx src/advisor-connection.css src/analytics.css src/assets/advisor-aida.png src/assets/astana-key-art.png src/assets/building-atlas.png src/assets/city-life-atlas.png src/assets/isocity/base.webp src/assets/isocity/dense.webp src/assets/isocity/manifest.json src/assets/isocity/modern.webp src/assets/isocity/parks.webp src/assets/isocity/services.webp src/assets/isocity/water.webp src/assets/landmark-atlas.png src/components/AdvisorConnection.tsx src/components/CityAnalytics.tsx src/components/GameStage.tsx src/components/IsoCity.tsx src/components/IsoCityPolicyArt.tsx src/components/MayorExperience.tsx src/components/MayorOnboarding.tsx src/components/PhaserCity.tsx src/components/PlanSearch.tsx src/components/ScenarioLab.tsx src/experience.css src/game.css src/game/adviceContract.ts src/game/astanaMap.ts src/game/cityScene.ts src/game/data.ts src/game/decisionSupport.ts src/game/engine.ts src/game/experience.ts src/game/explanation.ts src/game/handbook.ts src/game/planSearch.ts src/game/sandbox.ts src/game/storage.ts src/isocity.css src/main.tsx src/onboarding.css src/plan-search.css src/scenario-lab.css src/style.css tests/advisor.test.ts tests/astanaMap.test.ts tests/browser/game.spec.ts tests/credentials.test.ts tests/decisionSupport.test.ts tests/engine.test.ts tests/experience.test.ts tests/planSearch.test.ts tests/sandbox.test.ts tsconfig.json vite.config.ts
Ветки (2)
Обсуждение 0 комментариев
Войдите, чтобы комментироватьПока нет комментариев — будьте первым.