О проекте
Команда: Attractor
Кейс HackAlem.ai: Спецтрек — Astana Innovations
Стадия: Рабочий MVP
Задача кейса: «Аким на 5 часов»: городской симулятор, распределяющий бюджет по 5 направлениям и 5 районам
Суть
Лаборатория бюджетных решений для «Аким на 5 часов»: V1 считает AQOL Score по правилам ТЗ и ищет альтернативы, экспериментальный V2 моделирует город во времени (сценарий «Снегопад»: бригады, очереди, обращения).
Как устроено
Data Gate превращает исходный датасет в проверенный снимок с отчётом о качестве. На нём evaluator V1 считает эффекты мер с лагами, синергиями, clip и штрафами, валидирует портфель (5 мер, ≤100, ≤2 мер одного направления, конфликты) и раскладывает Score по вкладам. Альтернативы ищутся перебором одиночной замены меры или района. Отчёт с evidence собирается на сервере; OpenAI-адаптер есть, но без ключа работает rule-based и живым вызовом не проверялся. V2 — отдельный worker на PostgreSQL с событиями, checkpoint и ветками, парными экспериментами по seed и экспортом. API на FastAPI, фронтенд React/TS с картой; всё поднимает Docker Compose.
Ключевые решения
- deterministic scoring engine
- single-swap local search
- discrete-event simulation
- paired-seed experiments
- data quality gate
- API-first contracts (OpenAPI/JSON Schema)
Метрики
Контрольный Score 56.54307 (cost 95); лучшая найденная альтернатива 57.20556 за 100
Особенности
Официальная модель V1 отделена от исследовательской V2, которая не влияет на Score. Архитектура API-first с JSON Schema контрактами и Data Gate. В README честно указано, что готово, что осталось preview и что LLM вживую не проверялся. Видеообзор лежит в репозитории.
Стек
Python · FastAPI · React · TypeScript · Vite · PostgreSQL · SQLite · nginx · Docker Compose · GitHub Actions
Модели
OpenAI
Проект создан за 5 часов на финале хакатона HackAlem.ai (23 сентября 2026, Астана). Код — BAITC-Hacks/hack-d4922f7f-attractor.
README
README.md
AKIM
Проверяемая лаборатория бюджетных решений для городского управления
Python 3.11+ · FastAPI · React + TypeScript · Docker Compose
Запуск · Демо · Архитектура · API · Планы
Городские решения конкурируют за один бюджет, а их эффект трудно проверить до запуска. AKIM рассчитывает Astana Quality of Life Score (AQOL) по условию «Аким на 5 часов» и показывает проверяемые причины изменения результата.
AKIM в действии — видеообзор
Короткое знакомство с AKIM и интерфейсом городской лаборатории — за одну минуту.
▶ Смотреть видеообзор · 60 секунд · Full HD
Два режима
| V1 · Задание хакатона | V2 · Исследовательская симуляция | |
|---|---|---|
| Вопрос | Как пять мер меняют заданный Score? | Как город развивается во времени при разных решениях? |
| Основа | 5 условных районов, 14 мер, бюджет 100 | Жители, инфраструктура, службы, городские финансы, внешняя экономика |
| Динамика | Итог по формуле с лагом | События, очереди, передвижения, проекты, сезонность |
| AI | Объясняет расчёт и исследует альтернативы | Помогает ставить эксперименты, общаться с агентами, анализировать процессы |
| Доказательство качества | Контрольные числа и тесты правил | Проверка механизмов, калибровка, исторические тесты, неопределённость |
V1 сохраняет исходные правила без изменений. V2 получает отдельные версии данных, моделей и метрик. Модельные реакции жителей не меняют официальный Score V1.
Текущий статус
Реализован бэкенд V1: API, evaluator, Data Gate, локальный поиск альтернатив,
отчёт с evidence. Фронтенд из актуального main подключён к API через адаптер;
Compose поднимает оба слоя. В этой ветке добавлен бэкенд V2-demo: отдельный
worker, PostgreSQL, события, часы, checkpoint/ветки, парные эксперименты и экспорт.
Интерфейс из codex/aygerim-v2-preview объединён с этим бэкендом: кнопка
«Снегопад · V2» запускает реальный worker через API. Остальные исследовательские
экраны пока остаются preview; расчёт V1 доступен по /?mode=v1. AI и альтернативы V1 пока доступны
через API/Swagger, но не подключены к кнопкам текущего интерфейса.
LLM-адаптер проверен тестовыми ответами; живой вызов провайдера в этом прогоне
не выполнялся. Без ключа явно возвращается mode: rule-based.
| Возможность | Реализация | Доказательство |
|---|---|---|
| Расчёт AQOL | Эффекты, лаги, синергии, clip, штрафы и декомпозиция | Контрольный Score 56.54307 |
| Проверка портфеля | Ровно 5 уникальных мер, бюджет ≤100, ≤2 мер одного направления, районы и конфликты | Невалидный набор получает score: null |
| Data Gate → API | Исходник → quality report → опубликованный snapshot → evaluator | V1 закреплён за одним снимком |
| Альтернативы | Перебор одной замены меры/района; фиксация решений | Найден вариант 57.20556 за 100 |
| Объяснение | Сильные стороны, риски, последствия и проверенные предложения | Числа и формулировки берутся из серверного evidence |
| API-first | OpenAPI, проверка версий, структурные ошибки | HTTP integration tests |
| V2 «Снегопад» | 6 синтетических районов, транспортный спрос, бригады, очереди и обращения | python -m scripts.demo_v2 |
| V2 лаборатория | Сохраняемые прогоны, идемпотентные команды, replay, ветки, парные seed | Экспорт manifest/state/events + интервалы различий |
| V2 стратегический прототип | Когорты и миграция, жильё, проекты, проводки, синтетические голосования | Балансы населения и денег; статус каждого модуля в /v2/catalog |
Полная исследовательская платформа из ТЗ не объявляется завершённой: транспорт пока агрегированный, нет мультимодального графа, калибровки, модулей озеленения/безопасности и полного десятилетнего политико-бюджетного сценария. Реализованное и ограничения V2 · Контракт для фронтенда.
Быстрый старт
Нужно: запущенный Docker Desktop в режиме Linux containers (или Docker Engine)
с Docker Compose v2.20+ (или v5), Git и интернет для первой сборки. Python/Node на хосте
для этого способа не нужны. Объединённая версия находится в main:
git clone --branch main https://github.com/BAITC-Hacks/hack-d4922f7f-attractor.git
cd hack-d4922f7f-attractor
docker compose up --build -d --wait
После клонирования запуск всего проекта — одна последняя команда, без обязательного
.env и без ключей. Compose собирает web (React + nginx) и api (FastAPI +
engine + Data Gate), worker V2 и db (PostgreSQL); ждёт healthcheck.
База не публикует порт на хост. Для стабильного V1 без V2 сохранена ветка fix/backend-readiness.
| Куда открыть | Что находится |
|---|---|
| localhost:8080 | Новый интерфейс: API V1 и реальный прогон «Снегопад · V2»; mock-элементы подписаны |
| localhost:8080/?mode=v1 | Полный калькулятор V1: выбор пяти мер, валидация и расчёт |
| localhost:8000/docs | Swagger: расчёт, альтернативы, анализ и Data Gate |
| localhost:8000/health | Готовность бэкенда и версии снимка |
| localhost:8000/v2/catalog | V2: снимок, параметры, единицы, ограничения модулей |
| localhost:8000/v2/health | Heartbeat отдельного worker V2 |
В новом интерфейсе выберите «Снегопад · V2» и дождитесь 360 / 360 мин · completed.
Для V1 откройте «Расчёт V1» → «Загрузить контрольный сценарий» → «Рассчитать»:
ожидаемый Score — 56.54307.
Проверьте сквозной сценарий (каталог → расчёт → альтернативы → отчёт):
docker compose exec -T api python -m scripts.demo_backend
docker compose exec -T api python -m scripts.demo_backend --url http://web/api
docker compose exec -T api python -m scripts.demo_v2
Вторая команда проверяет также nginx-прокси, которым пользуется браузер.
Ожидается score: 56.54307, cost: 95, analysisMode: rule-based.
Третья воспроизводит снегопад, ветку с переброской бригады, сравнение по трём seed,
evidence-отчёт и проверяет ZIP-экспорт. Она не вызывает платный LLM.
Настройки, логи, остановка и повторный запуск
Необязательная настройка: скопируйте .env.example в .env
(PowerShell: Copy-Item .env.example .env; Linux/macOS: cp .env.example .env).
Если файл уже есть, отредактируйте его — не перезаписывайте секреты.
AKIM_WEB_PORT и AKIM_API_PORT меняют порты хоста (по умолчанию 8080 и 8000).
Например, если порт занят, задайте в .env AKIM_WEB_PORT=8081 или AKIM_API_PORT=8001.
Внутри контейнеров адреса не меняются. После изменения .env повторите команду запуска.
Compose подставляет параметры из .env; переменные оболочки имеют приоритет.
docker compose ps
docker compose logs --tail=100 api worker db
docker compose down
docker compose up --build -d --wait
down останавливает контейнеры, но сохраняет данные в named volumes data-gate и v2-postgres.
Не добавляйте -v, если снимки/импорты нужны: docker compose down -v удаляет их.
Не запускайте несколько API workers или параллельный CLI writer на этом volume.
API работает от непривилегированного пользователя; наружу порты привязаны только к localhost.
Если Docker недоступен, сначала запустите Docker Desktop и проверьте docker version.
Если healthcheck не проходит, посмотрите docker compose logs api.
Подложка карты загружается из внешнего сервиса и требует интернета; расчёт выполняет
локальный API. Первая сборка скачивает образы, npm- и Python-зависимости.
Запуск без Docker
Нужно: Python 3.11+, доступ к PyPI для установки. БД и ключ LLM для demo не нужны. Из корня клонированного репозитория, PowerShell:
python -m venv .venv
.venv/Scripts/python -m pip install -c requirements.lock ".[test]"
.venv/Scripts/python -m unittest discover -s tests -t .
.venv/Scripts/python -m uvicorn services.api.app:app --host 127.0.0.1 --port 8000
Linux / macOS
python3 -m venv .venv
.venv/bin/python -m pip install -c requirements.lock ".[test]"
.venv/bin/python -m unittest discover -s tests -t .
.venv/bin/python -m uvicorn services.api.app:app --host 127.0.0.1 --port 8000
Swagger UI · Каталог.
API сам импортирует и публикует официальный исходник. Хранилище:
var/data-gate относительно текущего каталога. Запускать один worker.
Для V2 запустите ещё один терминал из того же каталога:
.venv/Scripts/python -m engine.v2.infrastructure.worker
(Linux/macOS: .venv/bin/python -m engine.v2.infrastructure.worker).
Без AKIM_DATABASE_URL API и worker используют локальный SQLite-файл
var/v2/state.sqlite3; в Compose всегда используется PostgreSQL.
AKIM_RUN_TOKEN защищает изменяющие V2-запросы; пустое значение допустимо только
для локального однопользовательского демо. AKIM_ADMIN_TOKEN отдельно защищает Data Gate.
Это запуск только API. Для локальной разработки интерфейса дополнительно нужны
Node.js 22 и npm: в apps/web выполните npm ci и запустите npm run dev с
VITE_API_PROXY=true в окружении. Без этого переключателя калькулятор /?mode=v1
использует fixtures; новый preview всегда обращается к локальному API через /api.
В Compose нужный адрес /api встраивается автоматически при сборке.
Основная точка входа — services.api.app:app; старый api.main оставлен как legacy,
Compose его не запускает. Прототип api/v2.py из preview-ветки также сохранён как legacy:
он не подключён к production-router и не подменяет сохраняемые прогоны V2.
Демо бэкенда
Во втором терминале, пока сервер запущен:
.venv/Scripts/python -m scripts.demo_backend
Проверяются каталог/версии → контрольный расчёт → отказ неполному набору → альтернативы → evidence-backed report. Сохранённый реальный HTTP-прогон: backend-demo.json.
Для POST /v1/evaluate в Swagger:
{
"selections": [
{"measureId": "M7", "districtId": "nura"},
{"measureId": "M8", "districtId": "nura"},
{"measureId": "M10", "districtId": "nura"},
{"measureId": "M12", "districtId": null},
{"measureId": "M5", "districtId": "saryarka"}
]
}
Результат: valid: true, cost: 95, score: 56.54307. aqolScore — алиас Score.
Для интеграции передавайте также versions целиком из GET /catalog.
Архитектура
| Слой | Ответственность | Реализация |
|---|---|---|
| Аким / API | HTTP, доступ к импорту, версии, сборка use cases | services/api |
| Город | Валидация, точный расчёт, локальные альтернативы | engine/v1 |
| Динамический город | Временные переходы, ledger, очереди, когорты, проекты | engine/v2/domain |
| Прогоны и лаборатория | Команды, checkpoint, replay, ветвление, ансамбли | engine/v2/application |
| Worker и хранилище | Отдельный процесс, атомарные пакеты, PostgreSQL; локально SQLite | engine/v2/infrastructure |
| Данные | Парсеры, паспорт, quality gate, snapshots, lineage | data_gate |
| AI-аналитик | Выбор подтверждённых фактов, read-only tools, fallback | ai |
Домен/application движка не импортируют FastAPI, OpenAI SDK или Data Gate.
Composition root services/api/runtime.py переводит опубликованный payload в
immutable модель. Пользовательские импорты не подменяют официальный V1.
create_official_service() оставлен как загрузчик эталонного fixture.
Брифы для будущих изображений: README-VISUALS.md. Целевая архитектура с V2: docs/02-architecture.md.
Как считается V1
I′ = clip(I + Σ effect × (8 − lag) / 8 + synergy, 0, 100)
Ddistrict = Σ weight × I′
Score = 0.7 × Davg + 0.3 × min(Ddistrict) − Ncritical
Нужно ровно пять мер, не больше двух одного направления, а не по одной каждой категории. Промежуточные значения не округляются. Критичность — строго ниже 40; остаток бюджета бонуса не даёт. LLM не считает Score. Полная спецификация.
Проверенные результаты
Локально: Windows/Python 3.12.10; проверены Linux-контейнеры через Docker Desktop. CI для Python 3.11/3.12 и Compose добавлен; удалённый результат пока не подтверждён.
| Проверка | Результат |
|---|---|
| Автотесты | 140 Python (139 общий запуск + 1 новый контрактный отдельно), 3 Node; без многократного полного прогона |
| База без мер (диагностика) | 52.55768 |
| Контрольный портфель за 95 | 56.54307 |
| Декомпозиция прироста | +0.85064 +1.13475 +2 = +3.98539 |
| Лучшая найденная локальная альтернатива | 57.20556, стоимость 100 |
| Официальный импорт | 0 critical / 0 warning |
| Установка | pip install, сборка wheel, ресурсы и HTTP smoke вне checkout |
| Статические проверки | Ruff, pip check, синхронизация OpenAPI |
| Docker Compose | API, worker, PostgreSQL и web healthy; V1 через nginx и V2 HTTP-demo прошли |
| V2, три парных seed | Медиана изменения service-unavailability-hours: −68.8702, p05…p95 −70.8670…−63.4259; дополнительный расход 5 000 модельных KZT |
V2-числа — результат синтетического опыта за 840 модельных минут, а не прогноз реального города. Интервал по трём seed иллюстрирует воспроизводимость, но слишком мал для исследовательского вывода. Полный протокол и исходы: v2-demo.json. Бюджет выполним в обеих ветках; равенство фактических расходов не заявляется.
API-first контракты
| Endpoint | Назначение |
|---|---|
GET /health, GET /catalog | Готовность, каталог, правила, версии, manifest |
POST /v1/validate | Валидация без LLM |
POST /v1/evaluate | Расчёт; неправильный портфель → 200 с valid: false |
POST /v1/alternatives | Одна замена; fixedSelections, allowedDistricts, resultLimit |
POST /v1/analysis | Отчёт с evidence, явными mode и статусом fallback |
POST /datasets/imports | Текстовый импорт с паспортом; admin token |
GET /datasets/imports/{id}/report | Report, mapping, preview; admin token |
POST /datasets/imports/{id}/publish | Публикация с принятием warnings; admin token |
GET /datasets | Наборы и manifest; admin token |
GET /v2/catalog, GET /v2/health | Данные/допущения V2 и состояние worker |
POST /scenarios, POST /runs | Immutable-сценарий и отдельный прогон с seed |
POST /runs/{id}/commands | Часы и управленческие решения; версия и idempotency key |
POST /runs/{id}/checkpoints, /branches, /replay | Сохранение, ветки и проверка воспроизводимости |
GET /runs/{id}/events, /metrics, /trace/{eventId} | SSE с cursor, ряды, evidence и причинная трасса |
GET /runs/{id}/population, /development, /flows, /politics | Стратегические подсистемы и проводки |
POST /experiments, GET /experiments/{id} | Асинхронные парные ансамбли; эмпирические интервалы |
POST /assistant/messages, GET /runs/{id}/export | Rule-based evidence-отчёт V2 и ZIP воспроизведения |
Неверная структура → 422; устаревшие версии / запрещённая публикация → 409;
нет доступа → 403; body >1 200 000 байт → 413.
Ошибки: error: {code, field, message}.
Контракты и расхождения с черновым frontend-клиентом.
AI и конфигурация
LLM выбирает/упорядочивает готовые evidence IDs. Сервер проверяет категорию, обязательные риски и полноту, затем подставляет собственные числа и фразы. Это ограниченный evidence-аналитик, не свободный городской агент. Невалидный ответ: один repair, затем шаблон. Ошибка провайдера не ломает расчёт.
| Переменная | Назначение |
|---|---|
AKIM_WEB_PORT, AKIM_API_PORT | Порты Compose на localhost: по умолчанию 8080 и 8000 |
AKIM_DATA_GATE_DIR | Путь при прямом Python-запуске; Compose фиксирует путь persistent volume |
AKIM_CORS_ORIGINS | Разрешённые адреса UI через запятую; по умолчанию закрыто |
AKIM_ADMIN_TOKEN | Bearer token для Data Gate; без него HTTP-доступ закрыт |
AKIM_RUN_TOKEN | Bearer token для управления V2; пустой только для локального demo |
AKIM_DB_PASSWORD | Пароль внутренней PostgreSQL Compose; demo-default не для production |
AKIM_DATABASE_URL, AKIM_V2_STORE | PostgreSQL URL либо SQLite-файл при запуске без Compose |
AKIM_CODE_REVISION | Метка сборки/commit в manifest; задайте при выпуске |
AKIM_LLM_ENABLED=1 | Явное включение платных запросов |
OPENAI_API_KEY, OPENAI_MODEL | Ключ и доступная Responses-модель с tools/structured outputs |
AKIM_LLM_MAX_ANALYSES | Анализов на процесс: по умолчанию 10, максимум 100 |
.env.example — шаблон для необязательного .env. Compose читает
.env автоматически, прямой Python — нет (экспортируйте переменные в оболочку).
Ключи не коммитьте: .env исключён из Git и Docker build context. Лимиты LLM: один одновременный
анализ, deadline 20 секунд, ≤3 вызовов включая repair, ≤800 output tokens/вызов;
SDK retries отключены. Это не денежный лимит: настройте бюджет проекта провайдера.
Data Gate
Поддержаны исходник задания, City JSON, GeoJSON WGS84, синтетический V2 City, CSV/XLSX/JSON для нормализованных наблюдений с единицами, provenance и тремя временами. Это определённые схемы, не автоматическое понимание произвольной таблицы. Дубли JSON-ключей, NaN/Infinity, неверные типы/даты/ссылки не исправляются молча. Критические ошибки блокируют публикацию; checksum staging и snapshot проверяется при чтении. Идентичность импорта учитывает байты, формат, паспорт и transform version.
.venv/Scripts/python -m data_gate --store var/data-gate bootstrap
Структура проекта
engine/v1/ правила, evaluator, application service, локальный search
engine/v2/domain/ scheduler и чистые переходы синтетического города
engine/v2/application/ прогоны, команды, checkpoint, ветки, replay, эксперименты
engine/v2/infrastructure/ Data Gate adapter, PostgreSQL/SQLite, отдельный worker
data_gate/ import, quality, snapshots, файловые/in-memory adapters, CLI
services/api/ HTTP-модели, маршруты, доступ, composition root
ai/ evidence policy и Responses adapter
packages/contracts/ domain JSON Schema и генерируемый OpenAPI
data/ исходник и эталонный fixture (входят в wheel)
tests/ golden, regression, integration, search, AI contract tests
scripts/ HTTP demo, OpenAPI export, wheel smoke
apps/web/ React UI и адаптер HTTP-контрактов
compose.yaml API + worker + PostgreSQL + существующий web; volumes и healthchecks
deploy/ nginx reverse proxy для web → API
docs/ спецификации, аудит, evidence
assets/ логотип и будущие изображения README
Что дальше
Перед защитой: подключить кнопки AI/альтернатив, записать демо, проверить живую LLM-модель и сравнить пользу с rule-based baseline, получить зелёный CI. Сроки не зафиксированы.
Следующий этап: расширить engine/v2/domain графом маршрутов и полным бюджетным
циклом; вынести event log из JSON-документа в отдельную PostgreSQL-таблицу, добавить
RBAC и измерить задержки на длинном горизонте. Очередь, worker и replay уже есть.
Дальше: реальные разрешённые данные, калибровка/holdout, новые SourceParser
adapters и анализ параметрической неопределённости поверх ансамблей V2.
Первое ограничение роста — размер полного run-документа и журналов; масштабирование
обосновывается измерениями, не числом нарисованных агентов.
Ограничения
- V1 — синтетическое задание, не прогноз и не доказательство причинного эффекта.
- Поиск локальный: глобальный максимум не заявляется.
- Live LLM и пользовательские исследования не подтверждены этим прогоном. UI собирается и связан с API; это ещё не полная UX-приёмка.
- V2 — частичный V2-demo, не полная реализация всех MUST ТЗ. Коридорное время поездки — модельный proxy, не измеренный P90; интервалы seed не являются confidence interval. В стратегическом режиме услуги агрегируются по суткам, месяц равен 30 дням. Субсуточную погоду проверяйте в оперативном режиме.
- Файловый Data Gate: один процесс-писатель; не запускайте CLI/API одновременно на одном хранилище. Lock API не заменяет межпроцессные транзакции.
- Нет готового публичного production deployment, RBAC, постоянного бюджета LLM или нагрузочного отчёта. Compose — локальный demo-профиль, не production.
npm auditобнаруживает critical XSS в пришедшем из main[email protected](GHSA-jrc7-96c5-q579). Исправление начинается с 6.4.1; перед публичным показом нужен проверенный major upgrade. Внешний стиль карты использует затронутый attribution-путь; localhost не устраняет XSS.- Отдельная лицензия и состав команды пока не опубликованы.
Документация
Продукт · Архитектура · V1 · V2 · Данные · AI · Исследования · План.
Оценка по обеим рубрикам, исправления и приоритеты: BACKEND-AUDIT.md.
Данные предоставлены в условии задачи. «Исследовательская платформа» означает воспроизводимые гипотезы и прозрачные допущения, а не подтверждённую точность на реальном городе.
Авторы коммитов
История коммитов
- 2026-09-23 17:54docs: add AKIM video overview to READMEShah Shamuratov
- 2026-09-23 17:45feat: merge V2 preview with persistent simulation backendVllSunday
- 2026-09-23 17:45Revert "docs: add planning assets and V2 preview captures"Aigerim Tanyskozhinova
- 2026-09-23 17:42docs: add planning assets and V2 preview capturesAigerim Tanyskozhinova
- 2026-09-23 17:40Merge remote-tracking branch 'origin/feat/v2-simulation' into release/v2-integratedVllSunday
- 2026-09-23 17:38feat(v2): add persistent simulation backend and experiment APIVllSunday
- 2026-09-23 17:36feat(api): add synthetic V2 snowfall run sliceAigerim Tanyskozhinova
- 2026-09-23 17:35Merge remote-tracking branch 'origin/main' into codex/aygerim-v2-previewAigerim Tanyskozhinova
Все коммиты (33)
- 2026-09-23 17:34feat(frontend): publish V2 city twin design and keyless mapAigerim Tanyskozhinova
- 2026-09-23 17:29docs: add AKIM concept demo videoShah Shamuratov
- 2026-09-23 17:24Merge remote-tracking branch 'origin/docs/v2-spec' into feat/v2-simulationVllSunday
- 2026-09-23 17:20feat(deploy): integrate web and add one-command Compose startupVllSunday
- 2026-09-23 17:14feat(backend): add verified API workflow and harden data importsVllSunday
- 2026-09-23 16:43fix: bundle reference data and reject invalid snapshot numbersShah Shamuratov
- 2026-09-23 16:41Merge remote-tracking branch 'origin/main' into codex/aygerim-frontendAigerim Tanyskozhinova
- 2026-09-23 16:39feat(frontend): connect city cockpit to simulation APIAigerim Tanyskozhinova
- 2026-09-23 16:26docs(readme): restore v1 and v2 comparisonVllSunday
- 2026-09-23 16:22docs(readme): align architecture and add project brandingVllSunday
- 2026-09-23 16:11Merge remote-tracking branch 'origin/main' into codex/aygerim-frontendAigerim Tanyskozhinova
- 2026-09-23 16:03feat(frontend): scaffold API-first city cockpitAigerim Tanyskozhinova
- 2026-09-23 16:03merge: integrate simulation layer into mainShah Shamuratov
- 2026-09-23 16:03merge: integrate data layer with simulationShah Shamuratov
- 2026-09-23 15:54feat(simulation): implement deterministic v1 engineVllSunday
- 2026-09-23 15:27Merge branch 'refs/heads/main' into codex/aygerim-frontendAigerim Tanyskozhinova
- 2026-09-23 15:01docs: summarize dataset analysisAigerim Tanyskozhinova
- 2026-09-23 14:38docs(readme): document agentic architectureVllSunday
- 2026-09-23 14:35docs: replace project plan with city simulation research roadmapShah Shamuratov
- 2026-09-23 14:13docs: plan AKIM agents graphs and formulas from 13:35 AlmatyShah Shamuratov
- 2026-09-23 13:45docs: describe Docker packaging planAigerim Tanyskozhinova
- 2026-09-23 13:35docs(readme): add city simulator project outlineVllSunday
- 2026-09-23 17:12docs(v2): add population, development, city finance flows and politicsAlexandr
- 2026-09-23 16:56docs: add V2 technical specification and frontend planAlexandr
- 2026-09-23 16:00feat(data-gate): add data layer per docs/05Alexandr
Структура репозитория (190 файлов)
.dockerignore .env.example .github/workflows/backend.yml .gitignore DATASET_ANALYSIS.md Dockerfile README.md ai/__init__.py ai/analysis.py ai/openai_adapter.py api/__init__.py api/main.py api/v2.py apps/web/Dockerfile apps/web/index.html apps/web/package-lock.json apps/web/package.json apps/web/public/design-v2/data/astana-core.geojson apps/web/public/design-v2/index.html apps/web/public/design-v2/themes/dark.css apps/web/public/design-v2/themes/light.css apps/web/public/maps/astana-core.geojson apps/web/public/mock-api/README.md apps/web/public/mock-api/alternatives.json apps/web/public/mock-api/alternatives.response.json apps/web/public/mock-api/astana-districts.geojson apps/web/public/mock-api/catalog.json apps/web/public/mock-api/evaluate-golden.json apps/web/public/mock-api/evaluate-golden.response.json apps/web/public/mock-api/evaluate-invalid.json apps/web/public/mock-api/evaluate-invalid.response.json apps/web/public/mock-api/validate-invalid.json apps/web/public/mock-api/validate-invalid.response.json apps/web/public/mock-api/validate-valid.json apps/web/public/mock-api/validate-valid.response.json apps/web/src/application/ports.ts apps/web/src/domain/scenarios.ts apps/web/src/domain/types.ts apps/web/src/infrastructure/httpV1Api.test.mjs apps/web/src/infrastructure/httpV1Api.ts apps/web/src/main.tsx apps/web/src/presentation/App.tsx apps/web/src/presentation/styles.css apps/web/src/presentation/v2.css apps/web/tests/previewApi.test.mjs apps/web/tsconfig.app.json apps/web/tsconfig.json apps/web/tsconfig.node.json apps/web/vite.config.ts artifacts/video-test/AKIM-test-01.mp4 assets/akim-logo.png assets/akim-video-overview.jpg assets/akim-video-overview.mp4 compose.yaml data/__init__.py data/source-dataset.ru.txt data/v1/official-v1.snapshot.json data/v2-demo-city.json data_gate/README.md data_gate/__init__.py data_gate/__main__.py data_gate/application/__init__.py data_gate/application/ports.py data_gate/application/service.py data_gate/composition.py data_gate/domain/__init__.py data_gate/domain/canonical.py data_gate/domain/errors.py data_gate/domain/model.py data_gate/domain/preview.py data_gate/domain/quality.py data_gate/domain/v2_quality.py data_gate/infrastructure/__init__.py data_gate/infrastructure/clock.py data_gate/infrastructure/filesystem.py data_gate/infrastructure/memory.py data_gate/infrastructure/parsers/__init__.py data_gate/infrastructure/parsers/city_json.py data_gate/infrastructure/parsers/geojson.py data_gate/infrastructure/parsers/source_text_v1.py data_gate/infrastructure/parsers/v2.py data_gate/infrastructure/serialization.py deploy/nginx.conf docs/01-product.md docs/02-architecture.md docs/03-v1-reference-model.md docs/04-v2-simulation.md docs/05-data-gate.md docs/06-ai-and-interactions.md docs/07-research-validation.md docs/08-delivery-plan.md docs/09-v2-technical-spec.md docs/10-frontend-plan.md docs/BACKEND-AUDIT.md docs/README-VISUALS.md docs/V2-API.md docs/V2-IMPLEMENTATION.md docs/evidence/backend-demo.json docs/evidence/v2-demo.json engine/__init__.py engine/v1/__init__.py engine/v1/application/__init__.py engine/v1/application/alternatives.py engine/v1/application/service.py engine/v1/domain/__init__.py engine/v1/domain/model.py engine/v1/domain/scoring.py engine/v1/domain/validation.py engine/v1/infrastructure/__init__.py engine/v1/infrastructure/json_snapshot.py engine/v2/__init__.py engine/v2/application/__init__.py engine/v2/application/controller.py engine/v2/application/experiments.py engine/v2/application/ports.py engine/v2/domain/__init__.py engine/v2/domain/fixtures.py engine/v2/domain/simulation.py engine/v2/infrastructure/__init__.py engine/v2/infrastructure/datasets.py engine/v2/infrastructure/store.py engine/v2/infrastructure/worker.py engine/v2/snowfall.py packages/contracts/README.md packages/contracts/data-gate-import.report.schema.json packages/contracts/data-gate-snapshot.manifest.schema.json packages/contracts/openapi.json packages/contracts/package.json packages/contracts/src/errors.ts packages/contracts/src/index.ts packages/contracts/src/v1.ts packages/contracts/tsconfig.json packages/contracts/v1-evaluate.request.schema.json packages/contracts/v1-result.schema.json packages/contracts/v1-validate.result.schema.json packages/contracts/v2-checkpoint.schema.json packages/contracts/v2-command.schema.json packages/contracts/v2-dataset.schema.json packages/contracts/v2-event.schema.json packages/contracts/v2-evidence.schema.json packages/contracts/v2-metrics.schema.json packages/contracts/v2-run-manifest.schema.json packages/contracts/v2-run.schema.json packages/contracts/v2-scenario.schema.json previews/v2/data/astana-core.geojson previews/v2/index.html previews/v2/scripts/osm_extract.py previews/v2/themes/dark.css previews/v2/themes/light.css pyproject.toml requirements.lock scripts/demo_backend.py scripts/demo_v2.py scripts/export_openapi.py scripts/smoke_wheel.py services/__init__.py services/api/__init__.py services/api/app.py services/api/contracts.py services/api/runtime.py services/api/v2.py services/api/v2_contracts.py tests/__init__.py tests/ai/__init__.py tests/ai/test_analysis.py tests/api/__init__.py tests/api/test_api.py tests/api/test_http.py tests/data_gate/__init__.py tests/data_gate/helpers.py tests/data_gate/test_cli.py tests/data_gate/test_engine_contract.py tests/data_gate/test_quality.py tests/data_gate/test_regressions.py tests/data_gate/test_service.py tests/data_gate/test_source_parser.py tests/data_gate/test_v2.py tests/v1/__init__.py tests/v1/test_alternatives.py tests/v1/test_golden.py tests/v1/test_properties.py tests/v1/test_snapshot.py tests/v1/test_snapshot_numbers.py tests/v1/test_validation.py tests/v2/__init__.py tests/v2/test_contracts.py tests/v2/test_controller.py tests/v2/test_domain.py tests/v2/test_http.py tests/v2/test_snowfall.py
Обсуждение 0 комментариев
Войдите, чтобы комментироватьПока нет комментариев — будьте первым.
