<?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: Michael Choi</title>
    <description>The latest articles on DEV Community by Michael Choi (@readmybidteam).</description>
    <link>https://dev.to/readmybidteam</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%2F4128977%2Fbfb6266f-b469-4797-bbb2-b6e964e6e331.png</url>
      <title>DEV Community: Michael Choi</title>
      <link>https://dev.to/readmybidteam</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/readmybidteam"/>
    <language>en</language>
    <item>
      <title>The hardest part of my AI quote checker was teaching it not to guess</title>
      <dc:creator>Michael Choi</dc:creator>
      <pubDate>Thu, 17 Sep 2026 03:39:46 +0000</pubDate>
      <link>https://dev.to/readmybidteam/the-hardest-part-of-my-ai-quote-checker-was-teaching-it-not-to-guess-38fe</link>
      <guid>https://dev.to/readmybidteam/the-hardest-part-of-my-ai-quote-checker-was-teaching-it-not-to-guess-38fe</guid>
      <description>&lt;p&gt;Two roofers quote the same roof. One proposal is shorter and cheaper. Does that make it better value—or just less specific?&lt;/p&gt;

&lt;p&gt;I'm building ReadMyBid, a free beta for reviewing U.S. residential roofing quotes. The interesting engineering problem hasn't been making the model sound knowledgeable. It's making the output less confident when the document doesn't support a conclusion.&lt;/p&gt;

&lt;h2&gt;
  
  
  Missing is not excluded
&lt;/h2&gt;

&lt;p&gt;If a quote doesn't mention flashing, that doesn't prove the contractor won't replace it. It also doesn't prove the existing flashing needs replacement. All we can honestly say is that the document doesn't state the scope clearly.&lt;/p&gt;

&lt;p&gt;We separate included, unclear, not stated, and explicitly excluded scope. The useful next step is often a question for the contractor, not a red flag delivered with dramatic certainty. The roof already has enough potential leaks; the reasoning shouldn't add another.&lt;/p&gt;

&lt;h2&gt;
  
  
  A strict schema isn't a truth filter
&lt;/h2&gt;

&lt;p&gt;A model can produce perfectly valid JSON containing an unsupported finding. Schema validation helps with predictable rendering, but it doesn't establish that a claim came from the quote.&lt;/p&gt;

&lt;p&gt;For revised quotes, we moved price differences and scope-status transitions into server-side calculations. The model extracts structured information; ordinary code calculates the differences. That still depends on accurate extraction, but it removes an unnecessary layer of model arithmetic and interpretation.&lt;/p&gt;

&lt;h2&gt;
  
  
  First establish that the documents belong together
&lt;/h2&gt;

&lt;p&gt;A comparison can sound convincing even when the files describe different contractors or jobs. We treat uncertain document matches conservatively. A contractor-name mismatch overrides a model's likely-match assessment, and unmatched pairs don't receive revision-improvement claims.&lt;/p&gt;

&lt;p&gt;Name normalization has limits: removing a legal suffix isn't proof of identity. This is a guardrail, not an identity-verification system.&lt;/p&gt;

&lt;h2&gt;
  
  
  We removed a feature instead of adding another prompt
&lt;/h2&gt;

&lt;p&gt;Initially, free-text lists of new exclusions and new risks could make restated terms sound newly introduced. Adding phrase filters helped individual examples but made the behavior increasingly brittle.&lt;/p&gt;

&lt;p&gt;We stopped asking the model to generate those lists. The server now derives them from a fixed set of structured scope transitions. An included item becoming explicitly excluded can support a new-exclusion finding. A generic sentence about a written approval process possibly causing delays cannot.&lt;/p&gt;

&lt;p&gt;The tradeoff is real: a contract-wide exclusion that doesn't map to a structured field may not appear as a new finding. For this beta, we'd rather miss a possible finding than confidently invent one. The UI shouldn't imply that the review is exhaustive.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tests are not homeowner validation
&lt;/h2&gt;

&lt;p&gt;We've used sample and synthetic documents to test validation, scope transitions, document mismatches, and report behavior. Those checks aren't evidence that real homeowners find the product useful. That's still what we're trying to learn.&lt;/p&gt;

&lt;p&gt;The tool reviews written documents. It doesn't inspect a roof, establish local fair pricing, approve a contractor, or give legal advice.&lt;/p&gt;

&lt;p&gt;If you've built document-review systems, I'd be interested in how you test the boundary between not stated and genuinely adverse. What failure cases would you put into the test set?&lt;/p&gt;

&lt;p&gt;Disclosure: I built &lt;a href="https://readmybid.com" rel="noopener noreferrer"&gt;ReadMyBid&lt;/a&gt;. It's currently a free beta. Uploaded quotes are sent to OpenAI for analysis and aren't saved to our app's database; users should remove personal details first.&lt;/p&gt;

&lt;p&gt;This article was drafted with AI assistance and reviewed against our implementation notes.&lt;/p&gt;

</description>
      <category>webdev</category>
    </item>
  </channel>
</rss>
