AAYMA
RU
Войти

QOL-SIM

Веб-симулятор акима Астаны: игрок выбирает 5 из 14 мер для 5 синтетических районов в пределах бюджета 100, движок оценивает план индексом качества…

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

О проекте

Команда: TΞSTING
Кейс HackAlem.ai: Спецтрек — Astana Innovations
Стадия: Доведённый продукт

Задача кейса: «Аким на 5 часов»: городской симулятор, распределяющий бюджет по 5 направлениям и 5 районам

Суть

Веб-симулятор акима Астаны: игрок выбирает 5 из 14 мер для 5 синтетических районов в пределах бюджета 100, движок оценивает план индексом качества жизни и ранжирует его среди всех допустимых планов. LLM-аналитик объясняет результат, а «совет акима» из 7 персонажей обсуждает план и предлагает замены.

Как устроено

Сценарий (показатели районов, каталог мер со стоимостью, лагами и эффектами) хранится в коде. Движок на чистом TypeScript валидирует план, считает Astana Quality of Life Score, при старте перебирает всё пространство планов, считает точные вклады Шепли каждой меры и подбирает лучшие замены. Поверх расчёта работают LLM-аналитик и председатель совета через OpenAI tool calling; без ключа их заменяют офлайн-шаблоны. Сессии совета стримятся через SSE, лучшие результаты команд хранятся в PostgreSQL.

Ключевые решения

  • exhaustive plan enumeration
  • exact Shapley values
  • OpenAI tool calling
  • multi-agent council (7 персонажей)
  • Server-Sent Events
  • offline template fallback

Особенности

Разбор плана «как шахматной партии»: полный перебор всех допустимых планов даёт ранг плана, а точные значения Шепли показывают вклад каждой меры. LLM только объясняет готовые расчёты движка. Параллельно с разработкой команда разослала экспертам и в GSPP четыре письма с предложением использовать симулятор, всё это записано в outreach log. Покрытие тестами 100%, есть CI и деплой.

Стек

TypeScript · React 19 · Vite · NestJS · PostgreSQL · TypeORM · RxJS · Docker Compose · Vitest · Playwright · GitHub Actions · DigitalOcean App Platform

Модели

gpt-4.1-mini


Проект создан за 5 часов на финале хакатона HackAlem.ai (23 сентября 2026, Астана). Код — BAITC-Hacks/hack-b0e0ddb6-t-sting.

README

README.md

QOL-SIM

An AI-powered mayor (akim) simulator for teams, urban analysts, and anyone who wants to explore the consequences of city policy decisions.

With a limited budget, a useful initiative does not necessarily make the whole city better. QOL-SIM lets you choose exactly five of 14 measures for five simulated districts of Astana, then reviews the plan like a chess game: it calculates the Astana Quality of Life Score, each decision's contribution, the plan's rank among all valid plans, and the best replacements. An analyst explains the results and trade-offs using the engine's calculations.

Plan review: score, districts, measure contributions, and recommendations

Live demo

Try the deployed app: QOL-SIM.

Demo Video

Watch the demo video.

Five hours. Three people. Four messages.

We wanted to leave with a simulator people could try and a reason for someone outside the hackathon to open it. We started looking for those people while the app was still being built.

Sayazhan built the application. He explored interface designs, challenged implementation choices, picked the features and worked through them with Codex. He owned the main repository.

Dos worked out what to build and whom to show it to. He researched the case, shaped the product logic, found contacts and prepared the outreach workflow.

Margulan kept the build connected to that search. He found design references, worked with Sayazhan on the user flow, filmed the team, kept the log and sent the messages. We made product decisions together and wrote this account together.

One plan did not make the cut: a separate agent-orchestration extension. We ran out of time to integrate it and dropped it from this submission. It is not part of the delivered product.

By the end of the build, we had sent four messages asking for expert feedback or offering the simulator as a training exercise. The outreach log records the recipients and proposals. No replies are confirmed in the latest log. Our next step is to show the working scenario, ask where the model gets things wrong, and find out whether it belongs in a classroom for public officials.

Watch the five hours behind the demo. See the team working through screens, building the app and reaching out to people who might use it—all during the same build window.

Build and outreach video diary — Google Drive link to be added.

Doc files

  • Build story — The hackathon development timeline, including product decisions, implementation milestones, and lessons from testing.
  • Source dataset — The scenario's district indicators and measure catalog, including costs, implementation lags, and effects.
  • Implementation plan — The original simulator plan, covering architecture, API contracts, implementation steps, and validation checks.
  • External tools — The inventory of vendored agent skills, their sources and pinned revisions, attribution, licensing, and update instructions.

How it works

You play the mayor of a simulated Astana. Your goal is to improve life in the city with a limited budget.

  1. Explore the city. Open the live demo and look at the districts to see where schools, transport, healthcare, and other services need help.
  2. Build a plan. Choose five different measures, pick a district where needed, and stay within the budget of 100. You can load an example plan to get started.
  3. Review the results. See your city's quality-of-life score, which districts benefit, and which choices help or hurt. Read the analyst's explanation of the strengths and risks.
  4. Improve your choices. Try a suggested replacement and review the updated result. You can also bring the plan to the mayor's council, hear different views, and accept a proposed change.
  5. Compare with other teams. Submit your plan under a team name. The registry keeps your team's best score so you can compare results and try again.

The city data is synthetic: this is a way to explore trade-offs and learn from decisions, not a prediction of real-world outcomes.

Tech Stack

  • Language and runtime: TypeScript 5.9, Node.js 24, and npm 10 workspaces for the shared frontend/backend repository.
  • Frontend: React 19, React DOM, and Vite 8 with the React plugin; CSS and SVG for the interface, district map, and charts.
  • Backend: NestJS 12 with its Express adapter and reflect-metadata for the HTTP API and application services.
  • Simulation engine: Plain TypeScript for plan validation, scoring, exhaustive plan comparison, exact Shapley contributions, and suggested replacements.
  • Database: PostgreSQL 17, TypeORM 0.3, and the pg driver for migrations, team submissions, and council history, including JSONB records.
  • External AI API: OpenAI Chat Completions, called through native server-side fetch, with gpt-4.1-mini as the default configurable model. Tool calling supports the analyst and council chair; offline templates keep the flow working without an API key.
  • Live council updates: Server-Sent Events (SSE), RxJS, and the browser's EventSource API for streaming and replaying saved session events.
  • Environment configuration: dotenv and environment variables for database settings, server-only API credentials, model selection, and timeouts.
  • Unit and component tests: Vitest with V8 coverage, React Testing Library, jest-dom, user-event, and jsdom; line and branch coverage are enforced at 100%.
  • Browser and integration tests: Playwright with Chromium, plus Node.js smoke scripts that check the running frontend, API, database, and council flow.
  • Code quality: ESLint, typescript-eslint, React Hooks lint rules, Prettier, and TypeScript type checking.
  • Local development: Docker and Docker Compose for the app and database, Nest CLI for backend builds and watch mode, ts-node for TypeORM tooling, and concurrently to run both development servers.
  • Version control and CI: Git, GitHub, and GitHub Actions for pull requests, static checks, coverage, builds, browser tests, and Compose smoke/migration checks.
  • Deployment setup: The developer guide covers DigitalOcean App Platform and Managed PostgreSQL, including pre-deploy migrations and database TLS certificates.
  • AI development tools: Codex and Claude Code, with shared repository instructions and vendored Vercel skills for React composition, performance, view transitions, and interface reviews. Sources and licensing are recorded in External tools.

Outreach for adoption

On September 23, alongside development, we contacted four recipients about expert feedback and potential use of the city management simulator:

  • Asad Bokhari, NU GSPP — feedback on where our model diverges from practice, drawing on his research into AI, e-government, and smart cities.
  • Didar Yedilkhan, Director of AITU's Smart City Research Center ([[email скрыт]](mailto:[email скрыт])) — an invitation to review the working version and take it forward at the Center, which works on SmartCity models and urban data in Astana.
  • Zhanar Ismailova and GSPP Executive Education ([[email скрыт]](mailto:[email скрыт]), [[email скрыт]](mailto:[email скрыт])) — a proposal to use the simulator as a training exercise for serving public officials whose work involves allocating budgets.

The simulator is offered free of charge, with no obligations. No replies had been received by the time of the final presentation. The outreach is recorded in our build story.

One-command startup

Requires Docker with Compose v2. From the repository root:

cp .env.example .env
docker compose up --build --wait --wait-timeout 180

Open localhost:5173. API: localhost:3000/api/scenario. On startup, the API applies migrations and enumerates the plan space once. PostgreSQL stores the team registry and council session history; scenario data is versioned in code.

The core flow does not require an AI API key. With an empty OPENAI_API_KEY, the deterministic offline analyst and the full council session still work. If the provider fails, times out, or returns an invalid response, the app uses a template for the affected response and clearly labels its source.

npm run smoke           # Check the running stack; requires local Node
# Run the same check without local Node:
docker compose exec -T web node scripts/smoke.mjs http://localhost:5173 http://api:3000
docker compose logs -f
docker compose down     # Stop services and preserve PostgreSQL data

Compose uses the project name testing-workspace, binds ports to localhost, and stores the database in a named volume. This is a development environment with hot reload. Rebuild the containers after changing dependencies or environment variables. The example password is for local development only; changing .env does not change the password of an existing database.

For DigitalOcean App Platform, run migrations in a separate pre-deploy Job and set POSTGRES_CA_CERT for a verified TLS connection to Managed PostgreSQL. Setup and commands.

Mayor's council

From a completed review, select "bring to council", then "start session". Seven fictional participants discuss the plan, propose valid replacements, and vote on the chair's verified recommendation. These are educational characters identified only by their roles; the data is synthetic.

Council: roundtable and validated statements

ParticipantScore component and metric
TransportT1, T2 · weight 0.20; weighted contribution to the city average score
EnvironmentE1, E2 · 0.20; the same contribution metric
Social servicesS1, S2 · 0.22; the same contribution metric
SafetyB1, B2 · 0.18; the same contribution metric
Municipal servicesC1, C2 · 0.20; the same contribution metric
OmbudsmanLowest district score minus the number of critically low values
FinanceScore gain over the do-nothing baseline per 10 budget units
ChairFinal Score, validity, and the cost of trade-offs

The five sector contributions add up to the city average score. The engine determines positions, up to three candidates for each participant, replacement impacts, objections, and votes. The LLM writes the dialogue; numbers and IDs are checked against the allowed facts. Validating numeric literals does not establish the semantic truth of arbitrary text: the calculation log is available alongside the dialogue.

Engine briefs → seven parallel statements → validation of each statement
→ proposed amendments → up to two objections → the author's response
→ chair: evaluate_package / get_amendment_impacts, up to four steps
→ verified recommendation only → vote → saved minutes
→ accept an amendment or package → updated plan → new review

An invalid ID, unsupported number, malformed JSON, or timeout replaces only the affected statement with a template. If the chair fails, the minutes are assembled from engine-verified options. Without a key, every stage uses templates with the same events. The interface labels the source of the dialogue and minutes; disconnecting the browser does not stop the session on the server.

PostgreSQL stores the original plan, events, and minutes. SSE publishes events after they are saved; reconnection resumes the history from the event ID. Saved sessions can be opened and replayed. After an API restart, an unfinished session is marked as interrupted; completed minutes remain available. The local stack is designed for a single API process.

One-minute demo: strong example → council → compare light rail transit (LRT) in Nura and Esil → environmental objection → rejected package costing 104 → vote → accept LRT in Nura → new Score 57.21. The engine calculates the numbers; mockups are not a source of calculations.

Clarification of the original plan and mockups: replacing M10@Nura → M14 gives 56.62718 → 56.63, a gain of 0.08411 → +0.08. The reference value of 56.64 was inaccurate. The benchmark for LRT in Nura is 57.20556 → 57.21, a change of +0.66249 → +0.66; the vote is 5 in favor / 1 abstention / 1 against.

Connecting OpenAI

Add your key to the root .env when it is ready:

OPENAI_API_KEY=your_key_from_platform.openai.com
AI_MODEL=gpt-4.1-mini
AI_COUNCIL_MODEL=gpt-4.1-mini
AI_TIMEOUT_MS=25000
AI_COUNCIL_TIMEOUT_MS=12000

After changing .env, restart the local API or run docker compose up -d --build api. An empty AI_COUNCIL_MODEL falls back to AI_MODEL. Only the server reads the key; there are no VITE_ variables for it. Availability of the selected model depends on your OpenAI project. The integration is tested with deterministic provider responses and offline mode; calls using a real key have not been verified.

How results are calculated

The data is synthetic, and the map boundaries are schematic. The simulator explains the defined model rather than forecasting the real urban economy.

Realized effect = full effect × (8 − lag) / 8
I'[district, indicator] = clip(baseline value + effects + synergies, 0, 100)
D[district] = Σ weight[indicator] × I'[district, indicator]
D_avg = Σ population_share[district] × D[district]
Score = 0.7 × D_avg + 0.3 × min(D) − N_crit
N_crit = number of values strictly below 40

The horizon is eight quarters. Synergies are fixed and are not scaled by lag. Unspent budget earns no bonus. The engine retains full precision internally; HTTP responses and the interface round values for display. Ranks use unrounded values, and tied results share a rank.

Rules: exactly five distinct measures, total cost no greater than 100, at most two measures per sector, and a district required for district-level measures but forbidden for citywide measures. M1 and M3 are incompatible regardless of district; M4/M7 and M5/M13 are incompatible within the same district. All five sectors are available, but covering all five is not mandatory: the dataset contains no such constraint.

The Score change is calculated before rounding: for the example, it is 3.98539, displayed as +3.99. Subtracting the already rounded values 56.54 and 52.56 gives 3.98, so the client receives a separate engine-calculated scoreDelta field.

Each move's contribution is its exact Shapley value across all subsets of the plan. The contributions add up to the Score change from the do-nothing baseline. A move's rating accounts for the best valid single replacement:

RatingRule
Blunder (blunder)Negative contribution
Mistake (mistake)Best replacement gains ≥ 1.0
Inaccuracy (inaccuracy)Best replacement gains ≥ 0.3
Good (good)Best replacement gains > 0.05
Best (best)Replacement improves the score by no more than 0.05
Brilliant (brilliant)Rated best, with either removal bringing back a critically low value or the measure activating a synergy

Efficiency = (Score − baseline Score) / (optimum − baseline Score) × 100%; it can be negative for a harmful plan. Percentile reflects the plan's position in the full space of valid plans. The histogram uses the same results with a bin width of 0.25.

Benchmark checks

npm test verifies the source scenario's numbers without network requests or a database:

CheckResult
Do nothing52.56, two critically low values in Nura
Strong example56.54; budget 95; 0 critically low values
Number of valid plans694,395
Optimum57.24; M2, M3@Nura, M8@Nura, M9@Nura, M14; budget 98
Worst valid plan52.04
Plans worse than doing nothing20,003
Example's rank566; percentile 99.9; efficiency about 85%
Example's contributions1.45, 1.40, 0.49, 0.47, 0.17; exact sum 3.98539
Example's best replacementM5@Saryarka → M3@Nura; 57.21, gain 0.66
Trap plan52.45; budget 86; M11@Almaty contribution −0.87
Best plan covering all five sectors56.34

Architecture

React / Vite → same-origin /api proxy → NestJS
                                          ├─ SimulationService → pure TypeScript engine
                                          │    ├─ astana-v1 version, rules, Score
                                          │    └─ exhaustive search, Shapley values, replacements, move ratings
                                          ├─ AnalysisService → engine tools → OpenAI
                                          │    └─ offline analyst when the key is missing or an error occurs
                                          ├─ CouncilService → briefs → OpenAI / templates → minutes
                                          │    └─ PostgreSQL jsonb → history / SSE → React
                                          └─ SubmissionsService → TypeORM → PostgreSQL
  • apps/api/src/simulation/engine: data, validation, scoring formula, exhaustive search, exact contributions, and best replacements. No Nest or database dependency.
  • apps/api/src/simulation: HTTP parser and service that assembles the Review. Invalid plans do not receive a Score.
  • apps/api/src/analysis: LLM adapter, bounded tool loop, JSON validation, and offline explanations. The HTTP adapter is isolated in llm-client.ts.
  • apps/api/src/submissions: server-side recalculation of results and plan persistence.
  • apps/api/src/council: metrics, briefs, amendments, agents, voting, streaming, and session persistence.
  • apps/web/src/features: builder, review, council, registry, and tutorial (onboarding). The browser does not implement the Score formula; the lag control calculates only the tutorial example.
  • apps/*/tests: behavior tests whose structure mirrors the source files.

The agent uses evaluate_plan, explain_contributions, get_rank, find_best_swaps, and evaluate_alternative. It is limited to six steps, with an overall timeout of 25 seconds by default. Numbers and valid alternatives come from the tools. The final response is checked for structural validity. An additional check rejects numeric literals absent from the tool results, allowing for rounding. It does not verify whether a number refers to the correct district or claim; this is not full semantic validation. The offline review formats engine results directly.

The registry is public and has no authentication: a team name is a label, not a protected account. Names are compared case-insensitively. Submission history is retained, and the table shows each team's best result; when Scores are equal, the earlier submission wins.

Challenge requirements

We track the challenge's requirements and supporting evidence in the version 0.1 plan and the initial requirements map. These are works in progress: further detail and final README coverage are still being developed, and full compliance is not yet claimed.

Requirement / criterionImplementationVerification
Shared budget and data; criterion 1simulation/engine/scenario.ts, /api/scenariosimulation/engine/scoring.test.ts, simulation/simulation.test.ts
Decisions across five sectorsCatalog of 14 measures, builder filterssimulation/engine/scoring.test.ts, features/Builder.test.tsx
Budget control; criterion 2validation.ts, server-side rejection of reviewssimulation/engine/scoring.test.ts, simulation/simulation.test.ts
Measures change indicators; criterion 3scoring.ts, lags and synergiessimulation/engine/scoring.test.ts
Astana Quality of Life Score calculationscoring.ts, landscape.tssimulation/engine/review.test.ts, scripts/smoke.mjs
AI analysis and clear trade-offs; criterion 4analysis/analyst-agent.ts, offline-analyst.tsanalysis/analyst-agent.test.ts, analysis/offline-analyst.test.ts
Minutes and the cost of trade-offs; criterion 4Mayor's council, dissenting opinions, and votingcouncil/agents.test.ts, council/domain-numerics.test.ts
AI recommendations for improvementVerified council amendments and packagescouncil/domain.test.ts, e2e/council.spec.ts
Technical implementation: agents with toolsParallel statements, bounded chair agent, saved logcouncil/agents.test.ts, council/sessions.test.ts
Strengths, risks, consequencesStructured analyst reportanalysis/offline-analyst.test.ts, features/Review.test.tsx
Changing the plan changes the Score; criterion 5swaps.ts, a new review after replacementsimulation/engine/review.test.ts, scripts/smoke.mjs
Team comparisonPostgreSQL, submissions.service.tssubmissions/submission.test.ts
Visualization of changesMap, indicator table, histogramcomponents/Map.test.tsx, features/Review.test.tsx; browser test run

Backend test paths are relative to apps/api/tests; frontend test paths are relative to apps/web/tests. Exact commands are in the developer guide.

Limitations

  • A simplified city model. The five districts, 14 measures, effects, and map are synthetic or schematic. Scores describe the fixed astana-v1 scenario; they are not forecasts based on live city data.
  • One planning round. Each plan contains five measures evaluated over a fixed eight-quarter horizon. There are no unexpected city events, quarter-by-quarter budget changes, or NPC opponents yet.
  • AI explanations are only partly verified. The engine calculates scores and checks proposed plans. Text validation rejects unsupported numbers and IDs, but cannot guarantee that every sentence interprets those facts correctly. The calculation log is available for inspection.
  • Generated dialogue depends on OpenAI. Without an API key, or when a provider response fails validation or times out, the affected explanation uses a labelled template. Scoring and the council flow still work, but the fallback does not generate new dialogue.
  • No protected team accounts. Team names are public labels, so another person can submit under the same name. The application does not implement authentication or request rate limits.
  • Council sessions require one API process. Live meetings are managed in server memory, with events saved to PostgreSQL. A server restart interrupts unfinished meetings; saved events and completed minutes remain available. There is no distributed worker to resume a meeting or coordinate multiple API instances.
  • Verification has a limited scope. Automated OpenAI tests use fake provider responses, and browser tests run in Chromium with AI disabled. These checks do not establish live model quality or Firefox and Safari compatibility.

Roadmap

  • Unexpected city events and budget reallocation.
  • NPC rivals and comparisons of their positions between sessions.
  • A quarter-by-quarter tournament and comparisons of decision sequences.
  • Verification of every numerical LLM claim against tool results.
  • Team authentication, rate limits, and public deployment configuration.

See the developer guide for detailed local development commands, environment variables, the HTTP API, and migrations.

Звёзды
⭐ 0
Форки
0
Язык
TypeScript
Последний push
в прошлом месяце
Коммиты
49
Авторы
6
Файлы
415
Ветки
15

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

CHANGEME 16Sayazhan Onglassyn 14Margulanm 7Margulan Mupteke 5Dos 4Crepiks 3

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

  • 2026-09-23 17:54docs: add demo video and move outreach before startup (#25)Sayazhan Onglassyn
  • 2026-09-23 17:47docs: move outreach above startup instructionsCrepiks
  • 2026-09-23 17:42docs: translate README and organize project documentation (#23)Sayazhan Onglassyn
  • 2026-09-23 17:28docs: record adoption outreach in English and Russian (#15)Margulan Mupteke
  • 2026-09-23 17:23chore: merge main into adoption outreachMargulanm
  • 2026-09-23 17:04feat(web): add interactive explanation onboarding (#18)Sayazhan Onglassyn
  • 2026-09-23 16:56feat(council)!: add persisted OpenAI council sessions (#20)Sayazhan Onglassyn
  • 2026-09-23 16:53docs: remove design QA report (#19)Margulan Mupteke
Все коммиты (49)
  • 2026-09-23 16:46docs: remove design QA reportMargulanm
  • 2026-09-23 16:21fix(api): trust configured PostgreSQL CA certificates (#17)Sayazhan Onglassyn
  • 2026-09-23 16:17fix(api): trust configured PostgreSQL CA certificatesCrepiks
  • 2026-09-23 16:05feat: implement QOL-SIM city plan review (#16)Sayazhan Onglassyn
  • 2026-09-23 15:57docs: record adoption outreach in English and RussianMargulanm
  • 2026-09-23 15:48test(e2e): add Playwright coverage for the connection flow (#12)Sayazhan Onglassyn
  • 2026-09-23 15:44docs: simplify README and extract development guide (#13)Margulan Mupteke
  • 2026-09-23 15:41docs: simplify README and extract development guideMargulanm
  • 2026-09-23 15:30build: add ESLint checks alongside Prettier (#11)Sayazhan Onglassyn
  • 2026-09-23 15:04docs: record recent main milestones in build story (#10)Margulan Mupteke
  • 2026-09-23 14:43docs: record recent main milestones in build storyMargulanm
  • 2026-09-23 14:38docs(skills): add four upstream Vercel agent skills (#9)Sayazhan Onglassyn
  • 2026-09-23 14:34chore: disable Claude commit and PR attribution (#8)Sayazhan Onglassyn
  • 2026-09-23 14:27chore: add Node gitignore (#5)Margulan Mupteke
  • 2026-09-23 14:23chore: merge main and resolve gitignore conflictMargulanm
  • 2026-09-23 13:58feat: scaffold web and API workspaces (#4)Sayazhan Onglassyn
  • 2026-09-23 13:55chore: add Node gitignoreMargulanm
  • 2026-09-23 13:33docs: point Claude to authoritative project instructions (#3)Sayazhan Onglassyn
  • 2026-09-23 13:18docs: add hackathon agent instructions (#2)Sayazhan Onglassyn
  • 2026-09-23 13:14Merge pull request #1 from BAITC-Hacks/docs/agent-skillsSayazhan Onglassyn
  • 2026-09-23 13:12docs: add agent workflow skills and PR templateCrepiks
  • 2026-09-23 17:59docs: link build and outreach video diaryCHANGEME
  • 2026-09-23 17:59docs: add concise team and outreach story to canonical README (#27)Dos
  • 2026-09-23 17:57docs: add concise team and outreach story to canonical READMECHANGEME
  • 2026-09-23 17:53docs: add team story insert and record cancelled orchestrationCHANGEME
  • 2026-09-23 17:45docs: merge current main and preserve relocated build diaryCHANGEME
  • 2026-09-23 17:44docs: tell the build story and preserve technical verificationCHANGEME
  • 2026-09-23 17:21chore: merge current main into actionlint branchCHANGEME
  • 2026-09-23 17:16feat(api): add opt-in Builder 2 runtime hostCHANGEME
  • 2026-09-23 17:01docs: publish initial compliance mapping plan (#21)Dos
  • 2026-09-23 16:57docs: merge main and preserve compliance plan linkCHANGEME
  • 2026-09-23 16:55docs: publish initial compliance mapping planCHANGEME
  • 2026-09-23 15:59chore: merge main into actionlint branchCHANGEME
  • 2026-09-23 15:48ci: validate GitHub Actions workflows with actionlintCHANGEME
  • 2026-09-23 15:16docs: record simulator decisions and third-hour progress (#7)Dos
  • 2026-09-23 15:15docs: merge main and preserve both build story updatesCHANGEME
  • 2026-09-23 14:54docs: log third-hour flow and agent progressCHANGEME
  • 2026-09-23 14:21docs: record city simulator decision and team progressCHANGEME
  • 2026-09-23 14:14docs: start hackathon build story (#6)Dos
  • 2026-09-23 14:09docs: merge main and move build story to its own fileCHANGEME
  • 2026-09-23 13:58docs: start hackathon build storyCHANGEME
Структура репозитория (415 файлов)
.agents/skills/branch-requirements/SKILL.md
.agents/skills/commit-requirements/SKILL.md
.agents/skills/composition-patterns/AGENTS.md
.agents/skills/composition-patterns/README.md
.agents/skills/composition-patterns/SKILL.md
.agents/skills/composition-patterns/metadata.json
.agents/skills/composition-patterns/rules/_sections.md
.agents/skills/composition-patterns/rules/_template.md
.agents/skills/composition-patterns/rules/architecture-avoid-boolean-props.md
.agents/skills/composition-patterns/rules/architecture-compound-components.md
.agents/skills/composition-patterns/rules/patterns-children-over-render-props.md
.agents/skills/composition-patterns/rules/patterns-explicit-variants.md
.agents/skills/composition-patterns/rules/react19-no-forwardref.md
.agents/skills/composition-patterns/rules/state-context-interface.md
.agents/skills/composition-patterns/rules/state-decouple-implementation.md
.agents/skills/composition-patterns/rules/state-lift-state.md
.agents/skills/pr-requirements/SKILL.md
.agents/skills/react-best-practices/AGENTS.md
.agents/skills/react-best-practices/README.md
.agents/skills/react-best-practices/SKILL.md
.agents/skills/react-best-practices/metadata.json
.agents/skills/react-best-practices/rules/_sections.md
.agents/skills/react-best-practices/rules/_template.md
.agents/skills/react-best-practices/rules/advanced-effect-event-deps.md
.agents/skills/react-best-practices/rules/advanced-event-handler-refs.md
.agents/skills/react-best-practices/rules/advanced-init-once.md
.agents/skills/react-best-practices/rules/advanced-use-latest.md
.agents/skills/react-best-practices/rules/async-api-routes.md
.agents/skills/react-best-practices/rules/async-cheap-condition-before-await.md
.agents/skills/react-best-practices/rules/async-defer-await.md
.agents/skills/react-best-practices/rules/async-dependencies.md
.agents/skills/react-best-practices/rules/async-parallel.md
.agents/skills/react-best-practices/rules/async-suspense-boundaries.md
.agents/skills/react-best-practices/rules/bundle-analyzable-paths.md
.agents/skills/react-best-practices/rules/bundle-barrel-imports.md
.agents/skills/react-best-practices/rules/bundle-conditional.md
.agents/skills/react-best-practices/rules/bundle-defer-third-party.md
.agents/skills/react-best-practices/rules/bundle-dynamic-imports.md
.agents/skills/react-best-practices/rules/bundle-preload.md
.agents/skills/react-best-practices/rules/client-event-listeners.md
.agents/skills/react-best-practices/rules/client-localstorage-schema.md
.agents/skills/react-best-practices/rules/client-passive-event-listeners.md
.agents/skills/react-best-practices/rules/client-swr-dedup.md
.agents/skills/react-best-practices/rules/js-batch-dom-css.md
.agents/skills/react-best-practices/rules/js-cache-function-results.md
.agents/skills/react-best-practices/rules/js-cache-property-access.md
.agents/skills/react-best-practices/rules/js-cache-storage.md
.agents/skills/react-best-practices/rules/js-combine-iterations.md
.agents/skills/react-best-practices/rules/js-early-exit.md
.agents/skills/react-best-practices/rules/js-flatmap-filter.md
.agents/skills/react-best-practices/rules/js-hoist-regexp.md
.agents/skills/react-best-practices/rules/js-index-maps.md
.agents/skills/react-best-practices/rules/js-length-check-first.md
.agents/skills/react-best-practices/rules/js-min-max-loop.md
.agents/skills/react-best-practices/rules/js-request-idle-callback.md
.agents/skills/react-best-practices/rules/js-set-map-lookups.md
.agents/skills/react-best-practices/rules/js-tosorted-immutable.md
.agents/skills/react-best-practices/rules/rendering-activity.md
.agents/skills/react-best-practices/rules/rendering-animate-svg-wrapper.md
.agents/skills/react-best-practices/rules/rendering-conditional-render.md
.agents/skills/react-best-practices/rules/rendering-content-visibility.md
.agents/skills/react-best-practices/rules/rendering-hoist-jsx.md
.agents/skills/react-best-practices/rules/rendering-hydration-no-flicker.md
.agents/skills/react-best-practices/rules/rendering-hydration-suppress-warning.md
.agents/skills/react-best-practices/rules/rendering-resource-hints.md
.agents/skills/react-best-practices/rules/rendering-script-defer-async.md
.agents/skills/react-best-practices/rules/rendering-svg-precision.md
.agents/skills/react-best-practices/rules/rendering-usetransition-loading.md
.agents/skills/react-best-practices/rules/rerender-defer-reads.md
.agents/skills/react-best-practices/rules/rerender-dependencies.md
.agents/skills/react-best-practices/rules/rerender-derived-state-no-effect.md
.agents/skills/react-best-practices/rules/rerender-derived-state.md
.agents/skills/react-best-practices/rules/rerender-functional-setstate.md
.agents/skills/react-best-practices/rules/rerender-lazy-state-init.md
.agents/skills/react-best-practices/rules/rerender-memo-with-default-value.md
.agents/skills/react-best-practices/rules/rerender-memo.md
.agents/skills/react-best-practices/rules/rerender-move-effect-to-event.md
.agents/skills/react-best-practices/rules/rerender-no-inline-components.md
.agents/skills/react-best-practices/rules/rerender-simple-expression-in-memo.md
.agents/skills/react-best-practices/rules/rerender-split-combined-hooks.md
.agents/skills/react-best-practices/rules/rerender-transitions.md
.agents/skills/react-best-practices/rules/rerender-use-deferred-value.md
.agents/skills/react-best-practices/rules/rerender-use-ref-transient-values.md
.agents/skills/react-best-practices/rules/server-after-nonblocking.md
.agents/skills/react-best-practices/rules/server-auth-actions.md
.agents/skills/react-best-practices/rules/server-cache-lru.md
.agents/skills/react-best-practices/rules/server-cache-react.md
.agents/skills/react-best-practices/rules/server-dedup-props.md
.agents/skills/react-best-practices/rules/server-hoist-static-io.md
.agents/skills/react-best-practices/rules/server-no-shared-module-state.md
.agents/skills/react-best-practices/rules/server-parallel-fetching.md
.agents/skills/react-best-practices/rules/server-parallel-nested-fetching.md
.agents/skills/react-best-practices/rules/server-serialization.md
.agents/skills/react-view-transitions/AGENTS.md
.agents/skills/react-view-transitions/README.md
.agents/skills/react-view-transitions/SKILL.md
.agents/skills/react-view-transitions/metadata.json
.agents/skills/react-view-transitions/references/css-recipes.md
.agents/skills/react-view-transitions/references/implementation.md
.agents/skills/react-view-transitions/references/nextjs.md
.agents/skills/react-view-transitions/references/patterns.md
.agents/skills/react-view-transitions/references/troubleshooting.md
.agents/skills/web-design-guidelines/SKILL.md
.claude/settings.json
.claude/skills/branch-requirements/SKILL.md
.claude/skills/commit-requirements/SKILL.md
.claude/skills/composition-patterns/AGENTS.md
.claude/skills/composition-patterns/README.md
.claude/skills/composition-patterns/SKILL.md
.claude/skills/composition-patterns/metadata.json
.claude/skills/composition-patterns/rules/_sections.md
.claude/skills/composition-patterns/rules/_template.md
.claude/skills/composition-patterns/rules/architecture-avoid-boolean-props.md
.claude/skills/composition-patterns/rules/architecture-compound-components.md
.claude/skills/composition-patterns/rules/patterns-children-over-render-props.md
.claude/skills/composition-patterns/rules/patterns-explicit-variants.md
.claude/skills/composition-patterns/rules/react19-no-forwardref.md
.claude/skills/composition-patterns/rules/state-context-interface.md
.claude/skills/composition-patterns/rules/state-decouple-implementation.md
.claude/skills/composition-patterns/rules/state-lift-state.md
.claude/skills/pr-requirements/SKILL.md
.claude/skills/react-best-practices/AGENTS.md
.claude/skills/react-best-practices/README.md
.claude/skills/react-best-practices/SKILL.md
.claude/skills/react-best-practices/metadata.json
.claude/skills/react-best-practices/rules/_sections.md
.claude/skills/react-best-practices/rules/_template.md
.claude/skills/react-best-practices/rules/advanced-effect-event-deps.md
.claude/skills/react-best-practices/rules/advanced-event-handler-refs.md
.claude/skills/react-best-practices/rules/advanced-init-once.md
.claude/skills/react-best-practices/rules/advanced-use-latest.md
.claude/skills/react-best-practices/rules/async-api-routes.md
.claude/skills/react-best-practices/rules/async-cheap-condition-before-await.md
.claude/skills/react-best-practices/rules/async-defer-await.md
.claude/skills/react-best-practices/rules/async-dependencies.md
.claude/skills/react-best-practices/rules/async-parallel.md
.claude/skills/react-best-practices/rules/async-suspense-boundaries.md
.claude/skills/react-best-practices/rules/bundle-analyzable-paths.md
.claude/skills/react-best-practices/rules/bundle-barrel-imports.md
.claude/skills/react-best-practices/rules/bundle-conditional.md
.claude/skills/react-best-practices/rules/bundle-defer-third-party.md
.claude/skills/react-best-practices/rules/bundle-dynamic-imports.md
.claude/skills/react-best-practices/rules/bundle-preload.md
.claude/skills/react-best-practices/rules/client-event-listeners.md
.claude/skills/react-best-practices/rules/client-localstorage-schema.md
.claude/skills/react-best-practices/rules/client-passive-event-listeners.md
.claude/skills/react-best-practices/rules/client-swr-dedup.md
.claude/skills/react-best-practices/rules/js-batch-dom-css.md
.claude/skills/react-best-practices/rules/js-cache-function-results.md
.claude/skills/react-best-practices/rules/js-cache-property-access.md
.claude/skills/react-best-practices/rules/js-cache-storage.md
.claude/skills/react-best-practices/rules/js-combine-iterations.md
.claude/skills/react-best-practices/rules/js-early-exit.md
.claude/skills/react-best-practices/rules/js-flatmap-filter.md
.claude/skills/react-best-practices/rules/js-hoist-regexp.md
.claude/skills/react-best-practices/rules/js-index-maps.md
.claude/skills/react-best-practices/rules/js-length-check-first.md
.claude/skills/react-best-practices/rules/js-min-max-loop.md
.claude/skills/react-best-practices/rules/js-request-idle-callback.md
.claude/skills/react-best-practices/rules/js-set-map-lookups.md
.claude/skills/react-best-practices/rules/js-tosorted-immutable.md
.claude/skills/react-best-practices/rules/rendering-activity.md
.claude/skills/react-best-practices/rules/rendering-animate-svg-wrapper.md
.claude/skills/react-best-practices/rules/rendering-conditional-render.md
.claude/skills/react-best-practices/rules/rendering-content-visibility.md
.claude/skills/react-best-practices/rules/rendering-hoist-jsx.md
.claude/skills/react-best-practices/rules/rendering-hydration-no-flicker.md
.claude/skills/react-best-practices/rules/rendering-hydration-suppress-warning.md
.claude/skills/react-best-practices/rules/rendering-resource-hints.md
.claude/skills/react-best-practices/rules/rendering-script-defer-async.md
.claude/skills/react-best-practices/rules/rendering-svg-precision.md
.claude/skills/react-best-practices/rules/rendering-usetransition-loading.md
.claude/skills/react-best-practices/rules/rerender-defer-reads.md
.claude/skills/react-best-practices/rules/rerender-dependencies.md
.claude/skills/react-best-practices/rules/rerender-derived-state-no-effect.md
.claude/skills/react-best-practices/rules/rerender-derived-state.md
.claude/skills/react-best-practices/rules/rerender-functional-setstate.md
.claude/skills/react-best-practices/rules/rerender-lazy-state-init.md
.claude/skills/react-best-practices/rules/rerender-memo-with-default-value.md
.claude/skills/react-best-practices/rules/rerender-memo.md
.claude/skills/react-best-practices/rules/rerender-move-effect-to-event.md
.claude/skills/react-best-practices/rules/rerender-no-inline-components.md
.claude/skills/react-best-practices/rules/rerender-simple-expression-in-memo.md
.claude/skills/react-best-practices/rules/rerender-split-combined-hooks.md
.claude/skills/react-best-practices/rules/rerender-transitions.md
.claude/skills/react-best-practices/rules/rerender-use-deferred-value.md
.claude/skills/react-best-practices/rules/rerender-use-ref-transient-values.md
.claude/skills/react-best-practices/rules/server-after-nonblocking.md
.claude/skills/react-best-practices/rules/server-auth-actions.md
.claude/skills/react-best-practices/rules/server-cache-lru.md
.claude/skills/react-best-practices/rules/server-cache-react.md
.claude/skills/react-best-practices/rules/server-dedup-props.md
.claude/skills/react-best-practices/rules/server-hoist-static-io.md
.claude/skills/react-best-practices/rules/server-no-shared-module-state.md
.claude/skills/react-best-practices/rules/server-parallel-fetching.md
.claude/skills/react-best-practices/rules/server-parallel-nested-fetching.md
.claude/skills/react-best-practices/rules/server-serialization.md
.claude/skills/react-view-transitions/AGENTS.md
.claude/skills/react-view-transitions/README.md
.claude/skills/react-view-transitions/SKILL.md
.claude/skills/react-view-transitions/metadata.json
.claude/skills/react-view-transitions/references/css-recipes.md
.claude/skills/react-view-transitions/references/implementation.md
.claude/skills/react-view-transitions/references/nextjs.md
.claude/skills/react-view-transitions/references/patterns.md
.claude/skills/react-view-transitions/references/troubleshooting.md
.claude/skills/web-design-guidelines/SKILL.md
.dockerignore
.env.example
.github/PULL_REQUEST_TEMPLATE.md
.github/workflows/ci.yml
.gitignore
.nvmrc
.prettierignore
.prettierrc.json
AGENTS.md
CLAUDE.md
Dockerfile.dev
README.md
apps/api/nest-cli.json
apps/api/package.json
apps/api/src/analysis/analysis.controller.ts
apps/api/src/analysis/analysis.service.ts
apps/api/src/analysis/analyst-agent.ts
apps/api/src/analysis/contracts.ts
apps/api/src/analysis/llm-client.ts
apps/api/src/analysis/offline-analyst.ts
apps/api/src/analysis/report-parser.ts
apps/api/src/analysis/tools.ts
apps/api/src/app.module.ts
apps/api/src/config/environment.ts
apps/api/src/config/load-env.ts
apps/api/src/council/amendments.ts
apps/api/src/council/briefs.ts
apps/api/src/council/chair-agent.ts
apps/api/src/council/council-orchestrator.ts
apps/api/src/council/council-session.entity.ts
apps/api/src/council/council.controller.ts
apps/api/src/council/council.service.ts
apps/api/src/council/deputy-agent.ts
apps/api/src/council/metrics.ts
apps/api/src/council/numeric-facts.ts
apps/api/src/council/offline-council.ts
apps/api/src/council/protocol-parser.ts
apps/api/src/council/roles.ts
apps/api/src/council/types.ts
apps/api/src/council/votes.ts
apps/api/src/database/data-source.ts
apps/api/src/database/database-options.ts
apps/api/src/database/migrations/1790159845335-CreateSubmissions.ts
apps/api/src/database/migrations/1790163000000-CreateCouncilSessions.ts
apps/api/src/health/health.controller.ts
apps/api/src/health/health.service.ts
apps/api/src/main.ts
apps/api/src/simulation/engine/catalog.ts
apps/api/src/simulation/engine/contributions.ts
apps/api/src/simulation/engine/districts.ts
apps/api/src/simulation/engine/landscape.ts
apps/api/src/simulation/engine/moves.ts
apps/api/src/simulation/engine/options.ts
apps/api/src/simulation/engine/scenario.ts
apps/api/src/simulation/engine/scoring.ts
apps/api/src/simulation/engine/swaps.ts
apps/api/src/simulation/engine/types.ts
apps/api/src/simulation/engine/validation.ts
apps/api/src/simulation/plan-parser.ts
apps/api/src/simulation/round-payload.ts
apps/api/src/simulation/simulation.controller.ts
apps/api/src/simulation/simulation.service.ts
apps/api/src/submissions/submission.entity.ts
apps/api/src/submissions/submissions.controller.ts
apps/api/src/submissions/submissions.service.ts
apps/api/tests/analysis/analysis.service.test.ts
apps/api/tests/analysis/analyst-agent.test.ts
apps/api/tests/analysis/fixtures.ts
apps/api/tests/analysis/llm-client.test.ts
apps/api/tests/analysis/offline-analyst.test.ts
apps/api/tests/analysis/report-parser.test.ts
apps/api/tests/analysis/tools.test.ts
apps/api/tests/config/environment.test.ts
apps/api/tests/council/agents-boundaries.test.ts
apps/api/tests/council/agents.test.ts
apps/api/tests/council/deputy-facts.test.ts
apps/api/tests/council/domain-numerics.test.ts
apps/api/tests/council/domain.test.ts
apps/api/tests/council/orchestrator-boundaries.test.ts
apps/api/tests/council/orchestrator.test.ts
apps/api/tests/council/protocol-parser.test.ts
apps/api/tests/council/sessions.test.ts
apps/api/tests/database/database-options.test.ts
apps/api/tests/database/migrations/council.test.ts
apps/api/tests/database/migrations/submissions.test.ts
apps/api/tests/health/health.test.ts
apps/api/tests/simulation/engine/review.test.ts
apps/api/tests/simulation/engine/scoring.test.ts
apps/api/tests/simulation/simulation.test.ts
apps/api/tests/submissions/submission.test.ts
apps/api/tsconfig.json
apps/web/index.html
apps/web/package.json
apps/web/public/favicon.svg
apps/web/src/App.tsx
apps/web/src/api/contracts.ts
apps/web/src/api/council.ts
apps/web/src/api/councilSchema.ts
apps/web/src/api/health.ts
apps/web/src/api/schema.ts
apps/web/src/api/simulation.ts
apps/web/src/base.css
apps/web/src/components/DistrictHeatmap.tsx
apps/web/src/components/Feedback.tsx
apps/web/src/components/Header.tsx
apps/web/src/components/Modal.tsx
apps/web/src/components/format.ts
apps/web/src/components/map.css
apps/web/src/components/mapGeometry.ts
apps/web/src/components/overlays.css
apps/web/src/features/builder/Builder.tsx
apps/web/src/features/builder/Catalog.tsx
apps/web/src/features/builder/MeasureDialog.tsx
apps/web/src/features/builder/PlanPanel.tsx
apps/web/src/features/builder/builder.css
apps/web/src/features/council/AmendmentBoard.tsx
apps/web/src/features/council/CouncilMap.tsx
apps/web/src/features/council/CouncilPage.tsx
apps/web/src/features/council/CouncilTable.tsx
apps/web/src/features/council/ProtocolPanel.tsx
apps/web/src/features/council/SpeechFeed.tsx
apps/web/src/features/council/council-detail.css
apps/web/src/features/council/council.css
apps/web/src/features/council/events.ts
apps/web/src/features/council/storage.ts
apps/web/src/features/onboarding/ExamplesStep.tsx
apps/web/src/features/onboarding/LagStep.tsx
apps/web/src/features/onboarding/Onboarding.tsx
apps/web/src/features/onboarding/OverviewSteps.tsx
apps/web/src/features/onboarding/ResultsStep.tsx
apps/web/src/features/onboarding/navigation.css
apps/web/src/features/onboarding/onboarding.css
apps/web/src/features/onboarding/storage.ts
apps/web/src/features/review/AiReport.tsx
apps/web/src/features/review/MoveList.tsx
apps/web/src/features/review/ReviewDialog.tsx
apps/web/src/features/review/ReviewPage.tsx
apps/web/src/features/review/ScoreHistogram.tsx
apps/web/src/features/review/analyst.css
apps/web/src/features/review/review.css
apps/web/src/features/submissions/Registry.tsx
apps/web/src/features/submissions/SubmissionForm.tsx
apps/web/src/hooks/useResource.ts
apps/web/src/main.tsx
apps/web/src/responsive.css
apps/web/src/styles.css
apps/web/tests/App.test.tsx
apps/web/tests/api/council.test.ts
apps/web/tests/api/councilSchema.test.ts
apps/web/tests/api/health.test.ts
apps/web/tests/api/schema.test.ts
apps/web/tests/api/simulation.test.ts
apps/web/tests/components/Map.test.tsx
apps/web/tests/components/Modal.test.tsx
apps/web/tests/config/vite.test.ts
apps/web/tests/features/Builder.test.tsx
apps/web/tests/features/Onboarding.test.tsx
apps/web/tests/features/OnboardingJourney.test.tsx
apps/web/tests/features/Review.test.tsx
apps/web/tests/features/Submissions.test.tsx
apps/web/tests/features/council/AppCouncil.test.tsx
apps/web/tests/features/council/CouncilComponents.test.tsx
apps/web/tests/features/council/CouncilLifecycle.test.tsx
apps/web/tests/features/council/CouncilPage.test.tsx
apps/web/tests/features/council/CouncilStream.test.tsx
apps/web/tests/features/council/ProtocolPanel.test.tsx
apps/web/tests/features/council/ReviewCouncil.test.tsx
apps/web/tests/features/council/events.test.ts
apps/web/tests/features/council/fixtures.ts
apps/web/tests/features/council/storage.test.ts
apps/web/tests/fixtures/catalog.ts
apps/web/tests/fixtures/data.ts
apps/web/tests/fixtures/districts.ts
apps/web/tests/fixtures/scenario.ts
apps/web/tests/hooks/useResource.test.tsx
apps/web/tests/setup.ts
apps/web/tsconfig.json
apps/web/vite.config.ts
compose.yaml
docs/BUILD_STORY.md
docs/DEVELOPMENT.md
docs/EXTERNAL_TOOLS.md
docs/compliance/PLAN.md
docs/compliance/RULES_MAP.md
docs/compliance/provided-rules.txt
docs/data/astana-dataset.md
docs/images/council.png
docs/images/onboarding-mobile.png
docs/images/onboarding.png
docs/images/review-mobile.png
docs/images/review.png
docs/images/workspace.png
docs/superpowers/plans/2026-09-23-council.md
docs/superpowers/plans/2026-09-23-plan-review-simulator.md
docs/superpowers/plans/2026-09-23-web-api-scaffold.md
docs/superpowers/specs/2026-09-23-council.md
e2e/connection.spec.ts
e2e/council.spec.ts
e2e/onboarding.spec.ts
e2e/simulator.spec.ts
eslint.config.mjs
package-lock.json
package.json
playwright.config.ts
scripts/smoke.mjs
tsconfig.base.json
tsconfig.tests.json
vitest.config.mts
Ветки (15)

Обсуждение 0 комментариев

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

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