<?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: Goli Shrenee</title>
    <description>The latest articles on DEV Community by Goli Shrenee (@shrenee).</description>
    <link>https://dev.to/shrenee</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%2F4147873%2F95fd1f82-b532-4bc2-8f77-228e733a0b2c.png</url>
      <title>DEV Community: Goli Shrenee</title>
      <link>https://dev.to/shrenee</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/shrenee"/>
    <language>en</language>
    <item>
      <title>When Customer Context Went Missing, Hindsight Fixed My Design</title>
      <dc:creator>Goli Shrenee</dc:creator>
      <pubDate>Mon, 28 Sep 2026 19:06:23 +0000</pubDate>
      <link>https://dev.to/shrenee/when-customer-context-went-missing-hindsight-fixed-my-design-1gng</link>
      <guid>https://dev.to/shrenee/when-customer-context-went-missing-hindsight-fixed-my-design-1gng</guid>
      <description>&lt;p&gt;I originally thought customer memory was a storage problem. It turned out to be a retrieval and trust problem.&lt;/p&gt;

&lt;p&gt;When I built FUEGO, a customer relationship memory agent, I wanted one simple behaviour: before a customer meeting, the system should remember what happened before without forcing someone to reconstruct the relationship from scattered meetings, tickets, and notes.&lt;/p&gt;

&lt;p&gt;The key design decision was separating structured customer records from long-term semantic memory. SQLite remains the source of truth for customers, meetings, and support tickets. Hindsight handles the historical context that needs to be retrieved when a question is asked. Groq then turns that context into a useful response.&lt;/p&gt;

&lt;p&gt;That separation made the rest of the system much easier to reason about.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The architecture:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;FUEGO uses a Next.js frontend and a Python/FastAPI backend. The frontend lets a user select a customer, add meetings and support tickets, prepare for a meeting, inspect commitments and solutions, and ask questions.&lt;/p&gt;

&lt;p&gt;The backend connects SQLite, Hindsight, and Groq.&lt;/p&gt;

&lt;p&gt;SQLite stores concrete records. Hindsight provides long-term customer context. Groq uses the retrieved context to generate the final response.&lt;/p&gt;

&lt;p&gt;I wanted those responsibilities to stay separate. A database row is not the same thing as a memory, and a retrieved memory is not automatically a fact that should overwrite a structured record.&lt;/p&gt;

&lt;p&gt;Why ordinary customer history was not enough&lt;/p&gt;

&lt;p&gt;A customer relationship contains different kinds of information.&lt;/p&gt;

&lt;p&gt;A meeting might say that a customer reported slow dashboard filtering. A support ticket might describe the same problem technically. A later meeting might say that an optimization improved performance. Another ticket might say that monitoring was added but has not yet been validated.&lt;/p&gt;

&lt;p&gt;A database can retrieve those individual records. The harder question is:&lt;/p&gt;

&lt;p&gt;What should I remember about this customer before the next meeting?&lt;/p&gt;

&lt;p&gt;That is where Hindsight became useful.&lt;/p&gt;

&lt;p&gt;I use Hindsight as the memory layer rather than treating old conversations as one giant prompt. Its model of retaining information, recalling relevant memories, and reflecting across memories gave me a cleaner boundary for customer context. The Hindsight documentation describes these memory operations in more detail.&lt;/p&gt;

&lt;p&gt;Retain what happened, recall what matters&lt;/p&gt;

&lt;p&gt;When a meeting or support ticket is recorded, FUEGO persists the structured record in SQLite and makes the important context available to Hindsight.&lt;/p&gt;

&lt;p&gt;Conceptually, the operation looks like:&lt;/p&gt;

&lt;p&gt;hindsight.retain(&lt;br&gt;
    bank_id=MEMORY_BANK,&lt;br&gt;
    content=customer_context,&lt;br&gt;
)&lt;/p&gt;

&lt;p&gt;Later, when the user asks a question, I retrieve relevant history instead of sending the entire customer record to the model:&lt;/p&gt;

&lt;p&gt;memories = hindsight.recall(&lt;br&gt;
    bank_id=MEMORY_BANK,&lt;br&gt;
    query=query,&lt;br&gt;
)&lt;/p&gt;

&lt;p&gt;That changed how I thought about memory. I stopped treating memory as "chat history that we append to the prompt" and started treating it as a separate retrieval boundary.&lt;/p&gt;

&lt;p&gt;This also lines up with the broader idea of agent memory: keeping information is only part of the problem. The useful part is bringing previous experience back when it becomes relevant.&lt;/p&gt;

&lt;p&gt;SQLite stays the source of truth&lt;/p&gt;

&lt;p&gt;I deliberately did not make Hindsight the database.&lt;/p&gt;

&lt;p&gt;FUEGO has structured records for customers, meetings, and support tickets, with fields such as dates, titles, priorities, statuses, solutions, and outcomes.&lt;/p&gt;

&lt;p&gt;That lets the system distinguish between:&lt;/p&gt;

&lt;p&gt;SQLite:&lt;br&gt;
"Ticket GGL-302 is Open."&lt;/p&gt;

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

&lt;p&gt;Memory:&lt;br&gt;
"Monitoring gaps were discussed and additional alerting was attempted."&lt;/p&gt;

&lt;p&gt;Those statements are related, but they have different roles.&lt;/p&gt;

&lt;p&gt;The database tells me what the application has recorded. Memory helps retrieve the history surrounding that record.&lt;/p&gt;

&lt;p&gt;The same rule applies to commitments. If a meeting says the FUEGO team will provide a performance improvement plan, the system records that commitment. It does not later assume the commitment was completed just because another conversation happened.&lt;/p&gt;

&lt;p&gt;I would rather surface "needs confirmation" than manufacture completion.&lt;/p&gt;

&lt;p&gt;Remembering solutions, not just problems&lt;/p&gt;

&lt;p&gt;One of the most useful parts of the design is remembering what happened after a problem was reported.&lt;/p&gt;

&lt;p&gt;For example, a customer history can contain:&lt;/p&gt;

&lt;p&gt;Problem:&lt;br&gt;
Analytics dashboard was slow when filtering large datasets.&lt;/p&gt;

&lt;p&gt;Solution:&lt;br&gt;
Created aggregated tables and simplified the semantic model.&lt;/p&gt;

&lt;p&gt;Outcome:&lt;br&gt;
Dashboard response time improved.&lt;/p&gt;

&lt;p&gt;Another issue might contain:&lt;/p&gt;

&lt;p&gt;Problem:&lt;br&gt;
Insufficient monitoring for dashboard refresh failures.&lt;/p&gt;

&lt;p&gt;Solution:&lt;br&gt;
Added additional monitoring and alerting.&lt;/p&gt;

&lt;p&gt;Outcome:&lt;br&gt;
Not confirmed.&lt;/p&gt;

&lt;p&gt;FUEGO can classify these as worked, partially worked, or not confirmed.&lt;/p&gt;

&lt;p&gt;That distinction matters. "We tried this" is not the same as "this solved the problem." An unsuccessful or unverified approach is still useful memory because it changes what I would want to discuss next.&lt;/p&gt;

&lt;p&gt;Reflection helps with higher-level questions&lt;/p&gt;

&lt;p&gt;Recall is useful when I need relevant historical context. Reflection becomes useful when the question requires synthesis across multiple memories.&lt;/p&gt;

&lt;p&gt;Conceptually:&lt;/p&gt;

&lt;p&gt;insight = hindsight.reflect(&lt;br&gt;
    bank_id=MEMORY_BANK,&lt;br&gt;
    query="What should I know before the next customer meeting?",&lt;br&gt;
)&lt;/p&gt;

&lt;p&gt;I think about the difference this way:&lt;/p&gt;

&lt;p&gt;SQLite answers: Which tickets are open?&lt;/p&gt;

&lt;p&gt;Recall answers: What did we previously try?&lt;/p&gt;

&lt;p&gt;Reflection answers: What should I keep in mind?&lt;/p&gt;

&lt;p&gt;That separation is cleaner than putting every old record into one large prompt and asking the LLM to figure everything out.&lt;/p&gt;

&lt;p&gt;A concrete customer example&lt;/p&gt;

&lt;p&gt;Consider the Google demo customer in FUEGO.&lt;/p&gt;

&lt;p&gt;Its history includes a ticket about slow analytics dashboard filtering. The recorded solution was to create aggregated tables and simplify the semantic model, with improved response time as the outcome.&lt;/p&gt;

&lt;p&gt;A second ticket concerns insufficient monitoring. Additional monitoring and alerting were added, but the outcome has not yet been confirmed.&lt;/p&gt;

&lt;p&gt;Before a meeting, FUEGO can surface the current focus, recent meetings, open issues, commitments, previous solutions, and follow-ups that still need confirmation.&lt;/p&gt;

&lt;p&gt;I can then ask questions such as:&lt;/p&gt;

&lt;p&gt;What solutions worked for a specific company?&lt;br&gt;
What did we promise?&lt;/p&gt;

&lt;p&gt;The interesting part is not that an LLM can produce those sentences. The useful part is that the answer is based on customer history accumulated before the current request.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What I learned&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Memory needs a boundary&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;SQLite owns structured records. Hindsight owns retrievable long-term context. The LLM turns those inputs into language.&lt;/p&gt;

&lt;p&gt;Once those responsibilities were separated, debugging became much easier.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Retrieval matters more than storing everything&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A memory system is useful only when it can surface the right history at the right time. I prefer an explicit recall step over appending every previous interaction to the prompt.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. "Worked" is different from "we tried it"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A previous attempt should not automatically become a recommendation. Recording outcomes explicitly gives the agent useful uncertainty instead of false confidence.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Memory should support evidence, not replace it&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I do not want an old memory to override the current customer record. Memory provides context; structured records remain the factual source of truth.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. The best memory experience is not a memory screen&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The useful moment is when someone asks a question and the system already knows why the answer matters because it remembers what happened before.&lt;/p&gt;

&lt;p&gt;The memory is infrastructure. The customer meeting is the product experience.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>python</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
