<?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: DEVALAND</title>
    <description>The latest articles on DEV Community by DEVALAND (@devaland).</description>
    <link>https://dev.to/devaland</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%2F2584621%2F01a48271-116e-44b8-a7d4-d11e1c4fd341.jpg</url>
      <title>DEV Community: DEVALAND</title>
      <link>https://dev.to/devaland</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/devaland"/>
    <language>en</language>
    <item>
      <title>AI Automation for Multi-Entity Founders</title>
      <dc:creator>DEVALAND</dc:creator>
      <pubDate>Mon, 10 Aug 2026 14:00:06 +0000</pubDate>
      <link>https://dev.to/devaland/ai-automation-for-multi-entity-founders-3kl0</link>
      <guid>https://dev.to/devaland/ai-automation-for-multi-entity-founders-3kl0</guid>
      <description>&lt;p&gt;If you own several companies under one roof, the fastest AI win is not a flashy chatbot. It is automating the same manual document and data work you already repeat across every entity. Start with one high-volume workflow, prove it in a two-week pilot, then reuse the same engine across the group.&lt;/p&gt;

&lt;p&gt;Most advice about AI automation is written for a single business. That advice quietly misses the biggest advantage a multi-entity founder actually has. When you run a holding company, a roll-up, or a group of related businesses, your pain is not one broken process. It is one broken process copied five or ten times, once per entity, each handled a little differently. That repetition is a cost when done by hand. It is a gift when you automate, because you build the solution once and it pays back everywhere.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Owning Multiple Companies Changes the Math
&lt;/h2&gt;

&lt;p&gt;A single company automating an invoice workflow saves one team some hours. A group of eight companies automating the same workflow saves eight teams those hours, from one build. The engineering effort barely changes. The return multiplies by the number of entities.&lt;/p&gt;

&lt;p&gt;This is the part owners underestimate. You are not looking at eight separate automation projects with eight budgets. You are looking at one project that happens to run in eight places. The economics of custom AI, which can feel expensive for a single small business, become very comfortable when the same system serves a whole group.&lt;/p&gt;

&lt;p&gt;There is a second, quieter advantage. Because your entities are related, they share document types, vocabulary, suppliers, and reporting rhythms. A workflow tuned for one of them usually needs only light adjustment for the next. You are compounding, not restarting.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Highest-ROI First Targets
&lt;/h2&gt;

&lt;p&gt;Across groups I have worked with, the same four candidates keep rising to the top. They are boring, repetitive, and expensive precisely because a human does them today.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Workflow&lt;/th&gt;
&lt;th&gt;What it looks like now&lt;/th&gt;
&lt;th&gt;What AI changes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Document intake&lt;/td&gt;
&lt;td&gt;Someone opens PDFs, reads them, retypes fields into a system&lt;/td&gt;
&lt;td&gt;Extract fields automatically, flag anything uncertain for review&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cross-entity reporting&lt;/td&gt;
&lt;td&gt;Each company sends numbers in its own format, someone stitches them&lt;/td&gt;
&lt;td&gt;Pull, normalize, and summarize into one consistent view&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Repetitive data entry&lt;/td&gt;
&lt;td&gt;Copying the same data between two systems that do not talk&lt;/td&gt;
&lt;td&gt;An integration moves and validates it without the copy-paste&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Knowledge in one head&lt;/td&gt;
&lt;td&gt;Key answers live only with one long-tenured person&lt;/td&gt;
&lt;td&gt;A grounded assistant answers from the real source documents&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The last one deserves attention. In most groups, a handful of people carry critical knowledge in their heads: how a specific entity files, why a supplier is treated a certain way, what a clause means. When that person is on holiday or leaves, the group slows down. Capturing that knowledge into a system that answers from your actual documents is not a nice-to-have. It is risk reduction.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Pick the First Workflow
&lt;/h2&gt;

&lt;p&gt;Do not start with the most interesting problem. Start with the one that is high volume, repeated across the most entities, and painful enough that people already complain about it. Score your candidates honestly against four questions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Volume.&lt;/strong&gt; How many times a week does this happen across the whole group? More is better for a first target.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Repetition.&lt;/strong&gt; Is the work genuinely the same each time, or does every case need real judgment? Sameness automates well.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reach.&lt;/strong&gt; How many entities share this exact workflow? Wider reach means a bigger payback from one build.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Clarity.&lt;/strong&gt; Can you point to where the correct answer lives today? If the source is clear, the automation is trustworthy.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The sweet spot scores high on all four: lots of volume, very repetitive, shared by most of your companies, with a clear source of truth. Document intake usually fits, which is why it is where I most often begin. If you want to go deeper on that area, I wrote a full guide to intelligent document processing that walks through it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why a Shared Grounded-AI Layer Beats Point Tools
&lt;/h2&gt;

&lt;p&gt;Here is the trap. Each entity, left to itself, buys or bolts on its own point tool: one for invoices here, one for a chatbot there. Within a year the group has a dozen disconnected tools, a dozen bills, and no shared memory. Nothing learns from anything else.&lt;/p&gt;

&lt;p&gt;The better pattern is one shared layer that every entity plugs into. Build the document understanding, the extraction, and the question-answering once, as a common service, and let each company feed it their documents. When you improve the layer, every entity gets the improvement at the same time. When you add a new company to the group, it connects to something that already works.&lt;/p&gt;

&lt;p&gt;Critically, this layer has to be grounded. Grounded means the AI answers only from your real documents and cites where each answer came from, rather than producing confident guesses. My rule on every build is simple: cite the source or cut the claim. For a founder making real decisions across multiple entities, an assistant that invents a number is worse than no assistant at all. Grounding is what makes the output safe to trust.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Single Source of Truth
&lt;/h2&gt;

&lt;p&gt;A shared layer only works if the group agrees on where the truth lives. Today, in most multi-entity setups, the truth is scattered: some in a folder, some in an email thread, some in one person's memory. The automation project is often the first time a group is forced to answer a healthy question. For each type of information, what is the one authoritative source?&lt;/p&gt;

&lt;p&gt;You do not need to consolidate everything into one giant system to get this. You need each important data type to have a clear home that the AI layer reads from. Once that home exists, every entity, every report, and every answer traces back to the same place. That is what stops two of your companies from quietly reporting the same thing two different ways.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prove It With One Scoped Pilot
&lt;/h2&gt;

&lt;p&gt;Do not roll AI across the whole group on faith. Pick one workflow in one or two entities and run a tightly scoped pilot. A good pilot is one to two weeks, has a number attached to it that you can check yourself, and ends with a working system on your real documents, not a slide deck.&lt;/p&gt;

&lt;p&gt;This is exactly how I work. A paid proof pilot starts from 2,500 dollars, runs in one to two weeks, and is credited toward the full build if you proceed. You see the thing working on your own data before you commit to rolling it across the group. From there, a fixed-scope build typically runs 8,000 to 25,000 dollars, or you keep me on as a fractional AI engineer from 4,000 dollars a month. Everything is async, with a written intake and no calls required.&lt;/p&gt;

&lt;p&gt;The proof matters more here than in a single business, because a multi-entity rollout multiplies both the upside and the risk. Prove the pattern once, cheaply, on real documents, then reuse it with confidence. I have built exactly this kind of grounded, cited system twice over. &lt;a href="https://devaland.com/deal-os" rel="noopener noreferrer"&gt;Deal OS&lt;/a&gt; reads messy deal documents and answers with citations back to the source. &lt;a href="https://devaland.com/voice-ai-demo" rel="noopener noreferrer"&gt;Amy&lt;/a&gt; answers product questions off a live data source without inventing anything. Both are real, shipped systems, not demos.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where to Start This Week
&lt;/h2&gt;

&lt;p&gt;List your entities. Write down the one document or data workflow that appears in the most of them. That is almost certainly your first target. If you want a second opinion on which workflow to pick, or a scoped pilot to prove it, send me the details through the async intake. No call needed. Just tell me what your group repeats by hand, and I will tell you honestly whether it is worth automating.&lt;/p&gt;

&lt;p&gt;Start here: &lt;a href="https://devaland.com/ai-development" rel="noopener noreferrer"&gt;Custom AI &amp;amp; Python development&lt;/a&gt;. Or send your workflow straight to the &lt;a href="https://devaland.com/contact?service=ai-build" rel="noopener noreferrer"&gt;async intake&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>automation</category>
      <category>machinelearning</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Custom AI Development for Founders</title>
      <dc:creator>DEVALAND</dc:creator>
      <pubDate>Thu, 06 Aug 2026 14:00:06 +0000</pubDate>
      <link>https://dev.to/devaland/custom-ai-development-for-founders-29ah</link>
      <guid>https://dev.to/devaland/custom-ai-development-for-founders-29ah</guid>
      <description>&lt;p&gt;Off-the-shelf AI is enough when a wrong answer is cheap and a human checks the output anyway. It stops being enough the moment the AI touches your real documents, your numbers, or a regulated decision, because a generic model will answer confidently even when it is wrong. A custom build fixes that with retrieval, citations, human approval, and evaluation, so the system either backs up a claim with a source or does not make the claim at all.&lt;/p&gt;

&lt;p&gt;That last line is the whole article. Everything below is how you get there, when it is worth it, and how to find out cheaply before you commit a full budget.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wiring up a chatbot is not building an AI system
&lt;/h2&gt;

&lt;p&gt;Most "AI features" you see are a text box wired to a model API. You type, the model answers, done. That is a demo, and demos are useful. The problem is that a demo has no idea what is true. It was trained on the public internet up to some cutoff date, and it has never seen your lease agreements, your lab results, your cap table, or last month's numbers.&lt;/p&gt;

&lt;p&gt;Ask a generic tool a question about your business and it does one of three things: it answers from stale general knowledge, it answers from whatever you happened to paste into the window, or it fills the gap with a plausible invention. The third one is the dangerous one. The model does not signal doubt. A fabricated clause and a real clause come out in the same calm, formatted sentence.&lt;/p&gt;

&lt;p&gt;For a marketing first draft, fine. For a diligence memo, a compliance summary, or a customer-facing price, a confident wrong answer is worse than no answer, because someone acts on it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why generic tools hallucinate on your data, and how a real build stops it
&lt;/h2&gt;

&lt;p&gt;Hallucination is not a bug you patch. It is what a language model does by default when it has no grounding. The fix is architectural. A production system is built so the model can only speak from material you control, and so its claims are checkable.&lt;/p&gt;

&lt;p&gt;Here is the machinery a real build puts around the model.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Retrieval.&lt;/strong&gt; Your documents are indexed so that, for any question, the system pulls the exact passages that matter and puts them in front of the model as the source material. The model answers from those passages, not from memory. This is retrieval-augmented generation, and it is the difference between "the model thinks" and "the model read your file and reported what it said."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Citations.&lt;/strong&gt; Every claim links back to the specific source it came from: this document, this page, this line. If the system cannot find a source, it says so instead of guessing. On the &lt;a href="https://devaland.com/deal-os" rel="noopener noreferrer"&gt;Deal OS&lt;/a&gt; platform I built this on a single rule: cite the source or cut the claim. A sentence that cannot point to a document does not ship.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Human approval.&lt;/strong&gt; For anything that carries real consequence, the AI drafts and a person signs off. The system is built to make that review fast, by showing the evidence next to the claim, not to remove the human from the loop.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Evaluations.&lt;/strong&gt; Before it goes live and every time it changes, the system is tested against a set of known questions with known correct answers, so you can measure accuracy instead of hoping. Without evals you are shipping vibes. With them you have a number you can defend.&lt;/p&gt;

&lt;p&gt;The same pattern shows up in &lt;a href="https://devaland.com/voice-ai-demo" rel="noopener noreferrer"&gt;Amy&lt;/a&gt;, a grounded voice assistant I built for a Shopify brand. Amy answers product questions and quotes live prices, and she pulls those prices from the store's real catalog on a daily sync rather than inventing a number that sounds right. A wrong price on a live call is a refund and a lost customer. Grounding is not a nicety there. It is the product.&lt;/p&gt;

&lt;h2&gt;
  
  
  Build versus buy
&lt;/h2&gt;

&lt;p&gt;Buying is the right default. If a proven tool already does the job, buy it and move on. The honest question is not "could custom be better" but "is the gap between what you can buy and what you actually need wide enough to pay for."&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Situation&lt;/th&gt;
&lt;th&gt;Lean buy&lt;/th&gt;
&lt;th&gt;Lean build&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;The task is generic (draft emails, summarize public text)&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The AI must answer from your private documents and data&lt;/td&gt;
&lt;td&gt;Sometimes&lt;/td&gt;
&lt;td&gt;Usually&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A wrong answer has legal, financial, or regulatory cost&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;It must plug into your existing systems and workflow&lt;/td&gt;
&lt;td&gt;Rarely clean&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;You need to own the logic, the data path, and the audit trail&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;You are one of many identical customers of a SaaS tool&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A useful middle path exists and I use it often: build a thin custom layer on top of bought parts. You do not rebuild the language model or the database. You build the retrieval, the grounding rules, the approval flow, and the integration that make a general model behave correctly on your specific data. That is where most of the value sits, and it is far less work than people assume.&lt;/p&gt;

&lt;h2&gt;
  
  
  What a real custom AI build actually includes
&lt;/h2&gt;

&lt;p&gt;When I scope a build, it is not just a prompt. It is a system that has to be right on a Tuesday when no one is watching. A typical build includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Document ingestion: OCR and extraction that turn PDFs, scans, and mixed formats into clean, structured, searchable data.&lt;/li&gt;
&lt;li&gt;A retrieval layer over your content so answers are grounded in your material.&lt;/li&gt;
&lt;li&gt;Grounding and citation logic that ties every claim to a source and refuses when there is none.&lt;/li&gt;
&lt;li&gt;Human-in-the-loop review for anything consequential.&lt;/li&gt;
&lt;li&gt;An evaluation suite so accuracy is measured, not assumed.&lt;/li&gt;
&lt;li&gt;Integrations that snap onto the systems you already run, instead of forcing a new tool on your team.&lt;/li&gt;
&lt;li&gt;Guardrails: rate limits, cost caps, access control, and an audit trail.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That list is the same whether the surface is a chat box, a voice assistant, or a background job that reads a folder of contracts and flags the risky ones. The interface changes. The discipline underneath does not.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to de-risk the whole thing with a paid pilot
&lt;/h2&gt;

&lt;p&gt;The fear with custom software is spending real money on something that might not work. The answer is to not commit the full budget up front. Start with a paid proof pilot: one narrow, high-value slice of the problem, fixed scope, roughly one to two weeks, from $2,500, and the cost credits toward the full build if you proceed.&lt;/p&gt;

&lt;p&gt;A pilot answers the only questions that matter before a bigger spend. Does the retrieval actually find the right passages in your documents. Is the accuracy good enough on your real material, measured against known answers. Does it fit how your team already works. You see a working thing on your own data, not a slide deck, and then you decide.&lt;/p&gt;

&lt;p&gt;From there the shape is simple. A fixed-scope build typically runs $8,000 to $25,000 depending on surface area. If you would rather have an AI engineer embedded for ongoing work, that is fractional from $4,000 per month, or a day rate from $750. Intake is async and written. There are no sales calls.&lt;/p&gt;

&lt;p&gt;For a deeper look at the document side of this, see the guide on &lt;a href="https://devaland.com/blog/intelligent-document-processing-guide" rel="noopener noreferrer"&gt;Intelligent document processing&lt;/a&gt;. If you are weighing embedded help over a one-off project, &lt;a href="https://devaland.com/blog/hire-a-fractional-ai-engineer" rel="noopener noreferrer"&gt;Hire a fractional AI engineer&lt;/a&gt; walks through that model. And &lt;a href="https://devaland.com/deal-os" rel="noopener noreferrer"&gt;AI Deal OS&lt;/a&gt; is the platform where the cite-the-source rule runs in production every day.&lt;/p&gt;

&lt;h2&gt;
  
  
  The short version
&lt;/h2&gt;

&lt;p&gt;Generic AI is a fast first draft with no sense of what is true about your business. A custom build adds the parts that make it trustworthy: it reads your actual documents, cites its sources, asks a human before anything consequential, and is measured against known answers. If the AI cannot back a claim, it should cut the claim. Build that, prove it on a small paid pilot, then scale what worked.&lt;/p&gt;

&lt;p&gt;If you have a document-heavy or data-heavy workflow where a wrong answer costs real money, that is exactly the kind of problem this is built for. See &lt;a href="https://devaland.com/ai-development" rel="noopener noreferrer"&gt;Custom AI &amp;amp; Python development&lt;/a&gt; for how the builds are scoped, and start the async intake at &lt;a href="https://devaland.com/contact?service=ai-build" rel="noopener noreferrer"&gt;/contact?service=ai-build&lt;/a&gt;. No calls, no pitch, just a written back-and-forth about whether a build makes sense for you.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>machinelearning</category>
      <category>startup</category>
      <category>programming</category>
    </item>
    <item>
      <title>My AI Feature Was Dead for a Day. The Metric Said It Was Working.</title>
      <dc:creator>DEVALAND</dc:creator>
      <pubDate>Tue, 04 Aug 2026 14:15:43 +0000</pubDate>
      <link>https://dev.to/devaland/my-ai-feature-was-dead-for-a-day-the-metric-said-it-was-working-2p3p</link>
      <guid>https://dev.to/devaland/my-ai-feature-was-dead-for-a-day-the-metric-said-it-was-working-2p3p</guid>
      <description>&lt;p&gt;Yesterday my drone early-warning demonstrator recorded four AI-generated explanations. All four were discarded by the validation gate that sits in front of them.&lt;/p&gt;

&lt;p&gt;I looked at that number and felt good about it. A gate that rejects four out of four is a gate doing hard work. It is exactly the statistic I would put in a technical brief.&lt;/p&gt;

&lt;p&gt;It was wrong. Not the gate. My reading of it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the system does
&lt;/h2&gt;

&lt;p&gt;The demonstrator fuses signals from several sources and decides a threat level using deterministic rules. No model touches that decision. A local language model is then allowed to do one thing: rewrite the machine's reasoning into a sentence an operator can read at speed.&lt;/p&gt;

&lt;p&gt;Because a small local model is not reliably obedient, the sentence is checked before anyone sees it. It has to name the threat level the rules computed, and no other level. Anything else is thrown away and the deterministic wording stands. I tested that gate when I built it. Seven of twenty-five sentences were unfit for an operator display. After adding the gate, thirty out of thirty conformed.&lt;/p&gt;

&lt;p&gt;So when the production counter said zero of four survived, the story wrote itself. Sporadic escalations, a small model, a strict gate. Of course some get discarded.&lt;/p&gt;

&lt;h2&gt;
  
  
  The counter was measuring two different things
&lt;/h2&gt;

&lt;p&gt;The function that calls the model returns nothing when the gate rejects the text. It also returns nothing when the model does not answer at all. Timeout, connection refused, anything. Both cases came back as the same empty result, and I recorded both as "rejected by the gate."&lt;/p&gt;

&lt;p&gt;That is the whole bug, and it is not really a coding mistake. It is a naming mistake. I gave one counter to two different facts.&lt;/p&gt;

&lt;p&gt;One of those facts says the safety mechanism is working. The other says the feature is dead. They are opposites, and I had made them indistinguishable.&lt;/p&gt;

&lt;h2&gt;
  
  
  What was actually happening
&lt;/h2&gt;

&lt;p&gt;The model runs locally on the same machine, which is the point: an operational deployment sits on a network with no route to a commercial API. The runtime unloads an idle model from memory to free it up. Reloading two gigabytes on four CPU cores takes longer than the thirty second timeout I had set.&lt;/p&gt;

&lt;p&gt;Escalations are sporadic by design. The system is quiet most of the time. So nearly every escalation arrived to find the model cold, waited thirty seconds, gave up, and fell back to the deterministic wording.&lt;/p&gt;

&lt;p&gt;Warm, the same prompt answers in 7.8 seconds and passes the gate on the first try. I measured it directly against the running model, with the exact production prompt, after the diagnosis.&lt;/p&gt;

&lt;p&gt;The feature had not failed. It had never run.&lt;/p&gt;

&lt;h2&gt;
  
  
  The fix took ten minutes. Finding it took the audit trail
&lt;/h2&gt;

&lt;p&gt;Three changes. Ask the runtime to keep the model resident so a quiet hour does not guarantee the next escalation fails. Raise the timeout well past a cold load, since a slow answer costs nothing when the fallback is already correct. And split the counter into four: accepted, rejected by the gate, empty, never answered.&lt;/p&gt;

&lt;p&gt;That last one is the change that matters. The first two are configuration. The third is the difference between a number you can act on and a number that comforts you.&lt;/p&gt;

&lt;p&gt;I would not have found any of it without something I had built the same afternoon: durable history, so every assessment is written to disk with what the rules decided, what the model said, and whether its sentence survived. That storage layer existed for a completely different reason. It was built so a host site could eventually be handed a measured false alarm rate. Four hours after it went in, it told me the headline AI feature had been inert for a day.&lt;/p&gt;

&lt;h2&gt;
  
  
  The second thing it caught
&lt;/h2&gt;

&lt;p&gt;Once the model started answering again, one of its sentences read: "at HIGH confidence level justifies the HIGH threat level."&lt;/p&gt;

&lt;p&gt;The gate accepted it, correctly by its own rule, because it names the computed level and no other. But look at what the sentence asserts. The system computes a confidence per detector. It never computes an aggregate confidence about anything. That sentence states a measurement nothing in the system produced.&lt;/p&gt;

&lt;p&gt;The prompt already forbade it. The instruction is right there in the system message, and the model ignored it, which is the entire reason a gate exists instead of trust.&lt;/p&gt;

&lt;p&gt;So the gate now rejects that phrasing rather than tolerating it. One existing test asserted the old, permissive behavior. I flipped it deliberately and wrote down why, because a test that quietly changes meaning is worse than no test.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I would take from this
&lt;/h2&gt;

&lt;p&gt;If you run a model in production behind any kind of check, the useful question is not how often the check fires. It is whether you can tell the difference between the check firing and the model never answering.&lt;/p&gt;

&lt;p&gt;Those look identical from the outside. Both produce no output. Both leave your fallback in place. Both can be reported as a single tidy number that makes your safety mechanism look busy.&lt;/p&gt;

&lt;p&gt;Instrument the difference. A counter that merges a working safeguard with a dead dependency is worse than no counter, because it does not stay silent. It reassures you.&lt;/p&gt;

&lt;p&gt;The uncomfortable part is that my failure mode was the same one I write about: a confident output with nothing real behind it. It just happened to be a metric rather than a model.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;A note on what this system is, because it matters in this category. DroneWatch AI is a working concept demonstrator. The threat signals are simulated. The air traffic feed is live and real. It is not an operational system, it does not detect real drones, and no field validated performance is claimed. It is strictly defensive, detection and early warning only, with no interdiction or countermeasure function.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>observability</category>
      <category>programming</category>
    </item>
    <item>
      <title>Why a Scan Is Not a Document</title>
      <dc:creator>DEVALAND</dc:creator>
      <pubDate>Tue, 04 Aug 2026 03:31:52 +0000</pubDate>
      <link>https://dev.to/devaland/why-a-scan-is-not-a-document-4ifg</link>
      <guid>https://dev.to/devaland/why-a-scan-is-not-a-document-4ifg</guid>
      <description>&lt;p&gt;In the previous piece I argued that a PDF keeps where the glyphs sit and throws away what they meant. A scan is a harder case, because a scan does not even have glyphs. It has pixels. Everything else is reconstructed by software that is guessing, and the guessing is much better than it used to be, which is exactly what makes it dangerous.&lt;/p&gt;

&lt;p&gt;More than twenty years of setting scientific books taught me what a table actually is. It is not a picture of rows and columns. It is a grid of relationships: this number belongs to this row label and this column header, and it means nothing at all detached from either. Publishers rebuild tables by hand when they come in as images, and they do it because there is no honest shortcut.&lt;/p&gt;

&lt;p&gt;That is the whole argument of this post. OCR converts pixels into characters. It does not convert a page back into a document.&lt;/p&gt;

&lt;h2&gt;
  
  
  OCR errors are not random, and that is the problem
&lt;/h2&gt;

&lt;p&gt;If OCR failed noisily, this would be a solved problem. You would see garbage, you would know.&lt;/p&gt;

&lt;p&gt;It does not fail that way. It fails toward plausibility. A 6 becomes an 8. A 1 becomes a 7. A 5 becomes an S. A comma becomes a full stop, which in a European financial document turns 1.234 into 1,234 or the reverse. The engine is choosing the most likely character given the shape, and the most likely character is almost always a real one.&lt;/p&gt;

&lt;p&gt;In prose, this is survivable. You read a sentence with one wrong letter and your brain corrects it without stopping. That is why OCR feels so accurate: you are testing it on text where you are the error correction.&lt;/p&gt;

&lt;p&gt;In a table of figures there is no such redundancy. Every digit is load-bearing. Nothing in the surrounding context tells you that a margin should be 6.2 rather than 8.2. The wrong number is exactly as readable as the right one, carries the same confidence, and looks equally like a fact.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where scanned tables actually break
&lt;/h2&gt;

&lt;p&gt;Four failure modes, and I have seen all four in real documents.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Column drift.&lt;/strong&gt; A value lands one column to the left or right of where it belongs. Revenue for 2024 is now sitting under 2023. The total still adds up, because the same numbers are present, just attributed to the wrong period. Nothing looks wrong until someone builds a growth rate from it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tables that continue across pages.&lt;/strong&gt; In a printed book this is handled by repeating the header and adding a continuation rule. OCR sees two separate blobs on two separate pages, and unless something explicitly stitches them, half the table silently disappears or becomes its own orphan table with no headers at all.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Merged and spanning cells.&lt;/strong&gt; A header that spans three columns, or a row label that covers two rows, is a relationship expressed purely through geometry. Flatten it and the relationship is gone. The value that belonged to all three sub-columns now belongs to one of them, or to none.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Rule lines read as characters.&lt;/strong&gt; A thin vertical rule becomes a 1 or a pipe. A horizontal rule becomes a row of dashes or underscores that the parser treats as content. This one is easy to spot when you look and impossible to spot when you do not.&lt;/p&gt;

&lt;h2&gt;
  
  
  The confidence score will not save you
&lt;/h2&gt;

&lt;p&gt;Most OCR engines return a confidence value, and it is tempting to gate on it. Below some threshold, flag; above it, trust.&lt;/p&gt;

&lt;p&gt;It does not work, for the same reason it does not work in retrieval. The confidence is per-character and it measures how sure the engine is about the shape it saw, not whether the resulting document makes sense. A crisp, clean, high-confidence 8 that was actually a 6 scores beautifully. A slightly smudged but correctly read digit scores worse. The score is orthogonal to the thing you care about.&lt;/p&gt;

&lt;p&gt;I measured a version of this problem in a different context and published the result: retrieval similarity scores could not separate answerable questions from unanswerable ones, because the two populations overlapped. The lesson is the same here. &lt;strong&gt;Anything computed before you have the answer cannot tell you whether the answer is right.&lt;/strong&gt; The check has to happen afterwards, against the source.&lt;/p&gt;

&lt;h2&gt;
  
  
  What to do instead
&lt;/h2&gt;

&lt;p&gt;The habit is the same one that governs everything else I build. Treat the scan as &lt;strong&gt;evidence of&lt;/strong&gt; a document, not as the document.&lt;/p&gt;

&lt;p&gt;Keep the page image, always. If a figure is ever questioned, the answer is not a log line, it is the picture of the page it came from. This is the scanned-document version of a citation.&lt;/p&gt;

&lt;p&gt;Rebuild tables as tables, and keep them that way through the entire pipeline. A table flattened into prose has lost the row-to-column relationship, which was the only reason the table existed.&lt;/p&gt;

&lt;p&gt;Require every number to be findable in the source. Not paraphrased, not approximately present. Findable. If it cannot be located verbatim on the page it claims to come from, it does not get repeated.&lt;/p&gt;

&lt;p&gt;Say the input was a scan. Put it in the output where the reader sees it, not in a log nobody opens. A brief built from clean born-digital PDFs and a brief built from a photocopied fax deserve different levels of trust, and the reader is entitled to know which one they are holding.&lt;/p&gt;

&lt;p&gt;Never repair a number quietly. If something looks wrong, flag it and show the source. Correcting it invisibly means the next person inherits your guess as a fact.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this matters outside publishing
&lt;/h2&gt;

&lt;p&gt;Publishers already know all of this. They budget for it, they employ people who rebuild tables by hand, and they treat a scanned manuscript as a cost rather than a convenience.&lt;/p&gt;

&lt;p&gt;The people who get hurt are the ones who assume a PDF is a PDF. An acquirer reading management accounts that were scanned from a printout. A lender working from a photographed set of statements. Anyone whose most important number arrived as an image of a number.&lt;/p&gt;

&lt;p&gt;The document you were sent and the document your software read are not always the same document. With a born-digital file, the gap is small. With a scan, it can be a decision made on a digit that was never there.&lt;/p&gt;

&lt;p&gt;Cite the source or cut the claim. And when the source was a photograph of a page, say so out loud.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>ocr</category>
      <category>machinelearning</category>
      <category>datascience</category>
    </item>
    <item>
      <title>What 70 Scientific Books Taught Me About Why AI Misreads a PDF</title>
      <dc:creator>DEVALAND</dc:creator>
      <pubDate>Tue, 04 Aug 2026 03:31:47 +0000</pubDate>
      <link>https://dev.to/devaland/what-70-scientific-books-taught-me-about-why-ai-misreads-a-pdf-37fa</link>
      <guid>https://dev.to/devaland/what-70-scientific-books-taught-me-about-why-ai-misreads-a-pdf-37fa</guid>
      <description>&lt;p&gt;My name is printed in the front matter of more than seventy scientific volumes, and I have spent more than twenty years turning manuscripts into typeset pages. I now build AI systems that read documents for a living. Those two facts sound unrelated. They are the same problem seen from opposite ends, and the first one explains most of what goes wrong in the second.&lt;/p&gt;

&lt;p&gt;Here is the short version. A document that has been typeset is not a bag of words. It is a structure, and almost all of that structure is thrown away the moment it becomes a PDF. When an AI reads that PDF, it is not reading the document. It is reading the shadow the document left on a page.&lt;/p&gt;

&lt;h2&gt;
  
  
  What a typesetter actually does
&lt;/h2&gt;

&lt;p&gt;Setting a scientific book is not decoration. It is the act of encoding meaning into position.&lt;/p&gt;

&lt;p&gt;A running head tells you which chapter you are in without reading a word. A float, a table or figure that moves to wherever it fits, carries a caption precisely because it has been separated from the paragraph that referred to it. Front matter is a defined sequence: half title, title, copyright, dedication, contents, preface. A displayed equation is numbered because something later will point back at it. A footnote sits at the bottom of a page and a citation sits in a bibliography, and those are different objects doing different jobs.&lt;/p&gt;

&lt;p&gt;None of that is styling. Every one of those decisions is semantic. The compositor's craft is knowing that a two-line gap and a smaller point size mean &lt;em&gt;this is an aside, not the argument&lt;/em&gt;, and that a reader will absorb that without ever being told.&lt;/p&gt;

&lt;p&gt;In LaTeX, the source knows all of this explicitly. There is a &lt;code&gt;\chapter&lt;/code&gt;, a &lt;code&gt;\caption&lt;/code&gt;, a &lt;code&gt;\label&lt;/code&gt;, a &lt;code&gt;\cite&lt;/code&gt;. The structure is not implied by how it looks. The structure is written down, and the appearance is derived from it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the PDF keeps
&lt;/h2&gt;

&lt;p&gt;The PDF keeps the appearance and discards the source.&lt;/p&gt;

&lt;p&gt;A PDF is a set of instructions for placing glyphs at coordinates. Put this character at this x and y, in this font, at this size. That is essentially all it is. The fact that a particular run of glyphs was a chapter title, and another was a caption, and a third was a footnote, is not recorded anywhere. It is inferable by a human because humans read layout fluently. It is not stated.&lt;/p&gt;

&lt;p&gt;So when a system ingests that PDF, it has to reconstruct, by guesswork, everything the compositor originally knew for certain. Is this larger text a heading or an emphasised sentence? Does this two-column page read left column then right, or across? Is this number a footnote marker or an exponent? Does this table have a header row, or is the first row just bold?&lt;/p&gt;

&lt;p&gt;Every one of those guesses is a place where a document quietly becomes a different document.&lt;/p&gt;

&lt;h2&gt;
  
  
  The failures I see, and why they are structural
&lt;/h2&gt;

&lt;p&gt;Three show up constantly, and none of them is a model problem.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Reading order.&lt;/strong&gt; Two-column layouts are the classic. Extraction that follows the coordinate stream rather than the column flow will interleave the two columns line by line. The output is grammatical, fluent nonsense. Nothing errors. The text is all there. It is simply in an order that never existed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Orphaned captions and floats.&lt;/strong&gt; Because a float moves, a table can be printed pages away from the sentence that discusses it. Flatten that and the table arrives with no context, or worse, glued to whatever paragraph happened to be adjacent on the page. A figure that supports one claim gets silently attached to another.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Footnotes folded into the body.&lt;/strong&gt; A footnote is a qualification, very often the exact qualification that limits the claim above it. Merge it into the running text and you get a sentence that asserts something the author deliberately hedged.&lt;/p&gt;

&lt;p&gt;I want to be precise about the point. These are not hallucinations. The model is faithfully reporting what it was given. It was given a scrambled document.&lt;/p&gt;

&lt;h2&gt;
  
  
  Scans are a different problem again
&lt;/h2&gt;

&lt;p&gt;Everything above assumes a born-digital PDF, where the glyphs are real characters. A scan is worse, because there are no characters at all, only pixels, and OCR has to invent the text before anything can read it.&lt;/p&gt;

&lt;p&gt;OCR is very good now. It is not good at deciding that this block is a table and this one is a paragraph, and it has no idea that page 14 is a continuation of the table on page 13. In practice, tables are where scanned documents do the most damage, because a number lifted out of a misread table looks exactly as authoritative as a number lifted out of a correct one.&lt;/p&gt;

&lt;p&gt;This is why "just OCR it" is not a plan. OCR converts pixels to characters. It does not convert a page back into a document.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I do about it
&lt;/h2&gt;

&lt;p&gt;The habit that came out of typesetting, and that I now build into software, is this: &lt;strong&gt;treat structure as evidence, and treat its absence as a fact worth recording.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Concretely, in the systems I build for reading commercial and financial documents:&lt;/p&gt;

&lt;p&gt;Reconstruct reading order deliberately rather than trusting the coordinate stream. Column detection first, then flow.&lt;/p&gt;

&lt;p&gt;Keep tables as tables through the whole pipeline. A table flattened into prose has lost the relationship between a row label and its value, and that relationship is usually the entire point of the table.&lt;/p&gt;

&lt;p&gt;Carry the location with the content. Every extracted claim keeps the page it came from, so a reader can go and look. This is the same discipline as a citation in a bibliography, and it exists for the same reason.&lt;/p&gt;

&lt;p&gt;Cut what cannot be traced. If a figure cannot be tied back to a specific place in a source document, it does not get repeated. It gets flagged. A missing number is an inconvenience. A confident wrong number is a decision made on fiction.&lt;/p&gt;

&lt;p&gt;Say when the input was poor. If a document arrived as a low-quality scan, that belongs in the output, not buried in a log. The reader is entitled to know how much to trust what they are looking at.&lt;/p&gt;

&lt;h2&gt;
  
  
  The part that transfers
&lt;/h2&gt;

&lt;p&gt;Typesetting taught me that most of what a document means is carried by how it is arranged, and that this arrangement is invisible until you try to reproduce it mechanically. More than twenty years of putting structure &lt;em&gt;into&lt;/em&gt; pages turns out to be unusually good preparation for the problem of getting structure back &lt;em&gt;out&lt;/em&gt; of them.&lt;/p&gt;

&lt;p&gt;The people who feel this most sharply are not publishers. They are anyone who has to make a decision from a hundred-page document that arrived as a PDF: an acquirer reading a data room, a lender reading management accounts, an analyst reading a filing. The document they were sent and the document their software read are not always the same document, and nothing in the process tells them so.&lt;/p&gt;

&lt;p&gt;That gap is the whole reason I build the way I do. Cite the source or cut the claim, and when the source itself was damaged in transit, say that out loud.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>pdf</category>
      <category>machinelearning</category>
      <category>programming</category>
    </item>
    <item>
      <title>Intelligent Document Processing: A Practical Guide</title>
      <dc:creator>DEVALAND</dc:creator>
      <pubDate>Mon, 03 Aug 2026 14:00:06 +0000</pubDate>
      <link>https://dev.to/devaland/intelligent-document-processing-a-practical-guide-d4e</link>
      <guid>https://dev.to/devaland/intelligent-document-processing-a-practical-guide-d4e</guid>
      <description>&lt;p&gt;Intelligent document processing (IDP) is the practice of turning messy documents (PDFs, scans, emails, spreadsheets) into structured, validated data that flows into your systems without a human retyping it. In 2026 the useful version pairs classic OCR with language models for extraction and reasoning, then wraps both in validation and human review so the output is trustworthy. This guide covers the real pipeline, where LLMs earn their keep, where they hallucinate, and how to start small on one document type.&lt;/p&gt;

&lt;h2&gt;
  
  
  What IDP actually is now (beyond old OCR)
&lt;/h2&gt;

&lt;p&gt;Old OCR answered one question: what characters are on this page. That was useful and still is, but it left you with a wall of text and a person to read it. IDP answers the harder question: what does this document mean, and which specific fields do I need out of it.&lt;/p&gt;

&lt;p&gt;The shift is that extraction is no longer just pattern matching on fixed templates. A modern pipeline can read an invoice it has never seen before, a lab report in an unfamiliar layout, or a 120 page information memorandum, and pull the fields you asked for. That flexibility is what makes IDP worth doing. It is also what makes it dangerous if you skip validation, because a system that can read anything can also confidently invent things.&lt;/p&gt;

&lt;h2&gt;
  
  
  The real pipeline, stage by stage
&lt;/h2&gt;

&lt;p&gt;A working IDP system is not one model. It is a short assembly line, and most of the reliability lives in the boring stages, not the clever one.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ingest any format.&lt;/strong&gt; Documents arrive as native PDFs, scanned images, photos from a phone, email attachments, Excel files, and the occasional Word doc. Stage one normalizes all of it and detects the document type so the right rules apply downstream.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;OCR and layout.&lt;/strong&gt; Scanned and image based pages go through OCR that preserves layout: tables, columns, headers, and where each value sits on the page. Position matters, because knowing that a number lived in the total row of a table is what lets you trust it later.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Extract structured fields.&lt;/strong&gt; This is where a language model shines. You define the exact fields you want (invoice number, net amount, counterparty, effective date) and the model returns them as structured data, even across layouts it has never seen.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Validate.&lt;/strong&gt; Every extracted value gets checked against rules: types, ranges, cross totals that must add up, dates that must be plausible, references that must exist. Anything that fails validation is flagged, not silently passed on.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Route into systems.&lt;/strong&gt; Clean, validated records go where they belong: your accounting tool, your database, a CRM, a review queue. Low confidence or failed items go to a human instead of into your books.&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;Job&lt;/th&gt;
&lt;th&gt;Main risk if skipped&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Ingest&lt;/td&gt;
&lt;td&gt;Normalize formats, detect type&lt;/td&gt;
&lt;td&gt;Wrong rules applied to wrong doc&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OCR and layout&lt;/td&gt;
&lt;td&gt;Read text, keep structure&lt;/td&gt;
&lt;td&gt;Values read out of context&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Extract&lt;/td&gt;
&lt;td&gt;Pull the fields you defined&lt;/td&gt;
&lt;td&gt;Missing or malformed data&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Validate&lt;/td&gt;
&lt;td&gt;Catch impossible values&lt;/td&gt;
&lt;td&gt;Silent errors reach systems&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Route&lt;/td&gt;
&lt;td&gt;Send clean data onward, flag the rest&lt;/td&gt;
&lt;td&gt;No accountability, no audit trail&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Where LLMs help, and where they hallucinate
&lt;/h2&gt;

&lt;p&gt;Language models are very good at reading unfamiliar layouts, handling synonyms (net, subtotal, amount due), summarizing dense sections, and answering questions about a document. For extraction across varied formats, they remove months of brittle template work.&lt;/p&gt;

&lt;p&gt;They are bad at three things that matter here. They fill gaps: when a field is missing, a model would rather guess a plausible value than say it is absent. They misattribute: they can pull the right number from the wrong row or the wrong entity. And they drift on arithmetic: totals and derived figures are not safe just because they look right.&lt;/p&gt;

&lt;p&gt;The fix is not a better prompt. It is architecture. The rule I build to is simple: cite the source or cut the claim. Every extracted value should carry a pointer back to where it came from (page, table, coordinates), and anything the system cannot ground gets marked unknown rather than invented. That single discipline is the difference between a demo and something you can put near real money.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why citation and human review are non-negotiable for regulated work
&lt;/h2&gt;

&lt;p&gt;If you process financial statements, contracts, clinical or diagnostic documents, or anything a regulator or an auditor might question, you need to answer one question at any time: where did this number come from. A summary cannot answer that. A cited value can, because it points back to the exact line on the exact page.&lt;/p&gt;

&lt;p&gt;Human in the loop is not a failure of automation, it is the design. The goal is to automate the 80 percent that is clean and route the ambiguous 20 percent to a person with the source shown next to the extracted value, so a review takes seconds instead of a full manual re-read. You get most of the speed and keep all of the accountability. This is exactly the muscle behind &lt;a href="https://devaland.com/deal-os" rel="noopener noreferrer"&gt;Deal OS&lt;/a&gt;, which ingests 100 page CIMs, runs OCR and extraction, and returns cited findings under a verify-not-summarize rule so a buyer can trust what they read.&lt;/p&gt;

&lt;h2&gt;
  
  
  Build versus off-the-shelf IDP tools
&lt;/h2&gt;

&lt;p&gt;Off-the-shelf IDP platforms are a reasonable starting point when your documents are high volume and standard (think generic invoices or receipts) and you are happy to live inside their templates, their data model, and their per-page pricing.&lt;/p&gt;

&lt;p&gt;A bespoke build wins when your documents are non-standard, when the fields you care about are specific to your business, when the data has to land inside systems you already run, or when confidentiality means you cannot ship sensitive files to a third party. Roll-ups, multi-entity groups, diagnostics companies, and M&amp;amp;A acquirers usually fall on the build side because their documents and their downstream systems are theirs alone.&lt;/p&gt;

&lt;p&gt;A short, honest test: if a generic tool covers 90 percent of your case, buy it. If the last 10 percent is where all your risk and cost live, that 10 percent is the whole point, and it needs a build.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to start: one document type, one scoped pilot
&lt;/h2&gt;

&lt;p&gt;Do not try to process everything. Pick the single document type that costs you the most time or the most risk today: one invoice format, one contract type, one report. Define the exact fields you need out of it and what a validated record looks like. Then build the full pipeline for that one type, with citation and a review queue from day one.&lt;/p&gt;

&lt;p&gt;That scoped pilot tells you the true accuracy on your real documents, your genuine exception rate, and the actual time saved, before you spend on a wide rollout. Once one type works end to end, adding the next is mostly configuration, not a new project.&lt;/p&gt;

&lt;p&gt;This is how I work with founder-operators: a paid proof pilot from $2,500 over one to two weeks (credited to the full build), fixed-scope builds from $8,000 to $25,000, or fractional from $4,000 per month. Async intake, no calls.&lt;/p&gt;

&lt;p&gt;If you run an ops-heavy business drowning in documents, see &lt;a href="https://devaland.com/ai-development" rel="noopener noreferrer"&gt;Custom AI &amp;amp; Python development&lt;/a&gt; for how these builds are scoped, read more on &lt;a href="https://devaland.com/blog/custom-ai-development-for-founders" rel="noopener noreferrer"&gt;custom AI development for founders&lt;/a&gt; and &lt;a href="https://devaland.com/blog/ai-automation-for-multi-entity-founders" rel="noopener noreferrer"&gt;AI automation for multi-entity founders&lt;/a&gt;, or look at &lt;a href="https://devaland.com/deal-os" rel="noopener noreferrer"&gt;AI Deal OS&lt;/a&gt; to see cited document intelligence in production. When you are ready, send the details through the async intake at /contact?service=ai-build and we can scope a pilot on your hardest document type.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>machinelearning</category>
      <category>python</category>
      <category>automation</category>
    </item>
    <item>
      <title>A Driver's License Question Beat Every Real One: Why Retrieval Scores Cannot Gate a RAG System</title>
      <dc:creator>DEVALAND</dc:creator>
      <pubDate>Thu, 30 Jul 2026 14:00:06 +0000</pubDate>
      <link>https://dev.to/devaland/a-drivers-license-question-beat-every-real-one-why-retrieval-scores-cannot-gate-a-rag-system-3k95</link>
      <guid>https://dev.to/devaland/a-drivers-license-question-beat-every-real-one-why-retrieval-scores-cannot-gate-a-rag-system-3k95</guid>
      <description>&lt;p&gt;Most retrieval-augmented generation systems carry a comfortable assumption. If the retrieval score is high, the retrieved context is probably relevant and the answer is probably grounded. If the score is low, the system is out of its depth and should refuse. Set a threshold somewhere sensible, and you have a safety mechanism.&lt;/p&gt;

&lt;p&gt;I built a small Romanian question-answering system, measured that assumption, and it did not survive contact with the data.&lt;/p&gt;

&lt;p&gt;This piece is the measurement, the reason it breaks the standard design, and what I ended up gating on instead. The code is public and the result is reproducible in about a minute on a laptop: &lt;a href="https://github.com/MariusGithub13/ro-cited-answers" rel="noopener noreferrer"&gt;ro-cited-answers on GitHub&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the system is
&lt;/h2&gt;

&lt;p&gt;A question-answering demo over five documents on Romanian customs and EORI registration procedure, drawn from public information published by Poșta Română and the Romanian Customs Authority.&lt;/p&gt;

&lt;p&gt;Everything runs locally. An open-weight 2B model on Ollama, an embedding model for retrieval, on a four-core VPS in the EU. No external API, no key, no data leaving the machine. The design rule is that an answer which cannot be traced to a source document is refused before anyone reads it.&lt;/p&gt;

&lt;p&gt;I did not build it as a product. I built it because a parcel of mine was genuinely stuck in customs at BSI București, and the questions in the test suite are the ones a real person actually needed answered.&lt;/p&gt;

&lt;h2&gt;
  
  
  The measurement
&lt;/h2&gt;

&lt;p&gt;The script scores seven legitimate questions and seven impostors against the corpus. Legitimate questions are about customs, EORI numbers, parcel returns. Impostors are about things the corpus knows nothing about.&lt;/p&gt;

&lt;p&gt;If a retrieval score is a usable safety signal, the two populations should separate cleanly. Every real question should score above every impostor, and the gap between them is where you put the threshold.&lt;/p&gt;

&lt;p&gt;They do not separate. They overlap.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Question&lt;/th&gt;
&lt;th&gt;Score&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Lowest legitimate&lt;/td&gt;
&lt;td&gt;"Cand am nevoie de cod EORI pentru un colet?"&lt;/td&gt;
&lt;td&gt;0.697&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Highest impostor&lt;/td&gt;
&lt;td&gt;"Ce documente imi trebuie pentru un permis de conducere?"&lt;/td&gt;
&lt;td&gt;0.773&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Separation margin&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;-0.076&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A question about driver's license paperwork scored higher against a Romanian customs corpus than every genuine customs question did.&lt;/p&gt;

&lt;p&gt;The margin is negative. That is the whole finding. It is not that the threshold was badly tuned, or that a bit more calibration would fix it. When the populations overlap, there is no value you can pick that admits every real question and rejects every impostor. One threshold is too strict and loses real answers. Any looser one lets the driver's license question through.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this breaks the common design
&lt;/h2&gt;

&lt;p&gt;A lot of RAG systems treat the retrieval score as the guardrail. Retrieve, check the similarity, and if it clears the bar, hand the context to the model and trust that grounding follows.&lt;/p&gt;

&lt;p&gt;If the score cannot distinguish a question your corpus can answer from one it cannot, then that guardrail is decorative. It will fire on some things and feel like it is working, which is worse than not having it, because it produces confidence without producing safety.&lt;/p&gt;

&lt;p&gt;Note what the impostor question does. It is in the same language, the same register, the same bureaucratic domain of official documents and required paperwork. Embeddings capture that similarity faithfully. They are doing their job. Asking a similarity score to also tell you whether a specific fact is present in a specific document is asking it a question it was never designed to answer.&lt;/p&gt;

&lt;p&gt;So in this system the retrieval gate is deliberately not load-bearing. Its threshold is set from the measurement above, it catches the obviously unrelated case, and nothing important rests on it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What to gate on instead: the answer, not the confidence
&lt;/h2&gt;

&lt;p&gt;If you cannot trust a score computed before the answer exists, check the answer itself after it exists.&lt;/p&gt;

&lt;p&gt;Four gates run in sequence, and an answer must clear all of them or it is refused, with the refusal logged.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Gate A, retrieval.&lt;/strong&gt; The best-matching document must clear a similarity threshold. Deliberately weak, for the reason above.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Gate B, citation.&lt;/strong&gt; Every source the model points at must resolve to a document that was actually retrieved. Catches invented citations.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Gate C, numbers.&lt;/strong&gt; Every number in the answer must appear verbatim in a cited source. Numbers are where a hallucination does financial damage, and they are cheap to check exactly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Gate D, grounding.&lt;/strong&gt; Every substantive sentence must be attributable to one cited document, and the printed source list is rebuilt from the documents that actually carried a sentence.&lt;/p&gt;

&lt;p&gt;Gate D is the load-bearing one, and the reason is worth stating plainly.&lt;/p&gt;

&lt;p&gt;Gates that depend on the model cooperating with an instruction are brittle. You can tell a model to cite its sources in a particular format, and a large model will usually comply, and a 2B model frequently will not. Gate D does not ask the model for anything. It takes the answer as a finished artifact and checks it against the source text. It works the same whether the model cooperated, ignored the instruction, or never understood it.&lt;/p&gt;

&lt;p&gt;That is the transferable idea here, and it is the same rule I run in production diligence work: &lt;a href="https://devaland.com/blog/how-to-use-claude-for-due-diligence" rel="noopener noreferrer"&gt;cite the source or cut the claim&lt;/a&gt;. Check the output against the evidence, not the model against its instructions.&lt;/p&gt;

&lt;h2&gt;
  
  
  The same model, twice, minutes apart
&lt;/h2&gt;

&lt;p&gt;Here is what the gates are actually for.&lt;/p&gt;

&lt;p&gt;Ungrounded, asked what EORI means, the model answered that it is a "European Union Chamber of Commerce and Industry Number."&lt;/p&gt;

&lt;p&gt;That is invented. EORI is not a chamber of commerce number. The answer is fluent, plausible, correctly shaped, and wrong, which is the exact failure mode that costs money in regulated work.&lt;/p&gt;

&lt;p&gt;Grounded through the four gates, same weights, same machine, minutes later, it answered that EORI stands for Economic Operators Registration and Identification, that the number is assigned free of charge, and that the average processing time is 5 days with a maximum of 30. Then it printed the source document and the date that source was last checked.&lt;/p&gt;

&lt;p&gt;Same model. Same hardware. The gates decided everything.&lt;/p&gt;

&lt;p&gt;This is also why I am unconvinced by the framing that sovereign AI, by itself, gets you trustworthy AI. There is a serious argument in Europe about open weights, national compute, and models governed under national law, and it is worth winning. But sovereignty decides where the weights sit. It decides nothing about whether a particular answer is true. A model can be entirely sovereign and confidently wrong at the same time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three things that cost real time
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;A small model will not echo a string source id.&lt;/strong&gt; Asked to cite a document by its identifier, the model answered the question correctly and signed it "SURSE: 1, 2." A gate demanding string ids threw away two correct answers. The fix was to number the fragments and map the number back to the real document in code, where it cannot be got wrong. If a gate can be enforced in code instead of in a prompt, enforce it in code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Once citing is cheap, models pad their citations.&lt;/strong&gt; With numbered fragments, the model answered a parcel-return question correctly from the right document, then also cited an unrelated one. The answer was trustworthy and the citation list was noise, which is precisely backwards for a system whose entire value proposition is traceability. Citations are no longer taken on the model's word. Each sentence is attributed to its best-matching cited document, the printed list is rebuilt from what actually carried a sentence, and padding is stripped and logged.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Morphology is not ungroundedness.&lt;/strong&gt; Romanian inflects heavily. Exact word matching scored a verbatim quote at exactly 0.5000 against a 0.50 threshold, which passed only because the comparison was written as less-than rather than less-than-or-equal. That is not a safety margin, that is luck. Prefix matching on content words lifted the same quote to 0.83, while a genuinely ungrounded sentence still scored 0.00.&lt;/p&gt;

&lt;p&gt;Every decision, accepted or refused, is appended to an audit log with the retrieval scores, the gate that fired, and the per-sentence attribution. A refusal you cannot reconstruct afterward is just a different kind of unverifiable output.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this does not do
&lt;/h2&gt;

&lt;p&gt;I would rather state the limits than have you find them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It is slow.&lt;/strong&gt; CPU-only inference on four shared cores runs at roughly 2 tokens per second. Fine for a demonstration, not fine for production traffic.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The grounding is lexical, not semantic.&lt;/strong&gt; Gate D compares content words by a fixed-length prefix, so it forgives Romanian inflection but not synonymy. A correct paraphrase sharing little vocabulary with its source would be refused. The system fails toward refusing, which is the right direction, but it is a real limitation and not a subtle one.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The corpus is five documents.&lt;/strong&gt; The overlap finding in particular should be re-measured on a larger corpus before anyone treats it as a general result. I am reporting what I measured, not a law of nature.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A refusal is not an answer.&lt;/strong&gt; Refusing well is the point, but a system that refuses everything is also useless. Of the four test cases, two must be refused and two must be answered, precisely to hold both sides honest.&lt;/p&gt;

&lt;p&gt;None of this is legal advice, and the corpus is a demonstration fixture.&lt;/p&gt;

&lt;h2&gt;
  
  
  The part worth taking away
&lt;/h2&gt;

&lt;p&gt;If you are building anything that answers questions from documents and the stakes are higher than trivia, the question to ask about your own system is simple. When it refuses, what is it actually checking?&lt;/p&gt;

&lt;p&gt;If the answer is a retrieval score, go measure whether your in-corpus and out-of-corpus questions actually separate. Score a handful of real questions and a handful of plausible impostors from an adjacent domain and look at the two populations. It takes an afternoon. You may find, as I did, that the number you have been trusting cannot tell the two apart.&lt;/p&gt;

&lt;p&gt;Then move the check to where it can be enforced: the finished answer, against the source text, in code.&lt;/p&gt;

&lt;p&gt;That is the same discipline behind the diligence work we do, where a figure in a hundred-page deal document either traces to something real or it gets flagged rather than repeated. If you want to see it applied to acquisition documents instead of customs procedure, there is a &lt;a href="https://os.devaland.com/sample-brief" rel="noopener noreferrer"&gt;cited sample brief&lt;/a&gt; with every claim tied to its source, no login required.&lt;/p&gt;

&lt;p&gt;The repository is MIT licensed and the measurement script is the first thing worth running: &lt;a href="https://github.com/MariusGithub13/ro-cited-answers" rel="noopener noreferrer"&gt;github.com/MariusGithub13/ro-cited-answers&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>rag</category>
      <category>llm</category>
      <category>machinelearning</category>
    </item>
    <item>
      <title>AI on the Data, Human on the Judgment: Where AI Belongs in Diligence</title>
      <dc:creator>DEVALAND</dc:creator>
      <pubDate>Mon, 27 Jul 2026 14:00:05 +0000</pubDate>
      <link>https://dev.to/devaland/ai-on-the-data-human-on-the-judgment-where-ai-belongs-in-diligence-1af1</link>
      <guid>https://dev.to/devaland/ai-on-the-data-human-on-the-judgment-where-ai-belongs-in-diligence-1af1</guid>
      <description>&lt;p&gt;There is a simple test for whether AI belongs in your diligence process: does it do the reading, or does it do the deciding? Get that line right and AI is the best analyst you have ever had. Get it wrong and it is a confident intern who never says "I am not sure."&lt;/p&gt;

&lt;p&gt;The right division of labour is old, it just has new tools. AI on the data. Human on the judgment.&lt;/p&gt;

&lt;h2&gt;
  
  
  What "AI on the data" actually means
&lt;/h2&gt;

&lt;p&gt;The data work in diligence is enormous and mechanical: read a hundred-page CIM, pull every figure, find the customer schedule, match the number in the narrative to the number in the appendix, flag where they disagree, and trace each claim to the page it came from. This is exactly what machines are good at and humans are slow at. Done well, it turns a week of reading into an afternoon of reviewing, and it does not get tired on page 80.&lt;/p&gt;

&lt;p&gt;The key constraint is citation. AI earns its place on the data only if every figure it reports is tied to a source line, and anything it cannot trace is dropped or flagged rather than filled in. The moment a model is allowed to invent a missing number, it stops being an analyst and becomes a liability, because a plausible wrong number reads exactly like a right one.&lt;/p&gt;

&lt;h2&gt;
  
  
  What must stay human
&lt;/h2&gt;

&lt;p&gt;Judgment is the part that does not automate. Is this customer concentration a dealbreaker or a discount? Is this owner genuinely replaceable? Does this earn-out protect me or just delay the problem? Do I trust this seller? These are decisions shaped by experience, risk appetite, and things that are not in the data room at all. AI can lay the evidence in front of you, cited and reconciled. It cannot decide what the evidence means for your deal, and it should not try.&lt;/p&gt;

&lt;p&gt;The failure mode is treating an AI summary as a conclusion. A clean paragraph feels like an answer. It is not. It is a starting point that still has to be checked and judged.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where the line pays off
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Job&lt;/th&gt;
&lt;th&gt;Owner&lt;/th&gt;
&lt;th&gt;Why&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Read the data room, extract figures&lt;/td&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;Volume and speed, no fatigue&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reconcile narrative vs schedule vs contract&lt;/td&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;Mechanical cross-checking&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Trace every claim to its source line&lt;/td&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;Verifiable, not trusted&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Decide what changes the price&lt;/td&gt;
&lt;td&gt;Human&lt;/td&gt;
&lt;td&gt;Judgment, risk appetite&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Decide whether to walk&lt;/td&gt;
&lt;td&gt;Human&lt;/td&gt;
&lt;td&gt;Experience and context&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  How Deal OS draws the line
&lt;/h2&gt;

&lt;p&gt;Deal OS is built on exactly this split. It reads the data room and produces a brief where every claim traces to its source page, and any figure it cannot verify is discarded rather than guessed. It flags contradictions with both sides cited. What it deliberately does not do is tell you whether to buy. It hands you cited evidence and reconciled numbers so your judgment is spent on the decision, not on the reading. See it on a synthetic deal in the &lt;a href="https://os.devaland.com/sample-brief" rel="noopener noreferrer"&gt;sample brief&lt;/a&gt;, or run one of your own CIMs through it for a one-time $99 with the &lt;a href="https://os.devaland.com/cim-pass" rel="noopener noreferrer"&gt;CIM Pass&lt;/a&gt;, credited to your first month if you continue.&lt;/p&gt;

&lt;h2&gt;
  
  
  Frequently asked questions
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Can I trust an AI summary of a CIM?&lt;/strong&gt; Not as a conclusion. Use it as a map: require a source quote for every figure that matters, and treat anything unsourced as a question rather than a fact.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What should AI never do in diligence?&lt;/strong&gt; It should never fill a gap with an estimate, and it should never make the buy-or-walk decision. Its job is to surface and cite evidence, not to judge.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does AI replace a quality-of-earnings provider?&lt;/strong&gt; No. It accelerates the reading and cross-checking, but the judgment calls on normalisation, risk and price stay human.&lt;/p&gt;

&lt;p&gt;See what a cited, contradiction-flagging brief looks like on a sample deal at &lt;a href="https://devaland.com/deal-os" rel="noopener noreferrer"&gt;Deal OS&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>machinelearning</category>
      <category>automation</category>
    </item>
    <item>
      <title>The Verification Gap: Why Translated Summaries Misprice Cross-Border European Deals</title>
      <dc:creator>DEVALAND</dc:creator>
      <pubDate>Thu, 23 Jul 2026 14:00:06 +0000</pubDate>
      <link>https://dev.to/devaland/the-verification-gap-why-translated-summaries-misprice-cross-border-european-deals-368g</link>
      <guid>https://dev.to/devaland/the-verification-gap-why-translated-summaries-misprice-cross-border-european-deals-368g</guid>
      <description>&lt;p&gt;In a cross-border deal, the risk is not that a number was translated. It is that nobody checked the translation against the original. A German footnote becomes a clean English sentence, an Italian working-capital note becomes a tidy summary, and the version that ends up pricing the deal is the one furthest from the source. The gap between the original document and the summary is where seven-figure mistakes live, and it is exactly the gap a busy buyer is least able to police.&lt;/p&gt;

&lt;p&gt;Most cross-border buyers solve the easy half of this problem and skip the hard half. They get the documents translated, read the summary, and feel informed. The value is in the second step almost nobody takes: verifying the handful of numbers the decision rests on against the original-language line they came from.&lt;/p&gt;

&lt;h2&gt;
  
  
  Language access is the easy part
&lt;/h2&gt;

&lt;p&gt;It is tempting to treat multilingual diligence as a translation problem. Get the German CIM read in German, the French contracts read in French, and the job feels done. But translation is the beginning, not the end. Once a figure is in English it still needs verifying against its source, and that is the step, under time pressure, that quietly disappears. A footnote gets paraphrased into confident English. A working-capital adjustment gets summarised in a way that is technically reasonable and subtly wrong. The summary reads clean. The error is invisible because the reader never returns to the original line.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why cross-border deals make it worse
&lt;/h2&gt;

&lt;p&gt;This is sharper in Europe than almost anywhere, because the deals are genuinely multilingual in a way many markets are not. A buyer might look at a German manufacturer one month and a French services business the next, each arriving in its own language, with its own accounting conventions and its own footnote culture. And the people one step removed from the documents, the investors and the investment committee, sit even further from the source language than the buyer does. They see the cleanest, most summarised, most translated version of all. The further you sit from the original document, the more confident and the less checkable the number in front of you becomes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Which numbers actually deserve a second look
&lt;/h2&gt;

&lt;p&gt;You cannot re-read every line of every data room in three languages, and trying to is its own failure: it burns the exclusivity window on figures that do not matter. The discipline is narrower. Verify the handful of numbers your decision actually rests on against the original-language document.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Figure&lt;/th&gt;
&lt;th&gt;Why it moves the deal&lt;/th&gt;
&lt;th&gt;Check it against&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Customer concentration&lt;/td&gt;
&lt;td&gt;Sets the risk discount on the multiple&lt;/td&gt;
&lt;td&gt;The customer schedule, in the source language&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Working-capital peg&lt;/td&gt;
&lt;td&gt;Moves the price at closing&lt;/td&gt;
&lt;td&gt;The original financial notes, not the summary&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Revenue recognition&lt;/td&gt;
&lt;td&gt;Changes whether earnings are real&lt;/td&gt;
&lt;td&gt;The accounting policy note in its own language&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Change-of-control terms&lt;/td&gt;
&lt;td&gt;Can un-do the deal after close&lt;/td&gt;
&lt;td&gt;The actual assignment clause in the contract&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;For those, the quote should stay in its original language, so you or someone you trust can check it. If a number cannot be traced back to a specific line, it is not a number yet. It is a question.&lt;/p&gt;

&lt;h2&gt;
  
  
  A worked example
&lt;/h2&gt;

&lt;p&gt;Consider a manufacturer in a German-speaking country. The English summary of the financials, prepared by an adviser, described a customer concentration that looked acceptable. The original German footnote, read carefully, said something narrower and more alarming: one large customer relationship was contractually softer than the headline implied. The summary was not dishonest. It was a reasonable paraphrase that lost the single qualifier that mattered. A buyer who priced the deal on the English version would have underwritten a concentration risk they never saw, and the investment committee would have approved it without ever seeing the footnote. The reconciliation is what surfaces it.&lt;/p&gt;

&lt;h2&gt;
  
  
  How Deal OS closes the gap
&lt;/h2&gt;

&lt;p&gt;This is the discipline behind the &lt;a href="https://devaland.com/diligence-automation" rel="noopener noreferrer"&gt;cited-brief approach in Deal OS&lt;/a&gt;. It turns a data room, including documents in other languages, into a brief where every claim traces back to the exact source line it came from, with the original-language passage preserved next to the English so the number can be checked rather than trusted. Where a summary and a source disagree, it flags the contradiction with both sides cited, rather than smoothing it into a clean sentence. You can see it run on a synthetic deal in the &lt;a href="https://os.devaland.com/sample-brief" rel="noopener noreferrer"&gt;sample brief&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Pair this with the &lt;a href="https://devaland.com/blog/management-meeting-due-diligence" rel="noopener noreferrer"&gt;management meeting cross-check&lt;/a&gt; and the &lt;a href="https://devaland.com/blog/ma-due-diligence-checklist" rel="noopener noreferrer"&gt;M&amp;amp;A due diligence checklist&lt;/a&gt;: the checklist tells you what to verify, the management meeting is where the spoken version drifts, and the verification gap is where the translated version drifts. All three are the same discipline. Treat every summary as a claim until it traces to a source.&lt;/p&gt;

&lt;h2&gt;
  
  
  Frequently asked questions
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What is the verification gap in due diligence?&lt;/strong&gt; It is the step that gets skipped after a document is translated: checking the English summary against the original-language source. The translating is done; the verifying is not, because the summary is faster to read than the source.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How do I verify a translated financial summary?&lt;/strong&gt; Identify the few figures your decision rests on, find the specific line in the original-language document that supports each one, and keep the quote in its original language so it can be checked. Numbers that cannot be traced become diligence requests.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why is cross-border due diligence riskier than single-language diligence?&lt;/strong&gt; Because every deal arrives in a different language with different accounting conventions, usually without a bilingual analyst to check the translation, and the investors and IC sit even further from the source than the buyer does.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is source-language citation?&lt;/strong&gt; It is the practice of tracing each figure back to the original-language passage it came from and preserving that passage, rather than relying only on the translated summary, so the number stays checkable.&lt;/p&gt;

&lt;p&gt;See what a cited, contradiction-flagging brief looks like on a sample deal at &lt;a href="https://devaland.com/deal-os" rel="noopener noreferrer"&gt;Deal OS&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>machinelearning</category>
      <category>startup</category>
    </item>
    <item>
      <title>The three bugs my AI agent caught before a single customer saw them</title>
      <dc:creator>DEVALAND</dc:creator>
      <pubDate>Mon, 20 Jul 2026 18:49:46 +0000</pubDate>
      <link>https://dev.to/devaland/the-three-bugs-my-ai-agent-caught-before-a-single-customer-saw-them-3ihc</link>
      <guid>https://dev.to/devaland/the-three-bugs-my-ai-agent-caught-before-a-single-customer-saw-them-3ihc</guid>
      <description>&lt;p&gt;This is a smash story about bugs that never reached a customer, because the thing that wrote them also read them back to me.&lt;/p&gt;

&lt;p&gt;I run a small e-commerce store. Its abandoned-cart recovery emails were quietly leaking revenue, so I rebuilt the flow. But I never opened the dashboard. I pointed an AI coding agent at the email platform's REST API and asked it to get the sequence production-ready. Reading the flow, editing the emails, inserting steps, all of it was API calls.&lt;/p&gt;

&lt;p&gt;Then it read the generated emails back, and three bugs fell out. None dramatic. All the quiet kind that kill conversion or land you in legal trouble.&lt;/p&gt;

&lt;p&gt;Bug 1: the button to nowhere.&lt;br&gt;
The "Complete your order" button linked to a generic /cart page, not the customer's actual saved checkout. The trigger event carried the real checkout URL; the template ignored it. Every recovery email would have sent buyers to an empty cart. Fix: point the button at the event's real checkout URL, with /cart only as a fallback:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;href="{{ event.abandonedCheckoutUrl | default: '/cart' }}"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Bug 2: one product shown to everyone.&lt;br&gt;
The email hardcoded a single product, its name, price, and photo. Every abandoner would have seen that same item no matter what they actually left in their cart. That is worse than showing nothing: it is confidently wrong. Here is the human call in the loop: the agent surfaced it, I decided the fix. Generic-but-accurate beats specific-but-wrong, so I cut the hardcoded product rather than guess.&lt;/p&gt;

&lt;p&gt;Bug 3: the silent compliance bug.&lt;br&gt;
When the agent inserted the follow-up emails as raw HTML, the platform's branded footer, and with it the unsubscribe link, silently did not attach. An email with no unsubscribe is not just ugly, it is a GDPR and CAN-SPAM problem. Fix: re-send the emails as native blocks so the compliant footer attaches, then verify the unsubscribe actually renders.&lt;/p&gt;

&lt;p&gt;The lesson.&lt;br&gt;
I would have skimmed past all three in a nice-looking template. The difference was that the agent read every line back out loud. That is the real defense layer: not that AI writes the thing, but that it shows its work, so the expensive mistakes surface before a user ever hits them. Assume you will slip at 3am, and build the layer that catches it.&lt;/p&gt;

&lt;p&gt;The flow is live now. It has not recovered a cart yet, and I am not going to pretend otherwise: the store is new and low-traffic, so nothing real has abandoned through it since cutover. The bugs are the story here, not the revenue. I wrote the whole thing up, rough edges and all, here: &lt;a href="https://devaland.com/blog/sequenzy-review-agent-first-email" rel="noopener noreferrer"&gt;https://devaland.com/blog/sequenzy-review-agent-first-email&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Disclosure: the email platform in this story is one I reviewed independently. I was given a free account; the write-up was not paid for or approved by them.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>bugsmash</category>
      <category>devchallenge</category>
      <category>ai</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Best Due Diligence Software for Acquisitions (2026)</title>
      <dc:creator>DEVALAND</dc:creator>
      <pubDate>Mon, 20 Jul 2026 14:00:13 +0000</pubDate>
      <link>https://dev.to/devaland/best-due-diligence-software-for-acquisitions-2026-g17</link>
      <guid>https://dev.to/devaland/best-due-diligence-software-for-acquisitions-2026-g17</guid>
      <description>&lt;p&gt;If you search for "due diligence software," you get two very different kinds of product wearing the same label, and buying the wrong category is how teams end up paying for secure storage when what they actually needed was analysis.&lt;/p&gt;

&lt;p&gt;This is a plain-English 2026 buyer's guide for acquirers: search funds, independent sponsors, boutique M&amp;amp;A advisors, and micro-PE teams. It explains the two categories, compares the main tools honestly (including where ours fits and where it doesn't), and gives you a way to choose for the size of deal you actually run.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Quick answer:&lt;/strong&gt; Most "due diligence software" is a &lt;strong&gt;virtual data room (VDR)&lt;/strong&gt;, secure document hosting, permissions, and a Q&amp;amp;A tracker (Datasite, Ansarada, DealRoom, Intralinks). That solves &lt;em&gt;storage and access&lt;/em&gt;, not &lt;em&gt;review&lt;/em&gt;. A newer category, &lt;strong&gt;diligence-automation / document-intelligence&lt;/strong&gt; tools like &lt;a href="https://devaland.com/deal-os" rel="noopener noreferrer"&gt;Deal OS&lt;/a&gt;, actually reads the documents in the room and produces source-cited findings. For a small-to-mid-market deal, the two are complementary: the VDR holds the data room, the automation tool helps you get through it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The two categories, plainly
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Virtual data rooms (VDRs)
&lt;/h3&gt;

&lt;p&gt;A VDR is a secure, permissioned place to host the data room and run a buyer/seller Q&amp;amp;A process. Strengths: granular access control, audit trails, redaction, and a defensible record of who saw what. What they generally &lt;strong&gt;don't&lt;/strong&gt; do is analyze the content, a VDR will store a 200-page CIM and forty contracts, but it won't tell you the EBITDA add-backs don't reconcile. Pricing is typically quote-based and scales with data volume and users; historically VDRs are priced for sell-side and larger transactions.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Diligence-automation / document-intelligence tools
&lt;/h3&gt;

&lt;p&gt;These read the documents and produce analysis, source-cited summaries, financial extraction, risk and contradiction flags, missing-information checks. The point isn't to store the data room; it's to compress the &lt;strong&gt;reading and reconciling&lt;/strong&gt; that eats most of a diligence timeline. This is the category &lt;a href="https://devaland.com/diligence-automation" rel="noopener noreferrer"&gt;Deal OS&lt;/a&gt; sits in. It does not replace your data room, your QoE provider, or your own verification, it gets you to the real questions faster.&lt;/p&gt;

&lt;p&gt;The honest distinction: &lt;strong&gt;VDRs manage the documents; diligence-automation tools read them.&lt;/strong&gt; Many teams use one of each.&lt;/p&gt;

&lt;h2&gt;
  
  
  At a glance
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Category&lt;/th&gt;
&lt;th&gt;Best for&lt;/th&gt;
&lt;th&gt;Reads &amp;amp; analyzes docs?&lt;/th&gt;
&lt;th&gt;Pricing model&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Datasite&lt;/td&gt;
&lt;td&gt;Virtual data room&lt;/td&gt;
&lt;td&gt;Mid-to-large sell-side M&amp;amp;A&lt;/td&gt;
&lt;td&gt;No (storage + Q&amp;amp;A)&lt;/td&gt;
&lt;td&gt;Custom quote&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Intralinks&lt;/td&gt;
&lt;td&gt;Virtual data room&lt;/td&gt;
&lt;td&gt;Large enterprise / banking&lt;/td&gt;
&lt;td&gt;No (storage + Q&amp;amp;A)&lt;/td&gt;
&lt;td&gt;Custom quote&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ansarada&lt;/td&gt;
&lt;td&gt;VDR + deal workflow&lt;/td&gt;
&lt;td&gt;Sell-side prep, checklists&lt;/td&gt;
&lt;td&gt;Limited&lt;/td&gt;
&lt;td&gt;Custom quote&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DealRoom&lt;/td&gt;
&lt;td&gt;VDR + project management&lt;/td&gt;
&lt;td&gt;Buy-side process management&lt;/td&gt;
&lt;td&gt;Limited&lt;/td&gt;
&lt;td&gt;Subscription/quote&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Generic AI chat (e.g. uploading PDFs to an LLM)&lt;/td&gt;
&lt;td&gt;Ad-hoc document Q&amp;amp;A&lt;/td&gt;
&lt;td&gt;Quick one-off questions&lt;/td&gt;
&lt;td&gt;Partially, un-audited&lt;/td&gt;
&lt;td&gt;Low/free&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Deal OS&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Diligence automation&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Search funds, sponsors, micro-PE buy-side review&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Yes, source-cited findings&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Published SaaS tiers&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;Categories and capabilities are described in general terms; verify current features and pricing with each vendor, as products change.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Where each one fits
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Datasite and Intralinks&lt;/strong&gt; are the incumbents for larger, often sell-side transactions where the data room itself is the product and enterprise security and audit trails are the priority. They're robust and expensive, and usually more room than a sub-$10M deal needs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ansarada and DealRoom&lt;/strong&gt; blend a data room with deal workflow, checklists, trackers, and project management, which is genuinely useful on the &lt;em&gt;process&lt;/em&gt; side. They still center on managing documents and tasks rather than reading and reconciling the content for you.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Generic AI chat&lt;/strong&gt; (uploading PDFs to a general LLM) is tempting and cheap, and fine for a quick one-off question. The problem for diligence is trust: answers aren't reliably cited back to the source page, nothing is structured for a data room, and there's no contradiction or missing-information audit. For a decision where a single missed clause changes the deal, "probably right, no citation" isn't good enough.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://devaland.com/deal-os" rel="noopener noreferrer"&gt;Deal OS&lt;/a&gt;&lt;/strong&gt; is built for the buy-side review itself. You load a deal workspace, CIM, financials, contracts, tax returns, and the data-room PDFs, and it produces source-cited diligence briefs where every claim is quoted from your own documents and verified before you see it. It ties the same figure out across the CIM, the financials, and the tax return and flags every discrepancy, scrutinizes each EBITDA add-back for whether it survives a sale (a quality-of-earnings first pass), checks a management-call transcript against what the documents actually support, and drafts a buyer-ready investment-committee memo from the verified findings, with risk, contradiction, and missing-information audits across the whole room. It's aimed at the people doing the reading on small-to-mid-market deals, and it's priced on published SaaS tiers rather than a custom enterprise quote. You can try it on a deal that looks like yours in the &lt;a href="https://os.devaland.com/sandbox" rel="noopener noreferrer"&gt;interactive sandbox&lt;/a&gt;, no login, and see exactly what the output looks like.&lt;/p&gt;

&lt;h2&gt;
  
  
  AI diligence software vs the alternatives
&lt;/h2&gt;

&lt;p&gt;Before you compare tools, compare approaches. On a small-to-mid-market deal a buyer usually weighs five ways to get through the documents, and the honest trade-offs look like this:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Approach&lt;/th&gt;
&lt;th&gt;Typical cost&lt;/th&gt;
&lt;th&gt;Speed through a data room&lt;/th&gt;
&lt;th&gt;What you actually get&lt;/th&gt;
&lt;th&gt;Best when&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Read everything yourself&lt;/td&gt;
&lt;td&gt;Your own hours&lt;/td&gt;
&lt;td&gt;Days to weeks per deal&lt;/td&gt;
&lt;td&gt;Deep familiarity, but one tired reader, the highest miss rate, and nothing cited for later&lt;/td&gt;
&lt;td&gt;You run one or two deals a year and have the time&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hire or borrow an analyst&lt;/td&gt;
&lt;td&gt;A salaried hire you usually can't justify before close, or a contractor re-briefed each deal&lt;/td&gt;
&lt;td&gt;Faster, bounded by their availability&lt;/td&gt;
&lt;td&gt;A second reader, but context resets every engagement and quality varies&lt;/td&gt;
&lt;td&gt;You have steady deal flow and budget for headcount&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Upload PDFs to a generic AI chat&lt;/td&gt;
&lt;td&gt;Low or free&lt;/td&gt;
&lt;td&gt;Minutes&lt;/td&gt;
&lt;td&gt;Quick answers, but un-cited and un-audited, easy to hallucinate a clause that changes the deal&lt;/td&gt;
&lt;td&gt;A throwaway question, never a decision&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Commission a formal QoE&lt;/td&gt;
&lt;td&gt;Several thousand to tens of thousands per engagement&lt;/td&gt;
&lt;td&gt;A week or more&lt;/td&gt;
&lt;td&gt;A signed, defensible earnings opinion your lender relies on&lt;/td&gt;
&lt;td&gt;At LOI, on a deal you are serious about&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Diligence-automation software&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;A published monthly SaaS tier&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Minutes to hours&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Source-cited findings, a contradiction map, a tie-out across the CIM, financials and tax return, and a discarded-claims log, every figure traced to its page&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;You are the buyer and the reading is the bottleneck&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;Costs are industry-typical ranges, not quotes; they vary by deal size, market, and provider.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;These are not mutually exclusive. The pattern most small-to-mid-market buyers settle on is automation software to compress the reading and reach a defensible number, then a formal &lt;a href="https://devaland.com/blog/quality-of-earnings-explained" rel="noopener noreferrer"&gt;quality-of-earnings&lt;/a&gt; engagement on the deals that clear that bar. The automation is the first pass that makes the paid engagement faster and cheaper, not a replacement for it.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to choose
&lt;/h2&gt;

&lt;p&gt;A few honest questions cut through it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Do you need to &lt;em&gt;host&lt;/em&gt; a data room, or &lt;em&gt;get through&lt;/em&gt; one?&lt;/strong&gt; If you're running a sell-side process and need permissions and audit trails, you need a VDR. If you're the buyer drowning in documents, you need diligence automation. Many deals want both.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;What's the deal size?&lt;/strong&gt; Enterprise VDRs are priced for larger transactions. For a search fund or micro-PE deal, an enterprise quote is often more room, and more cost, than the deal warrants.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;How much of your time is reading?&lt;/strong&gt; If diligence is mostly reconciling financials and reading contracts against a checklist, that's the part automation compresses. If it's mostly process coordination, a workflow-oriented VDR may matter more.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Can you trust the output?&lt;/strong&gt; For analysis tools, insist on &lt;strong&gt;source citations&lt;/strong&gt; back to the document. Un-cited AI output can't be defended to an investor or a lender.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What software can't do
&lt;/h2&gt;

&lt;p&gt;No tool closes the deal for you. Software can store the room, read the documents, and surface the questions, but the judgment, the seller conversations, the legal review, and the &lt;a href="https://devaland.com/blog/quality-of-earnings-explained" rel="noopener noreferrer"&gt;quality-of-earnings&lt;/a&gt; work still belong to you and your advisors. The right software just means you spend your scarce hours on judgment instead of on grinding through PDFs. Pair any tool with a real &lt;a href="https://devaland.com/blog/small-business-acquisition-due-diligence-checklist" rel="noopener noreferrer"&gt;due diligence checklist&lt;/a&gt; so you know what you're verifying, not just where it's stored.&lt;/p&gt;

&lt;h2&gt;
  
  
  Frequently asked questions
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What is the best due diligence software for a small acquisition?&lt;/strong&gt;&lt;br&gt;
For a search fund, independent sponsor, or micro-PE deal, the better question is which &lt;em&gt;category&lt;/em&gt; you need. If you must host and permission a data room, a virtual data room (Datasite, Ansarada, DealRoom) is the tool. If you're the buyer trying to get through the documents, a diligence-automation tool like Deal OS that reads and cites the financials and contracts will save more of your time. Many teams use one of each.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is a virtual data room the same as due diligence software?&lt;/strong&gt;&lt;br&gt;
Not quite. A virtual data room (VDR) securely stores the documents and runs the Q&amp;amp;A process, it manages access, not analysis. "Due diligence automation" tools instead read the documents and produce source-cited findings, contradiction checks, and missing-information audits. VDRs manage the data room; automation tools help you get through it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can AI do due diligence?&lt;/strong&gt;&lt;br&gt;
AI can do the document-heavy parts, reading, summarizing, extracting financials, and flagging contradictions across a data room, and produce source-cited findings so you reach the real questions faster. It does not replace your judgment, seller conversations, legal review, or a quality-of-earnings analysis. Treat it as leverage on the reading, not a substitute for verification.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How much does due diligence software cost?&lt;/strong&gt;&lt;br&gt;
Virtual data rooms are usually quoted custom and scale with data volume and users, which can be expensive for a small deal. Diligence-automation tools like Deal OS are typically priced on published SaaS tiers, so a single buyer can run a deal without an enterprise contract. Always confirm current pricing directly with each vendor.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Should I use due diligence software or hire an analyst?&lt;/strong&gt;&lt;br&gt;
Before you own a business you usually can't justify a full-time analyst, and a contractor needs the same context re-explained every deal. Diligence-automation software gives you a tireless second reader that cites every figure to its source, for a published monthly price instead of a salary. The honest split is software for the repeatable document reading, and a human (you, your advisors, a QoE provider) for the judgment.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does AI due diligence software replace a quality of earnings report?&lt;/strong&gt;&lt;br&gt;
No. It does a QoE first pass: it ties EBITDA out across the CIM, the financials, and the tax return, flags discrepancies, and scrutinizes each add-back for whether it survives a sale, so you reach a defensible number before you commission a formal engagement. The signed QoE opinion your lender and reps-and-warranties rely on still comes from your provider, who now starts from an organized, already-flagged position instead of a cold data room.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is AI due diligence software worth it?&lt;/strong&gt;&lt;br&gt;
For a buyer whose main bottleneck is reading, yes: it compresses the slowest phase of a deal from an analyst-week into minutes, and every finding is cited so you can defend it to an investor or lender. The return is not only time saved, it is the missed clause or unreconciled add-back it catches before you wire money. For a pure sell-side hosting need, a virtual data room is the better spend.&lt;/p&gt;

&lt;h2&gt;
  
  
  See what the output looks like
&lt;/h2&gt;

&lt;p&gt;The fastest way to judge a diligence tool is to look at what it produces. See a real &lt;a href="https://os.devaland.com/sample-brief" rel="noopener noreferrer"&gt;source-cited diligence brief&lt;/a&gt;, &lt;a href="https://os.devaland.com/sandbox" rel="noopener noreferrer"&gt;try it on a deal that looks like yours&lt;/a&gt; with no login, or &lt;a href="https://os.devaland.com/sample-brief" rel="noopener noreferrer"&gt;see an example&lt;/a&gt; of how Deal OS turns a workspace of documents into cited findings, then decide which category your next deal actually needs. Not weighing a tool yet? Grab the free &lt;a href="https://os.devaland.com/lm/deal-team-doc" rel="noopener noreferrer"&gt;Deal Kit&lt;/a&gt;, 20 cited Claude diligence agents you can run on your own deals today.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>startup</category>
      <category>saas</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Fix: WebP og:images silently break Medium imports and social previews</title>
      <dc:creator>DEVALAND</dc:creator>
      <pubDate>Sat, 18 Jul 2026 06:27:40 +0000</pubDate>
      <link>https://dev.to/devaland/fix-webp-ogimages-silently-break-medium-imports-and-social-previews-1og4</link>
      <guid>https://dev.to/devaland/fix-webp-ogimages-silently-break-medium-imports-and-social-previews-1og4</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for &lt;a href="https://dev.to/bugsmash"&gt;DEV's Summer Bug Smash: Clear the Lineup&lt;/a&gt; powered by &lt;a href="https://sentry.io/" rel="noopener noreferrer"&gt;Sentry&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Project Overview
&lt;/h2&gt;

&lt;p&gt;My site (devaland.com) is a static blog built with React and vite-react-ssg, around 70 articles. Every article has a hero image, served as WebP/AVIF for performance. Those articles are also imported into Medium and shared on LinkedIn and X.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bug Fix or Performance Improvement
&lt;/h2&gt;

&lt;p&gt;A silent bug: WebP/AVIF hero images and &lt;code&gt;og:image&lt;/code&gt; tags do not import into Medium's "Import a story" and do not render link previews on LinkedIn or X. The page looks perfect, but importing an article pulled &lt;strong&gt;no hero image&lt;/strong&gt;, and shared links showed no preview. Nothing errors; the image just vanishes.&lt;/p&gt;

&lt;p&gt;There is a sneaky second half: even after fixing the &lt;code&gt;og:image&lt;/code&gt;, Medium still dropped the hero, because Medium imports the image from the article &lt;strong&gt;body&lt;/strong&gt; &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt;, which was also WebP. Two layers, one root cause.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Repro:&lt;/strong&gt; point a page's hero &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt; and &lt;code&gt;og:image&lt;/code&gt; at a &lt;code&gt;.webp&lt;/code&gt;, then run the URL through Medium's importer or the LinkedIn Post Inspector. No image. Swap to &lt;code&gt;.jpg&lt;/code&gt;, it appears.&lt;/p&gt;

&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;

&lt;p&gt;The repo is private, so here are the exact changes as code snippets.&lt;/p&gt;

&lt;p&gt;1) A prebuild step that auto-generates a &lt;code&gt;.jpg&lt;/code&gt; twin of every local hero, skip-if-exists:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// scripts/gen-og-jpg.mjs (runs in `prebuild`)&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;blogPosts&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;../src/data/mock.mjs&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;execFileSync&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;node:child_process&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;fs&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;node:fs&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;path&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;node:path&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;isLocalRaster&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="sr"&gt;/^https&lt;/span&gt;&lt;span class="se"&gt;?&lt;/span&gt;&lt;span class="sr"&gt;:/i&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="se"&gt;\.(&lt;/span&gt;&lt;span class="sr"&gt;webp|avif&lt;/span&gt;&lt;span class="se"&gt;)&lt;/span&gt;&lt;span class="sr"&gt;$/i&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;rel&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="p"&gt;[...&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;blogPosts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;image&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;isLocalRaster&lt;/span&gt;&lt;span class="p"&gt;))])&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;src&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;public&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;rel&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nx"&gt;jpg&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;src&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="se"&gt;\.(&lt;/span&gt;&lt;span class="sr"&gt;webp|avif&lt;/span&gt;&lt;span class="se"&gt;)&lt;/span&gt;&lt;span class="sr"&gt;$/i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;.jpg&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;fs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;existsSync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;jpg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;fs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;existsSync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;src&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="k"&gt;continue&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nf"&gt;execFileSync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;ffmpeg&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;-y&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;-loglevel&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;error&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;-i&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;src&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;-q:v&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;3&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;jpg&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;2) Point both the &lt;code&gt;og:image&lt;/code&gt; and the visible body hero &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt; at the JPG twin:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="nx"&gt;ogImage&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;post&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;image&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/^&lt;/span&gt;&lt;span class="se"&gt;(\/&lt;/span&gt;&lt;span class="sr"&gt;.+&lt;/span&gt;&lt;span class="se"&gt;)\.(&lt;/span&gt;&lt;span class="sr"&gt;webp|avif&lt;/span&gt;&lt;span class="se"&gt;)&lt;/span&gt;&lt;span class="sr"&gt;$/i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;$1.jpg&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;
&lt;span class="nx"&gt;src&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;post&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;image&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/^&lt;/span&gt;&lt;span class="se"&gt;(\/&lt;/span&gt;&lt;span class="sr"&gt;.+&lt;/span&gt;&lt;span class="se"&gt;)\.(&lt;/span&gt;&lt;span class="sr"&gt;webp|avif&lt;/span&gt;&lt;span class="se"&gt;)&lt;/span&gt;&lt;span class="sr"&gt;$/i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;$1.jpg&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  My Improvements
&lt;/h2&gt;

&lt;p&gt;The trick is to keep WebP for the live page (performance) but serve a JPG wherever a scraper or importer looks. The prebuild script runs on every build, so new articles are covered automatically with zero manual work, and the generated JPGs are committed so the deploy does not depend on the CI having ffmpeg. 37 heroes converted. Result: the hero now imports into Medium automatically and every link preview renders, while browsers still get WebP on the page. The boring, permanent kind of fix that clears the bug off the stage for good.&lt;/p&gt;

</description>
      <category>bugsmash</category>
      <category>devchallenge</category>
      <category>webdev</category>
      <category>seo</category>
    </item>
  </channel>
</rss>
