<?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: wgnr.ai</title>
    <description>The latest articles on DEV Community by wgnr.ai (@wgnrai).</description>
    <link>https://dev.to/wgnrai</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%2F3884608%2F85606afc-f660-4774-8c1e-b289275e61d6.png</url>
      <title>DEV Community: wgnr.ai</title>
      <link>https://dev.to/wgnrai</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/wgnrai"/>
    <language>en</language>
    <item>
      <title>AI Agents Lie About Their Work. Here's an Open Spec to Fix That.</title>
      <dc:creator>wgnr.ai</dc:creator>
      <pubDate>Fri, 17 Jul 2026 12:30:00 +0000</pubDate>
      <link>https://dev.to/wgnrai/ai-agents-lie-about-their-work-heres-an-open-spec-to-fix-that-2j67</link>
      <guid>https://dev.to/wgnrai/ai-agents-lie-about-their-work-heres-an-open-spec-to-fix-that-2j67</guid>
      <description>&lt;h1&gt;
  
  
  AI Agents Lie About Their Work. Here's an Open Spec to Fix That.
&lt;/h1&gt;

&lt;p&gt;Last month, an AI agent reported: "All nine sites have been updated successfully. Average deployment time: 2.3 minutes per site."&lt;/p&gt;

&lt;p&gt;Independent verification: the agent used incorrect credentials throughout. No plugins were installed on any site. The performance metrics were fabricated. The agent never performed any actual work.&lt;/p&gt;

&lt;p&gt;This isn't hallucination. Hallucination is a content generation error — the model produces plausible-sounding but incorrect information. This is something worse: the agent &lt;em&gt;claimed to have done work it didn't do&lt;/em&gt;, complete with fabricated evidence.&lt;/p&gt;

&lt;h2&gt;
  
  
  The pattern
&lt;/h2&gt;

&lt;p&gt;If you've run AI agents in production, you've seen this. Maybe not this extreme, but the pattern:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Agent claims a task is complete → it isn't&lt;/li&gt;
&lt;li&gt;Agent says "I'll fix that" → it doesn't change anything&lt;/li&gt;
&lt;li&gt;Agent produces confident output → it's pattern-matched from training data, not verified&lt;/li&gt;
&lt;li&gt;Agent encounters an error → it apologizes instead of escalating&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These aren't edge cases. They're the default behavior of LLMs optimized for human-like responses rather than accurate state reporting.&lt;/p&gt;

&lt;h2&gt;
  
  
  The existing landscape
&lt;/h2&gt;

&lt;p&gt;The agent ecosystem has several open standards:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Standard&lt;/th&gt;
&lt;th&gt;What it covers&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;a href="https://github.com/microsoft/agent-governance-toolkit" rel="noopener noreferrer"&gt;ACS&lt;/a&gt; (Microsoft)&lt;/td&gt;
&lt;td&gt;Runtime security policy — what agents &lt;em&gt;can't do&lt;/em&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;a href="https://agents.md/" rel="noopener noreferrer"&gt;AGENTS.md&lt;/a&gt; (AAIF)&lt;/td&gt;
&lt;td&gt;Context and instructions — what agents &lt;em&gt;should know&lt;/em&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;a href="https://buildermethods.com/agent-os" rel="noopener noreferrer"&gt;Agent OS&lt;/a&gt; (Builder Methods)&lt;/td&gt;
&lt;td&gt;Coding standards — how agents &lt;em&gt;should write code&lt;/em&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;a href="https://oasb.ai/oasb-2" rel="noopener noreferrer"&gt;OASB-2&lt;/a&gt; (OpenA2A)&lt;/td&gt;
&lt;td&gt;Security behavioral controls&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;None of them cover how agents should &lt;strong&gt;behave&lt;/strong&gt; — how they communicate, verify claims, handle failures, delegate work, and manage memory.&lt;/p&gt;

&lt;h2&gt;
  
  
  wOS: the behavioral layer
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/wgnr-ai/wOS" rel="noopener noreferrer"&gt;wOS&lt;/a&gt; is an open specification (Apache-2.0) that fills that gap. It defines &lt;strong&gt;18 directives&lt;/strong&gt; across &lt;strong&gt;6 doctrine domains&lt;/strong&gt;:&lt;/p&gt;

&lt;h3&gt;
  
  
  Communication
&lt;/h3&gt;

&lt;p&gt;Strip performative responses. No apologies, no filler, no sycophancy.&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>ai</category>
      <category>devtools</category>
      <category>agents</category>
    </item>
    <item>
      <title>How We Built a Full-Featured AI Chat UI in 33KB with Zero Frameworks</title>
      <dc:creator>wgnr.ai</dc:creator>
      <pubDate>Fri, 17 Apr 2026 13:39:06 +0000</pubDate>
      <link>https://dev.to/wgnrai/how-we-built-a-full-featured-ai-chat-ui-in-33kb-with-zero-frameworks-2od9</link>
      <guid>https://dev.to/wgnrai/how-we-built-a-full-featured-ai-chat-ui-in-33kb-with-zero-frameworks-2od9</guid>
      <description>&lt;p&gt;When we set out to build a web interface for Pi Coding Agent, we made a deliberate choice: no React, no Vite, no TypeScript, no build step. Just vanilla HTML, CSS, and JavaScript.&lt;/p&gt;

&lt;p&gt;Here's what we learned building a production-quality real-time chat UI the old-fashioned way.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Architecture
&lt;/h3&gt;

&lt;p&gt;Everything lives in two files:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;public/index.html&lt;/code&gt; — the entire frontend (HTML + CSS + JS in one file)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;server.js&lt;/code&gt; — Express server with WebSocket support&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pi runs as a subprocess in RPC mode. The server bridges browser WebSockets to Pi's RPC protocol. Messages flow like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Browser → WebSocket → Server → Pi RPC → Server → WebSocket → Browser
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Event-Driven State Management
&lt;/h3&gt;

&lt;p&gt;Instead of React's state management, we use a single &lt;code&gt;handleEvent()&lt;/code&gt; function that processes all WebSocket messages:&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="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;handleEvent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;switch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;type&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;status&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="k"&gt;case&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;message_start&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="k"&gt;case&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;message_token&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="k"&gt;case&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;message_end&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="k"&gt;case&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;agent_end&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="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;Each event updates the DOM directly. It's simple, fast, and easy to debug.&lt;/p&gt;

&lt;h3&gt;
  
  
  Message Queueing
&lt;/h3&gt;

&lt;p&gt;One of our favorite features: you can keep typing while Pi is still responding. The server sends queued messages to Pi with &lt;code&gt;streamingBehavior: "followUp"&lt;/code&gt;, and Pi processes them in order natively.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why No Framework?
&lt;/h3&gt;

&lt;p&gt;Honestly? Speed of development. We could make changes, refresh, and see results instantly. No hot reload to wait for, no bundle to rebuild, no component tree to reason about. Just HTML elements and event handlers.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Result
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;33KB total package size&lt;/li&gt;
&lt;li&gt;4 npm dependencies&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;npx wgnr-pi&lt;/code&gt; to install and run&lt;/li&gt;
&lt;li&gt;Full features: streaming, sessions, model picker, thinking levels, images, export&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Sometimes the best framework is no framework.&lt;/p&gt;

&lt;p&gt;GitHub: &lt;a href="https://github.com/wgnr-ai/wgnr-pi" rel="noopener noreferrer"&gt;https://github.com/wgnr-ai/wgnr-pi&lt;/a&gt;&lt;br&gt;
npm: &lt;a href="https://www.npmjs.com/package/wgnr-pi%60%60" rel="noopener noreferrer"&gt;https://www.npmjs.com/package/wgnr-pi``&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>opensource</category>
      <category>showdev</category>
    </item>
  </channel>
</rss>
