<?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: metataro</title>
    <description>The latest articles on DEV Community by metataro (@metataro).</description>
    <link>https://dev.to/metataro</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%2F4181017%2Fc5a2c2a5-dc6b-4fc5-a789-941233530f6f.jpg</url>
      <title>DEV Community: metataro</title>
      <link>https://dev.to/metataro</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/metataro"/>
    <language>en</language>
    <item>
      <title>Human-in-the-loop QA: let an AI agent run your test sheet on Android, iPhone, web and desktop — and sign off each case yourself</title>
      <dc:creator>metataro</dc:creator>
      <pubDate>Tue, 13 Oct 2026 11:51:34 +0000</pubDate>
      <link>https://dev.to/metataro/human-in-the-loop-qa-let-an-ai-agent-run-your-test-sheet-on-android-iphone-web-and-desktop-and-2dp0</link>
      <guid>https://dev.to/metataro/human-in-the-loop-qa-let-an-ai-agent-run-your-test-sheet-on-android-iphone-web-and-desktop-and-2dp0</guid>
      <description>&lt;p&gt;Most "AI testing" tools aim for the same promise: the AI runs everything and tells you it passed.&lt;br&gt;
When something ships broken anyway, "the AI said it passed" is not an answer anyone accepts. A person is accountable.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/meta-taro/git-qa" rel="noopener noreferrer"&gt;git-qa&lt;/a&gt; is an open-source &lt;strong&gt;human-in-the-loop QA runner&lt;/strong&gt; built around that fact.&lt;br&gt;
An AI agent works through your test sheet; you watch the live screen and sign off each case with one key.&lt;br&gt;
The evidence records who verified what.&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%2Fpoe53329up9xgyyj2hzh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fpoe53329up9xgyyj2hzh.png" alt="git-qa running a test sheet" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What it does
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Reads a test sheet&lt;/strong&gt; — a TSV you can write in any spreadsheet: step, expected result&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Drives the target&lt;/strong&gt; — Android devices and emulators (adb), web pages (Chrome, Edge, Firefox, Safari),
desktop apps on macOS and Windows, and iPhone / iPad (USB mirroring; tapping through WebDriverAgent)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Shows you the live screen&lt;/strong&gt; while it works, with a marker where it found the expected text&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lets you place the verdict with one key&lt;/strong&gt; — &lt;code&gt;D&lt;/code&gt; pass, &lt;code&gt;F&lt;/code&gt; fail&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keeps the evidence&lt;/strong&gt; — &lt;code&gt;run.json&lt;/code&gt; plus the screen at the moment of the verdict, per case&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The vocabulary is the point
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;VERIFIED&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;A person put their name on it&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;AUTO_PASS&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;The AI passed it. Nobody looked&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;FAIL&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;It failed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;BLOCKED&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Could not run&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;SKIP&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Not run&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A plain &lt;code&gt;PASS&lt;/code&gt; would merge the first two. That merge is exactly what git-qa exists to prevent.&lt;/p&gt;

&lt;h2&gt;
  
  
  Letting Claude Code test on a real device
&lt;/h2&gt;

&lt;p&gt;git-qa ships an MCP server. An agent such as Claude Code can take screenshots, read the screen,&lt;br&gt;
list what can be pressed and tap it — on Android, web, desktop or iPhone.&lt;br&gt;
You can run a sheet unattended overnight (&lt;code&gt;--no-ui&lt;/code&gt;) and review only the failures in the morning.&lt;br&gt;
&lt;strong&gt;The pass is still yours to give.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It also refuses sheets that verify nothing: if the expected text was already on screen before the step,&lt;br&gt;
the case is stopped as &lt;code&gt;BLOCKED&lt;/code&gt; with a note on how to fix the sheet.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Download from the &lt;a href="https://meta-taro.github.io/git-qa/" rel="noopener noreferrer"&gt;distribution page&lt;/a&gt; (macOS signed and notarized; Windows x64 / ARM64, unsigned) and install Node 22+&lt;/li&gt;
&lt;li&gt;Enter a handle, pick a device / URL / desktop app, pick a test sheet&lt;/li&gt;
&lt;li&gt;Start, watch, press &lt;code&gt;D&lt;/code&gt; / &lt;code&gt;F&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;It is beta and MIT-licensed. Bug reports and requests: &lt;a href="https://github.com/meta-taro/git-qa/issues" rel="noopener noreferrer"&gt;Issues&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>automation</category>
      <category>opensource</category>
      <category>testing</category>
    </item>
    <item>
      <title>Let Claude Code draw your architecture diagram — and keep the box you moved</title>
      <dc:creator>metataro</dc:creator>
      <pubDate>Tue, 13 Oct 2026 05:14:27 +0000</pubDate>
      <link>https://dev.to/metataro/let-claude-code-draw-your-architecture-diagram-and-keep-the-box-you-moved-1n9b</link>
      <guid>https://dev.to/metataro/let-claude-code-draw-your-architecture-diagram-and-keep-the-box-you-moved-1n9b</guid>
      <description>&lt;p&gt;Asking an AI to draw an architecture diagram works fine — the first time.&lt;/p&gt;

&lt;p&gt;The trouble starts with the second one. The architecture changes, you ask the AI to update the diagram, and the layout you spent ten minutes tidying is gone. So you stop asking. A month later the diagram is fiction.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;zumen&lt;/strong&gt; is an open-source diagram editor built around that second drawing.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffo5h0j65athkzqikiuhg.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffo5h0j65athkzqikiuhg.gif" alt="The AI draws; a person moves one box; the AI is asked again and adds a node; the moved box stays put" width="800" height="405"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The one idea: the AI may not write where you wrote
&lt;/h2&gt;

&lt;p&gt;A zumen diagram is one YAML file. The AI writes &lt;code&gt;nodes:&lt;/code&gt; and &lt;code&gt;edges:&lt;/code&gt;. When &lt;em&gt;you&lt;/em&gt; drag a box, the position goes into a separate &lt;code&gt;pins:&lt;/code&gt; block — and &lt;strong&gt;the AI is not allowed to write &lt;code&gt;pins:&lt;/code&gt;&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;nodes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;api&lt;/span&gt;
    &lt;span class="na"&gt;label&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Order API&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;db&lt;/span&gt;
    &lt;span class="na"&gt;label&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Order DB&lt;/span&gt;
&lt;span class="na"&gt;edges&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;from&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;api&lt;/span&gt;
    &lt;span class="na"&gt;to&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;db&lt;/span&gt;
&lt;span class="na"&gt;pins&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;db&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;position&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;x&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;40&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;y&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;170&lt;/span&gt; &lt;span class="pi"&gt;}&lt;/span&gt;   &lt;span class="c1"&gt;# you put it here; regeneration cannot move it&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Regenerate as often as you like: the AI rewrites the nodes and edges, your pins stay. Across 10 real AI round trips, every human edit survived; a pin survives regeneration in all 389 bundled example drawings.&lt;/p&gt;

&lt;h2&gt;
  
  
  Set it up in Claude Code
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claude mcp add zumen &lt;span class="nt"&gt;--&lt;/span&gt; npx &lt;span class="nt"&gt;-y&lt;/span&gt; @metataro/zumen-mcp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Other MCP clients: run &lt;code&gt;npx -y @metataro/zumen-mcp&lt;/code&gt; as a stdio server.&lt;/p&gt;

&lt;p&gt;The agent gets:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;zumen_spec&lt;/code&gt; — the format, read first&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;zumen_examples&lt;/code&gt; — 389 worked examples to learn the notation from&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;zumen_propose&lt;/code&gt; — a &lt;strong&gt;proposal&lt;/strong&gt;, shown to you as a diff. There is no tool that writes the file directly; a person presses apply&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;zumen_inspect&lt;/code&gt; — checks for crossings, overlapping boxes, labels that did not fit, lines of different colours running on top of each other&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;zumen_export&lt;/code&gt; — SVG, PNG, Mermaid, draw.io&lt;/li&gt;
&lt;/ul&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%2Fj1lno06z9guvt9u53h9c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fj1lno06z9guvt9u53h9c.png" alt="The desktop app showing an AI proposal as a diff, with Apply and Cancel" width="800" height="296"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Show what changed, to people who will never read YAML
&lt;/h2&gt;

&lt;p&gt;From a clone of the repository:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pnpm compare before.zumen.yaml after.zumen.yaml out.svg
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Before and after, side by side: new nodes marked, removed ones dotted, and the nodes a person placed marked on both sides — so a reviewer can see at a glance that the hand edits survived.&lt;/p&gt;

&lt;h2&gt;
  
  
  Not only boxes and arrows
&lt;/h2&gt;

&lt;p&gt;The same small set of primitives draws things most diagram tools never attempt: stage lighting plots in USITT RP-2 notation, pallet loading patterns in isometric (checked against the Japanese Industrial Standards), floor plans with door swings, periodontal charts, transit maps with parallel lines that don't hide each other. All 389 examples are in the &lt;a href="https://meta-taro.github.io/zumen/" rel="noopener noreferrer"&gt;gallery&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it is not
&lt;/h2&gt;

&lt;p&gt;Not a Figma replacement, not a general drawing program, not a web app or real-time collaboration tool. Editing features exist only as far as a person needs them to approve what the AI changed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/meta-taro/zumen" rel="noopener noreferrer"&gt;https://github.com/meta-taro/zumen&lt;/a&gt; (MIT)&lt;/li&gt;
&lt;li&gt;Gallery and docs: &lt;a href="https://meta-taro.github.io/zumen/" rel="noopener noreferrer"&gt;https://meta-taro.github.io/zumen/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;npm: &lt;code&gt;@metataro/zumen&lt;/code&gt; (library: YAML → SVG), &lt;code&gt;@metataro/zumen-mcp&lt;/code&gt; (MCP server)&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>mcp</category>
      <category>claudecode</category>
      <category>diagrams</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
