<?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: Johan Stolk</title>
    <description>The latest articles on DEV Community by Johan Stolk (@johan_stolk).</description>
    <link>https://dev.to/johan_stolk</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%2F4045278%2Fe6c196a4-4954-4cd5-95aa-a138ce5a235c.png</url>
      <title>DEV Community: Johan Stolk</title>
      <link>https://dev.to/johan_stolk</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/johan_stolk"/>
    <language>en</language>
    <item>
      <title>The Blind Spot of AI</title>
      <dc:creator>Johan Stolk</dc:creator>
      <pubDate>Sat, 25 Jul 2026 11:40:45 +0000</pubDate>
      <link>https://dev.to/johan_stolk/the-blind-spot-of-ai-25ga</link>
      <guid>https://dev.to/johan_stolk/the-blind-spot-of-ai-25ga</guid>
      <description>&lt;p&gt;Last week I was adding shadows to the Blazor port of an old 3D space game of mine. The original C++ version — created around 2005 — already had shadows, using the shadow volume technique. Back then it took me about two months of evenings to get it working. Documentation was scarce, and shadow volumes are anything but trivial.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fk54li2uk09oi645z37sx.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fk54li2uk09oi645z37sx.jpg" alt="The original C++ game, circa 2005" width="648" height="536"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;The original game, running on period-accurate hardware.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  AI enters the picture
&lt;/h2&gt;

&lt;p&gt;Fast forward to 2026. My Blazor port (started in 2022) needed the same shadows, and this time I had AI to speed things up. It's still a genuinely hard graphics algorithm, though — I was using Claude Sonnet to help with the port, and it kept going in circles because it relied on its own recollection of the algorithm instead of the working source I'd given it. Switching to Opus finally got things moving.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0fp27oj0swhdzjmo5nl3.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0fp27oj0swhdzjmo5nl3.jpg" alt="Intro scene of the 2022 Blazor game" width="800" height="800"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;The Blazor port so far — same universe, new stack.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The debugging view
&lt;/h2&gt;

&lt;p&gt;While debugging, the AI generated this visualization of the shadow volume:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhixqb0aj5iw7ps0j5pdp.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhixqb0aj5iw7ps0j5pdp.jpg" alt="Shadow volume debug view" width="800" height="798"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;The projected shadow volume, visualized in red.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Everything looked correct — you can clearly see where the shadow should land on the floor plane.&lt;/p&gt;

&lt;h2&gt;
  
  
  The surprising failure
&lt;/h2&gt;

&lt;p&gt;Next it rendered the shadow itself, to check that it actually worked:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fl817mq4nbl68kqg16lfi.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fl817mq4nbl68kqg16lfi.jpg" alt="Shadow rendered on a near-black floor" width="800" height="798"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Can you spot the real issue?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;This is where it got interesting. Any human looking at that screenshot immediately notices the shadow is being projected onto an almost-black floor, making it nearly invisible. The AI, however, &lt;strong&gt;concluded that the shadow rendering itself was broken!!&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The blind spot
&lt;/h2&gt;

&lt;p&gt;Only after I pointed out the obvious did it change the floor texture:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Flu901ccq9ncc27ahx5nu.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Flu901ccq9ncc27ahx5nu.jpg" alt="Shadow rendered on a lighter floor" width="800" height="798"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Nothing changed except the floor texture.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The shadow had been there the whole time — it was simply impossible to distinguish from the floor it was drawn on.&lt;/p&gt;

&lt;p&gt;This was a good reminder that today's AI is incredibly capable at reasoning about code, but it can still miss things that are visually obvious to a person. It was analyzing pixels and logic rather than stepping back and asking, "can a human actually see the result?"&lt;/p&gt;

&lt;h2&gt;
  
  
  What's next
&lt;/h2&gt;

&lt;p&gt;The spacecraft's self-shadowing is still incorrect, so that's the next challenge — I'm curious whether Fable can solve the part where Opus got stuck.&lt;/p&gt;

&lt;p&gt;Have you run into a similar blind spot with AI — a case where it was technically right but missed something a human would catch instantly? I'd like to hear about it in the comments.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>gamedev</category>
      <category>blazor</category>
      <category>graphics</category>
    </item>
  </channel>
</rss>
