| # Pattern Memory Evolution |
|
|
| The Pattern Memory Moat is a system for capturing, storing, and sharing code patterns across teams. It transforms individual learning into collective intelligence. |
|
|
| ## Table of Contents |
|
|
| 1. [Auto-Extraction](#auto-extraction) |
| 2. [Team Sync](#team-sync) |
| 3. [Weight Fusion](#weight-fusion) |
| 4. [API Reference](#api-reference) |
|
|
| --- |
|
|
| ## Auto-Extraction |
|
|
| Extract patterns automatically from your Git history. The system analyzes commit messages, identifies bug fixes and features, and stores the before/after code changes. |
|
|
| ### How It Works |
|
|
| The `extract_patterns_from_git.py` script: |
|
|
| 1. **Scans Git History**: Reads through commit messages and diffs |
| 2. **Identifies Patterns**: Uses keywords to classify commits as bug fixes or features |
| 3. **Extracts Context**: Captures before/after code with metadata |
| 4. **Stores in JSONL**: Outputs structured data suitable for training |
|
|
| ### Usage |
|
|
| ```bash |
| # Extract patterns from all commits |
| python scripts/extract_patterns_from_git.py \ |
| --repo-path /path/to/repo \ |
| --output patterns.jsonl |
| |
| # Only recent commits |
| python scripts/extract_patterns_from_git.py \ |
| --repo-path /path/to/repo \ |
| --output patterns.jsonl \ |
| --since-date "2024-01-01" |
| ``` |
|
|
| ### Output Format |
|
|
| Each line in the JSONL output: |
|
|
| ```json |
| { |
| "pattern_id": "a1b2c3d4e5f6g7h8", |
| "problem_type": "bug_fix", |
| "before_code": "def buggy_function():\n return None + 1", |
| "after_code": "def fixed_function():\n return 1", |
| "commit_msg": "fix: handle None case in function", |
| "author": "developer@example.com", |
| "date": "2024-03-15 10:30:00", |
| "confidence": 0.85 |
| } |
| ``` |
|
|
| ### Problem Types |
|
|
| - `bug_fix`: Commits that resolve issues (keywords: fix, bug, hotfix, patch, resolve) |
| - `feature_addition`: Commits that add new functionality (keywords: feat, add, implement, enhance) |
| - `unknown`: Other commits (typically skipped) |
|
|
| ### Confidence Scoring |
|
|
| The confidence score (0.0-1.0) reflects pattern quality: |
|
|
| - Base: 0.5 |
| - +0.2 for clear bug fix keywords |
| - +0.15 for clear feature keywords |
| - +0.15 for having both before and after code |
| - +0.1 for substantial changes (>100 chars) |
| - +0.1 for large changes (>500 chars) |
|
|
| --- |
|
|
| ## Team Sync |
|
|
| Share and sync patterns across your team using a shared PostgreSQL database. |
|
|
| ### PostgreSQL Schema |
|
|
| ```sql |
| CREATE TABLE patterns ( |
| id UUID PRIMARY KEY DEFAULT gen_random_uuid(), |
| problem_type VARCHAR(50) NOT NULL, |
| solution_hash VARCHAR(64) NOT NULL, |
| code_before TEXT NOT NULL, |
| code_after TEXT NOT NULL, |
| success_count INTEGER DEFAULT 0, |
| last_used TIMESTAMP, |
| created_by VARCHAR(255) NOT NULL, |
| created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, |
| |
| -- Indexes |
| CONSTRAINT unique_solution UNIQUE (solution_hash), |
| INDEX idx_problem_type (problem_type), |
| INDEX idx_success_count (success_count DESC) |
| ); |
| |
| CREATE TABLE pattern_feedback ( |
| id UUID PRIMARY KEY DEFAULT gen_random_uuid(), |
| pattern_id UUID REFERENCES patterns(id), |
| user_id VARCHAR(255) NOT NULL, |
| helpful BOOLEAN NOT NULL, |
| created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP |
| ); |
| |
| CREATE TABLE adapter_versions ( |
| id UUID PRIMARY KEY DEFAULT gen_random_uuid(), |
| version_name VARCHAR(100) NOT NULL, |
| adapter_path VARCHAR(500) NOT NULL, |
| created_by VARCHAR(255) NOT NULL, |
| created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, |
| is_active BOOLEAN DEFAULT FALSE |
| ); |
| ``` |
|
|
| ### FastAPI Endpoints |
|
|
| #### GET /patterns |
|
|
| List patterns with filtering and pagination. |
|
|
| ```bash |
| curl -H "X-API-Key: your-api-key" \ |
| "http://localhost:8000/patterns?problem_type=bug_fix&limit=20" |
| ``` |
|
|
| Response: |
| ```json |
| { |
| "patterns": [...], |
| "total": 150, |
| "page": 1, |
| "per_page": 20 |
| } |
| ``` |
|
|
| #### POST /patterns |
|
|
| Add a new pattern. |
|
|
| ```bash |
| curl -X POST -H "X-API-Key: your-api-key" \ |
| -H "Content-Type: application/json" \ |
| -d '{"problem_type": "bug_fix", "code_before": "...", "code_after": "..."}' \ |
| "http://localhost:8000/patterns" |
| ``` |
|
|
| #### POST /patterns/{id}/feedback |
|
|
| Submit feedback on a pattern. |
|
|
| ```bash |
| curl -X POST -H "X-API-Key: your-api-key" \ |
| -H "Content-Type: application/json" \ |
| -d '{"helpful": true}' \ |
| "http://localhost:8000/patterns/123e4567-e89b-12d3-a456-426614174000/feedback" |
| ``` |
|
|
| ### Authentication |
|
|
| API key authentication via `X-API-Key` header: |
|
|
| ```python |
| # Server-side middleware |
| async def verify_api_key(request: Request, call_next): |
| api_key = request.headers.get("X-API-Key") |
| if not api_key or api_key != settings.API_KEY: |
| raise HTTPException(status_code=401, detail="Invalid API key") |
| return await call_next(request) |
| ``` |
|
|
| ### Conflict Resolution |
|
|
| When multiple team members contribute similar patterns: |
|
|
| 1. **Pattern Similarity Detection**: Hash-based deduplication |
| 2. **Merge Strategy**: Patterns with similar `solution_hash` are merged |
| 3. **Success Rate Tracking**: `success_count` increases with positive feedback |
| 4. **Priority**: Patterns with higher `success_count` rank higher in queries |
|
|
| --- |
|
|
| ## Weight Fusion |
|
|
| Combine LoRA adapters from multiple users using weighted averaging based on success rates. |
|
|
| ### Algorithm |
|
|
| ``` |
| merged_weight = Σ(adapter_i.weight * adapter_i.success_rate) / Σ(success_rate) |
| ``` |
|
|
| This ensures adapters that have shown better results contribute more to the final merged adapter. |
|
|
| ### Merge Script Usage |
|
|
| ```bash |
| # Basic merge with manual weights |
| python scripts/merge_lora_adapters.py \ |
| --adapters user1_adapter.safetensors user2_adapter.safetensors \ |
| --weights 0.6 0.4 \ |
| --output merged_adapter.safetensors |
| |
| # Merge using success rates (auto-computes proportional weights) |
| python scripts/merge_lora_adapters.py \ |
| --adapters alice_adapter.safetensors bob_adapter.safetensors \ |
| --success-rates 0.85 0.65 \ |
| --output team_adapter.safetensors |
| |
| # Equal weights (default) |
| python scripts/merge_lora_adapters.py \ |
| --adapters adapter1.safetensors adapter2.safetensors \ |
| --output merged.safetensors |
| ``` |
|
|
| ### Versioning |
|
|
| Each merge creates a version record: |
|
|
| ```json |
| { |
| "version_name": "v2.1-team-merge", |
| "adapter_path": "/adapters/merged_v2.1.safetensors", |
| "created_by": "alice@example.com", |
| "created_at": "2024-03-15T10:30:00Z", |
| "parent_versions": ["v2.0", "user-alice-v3", "user-bob-v2"] |
| } |
| ``` |
|
|
| ### Rollback |
|
|
| To revert to a previous merged adapter: |
|
|
| ```bash |
| # List available versions |
| ls -la adapters/versions/ |
| |
| # Restore previous version |
| cp adapters/versions/v2.0.safetensors adapters/merged.safetensors |
| ``` |
|
|
| Or via API: |
|
|
| ```bash |
| curl -X POST -H "X-API-Key: your-api-key" \ |
| -d '{"version_id": "123e4567-e89b-12d3-a456-426614174000"}' \ |
| "http://localhost:8000/adapters/rollback" |
| ``` |
|
|
| --- |
|
|
| ## API Reference |
|
|
| ### Patterns API |
|
|
| | Method | Endpoint | Description | |
| |--------|----------|-------------| |
| | GET | `/patterns` | List patterns | |
| | GET | `/patterns/{id}` | Get pattern by ID | |
| | POST | `/patterns` | Create pattern | |
| | POST | `/patterns/{id}/feedback` | Submit feedback | |
| | DELETE | `/patterns/{id}` | Delete pattern | |
|
|
| ### Adapter API |
|
|
| | Method | Endpoint | Description | |
| |--------|----------|-------------| |
| | GET | `/adapters` | List adapter versions | |
| | POST | `/adapters/merge` | Merge multiple adapters | |
| | POST | `/adapters/{id}/activate` | Set as active adapter | |
| | POST | `/adapters/rollback` | Rollback to previous version | |
|
|
| ### Health Check |
|
|
| ```bash |
| curl "http://localhost:8000/health" |
| ``` |
|
|
| Response: |
| ```json |
| { |
| "status": "healthy", |
| "version": "1.0.0", |
| "database": "connected" |
| } |
| ``` |
|
|
| --- |
|
|
| ## Example Workflow |
|
|
| ### 1. Extract Patterns from Project |
|
|
| ```bash |
| # Extract patterns from your codebase |
| python scripts/extract_patterns_from_git.py \ |
| --repo-path ./my-project \ |
| --output patterns.jsonl \ |
| --since-date "2024-01-01" |
| ``` |
|
|
| ### 2. Upload to Team Database |
|
|
| ```python |
| import requests |
| |
| with open('patterns.jsonl') as f: |
| for line in f: |
| pattern = json.loads(line) |
| requests.post( |
| "http://team-patterns.example.com/patterns", |
| headers={"X-API-Key": "your-key"}, |
| json=pattern |
| ) |
| ``` |
|
|
| ### 3. Merge Team Patterns |
|
|
| ```bash |
| # Merge adapters from team members |
| python scripts/merge_lora_adapters.py \ |
| --adapters alice_adapter.safetensors bob_adapter.safetensors carol_adapter.safetensors \ |
| --success-rates 0.90 0.75 0.85 \ |
| --output team_merged.safetensors |
| ``` |
|
|
| ### 4. Activate for Team Use |
|
|
| The merged adapter with the highest success rate becomes the new team baseline. |
|
|
| --- |
|
|
| ## Files Reference |
|
|
| | File | Description | |
| |------|-------------| |
| | `scripts/extract_patterns_from_git.py` | Git history pattern extractor | |
| | `scripts/merge_lora_adapters.py` | LoRA adapter merger | |
| | `docs/pattern-moat.md` | This documentation | |
|
|