GESTALOKA v2 is a same-world narrative MMO rebuild. The canonical store is PostgreSQL, world memory is retrieved through vector-friendly search, graph updates flow through an outbox projection pipeline, and every player/NPC action lives inside one world_id namespace.
The runtime is now being cut over from a single built-in setting to an engine/core plus declarative world packs model. The repo ships with one bundled shared-world reference pack (gestaloka_reference / nexus_foundation).
backend/FastAPI modular monolith for the v2 slicefrontend/player React client for login, world start, and turn playadmin-frontend/separate React admin client for pack, user, LLM, prompt, SP, and release managementdocuments/v2-only docs and ADRspacks/bundled declarative world packs and templatesprompts/prompt registry inputs for the model routertests/backend and E2E coverage for the new slicerebuild_plan_v2.mdcurrent rebuild plan and design reference
- Copy
.env.exampleto.env. - Start the stack with
docker compose up --build. The default stack does not run the Playwright E2E service, so manual play state stays isolated from automated smoke runs. - Open
http://localhost:5173. - Open
http://localhost:5174for the admin surface after login. - Open
http://localhost:3001for Langfuse trace browsing. - Sign in with the demo Keycloak user:
username: demo
password: demo-password
PYTHONPATH=backend pytest tests/backendverifies the backend slice directly.make build-frontendis the official frontend build path. It runs inside Docker/Compose instead of the host shell.make frontend-e2eis the official full-stack Playwright smoke path. It enables the Composee2eprofile, runs the Playwright smoke specs undertests/e2e/, waits forbackend/player-frontend/keycloakreadiness, and cleans the stack afterward.make verify-v2is the canonical local and CI verification entrypoint. It runs backend tests, v1 terminology checks, pack checks, shared-world regressions, the containerized frontend build, and the containerized E2E smoke in order.GET /worlds/packsexposes the bundled pack and template catalog used by the session bootstrap UI.make pack-exportandmake pack-importmove validated external world packs as.tar.gzartifacts; see World Pack Operations.- Host
npm run buildremains a convenience path only. In mixed WSL/Windows environments it is non-authoritative and may fail even when the Compose verification path is healthy.
GET /healthGET /auth/meGET /economy/sp/meGET /worlds/packsPOST /sessionsPOST /turnsGET /worlds/{world_id}/eventsGET /worlds/{world_id}/memoriesWS /ws/sessions/{session_id}?token=<access_token>
GET /ops/projection/statusPOST /ops/projection/rebuildGET /ops/worlds/{world_id}/graph-summaryGET /ops/sp/overviewGET /ops/sp/ledgerPOST /ops/sp/adjustments
GET /admin/overviewGET /admin/packsGET /admin/world-templatesGET /admin/usersGET /admin/settings/llmGET /admin/model-lanesGET /admin/promptsGET /admin/sp/overviewGET /admin/release
- The graph projection path is outbox-driven. The standard compose stack now targets NebulaGraph, while lightweight test settings still use the recording backend.
- Runtime stabilization for NebulaGraph includes an init step that registers the storage host before backend and projection worker start.
- LLM observability uses self-hosted Langfuse for prompt/generation/retrieval/eval traces, while OpenTelemetry remains the infra/metrics layer.
- The container-first verification targets (
make frontend-e2e,make verify-v2) override model execution to the localstubprovider and disable telemetry exports so verification does not depend on external AI or observability runtimes. - The canonical embedding policy is fixed in ADR-001.
- Sessions start from a selected
pack_idandworld_template_id, then bootstrap a pack-defined starter location and projectedKNOWSrelation between the player and guide NPC. - SP is an execution-budget ledger for API/runtime cost only. It is not an in-world currency and does not buy quest, faction, or item power.
- Successful requests consume SP, business-failed requests refund in-request, and the admin frontend inspects execution budget separately from world progression.
- Reward items stay inside world progression through deterministic pack-defined world rules instead of purchase mechanics.