Deployed and verified in production on 2026-07-23.
- Main commit:
bb6b681ebb06
- Image:
gitea.app.lan/eventhorizon/eventhorizon:sha-bb6b681ebb06
- Deployment: 2/2 replicas ready, zero restarts at validation
- CI: autodeploy run index 2355 and frontend run index 2356 succeeded
EventHorizon now maintains mid- and long-term memories scoped to a game session and model persona.
- PostgreSQL is authoritative for memory text, evidence, importance, decay, lifecycle state, and durable extraction/vector jobs.
- Qdrant stores 1024-dimensional BGE-M3 vectors plus only the opaque session ID, persona ID, and tier required for filtered retrieval.
- Extraction runs every five eligible turns and performs history backfill only where source knowledge is explicitly known.
- Importance strongly moderates decay; access reinforcement, tier transitions, pruning, and bounded recall prevent unbounded context growth.
- Retrieved candidates are verified against PostgreSQL before bounded narrator/persona prompt injection.
- Reset, clear, delete, undo, and regenerate flows preserve session isolation and memory lifecycle semantics.
- Authenticated list and forget APIs and a game-scoped Memories UI expose provenance, tier, importance, and confirmed deletion.
Created before the production migration:
- PostgreSQL: job
event-horizon-postgres-backup-persona-memory-20260723, dump eventhorizon-20260723T140410Z.dump; SHA sidecar and pg_restore --list verified.
- Qdrant:
full-snapshot-2026-07-23-14-03-46.snapshot; downloaded checksum matched the server snapshot.
- Rust formatting, source contract checks, Kubernetes render, release backend build, frontend WASM build, and the locked test suite passed.
- Test result: 311 backend tests and 5 frontend tests passed.
- Migration 0024 was applied to disposable PostgreSQL and reapplied successfully before production.
- Live
/healthz returned healthy; /readyz reported PostgreSQL and Qdrant ready.
- Qdrant collection
event_horizon_persona_memories_v1 is green with cosine distance, 1024 dimensions, and typed payload indexes.
- Six memories were persisted and vectorized; a filtered Qdrant query returned exactly the scoped points without memory text.
- The live API returned the expected scoped records, rejected a wrong-owner session, and returned not-found for a nonexistent memory deletion.
- At final validation, two known-history jobs were complete and one remained durably queued because the optional inference provider circuit was open. Foreground turns continue independently.
The first deployment runner was evicted under node ephemeral-storage pressure. The repository had no .dockerignore, so the Docker context included the locally generated Rust target/ tree (about 7.8 GiB) before rebuilding it.
A root-level .dockerignore now excludes Git metadata, local build outputs, generated WASM packages, Android build/Gradle data, and internal metadata. The corrected Docker build and deployment completed successfully.
Cleanup removed failed/replaced ephemeral runner pods, stopped runner containers, unused images, generated local Cargo artifacts, and old archived journal data. No persistent application or user data was removed. Node DiskPressure returned to false.
The database migration is additive. For application rollback, deploy the previous known-good image through the repository-managed workflow. If data rollback is required, restore PostgreSQL and Qdrant from the pre-migration artifacts above after stopping writers and validating the restore target.