<?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: Krishna Hasare</title>
    <description>The latest articles on DEV Community by Krishna Hasare (@krishnahasare).</description>
    <link>https://dev.to/krishnahasare</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%2F3835840%2Fbe6fdf28-5a67-4b1d-aeff-2a08fc640f0c.jpg</url>
      <title>DEV Community: Krishna Hasare</title>
      <link>https://dev.to/krishnahasare</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/krishnahasare"/>
    <language>en</language>
    <item>
      <title>My Coding Agent Remembered My Mistakes I Never Told It To</title>
      <dc:creator>Krishna Hasare</dc:creator>
      <pubDate>Fri, 20 Mar 2026 17:11:36 +0000</pubDate>
      <link>https://dev.to/krishnahasare/my-coding-agent-remembered-my-mistakes-i-never-told-it-to-28fi</link>
      <guid>https://dev.to/krishnahasare/my-coding-agent-remembered-my-mistakes-i-never-told-it-to-28fi</guid>
      <description>&lt;p&gt;The user wants clean Markdown for dev.to — not a Word doc. Let me just review the content carefully for punctuation errors and alignment issues, then produce a clean version.&lt;/p&gt;

&lt;p&gt;Here's your article cleaned up for dev.to — same content, fixed alignment and a couple of punctuation touches:&lt;/p&gt;




&lt;p&gt;I was testing our app for the third time that night. Same username, new session. I expected it to greet me like a stranger.&lt;/p&gt;

&lt;p&gt;Instead it said: &lt;em&gt;"Last time you struggled with dynamic programming problems. Want to try something that builds on that?"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I stared at the screen for a second. I hadn't written any personalization logic. No if-statements. No special greeting templates. No "remember this user" flag anywhere in the codebase.&lt;/p&gt;

&lt;p&gt;It just... knew.&lt;/p&gt;

&lt;p&gt;That was the moment I actually understood what &lt;a href="https://github.com/vectorize-io/hindsight" rel="noopener noreferrer"&gt;Hindsight&lt;/a&gt; was doing under the hood — and why it's different from everything I'd tried before.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Try it live: &lt;a href="https://codemento.netlify.app/" rel="noopener noreferrer"&gt;codemento.netlify.app&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  What We Built
&lt;/h2&gt;

&lt;p&gt;CodeMentor AI is an AI-powered coding practice mentor built at HackWithIndia 2026. It looks like VS Code — Monaco Editor in the center, 75 LeetCode-style problems on the left, AI mentor chat on the right.&lt;/p&gt;

&lt;p&gt;The idea was simple: every coding platform forgets you the moment you close the tab. We wanted to build one that didn't. A mentor that remembers your mistakes, your patterns, your weak spots — and uses that to actually help you improve.&lt;/p&gt;

&lt;p&gt;The AI mentor is powered by Groq's &lt;code&gt;llama-3.3-70b&lt;/code&gt;. The memory layer is powered by Hindsight. My job was making those two things work together in a way that felt natural — not robotic, not scripted, just genuinely useful.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Problem I Was Actually Solving
&lt;/h2&gt;

&lt;p&gt;Before Hindsight, our AI mentor was technically correct and completely useless.&lt;/p&gt;

&lt;p&gt;It would give good hints. Generic good hints. The kind that are accurate for any developer in any situation, which means they're perfectly calibrated for no developer in any specific situation.&lt;/p&gt;

&lt;p&gt;Someone fails a dynamic programming problem for the third time in a row. The mentor says: &lt;em&gt;"Consider breaking this into subproblems."&lt;/em&gt; Correct. Useless. It said the exact same thing the first two times.&lt;/p&gt;

&lt;p&gt;The mentor had no memory of the first two times. Every session was session one.&lt;/p&gt;

&lt;p&gt;I tried fixing this with localStorage — dumping chat history into the browser and reloading it next session. It broke almost immediately. After three sessions you're feeding 40,000 tokens of irrelevant context into every LLM call. Responses got slower, vaguer, worse.&lt;/p&gt;

&lt;p&gt;What I needed wasn't more context. I needed &lt;em&gt;smarter&lt;/em&gt; context.&lt;/p&gt;




&lt;h2&gt;
  
  
  How Hindsight Actually Works Here
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://hindsight.vectorize.io/" rel="noopener noreferrer"&gt;Hindsight memory system&lt;/a&gt; gives you three operations. Here's exactly how I use each one in CodeMentor AI.&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.amazonaws.com%2Fuploads%2Farticles%2Fmcragn7r54fx4bw3sizp.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.amazonaws.com%2Fuploads%2Farticles%2Fmcragn7r54fx4bw3sizp.png" alt=" " width="671" height="330"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  retain() — Store What Happened
&lt;/h3&gt;

&lt;p&gt;After every code submission, I call &lt;code&gt;retain()&lt;/code&gt; with a structured summary:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;retain&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;hindsightKey&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;bankId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;username&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; attempted "&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;problem&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;" (&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;problem&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;difficulty&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;).
   Result: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;pass&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;SOLVED&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;FAILED&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;. Attempt #&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;attempts&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;.
   &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;pass&lt;/span&gt;
     &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="s2"&gt;`Error: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;. Failed &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;failedCount&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;total&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; test cases.`&lt;/span&gt;
     &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Solved successfully.&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
   &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;pass&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;success&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;failure&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;problem&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;problem&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;tags&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;problem&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;tags&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;        &lt;span class="c1"&gt;// ['array', 'dynamic-programming', etc]&lt;/span&gt;
    &lt;span class="na"&gt;language&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;lang&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;timestamp&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;toISOString&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;Key decision: I don't store raw code. I store &lt;em&gt;meaning&lt;/em&gt;. "Krishna failed Coin Change attempt 2, dynamic programming, wrong base case" is a useful memory. The actual 30 lines of wrong JavaScript is noise.&lt;/p&gt;

&lt;p&gt;I also call &lt;code&gt;retain()&lt;/code&gt; when someone asks for a hint — that tells the system they got stuck, and on exactly what concept.&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.amazonaws.com%2Fuploads%2Farticles%2F4zzcx0wkz96283apudyp.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.amazonaws.com%2Fuploads%2Farticles%2F4zzcx0wkz96283apudyp.png" alt=" " width="800" height="390"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  recall() — Fetch What's Relevant
&lt;/h3&gt;

&lt;p&gt;When someone selects a problem, I immediately fetch relevant memories before the editor even loads:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;memories&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;recall&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nx"&gt;hindsightKey&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;bankId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;username&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; past attempts and errors on &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;problem&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On app load, I run a broader query:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;patterns&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;recall&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nx"&gt;hindsightKey&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;bankId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;username&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; overall coding patterns and recurring mistakes`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="mi"&gt;8&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These memories go straight into the AI mentor's system prompt. That's it. That's the whole trick. The LLM gets context, and it uses it naturally — I don't write special logic to handle it.&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.amazonaws.com%2Fuploads%2Farticles%2F26zejfx09me7y3oxk1dp.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.amazonaws.com%2Fuploads%2Farticles%2F26zejfx09me7y3oxk1dp.png" alt=" " width="779" height="347"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  reflect() — Personalize the Response
&lt;/h3&gt;

&lt;p&gt;Before the mentor responds to a failed submission, I call &lt;code&gt;reflect()&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;reflection&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;reflect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nx"&gt;hindsightKey&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;bankId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="s2"&gt;`What are &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;username&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;'s main weaknesses based on their coding history?`&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The system prompt then looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;systemPrompt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`
You are CodeMentor AI, an expert coding tutor for &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;username&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;.

What you remember about this user:
&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;memories&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;slice&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="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;m&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;m&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;&lt;span class="s2"&gt;

Synthesized insight:
&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;reflection&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;

Current problem: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;problem&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; (&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;problem&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;difficulty&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;)
Their code: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;code&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;substring&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="mi"&gt;400&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;&lt;span class="s2"&gt;

Give a targeted 2-3 sentence hint. Be specific to their history.
Don't give the full solution.
`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The response stops being generic the moment memory is in the prompt. The LLM isn't guessing who you are anymore — it knows.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Moment That Surprised Me
&lt;/h2&gt;

&lt;p&gt;Session three. I opened the app as "krishna", same as before.&lt;/p&gt;

&lt;p&gt;The mentor greeted me with a message referencing two specific things I'd struggled with in previous sessions. I had not engineered this. There was no code path that said "if user has memories, personalize greeting." The LLM received the recalled context and used it the way a human tutor would — naturally, without being told to.&lt;/p&gt;

&lt;p&gt;That's what &lt;a href="https://vectorize.io/features/agent-memory" rel="noopener noreferrer"&gt;agent memory done right&lt;/a&gt; actually feels like. You don't notice the system working. You just notice the AI stopped being generic.&lt;/p&gt;

&lt;p&gt;The other thing that caught me off guard: Hindsight automatically consolidates related memories into higher-level Observations in the background. After a few sessions, it had synthesized "this user struggles with base cases in recursive problems" — without me writing any consolidation logic. It inferred a pattern from individual facts.&lt;/p&gt;

&lt;p&gt;I hadn't built that. It emerged.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I Got Wrong First
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;I stored too much.&lt;/strong&gt; My first version retained full code submissions, full error messages, full conversation transcripts. The recall results were huge and unfocused. Signal drowned in noise. Switching to structured summaries — mistake type, problem tag, outcome — fixed it immediately.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I tested wrong.&lt;/strong&gt; I kept clearing the memory bank between tests and starting fresh. That's the worst way to test a memory system. The interesting behavior shows up at session three and four, when patterns have accumulated. I almost shipped without ever seeing the actual value of what I'd built.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I waited too long to call recall().&lt;/strong&gt; My first version only fetched memories when the user asked a question. Wrong. I should front-load context — call &lt;code&gt;recall()&lt;/code&gt; the moment a problem is selected, the moment a session starts. Don't wait. Memory is most useful before the user says anything.&lt;/p&gt;




&lt;h2&gt;
  
  
  What It Looks Like Now
&lt;/h2&gt;

&lt;p&gt;Open the app. Select a problem. Before you type a single character, the mentor has already pulled your relevant history. The skill radar on the left reflects your actual performance — not placeholder data, but scores derived from recalled Hindsight memories.&lt;/p&gt;

&lt;p&gt;Fail a test case. The mentor's hint references your specific error pattern, not a generic category. Ask for a hint explicitly. It retains that too — "Krishna needed a hint on dynamic programming after 1 attempt" — and the next session, it adjusts.&lt;/p&gt;

&lt;p&gt;Close the app. Open it again tomorrow. It still knows.&lt;/p&gt;

&lt;p&gt;That's the whole thing. That's what makes it a mentor instead of a chatbot.&lt;/p&gt;




&lt;h2&gt;
  
  
  Lessons Worth Taking
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Design your memory schema before writing agent logic.&lt;/strong&gt; What you retain determines what you can recall. Spend time here. It's the actual hard part.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Store meaning, not data.&lt;/strong&gt; Summaries outperform transcripts. Structured observations outperform raw logs. Every time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The personalization emerges — you don't code it.&lt;/strong&gt; Shape your LLM prompt with recalled memory, and the adaptation follows naturally. You don't need special if-statements for "if user has struggled before, say X."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Test at session 3, not session 1.&lt;/strong&gt; Single-session demos make memory look optional. The value compounds. Show that.&lt;/p&gt;




&lt;h2&gt;
  
  
  Try It
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://codemento.netlify.app/" rel="noopener noreferrer"&gt;codemento.netlify.app&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Free Groq key from &lt;a href="https://groq.com" rel="noopener noreferrer"&gt;groq.com&lt;/a&gt;. Free Hindsight Cloud account from &lt;a href="https://ui.hindsight.vectorize.io" rel="noopener noreferrer"&gt;ui.hindsight.vectorize.io&lt;/a&gt; — use code &lt;code&gt;MEMHACK315&lt;/code&gt; for $50 free credits.&lt;/p&gt;

&lt;p&gt;If you're building anything where the same user comes back more than once — a tutor, a support agent, a code reviewer — persistent memory isn't a nice-to-have. It's the difference between a tool that helps and a tool that actually improves.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Built at HackWithIndia 2026.&lt;/em&gt;&lt;br&gt;&lt;br&gt;
&lt;em&gt;Team: Karan Patil, Sarvesh Gajakosh, Priya Vhatkar, Krishna Hasare, Siddhi Shinde, Aastha Sawade.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Resources:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/vectorize-io/hindsight" rel="noopener noreferrer"&gt;Hindsight on GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://hindsight.vectorize.io/" rel="noopener noreferrer"&gt;Hindsight Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://vectorize.io/features/agent-memory" rel="noopener noreferrer"&gt;Agent Memory — Vectorize&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://codemento.netlify.app/" rel="noopener noreferrer"&gt;CodeMentor AI — Live Demo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




</description>
    </item>
  </channel>
</rss>
