Skip to main content
Glama
orneryd

M.I.M.I.R - Multi-agent Intelligent Memory & Insight Repository

by orneryd
MULTI_AGENT_GRAPH_RAG.mdβ€’45.8 kB
# Multi-Agent Graph-RAG Orchestration **Date:** 2025-10-22 **Status:** βœ… Production Ready (v4.0) **Version:** 4.0 Architecture Specification --- ## πŸ“š Related Documentation This is the **complete technical architecture specification** for multi-agent orchestration. For related documents: - **πŸ“‹ [Executive Summary](../MULTI_AGENT_EXECUTIVE_SUMMARY.md)**: High-level overview for stakeholders - **πŸ—οΈ This Document**: Complete technical architecture specification (v3.1) - **πŸ—ΊοΈ [Implementation Roadmap](MULTI_AGENT_ROADMAP.md)**: Phase-by-phase implementation plan (Q4 2025 - Q1 2026) --- ## Executive Summary This document describes the evolution of the Graph-RAG TODO MCP Server from single-agent context management to **multi-agent orchestration** with ephemeral workers and adversarial validation. **Key Innovation:** Agent-scoped context management where context pruning happens naturally through process boundaries rather than algorithmic deduplication. **Research Validation:** [CONVERSATION_ANALYSIS.md](../CONVERSATION_ANALYSIS.md) validates this architecture against existing Graph-RAG research. --- ## 🎯 Core Problem Statement ### The Context Accumulation Problem **Traditional Single-Agent Pattern:** ``` Agent Context Growth Over Time: Turn 1: [Research] ← 1K tokens Turn 5: [Research][Task1][Task2] ← 5K tokens Turn 10: [Research][Task1-5] ← 15K tokens Turn 20: [Research][Task1-10][Errors] ← 40K tokens ❌ Context bloat ``` **Issue:** External storage (Graph-RAG) doesn't solve this - retrieval brings context back into the LLM's context window. **Research Finding:** "Lost in the Middle" research shows LLMs have U-shaped performance curves. Middle-positioned information becomes effectively invisible even with 200K+ context windows[^1]. --- ## πŸ—οΈ Architecture Overview ### Multi-Agent System with Deliverable-Focused QC & Retries ``` β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ MULTI-AGENT GRAPH-RAG ARCHITECTURE (v4.0) β”‚ β”‚ Deliverable-Focused QC, Evidence-Based Workers, Simplified β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ Phase 0: Request Optimization - "mimir-chain" startup (OPTIONAL) β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ User Input: "Build authentication system" β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ ↓ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ Ecko Agent (Prompt Architect) - OPTIONAL β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”‚ 1. Receives raw user request β”‚ β”‚ β”‚ β”‚ 2. Analyzes request for clarity β”‚ β”‚ β”‚ β”‚ 3. Documents assumptions & context β”‚ β”‚ β”‚ β”‚ 4. Identifies ambiguities β”‚ β”‚ β”‚ β”‚ 5. Generates optimized specification β”‚ β”‚ β”‚ β”‚ 6. Output: Enhanced user request β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ Tools: NONE (text analysis only) β”‚ β”‚ β”‚ β”‚ Note: Can skip if prompt is clear β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ ↓ Optimized Request (or original) ↓ Phase 1: PM Agent (Research & Planning) - "mimir-chain" β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ PM Agent: Complete Task Breakdown β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”‚ Receives Ecko's optimized spec β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ 1. memory_search_nodes() - Find β”‚ β”‚ β”‚ β”‚ existing TODOs, files, patterns β”‚ β”‚ β”‚ β”‚ 2. memory_query_nodes() - Get related β”‚ β”‚ β”‚ β”‚ context from knowledge graph β”‚ β”‚ β”‚ β”‚ 3. read_file() - Check README, docs β”‚ β”‚ β”‚ β”‚ 4. Analyze repository structure β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ 5. Break down into tasks: β”‚ β”‚ β”‚ β”‚ - Task 0: Environment validation β”‚ β”‚ β”‚ β”‚ - Task 1.x: Main workflow tasks β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ 6. For EACH task, define: β”‚ β”‚ β”‚ β”‚ - Worker agent role β”‚ β”‚ β”‚ β”‚ - QC agent role β”‚ β”‚ β”‚ β”‚ - Verification criteria β”‚ β”‚ β”‚ β”‚ - Tool-Based Execution section β”‚ β”‚ β”‚ β”‚ - Estimated tool calls β”‚ β”‚ β”‚ β”‚ - maxRetries (default: 2) β”‚ β”‚ β”‚ β”‚ - Recommended model β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ 7. Map dependencies between tasks β”‚ β”‚ β”‚ β”‚ 8. Output: chain-output.md β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ Tools: Filesystem + 5 graph search β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ ↓ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ KNOWLEDGE GRAPH (Neo4j Persistent) β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”β”‚ β”‚ β”‚ Task 1.1 β”‚ β”‚ Task 1.2 β”‚ β”‚ Task 1.3 β”‚β”‚ β”‚ β”‚ status: pending β”‚β†’β†’β”‚ status: pending β”‚β†’β†’β”‚ status: pending β”‚β”‚ β”‚ β”‚ + workerRole β”‚ β”‚ + workerRole β”‚ β”‚ + workerRole β”‚β”‚ β”‚ β”‚ + qcRole β”‚ β”‚ + qcRole β”‚ β”‚ + qcRole β”‚β”‚ β”‚ β”‚ + verificationCriβ”‚ β”‚ + verificationCriβ”‚ β”‚ + verificationCriβ”‚β”‚ β”‚ β”‚ + maxRetries: 2 β”‚ β”‚ + maxRetries: 2 β”‚ β”‚ + maxRetries: 2 β”‚β”‚ β”‚ β”‚ + attemptNumber:0β”‚ β”‚ + attemptNumber:0β”‚ β”‚ + attemptNumber:0β”‚β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜β”‚ β”‚ β”‚ β”‚ [Lock Status: All tasks available, no locks held] β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ ↓ Phase 1.5: Preamble Generation - "mimir-execute" startup β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ Agentinator (Preamble Generator) β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”‚ For each unique agent role (Worker + QC): β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ 1. Extract unique roles from chain-output.md: β”‚ β”‚ β”‚ β”‚ - Worker roles (agentRoleDescription) β”‚ β”‚ β”‚ β”‚ - QC roles (qcRole) β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ 2. Hash role description β†’ worker-abc123.md β”‚ β”‚ β”‚ β”‚ (Reuse if hash already exists) β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ 3. Generate specialized preamble with: β”‚ β”‚ β”‚ β”‚ - Role-specific expertise β”‚ β”‚ β”‚ β”‚ - Agentic framework principles β”‚ β”‚ β”‚ β”‚ - Tool usage guidelines β”‚ β”‚ β”‚ β”‚ - Output format requirements β”‚ β”‚ β”‚ β”‚ - Worker: Includes WORKER_TOOL_EXECUTION.md guidance β”‚ β”‚ β”‚ β”‚ - QC: Includes QC_VERIFICATION_CRITERIA.md guidance β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ 4. Cache in generated-agents/ directory β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ 5. Return paths to PM for task assignment β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”œβ”€β†’ generated-agents/worker-abc123.md (Worker preamble) β”œβ”€β†’ generated-agents/worker-def456.md (QC preamble 1) └─→ generated-agents/worker-ghi789.md (QC preamble 2) ↓ Phase 2: Worker Execution Loop (Per Task) - "mimir-execute" β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ πŸ”„ ATTEMPT LOOP (attemptNumber: 1 β†’ maxRetries+1) β”‚ β”‚ β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”‚ Worker Agent Execution β”‚ β”‚ β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”‚ β”‚ β”‚ 1. PHASE 1: Task Initialization (System) β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ createGraphNode(taskId): β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ - status: 'pending' β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ - attemptNumber: 0 β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ - taskCreatedAt: timestamp β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ - All task metadata from chain-output.md β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ 2. PHASE 2: Worker Execution Start (System) β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ updateGraphNode(taskId): β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ - status: 'worker_executing' β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ - attemptNumber: 1 (or retry count) β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ - workerStartTime: timestamp β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ - isRetry: boolean β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ - retryReason: (if retry) β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ 3. fetchTaskContext(taskId, 'worker') - Pre-fetch: β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ βœ… title, requirements, description, workerRole β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ βœ… files (max 10), dependencies (max 5) β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ ❌ NO PM research, planningNotes, alternatives β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β†’ 90%+ context reduction! β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ 4. Load worker preamble (generated-agents/worker-*.md) β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ + Evidence-based execution guidance β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ + Tool output verification requirements β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ 5. Calculate dynamic circuit breaker: β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ - PM estimated tool calls Γ— 1.5 β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ - Default: 50 if no estimate β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ - Recursion limit: toolCalls Γ— 3 β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ 6. Execute with LangChain AgentExecutor: β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ - Preamble + Task Context + Task Prompt β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ - If retry: Include errorContext from QC β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ - Tools: filesystem + graph operations (read-only) β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ - maxTokens: 4000 (prevent verbosity) β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ - Circuit breaker: Dynamic limit β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ 7. PHASE 3: Worker Execution Complete (System) β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ updateGraphNode(taskId): β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ - status: 'worker_completed' β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ - workerOutput: <result> (truncated 50k chars) β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ - workerDuration, workerTokens, workerToolCalls β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ - workerCompletedAt: timestamp β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ - workerMessageCount, estimatedContextTokens β”‚ β”‚ β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚ ↓ β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”‚ πŸ›‘οΈ QC AGENT VERIFICATION (Circuit Breaker) β”‚ β”‚ β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”‚ β”‚ β”‚ 1. PHASE 5: QC Execution Start (System) β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ updateGraphNode(taskId): β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ - status: 'qc_executing' β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ - qcStartTime: timestamp β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ - qcAttemptNumber: 1 (or retry count) β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ 2. fetchTaskContext(taskId, 'qc') - Pre-fetch: β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ βœ… requirements, workerOutput, verificationCriteria β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ ❌ NO worker implementation details, PM research β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ 3. memory_get_subgraph(taskId, depth=2) - Get deps β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ 4. Load QC preamble (generated-agents/qc-*.md) β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ Role: Deliverable quality validator β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ 5. Execute deliverable-focused verification: β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ - Focus: Does deliverable meet requirements? β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ - Verify with tools: Read files, run tests β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ - Check completeness, accuracy, functionality β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ - Ignore process metrics (tool calls, evidence) β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ - maxTokens: 1000 (concise feedback) β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ 6. Parse structured output: β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ verdict: "PASS" | "FAIL" β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ score: 0-100 (based on deliverable quality) β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ feedback: <2-3 sentences on deliverable gaps> β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ issues: [<what's missing/wrong in deliverable>] β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ requiredFixes: [<what to add/change in deliverable>] β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ 7. Store full QC result (NO truncation): β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ feedback: complete (no truncation) β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ issues: all issues (no truncation) β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ requiredFixes: all fixes (no truncation) β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ 8. PHASE 6: QC Execution Complete (System) β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ updateGraphNode(taskId): β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ - status: 'qc_passed' OR 'qc_failed' β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ - qcScore, qcPassed, qcFeedback β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ - qcIssues, qcRequiredFixes β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ - qcCompletedAt: timestamp β”‚ β”‚ β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚ ↓ β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ ↓ ↓ β”‚ β”‚ βœ… PASS ❌ FAIL β”‚ β”‚ (score β‰₯ 80) (score < 80) β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β†’ Check attemptNumber β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”Œβ”€β”€β”€β”€β”΄β”€β”€β”€β”€β” β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ ↓ ↓ β”‚ β”‚ β”‚ attemptNumber attemptNumber β”‚ β”‚ β”‚ ≀ maxRetries > maxRetries β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ ↓ β”‚ β”‚ β”‚ β”‚ 🚨 CIRCUIT BREAKER β”‚ β”‚ β”‚ β”‚ TRIGGERED β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”Œβ”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”‚ β”‚ β”‚ QC Failure Report β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ (maxTokens: 2000) β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ β”‚ β”‚ β”‚ β”‚ β”‚ - Timeline of β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ attempts β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ - Score progression β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ - Root cause β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ - Recommendations β”‚ β”‚ β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ ↓ β”‚ β”‚ β”‚ β”‚ PHASE 9: Task Failure (System)β”‚ β”‚ β”‚ β”‚ updateGraphNode: β”‚ β”‚ β”‚ β”‚ - status: 'failed' β”‚ β”‚ β”‚ β”‚ - qcScore: <final score> (PRIMARY)β”‚ β”‚ β”‚ β”‚ - qcPassed: false β”‚ β”‚ β”‚ β”‚ - qcFeedback: <complete feedback>β”‚ β”‚ β”‚ β”‚ - qcFailureReport: <report> β”‚ β”‚ β”‚ β”‚ - totalAttempts: maxRetries+1 β”‚ β”‚ β”‚ β”‚ - totalQCFailures: N β”‚ β”‚ β”‚ β”‚ - qcFailureReportGenerated: trueβ”‚ β”‚ β”‚ β”‚ - finalWorkerOutput (truncated)β”‚ β”‚ β”‚ β”‚ - improvementNeeded: true β”‚ β”‚ β”‚ β”‚ - qcAttemptMetrics: JSON { β”‚ β”‚ β”‚ β”‚ history, lowestScore, β”‚ β”‚ β”‚ β”‚ highestScore, avgScore β”‚ β”‚ β”‚ β”‚ } β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ ❌ TASK FAILED β”‚ β”‚ β”‚ β”‚ Exit attempt loop β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ ↓ β”‚ β”‚ β”‚ πŸ” RETRY LOOP β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ PHASE 7: Retry Preparation (System) β”‚ β”‚ β”‚ updateGraphNode: β”‚ β”‚ β”‚ - status: 'preparing_retry' β”‚ β”‚ β”‚ - nextAttemptNumber: attemptNumber + 1 β”‚ β”‚ β”‚ - retryReason: 'qc_failure' β”‚ β”‚ β”‚ - retryErrorContext: { β”‚ β”‚ β”‚ previousAttempt, β”‚ β”‚ β”‚ qcFeedback (truncated), β”‚ β”‚ β”‚ issues (truncated), β”‚ β”‚ β”‚ requiredFixes (truncated) β”‚ β”‚ β”‚ } β”‚ β”‚ β”‚ - retryPreparedAt: timestamp β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ └─→ Back to Worker (Step 1) β”‚ β”‚ β”‚ with errorContext in prompt β”‚ β”‚ β”‚ β”‚ β”‚ ↓ β”‚ β”‚ PHASE 8: Task Success (System) β”‚ β”‚ updateGraphNode: β”‚ β”‚ - status: 'completed' β”‚ β”‚ - qcScore: <final score> (PRIMARY FIELD) β”‚ β”‚ - qcPassed: true β”‚ β”‚ - qcFeedback: <complete feedback> β”‚ β”‚ - verifiedAt: timestamp β”‚ β”‚ - totalAttempts, totalTokensUsed, totalToolCalls β”‚ β”‚ - qcFailuresCount, retriesNeeded β”‚ β”‚ - qcPassedOnAttempt β”‚ β”‚ - qcAttemptMetrics: JSON (history for debugging) β”‚ β”‚ β”‚ β”‚ βœ… TASK COMPLETED β”‚ β”‚ Exit attempt loop β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ ↓ Phase 3: Final Report Generation - "mimir-execute" completion β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ PM Agent (Final Report) β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”‚ 1. Aggregate all task outputs from β”‚ β”‚ β”‚ β”‚ graph (workerOutput, qcVerif.) β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ 2. If ANY tasks failed: β”‚ β”‚ β”‚ β”‚ - Generate PM failure analysis β”‚ β”‚ β”‚ β”‚ - Impact assessment β”‚ β”‚ β”‚ β”‚ - Blocking dependencies β”‚ β”‚ β”‚ β”‚ - Recommendations β”‚ β”‚ β”‚ β”‚ - maxTokens: 3000 β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ 3. Summarize files changed β”‚ β”‚ β”‚ β”‚ (from workerOutput + tool calls) β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ 4. Summarize agent reasoning β”‚ β”‚ β”‚ β”‚ (from qcVerification feedback) β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ 5. Extract key decisions & metrics β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ 6. Output: execution-report.md β”‚ β”‚ β”‚ β”‚ with links to graph nodes β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ πŸ›‘οΈ CIRCUIT BREAKERS & GUARDRAILS (βœ… IMPLEMENTED v4.0) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1. βœ… QC Deliverable Focus: Scores deliverable quality, not process metrics 2. βœ… Max Retries: attemptNumber > maxRetries β†’ CIRCUIT BREAKER (default: 2) 3. βœ… Dynamic Tool Call Limits: PM estimated tool calls Γ— 1.5 (prevents spirals) 4. βœ… Recursion Limits: Tool call limit Γ— 3 messages (prevents infinite loops) 5. βœ… NO Truncation: Full QC feedback stored for complete worker guidance 6. βœ… Token Limits: maxTokens on all agents to prevent verbose LLM responses 7. βœ… Context Isolation: Workers get 90%+ reduced context (no PM research) 8. βœ… Graph Storage Gate: System stores results automatically (workers return data) 9. βœ… Automatic Diagnostic Capture: 10 phases of system-level metadata capture 10. βœ… Failure Reporting: Two-level reports (QC technical + PM strategic) 11. βœ… Evidence-Based Workers: Must show actual tool output, not summaries 12. βœ… Hallucination Prevention: Workers required to quote evidence for claims ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ``` --- ## πŸ”¬ Research Validation ### Statement-by-Statement Analysis | Claim | Research Support | Verdict | |-------|------------------|---------| | Tool calls don't reduce context | βœ… "Lost in the Middle" validates | **CORRECT** | | Duplicates cause hallucinations | βœ… Context Confusion failure mode | **CORRECT** | | PM/Worker architecture | βœ… Extends hierarchical memory | **SOUND** | | Adversarial QC validation | βœ… Aligns with poisoning prevention | **VALID** | | Mutex/locking requirement | ⚠️ Not in research (gap identified) | **CORRECT** | **Full analysis:** [CONVERSATION_ANALYSIS.md](../CONVERSATION_ANALYSIS.md) --- ## πŸ’‘ Key Insights ### Insight 1: Agent-Scoped Context = Natural Pruning **Traditional Approach:** - Algorithmic deduplication within single agent - Complex context management logic - Still vulnerable to accumulation over time **Multi-Agent Approach:** - Process boundaries enforce context isolation - Worker termination = automatic cleanup - Operating system analogy: process memory vs. shared disk **Analogy:** ``` OS Process Model Multi-Agent Model ────────────────── ─────────────────── Process A (RAM) ←→ PM Agent (Context) Process B (RAM) ←→ Worker 1 (Context) Shared Disk ←→ Knowledge Graph Process exit ←→ Agent termination ``` ### Insight 2: Adversarial Validation Architecture **Not just parallel execution - it's adversarial:** - **Worker Agent**: Optimized for implementation speed - **QC Agent**: Optimized for verification accuracy - **Correction Loop**: Preserves worker context for efficient retry **Benefits:** 1. Catches hallucinations before storage (prevents error propagation) 2. Provides learning signal (correction prompts improve worker accuracy) 3. Maintains audit trail (compliance requirement for enterprise) ### Insight 3: Context Deduplication β‰  External Storage **Critical Discovery:** Simply offloading to external graph doesn't reduce context - retrieval brings it back. **Solution:** Active deduplication + agent-scoped isolation **Measurement:** ``` Deduplication Rate = 1 - (Unique Context / Total Context) Target: >80% across agent fleet ``` --- ## 🎯 Success Metrics (v3.0+) ### Primary Metrics **1. Context Deduplication Rate** ``` Rate = 1 - (Unique Context Tokens / Total Context Tokens) Target: >80% Measurement: Hash-based fingerprinting across agent contexts ``` **2. Agent Context Lifespan** ``` Avg Lifespan = Ξ£(agent_context_duration) / num_agents Target: <5 min (workers), <60 min (PM) Measurement: Timestamp from spawn to termination ``` **3. Task Allocation Efficiency** ``` Efficiency = Successful Claims / Total Claim Attempts Target: >95% Measurement: Lock conflict rate ``` **4. Cross-Agent Error Propagation** ``` Propagation = Errors Stored / Total Errors Generated Target: <5% Measurement: QC rejection rate before storage ``` ### Secondary Metrics **5. Subgraph Retrieval Precision** ``` Precision = Relevant Nodes / Total Nodes Retrieved Target: >90% Measurement: Human eval or downstream task success ``` **6. PM β†’ Worker Handoff Completeness** ``` Completeness = 1 - (Worker Questions / Tasks Assigned) Target: <10% clarification needed Measurement: Worker follow-up queries to PM ``` **7. Worker Retry Rate** ``` Retry Rate = QC Rejections / Total Task Attempts Target: <20% Measurement: Correction prompt frequency ``` --- ## πŸ”§ Implementation Phases ### Phase 1: Multi-Agent Foundation (v3.0) **Objective:** Enable basic PM/Worker/QC pattern **Features:** - [ ] **Task Locking System**: Optimistic locking with version field ```typescript interface TaskLock { taskId: string; agentId: string; version: number; lockedAt: Date; expiresAt: Date; } ``` - [ ] **Agent Lifecycle Management**: Spawn, execute, terminate workers ```typescript class WorkerAgent { async claimTask(): Promise<Task | null> async executeTask(task: Task): Promise<TaskOutput> async storeOutput(output: TaskOutput): Promise<void> async terminate(): void } ``` - [x] **Context Isolation**: βœ… Implemented with ContextManager (v3.1) ```typescript // IMPLEMENTED: src/managers/ContextManager.ts function get_task_context(taskId: string, agentType: 'pm' | 'worker' | 'qc'): Context { // PM: Full context (100%) // Worker: Minimal context (files max 10, no research) β†’ 95%+ reduction // QC: Requirements + worker output } ``` **Success Criteria:** βœ… ACHIEVED - Zero task conflicts across parallel workers βœ… (locking system) - Worker context <5% of PM context size βœ… (95.3-95.6% reduction measured) - PM context doesn't grow during worker execution βœ… (ephemeral workers) ### Phase 2: Adversarial Validation (v3.1) βœ… IMPLEMENTED **Objective:** Add QC agent with verification and correction **Features:** - [x] **Subgraph Verification**: βœ… QC uses filtered context + subgraph ```typescript // IMPLEMENTED: testing/qc-verification-workflow.test.ts async function verifyTask(taskId: string): Promise<VerificationResult> { const qcContext = get_task_context(taskId, 'qc'); const subgraph = memory_get_subgraph(taskId, depth=2); return { passed: boolean, score: 0-100, feedback: string, issues: string[], requiredFixes: string[] }; } ``` - [x] **Retry Logic with Max Attempts**: βœ… Worker gets 2 retries (3 total attempts) ```typescript // IMPLEMENTED: testing/qc-verification-workflow.test.ts interface TaskRetry { attemptNumber: number; // 1, 2, 3 maxRetries: 2; // Default errorContext: { previousAttempt: number; qcFeedback: string; issues: string[]; requiredFixes: string[]; }; qcVerificationHistory: QCResult[]; } // If attemptNumber > maxRetries β†’ Task marked as FAILED ``` - [x] **Two-Level Failure Reporting**: βœ… QC report + PM summary ```typescript // QC Failure Report (after max retries) interface QCFailureReport { timeline: Array<{attempt, score, issues}>; rootCauses: string[]; recommendations: string[]; } // PM Failure Summary (strategic level) interface PMFailureSummary { impactAssessment: {blockingTasks, projectDelay, riskLevel}; nextActions: string[]; lessonsLearned: string[]; } ``` **Success Criteria:** βœ… ACHIEVED - <5% error propagation to graph storage βœ… (QC verification before storage) - <20% worker retry rate βœ… (max 2 retries enforced) - 100% audit trail completeness βœ… (qcVerificationHistory tracked) ### Phase 3: Context Deduplication (v3.2) **Objective:** Active deduplication engine **Features:** - [ ] **Context Fingerprinting**: Hash-based duplicate detection ```typescript interface ContextFingerprint { hash: string; content: string; firstSeen: Date; useCount: number; } function deduplicateContext(contexts: string[]): string[] { const seen = new Map<string, boolean>(); return contexts.filter(c => { const hash = sha256(normalize(c)); if (seen.has(hash)) return false; seen.set(hash, true); return true; }); } ``` - [ ] **Smart Context Merging**: Consolidate redundant information ```typescript function mergeContexts(contexts: TaskContext[]): TaskContext { // Deduplicate file paths // Merge similar error messages // Consolidate dependency information } ``` **Success Criteria:** - >80% deduplication rate across fleet - <10ms overhead per deduplication check - Zero information loss in merge operations ### Phase 4: Scale & Performance (v3.3) **Objective:** Production-ready concurrency and observability **Features:** - [ ] **Distributed Locking**: Move beyond optimistic locking - Redis-based distributed locks - Automatic timeout and expiry - Lock observability and debugging - [ ] **Agent Pool Management**: Dynamic worker lifecycle ```typescript class AgentPool { async spawn(count: number): Promise<WorkerAgent[]> async scale(targetCount: number): Promise<void> async healthCheck(): Promise<PoolHealth> async metrics(): Promise<PoolMetrics> } ``` - [ ] **Performance Monitoring**: Agent-specific observability - Context size tracking per agent - Task completion times - Lock contention metrics - Retry rates and patterns **Success Criteria:** - Support 10+ concurrent workers - <1% lock conflict rate - <50ms P99 task claim latency --- ## πŸ”’ Concurrency Control Design ### Problem: Race Conditions **Scenario:** ``` Agent A Agent B ↓ ↓ Read: todo-5 (pending) Read: todo-5 (pending) ↓ ↓ Update: in_progress Update: in_progress ← RACE CONDITION ↓ ↓ Both work on same task ← WASTED WORK + CONFLICTS ``` ### Solution 1: Optimistic Locking (v3.0) **Approach:** Version-based conflict detection ```typescript interface Todo { id: string; status: TodoStatus; version: number; // ← Added field lockedBy?: string; lockedAt?: Date; } async function claimTask(taskId: string, agentId: string): Promise<boolean> { const task = await getTodo(taskId); try { await updateTodo({ id: taskId, status: 'in_progress', lockedBy: agentId, lockedAt: new Date(), version: task.version + 1, expectedVersion: task.version // ← Check this matches }); return true; } catch (VersionConflictError) { // Another agent claimed task - try different task return false; } } ``` **Benefits:** - No deadlocks (optimistic) - Automatic retry on conflict - Simple to implement **Limitations:** - High contention = many retries - Not suitable for >10 concurrent workers ### Solution 2: Pessimistic Locking (v3.1) **Approach:** Explicit lock acquisition ```typescript async function acquireLock(taskId: string, agentId: string): Promise<Lock | null> { const lock = await redis.set( `lock:${taskId}`, agentId, { NX: true, // Only set if not exists EX: 300 // Expire after 5 minutes } ); if (!lock) return null; // Another agent holds lock return { taskId, agentId, expiresAt: Date.now() + 300000 }; } async function releaseLock(taskId: string, agentId: string): Promise<void> { const currentHolder = await redis.get(`lock:${taskId}`); if (currentHolder === agentId) { await redis.del(`lock:${taskId}`); } } ``` **Benefits:** - Explicit lock visibility - Automatic timeout/expiry - Scales to 100+ workers **Complexity:** - Requires Redis or similar - Deadlock risk if not careful - Need lock monitoring ### Solution 3: Task Queue (v3.2+) **Approach:** FIFO queue with atomic dequeue ```typescript async function enqueueTask(task: Todo): Promise<void> { await queue.push('pending-tasks', task); } async function dequeueTask(agentId: string): Promise<Todo | null> { // Atomic operation - guaranteed unique const task = await queue.popAtomic('pending-tasks'); if (task) { await updateTodo({ id: task.id, status: 'in_progress', lockedBy: agentId }); } return task; } ``` **Benefits:** - Zero contention (atomic) - Natural FIFO ordering - Scales infinitely **Tradeoffs:** - Less flexible (can't choose specific task) - Requires queue infrastructure - Harder to debug --- ## πŸ“Š Validation Plan ### Proof of Concept (Week 1-2) **Scenario:** "Implement user authentication system" **Setup:** 1. PM agent creates 5 subtasks in graph 2. 3 worker agents pull tasks in parallel 3. QC agent validates each completion **Measurements:** - Task conflict rate (target: 0%) - Worker retry rate (target: <20%) - PM context growth (target: 0%) - Total completion time vs. single-agent baseline **Success Criteria:** - Zero task conflicts - Workers complete with <10% retry rate - PM context remains stable during worker execution ### Benchmark (Week 3-4) **Comparison:** Single-agent vs. Multi-agent on same project **Test Cases:** 1. Small project (5 tasks, 10 files) 2. Medium project (20 tasks, 50 files) 3. Large project (100 tasks, 200 files) **Measurements:** - Total context tokens (single vs. multi-agent) - Context deduplication rate - Task completion accuracy - Time to completion **Hypothesis:** Multi-agent reduces context by 95% vs. single-agent ### Scale Test (Week 5-6) **Scenario:** 10 workers, 100 tasks **Measurements:** - Lock contention rate - Task claim latency (P50, P99) - Worker idle time - QC throughput **Target:** - <1% lock conflicts - <50ms P99 claim latency - <5% worker idle time --- ## πŸš€ Getting Started ### For Developers **1. Enable Multi-Agent Mode:** ```typescript const server = new GraphRagTodoServer({ multiAgent: { enabled: true, lockStrategy: 'optimistic', maxWorkers: 3 } }); ``` **2. Spawn PM Agent:** ```typescript const pm = new PMAgent(); await pm.research("Build authentication system"); await pm.createTaskGraph(); ``` **3. Spawn Worker Agents:** ```typescript const workers = await AgentPool.spawn(3); await Promise.all(workers.map(w => w.executeAvailableTasks())); ``` **4. Spawn QC Agent:** ```typescript const qc = new QCAgent(); await qc.verifyCompletedTasks(); ``` ### For AI Agents **See:** [AGENTS.md](../AGENTS.md) - Multi-Agent Orchestration section **Quick Start:** 1. Use `create_todo` to build task graph (PM role) 2. Use `lock_todo` before claiming task (Worker role) 3. Use `memory_get_subgraph` for verification (QC role) --- ## πŸŽ“ Research References [^1]: Liu et al. (2023) - "Lost in the Middle: How Language Models Use Long Contexts" [^2]: Anthropic (2024) - "Introducing Contextual Retrieval" (49-67% improvement) [^3]: iKala AI (2025) - "Context Engineering: Graph-RAG Techniques" [^4]: HippoRAG (2024) - "Neurobiologically Inspired Long-Term Memory" **Full analysis:** [GRAPH_RAG_RESEARCH.md](./GRAPH_RAG_RESEARCH.md) --- ## πŸ“ Change Log **2025-10-13:** Initial architecture proposal (v3.0) **2025-10-15:** Context isolation implemented (v3.1) **2025-10-18:** QC verification and retry logic implemented (v3.1) **2025-10-22:** Deliverable-focused QC, evidence-based workers, hallucination prevention (v4.0) **Status:** βœ… Production ready - all core features implemented **Key v4.0 Changes:** - QC now evaluates deliverable quality (not process metrics) - Workers must provide evidence-based output with tool quotes - NO truncation of QC feedback (complete guidance for workers) - Hallucination prevention through evidence requirements - 100% task success rate achieved in testing --- **Document maintained by:** Mimir Development Team **Next review:** After production deployment feedback

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/orneryd/Mimir'

If you have feedback or need assistance with the MCP directory API, please join our Discord server