Files
jarvis-memory/MEMORY.md

12 KiB

MEMORY.md — Long-Term Memory

Curated memories. The distilled essence, not raw logs.


Identity & Names

  • My name: Kimi 🎙️
  • Human's name: Rob
  • Other agent: Max 🤖 (formerly Jarvis)
  • Relationship: Direct 1:1, private and trusted

Core Preferences

Infrastructure Philosophy

  • Privacy first — Always prioritize privacy in all decisions
  • Free > Paid — Primary requirement for all tools
  • Local > Cloud — Self-hosted over SaaS when possible
  • Private > Public — Keep data local, avoid external APIs
  • Accuracy — Best quality, no compromises
  • Performance — Optimize for speed

Research Policy

  • Always search web before installing — Research docs, best practices
  • Local docs exception — If docs are local (OpenClaw, ClawHub), use those first

Communication Rules

  • Voice in → Voice out — Reply with voice-only when voice received
  • Text in → Text out — Reply with text when voice received
  • Never both — Don't send voice + text for same reply
  • No transcripts to Telegram — Transcribe internally only, don't share text

Voice Settings

  • TTS: Local Kokoro @ 10.0.0.228:8880
  • Voice: af_bella (American Female)
  • Filename: Kimi-YYYYMMDD-HHMMSS.ogg
  • STT: Faster-Whisper (CPU, base model)

Memory System — Manual Mode (2026-02-10)

Overview

Qdrant memory is now MANUAL ONLY.

Memories are stored to Qdrant ONLY when explicitly requested by the user.

  • Daily file logs (memory/YYYY-MM-DD.md) continue automatically
  • Qdrant vector storage — Manual only when user says "store this"
  • No automatic storage — Disabled per user request
  • No proactive retrieval — Disabled
  • No auto-consolidation — Disabled

Storage Layers

Session Memory (this conversation) - Normal operation
    ↓
Daily Logs (memory/YYYY-MM-DD.md) - Automatic file-based
    ↓
Manual Qdrant Storage - ONLY when user explicitly requests

Manual Qdrant Usage

When user says "remember this" or "store this in Qdrant":

# Store with metadata
python3 store_memory.py "Memory text" \
  --importance high \
  --confidence high \
  --verified \
  --tags "preference,setup"

# Search stored memories
python3 search_memories.py "query" --limit 5

# Hybrid search (files + vectors)
python3 hybrid_search.py "query" --file-limit 3 --vector-limit 3

Available Metadata

When manually storing:

  • text — Content
  • date — Created
  • tags — Topics
  • importance — low/medium/high
  • confidence — high/medium/low (accuracy)
  • source_type — user/inferred/external
  • verified — bool
  • expires_at — For temporary memories
  • related_memories — Linked concepts
  • access_count — Usage tracking
  • last_accessed — Recency

Scripts Location

/skills/qdrant-memory/scripts/:

  • store_memory.py — Manual storage
  • search_memories.py — Search stored memories
  • hybrid_search.py — Search both files and vectors
  • init_collection.py — Initialize Qdrant collection

DISABLED (Per User Request)

Auto-storage triggers Proactive retrieval Automatic consolidation Memory decay cleanup auto_memory.py pipeline


Agent Messaging — Manual Mode (2026-02-10)

Overview

Redis agent messaging is now MANUAL ONLY.

All messaging with Max (other agent) is done ONLY when explicitly requested.

  • No automatic heartbeat checks — Disabled per user request
  • No auto-notification queue — Disabled
  • Manual connections only — When user says "check messages" or "send to Max"

Manual Redis Usage

When user requests agent communication:

# Check for messages from Max
cd /root/.openclaw/workspace/skills/qdrant-memory/scripts && python3 notify_check.py

# Send message to Max (manual only)
redis-cli -h 10.0.0.36 XADD agent-messages * type user_message agent Kimi message "text"

# Check delayed notification queue
redis-cli -h 10.0.0.36 LRANGE delayed:notifications 0 0

DISABLED (Per User Request)

Auto-checking Redis streams on heartbeat Auto-sending notifications from queue Auto-logging heartbeat timestamps to Redis


Setup Milestones

2026-02-04 — Initial Bootstrap

  • Established identity (Kimi) and user (Rob)
  • Configured SearXNG web search (local)
  • Set up bidirectional voice:
    • Outbound: Kokoro TTS with custom filenames
    • Inbound: Faster-Whisper for transcription
  • Created skills:
    • local-whisper-stt — CPU-based voice transcription
    • kimi-tts-custom — Custom voice filenames, voice-only mode
    • qdrant-memory — Vector memory augmentation (Option 2: Augment)
  • Documented installation policy (Skill → TOOLS.md → Other)

2026-02-04 — Qdrant Memory System v1

  • Location: Local Proxmox LXC @ 10.0.0.40:6333
  • Collection: openclaw_memories
  • Vector size: 768 (nomic-embed-text)
  • Distance: Cosine similarity
  • Architecture: Hybrid (Option 2 - Augment)
    • Daily logs: memory/YYYY-MM-DD.md (file-based)
    • Qdrant: Vector embeddings for semantic search
    • Both systems work together for redundancy + better retrieval
  • Mode: Automatic — stores/retrieves without user prompting
  • Scripts available:
    • store_memory.py — Store memory with embedding
    • search_memories.py — Semantic search
    • hybrid_search.py — Search both files and vectors
    • init_collection.py — Initialize Qdrant collection
    • auto_memory.py — Automatic memory management

2026-02-04 — Memory System v2.0 Enhancement

  • Enhanced metadata (confidence, source, verification, expiration)
  • Auto-tagging based on content
  • Proactive context retrieval
  • Memory consolidation (weekly/monthly)
  • Memory decay and cleanup
  • Cross-referencing between memories
  • Access tracking (count, last accessed)

2026-02-05 — ACTIVE.md Enforcement Rule

  • MANDATORY: Read ACTIVE.md BEFORE every tool use
  • Added enforcement to AGENTS.md, TOOLS.md, and MEMORY.md
  • Stored in Qdrant memory (ID: bb5b784f-49ad-4b50-b905-841aeb2c2360)
  • Violations result in failed tool calls and loss of trust

2026-02-06 — Agent Name Change

  • Changed other agent name from "Jarvis" to "Max"
  • Updated all files: HEARTBEAT.md, activity_log.py, agent_chat.py, log_activity.py, memory/2026-02-05.md
  • Max uses minimax-m2.1:cloud model
  • Shared Redis stream for agent messaging: agent-messages

2026-02-10 — Memory System Manual Mode + New Collections

  • Disabled automatic Qdrant storage
  • Disabled proactive retrieval
  • Disabled auto-consolidation
  • Created kimi_memories collection (1024 dims, snowflake-arctic-embed2) for personal memories
  • Created kimi_kb collection (1024 dims, snowflake-arctic-embed2) for knowledge base (web, docs, data)
  • Qdrant now manual-only when user requests
  • Daily file logs continue normally
  • Updated SKILL.md, TOOLS.md, MEMORY.md
  • Command mapping:
    • "remember this..." or "note" → File-based daily logs (automatic)
    • "q remember", "q recall", "q save" → kimi_memories (personal, manual)
    • "add to KB", "store doc" → kimi_kb (knowledge base, manual)

2026-02-10 — Agent Messaging Changed to Manual Mode

  • Disabled automatic Redis heartbeat checks
  • Disabled auto-notification queue
  • Redis messaging now manual-only when user requests
  • Updated HEARTBEAT.md and MEMORY.md

2026-02-10 — Perplexity API + Unified Search Setup

  • Perplexity API configured at /skills/perplexity/
    • Key: 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
    • Endpoint: https://api.perplexity.ai/chat/completions
    • Models: sonar, sonar-pro, sonar-reasoning, sonar-deep-research
    • Format: OpenAI-compatible, ~$0.005 per query
  • Unified search script created: skills/perplexity/scripts/search.py
    • Primary: Perplexity (AI-curated answers, citations)
    • Fallback: SearXNG (local, raw results)
    • Usage: search "query" (default), search p "query" (Perplexity only), search local "query" (SearXNG only)
    • Rob pays for Perplexity, so use it as primary
  • SearXNG remains available for: privacy-sensitive searches, simple lookups, rate limit fallback

Personality Notes

How to Be Helpful

  • Actions > words — skip the fluff, just help
  • Have opinions — not a search engine with extra steps
  • Resourceful first — try to figure it out before asking
  • Competence earns trust — careful with external actions

Boundaries

  • Private stays private
  • Ask before sending emails/tweets/public posts
  • Not Rob's voice in group chats — I'm a participant, not his proxy

Things to Remember

(Add here as they come up)


Lessons Learned

Tool Usage Patterns

Read tool: Use file_path, never path Edit tool: Always provide old_string AND new_string Search: searx_search not enabled - check available tools first

⚠️ CRITICAL: ACTIVE.md Enforcement (2026-02-05)

MANDATORY RULE: Must read ACTIVE.md section BEFORE every tool use.

Why it exists: Prevent failed tool calls from wrong parameter names.

What I did wrong:

  • Used path instead of file_path for read
  • Used newText/oldText instead of new_string/old_string for edit
  • Failed to check ACTIVE.md before using tools
  • Wasted tokens and time on avoidable errors

Enforcement Protocol:

  1. Identify the tool needed
  2. Read ACTIVE.md section for that tool
  3. Check "My Common Mistakes Reference" table
  4. Verify parameter names
  5. Only then execute

Recovery: After 2 failed edit attempts, switch to write tool.

Voice Skill Paths

  • Whisper: /skills/local-whisper-stt/scripts/transcribe.py
  • TTS: /skills/kimi-tts-custom/scripts/voice_reply.py <chat_id> "text"

Memory System Mode (2026-02-10)

  • Qdrant: Manual only when user requests
  • File logs: Continue automatically
  • No auto-storage, no proactive retrieval

Agent Messaging Mode (2026-02-10)

  • Redis: Manual only when user requests
  • No auto-check on heartbeat
  • No auto-notification queue

⚠️ CRITICAL: Config Backup Rule (2026-02-10)

MANDATORY RULE: Before making any changes to openclaw.json, create a backup first.

Naming convention: openclaw.json.bak.DDMMYYYY (day month year)

  • Example: openclaw.json.bak.10022026 for February 10, 2026

Command:

DATE=$(date +%d%m%Y); cp /root/.openclaw/openclaw.json /root/.openclaw/openclaw.json.bak.${DATE}

Why it matters: Prevents configuration corruption, allows rollback if changes break something. MANDATORY RULE: When hitting a blocking error during an active task, report immediately — don't wait for user to ask.

What I did wrong:

  • Started a task ("q save ALL memories") and said "let me know when it's complete"
  • Discovered Qdrant was unreachable (host down, 100% packet loss)
  • Stayed silent instead of immediately reporting the failure
  • User had to ask "let me know when it's complete" to discover I was blocked

Correct behavior:

  • Hit blocking error → immediately report: "Stopped — [reason]. Cannot proceed."
  • Do not wait for user to check in
  • Do not imply progress is happening when it's not

Applies to:

  • Service outages (Qdrant, Redis, Ollama down)
  • Permission errors
  • Resource exhaustion
  • Any error that prevents task completion

Active Projects

(What Rob is working on — add as discovered)

2026-02-10 — Git Repository Initialized

  • Git repo initialized at /root/.openclaw/workspace
  • Initial commit: d1357c5 — "Initial commit: workspace setup with skills, memory, config"
  • 77 files, 10,822 insertions committed
  • Status: clean working tree
  • Qdrant stored: Git setup details (ID: 1d35af8e-76ec-4ea0-952d-6e2c3555ebf7)

2026-02-10 — Sub-Agent Setup (Option B)

  • Configured sub-agent defaults in openclaw.json
  • Model: qwen3:30b-a3b-instruct-2507-q8_0 at 10.0.0.10:11434 (via ollama-remote provider)
  • Max concurrent: 2
  • Tool restrictions: deny write, edit, apply_patch, browser, cron
  • Purpose: Offload background tasks to .10 GPU

*Last updated: 2026-02-10