<?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: Edward Amirain</title>
    <description>The latest articles on DEV Community by Edward Amirain (@edwardamirain).</description>
    <link>https://dev.to/edwardamirain</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%2F4153591%2F8b2e15f4-8e4a-4ceb-a219-ebde2a7ae24d.jpg</url>
      <title>DEV Community: Edward Amirain</title>
      <link>https://dev.to/edwardamirain</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/edwardamirain"/>
    <language>en</language>
    <item>
      <title>Building an AI project estimator with prices the model cannot invent</title>
      <dc:creator>Edward Amirain</dc:creator>
      <pubDate>Thu, 01 Oct 2026 04:58:03 +0000</pubDate>
      <link>https://dev.to/edwardamirain/building-an-ai-project-estimator-with-prices-the-model-cannot-invent-53o9</link>
      <guid>https://dev.to/edwardamirain/building-an-ai-project-estimator-with-prices-the-model-cannot-invent-53o9</guid>
      <description>&lt;p&gt;When I built Project Blueprint at Vaynerov Technologies, I kept pricing outside the language model.&lt;/p&gt;

&lt;p&gt;Blueprint starts with a product description and proposes an architecture, a delivery plan and a team. Those are useful inputs to a project conversation. The price range comes from a separate calculation engine, using the same rules as our pricing page.&lt;/p&gt;

&lt;p&gt;That separation shapes the whole feature: what the model may return, how its output is checked, what the browser can submit and what the server will store.&lt;/p&gt;

&lt;p&gt;This is an adaptation of my &lt;a href="https://vaynerov.com/articles/an-ai-architect-with-honest-prices" rel="noopener noreferrer"&gt;original build story&lt;/a&gt;, focused on that boundary.&lt;/p&gt;

&lt;h2&gt;
  
  
  Give the model a bounded vocabulary
&lt;/h2&gt;

&lt;p&gt;The model proposes selections from the pricing catalog: platforms, features and other scope choices. Before pricing runs, a sanitizer checks those selections. Unknown identifiers are removed, and required single-choice fields receive defaults if they are missing.&lt;/p&gt;

&lt;p&gt;The catalog in the prompt, the schema’s allowed values and the sanitizer’s allowlist all come from the same rules object. That avoids three independently maintained definitions of what the product supports.&lt;/p&gt;

&lt;p&gt;The flow is straightforward:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Product description
    → Proposed architecture and scope
    → Validated, sanitized selections
    → Calculation engine
    → Estimate
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The model influences the proposed scope, so this does not make the estimate independent of model output. It makes that influence explicit and inspectable. Reviewing the selected features remains part of reviewing the estimate.&lt;/p&gt;

&lt;p&gt;That distinction is useful in any AI feature that feeds a business process. A constrained selection can still be a poor recommendation. Validation tells you whether an input is permitted; it does not settle whether the recommendation suits the user.&lt;/p&gt;

&lt;h2&gt;
  
  
  Check more than the JSON shape
&lt;/h2&gt;

&lt;p&gt;Blueprint uses structured output, then validates and sanitizes the parsed result. The graph sanitizer removes duplicate identifiers, self-loops and edges that point to missing nodes. It also repairs phase references so the diagram remains coherent.&lt;/p&gt;

&lt;p&gt;A response can be valid JSON and still describe an unusable graph. The application needs checks that reflect what its renderer and downstream functions actually require.&lt;/p&gt;

&lt;p&gt;For a different product, those checks might cover valid references between records, supported combinations of options or bounds on a generated plan. The useful question is: what assumptions will the next function make about this data?&lt;/p&gt;

&lt;h2&gt;
  
  
  Recalculate when the result becomes a record
&lt;/h2&gt;

&lt;p&gt;When a visitor requests a quote, the server validates the request, sanitizes the selections and calculates the estimate again. Numbers supplied by the browser are ignored.&lt;/p&gt;

&lt;p&gt;This gives the stored quote an authoritative calculation point. Browser state is convenient for an interactive preview, but it should not define the value that becomes a business record.&lt;/p&gt;

&lt;p&gt;The same review question applies to discounts, entitlements and usage charges: where does a displayed suggestion become an authoritative value, and which component is allowed to make that decision?&lt;/p&gt;

&lt;h2&gt;
  
  
  Keep the fallback consistent
&lt;/h2&gt;

&lt;p&gt;Blueprint also has hand-authored reference blueprints for use when generation is unavailable. Their estimates still run through the calculation engine.&lt;/p&gt;

&lt;p&gt;That makes the fallback useful for exploring the product’s planning and pricing behavior. It also keeps an example from establishing a different set of expectations than the full flow.&lt;/p&gt;

&lt;p&gt;You can &lt;a href="https://vaynerov.com/blueprint" rel="noopener noreferrer"&gt;explore Blueprint and its reference plans&lt;/a&gt;, or read the &lt;a href="https://vaynerov.com/articles/an-ai-architect-with-honest-prices" rel="noopener noreferrer"&gt;full implementation story&lt;/a&gt; for the surrounding transport, validation and rendering decisions.&lt;/p&gt;

&lt;p&gt;Where do you draw the boundary between a model’s recommendation and your application’s authority to act on it?&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>architecture</category>
      <category>programming</category>
    </item>
  </channel>
</rss>
