<?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: Gregory Tomlinson</title>
    <description>The latest articles on DEV Community by Gregory Tomlinson (@gtzilla).</description>
    <link>https://dev.to/gtzilla</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3844070%2Fbf409405-057f-4bf9-9f15-3cb738dbab06.jpeg</url>
      <title>DEV Community: Gregory Tomlinson</title>
      <link>https://dev.to/gtzilla</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/gtzilla"/>
    <language>en</language>
    <item>
      <title>When AI Collapses Fact and Assumption</title>
      <dc:creator>Gregory Tomlinson</dc:creator>
      <pubDate>Sun, 05 Apr 2026 02:13:25 +0000</pubDate>
      <link>https://dev.to/gtzilla/when-ai-collapses-fact-and-assumption-24ka</link>
      <guid>https://dev.to/gtzilla/when-ai-collapses-fact-and-assumption-24ka</guid>
      <description>&lt;p&gt;Blended inference is the baseline response mode of LLMs. Smooth prose is the goal. In software, that smoothness can hide the boundary between grounded analysis and inferred assumptions.&lt;/p&gt;

&lt;p&gt;The generation process does not distinguish between a token the model can support and one it filled in. Everything comes out at the same confidence level.&lt;/p&gt;

&lt;p&gt;I ran a small experiment on a Python caching service by asking:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;We’re seeing latency spikes on our report generation API. What should we look at?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The baseline response correctly identified concrete areas to improve in the file: no lock or request coalescing on cache miss, a cleanup job that scans all of Redis, a stale flag that never gets checked, and synchronized TTL expiry.&lt;/p&gt;

&lt;p&gt;In the same answer, at the same confidence level, it also said things like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;“If this runs periodically on the same Redis used by the API, it is a strong candidate for periodic spikes.”&lt;/li&gt;
&lt;li&gt;“If many hot reports are created around the same time—after deploy, after nightly prefetch, after business-hour traffic ramps up—they can expire around the same time too.”&lt;/li&gt;
&lt;li&gt;“Correlate p95/p99 latency with cache hit rate for /reports/generate.”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of those lines are absurd. Some may even be useful.&lt;/p&gt;

&lt;p&gt;The model did not know my Redis topology. It did not know my traffic shape. It did not know whether I had that telemetry. It did not verify the correlation it recommended.&lt;/p&gt;

&lt;p&gt;It moved from what it could support from the file to assumptions about the surrounding system and wrote both in the same voice.&lt;/p&gt;

&lt;p&gt;Instead, the burden of sifting grounded analysis out of a flood of smooth prose falls on me.&lt;/p&gt;

&lt;p&gt;That changed what review required from me. I could not just ask whether a sentence was wrong. I had to decompose the answer: what came directly from the file, what followed from reasoning over the file, and what entered because the model filled in missing context.&lt;/p&gt;

&lt;p&gt;I then reran the same prompt and the same code using VDG protocol.&lt;/p&gt;

&lt;p&gt;The concrete analysis stayed. But the response could no longer glide past what it did not know. Instead of silently leaning on unknowns, the response had to put those unknowns in the Gap section:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;“No request metrics were provided, so it is unknown whether spikes are dominated by &lt;code&gt;aggregate_transactions&lt;/code&gt; runtime, Redis latency, or concurrent duplicate work.”&lt;/li&gt;
&lt;li&gt;“No Redis topology was provided. It is unknown whether this cache is dedicated or shared, how many total keys live in &lt;code&gt;db=0&lt;/code&gt;, and whether Redis CPU or memory pressure is present.”&lt;/li&gt;
&lt;li&gt;“No traffic-shape data was provided. It is unknown whether a small set of hot report keys dominates traffic or whether demand is evenly distributed.”&lt;/li&gt;
&lt;li&gt;“No client retry behavior was provided. It is unknown whether callers retry &lt;code&gt;generate&lt;/code&gt; aggressively on slow responses, which would magnify stampedes.”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I could see what the file supported, what the model inferred, and what remained open.&lt;/p&gt;

&lt;p&gt;That is the value of VDG protocol. Not just a consistent response shape, but a way to force the model to take on the burden of separating grounded analysis from inferred assumptions.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>softwareengineering</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Making AI Omitted Scope Visible with VDG</title>
      <dc:creator>Gregory Tomlinson</dc:creator>
      <pubDate>Sat, 04 Apr 2026 04:53:01 +0000</pubDate>
      <link>https://dev.to/gtzilla/making-ai-omitted-scope-visible-with-vdg-4k3l</link>
      <guid>https://dev.to/gtzilla/making-ai-omitted-scope-visible-with-vdg-4k3l</guid>
      <description>&lt;p&gt;I designed an experiment to demonstrate omitted scope using a caching system in Python. It’s just one file.&lt;/p&gt;

&lt;p&gt;It generates reports, caches them in Redis, lets you check status, invalidate, and prefetch.&lt;/p&gt;

&lt;p&gt;All four code paths require the same cache key.&lt;/p&gt;

&lt;p&gt;In the experiment, the prompt was:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;We’re getting occasional cache key collisions in the report&lt;br&gt;
generation path. Switch GENERATE_HASH_NAME from MD5&lt;br&gt;
to SHA-256. Here’s the service file. Return the updated&lt;br&gt;
version.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In the baseline run, the model makes the named change and stops there, which is correct.&lt;/p&gt;

&lt;p&gt;This demonstrates omitted scope.&lt;/p&gt;

&lt;p&gt;Omitted scope means the request does not explicitly enumerate all the surfaces that need to change. The response can be correct against the named instruction and still miss the broader intended scope.&lt;/p&gt;

&lt;p&gt;The model updates the write path by changing &lt;code&gt;GENERATE_HASH_NAME&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;It does not carry the same change through to all relevant code paths.&lt;/p&gt;

&lt;p&gt;The generate path writes a SHA-256 key, but the read paths continue to use the MD5-based key.&lt;/p&gt;

&lt;p&gt;As a result, none of the read paths hit cache.&lt;/p&gt;

&lt;p&gt;Again, the model responded correctly.&lt;/p&gt;

&lt;p&gt;But if my intent was that all four code paths changed, it might look like the model made a mistake.&lt;/p&gt;

&lt;p&gt;The unnamed read paths never changed.&lt;/p&gt;

&lt;p&gt;The model did not reliably surface that this would break cache reads.&lt;/p&gt;

&lt;p&gt;If my intent was only to change the generate method, the model behaved as desired.&lt;/p&gt;

&lt;p&gt;Either intent is valid, but neither intent has been explicitly enumerated.&lt;/p&gt;

&lt;p&gt;I created &lt;a href="https://ai.gtzilla.com/contracts/vdg-contract-v1.4.2/" rel="noopener noreferrer"&gt;VDG&lt;/a&gt; because I needed a way to make omitted scope visible.&lt;/p&gt;

&lt;p&gt;Let’s look at the baseline and VDG responses from the experiment.&lt;/p&gt;

&lt;h2&gt;
  
  
  Baseline P6
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;Done. Line 14 changed from "md5" to "sha256". This only affects the /reports/generate endpoint’s cache keys—the other hash configs (status, invalidation, prefetch) remain on MD5 as before.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  P6 with VDG
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;Gap&lt;/p&gt;

&lt;p&gt;Cache coherence on deployment: Switching hash algorithms mid-flight means /reports/status, /webhooks/data-update, and /admin/prefetch still use MD5-based keys; they will not find or invalidate reports cached under the new SHA-256 keys.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  How VDG Helps
&lt;/h2&gt;

&lt;p&gt;In this experiment, once VDG was introduced, the omitted scope appeared clearly under Gap.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://ai.gtzilla.com/contracts/vdg-contract-v1.4.2/" rel="noopener noreferrer"&gt;VDG&lt;/a&gt; surfaces what is known, what is inferred, and what is assumed.&lt;/p&gt;

&lt;p&gt;The model followed the instruction correctly. The instruction didn't cover the scope. That gap between what was named and what was needed is where production failures start, and it's exactly where VDG forces a pause. Not by changing what the model does, but by making what it didn't do impossible to miss.&lt;/p&gt;

&lt;h2&gt;
  
  
  P6 Responses
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Full baseline P6 response
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;I’ll update the GENERATE_HASH_NAME constant from MD5 to SHA-256 as requested.&lt;/p&gt;

&lt;p&gt;Done. Line 14 changed from "md5" to "sha256". This only affects the /reports/generate endpoint’s cache keys—the other hash configs (status, invalidation, prefetch) remain on MD5 as before.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Claude VDG response
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;Verified&lt;/p&gt;

&lt;p&gt;Objective: Change &lt;code&gt;GENERATE_HASH_NAME&lt;/code&gt; from &lt;code&gt;"md5"&lt;/code&gt; to &lt;code&gt;"sha256"&lt;/code&gt; to address cache key collisions in the report generation path.&lt;/p&gt;

&lt;p&gt;Deduction&lt;/p&gt;

&lt;p&gt;Changing &lt;code&gt;GENERATE_HASH_NAME = "md5"&lt;/code&gt; to &lt;code&gt;GENERATE_HASH_NAME = "sha256"&lt;/code&gt; will cause &lt;code&gt;_report_cache_key()&lt;/code&gt; to return SHA-256 hashes instead of MD5 hashes for the report generation endpoint.&lt;/p&gt;

&lt;p&gt;Gap&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cache coherence on deployment: Switching hash algorithms mid-flight means &lt;code&gt;/reports/status&lt;/code&gt;, &lt;code&gt;/webhooks/data-update&lt;/code&gt;, and &lt;code&gt;/admin/prefetch&lt;/code&gt; still use MD5-based keys; they will not find or invalidate reports cached under the new SHA-256 keys.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://ai.gtzilla.com/contracts/vdg-contract-v1.4.2/" rel="noopener noreferrer"&gt;VDG Protocol&lt;/a&gt; | &lt;a href="https://ai.gtzilla.com/contracts/vdg-contract-v1.4.2/VDG%20Contract%20Artifact%20v1.4.2.pdf" rel="noopener noreferrer"&gt;PDF&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>softwareengineering</category>
      <category>productivity</category>
    </item>
    <item>
      <title>AI Answers Can Come with Silent Tech Debt</title>
      <dc:creator>Gregory Tomlinson</dc:creator>
      <pubDate>Sat, 28 Mar 2026 21:14:06 +0000</pubDate>
      <link>https://dev.to/gtzilla/ai-answers-can-come-with-silent-tech-debt-4ibd</link>
      <guid>https://dev.to/gtzilla/ai-answers-can-come-with-silent-tech-debt-4ibd</guid>
      <description>&lt;p&gt;AI answers solve the task by making decisions automatically for you.&lt;/p&gt;

&lt;p&gt;That’s what makes vibe coding feel magical.&lt;/p&gt;

&lt;p&gt;It also means the model is choosing things you didn’t specify.&lt;/p&gt;

&lt;p&gt;I see this often enough that I need to write it down. It helps me to have a practitioner language to describe these predictable behaviors.&lt;/p&gt;

&lt;p&gt;The model makes choices for you. I call that &lt;strong&gt;default fill-in&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;I worked with Claude 4.6 to design a trivial experiment that demonstrates this.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Prompt
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;I need to build a js file picker and color picker too. It’s react and we are using our Python teams api. I have the url if you can make that a variable for me to change. React only.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I use incognito mode to limit carryover from my own Claude usage. I give the same prompt in two sessions. In the second session, I add the protocol PDF and an instruction: use &lt;a href="https://ai.gtzilla.com/contracts/vdg-contract-v1.4.2/" rel="noopener noreferrer"&gt;VDG&lt;/a&gt; for the response.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the Model Chose
&lt;/h2&gt;

&lt;p&gt;Here’s what the vanilla response chose on its own:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;multi-file upload&lt;/li&gt;
&lt;li&gt;drag and drop&lt;/li&gt;
&lt;li&gt;preset colors&lt;/li&gt;
&lt;li&gt;an &lt;code&gt;${API_URL}/upload&lt;/code&gt; route&lt;/li&gt;
&lt;li&gt;a &lt;code&gt;files[]&lt;/code&gt; request shape&lt;/li&gt;
&lt;li&gt;a JSON success response&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of that is specified in the prompt.&lt;/p&gt;

&lt;p&gt;The VDG response still produces a working component, but it leaves those same areas open.&lt;/p&gt;

&lt;p&gt;Endpoint path, request shape, file handling, response format, auth headers, and accepted file types show up as unknowns instead of being silently filled in.&lt;/p&gt;

&lt;p&gt;Nothing is wrong with either response. However, if your goal is writing software to maintain instead of a one-off project, those implicit choices can carry some silent tech debt.&lt;/p&gt;

&lt;p&gt;I prefer knowing when models make those default fill-in choices. That’s where VDG comes in.&lt;/p&gt;

&lt;p&gt;This is the ideal example because it’s as vanilla as I can get it.&lt;/p&gt;

&lt;p&gt;If your goal is a one-off, default fill-in is very useful. But at least for me, I write software. So these implicit choices carry extra burden.&lt;/p&gt;

&lt;p&gt;Do I roll that choice back? Do I tell the model it solved the task in a way I didn’t actually want?&lt;/p&gt;

&lt;p&gt;After seeing enough of these choices, I try to force the model to expose its assumptions. It doesn’t really do that directly. What it does allow, eventually, is what becomes the VDG protocol.&lt;/p&gt;

&lt;p&gt;I now use &lt;a href="https://ai.gtzilla.com/contracts/vdg-contract-v1.4.2/" rel="noopener noreferrer"&gt;VDG&lt;/a&gt; for almost every response except creative writing.&lt;/p&gt;

&lt;p&gt;I scan down to Gap if things aren’t going well.&lt;/p&gt;

&lt;p&gt;Is it making assumptions? Is information missing? What’s driving these results?&lt;/p&gt;

&lt;p&gt;I find it useful.&lt;/p&gt;

&lt;h2&gt;
  
  
  Same Prompt, Two Outputs
&lt;/h2&gt;

&lt;p&gt;The only thing that changed between these runs is attaching the VDG PDF and the instruction to use &lt;a href="https://ai.gtzilla.com/contracts/vdg-contract-v1.4.2/" rel="noopener noreferrer"&gt;VDG&lt;/a&gt;. The prompt itself is identical.&lt;/p&gt;

&lt;h3&gt;
  
  
  Prompt
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;I need to build a js file picker and color picker too. It’s react and we are using our Python teams api. I have the url if you can make that a variable for me to change. React only.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Vanilla Claude 4.6 Response (Excerpt + Full)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Top of response:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;File picker: drag &amp;amp; drop or click to browse, supports multiple files&lt;/li&gt;
&lt;li&gt;Color picker: native input + manual HEX input, plus preset swatches&lt;/li&gt;
&lt;li&gt;Submit: POST to &lt;code&gt;${API_URL}/upload&lt;/code&gt; using multipart/form-data&lt;/li&gt;
&lt;li&gt;Fields: &lt;code&gt;files[]&lt;/code&gt; and color&lt;/li&gt;
&lt;li&gt;Assumes JSON success response&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Full response (condensed for readability):&lt;/strong&gt;&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="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useState&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;react&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;API_URL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;http://your-api-url.com&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;FileColorPicker&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="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;files&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setFiles&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;([]);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;color&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setColor&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;#000000&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;handleFileChange&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;setFiles&lt;/span&gt;&lt;span class="p"&gt;([...&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;files&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;handleDrop&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;preventDefault&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="nf"&gt;setFiles&lt;/span&gt;&lt;span class="p"&gt;([...&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;dataTransfer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;files&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;handleSubmit&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;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;formData&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;FormData&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="nx"&gt;files&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;forEach&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;file&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;formData&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;files[]&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;file&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="nx"&gt;formData&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;color&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;color&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;API_URL&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/upload`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;POST&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;formData&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;

  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;onDrop&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;handleDrop&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="na"&gt;onDragOver&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;preventDefault&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;input&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"file"&lt;/span&gt; &lt;span class="na"&gt;multiple&lt;/span&gt; &lt;span class="na"&gt;onChange&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;handleFileChange&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;input&lt;/span&gt;
        &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"color"&lt;/span&gt;
        &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;color&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
        &lt;span class="na"&gt;onChange&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;setColor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt; &lt;span class="na"&gt;onClick&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;handleSubmit&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Upload&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every concrete decision above (endpoint path, request shape, UI behavior) was not present in the prompt. The model introduced them.&lt;/p&gt;

&lt;h2&gt;
  
  
  Claude 4.6 with VDG (Excerpt + Full)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Top of response (structure):&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Verified&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;React component requested with file picker and color picker&lt;/li&gt;
&lt;li&gt;API URL must be configurable&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Deduction&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Needs file input, color input, and submit handler&lt;/li&gt;
&lt;li&gt;Likely uses fetch + FormData&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Gap&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Unknown endpoint path&lt;/li&gt;
&lt;li&gt;Unknown request shape&lt;/li&gt;
&lt;li&gt;Unknown accepted file types&lt;/li&gt;
&lt;li&gt;Unknown auth headers&lt;/li&gt;
&lt;li&gt;Unknown response format&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Full response (condensed for readability):&lt;/strong&gt;&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="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useState&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;react&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;API_URL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;http://your-api-url.com&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;FileColorPicker&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="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;file&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setFile&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;color&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setColor&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;#000000&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;handleSubmit&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;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;formData&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;FormData&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;file&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nx"&gt;formData&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;file&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;file&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;formData&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;color&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;color&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;API_URL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;POST&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;formData&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;

  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;input&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"file"&lt;/span&gt; &lt;span class="na"&gt;onChange&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;setFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;files&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;input&lt;/span&gt;
        &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"color"&lt;/span&gt;
        &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;color&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
        &lt;span class="na"&gt;onChange&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;setColor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt; &lt;span class="na"&gt;onClick&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;handleSubmit&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Submit&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The VDG response does not remove capability. It removes silent decisions.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Difference
&lt;/h2&gt;

&lt;p&gt;One answer turns unknowns into decisions.&lt;br&gt;
The other keeps unknowns as unknowns.&lt;/p&gt;

&lt;p&gt;That difference is where silent tech debt starts.&lt;/p&gt;

&lt;p&gt;That’s default fill-in.&lt;/p&gt;

&lt;p&gt;And once you see it, you start deciding whether you want those choices made for you.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://ai.gtzilla.com/contracts/vdg-contract-v1.4.2/" rel="noopener noreferrer"&gt;Get VDG Protocol&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>softwareengineering</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Stop Calling Every AI Miss a Hallucination</title>
      <dc:creator>Gregory Tomlinson</dc:creator>
      <pubDate>Thu, 26 Mar 2026 12:34:00 +0000</pubDate>
      <link>https://dev.to/gtzilla/stop-calling-every-ai-miss-a-hallucination-1j4a</link>
      <guid>https://dev.to/gtzilla/stop-calling-every-ai-miss-a-hallucination-1j4a</guid>
      <description>&lt;p&gt;Hallucination has become a garbage-can label for AI misses.&lt;/p&gt;

&lt;p&gt;Sometimes the model really did make something up. Fine, call that a hallucination.&lt;/p&gt;

&lt;p&gt;But a lot of what engineers are calling hallucination is something else: omitted scope, default fill-in, or blended inference. If you diagnose all of it the same way, you stop seeing what actually failed.&lt;/p&gt;

&lt;p&gt;I’m using hallucination the way &lt;a href="https://openai.com/index/why-language-models-hallucinate/" rel="noopener noreferrer"&gt;OpenAI does&lt;/a&gt;: plausible but false statements. I’m separating that from omitted scope, default fill-in, and blended inference because those are different failures and need different fixes.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Omitted scope&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;This is one of the most common misses in coding work.&lt;/p&gt;

&lt;p&gt;You ask for one change. The model makes that change. But the same rule also needed to hold somewhere else, and you never named that second place.&lt;/p&gt;

&lt;p&gt;So one path changes and the other does not.&lt;/p&gt;

&lt;p&gt;That is not best described as hallucination. It is a scope failure.&lt;/p&gt;

&lt;p&gt;The model did the named work and missed the unnamed consequence.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Default fill-in&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Sometimes the model is not inventing facts. It is filling open slots.&lt;/p&gt;

&lt;p&gt;You left key choices unspecified, so it picked something plausible:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a library
&lt;/li&gt;
&lt;li&gt;an implementation pattern
&lt;/li&gt;
&lt;li&gt;a default behavior&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That may still be wrong. But wrong because the system guessed a default is not the same as wrong because it made up unsupported content.&lt;/p&gt;

&lt;p&gt;Those are different problems. They need different corrections.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Blended inference&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;This is the failure type buried in your AI answers.&lt;/p&gt;

&lt;p&gt;The model mixes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;what is grounded
&lt;/li&gt;
&lt;li&gt;what is inferred
&lt;/li&gt;
&lt;li&gt;what is assumed
&lt;/li&gt;
&lt;li&gt;and what is missing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then it returns all of that in one fluent answer.&lt;/p&gt;

&lt;p&gt;You are no longer just checking whether the answer sounds good. You are trying to figure out where the model stopped knowing and started guessing.&lt;/p&gt;

&lt;p&gt;That is not the same thing as the model making something up either.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Why this matters&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;These failures need different fixes.&lt;/p&gt;

&lt;p&gt;If the model made something up, you need grounding, verification, or tighter constraints.&lt;/p&gt;

&lt;p&gt;If it missed scope, you need to name the full change and the other places where the rule has to hold.&lt;/p&gt;

&lt;p&gt;If it filled in defaults, you need to specify the choices you left open.&lt;/p&gt;

&lt;p&gt;If it blended facts and assumptions, you need a way to separate them before acting on the answer.&lt;/p&gt;

&lt;p&gt;Calling all of that hallucination makes the model look magical when the failure is often much more ordinary.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Where VDG fits&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;This is why I built &lt;a href="https://ai.gtzilla.com/contracts/vdg-contract-v1.4.2/" rel="noopener noreferrer"&gt;VDG&lt;/a&gt;: Verified / Deduction / Gap.&lt;/p&gt;

&lt;p&gt;VDG does not make the model smarter. It does not eliminate hallucinations. It breaks blended answers apart.&lt;/p&gt;

&lt;p&gt;That matters most with blended inference. In a normal answer, what is grounded, what is inferred, what is assumed, and what is missing can all be blended into one smooth response. VDG is designed to break that blend apart.&lt;/p&gt;

&lt;p&gt;That also helps with the other failure classes. VDG will not fix omitted scope for you. But it makes missing scope more visible. It will not stop the model from choosing defaults. But it forces those defaults to surface instead of passing as if they were simply part of the answer.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;The practical rule&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Stop using hallucination as the label for every AI miss.&lt;/p&gt;

&lt;p&gt;Use it when the model actually made something up.&lt;/p&gt;

&lt;p&gt;Then diagnose the rest more precisely.&lt;/p&gt;

&lt;p&gt;That alone will help you see what failed and why it failed.&lt;/p&gt;

&lt;p&gt;Full version: &lt;a href="https://ai.gtzilla.com/papers/stop-calling-every-ai-miss-a-hallucination-v1.0/" rel="noopener noreferrer"&gt;ai.gtzilla.com&lt;/a&gt;&lt;/p&gt;

</description>
      <category>softwareengineering</category>
      <category>discuss</category>
      <category>ai</category>
      <category>programming</category>
    </item>
  </channel>
</rss>
