<?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: Sarthak</title>
    <description>The latest articles on DEV Community by Sarthak (@sarthak_0303).</description>
    <link>https://dev.to/sarthak_0303</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%2F4148339%2F5992cf1b-bf83-4da2-b1fa-8332e6052beb.png</url>
      <title>DEV Community: Sarthak</title>
      <link>https://dev.to/sarthak_0303</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/sarthak_0303"/>
    <language>en</language>
    <item>
      <title>I Built an Engineering Agent That Remembers What Happened Before</title>
      <dc:creator>Sarthak</dc:creator>
      <pubDate>Tue, 29 Sep 2026 02:42:34 +0000</pubDate>
      <link>https://dev.to/sarthak_0303/i-built-an-engineering-agent-that-remembers-what-happened-before-k85</link>
      <guid>https://dev.to/sarthak_0303/i-built-an-engineering-agent-that-remembers-what-happened-before-k85</guid>
      <description>&lt;h1&gt;
  
  
  I Built an Engineering Agent That Remembers What Happened Before
&lt;/h1&gt;

&lt;p&gt;Every engineering team eventually runs into the same problem: we learn important lessons from deployments, incidents, and changes, but those lessons are difficult to reuse when the next similar change arrives.&lt;/p&gt;

&lt;p&gt;A developer may know that a particular service previously had problems when a configuration was changed. Another engineer may remember the mitigation. Months later, someone else makes a similar change without knowing what happened before.&lt;/p&gt;

&lt;p&gt;I wanted to build a system that could turn those past engineering experiences into useful context for future changes.&lt;/p&gt;

&lt;p&gt;That became &lt;strong&gt;Engineering Change Memory Agent&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The idea is simple: before recommending how an engineering change should be rolled out, the agent recalls relevant experiences from the team's history, reasons about them, and then produces a recommendation.&lt;/p&gt;

&lt;p&gt;The project uses &lt;strong&gt;Hindsight&lt;/strong&gt; as the memory layer.&lt;/p&gt;

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

&lt;p&gt;Traditional deployment tooling can tell us what is happening now. Monitoring can show latency, errors, resource usage, and alerts. CI/CD systems can validate and deploy code.&lt;/p&gt;

&lt;p&gt;But these systems don't necessarily answer a different question:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"What happened the last time we made a similar change?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That question requires historical context.&lt;/p&gt;

&lt;p&gt;For example, imagine an upcoming change to a payment service:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Service: &lt;code&gt;payments-api&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Change: increase the database connection pool&lt;/li&gt;
&lt;li&gt;Environment: production&lt;/li&gt;
&lt;li&gt;Timing: business hours&lt;/li&gt;
&lt;li&gt;Risk: high payment traffic&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If the team has previously experienced database saturation after a similar change, that experience should influence how the next change is approached.&lt;/p&gt;

&lt;p&gt;The challenge is making that experience available to the agent at the right time.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Approach
&lt;/h2&gt;

&lt;p&gt;I designed the system around a simple flow:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Change → Recall → Reflect → Decide&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The user first provides the context of the upcoming engineering change.&lt;/p&gt;

&lt;p&gt;The agent then:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Recalls&lt;/strong&gt; relevant historical experiences from Hindsight.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reflects&lt;/strong&gt; on those experiences together with the current change.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Decides&lt;/strong&gt; what rollout strategy and safeguards make sense.&lt;/li&gt;
&lt;li&gt;Returns the recommendation along with the memory evidence that influenced it.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;After a change is completed, the user can also record the outcome.&lt;/p&gt;

&lt;p&gt;That outcome becomes part of the team's engineering memory and can influence future recommendations.&lt;/p&gt;

&lt;h2&gt;
  
  
  Architecture
&lt;/h2&gt;

&lt;p&gt;The prototype uses a small FastAPI backend with a frontend interface.&lt;/p&gt;

&lt;p&gt;The basic architecture is:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Frontend → FastAPI → Change Agent → Hindsight + LLM&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The frontend collects:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;service&lt;/li&gt;
&lt;li&gt;change type&lt;/li&gt;
&lt;li&gt;change summary&lt;/li&gt;
&lt;li&gt;environment&lt;/li&gt;
&lt;li&gt;timing&lt;/li&gt;
&lt;li&gt;risk context&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The FastAPI &lt;code&gt;/analyze&lt;/code&gt; endpoint passes this information to the change agent.&lt;/p&gt;

&lt;p&gt;The agent retrieves relevant historical experiences from Hindsight and uses them as context for reasoning.&lt;/p&gt;

&lt;p&gt;The resulting response includes information such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;recommendation&lt;/li&gt;
&lt;li&gt;rollout strategy&lt;/li&gt;
&lt;li&gt;uncertainty&lt;/li&gt;
&lt;li&gt;safeguards&lt;/li&gt;
&lt;li&gt;number of memories used&lt;/li&gt;
&lt;li&gt;memory evidence&lt;/li&gt;
&lt;li&gt;explanation of why memory changed the recommendation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This makes the memory contribution visible rather than hiding it behind a single generated answer.&lt;/p&gt;

&lt;h2&gt;
  
  
  Connecting the Frontend to the Agent
&lt;/h2&gt;

&lt;p&gt;The frontend sends the change context to the backend using a normal HTTP request.&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 javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;r&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;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/analyze&lt;/span&gt;&lt;span class="dl"&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;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;POST&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Content-Type&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="s2"&gt;application/json&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;service&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;service&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;trim&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
    &lt;span class="na"&gt;change_type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;changeType&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;trim&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
    &lt;span class="na"&gt;summary&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;summary&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;trim&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;environment&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;timing&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;timing&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;risk_context&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;riskContext&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;trim&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 important part isn't the HTTP request itself.&lt;/p&gt;

&lt;p&gt;The important part is what happens after the request reaches the agent: the change is evaluated against previously retained engineering experiences.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where Hindsight Fits
&lt;/h2&gt;

&lt;p&gt;Hindsight is the memory layer of the project.&lt;/p&gt;

&lt;p&gt;I use it to retain engineering experiences such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;deployment context&lt;/li&gt;
&lt;li&gt;change details&lt;/li&gt;
&lt;li&gt;observed outcomes&lt;/li&gt;
&lt;/ul&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%2Fi5zyopsnhh9cdlg5lnxe.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%2Fi5zyopsnhh9cdlg5lnxe.png" alt=" " width="800" height="679"&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%2Fd9x4aq9u4gbgd50iuvci.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%2Fd9x4aq9u4gbgd50iuvci.png" alt=" " width="800" height="631"&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%2F0nuay79wnu8g8s9fc8xk.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%2F0nuay79wnu8g8s9fc8xk.png" alt=" " width="799" height="439"&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%2Fxx94aj2743jleuywl6b7.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%2Fxx94aj2743jleuywl6b7.png" alt=" " width="800" height="411"&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%2Fn9c4hx6yfwqtuks6dx56.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%2Fn9c4hx6yfwqtuks6dx56.png" alt=" " width="800" height="410"&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%2F6jeax6roste1july7z7q.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%2F6jeax6roste1july7z7q.png" alt=" " width="800" height="391"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>devops</category>
      <category>python</category>
      <category>fastapi</category>
    </item>
  </channel>
</rss>
