How to Implement Persistent Memory with Proper Storage Architectures in Neural Field Systems

Implement persistent memory by modeling information as stable attractors in a continuous neural field, where resonance-protected basins adaptively resist decay and serialize to JSON or key-value backends for cross-session durability.

The davidkimai/context-engineering repository demonstrates how to implement persistent memory with proper storage architectures by treating memory not as discrete tokens, but as dynamic patterns inside a continuous semantic space. In this framework, important concepts form attractor basins that naturally persist across interactions, protected from decay through resonance and reinforced through repeated activation. The architecture combines in-memory neural fields with pluggable storage backends to enable long-term context survival beyond single conversations or process lifetimes.

Architectural Blueprint for Persistent Memory

The system organizes persistence into five distinct layers, each handling specific responsibilities from pattern activation to cross-session storage.

The Semantic Field Layer

At the core lies the semantic field, a continuous state representation (self.state) mapping pattern keys to activation strengths. According to the reference implementation in 00_foundations/09_persistence_and_resonance.md (lines 463‑466), this layer stores patterns as hashed embeddings with associated strength values that naturally decay over time unless reinforced.

The Attractor Bank

Stable memory formations reside in the attractor bank (self.attractors), which captures high-strength patterns that exceed the attractor_formation_threshold. When a pattern's cumulative strength crosses this threshold (default 0.7), the _form_attractor method (lines 511‑518) converts it into a protected basin immune to standard decay rates.

Resonance and Decay Dynamics

The resonance engine calculates pair-wise similarity between active patterns and stored attractors using _calculate_resonance (lines 560‑564). This drives two critical mechanisms:

  • Attraction: New patterns blend toward existing attractors when resonance exceeds 0.2
  • Decay modulation: The decay scheduler reduces pattern strengths by decay_rate, but discounts decay proportionally to resonance with attractors (lines 440‑447), ensuring frequently-referenced concepts linger while noise fades

Reinforcement Pathways

Explicit connections between attractors enable activation spreading. The scaffold_persistence helper (lines 70‑79) builds these pathways during field initialization, allowing related concepts to strengthen each other through field.connect_attractors.

Persistence Protocol Interface

The high-level /context.memory.persistence.attractor.shell (defined in 60_protocols/shells/context.memory.persistence.attractor.shell.md) orchestrates the entire workflow, handling attractor creation, adaptive decay, importance assessment, and field integration through a declarative command structure.

Storage Architecture Decisions

While the neural field operates in memory for speed, implementing persistent memory with proper storage architectures requires strategic serialization choices:

  1. In-Memory Representation: The field uses Python dictionaries for self.state and self.attractors, enabling O(1) lookups and updates during active sessions.

  2. JSON Serialization: The structure trivially maps to JSON via json.dump(self.state), storing pattern keys, strength values, attractor flags, and metadata (creation time, version) as plain text.

  3. Incremental Checkpointing: After each interaction cycle, the updated field serializes to disk, ensuring attractor strengths survive process restarts. The protocol includes a meta.version field (line 56) to track schema evolution.

  4. Scalable Backends: For production deployments, the same schema ports to key-value stores (Redis, LMDB) or document databases (MongoDB), where each pattern key maps to its strength and resonance metadata.

  5. Attractor-First Storage: Rather than storing raw interaction logs, the system persists only stable attractors and their connection graphs, compressing memory representation by orders of magnitude compared to token-level storage.

Core Implementation: PersistentNeuralField

The PersistentNeuralField class (reference implementation lines 447‑507) materializes the architecture through four configurable levers:

class PersistentNeuralField:
    def __init__(self,
                 decay_rate=0.05,
                 boundary_permeability=0.8,
                 resonance_bandwidth=0.6,
                 attractor_formation_threshold=0.7):
        self.state = {}          # pattern → strength

        self.attractors = {}     # id → {pattern, strength, metadata}

        self.history = []        # chronological activation log

        self.decay_rate = decay_rate
        self.boundary_permeability = boundary_permeability
        self.resonance_bandwidth = resonance_bandwidth
        self.attractor_threshold = attractor_formation_threshold

Injecting Patterns with Boundary Permeability

The inject method processes new information through boundary filtering and resonance checks:

def inject(self, pattern, strength=1.0):
    # Boundary filter limits raw input strength

    effective_strength = strength * self.boundary_permeability
    
    # Resonance with existing attractors may pull pattern toward stable basin

    for aid, a in self.attractors.items():
        r = self._calculate_resonance(pattern, a['pattern'])
        if r > 0.2:
            pattern = self._blend_patterns(pattern, a['pattern'], 
                                           blend_ratio=r * 0.3)
            self.attractors[aid]['strength'] += r * 0.1
    
    # Update field state and check for attractor formation

    self.state[pattern] = self.state.get(pattern, 0) + effective_strength
    if self.state[pattern] > self.attractor_threshold:
        self._form_attractor(pattern)
    
    self._process_resonance(pattern)
    return self

Key behaviors include pattern blending toward existing attractors when resonance exceeds 0.2, and automatic attractor creation when cumulative strength crosses the threshold.

Adaptive Decay and Attractor Protection

The decay method implements selective forgetting through resonance-modulated reduction:

def decay(self):
    for pattern, strength in list(self.state.items()):
        # Calculate protection from resonance with attractors

        protect = sum(self._calculate_resonance(pattern, a['pattern']) * 0.5
                     for a in self.attractors.values())
        effective_decay = self.decay_rate * (1 - protect)
        self.state[pattern] *= (1 - effective_decay)
    
    # Gentle decay for attractors themselves

    for aid in self.attractors:
        self.attractors[aid]['strength'] *= (1 - self.decay_rate * 0.2)
    
    # Prune weak patterns

    self.state = {k: v for k, v in self.state.items() if v > 0.01}
    self.attractors = {k: v for k, v in self.attractors.items() 
                      if v['strength'] > 0.1}
    return self

Resonance with attractors reduces effective decay, mimicking biological memory consolidation where frequently-activated concepts persist longer.

Orchestrating Persistence with the Attractor Protocol

The /context.memory.persistence.attractor.shell provides a declarative interface that wraps field operations into a unified workflow:

/context.memory.persistence.attractor {
  intent: "Enable long-term persistence of context",
  input: {
    current_field_state: <field>,
    memory_field_state: <memory>,
    new_information: "User project deadline is March 15th",
    importance_signals: { explicit: 0.9, repetition: 0.8 },
    persistence_parameters: { decay_rate: 0.04, attractor_threshold: 0.75 }
  },
  process: [
    "/memory.attract{threshold=0.4, strength_factor=1.2}",
    "/memory.decay{rate='adaptive', minimum_strength=0.2}",
    "/importance.assess{signals='multi_factor', context_aware=true}",
    "/attractor.form{from='important_information', method='resonance_basin'}",
    "/attractor.strengthen{target='persistent_memory', consolidation=true}",
    "/connection.create{between='related_attractors', strength_threshold=0.5}",
    "/field.integrate{source='memory_field', target='current_field', harmony=0.7}"
  ],
  output: {
    updated_field_state: <new_field>,
    persistent_attractors: <list>,
    memory_metrics: <stats>
  }
}

The protocol internally invokes memory_attract, memory_decay, importance_assess, and scaffold_persistence (lines 8‑90), handling the complexity of resonance calculations and attractor management automatically.

Practical Implementation Examples

Example 1: Building a Persistent Chatbot Memory

Initialize a field and simulate conversation turns with automatic attractor formation:

from persistent_field import PersistentNeuralField

# Initialize with custom thresholds

mem_field = PersistentNeuralField(
    decay_rate=0.03,
    attractor_formation_threshold=0.6
)

# First turn: inject critical information

mem_field.inject("Conference deadline is March 15th, 2026", strength=1.2)
mem_field.decay()

# Second turn: add related context

mem_field.inject("Need to prepare slides for the conference", strength=0.9)
mem_field.decay()

# The conference fact persists as an attractor due to high initial strength

print(mem_field.attractors)  # Contains the deadline information

After several turns, the conference deadline remains accessible because its cumulative strength exceeded 0.6, triggering attractor formation that protects it from the 0.03 decay rate.

Example 2: Integrating the Protocol Pipeline

Wrap the shell protocol into your application logic for declarative memory management:

def run_persistence_step(current_field, memory_field, new_info):
    payload = {
        "current_field_state": current_field,
        "memory_field_state": memory_field,
        "new_information": new_info,
        "interaction_context": "project-planning",
        "importance_signals": {"explicit": 0.9},
        "persistence_parameters": {
            "decay_rate": 0.03,
            "attractor_threshold": 0.8
        }
    }
    # Dispatch to protocol engine

    result = context_memory_persistence_attractor_shell(payload)
    return result["updated_memory_field"], result["persistent_attractors"]

This approach delegates resonance calculations, importance assessment, and field integration to the protocol implementation defined in 60_protocols/shells/context.memory.persistence.attractor.shell.md.

Example 3: Cross-Session Persistence with JSON Serialization

Implement checkpointing to survive process restarts:

import json
import pathlib

def checkpoint_field(field, path="memory_snapshot.json"):
    """Serialize field state to JSON for persistence across sessions."""
    data = {
        "state": field.state,
        "attractors": field.attractors,
        "history": field.history,
        "meta": {"version": "1.0", "schema": "neural_field_v1"}
    }
    pathlib.Path(path).write_text(json.dumps(data, indent=2))

def restore_field(path="memory_snapshot.json"):
    """Restore field from JSON checkpoint."""
    raw = json.loads(pathlib.Path(path).read_text())
    field = PersistentNeuralField()
    field.state = raw["state"]
    field.attractors = raw["attractors"]
    field.history = raw["history"]
    return field

# Save after conversation

checkpoint_field(mem_field)

# Restore in new process

mem_field = restore_field()

The plain dictionary structure maps cleanly to JSON, enabling trivial persistence without custom serializers. For production, replace the JSON files with Redis HSET operations or MongoDB documents using the same schema.

Summary

  • Attractor-centric design replaces token-level storage with semantic basins that naturally survive context windows through resonance protection.
  • Adaptive decay modulation ensures important concepts linger while noise fades, driven by the _calculate_resonance mechanism in the PersistentNeuralField class.
  • Storage flexibility allows the in-memory field to serialize to JSON for simple checkpointing or migrate to key-value/document stores for scalable production deployments.
  • Declarative protocol interface via /context.memory.persistence.attractor.shell provides a reusable pipeline for attractor creation, decay management, and field integration.
  • Cross-session durability is achieved through incremental checkpointing after each interaction cycle, preserving attractor strengths across process restarts.

Frequently Asked Questions

What is an attractor in the context of persistent memory?

An attractor is a stable basin formed in the neural field when a pattern's activation strength exceeds the attractor_formation_threshold (default 0.7). Once formed, the pattern receives protection from standard decay through resonance calculations, effectively becoming a long-term memory anchor that persists across multiple interaction cycles. According to the source code in 00_foundations/09_persistence_and_resonance.md, attractors form automatically when self.state[pattern] > self.attractor_threshold, transitioning from volatile short-term activation to stable long-term storage.

How does the resonance mechanism protect memories from decay?

The _calculate_resonance method computes similarity between active patterns and stored attractors. During the decay() cycle, patterns exhibiting high resonance with attractors receive decay discounts proportional to their resonance strength. Specifically, the code calculates protect = sum(resonance * 0.5) and applies effective_decay = decay_rate * (1 - protect), meaning patterns resonating strongly with attractors decay slower. This mimics biological consolidation where frequently-referenced memories strengthen while isolated patterns fade.

Can this architecture scale to production databases?

Yes. While the reference implementation uses Python dictionaries for speed, the PersistentNeuralField structure trivially maps to production storage systems. The state dictionaries can serialize to Redis as hash maps (pattern key → strength), MongoDB as documents containing pattern metadata and resonance history, or LMDB for embedded high-performance key-value storage. The protocol's meta.version field supports schema migrations as the architecture evolves.

What is the difference between the neural field and traditional vector databases?

Traditional vector databases store static embeddings with similarity search, while the neural field implements a dynamic continuous space where patterns actively decay, resonate, and converge toward attractors. The field maintains temporal state (self.history) and adaptive strength modulation, whereas vector databases treat stored embeddings as immutable. The attractor architecture enables emergent memory behaviors—such as pattern blending and resonance-based protection—that static vector storage cannot replicate without additional application logic.

Have a question about this repo?

These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:

Share the following with your agent to get started:
curl -s "https://instagit.com/install.md"

Works with
Claude Codex Cursor VS Code OpenClaw Any MCP Client

Maintain an open-source project? Get it listed too →