<?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: CyprianTinasheAarons</title>
    <description>The latest articles on DEV Community by CyprianTinasheAarons (@cypriantinasheaarons).</description>
    <link>https://dev.to/cypriantinasheaarons</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%2F349088%2F21bc56eb-1ebc-4701-896b-8fe1741e4e43.jpeg</url>
      <title>DEV Community: CyprianTinasheAarons</title>
      <link>https://dev.to/cypriantinasheaarons</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/cypriantinasheaarons"/>
    <language>en</language>
    <item>
      <title>The $239,000 Manual Handoff Tax: The ROI of Deep AI-to-ERP Integration 💸</title>
      <dc:creator>CyprianTinasheAarons</dc:creator>
      <pubDate>Fri, 31 Jul 2026 09:17:40 +0000</pubDate>
      <link>https://dev.to/cypriantinasheaarons/the-239000-manual-handoff-tax-the-roi-of-deep-ai-to-erp-integration-313g</link>
      <guid>https://dev.to/cypriantinasheaarons/the-239000-manual-handoff-tax-the-roi-of-deep-ai-to-erp-integration-313g</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;A note on the numbers upfront, because I'd rather you catch this than a client does: $239,000 is illustrative. It's a composite built from published benchmarks on manual data-processing costs, applied to a mid-market company on a legacy ERP (SAP, NetSuite, or Dynamics). Not a universal constant. Recalculate it against your own client's headcount and error rates before you quote it out loud. The method's laid out below so you can defend it if someone pushes back.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Everyone's tuning prompts. Almost no one's fixing the handoff 🤔
&lt;/h2&gt;

&lt;p&gt;Scroll through any AI strategy conversation right now, and it's all prompt engineering, model selection, fine-tuning, which LLM reasons best, which agent framework to standardize on. Easy stuff to obsess over, honestly; it's visible, it's measurable, it's fun to tinker with.&lt;/p&gt;

&lt;p&gt;Here's the problem though. None of it matters if the AI's output still has to get manually copied, reformatted, and re-keyed into your ERP by a person at 6 pm reconciling the day's exceptions.&lt;/p&gt;

&lt;p&gt;That's the handoff. The unglamorous seam between "the AI figured it out" and "the system of record actually has it." And it's exactly where the money leaks out.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key Definitions 🧐
&lt;/h2&gt;

&lt;h4&gt;
  
  
  What's "the handoff"?
&lt;/h4&gt;

&lt;p&gt;The manual step where a person moves AI-generated output into the actual system of record (SAP, NetSuite, Dynamics, whatever it is) because nothing automated does it for them.&lt;/p&gt;

&lt;h4&gt;
  
  
  What's an exception queue?
&lt;/h4&gt;

&lt;p&gt;The pile of records the system genuinely couldn't resolve on its own and needs a human to look at. Before integration, this is most of the work. After, it's a five-minute review.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the handoff really costs
&lt;/h2&gt;

&lt;p&gt;The research on manual data processing is remarkably consistent, and none of it flatters the status quo:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Manual data entry&lt;/code&gt; runs an average of &lt;strong&gt;$15 per document&lt;/strong&gt; once you count labor, error correction, and turnover. A mid-size accounts payable team processing 5,000 invoices a month is sitting at &lt;strong&gt;$75,000 a month&lt;/strong&gt; before a single mistake even gets fixed.&lt;/p&gt;

&lt;p&gt;Human error on manual entry runs &lt;strong&gt;1% for skilled operators, up to 4% for average ones&lt;/strong&gt;, per field. At 20 fields per invoice, that's 0.2 to 0.8 errors per document. Not a risk. A mathematical certainty at any real volume.&lt;/p&gt;

&lt;p&gt;Organizations with 100+ employees spend &lt;strong&gt;$430,000 to $850,000 a year&lt;/strong&gt; on manual document processing once you include the hidden stuff, error remediation at $25 to $150 a mistake, plus staff losing &lt;strong&gt;20 to 40% of their time&lt;/strong&gt; just searching for, verifying, or fixing document issues.&lt;/p&gt;

&lt;p&gt;Poor data quality costs the average org &lt;strong&gt;$12.9 million a year&lt;/strong&gt;, per Gartner. Over a quarter of organizations put their own losses above $5 million annually. 😬&lt;/p&gt;

&lt;p&gt;None of that's actually an AI problem. It's a plumbing problem. And it's exactly the layer most AI rollouts skip, because a chatbot drafting a nice summary is a much easier demo than a pipeline writing clean, validated data straight into SAP.&lt;/p&gt;

&lt;p&gt;Back of the envelope, for a mid-market company running a couple legacy systems with a team still reconciling exceptions by hand: a few FTEs' worth of manual reconciliation, plus error remediation on a modest error rate, plus the opportunity cost of good people doing data entry instead of their actual job, adds up fast into six figures. That's where $239,000 comes from. A realistic annual tax for a specific-sized company, not a number that applies evenly to everyone. Run it against your own client's headcount first.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why the handoff is expensive to fix, and why most vendors underquote it 🎲
&lt;/h2&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%2Fclmc9o279wlo0q3m8pgb.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%2Fclmc9o279wlo0q3m8pgb.png" alt=" " width="800" height="459"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Custom AI-to-ERP integration work typically runs &lt;strong&gt;$10,000 to $35,000&lt;/strong&gt; for one well-scoped integration, which lines up with published benchmarks showing point-to-point ERP integrations (SAP S/4HANA to Salesforce, NetSuite to a custom warehouse system, that kind of thing) landing between $10,000 and $50,000+ depending on complexity.&lt;/p&gt;

&lt;p&gt;Two things reliably push that number up if nobody scopes them correctly upfront.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Legacy system resistance.&lt;/strong&gt; SAP, NetSuite, and Dynamics are the three we run into most on the mid-market side, and each one has its own friction. SAP specifically wants a CSRF token on every write operation plus an OAuth 2.0 client-credentials handshake most developers haven't touched before. Discovering and solving that alone typically eats 2 to 4 weeks that never show up in the original estimate. It's a big part of why &lt;strong&gt;40 to 60% cost overruns are the norm, not the exception&lt;/strong&gt;, on integration projects generally.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Data cleaning and compliance overhead.&lt;/strong&gt; An AI system reads a mangled invoice or a half-structured shipping manifest just fine. Your ERP can't. Every field the AI pulls out has to be validated, mapped to the ERP's schema, and checked against whatever compliance rules govern that record type. That mapping work is where most of the real engineering hours go. Not the AI part.&lt;/p&gt;

&lt;p&gt;The contrast is simple, honestly. Today, a person is the API between your AI tools and your ERP. After deep integration, they're not.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkyc0kq3y49u9cvn3yrf5.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%2Fkyc0kq3y49u9cvn3yrf5.png" alt=" " width="800" height="447"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What six weeks actually looks like 🛣
&lt;/h2&gt;

&lt;p&gt;Timelines vary a lot by system. Mid-market NetSuite integrations often go live in &lt;strong&gt;4 to 6 weeks&lt;/strong&gt; thanks to a more accessible API, multi-system builds across five or six applications typically run &lt;strong&gt;8 to 16 weeks&lt;/strong&gt;, and heavily customized SAP work can stretch past six months. A 6-week, three-phase engagement is realistic for a single-ERP, well-scoped project, and it's on the efficient end of the range on purpose.&lt;/p&gt;

&lt;h3&gt;
  
  
  Phase 1 — Discovery &amp;amp; data audit (Weeks 1-2)
&lt;/h3&gt;

&lt;p&gt;Map every system currently in the handoff chain. Audit data quality at the source. Find the specific fields and record types causing the most manual rework.&lt;/p&gt;

&lt;p&gt;Deliverable: a scoped integration plan with the real cost drivers named, not guessed at.&lt;/p&gt;

&lt;h3&gt;
  
  
  Phase 2 — Build &amp;amp; validation logic (Weeks 3-5)
&lt;/h3&gt;

&lt;p&gt;Build the connection points. Write the validation and mapping logic between the AI output and the ERP schema. Handle authentication for whichever legacy system is involved.&lt;/p&gt;

&lt;p&gt;Deliverable: a working integration in staging, tested against real historical data.&lt;/p&gt;

&lt;h3&gt;
  
  
  Phase 3 — Rollout &amp;amp; reliability testing (Week 6)
&lt;/h3&gt;

&lt;p&gt;Move to production. Run parallel reconciliation against the old manual process to confirm accuracy. Hand off a monitoring setup so exceptions get flagged instead of buried.&lt;/p&gt;

&lt;p&gt;Deliverable: a live integration plus a documented exception-handling process for the edge cases that still need a human. 🤗&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgbqzekvho1pn8ncupodc.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%2Fgbqzekvho1pn8ncupodc.png" alt=" " width="799" height="282"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The next step 🚀
&lt;/h2&gt;

&lt;p&gt;If your team is still the API between your AI tools and your ERP, that's fixable and scoped. It's not a reason to sit on a bigger AI initiative waiting for someday.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Book an AI Reliability &amp;amp; Security Fit Call&lt;/strong&gt;, and we'll walk through where your specific handoff is leaking time and money, and whether a direct integration is actually the right next move for you.&lt;/p&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
        &lt;div class="c-embed__cover"&gt;
          &lt;a href="https://cal.com/cyprian-aarons-topiax/30min" class="c-link align-middle" rel="noopener noreferrer"&gt;
            &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcal.com%2F_next%2Fimage%3Fw%3D1200%26q%3D100%26url%3D%252Fapi%252Fsocial%252Fog%252Fimage%253Ftype%253Dmeeting%2526title%253DAI%252B%252526%252BRevenue%252BWorkflow%252BFit%252BCall%2526meetingProfileName%253DCyprian%252BAarons%2526meetingImage%253Dhttps%25253A%25252F%25252Flh3.googleusercontent.com%25252Fa%25252FACg8ocLVW0DVsCQl8leISvhLkycR6bfiRFeMXMqJWRzHu-BGnO3tl6zL%25253Ds96-c%2526names%253DCyprian%252BAarons%2526usernames%253Dcyprian-aarons-topiax%2526v%253D1306a8f4" height="630" class="m-0" width="1200"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://cal.com/cyprian-aarons-topiax/30min" rel="noopener noreferrer" class="c-link"&gt;
            
          &lt;/a&gt;
        &lt;/h2&gt;
          &lt;p class="truncate-at-3"&gt;
             AI &amp;amp; Revenue Workflow Fit Call
          &lt;/p&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
            &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcal.com%2Ffavicon.ico%3Ffavicon.0776-zo3l-hti.ico" width="48" height="48"&gt;
          cal.com
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


&lt;blockquote&gt;
&lt;p&gt;Thanks for reading this one.&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>ai</category>
      <category>startup</category>
      <category>techtalks</category>
    </item>
    <item>
      <title>The 40% Cancellation Trap: Why Agentic AI Projects Die in Production 🪤</title>
      <dc:creator>CyprianTinasheAarons</dc:creator>
      <pubDate>Fri, 31 Jul 2026 09:06:26 +0000</pubDate>
      <link>https://dev.to/cypriantinasheaarons/the-40-cancellation-trap-why-agentic-ai-projects-die-in-production-9kn</link>
      <guid>https://dev.to/cypriantinasheaarons/the-40-cancellation-trap-why-agentic-ai-projects-die-in-production-9kn</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Gartner reckons over 40% of agentic AI projects get canned by 2027. Not because the models are bad. Because nobody built the safety net.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Okay so that stat has been quoted so much it's basically lost its bite by now. But stick with me, because the reason buried inside it is the one most teams still aren't talking about: &lt;strong&gt;inadequate risk controls&lt;/strong&gt;. Not cost. Not "unclear ROI." Risk controls.&lt;/p&gt;

&lt;p&gt;If you're building agentic AI for a fintech or healthtech company, that line should worry you more than any of the others, because it's not a demo problem. It's a production problem. And in a regulated shop, production problems don't get killed in a budget review. They get killed in a compliance review.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key Definitions 🧐
&lt;/h2&gt;

&lt;p&gt;Before we get into why this happens, a few terms worth pinning down.&lt;/p&gt;

&lt;h4&gt;
  
  
  What's an agentic loop?
&lt;/h4&gt;

&lt;p&gt;The retrieve → evaluate → retrieve-again cycle an agent runs when it's deciding whether it has enough information to answer. Sounds harmless. It's where most of the trouble starts.&lt;/p&gt;

&lt;h4&gt;
  
  
  What's Evidence Override?
&lt;/h4&gt;

&lt;p&gt;When the retriever actually pulls the right document, hands it to the model, and the model just... doesn't use it properly. Leans on something more familiar instead. The evidence was there. The generation step ignored it.&lt;/p&gt;

&lt;h4&gt;
  
  
  What's cascading hallucination?
&lt;/h4&gt;

&lt;p&gt;One wrong claim early in a multi-step reasoning chain becomes "context" for every step after it. Each step stays logically consistent with the step before, so the whole thing reads as confident and coherent, right up to the end — even though it was wrong two steps back.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fetw191uuzyvvpafeh6pi.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%2Fetw191uuzyvvpafeh6pi.png" alt=" " width="800" height="513"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The fear isn't "it doesn't work" 😬
&lt;/h2&gt;

&lt;p&gt;Here's the actual fear, if you're honest about it: it's not that the agent gives a wrong answer. It's that the agent gives a wrong answer that &lt;em&gt;looks&lt;/em&gt; right. Well formatted. Internally consistent. Confident. The kind of wrong that sails straight past a reviewer.&lt;/p&gt;

&lt;p&gt;In a regulated environment that's not an embarrassing bug you patch on Monday. That's an incident report. That's an audit finding. That's a regulator asking a question you don't have a good answer to.&lt;/p&gt;

&lt;p&gt;Pilots survive because someone is watching every single output closely. Production doesn't survive that same way, because nobody can watch every output closely at scale, and the agent has no internal sense of the difference between "confidently right" and "confidently wrong."&lt;/p&gt;

&lt;h2&gt;
  
  
  The failure everyone assumes vs. the one actually happening
&lt;/h2&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%2Fkjayr7xj0qsnnx3x214h.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%2Fkjayr7xj0qsnnx3x214h.png" alt=" " width="800" height="447"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ask most teams why their RAG agent hallucinated and you'll hear "bad retrieval" almost every time. Wrong chunks got pulled. Fix the chunking, fix the embeddings, ship it.&lt;/p&gt;

&lt;p&gt;Current research says that's usually the wrong diagnosis. &lt;code&gt;Evidence Override&lt;/code&gt; — the generation-side failure, not the retrieval-side one — shows up several times more often than genuine retrieval failure. The retriever did its job. The correct evidence was sitting right there in context. The model just didn't weight it properly.&lt;/p&gt;

&lt;p&gt;That distinction actually matters a lot, because the fix is completely different depending on which one you've got. Retrieval failure gets fixed with better chunking. Generation failure needs something that checks what the model &lt;em&gt;did&lt;/em&gt; with the evidence it was handed. That's a validation problem. Not a search problem.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why agents fail quietly, and APIs never do 🔗
&lt;/h2&gt;

&lt;p&gt;A normal API call fails loudly. It errors out, it times out, you get a status code, you get a stack trace, you know something broke.&lt;/p&gt;

&lt;p&gt;An agentic loop fails quietly. It fails by &lt;em&gt;continuing&lt;/em&gt;. Without a hard stopping rule, the default answer to "do I have enough?" is always "get more" — so the loop retrieves again, escalates, retrieves again, burning tokens the whole way without necessarily getting any closer to correct.&lt;/p&gt;

&lt;p&gt;Worse, the mistakes compound. An early hallucinated claim doesn't just sit there quietly; it becomes the foundation the next reasoning step builds on. The system isn't lying badly. It's reasoning cleanly from a bad premise, all the way to a confident, wrong, and completely traceable-looking conclusion.&lt;/p&gt;

&lt;h2&gt;
  
  
  Framework choice is a control surface, not a preference 🎲
&lt;/h2&gt;

&lt;p&gt;This is where the tooling you pick actually matters, and it's worth being blunt about it.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;CrewAI&lt;/code&gt;'s default recovery behavior, when a tool call fails, is to retry with the same approach. That can loop forever unless you build custom callbacks yourself to stop it.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;LangGraph&lt;/code&gt; takes a different route. Its interrupt-and-checkpoint model lets you pause the workflow at a defined point, wait on a human decision, and resume from that exact state. For a regulated environment where every AI decision needs an audit trail behind it, that's just a meaningfully better fit.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2zay5cpbfpl9fwesbtye.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%2F2zay5cpbfpl9fwesbtye.png" alt=" " width="800" height="447"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  A quick composite example 🤓
&lt;/h2&gt;

&lt;p&gt;(Built from patterns we see repeatedly across clients, not any one specific company, just to be clear.)&lt;/p&gt;

&lt;p&gt;A healthtech intake agent classified incoming patient documents and routed them to the right internal system. Tested well. High accuracy in the pilot.&lt;/p&gt;

&lt;p&gt;In production, an ambiguous document type triggered the "do I have enough to classify this?" loop. The agent re-queried its knowledge base four times, drifting the classification a little further each pass, until it confidently filed the document under the wrong compliance category.&lt;/p&gt;

&lt;p&gt;No error thrown. Nothing broke. It just quietly did the wrong thing, cleanly, and moved on.&lt;/p&gt;

&lt;h2&gt;
  
  
  The reframe
&lt;/h2&gt;

&lt;p&gt;Your agent didn't fail because it couldn't find the right answer. It failed because nothing was watching what it did with the answer once it had it.&lt;/p&gt;

&lt;p&gt;That's the shift. The whole industry spent close to two years obsessing over retrieval — better chunking, better embeddings, better vector stores. Retrieval was never the whole problem. The generation step, and the agent's own decision loop, need the same level of scrutiny retrieval already got. Most architectures still don't give it to them.&lt;/p&gt;

&lt;h2&gt;
  
  
  The fix: a checkpoint, not a patch 🚀
&lt;/h2&gt;

&lt;p&gt;The pattern that actually survives contact with production isn't one validation interceptor bolted between the retriever and the model. It's a checkpoint built directly into the orchestration graph, sitting at every point where the agent makes a decision that actually matters.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Flzwlfnlyisd5vdbx6e40.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%2Flzwlfnlyisd5vdbx6e40.png" alt=" " width="800" height="440"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Firstly, notice the fallback isn't "retry." Retry is usually what caused the loop to begin with.&lt;/p&gt;

&lt;p&gt;Next, the real fallback is a human review queue the agent escalates to on its own, once confidence drops below a threshold or the decision crosses a defined policy boundary — a compliance-sensitive classification, a transaction above a certain size, anything diagnosis-adjacent.&lt;/p&gt;

&lt;p&gt;Lastly, the human reviewer sees exactly what the agent saw, approves or rejects it, and the workflow resumes from that exact checkpoint. Which is, not coincidentally, exactly what gives you the audit trail a regulator or an internal compliance team is eventually going to come asking for.&lt;/p&gt;

&lt;p&gt;This is the "capability-deployment verification gap" that shows up over and over in the cancellation-risk research: agents that pass every pilot test but were never built with the escalation path production actually needs. The gap was never the model. It's the missing checkpoint. 🔗&lt;/p&gt;

&lt;h2&gt;
  
  
  Find out where your build actually sits 🔍
&lt;/h2&gt;

&lt;p&gt;If you're not totally sure whether your architecture has this checkpoint, or whether it just has a retry loop dressed up in a checkpoint's clothes, that's exactly what our &lt;strong&gt;AI Reliability Scorecard&lt;/strong&gt; is built to show you.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Scorecard checks:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Whether failure gets caught at retrieval, at generation, or not until a human notices downstream&lt;/li&gt;
&lt;li&gt;Whether you have an explicit stopping rule for agentic loops, or you're relying on implicit token/time limits and hoping&lt;/li&gt;
&lt;li&gt;Whether low-confidence or policy-boundary decisions escalate to a real human review queue, or just retry&lt;/li&gt;
&lt;li&gt;Whether every AI-driven decision in your pipeline leaves behind an auditable record of what was seen, decided, and overridden&lt;/li&gt;
&lt;li&gt;How exposed your current architecture is to cascading hallucination across multi-step chains&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Take it here:&lt;/strong&gt; &lt;a href="https://www.topiax.xyz/audit" rel="noopener noreferrer"&gt;https://www.topiax.xyz/audit&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;What happens after: you get a scored breakdown by category, not one single grade, mapped straight to the gaps above, plus a short written read on which failure mode is the biggest production risk for your specific stack and industry. If your score flags real exposure, we'll follow up with an invite to a 20-minute call to walk through the checkpoint pattern for your architecture specifically. No pitch deck. Just your results and what we'd fix first.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Thanks for reading this one. If it was useful, share it with whoever on your team owns the "why did the agent do that" conversation. 🙏&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>agents</category>
      <category>ai</category>
      <category>production</category>
      <category>security</category>
    </item>
    <item>
      <title>The vibe code teardown: why your app can pass the demo and still fail security checks</title>
      <dc:creator>CyprianTinasheAarons</dc:creator>
      <pubDate>Mon, 27 Jul 2026 08:28:23 +0000</pubDate>
      <link>https://dev.to/cypriantinasheaarons/the-vibe-code-teardown-why-your-app-can-pass-the-demo-and-still-fail-security-checks-2p7l</link>
      <guid>https://dev.to/cypriantinasheaarons/the-vibe-code-teardown-why-your-app-can-pass-the-demo-and-still-fail-security-checks-2p7l</guid>
      <description>&lt;p&gt;Your app works.&lt;/p&gt;

&lt;p&gt;The login flow works. The dashboard loads. The database returns the right records. The landing page looks good enough to share.&lt;/p&gt;

&lt;p&gt;Then someone opens the browser developer tools.&lt;/p&gt;

&lt;p&gt;They find a credential in the JavaScript bundle. They change an object ID in an API request and see another user's data. They query a Supabase table that was never protected with a row-level security policy.&lt;/p&gt;

&lt;p&gt;The app was not broken in the way most people expect. It was broken while everything still looked finished.&lt;/p&gt;

&lt;p&gt;That is the security problem with vibe-coded applications: a successful demo tells you that the feature works. It does not tell you whether the trust boundaries are correct.&lt;/p&gt;

&lt;h2&gt;
  
  
  The 45% number, stated accurately
&lt;/h2&gt;

&lt;p&gt;Veracode's 2025 GenAI Code Security Report tested more than 100 large language models across Java, JavaScript, Python, and C#.&lt;/p&gt;

&lt;p&gt;In its test set, &lt;strong&gt;45% of generated code samples failed security tests and introduced an OWASP Top 10 vulnerability&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The Spring 2026 update used a continued testing framework and found that only about 55% of generation tasks produced secure code when the models received no security-specific guidance. In the other 45% of cases, the generated code introduced a known security flaw in the test task.&lt;/p&gt;

&lt;p&gt;That does not mean 45% of all AI-built applications are vulnerable. The tests measured generated code in controlled tasks, not every application produced by every developer.&lt;/p&gt;

&lt;p&gt;The result is still worth paying attention to:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;AI coding tools have become much better at producing code that works. That improvement has not automatically made the code safe.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The gap matters because the most dangerous problems in a small web application are often not exotic. They are ordinary mistakes hidden behind a polished interface.&lt;/p&gt;

&lt;h2&gt;
  
  
  The demo is not the security boundary
&lt;/h2&gt;

&lt;p&gt;AI coding tools are optimized to satisfy the request in front of them:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;add authentication&lt;/li&gt;
&lt;li&gt;connect the database&lt;/li&gt;
&lt;li&gt;integrate payments&lt;/li&gt;
&lt;li&gt;expose an API&lt;/li&gt;
&lt;li&gt;create an admin dashboard&lt;/li&gt;
&lt;li&gt;make the page work&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Security depends on questions that may never appear in the original prompt:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which user is allowed to read this record?&lt;/li&gt;
&lt;li&gt;What happens if they change the ID in the request?&lt;/li&gt;
&lt;li&gt;Which values can safely reach the browser?&lt;/li&gt;
&lt;li&gt;Which database operations should the public client role perform?&lt;/li&gt;
&lt;li&gt;Is this admin route protected outside the normal UI?&lt;/li&gt;
&lt;li&gt;Does an error response reveal credentials or internal details?&lt;/li&gt;
&lt;li&gt;Can a user perform an expensive action repeatedly?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A generated application can satisfy the visible feature request while leaving those questions unanswered.&lt;/p&gt;

&lt;p&gt;That is how a working demo becomes a risky production system.&lt;/p&gt;

&lt;p&gt;Here are three places I would check first.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. The credential that ships to every browser
&lt;/h2&gt;

&lt;p&gt;In a Next.js application, any environment variable prefixed with &lt;code&gt;NEXT_PUBLIC_&lt;/code&gt; is intended to be available to browser-side code.&lt;/p&gt;

&lt;p&gt;That makes the prefix useful for public configuration. It also makes it dangerous when someone uses it for a secret.&lt;/p&gt;

&lt;p&gt;This is a bad idea:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;NEXT_PUBLIC_OPENAI_API_KEY=sk-live-example
NEXT_PUBLIC_STRIPE_SECRET_KEY=sk_live_example
NEXT_PUBLIC_DATABASE_PASSWORD=example
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Those values can end up in the client bundle. Anyone who can load the application may be able to retrieve them.&lt;/p&gt;

&lt;p&gt;The safe pattern is to keep secret credentials on the server:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;OPENAI_API_KEY=sk-live-example
STRIPE_SECRET_KEY=sk_live_example
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then call the provider from a server-side route or server action.&lt;/p&gt;

&lt;p&gt;There is an important distinction here: not every visible key is a secret.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Stripe publishable keys are designed to be public.&lt;/li&gt;
&lt;li&gt;Supabase &lt;code&gt;anon&lt;/code&gt; keys are designed to be public.&lt;/li&gt;
&lt;li&gt;Stripe secret keys are not public.&lt;/li&gt;
&lt;li&gt;Supabase &lt;code&gt;service_role&lt;/code&gt; keys are not public.&lt;/li&gt;
&lt;li&gt;Database passwords and private API tokens are not public.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The problem is not "a key appears in the frontend." The problem is that a credential with more authority than the browser should have crosses the client/server boundary.&lt;/p&gt;

&lt;h3&gt;
  
  
  What to check
&lt;/h3&gt;

&lt;p&gt;Search the repository and the deployed JavaScript bundle for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;OpenAI or Anthropic API keys&lt;/li&gt;
&lt;li&gt;Stripe secret keys&lt;/li&gt;
&lt;li&gt;Supabase service-role keys&lt;/li&gt;
&lt;li&gt;database credentials&lt;/li&gt;
&lt;li&gt;private signing keys&lt;/li&gt;
&lt;li&gt;unrestricted third-party API tokens&lt;/li&gt;
&lt;li&gt;suspicious &lt;code&gt;NEXT_PUBLIC_&lt;/code&gt; variables&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A source-only scan is not always enough. A value may be injected during the build and appear only in the generated client assets.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. The database with no access policy
&lt;/h2&gt;

&lt;p&gt;Supabase makes it fast to create tables, authentication, and a working frontend.&lt;/p&gt;

&lt;p&gt;That speed creates a predictable failure mode: the application is wired together before the database access model is finished.&lt;/p&gt;

&lt;p&gt;Row Level Security, or RLS, is the layer that controls which rows a database role can access. A table can exist, the frontend can query it, and the feature can appear complete while the table still lacks the policies that separate one user's data from another's.&lt;/p&gt;

&lt;p&gt;The public Supabase &lt;code&gt;anon&lt;/code&gt; key is not automatically a master key. It is meant to be public. The risk appears when that public client role has access to data that should have been protected.&lt;/p&gt;

&lt;p&gt;A basic policy might look like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;alter&lt;/span&gt; &lt;span class="k"&gt;table&lt;/span&gt; &lt;span class="k"&gt;public&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;notes&lt;/span&gt; &lt;span class="n"&gt;enable&lt;/span&gt; &lt;span class="k"&gt;row&lt;/span&gt; &lt;span class="k"&gt;level&lt;/span&gt; &lt;span class="k"&gt;security&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;create&lt;/span&gt; &lt;span class="n"&gt;policy&lt;/span&gt; &lt;span class="nv"&gt;"users can read their own notes"&lt;/span&gt;
&lt;span class="k"&gt;on&lt;/span&gt; &lt;span class="k"&gt;public&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;notes&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="k"&gt;select&lt;/span&gt;
&lt;span class="k"&gt;to&lt;/span&gt; &lt;span class="n"&gt;authenticated&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;auth&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;uid&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The exact policy depends on the application. The important point is that authentication alone does not prove authorization. A user can be logged in and still be unauthorized to read another user's record.&lt;/p&gt;

&lt;h3&gt;
  
  
  A real example
&lt;/h3&gt;

&lt;p&gt;CVE-2025-48757 describes insufficient database Row Level Security policies in Lovable-generated sites through April 15, 2025. The NVD record says the condition could allow unauthenticated attackers to read or write arbitrary database tables.&lt;/p&gt;

&lt;p&gt;The same record also notes that Lovable disputed the responsibility assigned to the platform and argued that individual customers were responsible for protecting their application data.&lt;/p&gt;

&lt;p&gt;That disagreement is worth preserving because it points to the real lesson:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A generated app can look complete while its access-control model is still unfinished.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  What to check
&lt;/h3&gt;

&lt;p&gt;For every table:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Is RLS enabled?&lt;/li&gt;
&lt;li&gt;Which roles can access it?&lt;/li&gt;
&lt;li&gt;Are there explicit policies for &lt;code&gt;select&lt;/code&gt;, &lt;code&gt;insert&lt;/code&gt;, &lt;code&gt;update&lt;/code&gt;, and &lt;code&gt;delete&lt;/code&gt;?&lt;/li&gt;
&lt;li&gt;Does every policy restrict access to the correct user, team, or organization?&lt;/li&gt;
&lt;li&gt;What happens if an authenticated user changes an object ID?&lt;/li&gt;
&lt;li&gt;Do tests run as a normal user, or only as an admin?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;"RLS enabled" is not the same as "authorization is correct." The policies themselves need review.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. The admin route nobody meant to publish
&lt;/h2&gt;

&lt;p&gt;During development, an AI assistant may create routes such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/admin
/debug
/health/full
/swagger
/api/test
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These routes can be useful while building. They become a problem when they reach production without an authentication and authorization check.&lt;/p&gt;

&lt;p&gt;The same issue can appear in API handlers. The frontend may hide a button from ordinary users, but hiding a button is not authorization. A user can still call the endpoint directly.&lt;/p&gt;

&lt;p&gt;A route should enforce access on the server, not depend on the interface behaving honestly.&lt;/p&gt;

&lt;h3&gt;
  
  
  What to check
&lt;/h3&gt;

&lt;p&gt;Open the deployed application in a private browser window while logged out.&lt;/p&gt;

&lt;p&gt;Test:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;admin and dashboard routes&lt;/li&gt;
&lt;li&gt;health and debug endpoints&lt;/li&gt;
&lt;li&gt;API routes&lt;/li&gt;
&lt;li&gt;file or export endpoints&lt;/li&gt;
&lt;li&gt;password-reset and invitation flows&lt;/li&gt;
&lt;li&gt;routes that accept a user ID, organization ID, or document ID&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then test horizontally:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create two normal users.&lt;/li&gt;
&lt;li&gt;Create a record for User A.&lt;/li&gt;
&lt;li&gt;Send the request as User B.&lt;/li&gt;
&lt;li&gt;Change the record ID.&lt;/li&gt;
&lt;li&gt;Confirm that User B receives a denial rather than User A's data.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This class of bug is often called insecure direct object reference, or IDOR. It does not require a sophisticated exploit. It requires the application to trust an identifier supplied by the client.&lt;/p&gt;

&lt;h2&gt;
  
  
  A practical pre-launch security check
&lt;/h2&gt;

&lt;p&gt;You do not need to begin with a full penetration test to catch the most obvious problems in a small Next.js or Supabase application.&lt;/p&gt;

&lt;p&gt;Start with these checks.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Sweep for credentials
&lt;/h3&gt;

&lt;p&gt;Scan:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the repository&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;.env&lt;/code&gt; files&lt;/li&gt;
&lt;li&gt;Git history&lt;/li&gt;
&lt;li&gt;build output&lt;/li&gt;
&lt;li&gt;deployed client assets&lt;/li&gt;
&lt;li&gt;CI logs&lt;/li&gt;
&lt;li&gt;error-monitoring payloads&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Remove exposed secrets and rotate them. Deleting a key from the latest commit does not invalidate a key that already exists in Git history or a deployed bundle.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Review database access
&lt;/h3&gt;

&lt;p&gt;For each table, verify:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;RLS status&lt;/li&gt;
&lt;li&gt;policies for every operation&lt;/li&gt;
&lt;li&gt;user and organization boundaries&lt;/li&gt;
&lt;li&gt;behavior for unauthenticated requests&lt;/li&gt;
&lt;li&gt;behavior for a different authenticated user&lt;/li&gt;
&lt;li&gt;behavior when IDs are modified&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Test the database with the same roles that real users will have. An admin dashboard can make a broken policy look correct because the admin has more access than ordinary users.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Test routes outside the interface
&lt;/h3&gt;

&lt;p&gt;Use an incognito window and direct HTTP requests.&lt;/p&gt;

&lt;p&gt;Do not rely on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;hidden buttons&lt;/li&gt;
&lt;li&gt;client-side redirects&lt;/li&gt;
&lt;li&gt;disabled form fields&lt;/li&gt;
&lt;li&gt;checks that run only in React&lt;/li&gt;
&lt;li&gt;route names that "look private"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The server must make the final authorization decision.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Check browser security configuration
&lt;/h3&gt;

&lt;p&gt;Review:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;HTTPS&lt;/li&gt;
&lt;li&gt;cookie flags&lt;/li&gt;
&lt;li&gt;&lt;code&gt;HttpOnly&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Secure&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;SameSite&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Content Security Policy&lt;/li&gt;
&lt;li&gt;frame protection&lt;/li&gt;
&lt;li&gt;MIME-sniffing protection&lt;/li&gt;
&lt;li&gt;permissive CORS&lt;/li&gt;
&lt;li&gt;unnecessary &lt;code&gt;X-Powered-By&lt;/code&gt; disclosure&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These settings will not fix a broken authorization model, but weak deployment defaults can make other failures easier to exploit.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try Vibe Scanner
&lt;/h2&gt;

&lt;p&gt;I built &lt;a href="https://github.com/CyprianTinasheAarons/vibe-scanner" rel="noopener noreferrer"&gt;Vibe Scanner&lt;/a&gt; as a read-only scanner for Next.js and Supabase repositories and deployed websites.&lt;/p&gt;

&lt;p&gt;It is designed to catch common problems before they become someone else's discovery.&lt;/p&gt;

&lt;p&gt;The scanner currently checks repository targets for issues such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;hardcoded Stripe, OpenAI, GitHub, or AWS credentials&lt;/li&gt;
&lt;li&gt;sensitive environment files&lt;/li&gt;
&lt;li&gt;Supabase tables without matching RLS enablement&lt;/li&gt;
&lt;li&gt;admin or dashboard pages without a recognized authentication check&lt;/li&gt;
&lt;li&gt;Next.js API handlers without a recognized authentication check&lt;/li&gt;
&lt;li&gt;wildcard CORS&lt;/li&gt;
&lt;li&gt;missing baseline browser security headers&lt;/li&gt;
&lt;li&gt;suspicious &lt;code&gt;NEXT_PUBLIC_*&lt;/code&gt; variables&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It can also scan a public URL for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;reachability&lt;/li&gt;
&lt;li&gt;HTTPS transport&lt;/li&gt;
&lt;li&gt;deployed security headers&lt;/li&gt;
&lt;li&gt;wildcard CORS&lt;/li&gt;
&lt;li&gt;cookie flags&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;X-Powered-By&lt;/code&gt; disclosure&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The scanner is intentionally read-only. URL scans make a public GET request chain, follow redirects, and do not crawl the application, submit forms, or attempt exploitation.&lt;/p&gt;

&lt;h3&gt;
  
  
  Install and run it locally
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/CyprianTinasheAarons/vibe-scanner.git
&lt;span class="nb"&gt;cd &lt;/span&gt;vibe-scanner

python3 &lt;span class="nt"&gt;-m&lt;/span&gt; venv .venv
&lt;span class="nb"&gt;source&lt;/span&gt; .venv/bin/activate

python &lt;span class="nt"&gt;-m&lt;/span&gt; pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt;
vibe-scanner /absolute/path/to/your/project
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To scan a deployed URL:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;vibe-scanner https://your-domain.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To produce a machine-readable report:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;vibe-scanner &lt;span class="nt"&gt;--json&lt;/span&gt; /absolute/path/to/your/project &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; report.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The JSON output includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;scanner version&lt;/li&gt;
&lt;li&gt;target type&lt;/li&gt;
&lt;li&gt;normalized target&lt;/li&gt;
&lt;li&gt;severity counts&lt;/li&gt;
&lt;li&gt;complete findings&lt;/li&gt;
&lt;li&gt;remediation context&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Secret values are not included in the findings.&lt;/p&gt;

&lt;p&gt;The scanner is a first pass, not a security certificate. Authentication, RLS, CORS, and header checks use static heuristics. A warning needs to be confirmed in the context of the application. A clean scan does not prove that the application is secure.&lt;/p&gt;

&lt;p&gt;It means the scanner did not find the specific patterns it checks for.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the scanner cannot replace
&lt;/h2&gt;

&lt;p&gt;Vibe Scanner does not replace:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a full penetration test&lt;/li&gt;
&lt;li&gt;threat modeling&lt;/li&gt;
&lt;li&gt;manual authorization testing&lt;/li&gt;
&lt;li&gt;business-logic review&lt;/li&gt;
&lt;li&gt;dependency risk analysis&lt;/li&gt;
&lt;li&gt;compliance certification&lt;/li&gt;
&lt;li&gt;an experienced security engineer reviewing the system&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That distinction matters. Security tools become dangerous when their output is treated as certainty.&lt;/p&gt;

&lt;p&gt;A scanner should reduce the chance of missing obvious problems. It should not create false confidence.&lt;/p&gt;

&lt;h2&gt;
  
  
  The rule I would use before shipping
&lt;/h2&gt;

&lt;p&gt;If you built an application quickly with Cursor, Bolt, Lovable, v0, Claude Code, or another AI tool, ask one question before you send more traffic to it:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Which parts of this application are trusted because the server verified them, and which parts are trusted because the browser said they were true?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That question leads you to the places that deserve attention:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;secrets&lt;/li&gt;
&lt;li&gt;database policies&lt;/li&gt;
&lt;li&gt;API authorization&lt;/li&gt;
&lt;li&gt;object ownership&lt;/li&gt;
&lt;li&gt;admin routes&lt;/li&gt;
&lt;li&gt;deployment configuration&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A working demo is a good start. It is not evidence that the application is ready for strangers, payments, or private data.&lt;/p&gt;

&lt;h2&gt;
  
  
  Need a human review?
&lt;/h2&gt;

&lt;p&gt;Topiax is building tools and services for teams that want to move quickly without treating security as an afterthought.&lt;/p&gt;

&lt;p&gt;For small Next.js and Supabase applications, Topiax offers a &lt;strong&gt;Ship Confidence Review&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;48-hour turnaround&lt;/li&gt;
&lt;li&gt;$750–$1,500 flat fee&lt;/li&gt;
&lt;li&gt;focused review of secrets, authentication, authorization, RLS, API routes, and common deployment gaps&lt;/li&gt;
&lt;li&gt;plain-English report with prioritized fixes&lt;/li&gt;
&lt;li&gt;bounded review, not a penetration test or compliance certification&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you want a human to review the application, Comment &lt;strong&gt;SHIP&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/CyprianTinasheAarons/vibe-scanner" rel="noopener noreferrer"&gt;Run Vibe Scanner on GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://topiax.xyz" rel="noopener noreferrer"&gt;Topiax&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Sources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.veracode.com/blog/genai-code-security-report/" rel="noopener noreferrer"&gt;Veracode 2025 GenAI Code Security Report&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.veracode.com/blog/spring-2026-genai-code-security/" rel="noopener noreferrer"&gt;Veracode Spring 2026 GenAI Code Security Update&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://nvd.nist.gov/vuln/detail/CVE-2025-48757" rel="noopener noreferrer"&gt;NVD: CVE-2025-48757&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://nextjs.org/docs/app/guides/environment-variables" rel="noopener noreferrer"&gt;Next.js environment variables documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://supabase.com/docs/guides/database/postgres/row-level-security" rel="noopener noreferrer"&gt;Supabase Row Level Security documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>vibecoding</category>
      <category>security</category>
    </item>
    <item>
      <title>The evaluation test 90% of AI engineers fail</title>
      <dc:creator>CyprianTinasheAarons</dc:creator>
      <pubDate>Fri, 17 Jul 2026 09:24:51 +0000</pubDate>
      <link>https://dev.to/cypriantinasheaarons/the-evaluation-test-90-of-ai-engineers-fail-building-an-automated-hallucination-guard-2c53</link>
      <guid>https://dev.to/cypriantinasheaarons/the-evaluation-test-90-of-ai-engineers-fail-building-an-automated-hallucination-guard-2c53</guid>
      <description>&lt;h2&gt;
  
  
  I. Introduction: What Agent and RAG Evaluation Is
&lt;/h2&gt;

&lt;p&gt;Have you ever built a system that worked flawlessly in testing but fell apart the moment it hit production?&lt;/p&gt;

&lt;p&gt;Maybe you shipped an AI agent that answered everything correctly in your sandbox and even passed your evaluations, yet once users got hold of it, it started failing in subtle, expensive ways.&lt;/p&gt;

&lt;p&gt;Or you wired a RAG component into a multi-agent system, watched it work perfectly in your test harness, and then realised in production that the RAG wasn't being referenced or used correctly at all.&lt;/p&gt;

&lt;h3&gt;
  
  
  The real cost of an unreliable agent
&lt;/h3&gt;

&lt;p&gt;No matter how costly it is for LLMs to be unreliable in production, it can cost you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Reputation&lt;/li&gt;
&lt;li&gt;Your business&lt;/li&gt;
&lt;li&gt;Time&lt;/li&gt;
&lt;li&gt;Your valuable customers&lt;/li&gt;
&lt;li&gt;And it can even lead to legal action&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;People still prefer to vibe-check, make weak evaluations, or follow a happy path when running their evaluations. This can cause an LLM to work very well in a test environment with predictable answers but fail in the real world. Here are some examples of when that failure happened.&lt;/p&gt;

&lt;h2&gt;
  
  
  II. When AI Failures Get Expensive: Real-World Case Studies
&lt;/h2&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%2F7gl2iqh886m9go2zga9d.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%2F7gl2iqh886m9go2zga9d.png" alt="When AI Failures Get Expensive" width="799" height="376"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;One wrong answer from a customer service bot was enough to end up in court.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Not even a working AI agent (or a "reliable" agent, an LLM, or a RAG) is safe from being costly in a production environment. Let me tell you about the Moffatt v. Air Canada case.&lt;/p&gt;

&lt;p&gt;Air Canada had a system built on top of an LLM, mainly for customer service. After his grandmother died, Mr. Moffatt used Air Canada's chatbot to ask about bereavement fares. The chatbot told him he could book his flight at full price and apply for the discounted bereavement rate retroactively within 90 days. He did exactly that, and Air Canada refused the refund, pointing out that its actual policy didn't allow retroactive bereavement claims. Moffatt took Air Canada to the BC Civil Resolution Tribunal and won.&lt;/p&gt;

&lt;p&gt;Another scenario: a lawyer wanted to use ChatGPT as a reference when putting together a court case. The references and case law it gave him were inaccurate and filled with hallucinations. It ended up costing that lawyer a fine of over $5,000. There are many cases like this. You can look up the link I've shared on some of the legal cases around hallucinations, and take a look at this graph:&lt;/p&gt;

&lt;p&gt;Refer to &lt;a href="https://www.damiencharlotin.com/hallucinations/?graphs=1" rel="noopener noreferrer"&gt;https://www.damiencharlotin.com/hallucinations/?graphs=1&lt;/a&gt;&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fj9b5y9k7kkhes4rmw9m1.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%2Fj9b5y9k7kkhes4rmw9m1.png" alt="Graph Example" width="800" height="294"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;The number of hallucination-related legal cases keeps climbing every year.&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  III. The Promise of the Article
&lt;/h2&gt;

&lt;p&gt;So what can I promise with this article?&lt;/p&gt;

&lt;p&gt;You'll understand what causes LLM agents to hallucinate and why that can cost you real money.&lt;/p&gt;

&lt;p&gt;You'll learn, step by step, how to build a more reliable AI agent and run meaningful evaluations, whether you're at a startup or a large engineering org.&lt;/p&gt;

&lt;p&gt;You'll get practical tools and resources you can use to go deeper into LLM and agent evaluation.&lt;/p&gt;

&lt;p&gt;Let's get started.&lt;/p&gt;
&lt;h3&gt;
  
  
  Why agent and RAG evaluation is harder than testing a single LLM
&lt;/h3&gt;

&lt;p&gt;Testing a single LLM is relatively straightforward. Often, you can improve prompts or compare outputs against a known "gold" answer. That's manageable because an LLM is essentially a next-token predictor.&lt;/p&gt;

&lt;p&gt;Testing multi-agent systems or RAG pipelines is much harder. They have multiple steps, dynamic behaviour, and sometimes autonomous decision-making. You don't always know the exact output you want, or even what the "correct" path to that output should be. There can be many valid paths through the system, which makes it much harder to design robust evaluations.&lt;/p&gt;

&lt;p&gt;Still, we have to try because the consequences of shipping untested or poorly evaluated AI systems are now much higher.&lt;/p&gt;
&lt;h3&gt;
  
  
  Common Types of Failures
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;a. Agentic logic and execution failures&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Three types worth calling out here:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Infinite action loop.&lt;/strong&gt; Quite common. This is where an agent keeps calling a tool but keeps getting an error and keeps repeating that same failed call over and over, eating your token budget.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Type mismatch.&lt;/strong&gt; The tool's parameters aren't being sent as expected. Maybe an email tool is expecting a string but keeps getting an integer, so the application hard-crashes or keeps failing. Imagine that happening in production.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;State desynchronization and memory loss.&lt;/strong&gt; In a complex multi-agent workflow, the agent drops critical context required to answer the prompt properly and ends up giving the user a vague, generic answer that ignores the full original prompt.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;b. RAG &amp;amp; retrieval failures&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The most common one is garbage in, garbage out. You've given it poor information, done a poor chunking strategy, or fed it poor data. You end up retrieving irrelevant documents, and sometimes it will say it doesn't know. Worse, it will confidently give you an answer that has nothing to do with what you expected.&lt;/p&gt;

&lt;p&gt;An example: it gives you an answer for, say, a funeral policy FAQ, but the wrong answer (a hallucination), because even though you ingested the FAQs, they weren't chunked and vetted properly into the system.&lt;/p&gt;

&lt;p&gt;Another common one is the "lost-in-the-middle" effect. This happens when you've provided a very large context, bloating the prompt. Due to that massive context window, the model will simply ignore some of the user's actual instructions and focus on either the very beginning or the very end of the prompt. Obviously, this results in an answer that doesn't quite make sense.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;c. Silent failures&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;These are the worst-case-scenario type of failures, because sometimes you won't even notice them, especially when you're doing evaluations or vibe checks. They only become visible once, say, a power user runs into one, even though the system has already been in production for a while. Unlike traditional software, it won't throw a loud break. You'll probably get a status 200, and everything will look flawless.&lt;/p&gt;

&lt;p&gt;The agent quietly executes every update, but maybe it's updating the wrong client record in the DB. Another scenario: it's supposed to send an email to Person A, but instead sends it to Person B, an unrelated prospect. These are the silent failures that are hardest to catch, because the system still "works." It's still sending; it's still updating. It's just doing it on the wrong data.&lt;/p&gt;
&lt;h2&gt;
  
  
  IV. Deep Dive: What Causes AI Agents to Fail
&lt;/h2&gt;

&lt;p&gt;In practice, most failures come from a few recurring patterns:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Not testing at all&lt;/li&gt;
&lt;li&gt;Testing only the happy path&lt;/li&gt;
&lt;li&gt;Passing evals but still failing in production&lt;/li&gt;
&lt;li&gt;Not having a continuous eval pipeline&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;
  
  
  1. Not testing at all
&lt;/h3&gt;

&lt;p&gt;This doesn't necessarily mean you don't test at all. Most AI engineers (at least 90% of the engineers I've dealt with) put most of their effort into making sure everything works, and only a small fraction of their time, maybe 10% or less, goes toward testing.&lt;/p&gt;

&lt;p&gt;What they usually do instead is a vibe check: throw in maybe 10-20 prompts and just see if the system produces an output. Sometimes they don't even check the quality of that output:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Is it fair?&lt;/li&gt;
&lt;li&gt;Is it legally risky?&lt;/li&gt;
&lt;li&gt;Is it following the prompt?&lt;/li&gt;
&lt;li&gt;Is anyone scoring that response?&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  2. Testing only the happy path
&lt;/h3&gt;

&lt;p&gt;The happy path is where tests actually happen, but they're only happy-path tests. There are no edge cases, no red teaming done, and the questions are not adversarial. Everything is quite easy. Things like "What's my name?" or "What is X?" Predictable stuff.&lt;/p&gt;

&lt;p&gt;The happy path will always pass, and it's only when the edge cases show up in production that people panic.&lt;/p&gt;
&lt;h3&gt;
  
  
  3. Passing evals but still failing in prod
&lt;/h3&gt;

&lt;p&gt;This is the scary one, because this is where you've put in the work and done proper evaluations in the past. So why is it still failing? This is where most AI engineers get caught out. A few reasons:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;We might not be looking at the correct thing.&lt;/strong&gt; We might just be looking at the final output. If it's an AI agent, you also want to look at whether it followed the right steps to get to that answer. "Correct" and "acceptable" might be different things.&lt;/p&gt;

&lt;p&gt;This is what I call the wrong-path-to-right-answer problem: you got the right answer, but through the wrong process. For example, in a weather application, instead of using the weather API, the agent might hallucinate the answer or use a completely different tool to "find" the weather in San Francisco. Without cross-checking, you'd assume the agent is working correctly.&lt;/p&gt;

&lt;p&gt;This is shortcut behavior. Without proper reasoning and the correct steps, it can still produce a correct answer. The problem is that it won't always produce the right answer because it isn't consistently using the tool you actually wanted it to use.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fczrza183l6vky30tuckz.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%2Fczrza183l6vky30tuckz.png" alt="weather in San Francisco" width="800" height="316"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Same right answer, but only one of these two paths actually called the weather API.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The agent skips a required step.&lt;/strong&gt; There might be steps the agent is required to follow. For example, before sending an email to a prospect or lead, you might want it to:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Find details about that prospect.&lt;/li&gt;
&lt;li&gt;Call the function that pulls that prospect's profile.&lt;/li&gt;
&lt;li&gt;Use a prompt that drafts and sends the email.&lt;/li&gt;
&lt;li&gt;After sending, update the pipeline so the prospect moves from "lead" to "outbound lead."&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The problem is that the agent might send the email and update everything else, but skip the step of actually finding the prospect's details first, so it's working off incomplete context. That can cost your business a lot if you're in the business of securing new prospects.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The high-confidence wrong answer.&lt;/strong&gt; This is where the agent is very confident, but totally wrong. This ties back to RAG: if your data wasn't chunked properly, the retriever can still pull documents, and the agent can still treat them as relevant to the prompt, even when they're not.&lt;/p&gt;

&lt;p&gt;Everything appears to work, but the answer is wrong. An example: a large organization with FAQ documents for different products, say motor insurance and microloans, where only the microloan documents were chunked and indexed properly. A customer service agent works across all of those entities at once could confidently give a wrong answer to someone asking about their motor insurance.&lt;/p&gt;

&lt;p&gt;Next, I will walk you through how to design a eval workflow that catches these failure modes before they hit production.&lt;/p&gt;
&lt;h2&gt;
  
  
  V. The Ideal Workflow for Dealing with Agents and RAG
&lt;/h2&gt;

&lt;p&gt;This is the workflow you'd use if you want to stop vibe-checking and actually turn your AI project from a hobby into a solution that has real impact in production and is highly reliable.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fd5cpqvn3ic1jf75ihj00.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%2Fd5cpqvn3ic1jf75ihj00.png" alt="Ideal Workflow" width="799" height="402"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Six steps, one loop: evaluation is a flywheel, not a one-time checklist.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Build a custom evaluation dataset&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It might be tempting to purchase an existing dataset or use an open-source one. The issue is these datasets aren't fully aligned with what you're building in most cases; they have different benchmarks. It's better to curate your own dataset from your own real inputs, or generate something synthetic based on your own knowledge base.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Turn traces into a dataset&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If your application is already in production, for example a complex agent you're already running traces on using DeepEval, Langfuse, or LangSmith, you can use those traces to build a dataset that's more aligned with reality: the edge cases, what's been catastrophic, and what's succeeded.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Pick the right balance of eval metrics&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Don't start off with more than 10 metrics in most cases. Pick just a few, because you're not trying to boil the ocean. Things worth considering:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Layer 1: deterministic metrics / code-level checks.&lt;/strong&gt; Did it run? Did it return valid JSON? Was the latency low?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;RAG-specific metrics.&lt;/strong&gt; Did it retrieve the proper context, and was the answer faithful to it?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Layer 3: LLM as a judge.&lt;/strong&gt; Using a separate, isolated model to score subjective quality against a strict rubric.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;4. Run the evals&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Now for the fun part: executing your evaluations systematically. Use different evaluation and orchestration tools (DeepEval, Ragas, LangSmith, etc.), depending on what you prefer and know, to run your target agent against the dataset you prepared.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Add evals to your pipeline (CI/CD)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Offline evaluations are great, but you also want online evaluations and a pipeline that treats your prompts and agent workflows like any other source code. When you change your model, say from GPT-5.5 to GPT-5.6, you want to be able to test things like faithfulness and see if the score dropped or improved, automatically, without human involvement, triggered on every PR.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;6. Tracing feeding back into evals&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is what I call the flywheel. You want your production loop to be complete, able to update your dataset based on what's happening in real time, based on your traces. Rule number one: never let your evaluation dataset stay static.&lt;/p&gt;
&lt;h3&gt;
  
  
  Common LLM Eval Mistakes
&lt;/h3&gt;

&lt;p&gt;Here are some common LLM evaluation mistakes teams make, especially early on. I call this the vibe-check trap.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7b12v54qxc5tq0h4kicc.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%2F7b12v54qxc5tq0h4kicc.png" alt="Common LLM Eval Mistakes" width="800" height="259"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Four traps that quietly sink most eval efforts before they even start.&lt;/em&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Doing too much, too early.&lt;/strong&gt; It's tempting to over-engineer the early stages of evaluation, 20 metrics, 100,000 synthetic data points, but that just burns your tokens and your team's engineering time. It's better to start small: 20-25 highly curated test cases with 3-4 high-value metrics tied to your actual business logic.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Focusing on the happy path (and ignoring operational realities).&lt;/strong&gt; It's easy to write perfectly formatted questions with easy answers and test against those. We tend to forget that production gets messy, and end up testing the easy part while ignoring the adversarial edge cases. The agent looks great on paper, but the test isn't actually testing what will happen in production.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Not having a workflow, and relying on "vibe checks."&lt;/strong&gt; This is the biggest and most common AI engineering trap: a handful of prompts tested by yourself in a playground, "yeah, looks good," then straight to production. No edge cases, no red teaming, just a subjective vibe check. It's unscalable, and it more or less guarantees silent failures down the line.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Having fixed evals that don't evolve with production.&lt;/strong&gt; Production isn't just messy, it's dynamic and constantly changing. Models change, models drift, APIs change, user behavior changes. Testing the same 25-item dataset for a year after it's gone stale won't give you a sustainable long-term approach. What you need is a production-grade system that monitors change (those traces we talked about earlier) and feeds them back into the dataset.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;
  
  
  VI. Different Tools You Can Use for Agent Evaluation
&lt;/h2&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%2Fnwah4btylr5r1ey4rz56.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%2Fnwah4btylr5r1ey4rz56.png" alt="Different Tools" width="799" height="329"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Three jobs, three tool categories: build it, score it, watch it.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Agent orchestration with built-in state:&lt;/strong&gt; LangGraph (excellent for testing specific nodes), AutoGen, CrewAI.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;RAG &amp;amp; agent metrics:&lt;/strong&gt; Ragas, DeepEval, TruLens, LangSmith.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Agent tracing &amp;amp; observability:&lt;/strong&gt; LangSmith (crucial for viewing multi-step agent thought processes), Datadog LLM Observability, DeepEval.&lt;/p&gt;
&lt;h2&gt;
  
  
  VII. Resources
&lt;/h2&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
        &lt;div class="c-embed__cover"&gt;
          &lt;a href="https://docs.langchain.com/langsmith/evaluation" class="c-link align-middle" rel="noopener noreferrer"&gt;
            &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flangchain-5e9cc07a.mintlify.app%2Fmintlify-assets%2F_next%2Fimage%3Furl%3D%252F_mintlify%252Fapi%252Fog%253Fdivision%253DDocumentation%2526appearance%253Dsystem%2526title%253DLangSmith%252BEvaluation%2526logoLight%253Dhttps%25253A%25252F%25252Fmintcdn.com%25252Flangchain-5e9cc07a%25252FnQm-sjd_MByLhgeW%25252Fimages%25252Fbrand%25252Flangchain-docs-dark-blue.png%25253Ffit%25253Dmax%252526auto%25253Dformat%252526n%25253DnQm-sjd_MByLhgeW%252526q%25253D85%252526s%25253D5babf1a1962208fd7eed942fa2432ecb%2526logoDark%253Dhttps%25253A%25252F%25252Fmintcdn.com%25252Flangchain-5e9cc07a%25252FnQm-sjd_MByLhgeW%25252Fimages%25252Fbrand%25252Flangchain-docs-light-blue.png%25253Ffit%25253Dmax%252526auto%25253Dformat%252526n%25253DnQm-sjd_MByLhgeW%252526q%25253D85%252526s%25253D0bcd2a1f2599ed228bcedf0f535b45b1%2526primaryColor%253D%252523161F34%2526lightColor%253D%2525237FC8FF%2526backgroundLight%253D%252523FFFFFF%2526backgroundDark%253D%252523030710%26w%3D1200%26q%3D100" height="630" class="m-0" width="1200"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://docs.langchain.com/langsmith/evaluation" rel="noopener noreferrer" class="c-link"&gt;
            LangSmith Evaluation - Docs by LangChain
          &lt;/a&gt;
        &lt;/h2&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
            &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdocs.langchain.com%2Fmintlify-assets%2F_mintlify%2Ffavicons%2Flangchain-5e9cc07a%2FYSQua9Gt91yRswvJ%2F_generated%2Ffavicon%2Fandroid-chrome-192x192.png" width="192" height="192"&gt;
          docs.langchain.com
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;LangSmith evaluation allows for both offline and online evaluations. It's a good resource and tool if you're a fan of the LangChain ecosystem, like me.&lt;/p&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
        &lt;div class="c-embed__cover"&gt;
          &lt;a href="https://deepeval.com/tutorials/tutorial-introduction" class="c-link align-middle" rel="noopener noreferrer"&gt;
            &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdeepeval.com%2Fimg%2Fsocial_card.png" height="395" class="m-0" width="800"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://deepeval.com/tutorials/tutorial-introduction" rel="noopener noreferrer" class="c-link"&gt;
            Introduction | DeepEval - The LLM Evaluation Framework
          &lt;/a&gt;
        &lt;/h2&gt;
          &lt;p class="truncate-at-3"&gt;
            DeepEval is the open-source LLM evaluation framework for testing and benchmarking LLM applications.
          &lt;/p&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
            &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdeepeval.com%2Ffavicon.ico%3Ffavicon.17x~hbiw.96vr.ico%3Fdpl%3Ddpl_J3YKwXAPeHYBnBPgzF8J2vDivB66" width="48" height="48"&gt;
          deepeval.com
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;DeepEval also provides great resources on the topic and tooling around LLM evaluation. I find it to be a very competent resource that will change how you see and do evaluations.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Further reading:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Chapter 3, &lt;em&gt;Evaluation Methodology&lt;/em&gt;, in &lt;strong&gt;AI Engineering&lt;/strong&gt; by Chip Huyen.&lt;/li&gt;
&lt;li&gt;Chapter 10, &lt;em&gt;Evaluating LLM Applications&lt;/em&gt;, in &lt;strong&gt;Prompt Engineering for LLMs&lt;/strong&gt; by John Berryman &amp;amp; Albert Ziegler.&lt;/li&gt;
&lt;li&gt;Chapter 7, &lt;em&gt;Evaluating LLMs&lt;/em&gt;, in &lt;strong&gt;LLM Engineer's Handbook&lt;/strong&gt; by Paul Iusztin &amp;amp; Maxime Labonne, for a practical, hands-on take.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Moffatt v. Air Canada, 2024 BCCRT 149 (CanLII). British Columbia Civil Resolution Tribunal. &lt;a href="https://canlii.ca/t/k2spq" rel="noopener noreferrer"&gt;https://canlii.ca/t/k2spq&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;McCarthy Tétrault, "Moffatt v. Air Canada: A Misrepresentation by an AI Chatbot." &lt;a href="https://www.mccarthy.ca/en/insights/blogs/techlex/moffatt-v-air-canada-misrepresentation-ai-chatbot" rel="noopener noreferrer"&gt;https://www.mccarthy.ca/en/insights/blogs/techlex/moffatt-v-air-canada-misrepresentation-ai-chatbot&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;American Bar Association, "BC Tribunal Confirms Companies Remain Liable for Information Provided by AI Chatbot," Business Law Today, February 2024. &lt;a href="https://www.americanbar.org/groups/business_law/resources/business-law-today/2024-february/bc-tribunal-confirms-companies-remain-liable-information-provided-ai-chatbot/" rel="noopener noreferrer"&gt;https://www.americanbar.org/groups/business_law/resources/business-law-today/2024-february/bc-tribunal-confirms-companies-remain-liable-information-provided-ai-chatbot/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Mata v. Avianca, Inc., 678 F. Supp. 3d 443 (S.D.N.Y. 2023). &lt;a href="https://en.wikipedia.org/wiki/Mata_v._Avianca,_Inc" rel="noopener noreferrer"&gt;https://en.wikipedia.org/wiki/Mata_v._Avianca,_Inc&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Legal Clarity, "Mata v. Avianca: Fake Cases, ChatGPT, and Sanctions." &lt;a href="https://legalclarity.org/what-happened-in-the-mata-v-avianca-case/" rel="noopener noreferrer"&gt;https://legalclarity.org/what-happened-in-the-mata-v-avianca-case/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Damien Charlotin, AI Hallucination Cases Database (tracking legal cases involving generative AI hallucinations). &lt;a href="https://www.damiencharlotin.com/hallucinations/?graphs=1" rel="noopener noreferrer"&gt;https://www.damiencharlotin.com/hallucinations/?graphs=1&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;LangChain, LangSmith Evaluation Documentation. &lt;a href="https://docs.langchain.com/langsmith/evaluation" rel="noopener noreferrer"&gt;https://docs.langchain.com/langsmith/evaluation&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;DeepEval, Tutorial Introduction. &lt;a href="https://deepeval.com/tutorials/tutorial-introduction" rel="noopener noreferrer"&gt;https://deepeval.com/tutorials/tutorial-introduction&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Huyen, Chip. &lt;em&gt;AI Engineering&lt;/em&gt;, Chapter 3: Evaluation Methodology. O'Reilly Media.&lt;/li&gt;
&lt;li&gt;Berryman, John &amp;amp; Ziegler, Albert. &lt;em&gt;Prompt Engineering for LLMs&lt;/em&gt;, Chapter 10: Evaluating LLM Applications. O'Reilly Media.&lt;/li&gt;
&lt;li&gt;Iusztin, Paul &amp;amp; Labonne, Maxime. &lt;em&gt;LLM Engineer's Handbook&lt;/em&gt;, Chapter 7: Evaluating LLMs. Packt Publishing.&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>I Built a Payment Gate That Never Sees Your Balance 🔐⚡</title>
      <dc:creator>CyprianTinasheAarons</dc:creator>
      <pubDate>Fri, 03 Jul 2026 20:48:47 +0000</pubDate>
      <link>https://dev.to/cypriantinasheaarons/i-built-a-payment-gate-that-never-sees-your-balance-4egg</link>
      <guid>https://dev.to/cypriantinasheaarons/i-built-a-payment-gate-that-never-sees-your-balance-4egg</guid>
      <description>&lt;h2&gt;
  
  
  Why Zero-Knowledge Payments Matter Right Now
&lt;/h2&gt;

&lt;p&gt;"Send me your bank statement so I can confirm you can afford this."&lt;/p&gt;

&lt;p&gt;I hear some version of that &lt;strong&gt;every time&lt;/strong&gt; remittance compliance comes up in my work.&lt;/p&gt;

&lt;p&gt;And honestly… I get why it exists. Nobody wants to release funds to a sender who can't cover them.&lt;/p&gt;

&lt;p&gt;But here's the problem: &lt;strong&gt;proving you have enough money has always meant showing exactly how much money you have.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Your balance.&lt;br&gt;
Your full statement.&lt;br&gt;
Your whole financial life, just to move one payment.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;You shouldn't have to show your hand to prove you can play the round.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;With &lt;strong&gt;24 hours left on the clock&lt;/strong&gt; for Stellar Hacks: Real-World ZK, I shipped &lt;code&gt;zkRemit Guard&lt;/code&gt; — a Stellar smart contract that releases an escrowed payment &lt;strong&gt;only after&lt;/strong&gt; the sender proves, with math, that their balance clears the required amount.&lt;/p&gt;

&lt;p&gt;The raw number never touches the chain.&lt;br&gt;
Not once!&lt;/p&gt;


&lt;h2&gt;
  
  
  What You'll Build 🚀
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A Noir circuit&lt;/strong&gt; that proves &lt;code&gt;balance &amp;gt;= required_amount&lt;/code&gt; without revealing &lt;code&gt;balance&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A Poseidon2 commitment&lt;/strong&gt; that locks the proof to one specific balance, so it can't be faked after the fact&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A Soroban contract&lt;/strong&gt; (&lt;code&gt;payment_gate&lt;/code&gt;) that escrows real tokens and only releases them after verifying the proof on-chain&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Anti-replay binding&lt;/strong&gt; so a valid proof from one transfer can never be reused on another&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pass and fail demo scripts&lt;/strong&gt; that prove the gate actually rejects bad proofs, not just accepts good ones&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;nargo 1.0.0-beta.9&lt;/code&gt; (Noir's compiler — install via &lt;code&gt;noirup&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;bb 0.87.0&lt;/code&gt; (Barretenberg, the UltraHonk proving backend — install via &lt;code&gt;bbup&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;stellar-cli ^3.2.0&lt;/code&gt; for deploying and invoking Soroban contracts&lt;/li&gt;
&lt;li&gt;Rust + the &lt;code&gt;wasm32v1-none&lt;/code&gt; target&lt;/li&gt;
&lt;li&gt;Docker, if you want a localnet before you touch testnet&lt;/li&gt;
&lt;li&gt;Clone the repo &lt;a href="https://github.com/CyprianTinasheAarons/zkremit-guard" rel="noopener noreferrer"&gt;https://github.com/CyprianTinasheAarons/zkremit-guard&lt;/a&gt; so you can follow along with full context&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  Step 1: Write the Circuit
&lt;/h2&gt;

&lt;p&gt;This is the whole idea, in 14 lines:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;balance&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;u64&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;salt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Field&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;transfer_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="n"&gt;Field&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;required_amount&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="nb"&gt;u64&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;balance_commitment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="n"&gt;Field&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;span class="nf"&gt;assert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;balance&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="n"&gt;required_amount&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;computed_commitment&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;Poseidon2&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;hash&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;balance&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;Field&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;salt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;transfer_id&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;assert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;computed_commitment&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;balance_commitment&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;code&gt;balance&lt;/code&gt; and &lt;code&gt;salt&lt;/code&gt; have no &lt;code&gt;pub&lt;/code&gt; keyword. &lt;strong&gt;They never leave the sender's machine.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;transfer_id&lt;/code&gt;, &lt;code&gt;required_amount&lt;/code&gt;, and &lt;code&gt;balance_commitment&lt;/code&gt; are the only three numbers that ever reach the chain.&lt;/p&gt;

&lt;p&gt;Two &lt;code&gt;assert&lt;/code&gt;s, two guarantees:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The balance actually clears the bar.&lt;/li&gt;
&lt;li&gt;The balance used in &lt;em&gt;this&lt;/em&gt; proof is the same one committed to earlier — not a bigger number invented on the spot.&lt;/li&gt;
&lt;/ol&gt;


&lt;h2&gt;
  
  
  Step 2: Bind the Secret to a Commitment
&lt;/h2&gt;

&lt;p&gt;Here's the thing most people building their first ZK demo skip:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A private input with no binding is just a number nobody can check.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Before proving anything, the sender commits to their balance with a Poseidon2 hash — a one-way seal. &lt;code&gt;salt&lt;/code&gt; keeps two people with the same balance from producing the same public commitment.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight toml"&gt;&lt;code&gt;&lt;span class="err"&gt;Prover.toml&lt;/span&gt;
  &lt;span class="py"&gt;balance&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"120"&lt;/span&gt;
  &lt;span class="py"&gt;salt&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"7"&lt;/span&gt;
  &lt;span class="py"&gt;transfer_id&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"1"&lt;/span&gt;
  &lt;span class="py"&gt;required_amount&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"50"&lt;/span&gt;
  &lt;span class="py"&gt;balance_commitment&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"1121312...5850"&lt;/span&gt;   &lt;span class="c"&gt;# computed, not guessed&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;That commitment gets computed in Rust — using the &lt;strong&gt;exact same Poseidon2 hash&lt;/strong&gt; the circuit and the contract both use — and written straight into &lt;code&gt;Prover.toml&lt;/code&gt;. Three pieces of code, one shared source of truth.&lt;/p&gt;


&lt;h2&gt;
  
  
  Step 3: Compile and Prove
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nargo check
nargo compile
nargo execute

bb prove &lt;span class="nt"&gt;--scheme&lt;/span&gt; ultra_honk &lt;span class="nt"&gt;--oracle_hash&lt;/span&gt; keccak &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--bytecode_path&lt;/span&gt; target/reserve_threshold.json &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--witness_path&lt;/span&gt; target/reserve_threshold.gz &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--output_path&lt;/span&gt; target &lt;span class="nt"&gt;--output_format&lt;/span&gt; bytes_and_fields

bb write_vk &lt;span class="nt"&gt;--scheme&lt;/span&gt; ultra_honk &lt;span class="nt"&gt;--oracle_hash&lt;/span&gt; keccak &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--bytecode_path&lt;/span&gt; target/reserve_threshold.json &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--output_path&lt;/span&gt; target &lt;span class="nt"&gt;--output_format&lt;/span&gt; bytes_and_fields
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;code&gt;nargo&lt;/code&gt; compiles your circuit and runs it once on real numbers.&lt;br&gt;
&lt;code&gt;bb&lt;/code&gt; generates the actual zero-knowledge proof — UltraHonk, the scheme Stellar's Protocol 26 host functions were built to verify cheaply on-chain.&lt;/p&gt;

&lt;p&gt;Output: a &lt;code&gt;proof&lt;/code&gt;, a &lt;code&gt;vk&lt;/code&gt; (&lt;strong&gt;1,760 fixed bytes&lt;/strong&gt; — the circuit's public fingerprint, reusable across every future transfer), and &lt;code&gt;public_inputs&lt;/code&gt;.&lt;/p&gt;


&lt;h2&gt;
  
  
  Step 4: Build the Payment Gate as a State Machine
&lt;/h2&gt;

&lt;p&gt;Every transfer moves through exactly one path:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;PendingProof → ProofVerified → Released
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Three functions drive it:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;create_transfer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Env&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sender&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Address&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;recipient&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Address&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;i128&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;transfer_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;BytesN&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="mi"&gt;32&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;Result&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;PaymentGateError&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;sender&lt;/span&gt;&lt;span class="nf"&gt;.require_auth&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="c1"&gt;// ...escrows tokens, status = PendingProof&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;submit_proof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Env&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sender&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Address&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;transfer_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;BytesN&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="mi"&gt;32&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;required_amount&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;i128&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;balance_commitment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;BytesN&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="mi"&gt;32&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;public_inputs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Bytes&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;proof_bytes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Bytes&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;Result&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;PaymentGateError&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// rebuild expected public inputs, reject any mismatch, then verify the proof&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;release_transfer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Env&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sender&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Address&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;transfer_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;BytesN&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="mi"&gt;32&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;Result&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;PaymentGateError&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// only pays out if status == ProofVerified&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;code&gt;create_transfer&lt;/code&gt; locks tokens into escrow. Money moves out of the sender's wallet, but nowhere near the recipient yet.&lt;/p&gt;


&lt;h2&gt;
  
  
  Step 5: Wire in the Anti-Replay Check (The Part People Skip)
&lt;/h2&gt;

&lt;p&gt;Before the contract touches any cryptography, it does something cheaper first:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;expected_public_inputs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;expected_public_inputs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;transfer_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;required_amount&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;balance_commitment&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;public_inputs&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;expected_public_inputs&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;Err&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nn"&gt;PaymentGateError&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;PublicInputsMismatch&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;This rebuilds, byte-for-byte, what the public inputs &lt;em&gt;should&lt;/em&gt; say for &lt;strong&gt;this specific transfer&lt;/strong&gt; and rejects anything that doesn't match exactly.&lt;/p&gt;

&lt;p&gt;Why does this matter?&lt;/p&gt;

&lt;p&gt;A valid proof with no binding to a transfer ID is a proof anyone can replay anywhere.&lt;/p&gt;

&lt;p&gt;This one line is what stops that.&lt;/p&gt;

&lt;p&gt;Only after this check passes does &lt;code&gt;verify_proof()&lt;/code&gt; run the real math — parsing the proof, rebuilding the Fiat-Shamir transcript, running sumcheck, and closing it out with a pairing check via Shplemini. If any of it fails, the transfer stays stuck in &lt;code&gt;PendingProof&lt;/code&gt;. Money never moves.&lt;/p&gt;


&lt;h2&gt;
  
  
  Step 6: Run the Happy Path
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;./scripts/deploy_local.sh
&lt;span class="nv"&gt;STELLAR_NETWORK_NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;local&lt;/span&gt; ./scripts/demo_pass.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Three contract calls, in order:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;create_transfer → submit_proof → release_transfer
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Sender escrows &lt;strong&gt;50 tokens&lt;/strong&gt;. Proof verifies. Recipient gets paid.&lt;/p&gt;

&lt;p&gt;The sender's balance of &lt;strong&gt;120&lt;/strong&gt; never appears anywhere on-chain — not in an event, not in storage, not in a log.&lt;/p&gt;


&lt;h2&gt;
  
  
  Step 7: Prove the Fail Path Actually Fails
&lt;/h2&gt;

&lt;p&gt;This is the step that separates a real demo from a slide deck.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;printf&lt;/span&gt; &lt;span class="s1"&gt;'\x01'&lt;/span&gt; | &lt;span class="nb"&gt;dd &lt;/span&gt;&lt;span class="nv"&gt;of&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;proof.bin &lt;span class="nv"&gt;bs&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1 &lt;span class="nv"&gt;seek&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;100 &lt;span class="nv"&gt;conv&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;notrunc
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;One corrupted byte. Same transfer context. Run it:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;create_transfer  → ✅ succeeds
submit_proof     → ❌ rejected
release_transfer → ❌ blocked (status still PendingProof)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Escrowed funds stay locked when the proof is bad. They don't pay out anyway "just in case."&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That's the whole point of a proof gate — not that it accepts good proofs, but that it &lt;strong&gt;refuses bad ones under real economic stakes.&lt;/strong&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  Step 8: Put a Control Panel in Front of It
&lt;/h2&gt;

&lt;p&gt;I'm not going to pretend this is a full wallet-connected dApp — it isn't, and saying otherwise to judges is the fastest way to lose credibility.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;ui/&lt;/code&gt; is a Next.js page that streams the same shell scripts' output into the browser live. Click a button, watch &lt;code&gt;create_transfer → submit_proof → release_transfer&lt;/code&gt; happen in real time instead of scrolling a terminal.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Not&lt;/strong&gt; client-side proof generation. &lt;strong&gt;Not&lt;/strong&gt; Freighter wallet integration. A control panel for a CLI-first demo. Said plainly, upfront, every time.&lt;/p&gt;


&lt;h2&gt;
  
  
  In Conclusion
&lt;/h2&gt;

&lt;p&gt;If you're building anything that needs to prove a fact about private data a balance, a credential, an age, a KYC tier without leaking the underlying number, this is the shape of the answer: &lt;strong&gt;circuit proves the fact, contract checks the proof, chain never sees the secret.&lt;/strong&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  Your Turn 👇
&lt;/h2&gt;

&lt;p&gt;What's the &lt;strong&gt;first private fact&lt;/strong&gt; you'd want a smart contract to verify without ever seeing it?&lt;/p&gt;

&lt;p&gt;A balance? A credential? A KYC tier?&lt;/p&gt;

&lt;p&gt;Drop it below 👇&lt;/p&gt;

&lt;p&gt;Let's build the boring, load-bearing infrastructure nobody's hyping yet 😄&lt;/p&gt;
&lt;h2&gt;
  
  
  Resources
&lt;/h2&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
        &lt;div class="c-embed__cover"&gt;
          &lt;a href="https://developers.stellar.org/docs" class="c-link align-middle" rel="noopener noreferrer"&gt;
            &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdevelopers.stellar.org%2Fimg%2Fdocusaurus%2Fdev-docs-preview.png" height="420" class="m-0" width="800"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://developers.stellar.org/docs" rel="noopener noreferrer" class="c-link"&gt;
            Stellar Developer Docs | Stellar Docs
          &lt;/a&gt;
        &lt;/h2&gt;
          &lt;p class="truncate-at-3"&gt;
            Navigating the docs
          &lt;/p&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
            &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdevelopers.stellar.org%2Fimg%2Fdocusaurus%2Ffavicon-96x96.png" width="96" height="96"&gt;
          developers.stellar.org
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;



&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
        &lt;div class="c-embed__cover"&gt;
          &lt;a href="https://noir-lang.org/docs/" class="c-link align-middle" rel="noopener noreferrer"&gt;
            &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fnoir-lang.org%2Fdocs%2Fimg%2FlogoDark.png" height="311" class="m-0" width="800"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://noir-lang.org/docs/" rel="noopener noreferrer" class="c-link"&gt;
            Noir | Noir Documentation
          &lt;/a&gt;
        &lt;/h2&gt;
          &lt;p class="truncate-at-3"&gt;
            Noir is an open-source, Rust-influenced domain-specific language for writing privacy-preserving programs with zero-knowledge proofs, requiring no prior knowledge of the underlying mathematics or cryptography.
          &lt;/p&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
            &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fnoir-lang.org%2Fdocs%2Fimg%2Ffavicon.svg" width="500" height="500"&gt;
          noir-lang.org
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;



&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/CyprianTinasheAarons" rel="noopener noreferrer"&gt;
        CyprianTinasheAarons
      &lt;/a&gt; / &lt;a href="https://github.com/CyprianTinasheAarons/zkremit-guard" rel="noopener noreferrer"&gt;
        zkremit-guard
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;zkremit-guard&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;&lt;code&gt;zkRemit Guard&lt;/code&gt; is a Stellar proof-gated escrow demo.&lt;/p&gt;

&lt;p&gt;It demonstrates:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a Noir reserve-threshold proof&lt;/li&gt;
&lt;li&gt;UltraHonk proof generation with &lt;code&gt;nargo 1.0.0-beta.9&lt;/code&gt; and &lt;code&gt;bb 0.87.0&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;on-chain Soroban verification&lt;/li&gt;
&lt;li&gt;a real escrowed token transfer that only releases after proof verification&lt;/li&gt;
&lt;li&gt;pass/fail localnet and testnet demo flows&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Status&lt;/h2&gt;
&lt;/div&gt;

&lt;p&gt;The top-level MVP path is implemented and runnable.&lt;/p&gt;

&lt;p&gt;Implemented:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;circuits/reserve_threshold&lt;/code&gt; uses Poseidon2 commitment binding&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;contracts/payment_gate&lt;/code&gt; stores the VK at deploy time and verifies proofs on-chain&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;create_transfer&lt;/code&gt; escrows demo tokens into the contract&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;release_transfer&lt;/code&gt; pays escrowed tokens to the recipient&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;scripts/&lt;/code&gt; runs local/testnet deploy and pass/fail demos&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Still useful follow-ups:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;replace demo token issuance with your intended production asset model&lt;/li&gt;
&lt;li&gt;polish contract events and indexing&lt;/li&gt;
&lt;li&gt;expand docs/UI beyond the CLI-first hackathon flow&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Layout&lt;/h2&gt;
&lt;/div&gt;

&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;&lt;pre class="notranslate"&gt;&lt;code&gt;zkremit-guard/
  README.md
  demo/
  circuits/
  contracts/
  scripts/
  ui/
  docs/
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Suggested next steps&lt;/h2&gt;

&lt;/div&gt;


&lt;ol&gt;

&lt;li&gt;Build proof artifacts with &lt;code&gt;./scripts/build_proof.sh&lt;/code&gt;.&lt;/li&gt;

&lt;li&gt;Deploy locally with &lt;code&gt;./scripts/deploy_local.sh&lt;/code&gt;.&lt;/li&gt;

&lt;li&gt;Run the happy path with &lt;code&gt;STELLAR_NETWORK_NAME=local ./scripts/demo_pass.sh&lt;/code&gt;.&lt;/li&gt;

&lt;li&gt;Run the fail…&lt;/li&gt;

&lt;/ol&gt;&lt;/div&gt;
&lt;br&gt;
  &lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/CyprianTinasheAarons/zkremit-guard" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;
&lt;br&gt;

&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
      &lt;div class="c-embed__body flex items-center justify-between"&gt;
        &lt;a href="https://roadmap.sh/rust" rel="noopener noreferrer" class="c-link fw-bold flex items-center"&gt;
          &lt;span class="mr-2"&gt;roadmap.sh&lt;/span&gt;
          

        &lt;/a&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;



&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
        &lt;div class="c-embed__cover"&gt;
          &lt;a href="https://www.tutorialspoint.com/rust/index.htm" class="c-link align-middle" rel="noopener noreferrer"&gt;
            &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.tutorialspoint.com%2Fimages%2Ftp_logo_436.png" height="228" class="m-0" width="436"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://www.tutorialspoint.com/rust/index.htm" rel="noopener noreferrer" class="c-link"&gt;
            Rust Tutorial
          &lt;/a&gt;
        &lt;/h2&gt;
          &lt;p class="truncate-at-3"&gt;
            Rust is a modern systems programming language developed by the Mozilla Corporation. It is intended to be a language for highly concurrent and highly secure systems. It compiles to native code; hence, it is blazingly fast like C and C++.
          &lt;/p&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
            &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.tutorialspoint.com%2Fimages%2Ffavicon.ico" width="16" height="16"&gt;
          tutorialspoint.com
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;



</description>
      <category>stellarchallenge</category>
      <category>blockchain</category>
      <category>web3</category>
      <category>rust</category>
    </item>
    <item>
      <title>[Boost]</title>
      <dc:creator>CyprianTinasheAarons</dc:creator>
      <pubDate>Thu, 11 Jun 2026 08:21:47 +0000</pubDate>
      <link>https://dev.to/cypriantinasheaarons/-jpm</link>
      <guid>https://dev.to/cypriantinasheaarons/-jpm</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/cypriantinasheaarons/your-ai-demo-is-not-a-product-heres-the-checklist-that-proves-it-186b" class="crayons-story__hidden-navigation-link"&gt;Your AI Demo Is Not a Product!&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/cypriantinasheaarons" class="crayons-avatar  crayons-avatar--l  "&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%2Fuser%2Fprofile_image%2F349088%2F21bc56eb-1ebc-4701-896b-8fe1741e4e43.jpeg" alt="cypriantinasheaarons profile" class="crayons-avatar__image" width="320" height="320"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/cypriantinasheaarons" class="crayons-story__secondary fw-medium m:hidden"&gt;
              CyprianTinasheAarons
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                CyprianTinasheAarons
                
              
              &lt;div id="story-author-preview-content-3858020" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/cypriantinasheaarons" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&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%2Fuser%2Fprofile_image%2F349088%2F21bc56eb-1ebc-4701-896b-8fe1741e4e43.jpeg" class="crayons-avatar__image" alt="" width="320" height="320"&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;CyprianTinasheAarons&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/cypriantinasheaarons/your-ai-demo-is-not-a-product-heres-the-checklist-that-proves-it-186b" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Jun 10&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/cypriantinasheaarons/your-ai-demo-is-not-a-product-heres-the-checklist-that-proves-it-186b" id="article-link-3858020"&gt;
          Your AI Demo Is Not a Product!
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/ai"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;ai&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/startup"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;startup&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/webdev"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;webdev&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/programming"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;programming&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/cypriantinasheaarons/your-ai-demo-is-not-a-product-heres-the-checklist-that-proves-it-186b" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/exploding-head-daceb38d627e6ae9b730f36a1e390fca556a4289d5a41abb2c35068ad3e2c4b5.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/multi-unicorn-b44d6f8c23cdd00964192bedc38af3e82463978aa611b4365bd33a0f1f4f3e97.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;5&lt;span class="hidden s:inline"&gt;&amp;nbsp;reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/cypriantinasheaarons/your-ai-demo-is-not-a-product-heres-the-checklist-that-proves-it-186b#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              &lt;span class="hidden s:inline"&gt;Add&amp;nbsp;Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            3 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial crayons-icon c-btn__icon"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success crayons-icon c-btn__icon"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
      <category>ai</category>
      <category>product</category>
      <category>startup</category>
    </item>
    <item>
      <title>Your AI Agent Is Failing in Production</title>
      <dc:creator>CyprianTinasheAarons</dc:creator>
      <pubDate>Wed, 10 Jun 2026 06:52:33 +0000</pubDate>
      <link>https://dev.to/cypriantinasheaarons/your-ai-agent-is-failing-in-prod-you-just-dont-know-it-yet-4je8</link>
      <guid>https://dev.to/cypriantinasheaarons/your-ai-agent-is-failing-in-prod-you-just-dont-know-it-yet-4je8</guid>
      <description>&lt;p&gt;The demo is impressive. ✅&lt;/p&gt;

&lt;p&gt;The demo works in your environment, with your data, with you watching. ✅&lt;/p&gt;

&lt;p&gt;Production?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Silent failures. Cost overruns. Wrong tool calls. Stuck loops. No fallback.&lt;/strong&gt; ❌&lt;/p&gt;




&lt;h2&gt;
  
  
  Agents in 2026: The Real Problem
&lt;/h2&gt;

&lt;p&gt;Here is the thing most people are not talking about when they ship AI agents:&lt;/p&gt;

&lt;p&gt;A demo agent and a production agent are &lt;strong&gt;completely different things.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A demo is: &lt;em&gt;"watch this work once."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;A production agent is: &lt;em&gt;"what happens when it is wrong, stuck, expensive, over-permissioned, or called 10,000 times by real users?"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;That second question is what separates a cool technical proof-of-concept from something a business can actually rely on.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Demos are not systems.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  1️⃣ The 7 Things That Break in Prod
&lt;/h2&gt;

&lt;p&gt;In every agent hardening sprint I run, the same failures show up:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Failure Mode&lt;/th&gt;
&lt;th&gt;What It Costs&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;No logging&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;You have no idea what the agent did or why&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;No eval set&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;You cannot measure quality or catch regressions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Unlimited tool access&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Agent calls tools it should never touch&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;No retry logic&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Transient failures become permanent failures&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;No memory rules&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Context leaks between sessions or inflates cost&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;No fallback path&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Agent loops or crashes instead of escalating&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;No cost checks&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;1 misconfigured prompt → $400 API bill overnight&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;If your agent is in production with 3 or more of those missing — &lt;strong&gt;you are one bad prompt away from a very expensive incident.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  2️⃣ The Production Hardening Checklist
&lt;/h2&gt;

&lt;p&gt;Before you call an agent production-ready, run through this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Eval set exists&lt;/strong&gt; — at least 20 test cases covering happy path + edge cases&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Structured logging&lt;/strong&gt; — every tool call, every input, every output, every error — logged and searchable&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Retry logic&lt;/strong&gt; — transient API failures handled gracefully, not crashed&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tool limits&lt;/strong&gt; — agent cannot call tools outside its defined scope&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Memory rules&lt;/strong&gt; — what carries over between sessions, what gets cleared, how context is compressed&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fallback paths&lt;/strong&gt; — when the agent gets stuck or uncertain, it has an exit: escalate to human, return partial result, surface an error&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cost checks&lt;/strong&gt; — token budgets enforced, alerts on spend spikes, expensive calls rate-limited&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Human review gates&lt;/strong&gt; — high-stakes decisions require confirmation before action
That is not over-engineering. &lt;strong&gt;That is what makes an agent trustworthy enough to deploy.&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  3️⃣ The Eval Set Is the Most Skipped Step
&lt;/h2&gt;

&lt;p&gt;I see this every time.&lt;/p&gt;

&lt;p&gt;Founders ship agents without a single structured test case.&lt;/p&gt;

&lt;p&gt;Then they notice inconsistent behavior in prod.&lt;/p&gt;

&lt;p&gt;Then they fix one thing, break another, and have no way to tell whether the fix made things better or worse.&lt;/p&gt;

&lt;p&gt;An eval set does not have to be complex. Start with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;5 happy-path inputs where the right answer is obvious&lt;/li&gt;
&lt;li&gt;5 edge cases where the agent should gracefully fail or escalate&lt;/li&gt;
&lt;li&gt;5 adversarial inputs where the agent should refuse or ask for clarification&lt;/li&gt;
&lt;li&gt;5 cost-sensitive inputs where the expected response should be short
&lt;strong&gt;20 evals. Run them after every change.&lt;/strong&gt; That is the minimum.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You prompt → agent responds → eval catches the regression → you fix it → you know the fix worked 🚀&lt;/p&gt;




&lt;h2&gt;
  
  
  4️⃣ The Cost That Sneaks Up on You
&lt;/h2&gt;

&lt;p&gt;Here is the one most people learn the hard way:&lt;/p&gt;

&lt;p&gt;An agent with &lt;strong&gt;50+ tool calls per request&lt;/strong&gt;, no cost checks, and no rate limits will hit a $1,000+ API bill in a weekend from legitimate-looking traffic.&lt;/p&gt;

&lt;p&gt;Not a bug. Not a hack. Just: users engaging, agent running, costs accumulating silently.&lt;/p&gt;

&lt;p&gt;The fix is boring:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Token budgets per request&lt;/li&gt;
&lt;li&gt;Hard limits on tool call chains&lt;/li&gt;
&lt;li&gt;Spend alerts at $50, $100, $250&lt;/li&gt;
&lt;li&gt;Expensive tools gated behind confirmation
That is infrastructure. &lt;strong&gt;Not rocket science. Just discipline.&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  The Real Bottom Line ⚡
&lt;/h2&gt;

&lt;p&gt;Your agent working in a demo is not your agent working in production.&lt;/p&gt;

&lt;p&gt;Production means: wrong inputs, repeated calls, unexpected users, cost pressure, and no one watching.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Harden it before you ship it.&lt;/strong&gt; Evals, logging, retry logic, tool limits, memory rules, fallback paths, cost checks.&lt;/p&gt;

&lt;p&gt;The $3,500–$12,000 hardening sprint is almost always cheaper than the incident that follows from skipping it.&lt;/p&gt;




&lt;h2&gt;
  
  
  Your Turn 👇
&lt;/h2&gt;

&lt;p&gt;Which of the 7 failure modes is your current agent missing?&lt;/p&gt;

&lt;p&gt;Or — have you had a prod incident that cost you time, money, or trust?&lt;/p&gt;

&lt;p&gt;Drop the war story below 👇 — let's build the knowledge base together 😄&lt;/p&gt;

</description>
      <category>ai</category>
      <category>vibecoding</category>
      <category>webdev</category>
      <category>programming</category>
    </item>
    <item>
      <title>Proof Compounds. Claims Decay.</title>
      <dc:creator>CyprianTinasheAarons</dc:creator>
      <pubDate>Wed, 10 Jun 2026 06:52:12 +0000</pubDate>
      <link>https://dev.to/cypriantinasheaarons/proof-compounds-claims-decay-why-delivery-is-your-next-marketing-asset-51kl</link>
      <guid>https://dev.to/cypriantinasheaarons/proof-compounds-claims-decay-why-delivery-is-your-next-marketing-asset-51kl</guid>
      <description>&lt;p&gt;Here is the move most technical service providers miss:&lt;/p&gt;

&lt;p&gt;Every project you deliver quietly dies inside a private folder.&lt;/p&gt;

&lt;p&gt;Every project you deliver &lt;strong&gt;with receipts&lt;/strong&gt; becomes a trust asset that sells the next sprint without you lifting a finger.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Insight Almost No One Acts On
&lt;/h2&gt;

&lt;p&gt;Delivery is not the end of marketing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Delivery is where the next marketing asset is born.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The before/after screenshot. The launch-readiness report excerpt. The workflow map. The metric improvement. The buyer quote.&lt;/p&gt;

&lt;p&gt;All of that is proof. And proof is the compound interest of service work.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Claims decay. Proof compounds.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  1️⃣ What Proof Actually Looks Like
&lt;/h2&gt;

&lt;p&gt;This is the proof asset menu. Every sprint should produce at least 1 item from this list:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Before/after screenshot&lt;/strong&gt; — the most shareable format&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Launch-readiness report excerpt&lt;/strong&gt; — shows rigor and standard&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Workflow map&lt;/strong&gt; — visual, specific, credibility-dense&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dashboard screenshot&lt;/strong&gt; — metrics that moved&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Test checklist&lt;/strong&gt; — shows what was verified, not just what was built&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Client quote&lt;/strong&gt; — even 1 sentence is worth 1,000 words of claims&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Metric improvement&lt;/strong&gt; — &lt;em&gt;"response time dropped from 24 hours to 4 minutes"&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Public teardown&lt;/strong&gt; — anonymous version of the diagnosis&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Case study&lt;/strong&gt; — structured story: context → pain → fix → result&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One-minute walkthrough video&lt;/strong&gt; — screen-recorded, narrated, personal
You do not need all of them. &lt;strong&gt;You need 1 per sprint.&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  2️⃣ The Case Study Structure That Sells
&lt;/h2&gt;

&lt;p&gt;A case study is not a trophy. It is a reusable trust asset.&lt;/p&gt;

&lt;p&gt;Use this structure every time:&lt;/p&gt;

&lt;p&gt;1️⃣ &lt;strong&gt;Context&lt;/strong&gt; — who had the problem? (anonymized if needed)&lt;br&gt;
2️⃣ &lt;strong&gt;Pain&lt;/strong&gt; — what was it costing them?&lt;br&gt;
3️⃣ &lt;strong&gt;Hidden cause&lt;/strong&gt; — what was really broken underneath?&lt;br&gt;
4️⃣ &lt;strong&gt;Fix&lt;/strong&gt; — what did you change, specifically?&lt;br&gt;
5️⃣ &lt;strong&gt;Result&lt;/strong&gt; — what improved? With a number.&lt;br&gt;
6️⃣ &lt;strong&gt;Proof&lt;/strong&gt; — what artifact backs it up?&lt;br&gt;
7️⃣ &lt;strong&gt;Lesson&lt;/strong&gt; — what should similar buyers do next?&lt;/p&gt;

&lt;p&gt;That is 7 steps. The whole thing can fit in a LinkedIn post or a page section.&lt;/p&gt;

&lt;p&gt;And here is the thing most people are not talking about: &lt;strong&gt;a case study with a specific number outperforms 10 posts about your process.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;"Automated the follow-up system"&lt;/em&gt; — nice.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;"Response time dropped from 24 hours to 4 minutes. Booked 3 additional calls in the first week."&lt;/em&gt; — that is a sprint someone will pay $3,500 for.&lt;/p&gt;




&lt;h2&gt;
  
  
  3️⃣ The Handover That Builds Trust
&lt;/h2&gt;

&lt;p&gt;Never finish with "done."&lt;/p&gt;

&lt;p&gt;Finish with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;What changed&lt;/strong&gt; — be specific, not general&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Why it matters&lt;/strong&gt; — business impact, not technical detail&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;How to use it&lt;/strong&gt; — what the buyer should do with it&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What was tested&lt;/strong&gt; — so they know the work was real&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What still carries risk&lt;/strong&gt; — honest, not alarming&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What the next sprint should be&lt;/strong&gt; — already positioning the next sale
That is how &lt;strong&gt;delivery becomes trust&lt;/strong&gt; — and trust becomes a referral, a case study, and a higher-priced next sprint.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  4️⃣ The Proof Stack That Replaces Cold Outreach
&lt;/h2&gt;

&lt;p&gt;Once you have &lt;strong&gt;3 strong proof assets&lt;/strong&gt; from 3 delivered sprints:&lt;/p&gt;

&lt;p&gt;Your outbound changes completely.&lt;/p&gt;

&lt;p&gt;Instead of: &lt;em&gt;"Hi, I build AI automations."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;You send: &lt;em&gt;"Saw your app. Here's a launch-readiness report from a similar product I hardened last month. Want me to run the same audit on yours?"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The proof does the selling. You do the observing.&lt;/p&gt;

&lt;p&gt;That is the machine: skill → sprint → proof → outbound that leads with evidence → easier close → another sprint → stronger proof.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It is infrastructure that compounds.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The Real Bottom Line ⚡
&lt;/h2&gt;

&lt;p&gt;Every delivery that ends with "done" and a Slack message is a missed marketing opportunity.&lt;/p&gt;

&lt;p&gt;Every delivery that ends with a report, a screenshot, a client quote, and a handover video is a &lt;strong&gt;trust asset that sells the next sprint without you having to start from zero.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Build the proof stack. Post it. Send it. Let it work while you sleep.&lt;/p&gt;




&lt;h2&gt;
  
  
  Your Turn 👇
&lt;/h2&gt;

&lt;p&gt;What is the best proof asset you have created from a project — and did you post it publicly?&lt;/p&gt;

&lt;p&gt;Drop it below 👇 — let's compare what has moved the needle 😄&lt;/p&gt;

</description>
      <category>ai</category>
      <category>techtalks</category>
      <category>webdev</category>
      <category>programming</category>
    </item>
    <item>
      <title>The Sales Call Is Not a Performance</title>
      <dc:creator>CyprianTinasheAarons</dc:creator>
      <pubDate>Wed, 10 Jun 2026 06:52:05 +0000</pubDate>
      <link>https://dev.to/cypriantinasheaarons/the-sales-call-is-not-a-performance-its-a-diagnosis-1l71</link>
      <guid>https://dev.to/cypriantinasheaarons/the-sales-call-is-not-a-performance-its-a-diagnosis-1l71</guid>
      <description>&lt;p&gt;I have watched founders lose sales calls they should have won.&lt;/p&gt;

&lt;p&gt;Not because they lacked skill. Not because the offer was wrong.&lt;/p&gt;

&lt;p&gt;Because they walked in to &lt;strong&gt;prove they were smart&lt;/strong&gt; — instead of finding out whether the pain was real.&lt;/p&gt;




&lt;h2&gt;
  
  
  Sales Is Diagnosis Plus Decision
&lt;/h2&gt;

&lt;p&gt;The call is not there for you to pitch.&lt;/p&gt;

&lt;p&gt;The call is there to find out:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Is the pain real?&lt;/li&gt;
&lt;li&gt;Does the buyer have urgency?&lt;/li&gt;
&lt;li&gt;Does the budget exist?&lt;/li&gt;
&lt;li&gt;Can a fixed-scope sprint create a clear win?
&lt;strong&gt;That is it.&lt;/strong&gt; Four questions. Everything else follows from those.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Sales is not pressure. Sales is diagnosis plus decision.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  1️⃣ The Call Structure That Works
&lt;/h2&gt;

&lt;p&gt;Frame the call in the first 60 seconds:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;"I'll understand the current state, ask what is costing you, then tell you whether a sprint makes sense. If it doesn't, I'll say so."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;That sentence does 3 things:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Sets expectations&lt;/strong&gt; — no pressure, no hard close&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Signals competence&lt;/strong&gt; — you have done this before&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Removes the buyer's guard&lt;/strong&gt; — they can be honest about what is broken
Then run this flow:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;1️⃣ &lt;strong&gt;Current state&lt;/strong&gt; — what exists now?&lt;br&gt;
2️⃣ &lt;strong&gt;Pain&lt;/strong&gt; — what is broken or slow?&lt;br&gt;
3️⃣ &lt;strong&gt;Cost&lt;/strong&gt; — what does it cost in time, money, trust, or delay?&lt;br&gt;
4️⃣ &lt;strong&gt;Urgency&lt;/strong&gt; — why now?&lt;br&gt;
5️⃣ &lt;strong&gt;Decision&lt;/strong&gt; — who approves?&lt;br&gt;
6️⃣ &lt;strong&gt;Success&lt;/strong&gt; — what would make this worth paying for?&lt;br&gt;
7️⃣ &lt;strong&gt;Close&lt;/strong&gt; — recommend the sprint or walk away&lt;/p&gt;




&lt;h2&gt;
  
  
  2️⃣ The Questions That Reveal Money
&lt;/h2&gt;

&lt;p&gt;These are the 6 questions I use to find whether a sprint is worth recommending:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;"What happens if this stays broken for another 30 days?"&lt;/strong&gt; — reveals urgency and cost&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;"What have you already tried?"&lt;/strong&gt; — reveals how serious they are&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;"Where does the current process lose leads, users, time, or trust?"&lt;/strong&gt; — reveals the money leak&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;"Who feels this pain most inside the business?"&lt;/strong&gt; — reveals whether the buyer is also the decision-maker&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;"What would make this an obvious win?"&lt;/strong&gt; — reveals success criteria before you price&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;"If we fixed only one thing first, what would matter most?"&lt;/strong&gt; — reveals scope
Listen for the answer with the money in it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is the thing you fix. That is what you price. &lt;strong&gt;That is the sprint.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  3️⃣ How to Close Without Begging
&lt;/h2&gt;

&lt;p&gt;Most founders either close too hard or too soft.&lt;/p&gt;

&lt;p&gt;Too hard: &lt;em&gt;"So are you ready to move forward today?"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Too soft: &lt;em&gt;"Let me know if you want to chat more sometime."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Both lose.&lt;/p&gt;

&lt;p&gt;Here is the close language that works:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Based on what you told me, the best first move is not a huge rebuild. It is a fixed-scope sprint focused on the highest-risk bottleneck. I'll send a proposal with scope, timeline, price, what is excluded, and what success looks like."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;No begging. No rambling. &lt;strong&gt;No discount panic.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Send the proposal within 24 hours of the call. Every hour you wait, urgency fades.&lt;/p&gt;




&lt;h2&gt;
  
  
  4️⃣ When to Walk Away
&lt;/h2&gt;

&lt;p&gt;Not every call ends in a sprint.&lt;/p&gt;

&lt;p&gt;Walk away when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The pain is &lt;strong&gt;not expensive enough&lt;/strong&gt; to justify action&lt;/li&gt;
&lt;li&gt;The urgency is &lt;strong&gt;performed, not real&lt;/strong&gt; — &lt;em&gt;"we'll definitely do this next quarter"&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;The decision-maker &lt;strong&gt;is not on the call&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;The buyer wants &lt;strong&gt;open-ended help&lt;/strong&gt; — not a defined outcome
Walking away is not a lost sale. It is &lt;strong&gt;protecting your delivery capacity for buyers who have real pain and real urgency.&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And honestly… a clean walk-away often triggers a re-engagement 2 weeks later when the problem gets worse.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Real Bottom Line ⚡
&lt;/h2&gt;

&lt;p&gt;The best sales call is the one where you ask the right questions, listen for the money, and either recommend a clear sprint — or tell them it is not the right fit.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No performance. No deck. No convincing.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Just diagnosis and decision.&lt;/p&gt;

&lt;p&gt;That is how conversations become cash — without either person feeling gross about it.&lt;/p&gt;




&lt;h2&gt;
  
  
  Your Turn 👇
&lt;/h2&gt;

&lt;p&gt;What is the hardest part of a sales call for you — the opening, the pricing, or the close?&lt;/p&gt;

&lt;p&gt;Drop it below 👇 — I'm curious where the breakdown usually happens 😄&lt;/p&gt;

</description>
      <category>startup</category>
      <category>ai</category>
      <category>javascript</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Outbound Without Begging</title>
      <dc:creator>CyprianTinasheAarons</dc:creator>
      <pubDate>Wed, 10 Jun 2026 06:51:56 +0000</pubDate>
      <link>https://dev.to/cypriantinasheaarons/outbound-without-begging-the-contextual-outreach-system-that-works-21ad</link>
      <guid>https://dev.to/cypriantinasheaarons/outbound-without-begging-the-contextual-outreach-system-that-works-21ad</guid>
      <description>&lt;p&gt;Cold outreach fails when it feels like a stranger asking for your time.&lt;/p&gt;

&lt;p&gt;It works when it feels like &lt;strong&gt;a useful operator noticed a real problem and offered a small, low-risk next step.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The difference is almost always structure. Not charisma. Not volume.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Structure.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The Conversation I Keep Having
&lt;/h2&gt;

&lt;p&gt;I see founders send 100 cold DMs with zero replies.&lt;/p&gt;

&lt;p&gt;Then I read the messages.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;"Hi [Name], I help businesses with AI automation. Would love to connect and explore synergies."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;That message fails on every line:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No context — why this person, why now?&lt;/li&gt;
&lt;li&gt;No observation — what did you actually notice?&lt;/li&gt;
&lt;li&gt;No value — what is the useful thing?&lt;/li&gt;
&lt;li&gt;No risk — what is the low-friction next step?&lt;/li&gt;
&lt;li&gt;No diagnosis — you sound like you want something, not like you see something
Here is the thing most people are not talking about: &lt;strong&gt;the DM that gets a reply is the one that feels like it was written about the specific person reading it.&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  1️⃣ The Outbound Formula
&lt;/h2&gt;

&lt;p&gt;Every message that works uses this structure:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Part&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Context&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Why this person, why now?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Observation&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;What did you actually notice about their product/page/content?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Risk or opportunity&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;What might be costing them that they haven't seen?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Useful next step&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Checklist, teardown, quick audit — something useful&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Light CTA&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Easy to answer — not a marriage proposal&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The goal is not to sell on the first message. &lt;strong&gt;The goal is to be useful enough that they want the next thing you send.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  2️⃣ Three Messages That Actually Work
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;AI app launch opener:&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Saw your launch. Before adding more features, I'd check the hidden trust risks: auth, payments, logging, analytics, and onboarding. Want the launch-readiness checklist?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;GTM system opener:&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Your product looks useful, but the path from attention to booked calls feels thin. I can map the missing GTM system — want a quick look?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Workflow automation opener:&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"There's probably money leaking between first enquiry and follow-up. I can show you the 7-day missed-lead recovery workflow if helpful."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Notice what they all share:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Specific&lt;/strong&gt; — not "I help with AI"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Observational&lt;/strong&gt; — something you actually noticed&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Useful&lt;/strong&gt; — they get something even if they say no&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  - &lt;strong&gt;Low-friction&lt;/strong&gt; — "want the checklist?" is a yes/no, not a commitment
&lt;/h2&gt;

&lt;h2&gt;
  
  
  3️⃣ The Follow-Up Cadence That Does Not Annoy
&lt;/h2&gt;

&lt;p&gt;Most outbound fails not at the first message — but at the follow-up.&lt;/p&gt;

&lt;p&gt;Either people never follow up at all.&lt;/p&gt;

&lt;p&gt;Or they send &lt;strong&gt;"Just following up on my last message"&lt;/strong&gt; — which is the DM equivalent of poking someone in the shoulder with no reason.&lt;/p&gt;

&lt;p&gt;Here is the cadence that works:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Day 0&lt;/strong&gt; — contextual opener with observation and useful thing&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Day 2&lt;/strong&gt; — one useful checklist or additional observation (no ask)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Day 5&lt;/strong&gt; — small proof or example: screenshot, result, before/after&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Day 10&lt;/strong&gt; — close the loop cleanly: &lt;em&gt;"Not a fit right now — happy to reconnect later."&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Day 21&lt;/strong&gt; — re-engage only if there is a new trigger: new launch, new post, new product
&lt;strong&gt;5 touches. 21 days. Then move.&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If someone is not ready, that is not a no. It is a timing mismatch. The pipeline exists to capture the right people at the right moment — not to convince the wrong people with more pressure.&lt;/p&gt;




&lt;h2&gt;
  
  
  4️⃣ The Comment That Opens the Conversation
&lt;/h2&gt;

&lt;p&gt;Before the DM — the comment.&lt;/p&gt;

&lt;p&gt;A thoughtful comment on the right post, published before the DM, warms the approach.&lt;/p&gt;

&lt;p&gt;You are no longer a stranger. You are &lt;strong&gt;the operator who left the useful diagnosis in the thread.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That shift — from unknown to recognized — cuts the friction on the DM by half.&lt;/p&gt;

&lt;p&gt;Comment first. DM second. Offer third.&lt;/p&gt;

&lt;p&gt;You prompt → observation left in comment → DM sent with context → conversation starts → teardown offered → sprint sold 🚀&lt;/p&gt;




&lt;h2&gt;
  
  
  The Real Bottom Line ⚡
&lt;/h2&gt;

&lt;p&gt;Outbound without begging is outbound that &lt;strong&gt;leads with value, not asks.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The message that gets a reply is the one where the reader thinks: &lt;em&gt;"This person actually looked at my thing."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Do the research. Write the observation. Send the useful thing first.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Then ask for the conversation.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Your Turn 👇
&lt;/h2&gt;

&lt;p&gt;What is the worst cold DM you have ever received — and what made it so bad?&lt;/p&gt;

&lt;p&gt;Drop it below 👇 — let's learn from the horror stories 😄&lt;/p&gt;

</description>
    </item>
    <item>
      <title>The Million-Dollar Math Is Boring</title>
      <dc:creator>CyprianTinasheAarons</dc:creator>
      <pubDate>Wed, 10 Jun 2026 06:51:47 +0000</pubDate>
      <link>https://dev.to/cypriantinasheaarons/the-million-dollar-math-is-boring-and-thats-the-point-1eb7</link>
      <guid>https://dev.to/cypriantinasheaarons/the-million-dollar-math-is-boring-and-thats-the-point-1eb7</guid>
      <description>&lt;p&gt;A million dollars is emotional as a dream.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;As math, it is boring.&lt;/strong&gt; And that is exactly why most people never get close.&lt;/p&gt;




&lt;h2&gt;
  
  
  Break It Down
&lt;/h2&gt;

&lt;p&gt;Here is the thing: $1M/year is not one big bet.&lt;/p&gt;

&lt;p&gt;It is a machine. And machines are built from boring, repeatable components.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;20 clients at $50,000? That is $1M.&lt;/li&gt;
&lt;li&gt;100 clients at $10,000? That is $1M.&lt;/li&gt;
&lt;li&gt;12 retainers at $4,000/month? That is $576k — plus 4 sprints at $10,000 each gets you to $616k.
The question is not whether the number is possible.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The question is which machine can realistically produce it&lt;/strong&gt; — from where you actually stand today.&lt;/p&gt;




&lt;h2&gt;
  
  
  1️⃣ The Practical Ladder
&lt;/h2&gt;

&lt;p&gt;Here is how the staged path actually works for an AI service business:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Stage&lt;/th&gt;
&lt;th&gt;What You Are Doing&lt;/th&gt;
&lt;th&gt;Why It Matters&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Stage 1&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Sell fixed-scope sprints&lt;/td&gt;
&lt;td&gt;Creates cash and proof&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Stage 2&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Turn repeated sprint work into templates, SOPs, automations&lt;/td&gt;
&lt;td&gt;Reduces delivery time, increases margin&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Stage 3&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Sell retainers around highest-demand system&lt;/td&gt;
&lt;td&gt;Predictable monthly cash&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Stage 4&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Productize repeated workflow into software or toolkit&lt;/td&gt;
&lt;td&gt;Scalable without more hours&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Stage 5&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Scale the thing the market already proved it wants&lt;/td&gt;
&lt;td&gt;Compound the machine&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Notice what is missing from Stage 1.&lt;/p&gt;

&lt;p&gt;There is no SaaS. No product. No cold paid traffic. No team.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Just skill, packaged cleanly, sold to people with money and a painful problem.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That is the fastest path — not the most glamorous one.&lt;/p&gt;




&lt;h2&gt;
  
  
  2️⃣ The Proof-of-Force Line
&lt;/h2&gt;

&lt;p&gt;The first mission is not $1M.&lt;/p&gt;

&lt;p&gt;The first mission is &lt;strong&gt;$10k/month&lt;/strong&gt; — reliably, from sprint work.&lt;/p&gt;

&lt;p&gt;Here is what that actually looks like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;2 × $1,500 teardown/audit packages = $3,000&lt;/li&gt;
&lt;li&gt;2 × $3,500 implementation sprints = $7,000&lt;/li&gt;
&lt;li&gt;2 × $5,000 launch/GTM sprints = $10,000&lt;/li&gt;
&lt;li&gt;3 × $2,000 retainers = $6,000/month
That is not the finish line. It is &lt;strong&gt;the proof-of-force line.&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It proves the machine works. It funds the next iteration. It creates the case studies that make the next sprint easier to sell.&lt;/p&gt;

&lt;p&gt;Then you go from $10k/month to $25k. Then $50k. Then you make the productization decision from a position of demand — not hope.&lt;/p&gt;




&lt;h2&gt;
  
  
  3️⃣ The Brutal Filter
&lt;/h2&gt;

&lt;p&gt;Every week has to be measured against 5 buckets:&lt;/p&gt;

&lt;p&gt;1️⃣ Creates qualified attention&lt;br&gt;
2️⃣ Starts sales conversations&lt;br&gt;
3️⃣ Improves the offer&lt;br&gt;
4️⃣ Delivers paid outcomes&lt;br&gt;
5️⃣ Turns work into proof&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If the week was busy but produced none of those — that week does not count.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A week can feel intense and still generate no pipeline, no proposal, no proof, and no cash movement.&lt;/p&gt;

&lt;p&gt;Drift is the enemy.&lt;/p&gt;

&lt;p&gt;Not the lack of skill. Not the market. &lt;strong&gt;Drift.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  4️⃣ What $10k/Month Actually Requires
&lt;/h2&gt;

&lt;p&gt;People underestimate how few moving pieces this needs.&lt;/p&gt;

&lt;p&gt;At $10k/month you need:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;1 clear offer&lt;/strong&gt; — buyers understand what they are purchasing in 10 seconds&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;1 functioning pipeline&lt;/strong&gt; — at least 5 real conversations happening at any time&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;1 content system&lt;/strong&gt; — useful posts going out daily, creating trust before the call&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;1 delivery standard&lt;/strong&gt; — work produces proof, not just output&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;1 pricing boundary&lt;/strong&gt; — no free overruns, no vague scope, payment before deep work
That is 5 systems. Not 50.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And honestly… most founders skip all 5 and wonder why the number never moves.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Real Bottom Line ⚡
&lt;/h2&gt;

&lt;p&gt;The million-dollar path is not "learn more tools."&lt;/p&gt;

&lt;p&gt;It is:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pick a buyer with a painful, expensive problem → package one outcome they understand → build enough proof that trust starts before the call → create daily distribution → sell fixed-scope sprints → deliver with receipts → repeat until the market remembers what you are for.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That is the machine.&lt;/p&gt;

&lt;p&gt;Build the machine.&lt;/p&gt;




&lt;h2&gt;
  
  
  Your Turn 👇
&lt;/h2&gt;

&lt;p&gt;Where are you on the practical ladder right now?&lt;/p&gt;

&lt;p&gt;Stage 1? Still figuring out the offer? Already at retainers?&lt;/p&gt;

&lt;p&gt;Drop it below 👇 — let's compare notes 😄&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>startup</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Distribution Is the Moat — And Most Technical Founders Have None</title>
      <dc:creator>CyprianTinasheAarons</dc:creator>
      <pubDate>Wed, 10 Jun 2026 06:51:39 +0000</pubDate>
      <link>https://dev.to/cypriantinasheaarons/distribution-is-the-moat-and-most-technical-founders-have-none-5db</link>
      <guid>https://dev.to/cypriantinasheaarons/distribution-is-the-moat-and-most-technical-founders-have-none-5db</guid>
      <description>&lt;p&gt;Products are easier to build.&lt;/p&gt;

&lt;p&gt;Workflows are easier to automate.&lt;/p&gt;

&lt;p&gt;Content is easier to generate.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;But trust is not easier. Attention is not easier. Buyer memory is not easier.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The Hard Truth
&lt;/h2&gt;

&lt;p&gt;Here is the thing most people are not talking about in 2026:&lt;/p&gt;

&lt;p&gt;The bottleneck is no longer the product. The bottleneck is whether the right buyer has seen your diagnosis &lt;strong&gt;3 times in 2 weeks.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Because that is how trust is built. Not with one perfect post. With &lt;strong&gt;repeated, useful presence in the right feed.&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Distribution is the moat.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  1️⃣ Why "Staying Active" Is the Wrong Goal
&lt;/h2&gt;

&lt;p&gt;Most founders post to stay active.&lt;/p&gt;

&lt;p&gt;That is not a content strategy. That is anxiety dressed up as marketing.&lt;/p&gt;

&lt;p&gt;Every post should do one of 3 things:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Make the buyer &lt;strong&gt;understand a pain they already have&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Make the buyer &lt;strong&gt;trust your diagnosis of that pain&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Move the buyer &lt;strong&gt;closer to a conversation&lt;/strong&gt;
A post about your tech stack? Probably none of those.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A post that says &lt;em&gt;"Your AI app is not launch-ready until auth, payments, logging, and rollback are boring"&lt;/em&gt; — that does all 3.&lt;/p&gt;




&lt;h2&gt;
  
  
  2️⃣ The Five Content Pillars That Build Pipeline
&lt;/h2&gt;

&lt;p&gt;Here is the system I use. 5 pillars. Everything maps to one of them:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Pillar&lt;/th&gt;
&lt;th&gt;What It Signals&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Launch risk&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Why AI-built products break before production&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;GTM systems&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;How founders turn expertise into pipeline&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Workflow automation&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;How businesses leak time and revenue&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Proof and case studies&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;What changed before/after — with receipts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Founder operating lessons&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;The discipline behind building for money&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Every post I write maps to one of these.&lt;/p&gt;

&lt;p&gt;Not because it is tidy. Because &lt;strong&gt;each pillar speaks directly to a buyer who has a specific pain&lt;/strong&gt; — and positions me as the operator who sees it clearly.&lt;/p&gt;




&lt;h2&gt;
  
  
  3️⃣ The Daily Format That Creates Pipeline
&lt;/h2&gt;

&lt;p&gt;This is the actual weekly posting structure that works:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Monday&lt;/strong&gt; — mistake post: a painful thing technical founders do wrong&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tuesday&lt;/strong&gt; — teardown post: a real example dissected publicly&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Wednesday&lt;/strong&gt; — checklist: the 10-item audit your buyer needs&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Thursday&lt;/strong&gt; — before/after: what changed after a sprint, with specifics&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Friday&lt;/strong&gt; — offer or story: the sprint, the price, the outcome, the next step&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Saturday&lt;/strong&gt; — long guide: deeper into one of the 5 pillars&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sunday&lt;/strong&gt; — metrics and lessons: what worked, what got cut, what moved
That is &lt;strong&gt;7 posts per week.&lt;/strong&gt; Not all need to be long. Most should be short and sharp.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You prompt → post goes out → buyer reads → trust builds → conversation starts → sprint sells 🚀&lt;/p&gt;




&lt;h2&gt;
  
  
  4️⃣ The Comment That Builds More Credibility Than a Post
&lt;/h2&gt;

&lt;p&gt;Here is the underrated move: &lt;strong&gt;a great comment on the right post outperforms a mediocre original post.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A good comment does one of 4 things:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Gives a sharper diagnosis than the original post offered&lt;/li&gt;
&lt;li&gt;Adds a checklist the reader can use today&lt;/li&gt;
&lt;li&gt;Names the hidden risk no one mentioned&lt;/li&gt;
&lt;li&gt;Turns the idea into a concrete execution step
Do not comment like a fan when you can comment like an operator.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;em&gt;"Great post!"&lt;/em&gt; — no pipeline.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;"The real risk here is that broken auth after vibe-coding is invisible until a user gets locked out. Here's the 3-item check that catches it."&lt;/em&gt; — pipeline.&lt;/p&gt;




&lt;h2&gt;
  
  
  5️⃣ LinkedIn vs X — Different Games
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;LinkedIn is the boardroom.&lt;/strong&gt; The buyer's professional identity lives there. Publish operator-level posts. Comment where founders and agency owners already gather. Use profile views as pipeline signals.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;X is the radar.&lt;/strong&gt; Early pain, builder language, launch signals, sharp opinions. Use it to spot emerging problems and test angles before committing to full posts.&lt;/p&gt;

&lt;p&gt;Use both. &lt;strong&gt;Do not behave the same way on both.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The Real Bottom Line ⚡
&lt;/h2&gt;

&lt;p&gt;The technical founder who posts useful, specific, buyer-facing content &lt;strong&gt;every single day&lt;/strong&gt; will outcompete the quieter founder with a better product.&lt;/p&gt;

&lt;p&gt;Every time.&lt;/p&gt;

&lt;p&gt;Distribution is not optional support for a good product.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Distribution is how the market finds out a good product exists.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Your Turn 👇
&lt;/h2&gt;

&lt;p&gt;Which of the 5 pillars is missing from your current content?&lt;/p&gt;

&lt;p&gt;Or — what is stopping you from posting daily right now?&lt;/p&gt;

&lt;p&gt;Drop it below 👇 — let's debug the system together 😄&lt;/p&gt;

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