<?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: Yaswanth krishna Vadigella</title>
    <description>The latest articles on DEV Community by Yaswanth krishna Vadigella (@yaswanth_krishna).</description>
    <link>https://dev.to/yaswanth_krishna</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%2F4147835%2Fe3d77e77-8630-4767-9731-baac5f66c5fc.png</url>
      <title>DEV Community: Yaswanth krishna Vadigella</title>
      <link>https://dev.to/yaswanth_krishna</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/yaswanth_krishna"/>
    <language>en</language>
    <item>
      <title>RadarX: Building Competitive Intelligence That Actually Remembers</title>
      <dc:creator>Yaswanth krishna Vadigella</dc:creator>
      <pubDate>Mon, 28 Sep 2026 18:59:00 +0000</pubDate>
      <link>https://dev.to/yaswanth_krishna/radarx-building-competitive-intelligence-that-actually-remembers-19n9</link>
      <guid>https://dev.to/yaswanth_krishna/radarx-building-competitive-intelligence-that-actually-remembers-19n9</guid>
      <description>&lt;h1&gt;
  
  
  RadarX: Building Competitive Intelligence That Actually Remembers
&lt;/h1&gt;

&lt;p&gt;Most competitive-intelligence systems can tell you &lt;strong&gt;what happened today&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The harder question is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;What does today's event mean when you compare it with everything that happened before?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A competitor changes its pricing.&lt;/p&gt;

&lt;p&gt;A few months later, it launches a product update.&lt;/p&gt;

&lt;p&gt;Then customer feedback starts changing.&lt;/p&gt;

&lt;p&gt;Individually, these events may look unrelated. But when an AI agent can remember previous observations and retrieve them when answering a new question, those events can become part of a larger pattern.&lt;/p&gt;

&lt;p&gt;That is the idea behind &lt;strong&gt;RadarX — Competitive Intelligence that remembers.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;RadarX is a Streamlit-based competitive-intelligence agent that uses &lt;strong&gt;Hindsight persistent memory&lt;/strong&gt; to retain dated market events, recall relevant historical evidence, and reason over that evidence before producing an answer.&lt;/p&gt;

&lt;p&gt;The core loop is:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Question → Hindsight Recall → Evidence → Reflection → Grounded Answer&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The problem with one-shot competitive analysis
&lt;/h2&gt;

&lt;p&gt;A normal LLM conversation is very good at analyzing the information you give it.&lt;/p&gt;

&lt;p&gt;But competitive intelligence is inherently cumulative.&lt;/p&gt;

&lt;p&gt;Suppose an analyst asks:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"What has changed in our competitor's strategy?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If the system only sees the latest event, it may describe that event correctly but miss the historical context.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;January:
Competitor changes pricing.

April:
Competitor receives a new type of customer feedback.

July:
Competitor changes pricing again.

August:
Similar customer feedback appears.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Looking at only the August event gives you one observation.&lt;/p&gt;

&lt;p&gt;Remembering the entire sequence allows the system to ask a more useful question:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is this an isolated event, a repeated pattern, or part of a sustained trend?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;RadarX was designed around that distinction.&lt;/p&gt;




&lt;h1&gt;
  
  
  What RadarX does
&lt;/h1&gt;

&lt;p&gt;RadarX stores competitive events such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pricing changes&lt;/li&gt;
&lt;li&gt;Promotions&lt;/li&gt;
&lt;li&gt;Product updates&lt;/li&gt;
&lt;li&gt;Delivery changes&lt;/li&gt;
&lt;li&gt;Customer feedback&lt;/li&gt;
&lt;li&gt;Hiring signals&lt;/li&gt;
&lt;li&gt;Other market events&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each event is associated with information such as its date, company, event type, description, and impact score.&lt;/p&gt;

&lt;p&gt;The system then uses Hindsight as the persistent memory layer.&lt;/p&gt;

&lt;p&gt;Instead of treating every question as a completely new analysis, RadarX can retrieve historical competitive evidence relevant to the question.&lt;/p&gt;




&lt;h1&gt;
  
  
  The architecture
&lt;/h1&gt;

&lt;p&gt;At a high level, RadarX has five stages:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                    ┌─────────────────────┐
                    │   Market Events     │
                    │   CSV / Signals     │
                    └──────────┬──────────┘
                               │
                               ▼
                    ┌─────────────────────┐
                    │ Hindsight Memory    │
                    │       Bank          │
                    └──────────┬──────────┘
                               │
                         Recall Evidence
                               │
                               ▼
                    ┌─────────────────────┐
                    │     RadarX          │
                    │    Reflection       │
                    └──────────┬──────────┘
                               │
                               ▼
                    ┌─────────────────────┐
                    │ Intelligence Output │
                    │ Facts                │
                    │ Significance         │
                    │ Recommendation       │
                    │ Limitations          │
                    └─────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The important part is that &lt;strong&gt;memory sits between the incoming question and the reasoning step&lt;/strong&gt;.&lt;/p&gt;




&lt;h1&gt;
  
  
  Why Hindsight?
&lt;/h1&gt;

&lt;p&gt;RadarX needs more than temporary conversation context.&lt;/p&gt;

&lt;p&gt;It needs a persistent place where historical competitive observations can be retained and recalled later.&lt;/p&gt;

&lt;p&gt;The project creates a dedicated Hindsight memory bank:&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;BANK_ID&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;radarx-competitive-intelligence&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The bank is configured with a mission describing what RadarX is supposed 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;MISSION&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;
You are RadarX, a competitive intelligence agent.

Analyze dated competitor pricing, product updates, customer feedback,
promotions, delivery changes, hiring signals, and market events.

Give evidence-based analysis and recommendations.

Never invent evidence.

Never assume facts that are not present in memory.

Use Hindsight memory as the primary source of competitive intelligence.
&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;strip&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 important because memory by itself does not automatically make an agent reliable.&lt;/p&gt;

&lt;p&gt;RadarX also gives the memory system explicit behavioral directives:&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;DIRECTIVES&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;Use only supplied evidence.&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;Clearly separate facts from recommendations.&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;Cite date, company, and event text whenever available.&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;State uncertainty when evidence is insufficient.&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;Never fabricate or assume competitive events.&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;Distinguish one-time events from repeated patterns and sustained trends.&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;The last directive is particularly important for competitive intelligence.&lt;/p&gt;

&lt;p&gt;Two similar events may indicate a pattern.&lt;/p&gt;

&lt;p&gt;One event does not necessarily indicate a trend.&lt;/p&gt;

&lt;p&gt;RadarX explicitly asks the reasoning layer to make that distinction.&lt;/p&gt;




&lt;h1&gt;
  
  
  Creating the Hindsight memory bank
&lt;/h1&gt;

&lt;p&gt;The Hindsight client is initialized using an API key stored outside the application:&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;create_hindsight_client&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;api_key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getenv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;HINDSIGHT_API_KEY&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="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;RuntimeError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;HINDSIGHT_API_KEY is missing. &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Check your .env file.&lt;/span&gt;&lt;span class="sh"&gt;"&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;Hindsight&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;base_url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;HINDSIGHT_BASE_URL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;api_key&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;The memory bank is then created or updated:&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;await&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;acreate_bank&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;bank_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;BANK_ID&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;RadarX Competitive Intelligence&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;mission&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;MISSION&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;background&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;background&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;reflect_mission&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;MISSION&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;disposition&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;skepticism&lt;/span&gt;&lt;span class="sh"&gt;"&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;literalism&lt;/span&gt;&lt;span class="sh"&gt;"&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;empathy&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;3&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;RadarX also applies its directives to the bank.&lt;/p&gt;

&lt;p&gt;This gives the agent a persistent competitive-intelligence context rather than simply sending a large prompt every time.&lt;/p&gt;




&lt;h1&gt;
  
  
  Turning market events into memory
&lt;/h1&gt;

&lt;p&gt;The next step is ingestion.&lt;/p&gt;

&lt;p&gt;RadarX reads market events from:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;data/market_events.csv
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each row contains fields such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;timestamp
company
event_type
title
description
impact_score
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The application converts each event into a structured memory entry.&lt;/p&gt;

&lt;p&gt;For example:&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;content&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;
Date: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;timestamp&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;

Company: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;company&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;

Event Type: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;event_type&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;

Title: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;

Event: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;

Impact Score: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;impact_score&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;
&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;strip&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Metadata is retained alongside the event:&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;metadata&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;source&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;data/market_events.csv&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;date&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;timestamp&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;company&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;company&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;event_type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;event_type&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;title&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;impact_score&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;impact_score&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;The event is then stored in Hindsight:&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;await&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;aretain&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;bank_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;BANK_ID&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;metadata&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;metadata&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="n"&gt;company&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;event_type&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;competitive-intelligence&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;update_mode&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;replace&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;This is where RadarX starts building its competitive memory.&lt;/p&gt;

&lt;p&gt;The system is no longer looking only at the current question.&lt;/p&gt;

&lt;p&gt;It has historical observations that can be retrieved later.&lt;/p&gt;




&lt;h1&gt;
  
  
  The interesting part: Recall → Reflection
&lt;/h1&gt;

&lt;p&gt;The most important part of RadarX is what happens when a user asks a question.&lt;/p&gt;

&lt;p&gt;RadarX does not immediately send the question to an LLM and ask it to answer.&lt;/p&gt;

&lt;p&gt;First, it asks Hindsight to recall relevant evidence.&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;recall_response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&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;arecall&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;bank_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;BANK_ID&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;question&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;budget&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;high&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;max_tokens&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;8192&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;include_chunks&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="n"&gt;max_chunk_tokens&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;4096&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;include_source_facts&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="n"&gt;max_source_facts_tokens&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;4096&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;The result can contain recalled text, chunks, and source facts.&lt;/p&gt;

&lt;p&gt;Only after retrieving this historical context does RadarX move to the reflection stage.&lt;/p&gt;




&lt;h1&gt;
  
  
  Reflection is deliberately evidence-constrained
&lt;/h1&gt;

&lt;p&gt;RadarX constructs a reflection prompt containing the user's question and the evidence recalled from Hindsight.&lt;/p&gt;

&lt;p&gt;The reasoning instructions explicitly say:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Use only the competitive-intelligence evidence
recalled from Hindsight.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The agent is also instructed to determine whether the evidence is actually sufficient.&lt;/p&gt;

&lt;p&gt;If the evidence is insufficient, RadarX should &lt;strong&gt;not fill the gap with general knowledge&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Instead, it should report that the current memory does not contain enough relevant evidence.&lt;/p&gt;

&lt;p&gt;That distinction is important.&lt;/p&gt;

&lt;p&gt;A competitive-intelligence system that confidently invents missing competitor activity can be worse than a system that simply says:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"I don't have enough evidence."&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h1&gt;
  
  
  Structured intelligence output
&lt;/h1&gt;

&lt;p&gt;RadarX uses a response schema rather than asking the model for an unstructured paragraph.&lt;/p&gt;

&lt;p&gt;The schema contains:&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;RADARX_RESPONSE_SCHEMA&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;type&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;object&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;properties&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;evidence_sufficient&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&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;boolean&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;threat_level&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&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;string&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;enum&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;High&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;Medium&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;Low&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;facts_evidence&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&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;string&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;why_it_matters&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&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;string&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;recommended_action&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&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;string&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;confidence_limitations&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&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;string&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="p"&gt;},&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;required&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;evidence_sufficient&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;threat_level&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;facts_evidence&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;why_it_matters&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;recommended_action&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;confidence_limitations&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="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The reflection call then uses that schema:&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;reflect_response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&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;areflect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;bank_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;BANK_ID&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;reflection_query&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;budget&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;high&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;max_tokens&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;5000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;response_schema&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;RADARX_RESPONSE_SCHEMA&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;include_facts&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="n"&gt;apply_all_directives&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="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This creates a predictable intelligence output:&lt;/p&gt;

&lt;h3&gt;
  
  
  Facts / Evidence
&lt;/h3&gt;

&lt;p&gt;What does the stored evidence actually say?&lt;/p&gt;

&lt;h3&gt;
  
  
  Why It Matters
&lt;/h3&gt;

&lt;p&gt;What significance can reasonably be derived from that evidence?&lt;/p&gt;

&lt;h3&gt;
  
  
  Recommended Action
&lt;/h3&gt;

&lt;p&gt;What should be considered based on the evidence?&lt;/p&gt;

&lt;h3&gt;
  
  
  Confidence / Limitations
&lt;/h3&gt;

&lt;p&gt;What does the evidence fail to establish?&lt;/p&gt;

&lt;p&gt;This separation helps keep facts and interpretation distinct.&lt;/p&gt;




&lt;h1&gt;
  
  
  Before vs. with persistent memory
&lt;/h1&gt;

&lt;p&gt;Consider a new competitor event.&lt;/p&gt;

&lt;p&gt;Without historical memory, the analysis might look like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Latest event:
Competitor changed its delivery experience.

Conclusion:
The competitor changed its delivery experience.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's factually useful, but limited.&lt;/p&gt;

&lt;p&gt;With Hindsight memory, RadarX can retrieve previous observations and evaluate the new event against them.&lt;/p&gt;

&lt;p&gt;The result can instead become:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Current event
      ↓
Historical competitor observations
      ↓
Repeated event types
      ↓
Evidence of patterns
      ↓
Strategic interpretation
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The goal isn't simply to remember more.&lt;/p&gt;

&lt;p&gt;The goal is to make &lt;strong&gt;historical context available when it becomes relevant&lt;/strong&gt;.&lt;/p&gt;




&lt;h1&gt;
  
  
  Detecting repeated competitive patterns
&lt;/h1&gt;

&lt;p&gt;RadarX also performs explicit pattern detection over its market-event data.&lt;/p&gt;

&lt;p&gt;It groups events by:&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="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;company&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;event_type&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;p&gt;and ignores groups with fewer than two events:&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;if&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;group&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;continue&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That gives the system a simple but useful rule:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;One observation is not enough to call something a repeated pattern.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;For groups containing multiple events, RadarX calculates the average impact and preserves the supporting events:&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;patterns&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&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;company&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;company&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;event_type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;event_type&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;count&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;group&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;average_impact&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;average_impact&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;dates&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;group&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;timestamp&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="nf"&gt;astype&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="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;tolist&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;events&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;supporting_events&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;The dashboard can then show the supporting evidence behind a detected pattern.&lt;/p&gt;

&lt;p&gt;This is useful because the user can inspect &lt;strong&gt;why&lt;/strong&gt; the application considers something repeated instead of seeing only a generated conclusion.&lt;/p&gt;




&lt;h1&gt;
  
  
  The memory inspector
&lt;/h1&gt;

&lt;p&gt;Another important part of the interface is the Hindsight Memory Inspector.&lt;/p&gt;

&lt;p&gt;After a question is analyzed, RadarX exposes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Recalled memory&lt;/li&gt;
&lt;li&gt;Recalled chunks&lt;/li&gt;
&lt;li&gt;Source facts&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The application can therefore show the evidence chain behind the answer:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User Question
      ↓
Hindsight Recall
      ↓
Relevant Historical Evidence
      ↓
Evidence Sufficiency
      ↓
Reflection
      ↓
Grounded Intelligence
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This makes the memory mechanism visible instead of treating it as a black box.&lt;/p&gt;




&lt;h1&gt;
  
  
  Handling insufficient evidence
&lt;/h1&gt;

&lt;p&gt;One of the design decisions I'm most interested in with RadarX is what happens when memory doesn't contain the answer.&lt;/p&gt;

&lt;p&gt;The application explicitly checks:&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;evidence_sufficient&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;reflection&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;evidence_sufficient&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="bp"&gt;False&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;If evidence is insufficient, the UI warns the user:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;RadarX does not have enough relevant evidence
in Hindsight memory to answer this question.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It also explains that the answer is intentionally limited to currently stored evidence.&lt;/p&gt;

&lt;p&gt;This behavior is important because competitive intelligence often involves incomplete information.&lt;/p&gt;

&lt;p&gt;The agent shouldn't convert missing information into invented information.&lt;/p&gt;




&lt;h1&gt;
  
  
  Adding a signal scanner
&lt;/h1&gt;

&lt;p&gt;RadarX also contains an optional Groq-based signal-scanning component.&lt;/p&gt;

&lt;p&gt;Its job is to retrieve potential new market signals.&lt;/p&gt;

&lt;p&gt;But there is an important constraint in the implementation.&lt;/p&gt;

&lt;p&gt;The scanner prompt explicitly tells the model:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Do NOT generate, simulate, predict, or invent events.

If you do not have verified source material containing recent
events, return:

{"events": []}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If no verified signals are available, RadarX doesn't create fake events just to make the dashboard look active.&lt;/p&gt;

&lt;p&gt;Instead:&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;No new verified signals were retrieved. &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;No synthetic events were added to memory.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is a deliberate reliability boundary.&lt;/p&gt;




&lt;h1&gt;
  
  
  A small but important engineering detail
&lt;/h1&gt;

&lt;p&gt;RadarX uses asynchronous Hindsight calls inside Streamlit.&lt;/p&gt;

&lt;p&gt;Because Streamlit can already have an event loop running, the project includes a helper that detects whether a loop is active.&lt;/p&gt;

&lt;p&gt;If no loop is running:&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;return&lt;/span&gt; &lt;span class="n"&gt;asyncio&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;coro&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If one is already running, RadarX creates a separate thread and executes the coroutine there.&lt;/p&gt;

&lt;p&gt;This lets the Streamlit application use the asynchronous Hindsight client without making the UI architecture unnecessarily complicated.&lt;/p&gt;




&lt;h1&gt;
  
  
  What the dashboard provides
&lt;/h1&gt;

&lt;p&gt;The RadarX interface combines several views:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Intelligence dashboard&lt;/li&gt;
&lt;li&gt;Memory event count&lt;/li&gt;
&lt;li&gt;Companies tracked&lt;/li&gt;
&lt;li&gt;Detected patterns&lt;/li&gt;
&lt;li&gt;Average impact&lt;/li&gt;
&lt;li&gt;Continuous memory scanner&lt;/li&gt;
&lt;li&gt;Remembered timeline&lt;/li&gt;
&lt;li&gt;Competitor radar&lt;/li&gt;
&lt;li&gt;Market signal matrix&lt;/li&gt;
&lt;li&gt;Ask RadarX query console&lt;/li&gt;
&lt;li&gt;Intelligence output&lt;/li&gt;
&lt;li&gt;Evidence chain&lt;/li&gt;
&lt;li&gt;Hindsight memory inspector&lt;/li&gt;
&lt;li&gt;Raw source data&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal is to make the entire memory-to-intelligence pipeline visible in one place.&lt;/p&gt;




&lt;h1&gt;
  
  
  What changed compared with a stateless analysis?
&lt;/h1&gt;

&lt;p&gt;The fundamental change is not simply that RadarX stores more data.&lt;/p&gt;

&lt;p&gt;It changes the workflow.&lt;/p&gt;

&lt;h3&gt;
  
  
  Without persistent memory
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Question
   ↓
LLM
   ↓
Answer
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The answer depends heavily on the context available at that moment.&lt;/p&gt;

&lt;h3&gt;
  
  
  With RadarX + Hindsight
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Question
   ↓
Hindsight Recall
   ↓
Historical Evidence
   ↓
RadarX Reflection
   ↓
Evidence Check
   ↓
Answer + Limitations
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The agent can therefore use previously retained competitive observations when they are relevant to a new question.&lt;/p&gt;




&lt;h1&gt;
  
  
  What I learned
&lt;/h1&gt;

&lt;p&gt;The biggest lesson from building RadarX is that &lt;strong&gt;memory alone does not create intelligence&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Persistent memory is useful only when the agent can:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Store useful information.&lt;/li&gt;
&lt;li&gt;Retrieve relevant information.&lt;/li&gt;
&lt;li&gt;Distinguish relevant evidence from irrelevant evidence.&lt;/li&gt;
&lt;li&gt;Recognize when evidence is insufficient.&lt;/li&gt;
&lt;li&gt;Separate facts from interpretation.&lt;/li&gt;
&lt;li&gt;Explain the limitations of its conclusions.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That's why RadarX doesn't stop at &lt;code&gt;retain&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The application uses a complete loop:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Retain → Recall → Reflect → Explain&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Hindsight provides the persistent memory layer, while the RadarX logic determines how that memory is used for competitive intelligence.&lt;/p&gt;




&lt;h1&gt;
  
  
  Limitations
&lt;/h1&gt;

&lt;p&gt;RadarX is a prototype, so there are several limitations.&lt;/p&gt;

&lt;p&gt;First, the competitive events used by the current demonstration are stored market-event data rather than a complete production-grade competitive-intelligence feed.&lt;/p&gt;

&lt;p&gt;Second, the signal scanner only adds events when source-backed information is available. It intentionally avoids generating synthetic market events.&lt;/p&gt;

&lt;p&gt;Third, pattern detection currently uses relatively straightforward grouping logic: repeated company + event-type combinations are surfaced as patterns.&lt;/p&gt;

&lt;p&gt;Finally, historical evidence does not automatically prove causation.&lt;/p&gt;

&lt;p&gt;If two competitor events occur close together, RadarX can identify the relationship as an observation, but that does not mean one event caused another.&lt;/p&gt;

&lt;p&gt;These limitations are important because the goal is not to make the system sound more certain than its evidence allows.&lt;/p&gt;




&lt;h1&gt;
  
  
  The core idea
&lt;/h1&gt;

&lt;p&gt;Competitive intelligence is cumulative.&lt;/p&gt;

&lt;p&gt;A pricing change matters differently when it is the first pricing change in a year versus the third related pricing change in six months.&lt;/p&gt;

&lt;p&gt;A product update means something different when it appears alongside previous delivery, pricing, and customer-feedback signals.&lt;/p&gt;

&lt;p&gt;That's the problem RadarX is designed to address.&lt;/p&gt;

&lt;p&gt;Instead of asking:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;"What happened?"&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;RadarX tries to help answer:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;"What does this event mean in the context of what we already remember?"&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And that is where persistent agent memory becomes useful.&lt;/p&gt;




&lt;h1&gt;
  
  
  Final architecture
&lt;/h1&gt;

&lt;p&gt;The complete RadarX intelligence loop can be summarized as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;             MARKET EVENTS
                   │
                   ▼
          ┌─────────────────┐
          │    RETAIN       │
          │ Hindsight Bank  │
          └────────┬────────┘
                   │
                   ▼
USER QUESTION ──► RECALL
                   │
                   ▼
          Historical Evidence
                   │
                   ▼
              REFLECTION
                   │
          ┌────────┴────────┐
          │                 │
     Sufficient         Insufficient
      Evidence            Evidence
          │                 │
          ▼                 ▼
    Intelligence       Evidence Gap
      Output           + More Data
          │
          ▼
       Recommendation
       + Limitations
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;RadarX's core principle is simple:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Today's competitive signal should not have to forget yesterday's evidence.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Project
&lt;/h2&gt;

&lt;p&gt;RadarX is built with Streamlit, Python, Hindsight persistent memory, and an optional Groq-based signal-scanning layer.&lt;/p&gt;

&lt;p&gt;GitHub:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/vadigellayaswanth/Competitive-Intelligence-Agent.git" rel="noopener noreferrer"&gt;https://github.com/vadigellayaswanth/Competitive-Intelligence-Agent.git&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Hindsight:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/vectorize-io/hindsight" rel="noopener noreferrer"&gt;https://github.com/vectorize-io/hindsight&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The project focuses on one question:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What happens when a competitive-intelligence agent can actually remember?&lt;/strong&gt;&lt;/p&gt;

&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Flfkn1d6mnmgw5cin9pn8.png" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Flfkn1d6mnmgw5cin9pn8.png" alt=" " width="800" height="441"&gt;&lt;/a&gt;&lt;br&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fa7lkx0530ku7t76w3wz0.png" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fa7lkx0530ku7t76w3wz0.png" alt=" " width="800" height="433"&gt;&lt;/a&gt;&lt;br&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkvjin20leaftuxoixipu.png" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkvjin20leaftuxoixipu.png" alt=" " width="800" height="434"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>agents</category>
      <category>ai</category>
      <category>tools</category>
    </item>
  </channel>
</rss>
