# TrueRecall v2 - Session Notes **Last Updated:** 2026-02-24 15:08 CST --- ## Summary of Changes (2026-02-24) ### Collection Migration | Action | From | To | Status | |--------|------|----|--------| | **Rename** | `kimi_memories` | `memories_tr` | ✅ Done + data migrated (12,223 points) | | **Create** | — | `gems_tr` | ✅ Created (empty, ready for curation) | | **Archive** | `true_recall` | `true_recall` | ✅ Preserved (existing data kept) | ### Dual Collection Support (NEW - 14:10) **Problem:** Auto-capture was saving to `gems_tr` because that's where recall pulled from. This was wrong. **Solution:** Added `captureCollection` option to memory-qdrant plugin: - `collectionName`: `gems_tr` — for recall/injection (gems only) - `captureCollection`: `memories_tr` — for auto-capture (full conversations) **Files Modified:** 1. `/root/.openclaw/extensions/memory-qdrant/config.ts` — Added `captureCollection` option 2. `/root/.openclaw/extensions/memory-qdrant/index.ts` — Uses `dbRecall` and `dbCapture` separately 3. `/root/.openclaw/openclaw.json` — Added `"captureCollection": "memories_tr"` ### Auto-Capture Architecture (Real-Time Watcher) **Mechanism:** `realtime_qdrant_watcher.py` daemon - Watches OpenClaw session JSONL files in real-time - Parses each conversation turn - Embeds with `snowflake-arctic-embed2` via Ollama - Stores directly to `memories_tr` collection (no Redis) - Cleans content (removes metadata, thinking tags) **Files:** - Script: `/root/.openclaw/workspace/skills/qdrant-memory/scripts/realtime_qdrant_watcher.py` - Service: `/root/.openclaw/workspace/skills/qdrant-memory/mem-qdrant-watcher.service` **Status:** ✅ Deployed and running **Deployment:** - Stopped: `mem-redis-watcher` - Started: `mem-qdrant-watcher` - Status: Active (PID 84465) - Verified: ✅ Capturing (points: 12,223 → 12,224) ### Current State (2026-02-24 15:08) | Collection | Purpose | Points | Last Update | |------------|---------|--------|-------------| | `memories_tr` | Full text (autoCapture via watcher) | 12,228 | **Live** | | `gems_tr` | Gems (for injection) | 5 | Feb 24 | **Flow:** ``` OpenClaw Session → Real-Time Watcher → memories_tr (Qdrant) ↓ Daily Curator (2:45 AM) ↓ gems_tr (Qdrant) ↓ memory-qdrant plugin → Injection ``` ### Files Modified Today 1. `/root/.openclaw/openclaw.json` — Changed collectionName to `gems_tr` 2. `/root/.openclaw/extensions/memory-qdrant/config.ts` — Default to `memories_tr` 3. `/root/.openclaw/extensions/memory-qdrant/openclaw.plugin.json` — Defaults to `memories_tr` 4. `/root/.openclaw/workspace/skills/mem-redis/scripts/save_mem.py` — Added `--silent` flag 5. `/root/.openclaw/workspace/HEARTBEAT.md` — Updated to use `--silent` 6. `/root/.openclaw/workspace/.projects/true-recall-v2/tr-daily/curate_from_qdrant.py` — TARGET_COLLECTION = `gems_tr` 7. `/root/.openclaw/workspace/SOUL.md` — Updated collection references 8. `/root/.openclaw/workspace/kb/relevant-memories-ui-issue.md` — Updated documentation ### Migration Script Created - `/root/.openclaw/workspace/.projects/true-recall-v2/migrate_memories.py` - Migrated 12,223 points from `kimi_memories` → `memories_tr` - Cleaned noise (metadata, thinking tags) during migration - Preserved original `kimi_memories` as backup ### Current Collections (Qdrant) | Collection | Purpose | Points | |------------|---------|--------| | `memories_tr` | Full text (live capture) | **12,228** | | `gems_tr` | Gems (for injection) | 5 | | `true_recall` | Legacy gems archive | existing | | `kimi_memories` | Original (backup) | 12,223 | --- ## Final Status (2026-02-24) | Component | Status | |-----------|--------| | **Collections** | 4 active (memories_tr, gems_tr, true_recall, kimi_memories) | | **Curator v2** | ✅ Tested & working - 327 turns → 5 gems | | **Config** | ✅ Using `gems_tr` for injection | | **Cron** | ✅ Simplified - only essential jobs | | **Redis** | ✅ Only for notifications (not memory) | ### Collection Summary | Collection | Points | Purpose | Status | |------------|--------|---------|--------| | `memories_tr` | **12,228** | Full text (live capture) | ✅ Active | | `gems_tr` | 5 | Gems (curated) | ✅ Active | | `true_recall` | existing | Legacy archive | 📦 Preserved | | `kimi_memories` | 12,223 | Original backup | 📦 Preserved | ### Cron Schedule (Cleaned) | Time | Job | |------|-----| | 2:45 AM | Curator v2: memories_tr → gems_tr | | 2:20 AM | File backup | | 2:00 AM | Log monitoring | **Removed:** 2:15 AM Redis backup, 2:50 AM archive, 5-min cron_capture (all redundant) --- ## What We Did Today ### Issue: `` showing in UI **Problem:** The `` block was showing full conversation text in webchat UI. It should be hidden/internal. **Investigation:** 1. Initially thought it was `save_mem.py` output (wrong) 2. Then thought it was HTML comment issue (wrong) 3. Found root cause: memory-qdrant plugin was recalling from `memories_tr` (full text) instead of `gems_tr` (gems) **Solution Applied:** Changed `openclaw.json` config: - Before: `"collectionName": "memories_tr"` - After: `"collectionName": "gems_tr"` **Result:** ✅ Fixed! Now injection uses gems from true_recall, not full text. ### Issue: Auto-Capture Architecture Change **Problem:** Real-time capture was going through Redis, we needed direct Qdrant storage **Solution:** 1. Created `realtime_qdrant_watcher.py` — watches session JSONL, embeds, stores directly to Qdrant 2. Created `mem-qdrant-watcher.service` — systemd service for the watcher 3. Deployed and verified: - Points before: 12,223 - Points after test messages: 12,228 - Verified new captures have correct structure (role, content, date, source) **Status:** ✅ **Deployed and working** ### Other Changes Made 1. **Plugin dual collection support** — Added `captureCollection` option 2. **Session/Readme updates** — Clarified architecture ### Files Modified | File | Change | |------|--------| | `/root/.openclaw/openclaw.json` | collectionName: memories_tr → gems_tr, added captureCollection | | `/root/.openclaw/extensions/memory-qdrant/config.ts` | Added captureCollection option | | `/root/.openclaw/extensions/memory-qdrant/index.ts` | Dual collection support, debug logging | | `/root/.openclaw/extensions/memory-qdrant/openclaw.plugin.json` | Added captureCollection to schema | ### Files Created (NEW) | File | Purpose | |------|---------| | `/root/.openclaw/workspace/skills/qdrant-memory/scripts/realtime_qdrant_watcher.py` | Real-time watcher daemon (Qdrant direct) | | `/root/.openclaw/workspace/skills/qdrant-memory/mem-qdrant-watcher.service` | Systemd service file | ### Deployment | Service | Action | Status | |---------|--------|--------| | `mem-redis-watcher` | Stopped | ✅ | | `mem-qdrant-watcher` | Started | ✅ Active | ### Backups Created - `/root/.openclaw/openclaw.json.bak.2026-02-24` - `/root/.openclaw/extensions/memory-qdrant/index.ts.bak.2026-02-24` --- ## Current Status | Component | Status | |-----------|--------| | **Curation (daily)** | v1 cron at 2:45 AM | | **Injection** | ✅ Working, uses gems_tr | | **Collection** | gems_tr | | **KB** | Updated | --- ## What Still Needs Doing 1. ~~Test autoCapture (cleaned content to memories_tr)~~ ✅ Done 2. Test v2 curator (read from Qdrant, not Redis) — Next step 3. Full validation 2x --- ## Session Recovery If starting new session: 1. Read this session.md 2. Read README.md for architecture 3. Read KB for issue history --- **Next:** Test v2 curator (reads from memories_tr, creates gems in gems_tr)