From 5617eabeaea5416ea907ce9bc186d979177fb007 Mon Sep 17 00:00:00 2001 From: Vera-AI Date: Thu, 26 Mar 2026 13:10:11 -0500 Subject: [PATCH] Add API flow diagram showing how requests pass through Vera --- README.md | 197 ++++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 138 insertions(+), 59 deletions(-) diff --git a/README.md b/README.md index dd02b02..cf04e61 100644 --- a/README.md +++ b/README.md @@ -22,6 +22,108 @@ Every conversation is stored in Qdrant vector database and retrieved contextuall --- +## πŸ”„ How It Works + +``` +β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” +β”‚ REQUEST FLOW β”‚ +β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ + + β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” + β”‚ Client β”‚ ──(1)──▢│ Vera-AI β”‚ ──(3)──▢│ Ollama β”‚ ──(5)──▢│ Response β”‚ + β”‚ (You) β”‚ β”‚ Proxy β”‚ β”‚ LLM β”‚ β”‚ to User β”‚ + β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ + β”‚ + β”‚ (2) Query semantic memory + β”‚ + β–Ό + β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” + β”‚ Qdrant β”‚ + β”‚ Vector DBβ”‚ + β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ + β”‚ + β”‚ (4) Store conversation turn + β”‚ + β–Ό + β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” + β”‚ Memory β”‚ + β”‚ Storage β”‚ + β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ + + +β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” +β”‚ 4-LAYER CONTEXT BUILD β”‚ +β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ + + Incoming Request (POST /api/chat) + β”‚ + β–Ό + β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” + β”‚ Layer 1: System Prompt β”‚ + β”‚ β€’ Static context from prompts/systemprompt.md β”‚ + β”‚ β€’ Preserved unchanged, passed through β”‚ + β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ + β”‚ + β–Ό + β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” + β”‚ Layer 2: Semantic Memory β”‚ + β”‚ β€’ Query Qdrant with user question β”‚ + β”‚ β€’ Retrieve curated Q&A pairs by relevance β”‚ + β”‚ β€’ Limited by semantic_token_budget β”‚ + β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ + β”‚ + β–Ό + β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” + β”‚ Layer 3: Recent Context β”‚ + β”‚ β€’ Last N conversation turns from Qdrant β”‚ + β”‚ β€’ Chronological order, recent memories first β”‚ + β”‚ β€’ Limited by context_token_budget β”‚ + β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ + β”‚ + β–Ό + β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” + β”‚ Layer 4: Current Messages β”‚ + β”‚ β€’ User message from current request β”‚ + β”‚ β€’ Passed through unchanged β”‚ + β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ + β”‚ + β–Ό + [augmented request] ──▢ Ollama LLM ──▢ Response + + +β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” +β”‚ MEMORY STORAGE FLOW β”‚ +β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ + + User Question + Assistant Response + β”‚ + β–Ό + β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” + β”‚ Store as "raw" memory in Qdrant β”‚ + β”‚ β€’ User ID, role, content, timestamp β”‚ + β”‚ β€’ Embedded using configured embedding model β”‚ + β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ + β”‚ + β–Ό + β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” + β”‚ Daily Curator (02:00) β”‚ + β”‚ β€’ Processes raw memories from last 24h β”‚ + β”‚ β€’ Summarizes into curated Q&A pairs β”‚ + β”‚ β€’ Stores as "curated" memories β”‚ + β”‚ β€’ Deletes processed raw memories β”‚ + β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ + β”‚ + β–Ό + β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” + β”‚ Monthly Curator (03:00 on 1st) β”‚ + β”‚ β€’ Processes ALL remaining raw memories β”‚ + β”‚ β€’ Full database cleanup β”‚ + β”‚ β€’ Ensures no memories are orphaned β”‚ + β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ +``` + +--- + ## 🌟 Features | Feature | Description | @@ -81,24 +183,18 @@ cd vera-ai-v2 Create `.env` file (or copy from `.env.example`): ```bash -# ═══════════════════════════════════════════════════════════════ # User/Group Configuration -# ═══════════════════════════════════════════════════════════════ # IMPORTANT: Match these to your host user for volume permissions APP_UID=1000 # Run: id -u to get your UID APP_GID=1000 # Run: id -g to get your GID -# ═══════════════════════════════════════════════════════════════ # Timezone Configuration -# ═══════════════════════════════════════════════════════════════ # Affects curator schedule (daily at 02:00, monthly on 1st at 03:00) TZ=America/Chicago -# ═══════════════════════════════════════════════════════════════ # Optional: Cloud Model Routing -# ═══════════════════════════════════════════════════════════════ # OPENROUTER_API_KEY=your_api_key_here ``` @@ -169,27 +265,27 @@ docker logs vera-ai --tail 20 ### Step 6: Verify Installation ```bash -# βœ… Health check +# Health check curl http://localhost:11434/ # Expected: {"status":"ok","ollama":"reachable"} -# βœ… Container status +# Container status docker ps --format "table {{.Names}}\t{{.Status}}" # Expected: vera-ai Up X minutes (healthy) -# βœ… Timezone +# Timezone docker exec vera-ai date # Should show your timezone (e.g., CDT for America/Chicago) -# βœ… User permissions +# User permissions docker exec vera-ai id # Expected: uid=1000(appuser) gid=1000(appgroup) -# βœ… Directories +# Directories docker exec vera-ai ls -la /app/prompts/ # Should show: curator_prompt.md, systemprompt.md -# βœ… Test chat +# Test chat curl -X POST http://localhost:11434/api/chat \ -H "Content-Type: application/json" \ -d '{"model":"qwen3.5:397b-cloud","messages":[{"role":"user","content":"hello"}],"stream":false}' @@ -221,26 +317,26 @@ curl -X POST http://localhost:11434/api/chat \ ``` vera-ai-v2/ -β”œβ”€β”€ πŸ“ config/ -β”‚ └── πŸ“„ config.toml # Main configuration -β”œβ”€β”€ πŸ“ prompts/ -β”‚ β”œβ”€β”€ πŸ“„ curator_prompt.md # Memory curation prompt -β”‚ └── πŸ“„ systemprompt.md # System context -β”œβ”€β”€ πŸ“ logs/ # Debug logs (when debug=true) -β”œβ”€β”€ πŸ“ app/ -β”‚ β”œβ”€β”€ 🐍 main.py # FastAPI application -β”‚ β”œβ”€β”€ 🐍 config.py # Configuration loader -β”‚ β”œβ”€β”€ 🐍 curator.py # Memory curation -β”‚ β”œβ”€β”€ 🐍 proxy_handler.py # Chat handling -β”‚ β”œβ”€β”€ 🐍 qdrant_service.py # Vector operations -β”‚ β”œβ”€β”€ 🐍 singleton.py # QdrantService singleton -β”‚ └── 🐍 utils.py # Utilities -β”œβ”€β”€ πŸ“ static/ # Legacy symlinks -β”œβ”€β”€ πŸ“„ .env.example # Environment template -β”œβ”€β”€ πŸ“„ docker-compose.yml # Docker Compose -β”œβ”€β”€ πŸ“„ Dockerfile # Container definition -β”œβ”€β”€ πŸ“„ requirements.txt # Python dependencies -└── πŸ“„ README.md # This file +β”œβ”€β”€ config/ +β”‚ └── config.toml # Main configuration +β”œβ”€β”€ prompts/ +β”‚ β”œβ”€β”€ curator_prompt.md # Memory curation prompt +β”‚ └── systemprompt.md # System context +β”œβ”€β”€ logs/ # Debug logs (when debug=true) +β”œβ”€β”€ app/ +β”‚ β”œβ”€β”€ main.py # FastAPI application +β”‚ β”œβ”€β”€ config.py # Configuration loader +β”‚ β”œβ”€β”€ curator.py # Memory curation +β”‚ β”œβ”€β”€ proxy_handler.py # Chat handling +β”‚ β”œβ”€β”€ qdrant_service.py # Vector operations +β”‚ β”œβ”€β”€ singleton.py # QdrantService singleton +β”‚ └── utils.py # Utilities +β”œβ”€β”€ static/ # Legacy symlinks +β”œβ”€β”€ .env.example # Environment template +β”œβ”€β”€ docker-compose.yml # Docker Compose +β”œβ”€β”€ Dockerfile # Container definition +β”œβ”€β”€ requirements.txt # Python dependencies +└── README.md # This file ``` ## 🐳 Docker Compose @@ -281,11 +377,11 @@ The `TZ` variable sets the container timezone for the scheduler: ```bash # Common timezones -TZ=UTC # Coordinated Universal Time -TZ=America/New_York # Eastern Time -TZ=America/Chicago # Central Time -TZ=America/Los_Angeles # Pacific Time -TZ=Europe/London # GMT/BST +TZ=UTC # Coordinated Universal Time +TZ=America/New_York # Eastern Time +TZ=America/Chicago # Central Time +TZ=America/Los_Angeles # Pacific Time +TZ=Europe/London # GMT/BST ``` **Curation Schedule:** @@ -316,28 +412,6 @@ curl -X POST "http://localhost:11434/curator/run?full=true" ## 🧠 Memory System -### 4-Layer Context - -``` -β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” -β”‚ Layer 1: System Prompt β”‚ -β”‚ - From prompts/systemprompt.md β”‚ -β”‚ - Static context, curator can append rules β”‚ -β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ -β”‚ Layer 2: Semantic Memory β”‚ -β”‚ - Curated Q&A pairs from Qdrant β”‚ -β”‚ - Retrieved by relevance to current message β”‚ -β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ -β”‚ Layer 3: Recent Context β”‚ -β”‚ - Last N conversation turns from Qdrant β”‚ -β”‚ - Chronological order β”‚ -β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ -β”‚ Layer 4: Current Messages β”‚ -β”‚ - User/assistant messages from current request β”‚ -β”‚ - Passed through unchanged β”‚ -β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ -``` - ### Memory Types | Type | Description | Retention | @@ -346,6 +420,11 @@ curl -X POST "http://localhost:11434/curator/run?full=true" | `curated` | Cleaned Q&A pairs | Permanent | | `test` | Test entries | Can be ignored | +### Curation Process + +1. **Daily (02:00)**: Processes raw memories from last 24h into curated Q&A pairs +2. **Monthly (03:00 on 1st)**: Processes ALL remaining raw memories for full cleanup + ## πŸ”§ Troubleshooting ### Permission Denied