Cross-Loop Learning

Pattern sharing and knowledge transfer across multiple agent loops.

Cross-Loop Learning Guide

Pattern sharing and knowledge transfer across multiple agent loops.

Research Foundation: REF-013 MetaGPT - 159% improvement with shared state

Issue: #269


Overview

Cross-loop learning enables agent loops to learn from each other by sharing patterns discovered during task execution. When a loop encounters an error and finds a successful fix, that error→fix pattern is stored in a shared registry. Future loops encountering similar errors can automatically apply proven fixes, dramatically reducing iteration counts.

Key Benefits

BenefitImpact
Faster resolutionPatterns eliminate redundant debugging
Higher success ratesProven approaches applied automatically
Accumulated wisdomSystem gets smarter over time
Anti-pattern detectionFailed approaches are flagged and avoided

Research Basis

From REF-013 MetaGPT:

  • 159% improvement with shared state across agents
  • Publish-subscribe pattern enables decentralized knowledge sharing
  • Structured outputs from one agent become inputs for others
  • Memory persistence critical for multi-session learning

Pattern Types

1. Error Patterns

Definition: Error signature → successful fix mappings

Example:

pattern_id: "pat-error-null-check-001"
error_signature:
  error_type: "TypeError"
  error_pattern: "Cannot read property '.*' of null"
fix_approach:
  description: "Add null check before property access"
  code_template: |
    if ({{variable}} != null) {
      const value = {{variable}}.{{property}};
    }
success_rate: 0.92
usage_count: 12

When Applied: Loop encounters error matching signature

2. Success Patterns

Definition: Task category → successful approach mappings

Example:

pattern_id: "pat-success-test-generation-001"
task_category: "testing"
approach:
  description: "Test-driven generation approach"
  steps:
    - "Analyze function signature"
    - "Identify edge cases"
    - "Generate tests first"
    - "Implement to pass tests"
success_rate: 0.88
average_iterations: 2.5

When Applied: Loop starts with task matching category

3. Anti-Patterns

Definition: Approaches that consistently fail

Example:

pattern_id: "pat-anti-premature-optimization-001"
approach_description: "Optimizing before tests pass"
failure_mode: "scope_creep"
failure_rate: 0.85
better_alternative:
  description: "Complete primary task first"
  success_pattern_id: "pat-success-refactor-module-002"

When Applied: Loop attempts approach matching anti-pattern signature

4. Code Templates

Definition: Reusable code snippets from successful implementations

Example:

template_id: "tmpl-async-error-handler-001"
language: "typescript"
template_code: |
  try {
    const result = await {{async_function}}({{args}});
    return result;
  } catch (error) {
    logger.error("{{operation}} failed", error);
    throw new {{ErrorClass}}("{{message}}", { cause: error });
  }
success_rate: 0.95
usage_count: 18

When Applied: Loop generates code matching template use case


Pattern Lifecycle

1. Pattern Extraction

Trigger: Agent loop completion

Process:

1. Analyze loop history - Review all iterations

2. Identify error→fix pairs - Extract successful resolutions

3. Identify successful approaches - Note winning strategies

4. Identify failure patterns - Flag repeated dead ends

5. Check for duplicates - Merge similar patterns

6. Compute effectiveness - Calculate success rates

7. Store in registry - Add to shared patterns

8. Update metrics - Track cross-loop effectiveness

Storage:

.aiwg/ralph/shared/patterns/
├── error-patterns.json
├── success-patterns.json
├── anti-patterns.json
└── code-templates.json

Example Extraction:

Loop: ralph-fix-auth-a1b2c3d4
Iteration 2: Error "Cannot read property 'email' of null"
Iteration 3: Applied fix "Add null check for user object"
Result: Tests passed

→ Extract error pattern:
  - Error: "Cannot read property '.*' of null"
  - Fix: "Add null check before property access"
  - Success rate: 1.0 (first occurrence)
  - Source: ralph-fix-auth-a1b2c3d4

2. Pattern Injection

Trigger: Agent loop start

Process:

1. Analyze task description - Extract key terms

2. Search error patterns - Find relevant error→fix pairs

3. Search success patterns - Find approaches for task category

4. Filter by effectiveness - Min success rate 0.6

5. Sort by relevance - Highest success rate first

6. Inject top-k patterns - Add to loop context (k=5 default)

7. Track pattern usage - Log which patterns were injected

Injection Context:

## Cross-Loop Learning Context

The following patterns were learned from previous loops:

### Error Patterns (from similar tasks)
1. **TypeError: null property access** (92% success rate, used 12 times)
   - Fix: Add null checks before property access
   - Template: if (obj != null) { ... }
   - Source loops: ralph-fix-auth-a1b2c3d4, ralph-fix-validation-b2c3d4e5

2. **AssertionError: expected true got false** (85% success rate, used 8 times)
   - Fix: Check async timing - add await
   - Source loops: ralph-fix-tests-c3d4e5f6

### Success Patterns (for testing tasks)
1. **Test-driven generation** (88% success rate, avg 2.5 iterations)
   - Generate tests first, then implement
   - Typical steps: analyze signature → edge cases → happy path → errors
   - Source loops: 8 successful completions

### Anti-Patterns to Avoid
1. **Premature optimization** (85% failure rate)
   - Complete primary task before optimizing
   - Symptoms: scope creep, increasing iterations without progress

Configuration:

pattern_injection:
  top_k_patterns: 5
  min_success_rate: 0.6
  max_patterns_injected: 10
  include_anti_patterns: true

3. Pattern Evolution

Patterns improve over time through continuous use:

Success Rate Updates:

Pattern: pat-error-null-check-001
Initial: 1.0 (1/1 applications)
After 5 uses: 0.80 (4/5 applications)
After 12 uses: 0.92 (11/12 applications)

→ Pattern stabilizes around 0.92 success rate

Effectiveness Trending:

effectiveness_trend:
  - timestamp: "2026-02-01T10:00:00Z"
    success_rate_snapshot: 1.0
    sample_size: 1
  - timestamp: "2026-02-01T14:00:00Z"
    success_rate_snapshot: 0.80
    sample_size: 5
  - timestamp: "2026-02-02T15:00:00Z"
    success_rate_snapshot: 0.92
    sample_size: 12

Pattern Pruning:

Patterns are automatically pruned when:

  • Success rate < 0.5 after ≥3 uses
  • Unused for >90 days
  • Superseded by better pattern

Pruned patterns are archived, not deleted:

.aiwg/ralph/shared/archive/
├── 2026-01-patterns.json
└── 2026-02-patterns.json

Pattern Effectiveness Measurement

Metrics Tracked

MetricPurpose
`total_patterns`Size of pattern registry
`total_applications`How often patterns are used
`successful_applications`How often they help
`overall_success_rate`Average effectiveness
`loops_with_pattern_injection`Loops using patterns
`loops_without_pattern_injection`Baseline loops
`average_iterations_with`Iterations with patterns
`average_iterations_without`Iterations without patterns
`improvement_percentage`% reduction in iterations

Expected Impact

Based on REF-013 MetaGPT research:

ConditionExpected IterationsExpected Success Rate
No pattern injectionBaselineBaseline
With pattern injection-40% iterations+159% quality

Example:

Task: Fix TypeScript errors in module

Without patterns:
- Iterations: 8
- Time: 45 minutes
- Success: Partial (some errors remain)

With patterns:
- Iterations: 5 (-37.5%)
- Time: 28 minutes (-38%)
- Success: Complete (all errors fixed)
- Applied patterns:
  - pat-error-type-mismatch-003 (3 times)
  - pat-error-missing-import-007 (2 times)

Effectiveness Report

Generated after each loop completion:

## Pattern Effectiveness Report
**Loop**: ralph-fix-ts-errors-f7g8h9i0
**Task**: Fix TypeScript errors

### Patterns Injected
- pat-error-type-mismatch-003 (applied 3 times, 100% success)
- pat-error-missing-import-007 (applied 2 times, 100% success)
- pat-success-type-fixing-002 (used as guidance, effective)

### Impact
- Iterations: 5 (baseline estimate: 8)
- Time saved: ~17 minutes
- Errors fixed: 12/12 (100%)

### New Patterns Discovered
1. **pat-error-interface-mismatch-015** (new)
   - Error: "Property 'x' does not exist on type 'Y'"
   - Fix: Add property to interface definition
   - Success: 1/1 applications

### Updated Patterns
- pat-error-type-mismatch-003:
  - Usage: 15 → 18 (+3)
  - Success rate: 0.93 → 0.94 (+0.01)

Integration with Cross-Task Memory

Patterns are stored alongside cross-task memory for semantic retrieval:

.aiwg/ralph/memory/
├── task-index.json           # Semantic index of all tasks
├── embeddings/               # Task embeddings for similarity
├── reflections/              # Reflexion-style reflections
└── patterns/
    ├── error-patterns.json
    ├── success-patterns.json
    ├── anti-patterns.json
    └── code-templates.json

Semantic Pattern Retrieval

When starting a loop, patterns are retrieved using:

1. Task embedding similarity - Find tasks similar to current task

2. Error signature matching - Find patterns for expected error types

3. Category matching - Find patterns for task category (testing, refactoring, etc.)

Example:

Current task: "Add authentication to user module"

Semantic retrieval:
1. Similar tasks:
   - "Implement auth for admin panel" (similarity: 0.87)
   - "Add login validation" (similarity: 0.82)

2. Retrieved patterns:
   - pat-success-auth-implementation-004 (from similar task)
   - pat-error-jwt-validation-009 (common in auth tasks)
   - tmpl-password-hashing-003 (code template)

3. Injected into context with relevance scores

CLI Usage

List Patterns

# List all patterns
aiwg ralph-patterns list

# Filter by type
aiwg ralph-patterns list --type error
aiwg ralph-patterns list --type success
aiwg ralph-patterns list --type anti

# Filter by success rate
aiwg ralph-patterns list --min-success-rate 0.8

# Filter by tags
aiwg ralph-patterns list --tag typescript --tag null-safety

Output:

Error Patterns (12 total):
1. pat-error-null-check-001 (92% success, 12 uses)
   TypeError: Cannot read property of null
   → Add null check before access

2. pat-error-type-mismatch-003 (94% success, 18 uses)
   TypeError: Type 'X' not assignable to 'Y'
   → Update interface definition or cast

Success Patterns (8 total):
1. pat-success-test-generation-001 (88% success, avg 2.5 iter)
   Task: Testing
   → Test-driven generation approach

Anti-Patterns (4 total):
1. pat-anti-premature-optimization-001 (85% failure)
   Optimizing before tests pass
   → Complete primary task first

Show Pattern Details

aiwg ralph-patterns show pat-error-null-check-001

Output:

Pattern: pat-error-null-check-001
Type: Error Pattern
Created: 2026-02-01T10:00:00Z
Last Used: 2026-02-02T15:00:00Z

Error Signature:
  Type: TypeError
  Pattern: "Cannot read property '.*' of null"
  Common Locations:
    - *.ts:validateInput
    - *.ts:processData

Fix Approach:
  Description: Add null check before property access
  Category: add_null_check
  Template: |
    if ({{variable}} != null) {
      const value = {{variable}}.{{property}};
    }

Effectiveness:
  Success Rate: 92% (11/12 applications)
  Usage Count: 12
  Average Impact: -2.3 iterations

Source Loops:
  - ralph-fix-auth-a1b2c3d4 (2026-02-01)
  - ralph-fix-validation-b2c3d4e5 (2026-02-02)
  - [+ 10 more]

Tags: typescript, null-safety, defensive-programming

Prune Patterns

# Dry run to see what would be pruned
aiwg ralph-patterns prune --dry-run

# Prune patterns below threshold
aiwg ralph-patterns prune --min-success-rate 0.6

# Prune patterns unused for 90 days
aiwg ralph-patterns prune --max-age-days 90

Export/Import Patterns

# Export all patterns
aiwg ralph-patterns export --output patterns-backup.json

# Import patterns from file
aiwg ralph-patterns import --input patterns-backup.json

# Share patterns across teams
aiwg ralph-patterns export --team-shared patterns-team.json

Configuration

Pattern Extraction Config

# In aiwg.yml or .aiwg/config.yml
ralph:
  cross_loop_learning:
    enabled: true
    extraction:
      min_success_rate_threshold: 0.6
      min_usage_count_for_evaluation: 3
      auto_extract_on_completion: true
      extract_code_templates: true

Pattern Injection Config

ralph:
  cross_loop_learning:
    injection:
      enabled: true
      top_k_patterns: 5
      min_success_rate: 0.6
      max_patterns_injected: 10
      include_error_patterns: true
      include_success_patterns: true
      include_anti_patterns: true
      include_code_templates: true

Pruning Config

ralph:
  cross_loop_learning:
    pruning:
      auto_prune: true
      prune_interval_days: 7
      min_success_rate: 0.5
      max_age_days: 90
      archive_instead_of_delete: true

Best Practices

1. Let Patterns Stabilize

Don't prune patterns too early. Allow at least 5-10 uses before evaluating effectiveness.

Good:

Pattern with 1 use at 100%: Keep, needs more data
Pattern with 10 uses at 45%: Consider pruning

2. Tag Patterns Thoughtfully

Use consistent, searchable tags:

Good tags:

  • Language: `typescript`, `python`, `go`
  • Domain: `auth`, `validation`, `testing`
  • Pattern type: `null-safety`, `async-handling`, `error-recovery`

Poor tags:

  • Too vague: `good`, `important`, `common`
  • Too specific: `fixed-in-ralph-loop-123`

3. Update Templates with Context

When creating code templates, include usage notes:

template_id: "tmpl-async-error-handler-001"
template_code: |
  try {
    const result = await {{async_function}}({{args}});
    return result;
  } catch (error) {
    logger.error("{{operation}} failed", error);
    throw new {{ErrorClass}}("{{message}}", { cause: error });
  }
use_case: "Wrapping async operations with proper error handling"
placeholders:
  async_function: "The async function to call"
  args: "Arguments to pass"
  operation: "Human-readable operation name for logging"
  ErrorClass: "Custom error class (e.g., ValidationError)"
  message: "User-facing error message"

4. Monitor Anti-Pattern Growth

If anti-patterns accumulate, it indicates systematic issues:

Warning signs:

  • Same anti-pattern occurring in multiple loops
  • Anti-patterns with high occurrence counts
  • Patterns with very high failure rates (>90%)

Action: Investigate root cause and update documentation/training.

5. Export Patterns Periodically

Patterns are valuable knowledge - back them up:

# Weekly backup
aiwg ralph-patterns export --output backups/patterns-$(date +%Y-%m-%d).json

# Team sharing
aiwg ralph-patterns export --team-shared team-patterns.json

Troubleshooting

Pattern Not Injected

Symptom: Loop doesn't receive relevant patterns

Causes:

1. Pattern below success rate threshold (default 0.6)

2. Task description doesn't match pattern semantically

3. Pattern injection disabled in config

4. Pattern recently pruned

Fix:

# Check pattern details
aiwg ralph-patterns show {pattern_id}

# Lower threshold temporarily
aiwg ralph "task" --min-pattern-success-rate 0.5

# Re-enable injection
# In aiwg.yml:
ralph:
  cross_loop_learning:
    injection:
      enabled: true

Pattern Over-Application

Symptom: Same pattern applied too often, causing repetitive fixes

Causes:

1. Pattern too broad (matches many scenarios)

2. Success rate artificially high from small sample

3. Loop not detecting when pattern doesn't apply

Fix:

  • Refine pattern signature to be more specific
  • Increase min usage count before trusting pattern
  • Add preconditions to pattern

Patterns Not Extracting

Symptom: Loops complete but no new patterns added

Causes:

1. Auto-extraction disabled

2. Loop didn't succeed (patterns only extracted from successful loops)

3. Patterns duplicate existing ones

Fix:

# Enable auto-extraction
ralph:
  cross_loop_learning:
    extraction:
      auto_extract_on_completion: true

# Check loop outcome
aiwg ralph-status {loop_id}

Examples

Example 1: Error Pattern Prevents Re-Work

Scenario: Two loops fixing similar TypeScript errors

Loop 1 (without pattern):

ralph-fix-types-a1b2c3d4
Iteration 1: Error "Type 'string | undefined' not assignable to 'string'"
Iteration 2: Applied fix "Added ? operator to interface"
Iteration 3: Tests pass
Result: Success, 3 iterations

→ Pattern extracted:
   pat-error-optional-types-008
   Error: "Type 'X | undefined' not assignable to 'X'"
   Fix: "Add ? to interface property or use non-null assertion"

Loop 2 (with pattern):

ralph-fix-types-b2c3d4e5
Iteration 1: Error "Type 'number | undefined' not assignable to 'number'"
→ Pattern matched: pat-error-optional-types-008
→ Auto-applied fix: "Add ? to interface property"
Iteration 2: Tests pass
Result: Success, 2 iterations (33% faster)

Example 2: Success Pattern Guides Approach

Scenario: Test generation task

Loop (with success pattern):

ralph-add-tests-c3d4e5f6

Injected pattern: pat-success-test-generation-001
  - Approach: Test-driven (generate tests first)
  - Avg iterations: 2.5
  - Success rate: 88%

Iteration 1: Generate test cases for validateEmail()
  - Happy path: valid email formats
  - Error cases: invalid formats, null, undefined
  Tests written, currently failing (expected)

Iteration 2: Implement validateEmail() to pass tests
  Tests pass: 8/8
Result: Success, 2 iterations (aligned with pattern average)

Example 3: Anti-Pattern Avoided

Scenario: Refactoring task

Loop (with anti-pattern warning):

ralph-refactor-auth-d4e5f6a7

Injected anti-pattern: pat-anti-premature-optimization-001
  Warning: Avoid optimizing before tests pass
  Better alternative: pat-success-refactor-module-002

Iteration 1: Refactor auth module structure
Iteration 2: Tests pass
→ Check: Should I optimize now?
→ Anti-pattern reminder: Complete primary task first
→ Decision: Mark complete, optimization not requested

Result: Success, 2 iterations (anti-pattern prevented scope creep)

  • `/ralph` - Main agent loop command
  • `@$AIWG_ROOT/agentic/code/addons/ralph/schemas/shared-patterns.yaml` - Pattern schema
  • `@$AIWG_ROOT/agentic/code/addons/ralph/schemas/cross-task-memory.yaml` - Cross-task memory
  • `@$AIWG_ROOT/agentic/code/addons/ralph/docs/best-practices.md` - General Al best practices
  • `.aiwg/research/paper-analysis/REF-013-aiwg-analysis.md` - MetaGPT research analysis

Research Foundation

REF-013 MetaGPT: Meta Programming for Multi-Agent Collaborative Framework

Key findings applied:

  • Publish-subscribe pattern for shared state
  • 159% improvement with structured shared outputs
  • Role specialization with shared memory
  • Debug memory persistence across sessions

Implementation:

  • Patterns = structured outputs from completed loops
  • Registry = publish-subscribe message broker
  • Pattern injection = subscription to relevant patterns
  • Effectiveness tracking = measuring improvement over baseline