<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Oleksander</title>
    <description>The latest articles on DEV Community by Oleksander (@teolex2020).</description>
    <link>https://dev.to/teolex2020</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3794675%2Fc037065a-cee8-43a7-ba0f-13535bb88a54.webp</url>
      <title>DEV Community: Oleksander</title>
      <link>https://dev.to/teolex2020</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/teolex2020"/>
    <language>en</language>
    <item>
      <title>AI Agents Don't Need a Bigger Prompt. They Need Governed Memory</title>
      <dc:creator>Oleksander</dc:creator>
      <pubDate>Fri, 17 Jul 2026 10:41:45 +0000</pubDate>
      <link>https://dev.to/teolex2020/ai-agents-dont-need-a-bigger-prompt-they-need-governed-memory-1pke</link>
      <guid>https://dev.to/teolex2020/ai-agents-dont-need-a-bigger-prompt-they-need-governed-memory-1pke</guid>
      <description>&lt;p&gt;Most AI agents have a memory problem disguised as a prompting problem.&lt;/p&gt;

&lt;p&gt;We keep adding conversation history to the context window, summarizing old messages, or placing documents in a vector database. These techniques are useful, but they do not answer several important questions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What should be remembered for hours, weeks, or months?&lt;/li&gt;
&lt;li&gt;What should decay when it stops being useful?&lt;/li&gt;
&lt;li&gt;Which source supports a stored claim?&lt;/li&gt;
&lt;li&gt;What happens when two memories contradict each other?&lt;/li&gt;
&lt;li&gt;Why was a particular memory returned?&lt;/li&gt;
&lt;li&gt;How do we prevent one user's memory from leaking into another user's context?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I built &lt;a href="https://github.com/teolex2020/aura-memory" rel="noopener noreferrer"&gt;Aura Memory&lt;/a&gt; to explore a different approach: memory as a governed cognitive layer that runs beside the model.&lt;/p&gt;

&lt;p&gt;The model can remain stateless. Aura owns persistence, retrieval, lifecycle, provenance, and bounded adaptation.&lt;/p&gt;

&lt;h2&gt;
  
  
  A transcript is not a memory system
&lt;/h2&gt;

&lt;p&gt;A chat transcript records what happened. A memory system decides what remains useful.&lt;/p&gt;

&lt;p&gt;That distinction matters once an agent runs longer than a single conversation. Raw history grows without bound. Summaries lose detail. Vector search can find semantically similar text, but similarity alone does not express durability, trust, contradiction, or whether a record has been superseded.&lt;/p&gt;

&lt;p&gt;For an agent to develop useful continuity, memory needs its own lifecycle:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;interaction
    ↓
store an observation, decision, outcome, or preference
    ↓
retrieve bounded context for the next task
    ↓
inspect provenance and uncertainty
    ↓
decay, promote, consolidate, correct, or archive
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is the role Aura is designed to fill.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Aura Memory is
&lt;/h2&gt;

&lt;p&gt;Aura is an open-source cognitive memory runtime with a Rust core and Python bindings. Core memory operations run locally and do not require an LLM call, an embedding API, or a cloud database.&lt;/p&gt;

&lt;p&gt;The basic interface is intentionally small:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;aura-memory
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;aura&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Aura&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Level&lt;/span&gt;

&lt;span class="n"&gt;brain&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Aura&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;./agent_memory&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;brain&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;store&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;The user always deploys to staging before production&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;level&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;Level&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Domain&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;tags&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;deployment&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;preference&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;brain&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;store&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;A staging deploy caught a migration error&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;level&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;Level&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Decisions&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;tags&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;deployment&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;outcome&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;context&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;brain&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;recall&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;How should I deploy this release?&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;token_budget&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The returned value is bounded context that can be inserted into a model prompt or used by an agent tool. Storage and retrieval are separate from model inference, so the same memory can be used with Claude, Gemini, OpenAI models, Ollama, CrewAI, LangChain, or an MCP client.&lt;/p&gt;

&lt;h2&gt;
  
  
  Memory has different timescales
&lt;/h2&gt;

&lt;p&gt;Not every record deserves permanent storage. Aura organizes records into four levels:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Level&lt;/th&gt;
&lt;th&gt;Typical role&lt;/th&gt;
&lt;th&gt;Expected timescale&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Working&lt;/td&gt;
&lt;td&gt;Temporary task context&lt;/td&gt;
&lt;td&gt;Hours&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Decisions&lt;/td&gt;
&lt;td&gt;Choices, actions, and active work&lt;/td&gt;
&lt;td&gt;Days&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Domain&lt;/td&gt;
&lt;td&gt;Project knowledge and stable preferences&lt;/td&gt;
&lt;td&gt;Weeks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Identity&lt;/td&gt;
&lt;td&gt;Durable rules and identity-level facts&lt;/td&gt;
&lt;td&gt;Months or longer&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Maintenance cycles apply decay, promotion, consolidation, and archival. Frequently useful or important records can persist; low-value working context can fade.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;report&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;brain&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run_maintenance&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is deliberately different from appending every message forever. Forgetting is part of the design, not an error condition.&lt;/p&gt;

&lt;h2&gt;
  
  
  From records to cognitive structure
&lt;/h2&gt;

&lt;p&gt;Raw records are only the first layer. Aura can build bounded cognitive overlays:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Records → Beliefs → Concepts → Causal Patterns → Policy Hints
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Records&lt;/strong&gt; preserve observations, decisions, preferences, and outcomes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Beliefs&lt;/strong&gt; group supporting and conflicting evidence.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Concepts&lt;/strong&gt; capture recurring abstractions across stable beliefs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Causal patterns&lt;/strong&gt; represent repeated cause-and-effect relationships.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Policy hints&lt;/strong&gt; surface advisory guidance such as “prefer staging first.”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The important word is &lt;em&gt;advisory&lt;/em&gt;. A policy hint does not execute an action. Cognitive reranking is bounded, inspectable, and can be disabled. The application remains responsible for deciding what the agent is allowed to do.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;brain&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;enable_full_cognitive_stack&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="n"&gt;hints&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;brain&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_surfaced_policy_hints&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This separation helps avoid a dangerous design pattern: allowing an automatically generated memory to silently become an instruction with unlimited authority.&lt;/p&gt;

&lt;h2&gt;
  
  
  Retrieval should explain itself
&lt;/h2&gt;

&lt;p&gt;When memory influences an agent answer, “the vector database returned it” is not enough of an explanation.&lt;/p&gt;

&lt;p&gt;Aura exposes inspection surfaces such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;brain&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;explain_recall&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;deployment decision&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;top_k&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;brain&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;explain_record&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;record_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;brain&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;provenance_chain&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;record_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The goal is to make memory behavior operator-visible. Applications can inspect why a record surfaced, how it was derived, whether it conflicts with other information, and whether a correction is pending.&lt;/p&gt;

&lt;p&gt;Aura also supports governed correction and bounded adaptation. Experiences can enter a reviewable pipeline rather than directly rewriting model weights or silently mutating high-trust knowledge.&lt;/p&gt;

&lt;h2&gt;
  
  
  What changed in version 1.5.6
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;1.5.6&lt;/code&gt; release focuses on a problem that becomes critical for research and production agents: a plausible claim is not the same as a verifiable claim.&lt;/p&gt;

&lt;h3&gt;
  
  
  Immutable evidence lineage
&lt;/h3&gt;

&lt;p&gt;Evidence lineage binds a claim to:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;a specific source document revision;&lt;/li&gt;
&lt;li&gt;the exact byte span used as evidence;&lt;/li&gt;
&lt;li&gt;a content hash;&lt;/li&gt;
&lt;li&gt;verification status;&lt;/li&gt;
&lt;li&gt;an independent answer-permission decision.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A high confidence score cannot override a changed source hash, a superseded claim, or blocked citation admission. Evidence-aware reports only compose admitted findings, preventing blocked source material from being reintroduced indirectly through free-form synthesis.&lt;/p&gt;

&lt;h3&gt;
  
  
  Deterministic context capsules
&lt;/h3&gt;

&lt;p&gt;An agent often needs a stable “working set” for a task. Re-running broad recall can produce unnecessary context churn, while maintaining a second wiki creates another source of truth.&lt;/p&gt;

&lt;p&gt;Context capsules provide a read-only, token-bounded projection over existing memory:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;capsule&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;brain&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;build_context_capsule&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;purpose&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;continue the current reliability investigation&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;token_budget&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;namespace&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;reliability-team&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A capsule reports why each record was selected, how many records were omitted, its estimated token count, and a stable content hash. Blocked or superseded records are excluded.&lt;/p&gt;

&lt;h3&gt;
  
  
  Observable empty recall
&lt;/h3&gt;

&lt;p&gt;“The search completed successfully but found nothing” is an operational event, not merely an empty list.&lt;/p&gt;

&lt;p&gt;Version &lt;code&gt;1.5.6&lt;/code&gt; adds counters for total and empty recall/search outcomes across formatted recall, structured recall, tier recall, and exact search. This makes it possible to monitor empty-recall rates and distinguish missing knowledge from transport or model failures.&lt;/p&gt;

&lt;h2&gt;
  
  
  One user, one isolated memory boundary
&lt;/h2&gt;

&lt;p&gt;Local development is simple: one agent process can use one Aura directory.&lt;/p&gt;

&lt;p&gt;A hosted multi-user system needs an explicit isolation strategy. The safest model is to treat each user's memory as a separate data boundary:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;pathlib&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Path&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;aura&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Aura&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;brain_for&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Aura&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;safe_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;validate_user_id&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;Aura&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;./memory&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;safe_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Namespaces can provide additional logical isolation, but authentication and authorization still belong to the application. Never accept an arbitrary storage path or namespace directly from a browser request.&lt;/p&gt;

&lt;p&gt;For a hosted TypeScript frontend, Aura should run behind a trusted backend or dedicated memory service. The frontend calls an authenticated API; the service selects the correct user-owned store. The Python package is not meant to run inside a static frontend bundle.&lt;/p&gt;

&lt;p&gt;This deployment detail is easy to miss. A library can make local installation simple, but persistent memory still has to run somewhere and its data has to be backed up, encrypted, observed, and isolated.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Aura does not do
&lt;/h2&gt;

&lt;p&gt;Aura is not a language model and does not generate the final answer. It does not make unverified input true. It does not replace application authorization, tool permission checks, or a backup strategy.&lt;/p&gt;

&lt;p&gt;It is also not a hosted database-as-a-service. If you deploy it on a server, you own the runtime and storage lifecycle. That tradeoff is intentional: local control and offline operation come with operational responsibility.&lt;/p&gt;

&lt;p&gt;Sparse Distributed Representation indexing is the default local retrieval path, while optional embeddings can be supplied when an application needs them. Performance depends on workload and hardware; the project includes benchmarks, but production systems should measure their own corpus and access patterns.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why build memory outside the model?
&lt;/h2&gt;

&lt;p&gt;Models change. Providers change. Context-window pricing changes. Agent memory should not have to disappear every time the inference layer is replaced.&lt;/p&gt;

&lt;p&gt;Keeping memory outside the model creates a stable boundary:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Agent runtime
    ├── model: reasoning and generation
    ├── tools: actions in the world
    └── Aura: persistence, retrieval, evidence, lifecycle, correction
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That boundary makes memory portable across models and easier to inspect independently. More importantly, it gives operators somewhere concrete to enforce retention, provenance, isolation, and correction policies.&lt;/p&gt;

&lt;p&gt;The project is MIT licensed. You can explore the &lt;a href="https://github.com/teolex2020/aura-memory" rel="noopener noreferrer"&gt;source code and examples on GitHub&lt;/a&gt;, install the package from &lt;a href="https://pypi.org/project/aura-memory/" rel="noopener noreferrer"&gt;PyPI&lt;/a&gt;, or read the overview at &lt;a href="https://aurasdk.dev/" rel="noopener noreferrer"&gt;aurasdk.dev&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I am especially interested in how other developers handle three questions:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Where do you draw the boundary between conversation history and durable memory?&lt;/li&gt;
&lt;li&gt;How do you isolate memory in multi-user agents?&lt;/li&gt;
&lt;li&gt;What evidence should an agent be required to carry before using a stored claim in an answer?&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>rust</category>
      <category>python</category>
    </item>
    <item>
      <title>Can a System Grow Its Own Tests? Judges Born from Consequences</title>
      <dc:creator>Oleksander</dc:creator>
      <pubDate>Thu, 16 Jul 2026 12:28:24 +0000</pubDate>
      <link>https://dev.to/teolex2020/can-a-system-grow-its-own-tests-judges-born-from-consequences-4a6c</link>
      <guid>https://dev.to/teolex2020/can-a-system-grow-its-own-tests-judges-born-from-consequences-4a6c</guid>
      <description>&lt;p&gt;&lt;em&gt;This is part four of the “Can You Build an Alternative to LLMs?” series. Part one separated real memory from a polished demo; part two tested self-correction; part three asked whether knowledge is merely a store. Code and experiment logs: &lt;a href="https://github.com/teolex2020/AuraSDK" rel="noopener noreferrer"&gt;AuraSDK&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;A repository can have a green &lt;code&gt;cargo test&lt;/code&gt; run while a bug is still alive in one of its functions.&lt;/p&gt;

&lt;p&gt;That is not a paradox. A conventional test checks a handful of known agreements. If a mutation does not violate those particular agreements, it survives. For an autonomous system, then, the question is not only “can it run tests?” It is harder:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Can it construct a &lt;strong&gt;new judging test&lt;/strong&gt; from the consequences of running code—one that separates a correct implementation from a plausible but incorrect one?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I did not ask a system to “invent a useful test” in free-form text. It gets a constrained process: observe execution, propose simple properties, try to break them on correct code, and turn only the survivors into Rust property tests. The final verdict is not delivered by a Python wrapper or an LLM. It is delivered by &lt;code&gt;cargo test&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why generating an assertion is not enough
&lt;/h2&gt;

&lt;p&gt;The most dangerous test is not the one that finds nothing. It is the one that confidently fails on correct code.&lt;/p&gt;

&lt;p&gt;Imagine a system sees several runs and infers: “whenever the result is non-empty, its length is always at least 3.” That may merely be an accidental bound of the examples it observed. Such a test can reject future correct implementations.&lt;/p&gt;

&lt;p&gt;So a candidate property does not immediately become a test. It must pass this cycle:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;live code executions
    → candidate property
    → attack it on correct code
    → reject it or scar the false generalization
    → test it against held-out mutations
    → Rust #[test] → cargo test
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I call this an &lt;em&gt;invented judge&lt;/em&gt;: not “a test written by a model,” but a constrained judge born from consequences and forced to survive refutation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Five gates, not one attractive run
&lt;/h2&gt;

&lt;p&gt;The first synthetic version showed that the mechanism could work: it killed 5 of 5 held-out mutations with maximum &lt;code&gt;false-fire = 0.0&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;That did not mean we had learned how to test Rust code. The experiment therefore passed through five gates:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;a synthetic Python world;&lt;/li&gt;
&lt;li&gt;a bridge to real &lt;code&gt;cargo test&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;seven ports of real Aura functions, compared with a static miner;&lt;/li&gt;
&lt;li&gt;a property judge that is actually rendered into Rust;&lt;/li&gt;
&lt;li&gt;a combined code-world gate over bodies of real Aura functions.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Two early results matter precisely because they were inconvenient.&lt;/p&gt;

&lt;p&gt;First, an early “real Cargo gate” honestly ended as &lt;code&gt;NOT_PROVEN&lt;/code&gt;, even though it already had &lt;code&gt;kill = 1.0&lt;/code&gt; and &lt;code&gt;false-fire = 0.0&lt;/code&gt;. Its rule was trivial: it added no new power beyond the weak existing test. To fix this, the experiment added an &lt;code&gt;abs_ratio&lt;/code&gt; mutation. It passed the weak Cargo test and evaded a simple boundary judge, but failed the arithmetic property &lt;code&gt;matches_division&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Second, simply carrying a result from Python into Rust would have been self-deception. In the final version, each candidate property is rendered into a &lt;code&gt;#[test]&lt;/code&gt; in &lt;code&gt;tests/judges.rs&lt;/code&gt;; the same &lt;code&gt;cargo test&lt;/code&gt; result is used for our method and the control groups.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the final gate actually tested
&lt;/h2&gt;

&lt;p&gt;The final script, &lt;code&gt;scripts/run_invented_judge_cargo_property_gate.py&lt;/code&gt;, works with literal Rust bodies from six AuraSDK functions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;filter_selected&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;disjoint&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;accuracy_per_mille&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;the count projection of &lt;code&gt;prune_deaths&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;a bit version of &lt;code&gt;presence_jaccard_rank_key&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;has_duplicates&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It introduced 12 mutations in the style of &lt;code&gt;cargo-mutants&lt;/code&gt;. Four were killed by the base Cargo tests—a useful sanity check. Eight survived the weak suite, and those eight became the targets for new judges.&lt;/p&gt;

&lt;p&gt;There is no Python oracle quietly supplying the correct answer in this gate. There is a Rust trace harness, a restricted vocabulary of property primitives, and a generated Rust test. The vocabulary is intentionally small: &lt;code&gt;&amp;gt;=&lt;/code&gt;/&lt;code&gt;&amp;lt;=&lt;/code&gt; bounds, scalar length, subset, empty output on empty input, symmetry, monotonicity, and permutation invariants.&lt;/p&gt;

&lt;p&gt;That restriction matters. The system is not discovering arbitrary new mathematics. It is selecting and validating judges from a known, auditable language of properties.&lt;/p&gt;

&lt;h2&gt;
  
  
  A result that does not hide its own boundary
&lt;/h2&gt;

&lt;p&gt;Under stable bounds, future inputs stayed in a regime already represented by the “lived” executions. Across three independent seeds, both approaches produced the same outcome:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Regime&lt;/th&gt;
&lt;th&gt;Approach&lt;/th&gt;
&lt;th&gt;Kill rate&lt;/th&gt;
&lt;th&gt;False-fire&lt;/th&gt;
&lt;th&gt;Net&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Stable bounds&lt;/td&gt;
&lt;td&gt;Invented judge&lt;/td&gt;
&lt;td&gt;1.00&lt;/td&gt;
&lt;td&gt;0.00&lt;/td&gt;
&lt;td&gt;+1.00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Stable bounds&lt;/td&gt;
&lt;td&gt;Static miner&lt;/td&gt;
&lt;td&gt;1.00&lt;/td&gt;
&lt;td&gt;0.00&lt;/td&gt;
&lt;td&gt;+1.00&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;There is no reason to declare victory here. When past data truly covers the future, static generalization works too.&lt;/p&gt;

&lt;p&gt;The interesting result appeared in the &lt;strong&gt;fragile-bounds&lt;/strong&gt; regime. Here, future correct cases cross an accidental bound that the static miner had seen in earlier traces.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Regime&lt;/th&gt;
&lt;th&gt;Approach&lt;/th&gt;
&lt;th&gt;Kill rate&lt;/th&gt;
&lt;th&gt;False-fire&lt;/th&gt;
&lt;th&gt;Net&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Fragile bounds&lt;/td&gt;
&lt;td&gt;Invented judge&lt;/td&gt;
&lt;td&gt;0.75&lt;/td&gt;
&lt;td&gt;0.00&lt;/td&gt;
&lt;td&gt;+0.75&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fragile bounds&lt;/td&gt;
&lt;td&gt;Static miner&lt;/td&gt;
&lt;td&gt;1.00&lt;/td&gt;
&lt;td&gt;0.50&lt;/td&gt;
&lt;td&gt;−0.50&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;At first glance, the static miner looks better: it killed every mutation. But it also falsely accused correct code in half of the held-out cases. Its net result is therefore negative.&lt;/p&gt;

&lt;p&gt;Our judge missed one mutation. It did not do so because it failed to see it; its candidate bound turned out to be accidental. The process scarred that generalization and returned &lt;code&gt;ABSTAIN&lt;/code&gt; instead of a false verdict. The key advantage here is not “kill more.” It is &lt;strong&gt;do not lie when the consequences are insufficient to justify generalization&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What “growing a test” means in a narrow, testable sense
&lt;/h2&gt;

&lt;p&gt;This result does not say that a system now understands product requirements on its own. It establishes a narrower claim:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Within a specified language of properties, a system can use correct-code execution and mutation blind spots, discard some false generalizations, generate a Rust property test, and obtain an independent verdict through Cargo.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The formulation has four necessary parts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;consequences&lt;/strong&gt;, not only static code reading;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;counterexamples&lt;/strong&gt;, not the first plausible hypothesis;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;refusal to judge&lt;/strong&gt; when a property does not survive scrutiny;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;independent execution&lt;/strong&gt; of the generated test in the project’s normal toolchain.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Without the last part, it is easy to accidentally measure the quality of your own evaluator rather than the quality of a test.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this does not prove yet
&lt;/h2&gt;

&lt;p&gt;The limits of the experiment should not be hidden in a footnote:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the mutations were handwritten in the style of &lt;code&gt;cargo-mutants&lt;/code&gt;, not generated by &lt;code&gt;cargo-mutants&lt;/code&gt; itself;&lt;/li&gt;
&lt;li&gt;probe-input generators are still manually specified;&lt;/li&gt;
&lt;li&gt;the scale is six functions and eight mutations that survived the weak suite;&lt;/li&gt;
&lt;li&gt;the property vocabulary is predefined and restricted;&lt;/li&gt;
&lt;li&gt;this is a code-world gate, not evidence across an entire repository or arbitrary specifications.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The honest next step is either to integrate the loop into real development, or to replace manual mutations and probes with independent tools. It would be wrong to conclude that autonomous testing is solved.&lt;/p&gt;

&lt;p&gt;Still, this is stronger than assertion autocomplete. The system does not merely write test text. It has to earn the right to write it: first by surviving refutation on correct code.&lt;/p&gt;

&lt;h2&gt;
  
  
  The final number
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Stable regime: kill 1.00 at false-fire 0.00.
Fragile bounds: invented judge net +0.75; static miner net −0.50.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The important number is not only the kill rate. It says something else: when the future leaves the range of what has been lived, an honest &lt;code&gt;ABSTAIN&lt;/code&gt; can be more valuable than a test that is confidently wrong.&lt;/p&gt;

&lt;p&gt;The code, gate scenarios, and logs are available in &lt;a href="https://github.com/teolex2020/AuraSDK" rel="noopener noreferrer"&gt;AuraSDK&lt;/a&gt;. The next part of the series will test a different boundary: whether such loops can preserve a useful trace over time when the system is no longer allowed to look into the future.&lt;/p&gt;

</description>
      <category>rust</category>
      <category>ai</category>
      <category>testing</category>
      <category>machinelearning</category>
    </item>
    <item>
      <title>Knowledge Is Not a Store: Why Every Container Died and Every Loop Survived</title>
      <dc:creator>Oleksander</dc:creator>
      <pubDate>Thu, 09 Jul 2026 13:02:39 +0000</pubDate>
      <link>https://dev.to/teolex2020/knowledge-is-not-a-store-why-every-container-died-and-every-loop-survived-17oa</link>
      <guid>https://dev.to/teolex2020/knowledge-is-not-a-store-why-every-container-died-and-every-loop-survived-17oa</guid>
      <description>&lt;p&gt;&lt;em&gt;This is the third article in a research series about trying to build something adjacent to — and in some ways alternative to — large language models, rather than a wrapper around one. Part 1: "My Synthetic Eval Said 30/30. LoCoMo Said 0.13." Part 2: "Can You Build an Alternative to LLMs? 8 Months, ~200 Failed Experiments, One Wall." The code that survived is open source in &lt;a href="https://github.com/teolex2020/AuraSDK" rel="noopener noreferrer"&gt;AuraSDK&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;In the previous part I showed the wall: every knowledge carrier I tried failed at transferring causal binding. This part is about a different, narrower, and more useful question that remained after the failures:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If so many containers died and some loops survived — what exactly separates the two?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The answer turned out to be one sentence. And it killed half my designs on the whiteboard, before the first run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;storage preserves an event;
knowledge must change the next action.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It sounds trivial. The consequences are not.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. The Trap Almost Every Memory System Falls Into
&lt;/h2&gt;

&lt;p&gt;The default answer to "give the system knowledge" is always the same:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;store facts;&lt;/li&gt;
&lt;li&gt;build a graph;&lt;/li&gt;
&lt;li&gt;add embeddings;&lt;/li&gt;
&lt;li&gt;add typed edges;&lt;/li&gt;
&lt;li&gt;retrieve relevant chunks.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All of these store a &lt;strong&gt;statement&lt;/strong&gt;. A statement is a container. It sits there and waits for someone to retrieve it.&lt;/p&gt;

&lt;p&gt;Here is what dead knowledge looks like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"windows(0) causes a panic"     ← a fact. a dead number. a container.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It looks like knowledge. But it is a string that can lie on a new input. It does not know WHERE it came from, it does not know WHEN it no longer applies, and it changes nothing about the system's next action — until some separate layer (an agent, a prompt, an inference step) decides what to do with it.&lt;/p&gt;

&lt;p&gt;And here is the same thing as a lived consequence:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;state:       calling slice.windows(window_size)
action:      set window_size = 0
consequence: the world returned panic "size &amp;gt; 0"
conclusion:  this transition refutes the route for the boundary/window-guard class
links:       guard, invalid-parameter, runtime-invariant, panic-before-assert
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The difference is not cosmetic. The first is what SOMEONE described. The second was born from EXECUTION: the world returned a panic the author did not know in advance.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. The Core Prohibition: A Unit of Knowledge Is Not a Container
&lt;/h2&gt;

&lt;p&gt;After ~200 failures, I formulated a prohibition that became filter #1:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A universal unit of knowledge must not be a container.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Because the moment it becomes a container, it is a JSON / graph / table again, and we get dead numbers again. This has been falsified many times: storing links between empty symbols does not produce knowledge.&lt;/p&gt;

&lt;p&gt;A unit has to be &lt;strong&gt;operational&lt;/strong&gt;. Three actions must work on it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. SELECT   — it can be used to choose an action in a new situation
2. COMPARE  — it can be matched to a new situation by consequence, not by surface
3. VERIFY   — it can be confirmed or refuted by a new consequence (it mutates)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If a unit cannot be (1) used to choose, (2) compared by consequence, and (3) updated by a new consequence — it is a container, not knowledge.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. The Falsify-Tooth: One Test That Separates Alive From Dead
&lt;/h2&gt;

&lt;p&gt;The problem with prohibitions is that during implementation the unit quietly slides back into a container. So I reduced everything to one test — the irreversibility-into-form tooth:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;TEST: can this unit be generated WITHOUT executing in the world?

  yes → it is a FORM (someone described or filled it) → CONTAINER → dead
  no  → it could only be born from a lived collision
        (the world returned a consequence we did not know in advance) → ALIVE unit
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It is a sharp, almost brutal criterion. But it works.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;windows(0) → panic&lt;/code&gt; passes: this consequence is born from execution, the world returns the panic, and you cannot honestly write it from your head without running it.&lt;/p&gt;

&lt;p&gt;A co-occurrence graph, a summary, a typed-edge table, an embedding — all fail: they can be filled by hand or by an LLM with no collision with the world at all. So they are containers in disguise.&lt;/p&gt;

&lt;p&gt;One sentence worth a whole section: &lt;strong&gt;a real unit of knowledge contains a consequence the author did not know until they took the action.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  4. The Zero-Action Law: Knowledge Without Action Is Guessing
&lt;/h2&gt;

&lt;p&gt;The most useful result was negative, and it put everything else in its place.&lt;/p&gt;

&lt;p&gt;I wanted a carrier that "knows" the correct answer to an unseen situation immediately, with no action at all. Zero-probe transfer. One gate tested this directly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;0-probe unseen transfer:
  no given role       -&amp;gt; selection WRONG, hidden verifier fails
  with given role     -&amp;gt; read-path selects RIGHT
  with shuffled role  -&amp;gt; selection WRONG, hidden verifier fails
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Reading that table honestly: the read mechanism works only if the role has already been lived or supplied. Without an action that produces or projects the role, the system does not "know" the unseen answer. Transfer = 0.&lt;/p&gt;

&lt;p&gt;This is not a defect. It follows from the nature of the thing:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;knowing the answer without action = guessing
guessing without verification = a consensus machine / an LLM
a consequence machine, therefore, needs a consequence to know
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is exactly the line to an LLM. An LLM answers without action because it guesses the most probable continuation. A consequence machine honestly says "I don't know" or performs a minimal check. So &lt;code&gt;abstain&lt;/code&gt; is not a weakness — it is the core of its honesty.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. What This Changes About the Carrier's Goal
&lt;/h2&gt;

&lt;p&gt;The zero-action law inverted the goal itself:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;NOT: a carrier that knows the right answer without action
YES: a carrier that minimizes the action needed for an honest consequence-check
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Route-state, role-equivalence, scars, cheap-check — these are not "magic 0-probe knowledge." They are organs of &lt;strong&gt;cheapening the check&lt;/strong&gt;. They prune the search, rank, block lies, turn an expensive full probe into a cheaper partial probe. But they do not cancel the principle itself: new knowledge is born from consequence.&lt;/p&gt;

&lt;p&gt;The practical criterion I now apply to every experiment:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;If a gate shows only fewer probes / cheaper probes / wrong=0 via abstain —
that is NOT a carrier that knows, it's an organ of optimized verification.

That's good if the goal is truthful action at minimal cost.
It must NOT be inflated to "the system knows the unseen without a check."
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  6. Container Died, Loop Survived — With Numbers
&lt;/h2&gt;

&lt;p&gt;Now the specifics, because this series is held together by numbers, not by morals.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The container (zero-probe) — died.&lt;/strong&gt; A carrier required to know the unseen without action gave transfer = 0. With a given role, reading works; shuffle the role as a control and the selection is wrong again, the hidden verifier fails. So there was no "knowledge" there; there was a dependence on an already-lived / supplied role.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The loop (cheap-probe) — survived, but only on real overlap.&lt;/strong&gt; Here is the most important honest story of a single gate. The first version of transferring the selection to unseen cases gave:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;2/4  ← a coin flip
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The temptation is to declare failure. But the diagnosis was more precise: the unseen situations had been constructed so that they were NOT genuinely related to the trained ones. And the carrier honestly said "I don't know" on 50%, instead of guessing at random. When I rebuilt the unseen cases as normalized mixtures of trained situations — i.e. gave them REAL distributed overlap — the result was:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;4/4
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The key point: selection generalizes where there is real overlap, and honestly does NOT where there is none. On the genuinely-new, the carrier does not hallucinate a selection — it stays silent. That is exactly the behavior an LLM does not give you.&lt;/p&gt;

&lt;p&gt;The difference between the two sides:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;container that claims to know without action -&amp;gt; 0 transfer
loop that cheaply checks by consequence      -&amp;gt; 4/4 on real overlap,
                                                honest coin flip (2/4 = abstain)
                                                on fake overlap
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  7. The Honest Boundary
&lt;/h2&gt;

&lt;p&gt;This does not solve the whole knowledge-carrier problem. How these units compose, how they transfer to the genuinely-new, how they scale — all still open (the wall from part 2 has not gone anywhere). And I'll name the boundary myself, before it gets named for me: this is one person, eight months, a CPU, not a lab. There may be a container I never tried.&lt;/p&gt;

&lt;p&gt;But the most important thing is done: I finally named precisely WHAT the carrier has to carry. Not data. Not facts. Not semantics. A unit of a lived causal transition that can be selected, compared by consequence, and refuted.&lt;/p&gt;

&lt;p&gt;And from there followed the single question I now use to judge every experiment:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Does it create a unit of lived consequence —
or just a prettier container?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That question saves months. Because a prettier container always looks like progress — right up until you ask it to transfer.&lt;/p&gt;

&lt;h2&gt;
  
  
  8. Conclusion
&lt;/h2&gt;

&lt;p&gt;The eight-month post-mortem produced a less glamorous but more useful thesis than the one I was chasing:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;containers store statements that can lie;
loops store consequences the world has already confirmed;
knowledge without action is guessing;
a cheaper honest check &amp;gt; a confident answer with no check.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every container I built died at transfer. Every loop tied to a consequence survived exactly as far as it honestly stayed silent where there was no overlap.&lt;/p&gt;

&lt;p&gt;The final number:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;zero-probe unseen transfer: 0
cheap-probe on real overlap: 4/4
the same cheap-probe on fake overlap: 2/4 = honest abstain, not guessing
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;&lt;em&gt;The mechanisms that survived (append-only memory, scar logic, cheap-probe consequence checks) are open source: &lt;a href="https://github.com/teolex2020/AuraSDK" rel="noopener noreferrer"&gt;AuraSDK on GitHub&lt;/a&gt;. If you have seen a unit of knowledge that passes the falsify-tooth from section 3 and is still not a container — tell me in the comments, I genuinely want to see it.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>machinelearning</category>
      <category>llm</category>
      <category>rust</category>
    </item>
    <item>
      <title>Can You Build an Alternative to LLMs? 8 Months, ~200 Failed Experiments, One Wall. 2</title>
      <dc:creator>Oleksander</dc:creator>
      <pubDate>Sun, 05 Jul 2026 07:22:18 +0000</pubDate>
      <link>https://dev.to/teolex2020/can-you-build-an-alternative-to-llms-8-months-200-failed-experiments-one-wall-2-3776</link>
      <guid>https://dev.to/teolex2020/can-you-build-an-alternative-to-llms-8-months-200-failed-experiments-one-wall-2-3776</guid>
      <description>&lt;p&gt;&lt;em&gt;This is part 2 of a research series documenting an attempt to build something adjacent to — and in some ways alternative to — large language models. Part 1: "My Synthetic Eval Said 30/30. LoCoMo Said 0.13." The code that survived lives in &lt;a href="https://github.com/teolex2020/AuraSDK" rel="noopener noreferrer"&gt;AuraSDK&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;Not a chatbot wrapper.&lt;/p&gt;

&lt;p&gt;Not another prompt stack.&lt;/p&gt;

&lt;p&gt;Not a vector database with a nicer UI.&lt;/p&gt;

&lt;p&gt;The question was narrower and more dangerous:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Can a non-neural, CPU-only system accumulate experience, mutate its own internal state, and improve future behavior without retraining an LLM?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;After eight months, the honest answer is not "yes".&lt;/p&gt;

&lt;p&gt;The honest answer is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;some mechanisms survived,
most carriers failed,
and the wall became precise.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The wall is not storage. Storage is easy.&lt;/p&gt;

&lt;p&gt;The wall is transferable causal transition:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;condition -&amp;gt; action -&amp;gt; consequence -&amp;gt; when NOT to apply it
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is the thing I kept failing to preserve.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. What I Mean by "Alternative to LLMs"
&lt;/h2&gt;

&lt;p&gt;The phrase is too broad, so I need to narrow it.&lt;/p&gt;

&lt;p&gt;I was not trying to build a new frontier model. I was not training a transformer from scratch. I was not trying to beat GPT-class models at language.&lt;/p&gt;

&lt;p&gt;The target was smaller:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Find a knowledge substrate that behaves like a tiny, mutable set of weights.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The required properties were:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;it changes after experience;&lt;/li&gt;
&lt;li&gt;it survives restart;&lt;/li&gt;
&lt;li&gt;it changes future behavior without code changes;&lt;/li&gt;
&lt;li&gt;it transfers to unseen but related cases;&lt;/li&gt;
&lt;li&gt;it fails shuffled/null controls if the signal is fake;&lt;/li&gt;
&lt;li&gt;it is compact in a behavioral sense, not merely compressed bytes;&lt;/li&gt;
&lt;li&gt;it abstains when unsupported instead of confidently guessing.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In other words, I was looking for something between memory and weights.&lt;/p&gt;

&lt;p&gt;Memory stores what happened.&lt;/p&gt;

&lt;p&gt;Weights change what happens next.&lt;/p&gt;

&lt;p&gt;The experiment was to find a symbolic or hybrid substrate that could cross that line.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Why Normal Memory Was Not Enough
&lt;/h2&gt;

&lt;p&gt;The first tempting answer is always memory:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;append the conversation;&lt;/li&gt;
&lt;li&gt;summarize it;&lt;/li&gt;
&lt;li&gt;store facts;&lt;/li&gt;
&lt;li&gt;retrieve relevant chunks;&lt;/li&gt;
&lt;li&gt;build a graph;&lt;/li&gt;
&lt;li&gt;add embeddings;&lt;/li&gt;
&lt;li&gt;add scores;&lt;/li&gt;
&lt;li&gt;add typed edges.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All of those are useful engineering tools. None of them automatically become knowledge.&lt;/p&gt;

&lt;p&gt;The distinction became brutal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;storage can preserve an event;
knowledge must change the next action.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A log can say:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;candidate A failed in situation X
candidate B worked in situation X
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But a useful system must do more:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;in a new situation X',
recognize what is shared with X,
avoid A-like actions,
try B-like actions,
and know when the analogy no longer applies.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That last line is where most designs died.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. The Carrier Bakeoff
&lt;/h2&gt;

&lt;p&gt;I tested many candidate "carriers" of knowledge. A carrier is the internal form that is supposed to hold experience and make it reusable.&lt;/p&gt;

&lt;p&gt;The early list looked reasonable:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Carrier&lt;/th&gt;
&lt;th&gt;What it preserved&lt;/th&gt;
&lt;th&gt;Where it failed&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;append-only memory&lt;/td&gt;
&lt;td&gt;event history&lt;/td&gt;
&lt;td&gt;did not transfer to unseen cases&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;surface compression&lt;/td&gt;
&lt;td&gt;shorter text&lt;/td&gt;
&lt;td&gt;compressed language, not behavior&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;graph / n-gram links&lt;/td&gt;
&lt;td&gt;co-occurrence&lt;/td&gt;
&lt;td&gt;became an index, not a causal model&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;route state&lt;/td&gt;
&lt;td&gt;role and expectation&lt;/td&gt;
&lt;td&gt;changed behavior, but stayed narrow&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;typed edges&lt;/td&gt;
&lt;td&gt;relation labels&lt;/td&gt;
&lt;td&gt;helped only when the relation grammar was already given&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;graded vectors&lt;/td&gt;
&lt;td&gt;magnitude and pressure&lt;/td&gt;
&lt;td&gt;carried direction, not an executable mechanism&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;living cells&lt;/td&gt;
&lt;td&gt;local conflict&lt;/td&gt;
&lt;td&gt;transferred some signal, but could transfer the wrong action&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Jacobian-like footprint&lt;/td&gt;
&lt;td&gt;local numeric effect&lt;/td&gt;
&lt;td&gt;worked on linear repairs, failed on branching and bit-shift semantics&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;topology fields&lt;/td&gt;
&lt;td&gt;learned attraction basins&lt;/td&gt;
&lt;td&gt;signal on synthetic worlds; on real cargo snippets — 0/5 correct, 5/5 abstain&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The pattern was consistent.&lt;/p&gt;

&lt;p&gt;Each carrier preserved one aspect of consequence:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;that something was supported;&lt;/li&gt;
&lt;li&gt;that something was refuted;&lt;/li&gt;
&lt;li&gt;that a choice had pressure;&lt;/li&gt;
&lt;li&gt;that two roles were related;&lt;/li&gt;
&lt;li&gt;that a numeric direction changed;&lt;/li&gt;
&lt;li&gt;that a local conflict existed;&lt;/li&gt;
&lt;li&gt;that a state transition had a shape.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But none of the early carriers preserved the full causal transition.&lt;/p&gt;

&lt;p&gt;That is the difference between:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"A was good near B"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"When input has property P and state has condition C,
action A changes state S in direction D,
unless boundary condition B is active."
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The second form is much closer to knowledge.&lt;/p&gt;

&lt;p&gt;It is also much harder to acquire without already having a model that can do it.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Signals That Were Real but Not Enough
&lt;/h2&gt;

&lt;p&gt;Some results were not failures in the simple sense. They were real signals.&lt;/p&gt;

&lt;p&gt;One route-state experiment proved that internal state can change behavior without changing code. The system saw support and refutation, mutated its state, and later selected differently. The shuffled-state control failed. That was important.&lt;/p&gt;

&lt;p&gt;But it did not prove a replacement for weights. It proved that a narrow symbolic state can influence selection.&lt;/p&gt;

&lt;p&gt;Another experiment used graded consequence vectors. The vector was updated by experience, not by gradient training. It showed useful properties:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;same direction, more support       -&amp;gt; larger magnitude
50% shared experience              -&amp;gt; similarity ~0.41
0% shared experience               -&amp;gt; similarity ~0.05  (margin 0.35)
support followed by scar evidence  -&amp;gt; direction flipped
random nudges                      -&amp;gt; near-zero similarity
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;An important detail: 0.41 (not 1.0) on partially shared experience is exactly what real generalization looks like, as opposed to memorization. The similarity emerges from structure; it is not hard-coded. That too was a real signal.&lt;/p&gt;

&lt;p&gt;But it was not enough. It carried pressure and similarity. It did not carry the executable rule of &lt;em&gt;when&lt;/em&gt; a transition should fire.&lt;/p&gt;

&lt;p&gt;The most honest label for these results:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SIGNAL, not solution.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That distinction saved months of self-deception.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. The "Abstain" Lesson
&lt;/h2&gt;

&lt;p&gt;One of the most useful discoveries was negative:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A weak knowledge carrier should abstain instead of guessing.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In several gates, the system got better when unsupported cases were answered with "I do not know" instead of being forced into the nearest known pattern.&lt;/p&gt;

&lt;p&gt;This matters because many memory systems look good only because they always answer. But in a causal system, a wrong transfer is worse than silence.&lt;/p&gt;

&lt;p&gt;If a stored pattern says:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;this action repaired the previous case
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and the new case looks similar but has a different boundary condition, reusing the action can be actively harmful.&lt;/p&gt;

&lt;p&gt;The real requirement became:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;transfer when supported;
abstain when the binding is not justified;
never convert weak similarity into certainty.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is where many memory architectures quietly fail. They retrieve something. The model uses it. The answer looks grounded. But the binding between old evidence and the new situation may be invalid.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Executable Worlds Made the Failure Sharper
&lt;/h2&gt;

&lt;p&gt;Synthetic gates are useful, but dangerous. If you design the world, you can accidentally design the success.&lt;/p&gt;

&lt;p&gt;So part of the testing moved into small executable worlds: code snippets, controlled bugs, compiler feedback, repair attempts, and real pass/fail consequences.&lt;/p&gt;

&lt;p&gt;The results became sharper.&lt;/p&gt;

&lt;p&gt;A local numeric footprint could transfer part of a lived consequence pattern. It worked when the change was close to a linear repair:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;increase this value;
change this numeric boundary;
map this local residual to that local patch.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But it failed on cases that required real mechanism:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;bit-shift semantics;
branch behavior;
boundary conditions;
state transitions.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That mattered. Passing a generated linear-repair gate does not mean the system learned code. It means the carrier can reuse a local numeric direction.&lt;/p&gt;

&lt;p&gt;The criterion became stricter:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;a carrier must survive mixed nonlinear executable snippets:

- numeric delta;
- bit shift;
- boundary condition;
- state transition;
- negative abstain.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If it only passes local-linear repair, it is a helper operator, not a candidate core.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. The Single-File Brain Attempt
&lt;/h2&gt;

&lt;p&gt;One direction looked especially attractive:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What if the entire learned state lived in one mutable file?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The idea was simple:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The system acts.&lt;/li&gt;
&lt;li&gt;The world returns consequences.&lt;/li&gt;
&lt;li&gt;The state file mutates.&lt;/li&gt;
&lt;li&gt;After restart, the file still changes future behavior.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This was not supposed to be a database. It was supposed to be a growing behavioral substrate.&lt;/p&gt;

&lt;p&gt;The result was mixed:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;transfer cycle: 3/5
blind baseline: 1/5
wrong: 1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So the file was not dead storage. It grew. It mutated. It transferred some lived transition experience. It beat the blind baseline.&lt;/p&gt;

&lt;p&gt;But &lt;code&gt;wrong=1&lt;/code&gt; matters more than the improvement.&lt;/p&gt;

&lt;p&gt;The system did not merely abstain on unsupported transfer. It sometimes confidently selected a wrong action. For a knowledge carrier, that is a critical failure.&lt;/p&gt;

&lt;p&gt;The diagnosis:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;bound transition-cells increased capacity,
but did not preserve enough mechanism.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is a recurring pattern:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;more structure != more knowledge
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A richer container can still carry the wrong abstraction.&lt;/p&gt;

&lt;h2&gt;
  
  
  8. The Wall Became a Binding Problem
&lt;/h2&gt;

&lt;p&gt;After many carrier failures, the question changed.&lt;/p&gt;

&lt;p&gt;At first I asked:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Which carrier stores knowledge best?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Later, the better question was:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;How does a new situation bind to old experience?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The binding is the hard part.&lt;/p&gt;

&lt;p&gt;Suppose the system has learned a useful transition in one world:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;node A influences node B
changing A repairs failure F
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now it sees a new world with different node names and a different surface form.&lt;/p&gt;

&lt;p&gt;Which node corresponds to A?&lt;/p&gt;

&lt;p&gt;Which node corresponds to B?&lt;/p&gt;

&lt;p&gt;Which local structure is the same mechanism, and which is only superficially similar?&lt;/p&gt;

&lt;p&gt;Without an anchor, this turns into graph matching. In one of the gates I attempted an autonomous bijection between train and heldout worlds directly — and failed exactly here: computing the correspondence required already knowing the correspondence. That is graph isomorphism, NP-hard without an anchor. Not an engineering obstacle — a fundamental one.&lt;/p&gt;

&lt;p&gt;This produced the anchor trilemma.&lt;/p&gt;

&lt;h2&gt;
  
  
  9. The Anchor Trilemma
&lt;/h2&gt;

&lt;p&gt;Every attempted solution fell into one of three buckets.&lt;/p&gt;

&lt;h3&gt;
  
  
  Option 1: The anchor is given
&lt;/h3&gt;

&lt;p&gt;If a human or a hand-written rule tells the system which parts correspond, transfer becomes much easier.&lt;/p&gt;

&lt;p&gt;But then the hard part was not learned. It was supplied.&lt;/p&gt;

&lt;p&gt;This can still be useful engineering. It is not an alternative knowledge substrate.&lt;/p&gt;

&lt;h3&gt;
  
  
  Option 2: The anchor is searched
&lt;/h3&gt;

&lt;p&gt;If the system searches over possible bindings, it can sometimes find the match.&lt;/p&gt;

&lt;p&gt;But the search explodes quickly. The more nodes, relations, states, and conditions, the less attractive this becomes.&lt;/p&gt;

&lt;p&gt;You have not built cheap knowledge. You have moved the cost into combinatorial search.&lt;/p&gt;

&lt;h3&gt;
  
  
  Option 3: The anchor is learned by a model
&lt;/h3&gt;

&lt;p&gt;If an LLM, an embedding model, an analyzer, or a world-probing system supplies the binding, the system works much better.&lt;/p&gt;

&lt;p&gt;But then the symbolic substrate is no longer the source of the core intelligence. It becomes a memory, a cache, a verifier, or an optimizer around another intelligence source.&lt;/p&gt;

&lt;p&gt;That may be a good product.&lt;/p&gt;

&lt;p&gt;It is no longer the original hypothesis.&lt;/p&gt;

&lt;p&gt;The trilemma:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;given anchor    -&amp;gt; not learned
searched anchor -&amp;gt; too expensive or unstable
learned anchor  -&amp;gt; not independent from the model/teacher
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This was the wall.&lt;/p&gt;

&lt;h2&gt;
  
  
  10. What Actually Survived
&lt;/h2&gt;

&lt;p&gt;The failed broad claim was:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A symbolic carrier can become alternative weights by storing enough structured consequences.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That did not survive.&lt;/p&gt;

&lt;p&gt;What survived was narrower.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Consequence loops matter
&lt;/h3&gt;

&lt;p&gt;The system improves only when it receives world feedback:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;try -&amp;gt; observe -&amp;gt; mutate -&amp;gt; retry
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Static documents, summaries, and graphs are weak unless tied to consequences.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Deterministic guards matter
&lt;/h3&gt;

&lt;p&gt;Some fields must not be entrusted to a generative or fuzzy substrate:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;IDs;&lt;/li&gt;
&lt;li&gt;dates;&lt;/li&gt;
&lt;li&gt;amounts;&lt;/li&gt;
&lt;li&gt;names;&lt;/li&gt;
&lt;li&gt;paths;&lt;/li&gt;
&lt;li&gt;exact constraints;&lt;/li&gt;
&lt;li&gt;status changes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Extract them and preserve them explicitly.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. World judges matter
&lt;/h3&gt;

&lt;p&gt;The compiler, tests, and executable checks were more honest than internal scores.&lt;/p&gt;

&lt;p&gt;They do not care how elegant the architecture is. They return:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pass / fail
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4. Abstention is a feature
&lt;/h3&gt;

&lt;p&gt;A weak system that abstains is more useful than a weak system that always transfers.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Some organs are still valuable
&lt;/h3&gt;

&lt;p&gt;Route-state, scars, typed relations, date guards, append-only memory, cheap probes, and executable judges are not useless.&lt;/p&gt;

&lt;p&gt;They are useful organs.&lt;/p&gt;

&lt;p&gt;They are not a full brain.&lt;/p&gt;

&lt;h2&gt;
  
  
  11. What I Am Not Claiming
&lt;/h2&gt;

&lt;p&gt;I am not claiming I built an alternative to LLMs.&lt;/p&gt;

&lt;p&gt;I am not claiming symbolic systems cannot work.&lt;/p&gt;

&lt;p&gt;I am not claiming all memory systems are useless.&lt;/p&gt;

&lt;p&gt;I am not claiming the wall is mathematically insurmountable in every form.&lt;/p&gt;

&lt;p&gt;The honest claim is narrower:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;In my experiments, every carrier that tried to preserve knowledge as stored structure eventually failed at transferable causal binding.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And there is an even narrower boundary I have to state myself, before someone states it for me: this is one person working for 8 months on a CPU, not the output of a lab. There may be a carrier I never tried. But 150+ gates kept failing at the same point so consistently that the pattern outweighs any single failure — and that point coincides with why symbolic AI historically lost to learning: the correspondence metric has to be learned, not postulated.&lt;/p&gt;

&lt;p&gt;That is still useful.&lt;/p&gt;

&lt;p&gt;It prevents wasting another cycle on prettier containers.&lt;/p&gt;

&lt;h2&gt;
  
  
  12. The Test for Any New Approach
&lt;/h2&gt;

&lt;p&gt;After these failures, a new approach is worth testing only if it clears a stricter bar.&lt;/p&gt;

&lt;p&gt;It must:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;change future behavior without code changes;&lt;/li&gt;
&lt;li&gt;survive restart;&lt;/li&gt;
&lt;li&gt;beat shuffled and null controls;&lt;/li&gt;
&lt;li&gt;transfer to unseen cases;&lt;/li&gt;
&lt;li&gt;abstain on unsupported cases;&lt;/li&gt;
&lt;li&gt;preserve exact fields separately;&lt;/li&gt;
&lt;li&gt;operate in a world with consequences;&lt;/li&gt;
&lt;li&gt;handle nonlinear transitions, not only local numeric repair;&lt;/li&gt;
&lt;li&gt;show value over a simple baseline.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And most importantly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;it must carry the transition,
not just an aspect of the transition.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is the line that killed most of my designs.&lt;/p&gt;

&lt;h2&gt;
  
  
  13. Why This Still Matters
&lt;/h2&gt;

&lt;p&gt;A negative result is not the same as no result.&lt;/p&gt;

&lt;p&gt;Before these experiments, the problem looked like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;find a better memory structure
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After the failures, it looks like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;store and transfer executable causal transitions with valid binding
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is a much better problem statement.&lt;/p&gt;

&lt;p&gt;It also changes product thinking. A useful system does not need to pretend it replaces an LLM. It can be valuable if it provides:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;cheaper long-session memory;&lt;/li&gt;
&lt;li&gt;evidence-preserving state;&lt;/li&gt;
&lt;li&gt;deterministic guards;&lt;/li&gt;
&lt;li&gt;world-verified actions;&lt;/li&gt;
&lt;li&gt;refusal to overwrite known scars;&lt;/li&gt;
&lt;li&gt;test generation from consequences;&lt;/li&gt;
&lt;li&gt;bounded automation around external judges.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those are real mechanisms.&lt;/p&gt;

&lt;p&gt;They just should not be sold as "alternative weights" until they pass the binding wall.&lt;/p&gt;

&lt;h2&gt;
  
  
  14. Conclusion
&lt;/h2&gt;

&lt;p&gt;The original dream was:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;build a CPU-only mutable substrate that behaves like alternative weights
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The experiments produced something less glamorous and more useful:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;storage is easy;
behavioral mutation is possible;
transfer is fragile;
causal binding is the wall.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The wall is not that the system cannot remember.&lt;/p&gt;

&lt;p&gt;The wall is that remembering is not enough.&lt;/p&gt;

&lt;p&gt;To act intelligently in a new situation, the system must know what old experience corresponds to, which transition applies, and where the analogy breaks.&lt;/p&gt;

&lt;p&gt;That is the part I could not solve with another graph, vector, summary, route state, or mutable file.&lt;/p&gt;

&lt;p&gt;The final number:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;~200 experiments, 30+ candidate carriers, 1 wall.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






</description>
      <category>ai</category>
      <category>machinelearning</category>
      <category>llm</category>
      <category>rust</category>
    </item>
    <item>
      <title>Series: "Can You Build an Alternative to LLMs? 8 Months of Experiments, 200 Failures, and One Wall" 1</title>
      <dc:creator>Oleksander</dc:creator>
      <pubDate>Thu, 02 Jul 2026 12:59:15 +0000</pubDate>
      <link>https://dev.to/teolex2020/series-can-you-build-an-alternative-to-llms-8-months-of-experiments-200-failures-and-one-wall-21ih</link>
      <guid>https://dev.to/teolex2020/series-can-you-build-an-alternative-to-llms-8-months-of-experiments-200-failures-and-one-wall-21ih</guid>
      <description>&lt;p&gt;I tested a simple hypothesis: can long LLM sessions be made cheaper by replacing the full transcript with a compact memory state, without losing answer correctness?&lt;/p&gt;

&lt;p&gt;On my own synthetic eval, the system passed &lt;code&gt;30/30&lt;/code&gt;. On an external benchmark for long-term conversational memory, the score collapsed to &lt;code&gt;0.13&lt;/code&gt;. The failure was not caused by one bad prompt. It came from the type of memory being preserved: the local eval tested exact facts, while LoCoMo tested episodic memory.&lt;/p&gt;

&lt;p&gt;After several failed approaches, one narrow architecture survived: append-only memory plus deterministic guards for exact fields, especially dates. It is not general-purpose memory, but it produced an honest result: &lt;code&gt;94% retention&lt;/code&gt; with &lt;code&gt;60% per-query saving&lt;/code&gt; on 200 QA.&lt;/p&gt;

&lt;p&gt;The main lesson: synthetic evals are useful as regression tests, but dangerous as evidence. If an eval is written around the mechanism being tested, the system can look strong exactly where it proves the least.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. The Problem
&lt;/h2&gt;

&lt;p&gt;Long LLM sessions are expensive. If every new request receives the entire previous transcript, cost grows with conversation length. The obvious engineering response is to compress the history into a compact state and give the model that state plus the most recent turns.&lt;/p&gt;

&lt;p&gt;The hypothesis was:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Compact session state can reduce prompt/context usage without losing answer correctness.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is attractive. It promises smaller prompts, longer sessions, cheaper agents, and less irrelevant context. But it hides a trap: if the state compresses the wrong type of information, it does not optimize memory. It deletes data.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. The Local Eval Looked Good
&lt;/h2&gt;

&lt;p&gt;I started with my own 30-case corpus. It covered:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;exact facts;&lt;/li&gt;
&lt;li&gt;support notes;&lt;/li&gt;
&lt;li&gt;CRM-style notes;&lt;/li&gt;
&lt;li&gt;coding sessions;&lt;/li&gt;
&lt;li&gt;RAG-like context;&lt;/li&gt;
&lt;li&gt;mixed-language facts;&lt;/li&gt;
&lt;li&gt;preferences and decisions;&lt;/li&gt;
&lt;li&gt;negative short-context cases.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"exact_authorization_code"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"question"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"What is the authorization code? Answer only the code."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"expected_fragments"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"RX-4471"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On this corpus, the system looked good. But the first pretty numbers were dry-runs. A dry-run does not call the model: the answer equals the expected fragments by construction. That mode is useful for checking the pipeline, but it is not evidence of quality.&lt;/p&gt;

&lt;p&gt;The first full real-model run, after fixing checker artifacts and a mixed-language gap, gave:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;corpus:       30 cases
noise:        +40 turns
accuracy:     1.000  (30/30)
effectiveness_rate: 1.000
context_window_saved_pct: 82.86%
false savings: 0
GATE: PASS
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This was stronger than a dry-run. But the central problem remained: the corpus was mine. It was written around what the mechanism was already good at preserving.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Why Synthetic 30/30 Was Not Enough
&lt;/h2&gt;

&lt;p&gt;The local eval mostly tested exact facts and durable decisions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;codes;&lt;/li&gt;
&lt;li&gt;dates in strict formats;&lt;/li&gt;
&lt;li&gt;IDs;&lt;/li&gt;
&lt;li&gt;file paths;&lt;/li&gt;
&lt;li&gt;explicit preferences;&lt;/li&gt;
&lt;li&gt;short rules;&lt;/li&gt;
&lt;li&gt;"do not forget" facts.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is important for regression testing. But it is not the same as long-term conversational memory.&lt;/p&gt;

&lt;p&gt;Real conversational memory often asks:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;when something happened;&lt;/li&gt;
&lt;li&gt;what "yesterday" meant relative to a specific session;&lt;/li&gt;
&lt;li&gt;how events across several dialogues are connected;&lt;/li&gt;
&lt;li&gt;who said what;&lt;/li&gt;
&lt;li&gt;what two people have in common;&lt;/li&gt;
&lt;li&gt;which fact is needed for an answer even though it is not named in the question.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;My local eval tested the type of memory I already knew how to compress. The external benchmark tested what I had not shaped around my own mechanism.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. LoCoMo Broke the Claim
&lt;/h2&gt;

&lt;p&gt;For an external check, I used LoCoMo: a benchmark for very long-term conversational memory. LoCoMo dialogues average around 300 turns, 9K tokens, and up to 35 sessions. It tests long-term memory through QA, event summarization, and multi-session dialogue understanding.&lt;/p&gt;

&lt;p&gt;The first result was harsh:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;raw              : 8/15 = 0.53
projected_facts  : 2/15 = 0.13
projected_hybrid : 2/15 = 0.13
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The optimized state retained only about a quarter of the correct answers preserved by raw context. The context saving looked excellent: &lt;code&gt;94-99%&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;That was not optimization. It was deletion of needed information.&lt;/p&gt;

&lt;p&gt;After adding session timestamps to dialogue lines, the raw baseline improved:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;raw              : 0.80
projected_hybrid : 0.20
retained_vs_raw  : 0.25
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So the issue did not disappear with a better baseline. It became clearer that the projected state was not preserving the required memory type.&lt;/p&gt;

&lt;p&gt;There is an important methodological caveat: the early &lt;code&gt;0.13&lt;/code&gt; used a strict substring/token checker. Such a checker can miss semantically correct date answers. For example, the gold answer may be &lt;code&gt;the sunday before 25 May 2023&lt;/code&gt;, while the model answers &lt;code&gt;20 May 2023&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;But the gap was too large to dismiss as a checker artifact: raw had 8 correct answers, projected had 2.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. What Failed
&lt;/h2&gt;

&lt;p&gt;After LoCoMo, three failures became visible.&lt;/p&gt;

&lt;h3&gt;
  
  
  5.1 Static Facts Are Not Episodic Memory
&lt;/h3&gt;

&lt;p&gt;The initial state preserved exact facts well:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;codes;&lt;/li&gt;
&lt;li&gt;paths;&lt;/li&gt;
&lt;li&gt;IDs;&lt;/li&gt;
&lt;li&gt;strict dates;&lt;/li&gt;
&lt;li&gt;explicit user decisions;&lt;/li&gt;
&lt;li&gt;preferences;&lt;/li&gt;
&lt;li&gt;constraints.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But it poorly preserved:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;event sequence;&lt;/li&gt;
&lt;li&gt;relative dates;&lt;/li&gt;
&lt;li&gt;"yesterday" relative to a session date;&lt;/li&gt;
&lt;li&gt;shared interests;&lt;/li&gt;
&lt;li&gt;multi-hop links;&lt;/li&gt;
&lt;li&gt;evidence-neighbor context.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;LoCoMo asked for episodic memory: who did what, when, where, and how it connects across sessions.&lt;/p&gt;

&lt;h3&gt;
  
  
  5.2 Lexical Retrieval Was Not Enough
&lt;/h3&gt;

&lt;p&gt;I also tested a retrieval-style approach: instead of compressing everything into one state, select relevant chunks for each question.&lt;/p&gt;

&lt;p&gt;Result:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;append_full      : 32/60 = 0.533, query saving 45.89%
append_retrieved : 25/60 = 0.417, query saving 90.73%
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;append_retrieved&lt;/code&gt; looked better economically, but quality dropped. The reason is simple: lexical overlap fails when the question and the evidence do not share words.&lt;/p&gt;

&lt;p&gt;Typical failures:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"What did Caroline research?" did not retrieve &lt;code&gt;adoption agencies&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;a shared-destress question did not retrieve &lt;code&gt;dance&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;a martial-arts question did not retrieve &lt;code&gt;Kickboxing, Taekwondo&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;temporal and multi-hop questions broke more often.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  5.3 Dates Were a Separate Failure Class
&lt;/h3&gt;

&lt;p&gt;At 200 QA, the main gap localized to the temporal category:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;raw         : 126/200 = 0.63
append-only : 111/200 = 0.56
retention   : 88%

by category:
multi-hop   : 46 / 45   (~98%)
temporal    : 58 / 46   (~79%)
open-domain : 18 / 16
single-hop  : 4 / 4
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This distinction mattered. The memory was not uniformly bad. Temporal anchors were bad.&lt;/p&gt;

&lt;p&gt;When the diagnosis is precise, the fix can be precise.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Ladder of Attempts
&lt;/h2&gt;

&lt;p&gt;There was no direct jump from the first failure to the final result. Several approaches died for specific reasons.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Approach&lt;/th&gt;
&lt;th&gt;Result&lt;/th&gt;
&lt;th&gt;Why it failed or narrowed&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;text compression / projected state&lt;/td&gt;
&lt;td&gt;&lt;code&gt;2/15 = 0.13&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;kept exact facts, lost episodic memory&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MinHash-style lexical retrieval&lt;/td&gt;
&lt;td&gt;&lt;code&gt;3/15 = 0.20&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;lexical overlap missed paraphrase; evidence hit about &lt;code&gt;42%&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;evidence oracle&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;0.30&lt;/code&gt; under strict checker&lt;/td&gt;
&lt;td&gt;even exact evidence lines did not guarantee date-equivalent substring match&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;recode-to-notation smoke&lt;/td&gt;
&lt;td&gt;&lt;code&gt;3/3 = 1.00&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;small smoke was too optimistic&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;recode-to-notation larger slice&lt;/td&gt;
&lt;td&gt;unstable: &lt;code&gt;0.35&lt;/code&gt; in one slice, &lt;code&gt;0.70&lt;/code&gt; vs raw &lt;code&gt;0.75&lt;/code&gt; under LLM judge in another&lt;/td&gt;
&lt;td&gt;interesting signal, not stable enough&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;append-only without date-guard&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;111/200 = 0.56&lt;/code&gt;, retention &lt;code&gt;88%&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;most loss concentrated in temporal questions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;append-only + date-guard&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;94% retention&lt;/code&gt;, &lt;code&gt;60% per-query saving&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;first narrow result that survived scale better&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;This table is the real research story. The useful mechanism was not guessed. It survived because prettier mechanisms died first.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. What Survived
&lt;/h2&gt;

&lt;p&gt;The surviving design had two constraints.&lt;/p&gt;

&lt;p&gt;First: do not re-summarize the whole state.&lt;/p&gt;

&lt;p&gt;Second: protect exact fields deterministically.&lt;/p&gt;

&lt;p&gt;The append-only rule is simple:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Compress only the new exchange.&lt;/li&gt;
&lt;li&gt;Freeze the compressed chunk.&lt;/li&gt;
&lt;li&gt;Append it to memory.&lt;/li&gt;
&lt;li&gt;Never re-compress old chunks.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Why this matters: if old facts repeatedly pass through a compressor, small losses accumulate. If each exchange is compressed once and then frozen, loss cannot compound in the same way.&lt;/p&gt;

&lt;p&gt;Early append-only results looked even better than raw: &lt;code&gt;103% retention&lt;/code&gt; on 6 conversations. That was a small-sample artifact. At 200 QA, retention fell to &lt;code&gt;88%&lt;/code&gt;. This was useful: it showed that the architecture helped, but the temporal gap was still real.&lt;/p&gt;

&lt;h2&gt;
  
  
  8. Date-Guard
&lt;/h2&gt;

&lt;p&gt;The fix was deterministic date protection.&lt;/p&gt;

&lt;p&gt;The idea:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;extract absolute time expressions;&lt;/li&gt;
&lt;li&gt;extract relative time expressions;&lt;/li&gt;
&lt;li&gt;attach session date to relative expressions;&lt;/li&gt;
&lt;li&gt;append these time anchors to the compressed state.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This does not ask the LLM to be careful with dates. It removes the choice. The compressor can shorten prose, but date anchors survive as explicit fields.&lt;/p&gt;

&lt;p&gt;Result on the 200 QA setup:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;without guard:
retention        88%
temporal cat     79%
per-query saving 45%

with date-guard:
retention        94%
temporal cat     96%
per-query saving 60%
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Saving improved because the prose compressor could become more aggressive once dates were protected separately.&lt;/p&gt;

&lt;p&gt;Final honest number:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;append-only + date-guard: 94% retention, 60% per-query saving
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is not solved memory. It is not a universal alternative to LLM context. It is a narrow result: append-only compression plus deterministic protection for exact fields.&lt;/p&gt;

&lt;h2&gt;
  
  
  9. Cost and Scope
&lt;/h2&gt;

&lt;p&gt;This mechanism is not useful for short chats.&lt;/p&gt;

&lt;p&gt;On short sessions, fixed overhead can exceed savings:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;0 added noise exchanges: projected is worse than raw
1 added noise exchange : projected is still usually worse
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Another important distinction: context-window saving and API-cost saving are not the same metric.&lt;/p&gt;

&lt;p&gt;One real-provider smoke test showed:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;context_window_saved_pct_vs_raw_estimate: 14.61
provider_total_saved_pct_vs_raw: -2.83
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The final prompt was smaller, but total provider cost was worse because preparation added calls.&lt;/p&gt;

&lt;p&gt;For append-only full on 60 QA:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;query_saved_pct_vs_raw   : 45.89%
product_saved_pct_vs_raw : 23.92%
break_even_queries       : 28.72
net_saved_pct_at_200     : 39.30%
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So the mechanism is only interesting for long sessions where setup cost can be amortized.&lt;/p&gt;

&lt;h2&gt;
  
  
  10. Lessons
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Lesson 1: Synthetic eval is not evidence by itself
&lt;/h3&gt;

&lt;p&gt;Synthetic eval is useful for regression. It is weak evidence for generalization.&lt;/p&gt;

&lt;p&gt;If the author writes the eval around their own mechanism, the system can pass by matching the author's blind spots.&lt;/p&gt;

&lt;h3&gt;
  
  
  Lesson 2: Compression ratio is a vanity metric without retention
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;99% context saving&lt;/code&gt; is meaningless if answer retention collapses.&lt;/p&gt;

&lt;p&gt;The key metric is not "how much did we delete?" but "how much correct behavior survived?"&lt;/p&gt;

&lt;h3&gt;
  
  
  Lesson 3: Memory is not one thing
&lt;/h3&gt;

&lt;p&gt;Exact facts, preferences, episodic events, temporal anchors, multi-hop relations and source evidence are different memory types.&lt;/p&gt;

&lt;p&gt;A compressor can preserve one and destroy another.&lt;/p&gt;

&lt;h3&gt;
  
  
  Lesson 4: Deterministic guards matter
&lt;/h3&gt;

&lt;p&gt;Some fields should not be entrusted to a generative summary:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;dates;&lt;/li&gt;
&lt;li&gt;amounts;&lt;/li&gt;
&lt;li&gt;IDs;&lt;/li&gt;
&lt;li&gt;codes;&lt;/li&gt;
&lt;li&gt;names;&lt;/li&gt;
&lt;li&gt;statuses;&lt;/li&gt;
&lt;li&gt;paths;&lt;/li&gt;
&lt;li&gt;constraints.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If losing a field breaks correctness, extract it deterministically and preserve it explicitly.&lt;/p&gt;

&lt;h3&gt;
  
  
  Lesson 5: Small samples lie
&lt;/h3&gt;

&lt;p&gt;The &lt;code&gt;103% retention&lt;/code&gt; result on 6 conversations looked exciting. At 200 QA it became &lt;code&gt;88%&lt;/code&gt;. The useful signal was not the optimistic number, but the category breakdown showing where the loss happened.&lt;/p&gt;

&lt;h2&gt;
  
  
  11. Limitations
&lt;/h2&gt;

&lt;p&gt;This is not an academic benchmark paper.&lt;/p&gt;

&lt;p&gt;Limitations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;one main external conversational-memory benchmark;&lt;/li&gt;
&lt;li&gt;small and medium QA slices before the 200-QA run;&lt;/li&gt;
&lt;li&gt;no statistical significance analysis;&lt;/li&gt;
&lt;li&gt;some early measurements used strict substring checking;&lt;/li&gt;
&lt;li&gt;LLM-judge checks reduce one problem but introduce another;&lt;/li&gt;
&lt;li&gt;final &lt;code&gt;94%/60%&lt;/code&gt; should be published with a compact appendix table before being treated as a stable claim.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The result is best read as an engineering research note: a failed broad claim, a localized diagnosis, and a narrower mechanism that survived better tests.&lt;/p&gt;

&lt;h2&gt;
  
  
  12. Conclusion
&lt;/h2&gt;

&lt;p&gt;The local eval said:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;30/30
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The external benchmark said:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;0.13
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The final surviving mechanism said:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;94% retention / 60% per-query saving
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The important result is not that this "solves memory". It does not.&lt;/p&gt;

&lt;p&gt;The important result is that an external benchmark forced the system to stop lying through its own eval. The useful architecture appeared only after the original success story failed.&lt;/p&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;LoCoMo: "Evaluating Very Long-Term Conversational Memory of LLM Agents" — &lt;a href="https://arxiv.org/abs/2402.17753" rel="noopener noreferrer"&gt;https://arxiv.org/abs/2402.17753&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Lost in the Middle: "How Language Models Use Long Contexts" — &lt;a href="https://arxiv.org/abs/2307.03172" rel="noopener noreferrer"&gt;https://arxiv.org/abs/2307.03172&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;"Investigating Data Contamination in Modern Benchmarks for Large Language Models" — &lt;a href="https://arxiv.org/abs/2311.09783" rel="noopener noreferrer"&gt;https://arxiv.org/abs/2311.09783&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;"Data Contamination Quiz: A Tool to Detect and Estimate Contamination in Large Language Models" — &lt;a href="https://arxiv.org/abs/2311.06233" rel="noopener noreferrer"&gt;https://arxiv.org/abs/2311.06233&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>machinelearning</category>
      <category>evalution</category>
    </item>
    <item>
      <title>Why AI Needs an External Cognitive Layer Beyond Memory</title>
      <dc:creator>Oleksander</dc:creator>
      <pubDate>Thu, 02 Apr 2026 16:30:15 +0000</pubDate>
      <link>https://dev.to/teolex2020/why-ai-needs-an-external-cognitive-layer-beyond-memory-3f55</link>
      <guid>https://dev.to/teolex2020/why-ai-needs-an-external-cognitive-layer-beyond-memory-3f55</guid>
      <description>&lt;h1&gt;
  
  
  Why AI Needs an External Cognitive Layer Beyond Memory
&lt;/h1&gt;

&lt;p&gt;Most AI agents today are still built around a thin pattern:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a large language model,&lt;/li&gt;
&lt;li&gt;a prompt,&lt;/li&gt;
&lt;li&gt;a tool loop,&lt;/li&gt;
&lt;li&gt;and some form of memory or retrieval.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That stack can look impressive in demos, but it breaks down once the agent needs continuity, specialization, self-consistency, and long-lived behavioral control.&lt;/p&gt;

&lt;p&gt;Memory alone is not enough.&lt;/p&gt;

&lt;p&gt;If an agent only stores past records, it can remember what happened. It still cannot reliably:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;form stable beliefs,&lt;/li&gt;
&lt;li&gt;build concepts over time,&lt;/li&gt;
&lt;li&gt;learn causal structure,&lt;/li&gt;
&lt;li&gt;accumulate policies,&lt;/li&gt;
&lt;li&gt;generate internal pressure,&lt;/li&gt;
&lt;li&gt;anticipate future outcomes,&lt;/li&gt;
&lt;li&gt;detect epistemic gaps,&lt;/li&gt;
&lt;li&gt;or regulate its own mode of operation.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is the gap we have been exploring in Aura.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Core Thesis
&lt;/h2&gt;

&lt;p&gt;AI systems need an external cognitive layer that lives outside model weights.&lt;/p&gt;

&lt;p&gt;Not just a vector database.&lt;br&gt;
Not just a chat history.&lt;br&gt;
Not just a memory API.&lt;/p&gt;

&lt;p&gt;A real cognitive layer should be able to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;preserve continuity across sessions,&lt;/li&gt;
&lt;li&gt;accumulate knowledge in structured form,&lt;/li&gt;
&lt;li&gt;survive model upgrades,&lt;/li&gt;
&lt;li&gt;support domain specialization,&lt;/li&gt;
&lt;li&gt;remain inspectable and governed,&lt;/li&gt;
&lt;li&gt;and shape agent behavior over time.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This matters because current LLMs are powerful, but they are still weak at stable long-horizon cognition. They are excellent inference engines. They are not yet sufficient as complete cognitive architectures.&lt;/p&gt;

&lt;h2&gt;
  
  
  From Memory to Cognition
&lt;/h2&gt;

&lt;p&gt;In Aura, the architecture has gradually moved beyond simple memory.&lt;/p&gt;

&lt;p&gt;The working progression is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Record&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Belief&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Concept&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Causal&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Policy&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That already changes the role of memory.&lt;/p&gt;

&lt;p&gt;The system is no longer just storing facts. It is organizing experience into a structured cognitive state.&lt;/p&gt;

&lt;p&gt;And once that structure exists, new layers become possible.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Next Four Cognitive Functions
&lt;/h2&gt;

&lt;p&gt;The recent evolution of the system can be summarized in four steps:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Want
&lt;/h3&gt;

&lt;p&gt;The system should not only react to prompts.&lt;/p&gt;

&lt;p&gt;It should also detect internal tensions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;unresolved policy pressure,&lt;/li&gt;
&lt;li&gt;contradictions,&lt;/li&gt;
&lt;li&gt;unstable structure,&lt;/li&gt;
&lt;li&gt;pending cognitive obligations.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those tensions can flow into drives, goals, and imperative-like internal pressure.&lt;/p&gt;

&lt;p&gt;That is the beginning of motivation.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Expect
&lt;/h3&gt;

&lt;p&gt;A cognitive system should not only remember the past.&lt;/p&gt;

&lt;p&gt;It should form expectations about what should happen next.&lt;/p&gt;

&lt;p&gt;From stable causal structure, it can produce predictions.&lt;br&gt;
From mismatches between expectation and observation, it can produce surprise.&lt;/p&gt;

&lt;p&gt;That turns cognition from retrospective to anticipatory.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Wonder
&lt;/h3&gt;

&lt;p&gt;A capable system should not only repair contradictions.&lt;/p&gt;

&lt;p&gt;It should also notice what it does not know.&lt;/p&gt;

&lt;p&gt;Epistemic gaps matter:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;weakly grounded entities,&lt;/li&gt;
&lt;li&gt;missing causal mechanisms,&lt;/li&gt;
&lt;li&gt;underspecified policy dependencies,&lt;/li&gt;
&lt;li&gt;repeated blind spots,&lt;/li&gt;
&lt;li&gt;ambiguous concept boundaries.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is the beginning of curiosity.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Regulate
&lt;/h3&gt;

&lt;p&gt;A cognitive system should not always behave in exactly the same mode.&lt;/p&gt;

&lt;p&gt;Under pressure, it may need to become more conservative.&lt;br&gt;
Under stability, it may be able to explore.&lt;/p&gt;

&lt;p&gt;This is not about emotional theater.&lt;br&gt;
It is about regulation.&lt;/p&gt;

&lt;p&gt;A global modulation layer can shape:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;drive thresholds,&lt;/li&gt;
&lt;li&gt;curiosity thresholds,&lt;/li&gt;
&lt;li&gt;exploration budget,&lt;/li&gt;
&lt;li&gt;and behavioral selectivity.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is the beginning of self-regulation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why This Should Live Outside the Model
&lt;/h2&gt;

&lt;p&gt;This is the most important architectural point.&lt;/p&gt;

&lt;p&gt;If all cognition lives only inside model weights, you lose too much:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;portability,&lt;/li&gt;
&lt;li&gt;auditability,&lt;/li&gt;
&lt;li&gt;versioning,&lt;/li&gt;
&lt;li&gt;organization-level control,&lt;/li&gt;
&lt;li&gt;inspectability,&lt;/li&gt;
&lt;li&gt;and long-lived continuity across changing model generations.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;An external cognitive layer can survive:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;model upgrades,&lt;/li&gt;
&lt;li&gt;shell changes,&lt;/li&gt;
&lt;li&gt;deployment changes,&lt;/li&gt;
&lt;li&gt;domain swaps,&lt;/li&gt;
&lt;li&gt;and organizational adaptation.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That makes it more durable than any single model interface.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why This Matters Commercially
&lt;/h2&gt;

&lt;p&gt;This is not only a research direction.&lt;br&gt;
It is also a product direction.&lt;/p&gt;

&lt;p&gt;A governed external cognitive layer enables:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;specialist cognitive bases,&lt;/li&gt;
&lt;li&gt;organization-specific overlays,&lt;/li&gt;
&lt;li&gt;persistent agent continuity,&lt;/li&gt;
&lt;li&gt;safer multi-step behavior,&lt;/li&gt;
&lt;li&gt;and explainable adaptation without retraining.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That creates a path beyond generic chat agents.&lt;/p&gt;

&lt;p&gt;Instead of selling only an agent, you can sell:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a cognitive substrate,&lt;/li&gt;
&lt;li&gt;a specialist module,&lt;/li&gt;
&lt;li&gt;and an organization layer that persists over time.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why This Matters Even If Model Architectures Change
&lt;/h2&gt;

&lt;p&gt;A common objection is:&lt;/p&gt;

&lt;p&gt;What if future models already include better internal cognition?&lt;/p&gt;

&lt;p&gt;That does not remove the need for an external layer.&lt;/p&gt;

&lt;p&gt;Even if models become far more capable, organizations will still need:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;governance,&lt;/li&gt;
&lt;li&gt;portability,&lt;/li&gt;
&lt;li&gt;ownership,&lt;/li&gt;
&lt;li&gt;rollback,&lt;/li&gt;
&lt;li&gt;specialist control,&lt;/li&gt;
&lt;li&gt;and cognition that survives vendor changes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So the long-term bet is not:&lt;/p&gt;

&lt;p&gt;"models will stay weak."&lt;/p&gt;

&lt;p&gt;The better bet is:&lt;/p&gt;

&lt;p&gt;"portable, governed cognition will still matter even when models get stronger."&lt;/p&gt;

&lt;h2&gt;
  
  
  The Direction
&lt;/h2&gt;

&lt;p&gt;The future of agent systems is unlikely to be:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;model only,&lt;/li&gt;
&lt;li&gt;prompt only,&lt;/li&gt;
&lt;li&gt;or memory only.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It will likely require a distinct cognitive layer that can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;accumulate structured knowledge,&lt;/li&gt;
&lt;li&gt;generate internal motivational pressure,&lt;/li&gt;
&lt;li&gt;anticipate,&lt;/li&gt;
&lt;li&gt;explore,&lt;/li&gt;
&lt;li&gt;regulate,&lt;/li&gt;
&lt;li&gt;and remain externally governed.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is the direction we think is worth building toward.&lt;/p&gt;

&lt;p&gt;Not just better memory for AI.&lt;/p&gt;

&lt;p&gt;A real cognitive layer beyond memory.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;I am currently building and testing this cognitive architecture in a closed environment. If you are an AI architect, researcher, or founder hitting the limits of RAG and standard agent loops, my DMs are open. I’d love to compare notes on the future of autonomous cognition.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>softwareengineering</category>
      <category>architecture</category>
      <category>llm</category>
    </item>
    <item>
      <title>Pennsylvania State found why AI memory fails across models. AuraSDK doesn't have this problem.</title>
      <dc:creator>Oleksander</dc:creator>
      <pubDate>Fri, 27 Mar 2026 16:52:05 +0000</pubDate>
      <link>https://dev.to/teolex2020/pennsylvania-state-found-why-ai-memory-fails-across-models-aurasdk-doesnt-have-this-problem-579</link>
      <guid>https://dev.to/teolex2020/pennsylvania-state-found-why-ai-memory-fails-across-models-aurasdk-doesnt-have-this-problem-579</guid>
      <description>&lt;p&gt;Pennsylvania State University just published a paper that exposes a structural flaw in how most AI agent memory systems work.&lt;/p&gt;

&lt;p&gt;The paper is called &lt;a href="https://arxiv.org/abs/2603.23234" rel="noopener noreferrer"&gt;MemCollab: Cross-Agent Memory Collaboration via Contrastive Trajectory Distillation&lt;/a&gt;. The findings are uncomfortable if you're building agent memory the conventional way.&lt;/p&gt;

&lt;h2&gt;
  
  
  The flaw
&lt;/h2&gt;

&lt;p&gt;Most agent memory systems work like this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Model solves a problem&lt;/li&gt;
&lt;li&gt;Memory stores the reasoning trace — what the model did, how it got there&lt;/li&gt;
&lt;li&gt;Model retrieves that memory later and performs better&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The assumption buried inside this design: &lt;em&gt;the stored knowledge is about the task, not about the model that solved it.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Pennsylvania State tested whether that assumption holds.&lt;/p&gt;

&lt;p&gt;They gave a 7B model's memory to a 32B model. &lt;strong&gt;MATH500 dropped from 63.8% to 50.6%. HumanEval dropped from 68.3% to 34.1%.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Then they gave the 32B model's memory to the 7B model. &lt;strong&gt;Performance dropped again. Both directions failed. Both fell below the zero-memory baseline.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Giving a model someone else's memory made it perform worse than having no memory at all.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this happens
&lt;/h2&gt;

&lt;p&gt;A model's reasoning traces don't just capture what the correct answer required. They capture &lt;em&gt;how that specific model thinks&lt;/em&gt; — its preferred solving strategies, its heuristic shortcuts, its stylistic patterns.&lt;/p&gt;

&lt;p&gt;Memory distilled from those traces encodes the model's reasoning personality alongside the actual task knowledge. When a different model retrieves that memory, it gets handed instructions optimized for a completely different cognitive architecture. The guidance actively interferes.&lt;/p&gt;

&lt;h2&gt;
  
  
  What MemCollab does
&lt;/h2&gt;

&lt;p&gt;MemCollab fixes this by making memory construction cross-model. Two agents — a smaller and a larger model — independently solve the same problem. One succeeds, one fails. The system contrasts the trajectories and extracts only the abstract invariants:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What reasoning principle was present in the success and violated in the failure?&lt;/li&gt;
&lt;li&gt;What error pattern appeared in the failure that the success avoided?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The extracted memory stores only those rules — not the solution, not the reasoning style, not the model-specific heuristics.&lt;/p&gt;

&lt;p&gt;Results:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Llama 3 8B: MATH500 from 27.4% → 42.4%&lt;/li&gt;
&lt;li&gt;Qwen 7B: MATH500 from 52.2% → 67.0%, HumanEval from 42.7% → 74.4%&lt;/li&gt;
&lt;li&gt;Reasoning turns cut from 3.3 → 1.5 on HumanEval (fewer dead ends)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The deeper insight
&lt;/h2&gt;

&lt;p&gt;The efficiency finding is the one that gets overlooked. MemCollab doesn't just improve accuracy — it makes agents reach correct answers in fewer steps. The contrastive memory isn't adding more guidance. It's stripping out the noise that was making agents explore dead ends repeatedly.&lt;/p&gt;

&lt;p&gt;By encoding &lt;em&gt;what not to do&lt;/em&gt; as explicitly as &lt;em&gt;what to do&lt;/em&gt;, the memory prunes the search space before the agent even starts.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why AuraSDK doesn't have this problem
&lt;/h2&gt;

&lt;p&gt;AuraSDK avoids the contamination problem structurally — by never storing reasoning traces at all.&lt;/p&gt;

&lt;p&gt;When you store something in AuraSDK:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;brain&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;store&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Staging deploy prevented 3 production incidents&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;semantic_type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;fact&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;tags&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;workflow&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;deployment&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You're storing a &lt;strong&gt;claim about the world&lt;/strong&gt;, not a record of how a model reasoned about it. The cognitive layers — Belief, Concept, Causal, Policy — are derived from the content of what was observed, not from the model's processing of it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Record → Belief → Concept → Causal → Policy
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each layer is built deterministically from the one below. Beliefs emerge from clusters of records. Causal patterns emerge from temporal co-occurrence and explicit links. Policy hints emerge from repeated causal patterns. None of this touches model internals.&lt;/p&gt;

&lt;p&gt;The result: &lt;strong&gt;the cognitive layer is model-agnostic by design.&lt;/strong&gt; Swap GPT-4o for Claude, swap Claude for Llama — the stored memory, the belief structure, the causal patterns, the policy hints all remain valid. There's nothing model-specific to contaminate.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two different approaches to the same insight
&lt;/h2&gt;

&lt;p&gt;MemCollab and AuraSDK arrive at the same conclusion from different directions:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Memory that encodes how a model thinks is fragile. Memory that encodes what happened is durable.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;MemCollab fixes contamination after the fact — by contrasting two models' traces and extracting only what survived.&lt;/p&gt;

&lt;p&gt;AuraSDK avoids contamination by construction — by never storing traces in the first place.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;MemCollab&lt;/th&gt;
&lt;th&gt;AuraSDK&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;What's stored&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Abstract reasoning invariants across models&lt;/td&gt;
&lt;td&gt;Claims, facts, relationships&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Requires LLM to build memory&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Yes — two models per problem&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Model-agnostic&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Yes — by contrastive distillation&lt;/td&gt;
&lt;td&gt;Yes — by design&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Works offline&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Fully&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Recall latency&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;LLM-bound&lt;/td&gt;
&lt;td&gt;0.076ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Cognitive layers&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;td&gt;Belief → Concept → Causal → Policy&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Open source&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Research paper&lt;/td&gt;
&lt;td&gt;MIT, ships today&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  What this means for the field
&lt;/h2&gt;

&lt;p&gt;The Pennsylvania State paper validates something important: &lt;strong&gt;the right unit of memory is not a reasoning trace.&lt;/strong&gt; It's the abstract principle that holds regardless of which model does the reasoning.&lt;/p&gt;

&lt;p&gt;AuraSDK takes this further: the right unit of memory is a structured observation about the world — a fact, a decision, a contradiction, a preference — that any model can retrieve and use without being handed someone else's cognitive fingerprint.&lt;/p&gt;

&lt;p&gt;The field is converging on this. The implementations differ. But the core insight is the same.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;aura-memory
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://github.com/teolex2020/AuraSDK" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/p&gt;

</description>
      <category>rust</category>
      <category>ai</category>
      <category>machinelearning</category>
      <category>agents</category>
    </item>
    <item>
      <title>Google's TurboQuant solves half the AI memory problem. Here's the other half.</title>
      <dc:creator>Oleksander</dc:creator>
      <pubDate>Wed, 25 Mar 2026 16:49:10 +0000</pubDate>
      <link>https://dev.to/teolex2020/googles-turboquant-solves-half-the-ai-memory-problem-heres-the-other-half-44if</link>
      <guid>https://dev.to/teolex2020/googles-turboquant-solves-half-the-ai-memory-problem-heres-the-other-half-44if</guid>
      <description>&lt;p&gt;This week Google Research published &lt;a href="https://research.google/blog/turboquant-redefining-ai-efficiency-with-extreme-compression/" rel="noopener noreferrer"&gt;TurboQuant&lt;/a&gt; — a two-stage KV-cache quantization algorithm that achieves 6x memory reduction and 8x attention speedup with zero accuracy loss at 3 bits. No training required.&lt;/p&gt;

&lt;p&gt;It's genuinely impressive engineering. But it's worth being precise about what problem it solves.&lt;/p&gt;

&lt;h2&gt;
  
  
  The two AI memory problems
&lt;/h2&gt;

&lt;p&gt;Most people conflate two distinct problems:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Problem A: memory within a session&lt;/strong&gt;&lt;br&gt;
As context grows, the KV-cache grows. It becomes expensive in RAM and slow in attention computation. TurboQuant solves this — brilliantly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Problem B: memory between sessions&lt;/strong&gt;&lt;br&gt;
When the session ends, the KV-cache is gone. The model starts from zero next time. No memory of past interactions, no accumulated patterns, no structured experience. TurboQuant doesn't touch this.&lt;/p&gt;
&lt;h2&gt;
  
  
  What TurboQuant actually does
&lt;/h2&gt;

&lt;p&gt;TurboQuant is a two-stage pipeline:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;PolarQuant&lt;/strong&gt; — rotates vectors randomly, converts to polar coordinates, quantizes components without needing per-block normalization constants. This eliminates the 1–2 bit overhead that traditional quantization methods carry.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;QJL (Quantized Johnson-Lindenstrauss)&lt;/strong&gt; — encodes residual error with a single sign bit. Zero memory overhead.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Result: 3-bit KV-cache, 6x compression, 8x speedup, zero accuracy degradation on LongBench, Needle-in-a-Haystack, RULER, and ZeroSCROLLS benchmarks.&lt;/p&gt;

&lt;p&gt;This makes long-context inference significantly cheaper and faster. Real value.&lt;/p&gt;
&lt;h2&gt;
  
  
  The gap it leaves open
&lt;/h2&gt;

&lt;p&gt;The moment the session ends — the KV-cache is gone.&lt;/p&gt;

&lt;p&gt;Week 1 with any model: average answers.&lt;br&gt;
Week 4 with any model: still average answers. It forgot everything.&lt;/p&gt;

&lt;p&gt;Fine-tuning costs thousands of dollars and weeks. RAG gives you retrieval, not cognition. Context windows bill per token and still reset.&lt;/p&gt;
&lt;h2&gt;
  
  
  What we built for Problem B
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/teolex2020/AuraSDK" rel="noopener noreferrer"&gt;AuraSDK&lt;/a&gt; is a local cognitive substrate that sits outside model weights.&lt;/p&gt;

&lt;p&gt;It accumulates structured experience across sessions through a 5-layer pipeline:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Record → Belief → Concept → Causal → Policy
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each layer is derived deterministically from the one below — no LLM, no embeddings. Policy hints like "deploy to staging first" aren't written by anyone. They emerge from repeated causal patterns in stored experience.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;aura&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Aura&lt;/span&gt;

&lt;span class="n"&gt;brain&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Aura&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;./agent_memory&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;brain&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;store&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Staging deploy prevented 3 production incidents&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tags&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;workflow&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="n"&gt;brain&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;store&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;User always deploys to staging first&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tags&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;workflow&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

&lt;span class="c1"&gt;# after run_maintenance(), the cognitive stack derives:
&lt;/span&gt;&lt;span class="n"&gt;hints&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;brain&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_surfaced_policy_hints&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="c1"&gt;# → [{"action": "Prefer", "domain": "workflow", "description": "deploy to staging first"}]
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;What v1.5.4 adds:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Autonomous cognitive plasticity — the substrate observes model output and updates itself. No fine-tuning. Full audit trail.&lt;/li&gt;
&lt;li&gt;Salience weighting — what matters persists longer, decays slower&lt;/li&gt;
&lt;li&gt;Contradiction governance — conflicting evidence surfaced explicitly, not averaged silently&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Performance (1,000 records, Ryzen 7, v1.5.4):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Store: 0.91ms&lt;/li&gt;
&lt;li&gt;Recall: 0.076ms (~2,600× faster than Mem0)&lt;/li&gt;
&lt;li&gt;Recall (cached): 1.4µs&lt;/li&gt;
&lt;li&gt;Maintenance cycle: 15ms median&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No API keys. No cloud. No LLM dependency. ~3MB binary. Fully offline. MIT license.&lt;/p&gt;

&lt;h2&gt;
  
  
  The full picture
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;TurboQuant&lt;/th&gt;
&lt;th&gt;AuraSDK&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Problem&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;KV-cache overhead within session&lt;/td&gt;
&lt;td&gt;No memory between sessions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Approach&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Quantization of attention keys/values&lt;/td&gt;
&lt;td&gt;Persistent cognitive substrate&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Scope&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Single inference pass&lt;/td&gt;
&lt;td&gt;Cross-session accumulation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Requires LLM&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Yes (runs inside it)&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Works offline&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;td&gt;Fully&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Open source&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Research paper&lt;/td&gt;
&lt;td&gt;MIT, ships today&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;These are complementary. TurboQuant makes inference cheaper in the moment. AuraSDK makes the model smarter over time.&lt;/p&gt;

&lt;p&gt;The field needs both.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;aura-memory
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://github.com/teolex2020/AuraSDK" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; · &lt;/p&gt;

</description>
      <category>ai</category>
      <category>rust</category>
      <category>machinelearning</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Your AI forgets everything — this layer fixes that without retraining</title>
      <dc:creator>Oleksander</dc:creator>
      <pubDate>Tue, 24 Mar 2026 16:19:10 +0000</pubDate>
      <link>https://dev.to/teolex2020/your-ai-forgets-everything-this-layer-fixes-that-without-retraining-nlf</link>
      <guid>https://dev.to/teolex2020/your-ai-forgets-everything-this-layer-fixes-that-without-retraining-nlf</guid>
      <description>&lt;p&gt;Your AI model forgets everything after every conversation.&lt;/p&gt;

&lt;p&gt;Not because it’s bad — because it has no memory system.&lt;/p&gt;

&lt;p&gt;RAG helps retrieve context.&lt;br&gt;
Fine-tuning helps adjust behavior.&lt;/p&gt;

&lt;p&gt;But neither actually gives your system memory.&lt;/p&gt;

&lt;p&gt;This article shows a different approach:&lt;br&gt;
a cognitive layer that sits outside the model&lt;br&gt;
and gets smarter over time — while the model stays frozen.&lt;/p&gt;


&lt;h2&gt;
  
  
  What the cognitive layer actually does
&lt;/h2&gt;

&lt;p&gt;AuraSDK builds a 5-layer structure from whatever the model and users store:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Record → Belief → Concept → Causal → Policy
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each layer is derived from the one below — without LLM, without embeddings, locally:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Record&lt;/strong&gt;: raw stored fact with trust score, provenance, decay rate&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Belief&lt;/strong&gt;: competing hypotheses about the same claim, epistemically weighted&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Concept&lt;/strong&gt;: stable abstractions over repeated beliefs&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Causal&lt;/strong&gt;: learned cause→effect patterns from co-occurring evidence&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Policy&lt;/strong&gt;: advisory hints — Prefer, Avoid, Warn — that emerge from causal structure&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nothing in layers 2–5 is hand-authored. They emerge from what's stored and observed over time.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;aura&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Aura&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Level&lt;/span&gt;

&lt;span class="n"&gt;brain&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Aura&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;./memory&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;brain&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;enable_full_cognitive_stack&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="n"&gt;brain&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;store&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Staging deploy prevented 3 production incidents&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tags&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;deploy&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="n"&gt;brain&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;store&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Direct prod deploy caused outage in Q3&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tags&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;deploy&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

&lt;span class="c1"&gt;# After maintenance:
&lt;/span&gt;&lt;span class="n"&gt;hints&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;brain&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_surfaced_policy_hints&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="c1"&gt;# → [{"action": "Prefer", "domain": "deploy", "description": "staging before production"}]
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That policy hint was not written by anyone. The causal layer found the pattern. The policy layer surfaced it.&lt;/p&gt;




&lt;h2&gt;
  
  
  v1.5.4: the three things that were missing
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. The substrate now learns from the model's own output
&lt;/h3&gt;

&lt;p&gt;Before v1.5.4, the cognitive layer only knew what you explicitly stored. Now it observes model responses and updates itself.&lt;/p&gt;

&lt;p&gt;Claims are extracted. Confirmations strengthen existing beliefs. Contradictions raise volatility. The substrate evolves from inference — without retraining, without an external API.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;capture&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;brain&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;capture_experience&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;How should we handle this deploy?&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;retrieved_context&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;context_ids&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;model_response&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Always verify staging health checks before pushing to production.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;source&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;model_inference&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;brain&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ingest_experience_batch&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;capture&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="n"&gt;brain&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run_maintenance&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="c1"&gt;# cognitive layer updated — next recall is different
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Safety bounds (non-negotiable):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Generated claims capped at 0.70 confidence — cannot overwrite recorded facts&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;PlasticityMode::Off&lt;/code&gt; by default — nothing changes without explicit opt-in&lt;/li&gt;
&lt;li&gt;Every mutation writes to an audit trail traceable to the prompt that caused it&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;purge_inference_records()&lt;/code&gt; — clean rollback when needed&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;freeze_namespace_plasticity("medical")&lt;/code&gt; — some domains must never adapt from inference&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Recorded facts always win over model inference. Always.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. The substrate now knows what matters
&lt;/h3&gt;

&lt;p&gt;High-frequency recall and high-significance are not the same thing. A trivial fact mentioned 20 times should not outrank a critical decision mentioned once.&lt;/p&gt;

&lt;p&gt;v1.5.4 adds salience weighting:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;brain&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;mark_record_salience&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;record_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;salience&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.9&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# → this record resists decay, ranks higher, gets preserved longer
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Maintenance now also produces bounded reflection summaries: recurring blockers, unresolved tensions, patterns that keep appearing. Not "feelings" — structured synthesis from what's actually stored.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Contradictions are now first-class, not silently averaged
&lt;/h3&gt;

&lt;p&gt;Before: conflicting evidence was weighted and averaged. The conflict was invisible.&lt;/p&gt;

&lt;p&gt;Now:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;clusters&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;brain&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_contradiction_clusters&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;queue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;brain&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_contradiction_review_queue&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Recall explanations carry explicit markers: &lt;em&gt;"this recommendation depends on unresolved evidence."&lt;/em&gt; The operator sees the friction. The user can be told honestly.&lt;/p&gt;




&lt;h2&gt;
  
  
  What else ships in v1.5.4
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Concept persistence&lt;/strong&gt; — concepts used to reset on every restart. Now they survive. The 5-layer stack is actually intact across sessions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Belief reranking active by default&lt;/strong&gt; — in v1.5.3, &lt;code&gt;BeliefRerankMode::Off&lt;/code&gt; was the default. The cognitive stack was engineered but not running. Now it runs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Production integrity&lt;/strong&gt; — startup validation, persistence manifest, concept partition cap for large corpora.&lt;/p&gt;




&lt;h2&gt;
  
  
  Explainability is built in
&lt;/h2&gt;

&lt;p&gt;Every recall decision is traceable:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;explanation&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;brain&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;explain_recall&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;deployment decision&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# → which records matched, why, what belief groups they belong to,
#   what salience contributed, whether unresolved evidence is present
&lt;/span&gt;
&lt;span class="n"&gt;chain&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;brain&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;provenance_chain&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;record_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# → full trace from policy hint back to source records
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is not logging. It is structural explainability derived from the cognitive layer itself.&lt;/p&gt;




&lt;h2&gt;
  
  
  Performance
&lt;/h2&gt;

&lt;p&gt;Benchmarked on 1,000 records, Windows 10 / Ryzen 7:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Operation&lt;/th&gt;
&lt;th&gt;Latency&lt;/th&gt;
&lt;th&gt;vs Mem0&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Store&lt;/td&gt;
&lt;td&gt;0.09 ms&lt;/td&gt;
&lt;td&gt;~same&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Recall&lt;/td&gt;
&lt;td&gt;0.74 ms&lt;/td&gt;
&lt;td&gt;~270× faster&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Recall (cached)&lt;/td&gt;
&lt;td&gt;0.48 µs&lt;/td&gt;
&lt;td&gt;~400,000× faster&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Maintenance&lt;/td&gt;
&lt;td&gt;1.1 ms&lt;/td&gt;
&lt;td&gt;no equivalent&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Mem0 recall requires an embedding API call (~200ms+). AuraSDK recall is pure local computation. No embeddings required. No external service.&lt;/p&gt;




&lt;h2&gt;
  
  
  The positioning in one sentence
&lt;/h2&gt;

&lt;p&gt;AuraSDK is not a vector database. Not a RAG wrapper. Not a fine-tuning platform. Not a generic agent framework.&lt;/p&gt;

&lt;p&gt;It is a governable cognitive substrate for frozen AI models — the layer that makes them smarter, more consistent, and more explainable over time, without touching their weights.&lt;/p&gt;




&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;aura-memory
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Try in browser (no install): &lt;a href="https://colab.research.google.com/github/teolex2020/AuraSDK/blob/main/examples/colab_quickstart.ipynb" rel="noopener noreferrer"&gt;Open in Colab&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;GitHub: &lt;a href="https://github.com/teolex2020/AuraSDK" rel="noopener noreferrer"&gt;teolex2020/AuraSDK&lt;/a&gt; — MIT license, patent pending (US 63/969,703)&lt;/p&gt;

&lt;p&gt;Built in Kyiv, Ukraine 🇺🇦&lt;/p&gt;




&lt;p&gt;What would you build with a model that actually accumulates structured experience over time?&lt;/p&gt;

</description>
      <category>rust</category>
      <category>ai</category>
      <category>machinelearning</category>
      <category>opensource</category>
    </item>
    <item>
      <title>I tested the same AI model against itself. Memory won 4/5.</title>
      <dc:creator>Oleksander</dc:creator>
      <pubDate>Wed, 18 Mar 2026 13:23:16 +0000</pubDate>
      <link>https://dev.to/teolex2020/i-tested-the-same-ai-model-against-itself-memory-won-45-336k</link>
      <guid>https://dev.to/teolex2020/i-tested-the-same-ai-model-against-itself-memory-won-45-336k</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frvutkq5layeg3y2crmtd.JPG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frvutkq5layeg3y2crmtd.JPG" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The experiment
&lt;/h2&gt;

&lt;p&gt;Same model. Same 5 questions. One difference: one side had persistent memory via AuraSDK, the other had none.&lt;/p&gt;

&lt;p&gt;Both sides used Gemini 2.5 Flash-Lite — identical model, identical cost per token.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Result: 4/5 questions won by the side with memory. 48% fewer tokens used.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What the questions tested
&lt;/h2&gt;

&lt;p&gt;Real Python dev scenarios — the kind where generic answers aren't enough:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;"I'm writing a new async function to fetch user orders from the DB. What patterns should I follow?"&lt;/li&gt;
&lt;li&gt;"We need background email sending when an order is completed. How should we implement it?"&lt;/li&gt;
&lt;li&gt;"I'm writing tests for the new payment module. Walk me through the setup."&lt;/li&gt;
&lt;li&gt;"Code review: &lt;code&gt;results = list(db.query(Order).filter(...))&lt;/code&gt; — what's wrong?"&lt;/li&gt;
&lt;li&gt;"The reports endpoint is slow — 3 seconds for 200 users. How do I debug and fix this?"&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;These questions have correct generic answers. But they also have &lt;em&gt;specific&lt;/em&gt; answers — if you know the team's stack.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the model with memory knew
&lt;/h2&gt;

&lt;p&gt;AuraSDK had loaded 15 records of accumulated team knowledge:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;We use arq for task queues, not Celery — switched because Celery was too heavy&lt;/li&gt;
&lt;li&gt;Production incident: missing await on async DB call silently returned a coroutine. 2 hours to debug.&lt;/li&gt;
&lt;li&gt;SQLAlchemy lazy loading doesn't work with async sessions — always use selectinload() or joinedload()&lt;/li&gt;
&lt;li&gt;Code review caught: someone did list(queryset) and loaded 50k rows into memory. Lint rule added.&lt;/li&gt;
&lt;li&gt;N+1 queries found in the user reports endpoint — fixed with a single joined query&lt;/li&gt;
&lt;li&gt;Test setup: pytest + pytest-asyncio, transactions that rollback after each test, coverage must stay above 85%&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What happened question by question
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Q2 — Background email sending:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;With memory (1,307 tokens):&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Use arq — we switched from Celery because it was too heavy for our scale. Define an arq job decorated with &lt;a class="mentioned-user" href="https://dev.to/arq"&gt;@arq&lt;/a&gt;.func, enqueue it when order completes."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Without memory (3,203 tokens):&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Here are several approaches: FastAPI BackgroundTasks for simple cases, Celery for robust production use..."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Same model. One knew the decision. One gave a textbook overview.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q4 — Code review:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;With memory (829 tokens):&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"This is a direct violation of our established practice. We had an incident where this loaded 50,000 rows into memory. A lint rule was added specifically to prevent this."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Without memory (1,604 tokens):&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"This is generally considered an anti-pattern in SQLAlchemy. Here's a breakdown of what's wrong..."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  How AuraSDK works
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;aura&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Aura&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Level&lt;/span&gt;

&lt;span class="n"&gt;brain&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Aura&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;./agent_memory&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;brain&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;enable_full_cognitive_stack&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="c1"&gt;# store team knowledge
&lt;/span&gt;&lt;span class="n"&gt;brain&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;store&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;We use arq, not Celery — switched because Celery was too heavy&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;level&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;Level&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Domain&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tags&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;python&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;dev&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="n"&gt;brain&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;store&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Production incident: list(queryset) loaded 50k rows into memory&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;level&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;Level&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Decisions&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tags&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;python&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;lesson-learned&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

&lt;span class="c1"&gt;# recall before answering — &amp;lt;1ms, no API call
&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;brain&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;recall&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;background email sending&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;token_budget&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# inject into prompt
&lt;/span&gt;&lt;span class="n"&gt;system&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;TEAM CONTEXT:&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="s"&gt;Answer using this context.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No embeddings. No vector database. No LLM calls during learning. Pure local Rust computation.&lt;/p&gt;

&lt;h2&gt;
  
  
  The cognitive pipeline
&lt;/h2&gt;

&lt;p&gt;AuraSDK doesn't just store and retrieve text. Every record goes through 5 layers:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Record → Belief → Concept → Causal → Policy
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Belief&lt;/strong&gt;: groups related observations, resolves contradictions with confidence scores&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Concept&lt;/strong&gt;: discovers stable topic clusters across beliefs&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Causal&lt;/strong&gt;: finds cause-effect patterns from temporal and explicit links&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Policy&lt;/strong&gt;: derives behavioral hints (Prefer / Avoid / Warn) from causal patterns&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;After enough interactions, the system surfaces this automatically:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;hints&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;brain&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_surfaced_policy_hints&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="c1"&gt;# [{"action": "Prefer", "domain": "dev", "description": "use arq over celery for task queues"}]
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nobody wrote that rule. The system derived it from the pattern of stored observations.&lt;/p&gt;

&lt;h2&gt;
  
  
  The token math
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;With memory&lt;/th&gt;
&lt;th&gt;Without memory&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Q1&lt;/td&gt;
&lt;td&gt;1,200 tokens&lt;/td&gt;
&lt;td&gt;1,545 tokens&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Q2&lt;/td&gt;
&lt;td&gt;1,307 tokens&lt;/td&gt;
&lt;td&gt;3,203 tokens&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Q3&lt;/td&gt;
&lt;td&gt;1,923 tokens&lt;/td&gt;
&lt;td&gt;4,067 tokens&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Q4&lt;/td&gt;
&lt;td&gt;829 tokens&lt;/td&gt;
&lt;td&gt;1,604 tokens&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Q5&lt;/td&gt;
&lt;td&gt;1,294 tokens&lt;/td&gt;
&lt;td&gt;2,155 tokens&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Total&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;6,553 tokens&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;12,574 tokens&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;48% fewer tokens. The memory layer doesn't add bloat — it gives the model exactly what it needs.&lt;/p&gt;

&lt;h2&gt;
  
  
  How it compares
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;AuraSDK&lt;/th&gt;
&lt;th&gt;Mem0&lt;/th&gt;
&lt;th&gt;Zep&lt;/th&gt;
&lt;th&gt;Letta&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;LLM required for learning&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;No&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Works offline&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Fully&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Partial&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;With local LLM&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Recall latency&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;&amp;lt;1ms&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;~200ms+&lt;/td&gt;
&lt;td&gt;~200ms&lt;/td&gt;
&lt;td&gt;LLM-bound&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Self-derives behavioral policies&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Yes&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Binary size&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;~3MB&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;~50MB+&lt;/td&gt;
&lt;td&gt;Cloud&lt;/td&gt;
&lt;td&gt;Python pkg&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;aura-memory
python examples/demo.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Open source: github.com/teolex2020/AuraSDK&lt;br&gt;
Patent pending: US 63/969,703&lt;br&gt;
Built in Kyiv, Ukraine.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>gemini</category>
      <category>llm</category>
      <category>python</category>
    </item>
    <item>
      <title>I built a cognitive layer for AI agents that learns without LLM calls</title>
      <dc:creator>Oleksander</dc:creator>
      <pubDate>Tue, 17 Mar 2026 12:19:42 +0000</pubDate>
      <link>https://dev.to/teolex2020/i-built-a-cognitive-layer-for-ai-agents-that-learns-without-llm-calls-33no</link>
      <guid>https://dev.to/teolex2020/i-built-a-cognitive-layer-for-ai-agents-that-learns-without-llm-calls-33no</guid>
      <description>&lt;h2&gt;
  
  
  The problem
&lt;/h2&gt;

&lt;p&gt;Every time your agent starts a conversation, it starts from zero.&lt;/p&gt;

&lt;p&gt;Sure, you can stuff a summary into the system prompt. You can use RAG. You can call Mem0 or Zep.&lt;/p&gt;

&lt;p&gt;But all of these have the same problem: &lt;strong&gt;they need LLM calls to learn&lt;/strong&gt;. To extract facts, to build a user profile, to understand what matters — you're paying per token, adding latency, and depending on a cloud service.&lt;/p&gt;

&lt;p&gt;What if the learning happened locally, automatically, without any LLM involvement?&lt;/p&gt;

&lt;h2&gt;
  
  
  What AuraSDK does differently
&lt;/h2&gt;

&lt;p&gt;AuraSDK is a cognitive layer that runs alongside any LLM. It observes interactions and — without any LLM calls — builds up a structured understanding of patterns, causes, and behavioral rules.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;aura&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Aura&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Level&lt;/span&gt;

&lt;span class="n"&gt;brain&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Aura&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;./agent_memory&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;brain&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;enable_full_cognitive_stack&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="c1"&gt;# store what happens
&lt;/span&gt;&lt;span class="n"&gt;brain&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;store&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;User always deploys to staging first&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;level&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;Level&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Domain&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tags&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;workflow&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="n"&gt;brain&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;store&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Staging deploy prevented 3 production incidents&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;level&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;Level&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Domain&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tags&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;workflow&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

&lt;span class="c1"&gt;# sub-millisecond recall — inject into any LLM prompt
&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;brain&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;recall&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;deployment decision&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# after enough interactions, the system derives this on its own:
&lt;/span&gt;&lt;span class="n"&gt;hints&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;brain&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_surfaced_policy_hints&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="c1"&gt;# [{"action": "Prefer", "domain": "workflow", "description": "deploy to staging first"}]
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nobody wrote that policy rule. The system derived it from the pattern of stored observations.&lt;/p&gt;

&lt;h2&gt;
  
  
  The cognitive pipeline
&lt;/h2&gt;

&lt;p&gt;AuraSDK processes every stored record through 5 layers:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Record → Belief → Concept → Causal → Policy
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each layer is bounded and deterministic:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Belief&lt;/strong&gt;: groups related observations, resolves contradictions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Concept&lt;/strong&gt;: discovers stable topic clusters across beliefs&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Causal&lt;/strong&gt;: finds cause-effect patterns from temporal and explicit links&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Policy&lt;/strong&gt;: derives behavioral hints (Prefer / Avoid / Warn) from causal patterns&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The entire pipeline runs in milliseconds. No LLM. No cloud. No embeddings required.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it in 60 seconds
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;aura-memory
python examples/demo.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;Phase 4 - Recall in action

  Query: "deployment decision"  [0.29ms]
    1. Staging deploy prevented database migration failure
    2. Direct prod deploy skipped staging -- caused data loss

  Query: "code review"  [0.18ms]
    1. Code review caught SQL injection before merge
    2. Code review found performance regression early
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;5 learning cycles completed in 16ms. Recall at 0.29ms.&lt;/p&gt;

&lt;h2&gt;
  
  
  How it compares
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;AuraSDK&lt;/th&gt;
&lt;th&gt;Mem0&lt;/th&gt;
&lt;th&gt;Zep&lt;/th&gt;
&lt;th&gt;Letta&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;LLM required for learning&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;No&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Works offline&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Fully&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Partial&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;With local LLM&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Recall latency&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;&amp;lt;1ms&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;~200ms+&lt;/td&gt;
&lt;td&gt;~200ms&lt;/td&gt;
&lt;td&gt;LLM-bound&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Self-derives behavioral policies&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Yes&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Binary size&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;~3MB&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;~50MB+&lt;/td&gt;
&lt;td&gt;Cloud&lt;/td&gt;
&lt;td&gt;Python pkg&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  What's new in v1.5.3
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Full 5-layer cognitive pipeline active by default&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;enable_full_cognitive_stack()&lt;/code&gt; — one call to activate everything&lt;/li&gt;
&lt;li&gt;Decay now driven by memory level, not manual type labels&lt;/li&gt;
&lt;li&gt;Policy hints now work with explicit causal links (&lt;code&gt;link_records()&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;demo.py&lt;/code&gt; — see it working in 60 seconds&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Built in Rust, from Kyiv
&lt;/h2&gt;

&lt;p&gt;Pure Rust core. No Python dependencies for the engine. Patent pending (US 63/969,703).&lt;/p&gt;

&lt;p&gt;Open source: github.com/teolex2020/AuraSDK&lt;br&gt;
Install: pip install aura-memory&lt;br&gt;
Web: aurasdk.dev&lt;/p&gt;

&lt;p&gt;If you're building AI agents and want deterministic, explainable, offline-capable memory — give it a try and tell me what you think.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>memory</category>
      <category>rust</category>
      <category>python</category>
    </item>
    <item>
      <title>10x Faster Recall + Memory That Evolves: Aura v1.3 for AI Agents</title>
      <dc:creator>Oleksander</dc:creator>
      <pubDate>Thu, 05 Mar 2026 09:42:48 +0000</pubDate>
      <link>https://dev.to/teolex2020/10x-faster-recall-memory-that-evolves-aura-v13-for-ai-agents-44ln</link>
      <guid>https://dev.to/teolex2020/10x-faster-recall-memory-that-evolves-aura-v13-for-ai-agents-44ln</guid>
      <description>&lt;h3&gt;
  
  
  The Problem
&lt;/h3&gt;

&lt;p&gt;Every AI agent framework has the same weakness: memory is an afterthought. Most solutions dump everything into a vector database and hope cosine similarity finds the right context. This works until it doesn't — when your agent needs to know &lt;em&gt;when&lt;/em&gt; it learned something, &lt;em&gt;what changed&lt;/em&gt; since last week, or &lt;em&gt;which&lt;/em&gt; memories are actually useful.&lt;/p&gt;

&lt;h3&gt;
  
  
  What Aura Does Differently
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/teolex2020/AuraSDK" rel="noopener noreferrer"&gt;Aura&lt;/a&gt; is a pure-Rust cognitive memory engine. Instead of embeddings + vector search, it uses:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;SDR Encoding&lt;/strong&gt; (Sparse Distributed Representations) — biologically-inspired, noise-tolerant&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;RRF Fusion&lt;/strong&gt; — 4 parallel ranking signals (SDR similarity, MinHash, Tag Jaccard, optional embeddings)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Temporal Decay&lt;/strong&gt; — memories naturally fade unless reinforced&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Graph Connections&lt;/strong&gt; — associative, causal, and co-activation links between memories&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The result: sub-millisecond recall, ~3MB binary, zero external dependencies.&lt;/p&gt;

&lt;h3&gt;
  
  
  10x Recall Speedup (v1.3.1)
&lt;/h3&gt;

&lt;p&gt;Every &lt;code&gt;recall_structured&lt;/code&gt; call was cloning ALL records into a new HashMap to filter by namespace. At 10K records, that's 94ms of pure waste.&lt;/p&gt;

&lt;p&gt;Fix: pass the original HashMap through the pipeline. Each signal collector filters by namespace inline with a cheap &lt;code&gt;contains()&lt;/code&gt; check. Plus a new &lt;code&gt;StructuredRecallCache&lt;/code&gt; for repeated queries.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Records&lt;/th&gt;
&lt;th&gt;Before&lt;/th&gt;
&lt;th&gt;After&lt;/th&gt;
&lt;th&gt;Speedup&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1K&lt;/td&gt;
&lt;td&gt;15 ms&lt;/td&gt;
&lt;td&gt;2.6 ms&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;5.8x&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5K&lt;/td&gt;
&lt;td&gt;58 ms&lt;/td&gt;
&lt;td&gt;5.1 ms&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;11.4x&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10K&lt;/td&gt;
&lt;td&gt;94 ms&lt;/td&gt;
&lt;td&gt;8.6 ms&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;10.9x&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Warm recall (cache hit): &lt;strong&gt;~0.07 ms&lt;/strong&gt; — constant time regardless of record count.&lt;/p&gt;

&lt;h3&gt;
  
  
  What's New in v1.3.0
&lt;/h3&gt;

&lt;h4&gt;
  
  
  1. Temporal Queries
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;aura&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Aura&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;

&lt;span class="n"&gt;brain&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Aura&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;./memory&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;brain&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;store&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;User prefers dark mode&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;level&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Domain&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# ... days pass, user changes preference ...
&lt;/span&gt;&lt;span class="n"&gt;brain&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;supersede&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;old_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;User prefers light mode&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# What did we know last week?
&lt;/span&gt;&lt;span class="n"&gt;old_memories&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;brain&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;recall_at&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user preferences&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;last_week_timestamp&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;recall_at(query, timestamp)&lt;/code&gt; filters records by creation time. &lt;code&gt;history(record_id)&lt;/code&gt; shows the full access/strength timeline. This is how you debug agent behavior — "why did it do X on Tuesday?"&lt;/p&gt;

&lt;h4&gt;
  
  
  2. LangChain Drop-In
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;aura&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Aura&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;aura.langchain&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;AuraMemory&lt;/span&gt;

&lt;span class="n"&gt;brain&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Aura&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;./memory&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;memory&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;AuraMemory&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;brain&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Works with any LangChain chain
&lt;/span&gt;&lt;span class="n"&gt;chain&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ConversationChain&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;llm&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;llm&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;memory&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;memory&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;AuraChatMessageHistory&lt;/code&gt; implements the full &lt;code&gt;BaseChatMessageHistory&lt;/code&gt; interface. &lt;code&gt;AuraMemory&lt;/code&gt; is duck-type compatible with &lt;code&gt;ConversationBufferMemory&lt;/code&gt;. No changes to your existing code.&lt;/p&gt;

&lt;h4&gt;
  
  
  3. Adaptive Recall
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# After recall, tell Aura what was useful
&lt;/span&gt;&lt;span class="n"&gt;results&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;brain&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;recall_structured&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;deployment steps&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;top_k&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;score&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;record&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;results&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;was_helpful&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;record&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;brain&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;feedback&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;record&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;useful&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;   &lt;span class="c1"&gt;# +0.1 strength
&lt;/span&gt;    &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;brain&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;feedback&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;record&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;useful&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# -0.15 strength
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Over time, noise naturally decays while valuable memories get reinforced. No other memory SDK has this built-in.&lt;/p&gt;

&lt;h4&gt;
  
  
  4. Memory Versioning
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Save state before experiment
&lt;/span&gt;&lt;span class="n"&gt;brain&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;snapshot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;before_refactor&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# ... agent does things ...
&lt;/span&gt;
&lt;span class="c1"&gt;# Something went wrong? Roll back
&lt;/span&gt;&lt;span class="n"&gt;brain&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;rollback&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;before_refactor&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Or compare states
&lt;/span&gt;&lt;span class="n"&gt;diff&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;brain&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;diff&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;before_refactor&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;after_refactor&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Added: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;diff&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;added&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;, Removed: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;diff&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;removed&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  5. Agent-to-Agent Sharing
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Agent A exports relevant context
&lt;/span&gt;&lt;span class="n"&gt;fragment&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;agent_a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;export_context&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user preferences&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;top_k&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Agent B imports it (strength halved, tagged "shared")
&lt;/span&gt;&lt;span class="n"&gt;agent_b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;import_context&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fragment&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The protocol envelope includes version and provenance metadata. Imported records arrive with reduced trust — they need to prove themselves.&lt;/p&gt;

&lt;h4&gt;
  
  
  6. C FFI — Aura as a Platform
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight c"&gt;&lt;code&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;"aura.h"&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;
&lt;span class="n"&gt;AuraHandle&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;h&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;aura_open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"./memory"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;aura_store&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;h&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Remember this"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;aura_recall&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;h&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"what to remember"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"%s&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;aura_free_string&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;aura_close&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;h&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Working examples in &lt;a href="https://github.com/teolex2020/AuraSDK/blob/main/examples/go/main.go" rel="noopener noreferrer"&gt;Go&lt;/a&gt; and &lt;a href="https://github.com/teolex2020/AuraSDK/blob/main/examples/csharp/Program.cs" rel="noopener noreferrer"&gt;C#&lt;/a&gt;. Any language with C FFI can use Aura.&lt;/p&gt;

&lt;h4&gt;
  
  
  7. OpenTelemetry
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight toml"&gt;&lt;code&gt;&lt;span class="nn"&gt;[features]&lt;/span&gt;
&lt;span class="py"&gt;telemetry&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"opentelemetry"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"opentelemetry_sdk"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"opentelemetry-otlp"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"tracing-opentelemetry"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;17 key functions instrumented with &lt;code&gt;#[instrument]&lt;/code&gt; spans. OTLP export to any collector. &lt;a href="https://github.com/teolex2020/AuraSDK/blob/main/examples/grafana_dashboard.json" rel="noopener noreferrer"&gt;Grafana dashboard template&lt;/a&gt; included.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Bug That Took 8 Hours
&lt;/h3&gt;

&lt;p&gt;Fun story: our CI was timing out at 6+ hours. We tried increasing timeouts, switching to release builds, reducing the test matrix. Nothing worked.&lt;/p&gt;

&lt;p&gt;Turns out: &lt;code&gt;Aura&lt;/code&gt; struct didn't have a &lt;code&gt;Drop&lt;/code&gt; implementation. When tests ended without calling &lt;code&gt;close()&lt;/code&gt;, internal file handles wouldn't release. Each test hung for 5 minutes waiting for a timeout that never came. 28 tests x 5 min = CI death.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fix: 9 lines of code.&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;impl&lt;/span&gt; &lt;span class="nb"&gt;Drop&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;Aura&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;drop&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="nf"&gt;.stop_background&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="nf"&gt;.flush&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="py"&gt;.storage&lt;/span&gt;&lt;span class="nf"&gt;.flush&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="py"&gt;.index&lt;/span&gt;&lt;span class="nf"&gt;.save&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now 503 tests pass in 7 minutes. Sometimes the hardest bugs are the simplest ones.&lt;/p&gt;

&lt;h3&gt;
  
  
  Try It
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;aura-memory
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;aura&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Aura&lt;/span&gt;

&lt;span class="n"&gt;brain&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Aura&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;./my_agent_memory&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;brain&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;store&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;User prefers concise answers&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;level&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Identity&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;context&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;brain&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;recall&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;how should I respond?&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# Returns formatted context for your LLM's system prompt
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/teolex2020/AuraSDK" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pypi.org/project/aura-memory/" rel="noopener noreferrer"&gt;PyPI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/teolex2020/AuraSDK/releases/tag/v1.3.1" rel="noopener noreferrer"&gt;Full Changelog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://aurasdk.dev" rel="noopener noreferrer"&gt;Docs&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Star the repo if this is useful. PRs and issues welcome.&lt;/p&gt;

</description>
      <category>rust</category>
      <category>python</category>
      <category>ai</category>
      <category>machinelearning</category>
    </item>
  </channel>
</rss>
