<?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: Himanshu Jha</title>
    <description>The latest articles on DEV Community by Himanshu Jha (@himanshu_jha_de18b7f5726d).</description>
    <link>https://dev.to/himanshu_jha_de18b7f5726d</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%2F4192404%2Fb8906d9e-83a5-4017-ae29-72ad7f717c48.jpg</url>
      <title>DEV Community: Himanshu Jha</title>
      <link>https://dev.to/himanshu_jha_de18b7f5726d</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/himanshu_jha_de18b7f5726d"/>
    <language>en</language>
    <item>
      <title>Building Continuum: Cross-Agent Graph Memory with Explainable Recall Using FalkorDB</title>
      <dc:creator>Himanshu Jha</dc:creator>
      <pubDate>Sun, 18 Oct 2026 16:23:54 +0000</pubDate>
      <link>https://dev.to/himanshu_jha_de18b7f5726d/building-continuum-cross-agent-graph-memory-with-explainable-recall-using-falkordb-37o8</link>
      <guid>https://dev.to/himanshu_jha_de18b7f5726d/building-continuum-cross-agent-graph-memory-with-explainable-recall-using-falkordb-37o8</guid>
      <description>&lt;p&gt;If you have spent the last year building autonomous AI agents, you have almost certainly slammed into the &lt;strong&gt;agent amnesia barrier&lt;/strong&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Stateless context windows.&lt;/strong&gt; When a session ends or the token limit is reached, your agent's memory vanishes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vector search is probabilistic and blind to causality.&lt;/strong&gt; RAG over text chunks gives you fuzzy cosine similarity. But embeddings cannot tell you &lt;em&gt;when&lt;/em&gt; a fact was updated, &lt;em&gt;why&lt;/em&gt; a decision changed, or &lt;em&gt;how&lt;/em&gt; two entities relate across multiple degrees of separation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multi-agent coordination is brittle.&lt;/strong&gt; When multiple agents share state through flat key-value pairs or raw prompt dumps, they quickly poison each other's context with hallucinated or stale data.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;To solve this, we built &lt;strong&gt;&lt;a href="http://16.4.24.249" rel="noopener noreferrer"&gt;Continuum&lt;/a&gt;&lt;/strong&gt; for the &lt;strong&gt;WeMakeDevs × FalkorDB Graph Hacks&lt;/strong&gt; hackathon (Track 02: Agent Memory &amp;amp; Coordination).&lt;/p&gt;

&lt;p&gt;Continuum is an open-source, cross-agent persistent memory engine powered by &lt;strong&gt;FalkorDB&lt;/strong&gt;, designed around a single thesis: &lt;strong&gt;Agents are only as good as the context they reason over—and that context must be a graph.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Here is the complete architectural deep-dive into how we designed, benchmarked, and deployed it.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. The Core Architecture: Three Cognitive Memory Tiers
&lt;/h2&gt;

&lt;p&gt;In human cognitive science, memory is not a flat bucket of words. It is split into distinct functional systems. We mapped Continuum’s property graph schema directly to cognitive memory theory:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                  +-----------------------------------+
                  |         User (Tenant Root)        |
                  +-----------------+-----------------+
                                    |
          +-------------------------+-------------------------+
          |                         |                         |
    [:HAS_SESSION]              [:PREFERS]             [:HAS_PROCEDURE]
          |                         |                         |
          v                         v                         v
     (Session)                 (Preference)              (Procedure)
          |
     [:CONTAINS]
          |
          v
       (Turn) -----[:MENTIONS]-----&amp;gt; (Entity)
          |                             |
      [:DERIVED]                    [:RELATES]
          |                             |
          v                             v
       (Fact) &amp;lt;---[:SUPERSEDES*]--- (Fact)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Episodic Memory (&lt;code&gt;Session&lt;/code&gt;, &lt;code&gt;Turn&lt;/code&gt;):&lt;/strong&gt; What happened, and in what exact sequence. Every message is a &lt;code&gt;Turn&lt;/code&gt; node linked with nanosecond ordering tiebreakers (&lt;code&gt;seq&lt;/code&gt;), making conversation replays deterministic.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Semantic Memory (&lt;code&gt;Entity&lt;/code&gt;, &lt;code&gt;Fact&lt;/code&gt;):&lt;/strong&gt; What is true about the world. Facts are extracted into structured triples (&lt;code&gt;subject&lt;/code&gt;, &lt;code&gt;predicate&lt;/code&gt;, &lt;code&gt;value&lt;/code&gt;) linked to concrete &lt;code&gt;Entity&lt;/code&gt; nodes with confidence scores and temporal validity bounds (&lt;code&gt;valid_from&lt;/code&gt;, &lt;code&gt;valid_to&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Procedural Memory (&lt;code&gt;Preference&lt;/code&gt;, &lt;code&gt;Procedure&lt;/code&gt;):&lt;/strong&gt; How the user likes things done. Stores explicit preferences ("prefers TypeScript") and multi-step procedures ("deploy preview: build → test → push → PR") with turn-level conversational step tracking.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  2. Multigraph Topology: Real Multi-Tenant Isolation
&lt;/h2&gt;

&lt;p&gt;In SaaS and multi-tenant architectures, you cannot risk leaking Alice's memory to Bob. Most vector databases force you to filter by metadata tags (&lt;code&gt;where tenant_id == 'alice'&lt;/code&gt;), which wastes query execution cycles and risks catastrophic data leakage if an index is misconfigured.&lt;/p&gt;

&lt;p&gt;FalkorDB supports native &lt;strong&gt;multigraph topology&lt;/strong&gt;. In Continuum, every user is provisioned their own isolated graph brain inside a single FalkorDB instance:&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="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;user_graph&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&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="n"&gt;graph&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;select_graph&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;user:&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;user_id&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;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;user_id&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_indexed&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nf"&gt;ensure_schema&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;graph&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_indexed&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&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="n"&gt;graph&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Absolute Isolation:&lt;/strong&gt; Bob’s queries physically cannot traverse Alice’s graph nodes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Query Planner Independence:&lt;/strong&gt; Alice’s graph size does not degrade query optimization for Bob.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Instant Offboarding:&lt;/strong&gt; Deleting a tenant's entire history is as simple as dropping a single graph.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  3. Solving Temporal Amnesia with Variable-Length &lt;code&gt;SUPERSEDES&lt;/code&gt; Walks
&lt;/h2&gt;

&lt;p&gt;What happens when an engineer updates their project stack?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;Yesterday:&lt;/em&gt; "I use Postgres for our persistence layer."&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Today:&lt;/em&gt; "Update: We switched our persistence layer to CockroachDB."&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In a vector database, both chunks exist simultaneously. The LLM gets confused, hallucinates, or flip-flops between them.&lt;/p&gt;

&lt;p&gt;In Continuum, conflicting facts do not overwrite history. Instead, they create a directed &lt;strong&gt;&lt;code&gt;SUPERSEDES&lt;/code&gt;&lt;/strong&gt; relationship in FalkorDB:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cypher"&gt;&lt;code&gt;&lt;span class="k"&gt;MATCH&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="py"&gt;old:&lt;/span&gt;&lt;span class="n"&gt;Fact&lt;/span&gt; &lt;span class="ss"&gt;{&lt;/span&gt;&lt;span class="py"&gt;id:&lt;/span&gt; &lt;span class="n"&gt;$old_id&lt;/span&gt;&lt;span class="ss"&gt;})&lt;/span&gt;
&lt;span class="k"&gt;SET&lt;/span&gt; &lt;span class="n"&gt;old.valid_to&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;timestamp&lt;/span&gt;&lt;span class="ss"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;MERGE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="py"&gt;n:&lt;/span&gt;&lt;span class="n"&gt;Fact&lt;/span&gt; &lt;span class="ss"&gt;{&lt;/span&gt;&lt;span class="py"&gt;subject:&lt;/span&gt; &lt;span class="n"&gt;$subject&lt;/span&gt;&lt;span class="ss"&gt;,&lt;/span&gt; &lt;span class="py"&gt;predicate:&lt;/span&gt; &lt;span class="n"&gt;$predicate&lt;/span&gt;&lt;span class="ss"&gt;,&lt;/span&gt; &lt;span class="py"&gt;value:&lt;/span&gt; &lt;span class="n"&gt;$value&lt;/span&gt;&lt;span class="ss"&gt;})&lt;/span&gt;
&lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;SET&lt;/span&gt; &lt;span class="n"&gt;n.id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;$new_id&lt;/span&gt;&lt;span class="ss"&gt;,&lt;/span&gt; &lt;span class="n"&gt;n.valid_from&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;timestamp&lt;/span&gt;&lt;span class="ss"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;MERGE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="ss"&gt;[&lt;/span&gt;&lt;span class="nc"&gt;:SUPERSEDES&lt;/span&gt;&lt;span class="ss"&gt;]&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="n"&gt;old&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When an agent needs to answer a historical rewind query (&lt;em&gt;"What database were we using before?"&lt;/em&gt;), it executes an OpenCypher variable-length path traversal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cypher"&gt;&lt;code&gt;&lt;span class="k"&gt;MATCH&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="py"&gt;root:&lt;/span&gt;&lt;span class="n"&gt;Fact&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="ss"&gt;[&lt;/span&gt;&lt;span class="nc"&gt;:SUPERSEDES&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="m"&gt;5&lt;/span&gt;&lt;span class="ss"&gt;]&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="py"&gt;old:&lt;/span&gt;&lt;span class="n"&gt;Fact&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;NOT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;-&lt;/span&gt;&lt;span class="ss"&gt;[&lt;/span&gt;&lt;span class="nc"&gt;:SUPERSEDES&lt;/span&gt;&lt;span class="ss"&gt;]&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="ss"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;RETURN&lt;/span&gt; &lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="ss"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;[&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="ow"&gt;IN&lt;/span&gt; &lt;span class="nf"&gt;nodes&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;n.value&lt;/span&gt;&lt;span class="ss"&gt;]&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;evolution&lt;/span&gt;
&lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;root.last_seen&lt;/span&gt; &lt;span class="k"&gt;DESC&lt;/span&gt;
&lt;span class="k"&gt;LIMIT&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The agent doesn't guess—it walks the chain and explains:  &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Previously Postgres, updated to CockroachDB on [timestamp]."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  4. In-Graph Cross-Agent Coordination: Scribe &amp;amp; Scout
&lt;/h2&gt;

&lt;p&gt;Track 02 challenged us to build coordination between multiple agents. We built two specialized agents:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Scribe:&lt;/strong&gt; The conversational interface and summarizer.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scout:&lt;/strong&gt; The multi-hop graph researcher.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Instead of relying on human manual toggles, Scribe &lt;strong&gt;autonomously delegates to Scout&lt;/strong&gt; when direct context is thin:&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="c1"&gt;# Scribe autonomously summons Scout when keyword match finds 0 facts
&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;words&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;matched&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;QUESTION_RE&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;match&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="nc"&gt;Scout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;store&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;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;llm&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;act&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="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;trace&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;trace&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;extra&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;_pickup&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="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When Scout is called, it expands entity relationships (&lt;code&gt;Turn → Entity → Fact&lt;/code&gt;), writes a research synthesis to a &lt;code&gt;SharedState&lt;/code&gt; node, and creates a directed &lt;code&gt;HANDOFF_TO&lt;/code&gt; edge to Scribe:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cypher"&gt;&lt;code&gt;&lt;span class="k"&gt;MERGE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="py"&gt;a:&lt;/span&gt;&lt;span class="n"&gt;Agent&lt;/span&gt; &lt;span class="ss"&gt;{&lt;/span&gt;&lt;span class="py"&gt;id:&lt;/span&gt; &lt;span class="n"&gt;$from_id&lt;/span&gt;&lt;span class="ss"&gt;})&lt;/span&gt;
&lt;span class="k"&gt;MERGE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="py"&gt;b:&lt;/span&gt;&lt;span class="n"&gt;Agent&lt;/span&gt; &lt;span class="ss"&gt;{&lt;/span&gt;&lt;span class="py"&gt;id:&lt;/span&gt; &lt;span class="n"&gt;$to_id&lt;/span&gt;&lt;span class="ss"&gt;})&lt;/span&gt;
&lt;span class="k"&gt;CREATE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="ss"&gt;[&lt;/span&gt;&lt;span class="nc"&gt;:HANDOFF_TO&lt;/span&gt; &lt;span class="ss"&gt;{&lt;/span&gt;
    &lt;span class="py"&gt;id:&lt;/span&gt; &lt;span class="n"&gt;$handoff_id&lt;/span&gt;&lt;span class="ss"&gt;,&lt;/span&gt;
    &lt;span class="py"&gt;summary:&lt;/span&gt; &lt;span class="n"&gt;$summary&lt;/span&gt;&lt;span class="ss"&gt;,&lt;/span&gt;
    &lt;span class="py"&gt;status:&lt;/span&gt; &lt;span class="s1"&gt;'pending'&lt;/span&gt;&lt;span class="ss"&gt;,&lt;/span&gt;
    &lt;span class="py"&gt;ts:&lt;/span&gt; &lt;span class="nf"&gt;timestamp&lt;/span&gt;&lt;span class="ss"&gt;()&lt;/span&gt;
&lt;span class="ss"&gt;}]&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The handoff protocol is not an ephemeral message—it is &lt;strong&gt;auditable graph data with full read/write provenance&lt;/strong&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Scribe inspects pending handoffs.&lt;/li&gt;
&lt;li&gt;A relevance gate verifies that the research matches the query tokens.&lt;/li&gt;
&lt;li&gt;Upon pickup, the handoff is marked &lt;code&gt;status: 'consumed'&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Stale handoffs older than 1 hour automatically expire via &lt;code&gt;EXPIRE_STALE&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  5. Explainable Recall: Opening the Black Box
&lt;/h2&gt;

&lt;p&gt;When an AI agent makes a claim, how do you verify it?&lt;/p&gt;

&lt;p&gt;Continuum ships with &lt;strong&gt;Explainable Recall&lt;/strong&gt;. Every answer returns the exact Cypher queries executed, their parameters, and the node IDs touched. On the frontend, Cytoscape.js renders the live subgraph beside the chat:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Fact Nodes (Blue):&lt;/strong&gt; Active knowledge triples.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Turn Nodes (Gray):&lt;/strong&gt; Exact conversational provenance.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Entity Nodes (Orange):&lt;/strong&gt; Real-world concepts connecting facts.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Preference Nodes (Green):&lt;/strong&gt; Procedural user habits.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Superseded Facts (Dashed Red):&lt;/strong&gt; Historical states.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Clicking any node slides open an &lt;strong&gt;Inspector Drawer&lt;/strong&gt; displaying raw properties, timestamps, and confidence scores.&lt;/p&gt;




&lt;h2&gt;
  
  
  6. Performance: 4,300 Ops/Sec on FalkorDB
&lt;/h2&gt;

&lt;p&gt;We benchmarked Continuum’s graph operations under heavy multi-tenant load using our automated benchmark runner (&lt;code&gt;scripts/bench_concurrent.py&lt;/code&gt;):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;50 isolated tenant graphs&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;32 concurrent worker threads&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Local Docker container on standard hardware&lt;/li&gt;
&lt;/ul&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;Samples&lt;/th&gt;
&lt;th&gt;p50 Latency&lt;/th&gt;
&lt;th&gt;p95 Latency&lt;/th&gt;
&lt;th&gt;Max Latency&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;read_facts&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;50&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;2.6 ms&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;6.4 ms&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;10.1 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;read_turns&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;50&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;2.8 ms&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;6.8 ms&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;11.2 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;read_prefs&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;50&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;3.1 ms&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;7.2 ms&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;11.8 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;write_pref&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;50&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;5.4 ms&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;11.2 ms&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;18.5 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;write_turn&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;50&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;6.1 ms&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;12.4 ms&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;21.0 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Overall Throughput:&lt;/strong&gt; &lt;strong&gt;~4,300 ops/second&lt;/strong&gt;. Because FalkorDB executes graph algorithms via GraphBLAS matrix operations over the Redis protocol, traversals happen at memory bus speeds.&lt;/p&gt;




&lt;h2&gt;
  
  
  7. Try It Live &amp;amp; Run the Code
&lt;/h2&gt;

&lt;p&gt;Continuum is deployed live on AWS EC2 (&lt;code&gt;t3.small&lt;/code&gt;, ap-south-1) with FalkorDB, FastAPI, and Nginx serving the React frontend:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🚀 &lt;strong&gt;Live Demo:&lt;/strong&gt; &lt;a href="http://16.4.24.249" rel="noopener noreferrer"&gt;http://16.4.24.249&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;💻 &lt;strong&gt;GitHub Repository:&lt;/strong&gt; &lt;a href="https://github.com/HimanshuJha-2005/continuum" rel="noopener noreferrer"&gt;https://github.com/HimanshuJha-2005/continuum&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🧪 &lt;strong&gt;Complete Test Suites:&lt;/strong&gt; 8 automated suites verifying memory layers, agent handoffs, container restarts, and FastAPI integration:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Verify the graph engine and run tests&lt;/span&gt;
docker compose up &lt;span class="nt"&gt;--build&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt;
&lt;span class="k"&gt;for &lt;/span&gt;t &lt;span class="k"&gt;in &lt;/span&gt;episodic procedural semantic agent handoff scout_scribe api restart&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do
  &lt;/span&gt;python scripts/test_&lt;span class="nv"&gt;$t&lt;/span&gt;.py
&lt;span class="k"&gt;done&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Key Takeaway
&lt;/h2&gt;

&lt;p&gt;Agents don't need larger prompt windows—they need structured, traceable, and temporal context. By replacing flat vector buckets with FalkorDB's property graphs, we can build agents that remember across sessions, coordinate with mathematical provenance, and explain every step of their reasoning.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Built with ❤️ for the WeMakeDevs × FalkorDB Graph Hacks Hackathon.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>graphdatabases</category>
      <category>python</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
