Civils— probabilistic citizens, deterministic world.
A living-world architecture where models can author citizens, memories and cultural material but cannot bypass canonical state transitions. The world remains replayable and server-authoritative while the native client tries to make a complex simulation feel inhabited rather than administered.
- Python
- FastAPI
- PostgreSQL / pgvector
- Redis
- SwiftUI
- RealityKit
- OpenAI Responses
- Mem0
- Alembic
Stack
How it evolved
Reconstructed from commits, quality reports and the current release matrix. Some product rationale is inferred from the sequence of implementation changes.
The foundation is a typed command → pure kernel → replayable transition loop. That makes simulation correctness independent from whichever model or memory provider happens to be active.
Citizen authorship and memory became provider capabilities that can propose logical effects. They are deliberately denied a second mutation path around canonical state.
Behavior programs and institution/meta-program capabilities pushed the system beyond generated dialogue. Citizens could participate in a world whose rules and social structures are inspectable system state.
A major UI pass changed test IDs and design-system expectations because the native surface needed to foreground the planet, citizens and current activity rather than mirror simulation tables.
Once accounts could own several independent worlds, planet switching and creation became a dedicated information-architecture layer rather than another button inside one world view.
Replay, fault injection, culture/memory evals, dynamic type checks, capture manifests, thermal/performance gates and the release matrix make “blocked” an explicit engineering state rather than an embarrassing footnote.
World UI rationale
Canonical mutation loop
Why no product screenshot yet
There is real screenshot/capture infrastructure in the repository, including fixed-seed UI tests and a capture manifest. The project's own quality gates still mark the supported device capture path as incomplete. I keep that status visible instead of publishing a simulator/mock image and calling it release evidence.