<?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: Bhavi0816</title>
    <description>The latest articles on DEV Community by Bhavi0816 (@bhavi0816).</description>
    <link>https://dev.to/bhavi0816</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%2F4149375%2F4e9fee6e-0918-4ec5-b9d2-5b87fe073e9f.png</url>
      <title>DEV Community: Bhavi0816</title>
      <link>https://dev.to/bhavi0816</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/bhavi0816"/>
    <language>en</language>
    <item>
      <title>I Built an Agent That Improves Every Session With Hindsight</title>
      <dc:creator>Bhavi0816</dc:creator>
      <pubDate>Tue, 29 Sep 2026 18:28:28 +0000</pubDate>
      <link>https://dev.to/bhavi0816/i-built-an-agent-that-improves-every-session-with-hindsight-11o7</link>
      <guid>https://dev.to/bhavi0816/i-built-an-agent-that-improves-every-session-with-hindsight-11o7</guid>
      <description>&lt;h1&gt;
  
  
  I Built an Agent That Improves Every Session With Hindsight
&lt;/h1&gt;

&lt;p&gt;The first time my accounts payable agent saw an invoice from Apex Industrial Supplies, it flagged it as an exception. That was the right call. It had no idea what a normal Apex invoice looked like.&lt;/p&gt;

&lt;p&gt;What interested me was everything after that: what happens when a human says "this one is fine," and whether the agent can carry that judgment into the next invoice.&lt;/p&gt;

&lt;h2&gt;
  
  
  What VendorSense does
&lt;/h2&gt;

&lt;p&gt;VendorSense is an accounts payable agent built around one idea: &lt;strong&gt;it learns what normal looks like for every vendor.&lt;/strong&gt; You upload an invoice (PDF, PNG, or JPG), and the agent decides whether it can be processed automatically or needs a person to look at it.&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%2Ffgunkw5jydy091fdbsz8.jpeg" 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%2Ffgunkw5jydy091fdbsz8.jpeg" alt=" " width="800" height="375"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The overview tracks how many invoices were processed automatically, how many went to a human, and how many became learning events.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Every invoice moves through the same six-step pipeline:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Invoice captured&lt;/strong&gt;: the file is stored and its fields are extracted&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hindsight recall&lt;/strong&gt;: the agent asks memory what it knows about this vendor&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Groq reasoning&lt;/strong&gt;: an LLM compares the invoice against what was recalled&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Decision&lt;/strong&gt;: process automatically, or raise an exception with a confidence level&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Human review, if needed&lt;/strong&gt;: a person approves or rejects, with a note&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hindsight retain&lt;/strong&gt;: that decision becomes memory
&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%2F8m4zhyaj6qwglp1wtta5.jpeg" alt=" " width="800" height="375"&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The agent itself is stateless. Everything it knows about vendors lives in &lt;a href="https://github.com/vectorize-io/hindsight" rel="noopener noreferrer"&gt;Hindsight&lt;/a&gt;, an open-source agent memory system running as a separate service. Each user gets a private workspace with isolated data, so one team's vendor history never leaks into another's.&lt;/p&gt;
&lt;h2&gt;
  
  
  Why fixed rules don't work for invoices
&lt;/h2&gt;

&lt;p&gt;Classic accounts payable automation is a pile of thresholds: flag anything over a set amount, flag anything without a PO. Those rules have the wrong shape for the problem.&lt;/p&gt;

&lt;p&gt;"Normal" is a property of the vendor, not of the company. One vendor bills a nearly identical amount on Net 30 terms every month, and a 4% difference is worth a look. Another vendor's amounts swing widely by design. A single global threshold either floods reviewers with false alarms or lets the strange invoice through.&lt;/p&gt;

&lt;p&gt;I wanted the agent to build that per-vendor picture from the people who actually review the invoices, and to keep refining it over time. That is a memory problem, not a rules problem.&lt;/p&gt;
&lt;h2&gt;
  
  
  Why Hindsight
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://hindsight.vectorize.io/" rel="noopener noreferrer"&gt;Hindsight&lt;/a&gt; gives me three operations, and I only needed them to map onto two moments in the pipeline:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Retain&lt;/strong&gt; stores what happened&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Recall&lt;/strong&gt; retrieves what's relevant before a decision&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reflect&lt;/strong&gt; reasons over stored memories to surface patterns&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Recall uses several retrieval strategies in parallel (semantic, keyword, graph, and temporal) rather than one similarity search. For invoices that matters. "What do we know about Apex Industrial Supplies, and how have their amounts changed?" is a question about an entity over time, and a plain embedding lookup handles it poorly. If you want the background on why this matters for agents, Vectorize's explainer on &lt;a href="https://vectorize.io/what-is-agent-memory" rel="noopener noreferrer"&gt;agent memory&lt;/a&gt; is a good primer.&lt;/p&gt;
&lt;h2&gt;
  
  
  The core loop
&lt;/h2&gt;

&lt;p&gt;The pattern is &lt;strong&gt;recall before deciding, retain after a human weighs in.&lt;/strong&gt; The wiring lives in &lt;strong&gt;[FILE PATH, e.g. &lt;code&gt;agent/memory.py&lt;/code&gt;]&lt;/strong&gt;, and it looks roughly like this:&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="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;hindsight_client&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Hindsight&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;http://localhost:8888&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;decide&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;invoice&lt;/span&gt;&lt;span class="p"&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="c1"&gt;# 1. Ask memory what we know about this vendor BEFORE reasoning
&lt;/span&gt;    &lt;span class="n"&gt;recalled&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;recall&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="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Previous invoices and decisions for &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;invoice&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;vendor&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;experience&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="sh"&gt;"&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="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;- &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;recalled&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;results&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# 2. Reason over the invoice plus recalled experience
&lt;/span&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;reason_with_llm&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;invoice&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;experience&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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;learn_from_review&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;invoice&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;decision&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;reviewer_note&lt;/span&gt;&lt;span class="p"&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="c1"&gt;# 3. After a human approves or rejects, retain the decision AND the why
&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;retain&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="p"&gt;(&lt;/span&gt;
            &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Vendor &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;invoice&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;vendor&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;, invoice &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;invoice&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;invoice_id&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="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;amount &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;invoice&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;amount&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;: human &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;decision&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="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Reviewer note: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;reviewer_note&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;human invoice review&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;&lt;em&gt;(Swap in the real functions from your repo. These show the shape using the Hindsight client's &lt;code&gt;recall&lt;/code&gt; and &lt;code&gt;retain&lt;/code&gt; calls.)&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The cold start: an exception is the right answer
&lt;/h2&gt;

&lt;p&gt;On a vendor the agent knows nothing about, the interface says so plainly. Hindsight returns nothing relevant, and the agent raises an exception with a confidence level and a reason.&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%2F54yelbz9it718on7xi70.jpeg" 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%2F54yelbz9it718on7xi70.jpeg" alt=" " width="800" height="362"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I like that the panel doesn't pretend. "No relevant previous vendor experience found" is followed by a line saying this is a new learning situation and that a human decision can become future experience. The empty memory is a state the system handles honestly, not an error.&lt;/p&gt;

&lt;h2&gt;
  
  
  The evidence trail
&lt;/h2&gt;

&lt;p&gt;When the agent does have history, it shows its work. In the review screen, it lists the specific evidence behind its decision: a prior approved invoice from the same vendor on Net 30 terms, a current amount that is close to the earlier one but not identical, and identifiers that don't look like the vendor's earlier structured IDs.&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%2Fwyqp1ebgi9st1ramhgdl.jpeg" 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%2Fwyqp1ebgi9st1ramhgdl.jpeg" alt=" " width="800" height="518"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Reviewers shouldn't have to trust a bare "exception." Citing the prior invoice, the amount comparison, and the malformed fields lets a person confirm or overrule the agent in seconds.&lt;/p&gt;

&lt;h2&gt;
  
  
  Human review is the teaching step
&lt;/h2&gt;

&lt;p&gt;The review form has a note field ("Explain what you verified...") and two buttons: &lt;strong&gt;Approve &amp;amp; Teach Agent&lt;/strong&gt; and &lt;strong&gt;Reject &amp;amp; Teach Agent&lt;/strong&gt;. The wording is deliberate. A click isn't just closing a ticket; it's writing to memory.&lt;/p&gt;

&lt;p&gt;The reviewer's note is retained alongside the decision. So the memory isn't a pile of yes/no labels. It contains the reasoning of the person who checked, and that's what later recalls can lean on.&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%2Fnpvamqfrtrtgiy7wa6v6.jpeg" 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%2Fnpvamqfrtrtgiy7wa6v6.jpeg" alt=" " width="800" height="376"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A "Learning Status" counter shows how many human decisions have been retained, so it's visible when the system has actually learned something rather than just processed something.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it looks like across sessions
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;First invoice from a vendor&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Agent:&lt;/strong&gt; Exception. No prior experience with this vendor. Confidence: medium.&lt;br&gt;
&lt;strong&gt;Reviewer:&lt;/strong&gt; Approves, with a note on what they verified.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Later invoice from the same vendor&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Agent:&lt;/strong&gt; &lt;strong&gt;[YOUR REAL EXAMPLE: e.g. "Matches prior approved Apex invoice pattern. Auto-processed."]&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Nothing in the prompt changed between the two. The difference is what came back from recall.&lt;/p&gt;

&lt;h2&gt;
  
  
  What was painful
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Extraction errors look like vendor anomalies.&lt;/strong&gt; In one run, the extracted invoice ID came back as the generic word "Invoice" and the purchase order as a garbled fragment. The agent correctly treated that as suspicious, but the vendor wasn't the problem; the extraction was. Memory can't fix bad input, and I had to be careful not to teach the agent that a vendor's format had changed when really the OCR had failed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deciding what to retain.&lt;/strong&gt; &lt;strong&gt;[YOUR REAL EXPERIENCE, e.g. "storing raw extracted text made recall noisy; storing the decision and the reviewer's reason worked better."]&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cold start.&lt;/strong&gt; Every new vendor starts as an exception. That's the correct behavior, but it means the first weeks of use are review-heavy.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Lessons learned
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Treat "normal" as per-entity state.&lt;/strong&gt; Global thresholds fight the shape of the problem. Memory keyed to the vendor matches it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keep the agent stateless.&lt;/strong&gt; Pushing memory into Hindsight made the agent easier to restart, test, and reason about.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Retain the reason, not just the verdict.&lt;/strong&gt; A reviewer's note is worth more than an approve/reject flag.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Make empty memory a first-class state.&lt;/strong&gt; "I don't know this vendor yet" should be shown, not hidden.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Show the evidence.&lt;/strong&gt; People will trust an agent that cites the prior invoice and the specific mismatch far sooner than one that just says "exception."&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Try it yourself
&lt;/h2&gt;

&lt;p&gt;If you're building anything where decisions should improve as humans correct them, start with the &lt;a href="https://hindsight.vectorize.io/" rel="noopener noreferrer"&gt;Hindsight docs&lt;/a&gt; and the &lt;a href="https://github.com/vectorize-io/hindsight" rel="noopener noreferrer"&gt;open-source repo&lt;/a&gt;. Retain and recall can be working in an afternoon; the interesting part is when your agent starts using a reviewer's judgment you'd forgotten you gave it.&lt;/p&gt;

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