<?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: Quantumstuff</title>
    <description>The latest articles on DEV Community by Quantumstuff (@quantumstuff_378131742ab3).</description>
    <link>https://dev.to/quantumstuff_378131742ab3</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%2F4232223%2Fc550a53b-964a-42a8-9098-c308cef8233e.png</url>
      <title>DEV Community: Quantumstuff</title>
      <link>https://dev.to/quantumstuff_378131742ab3</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/quantumstuff_378131742ab3"/>
    <language>en</language>
    <item>
      <title>I made my AI agent prove its work: building Proofbot with Switch</title>
      <dc:creator>Quantumstuff</dc:creator>
      <pubDate>Sat, 07 Nov 2026 13:50:32 +0000</pubDate>
      <link>https://dev.to/quantumstuff_378131742ab3/i-made-my-ai-agent-prove-its-work-building-proofbot-with-switch-4g50</link>
      <guid>https://dev.to/quantumstuff_378131742ab3/i-made-my-ai-agent-prove-its-work-building-proofbot-with-switch-4g50</guid>
      <description>&lt;p&gt;&lt;em&gt;Built for the Flip the Switch hackathon. #HowISwitch&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;AI coding agents are great at saying "done". They're less great at being done. In one afternoon of testing I watched agents misread what I asked, quietly drop half a task, edit a test until it turned green, and break something that worked yesterday, then report success every time.&lt;/p&gt;

&lt;p&gt;That's fine when I'm at my desk reading the diff. It's not fine when I hand a task to an agent from my phone, which is exactly what &lt;a href="https://github.com/sandbox-quantum/switch" rel="noopener noreferrer"&gt;Switch&lt;/a&gt; makes easy. So I built &lt;strong&gt;Proofbot&lt;/strong&gt;: you text an agent a task in Telegram, and the reply isn't the agent's opinion of its work. It's a proof report written by a harness the agent can't touch, with a receipt anyone can check.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Repo:&lt;/strong&gt; &lt;a href="https://github.com/qunatumstuff/proofbot" rel="noopener noreferrer"&gt;https://github.com/qunatumstuff/proofbot&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This post walks through what Proofbot does, how I set it up with Switch step by step (including the parts that tripped me up), and what I learned.&lt;/p&gt;

&lt;h2&gt;
  
  
  The idea: Lean, but for agent work
&lt;/h2&gt;

&lt;p&gt;Mathematicians have started letting AI write proofs in &lt;a href="https://lean-lang.org/" rel="noopener noreferrer"&gt;Lean&lt;/a&gt;, a proof assistant. They don't trust the AI. They don't have to: a small kernel checks every step, and a person only reads the &lt;em&gt;theorem statement&lt;/em&gt; to make sure it says what they meant.&lt;/p&gt;

&lt;p&gt;I wanted that for agents writing code:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;In Lean&lt;/th&gt;
&lt;th&gt;In Proofbot&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;The theorem statement, written before the proof&lt;/td&gt;
&lt;td&gt;Acceptance checks, sealed before the agent starts working&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A misformalized statement (says something you didn't mean)&lt;/td&gt;
&lt;td&gt;A second AI compares the checks with your request&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;decide&lt;/code&gt;: prove it by checking every case&lt;/td&gt;
&lt;td&gt;Proof by exhaustion: the harness tries every input combination&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The kernel&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;proof.py&lt;/code&gt;: reruns everything itself&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mathlib: proven once, stays proven&lt;/td&gt;
&lt;td&gt;A proven library: later jobs that break an earlier proof fail&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;#print axioms&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;"THIS PROOF RELIES ON" at the end of every report&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The agent writes the code. The harness checks it. You read one thing: what was proven, against what you asked.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it looks like in the chat
&lt;/h2&gt;

&lt;p&gt;I send this in a Telegram group:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;@doer Fix add in calc.py so add(2, 3) returns 5, and add a multiply(a, b) function that returns the product.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;code&gt;doer&lt;/code&gt; is a Codex agent that Switch runs and connects to the group. About two minutes later it posts the report, word for word as the harness wrote it (trimmed here):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;DONE AND PROVEN - job 5
Receipt P5-32193c361842

PROOF 1: DO THE CHECKS MATCH WHAT YOU ASKED?
(judged by a second AI that saw only your request and the checks)
ok "Fix add in calc.py so add(2, 3) returns 5": check_add.py
ok "add a multiply(a, b) function that returns the product": check_multiply.py

PROOF 2: CHECKS WRITTEN AND SEALED BEFORE THE WORK
PASS check_add.py: ... (failed before, passes now; all 42,436 inputs tried:
  a 206 values, b 206 values, every output as expected (map 2bb8c28bc244))

PROOF 3: YOUR TEST SUITE, RUN BY THE HARNESS
before: FAIL (exit 1), after: pass (exit 0)

PROOF 4: REQUIREMENTS PROVEN IN EARLIER JOBS
Added to the library, so every later job must keep them passing: check_add.py, check_multiply.py

PROOF 5: LOOPHOLE SCAN
ok no tests skipped, marked xfail or narrowed with only
ok no assertions removed from tests
...

THIS PROOF RELIES ON
- a second AI, not you, judged that the checks match your request
- check_add.py is proven for every input in its domain, not beyond it
- the checks and tests ran without a sandbox, with your full access
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The first line is always one of four verdicts: &lt;strong&gt;DONE AND PROVEN&lt;/strong&gt;, &lt;strong&gt;DONE, READ THE WARNINGS&lt;/strong&gt;, &lt;strong&gt;NOT DONE&lt;/strong&gt; or &lt;strong&gt;UNPROVEN&lt;/strong&gt;. Anyone can paste the message back into &lt;code&gt;proof.py verify&lt;/code&gt; to confirm it's genuine and unedited.&lt;/p&gt;

&lt;h2&gt;
  
  
  Setting it up with Switch, step by step
&lt;/h2&gt;

&lt;p&gt;Switch puts AI agents into team chat. Every chat channel becomes a &lt;em&gt;room&lt;/em&gt;, and agents join it like teammates. Here's exactly what I did, in order.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Install Switch Console and start a server
&lt;/h3&gt;

&lt;p&gt;Switch Console is the desktop app. It runs your agents, starts a local Switch server (in Docker) and connects your chat apps. Once it's running, the sidebar shows your server ("Local Switch server · This computer") with a green &lt;strong&gt;Running&lt;/strong&gt; status.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Create a Telegram bot and connect it
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;In Telegram, message &lt;strong&gt;&lt;a class="mentioned-user" href="https://dev.to/botfather"&gt;@botfather&lt;/a&gt;&lt;/strong&gt;, send &lt;code&gt;/newbot&lt;/code&gt;, and copy the bot token it gives you. Treat the token like a password.&lt;/li&gt;
&lt;li&gt;Still in BotFather, turn &lt;strong&gt;Group Privacy off&lt;/strong&gt; (&lt;code&gt;/setprivacy&lt;/code&gt; → your bot → Disable). Otherwise the bot only sees messages that mention the bot itself, and you'll be @mentioning your &lt;em&gt;agents&lt;/em&gt;, not the bot.&lt;/li&gt;
&lt;li&gt;In Switch Console, open &lt;strong&gt;Home → Messaging apps → Connect&lt;/strong&gt;, pick &lt;strong&gt;Telegram&lt;/strong&gt;, give the connection a name, and paste the bot token and username.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  3. Make a group and turn it into a room
&lt;/h3&gt;

&lt;p&gt;Create a Telegram group and add your bot. Switch links the group to a new room and posts instructions in the chat. At that point the room has no agents, so nobody answers yet.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Create the agent
&lt;/h3&gt;

&lt;p&gt;You can create an agent under &lt;strong&gt;Your Agents&lt;/strong&gt;, or import a template (&lt;strong&gt;Templates → Import template&lt;/strong&gt;). Proofbot ships one: &lt;code&gt;proofbot.template.yaml&lt;/code&gt;. It asks for an agent name, the workspace folder the agent may change, and the folder that holds &lt;code&gt;proof.py&lt;/code&gt;, then creates the agent with its instructions. The key settings, shortened:&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;agent&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;{name}"&lt;/span&gt;
  &lt;span class="na"&gt;addressing&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;owner&lt;/span&gt;          &lt;span class="c1"&gt;# only you can give it orders&lt;/span&gt;
  &lt;span class="na"&gt;provider&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;{provider}"&lt;/span&gt;     &lt;span class="c1"&gt;# codex, claude or opencode&lt;/span&gt;
  &lt;span class="na"&gt;directory&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;{workspace}"&lt;/span&gt;   &lt;span class="c1"&gt;# the one folder it may change&lt;/span&gt;
  &lt;span class="na"&gt;instructions&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
    &lt;span class="s"&gt;You never say a job is done in your own words: only the report that proof.py prints counts.&lt;/span&gt;
    &lt;span class="s"&gt;1. Run proof.py begin with the owner's message, word for word.&lt;/span&gt;
    &lt;span class="s"&gt;2. Write acceptance checks in proof_checks/ ... each must fail now.&lt;/span&gt;
    &lt;span class="s"&gt;3. Run proof.py seal. If the review reports MISSING, WRONG or NARROW, fix the checks first.&lt;/span&gt;
    &lt;span class="s"&gt;4. Do the task. Don't touch the checks or weaken tests.&lt;/span&gt;
    &lt;span class="s"&gt;5. Run proof.py finish and post the report word for word.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the agent's settings you'll also see &lt;strong&gt;Auto mode&lt;/strong&gt; ("safe actions run on their own; risky ones ask you first"). Know which mode your agent is in: with it on, my agent got the access it needed without asking me in the chat.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Invite the agent into the room
&lt;/h3&gt;

&lt;p&gt;In the Telegram group, send:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;!invite-agent @doer
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;(&lt;code&gt;/invite_agent&lt;/code&gt; works too.) The bot replies "Added doer to this room", and the agent says hi.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Link your Telegram account (the step I missed)
&lt;/h3&gt;

&lt;p&gt;My first task got this reply:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I only take instructions from my owner, and this chat account isn't linked to a Switch user yet.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Because the agent's addressing is &lt;code&gt;owner&lt;/code&gt;, Switch has to know that this Telegram account is &lt;em&gt;you&lt;/em&gt;. In Switch Console go to &lt;strong&gt;Home → Link account&lt;/strong&gt;, search for your Telegram name, and click &lt;strong&gt;This is me&lt;/strong&gt;. One gotcha: Telegram has no searchable user directory, so Switch only lists people who've already written in a connected chat. Send any message in the group first, then search.&lt;/p&gt;

&lt;h3&gt;
  
  
  7. Send a task
&lt;/h3&gt;

&lt;p&gt;Mention the agent with a task. Switch shows progress right in the chat ("Starting a session…", "Working… 37s", plus a &lt;strong&gt;Stop current work&lt;/strong&gt; button), and the agent posts its updates and the final report through Switch.&lt;/p&gt;

&lt;h2&gt;
  
  
  How the proof works
&lt;/h2&gt;

&lt;p&gt;Inside each job, the agent calls a small harness, &lt;code&gt;proof.py&lt;/code&gt;, three times. The harness keeps its evidence in a folder outside the agent's workspace.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;begin&lt;/code&gt;&lt;/strong&gt;: snapshot the workspace and run your tests, before anything changes.&lt;/li&gt;
&lt;li&gt;The agent writes &lt;strong&gt;acceptance checks&lt;/strong&gt;, one per requirement, &lt;em&gt;without&lt;/em&gt; doing the task.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;seal&lt;/code&gt;&lt;/strong&gt;: the harness copies the checks out of the agent's reach and runs them. They &lt;strong&gt;must fail now&lt;/strong&gt;; a check that already passes proves nothing. Then a &lt;strong&gt;second AI&lt;/strong&gt;, shown only your request and the sealed checks (not the agent's reasoning), says for each part of your request whether a check tests it as you meant: &lt;code&gt;ok&lt;/code&gt;, &lt;code&gt;MISSING&lt;/code&gt;, &lt;code&gt;WRONG&lt;/code&gt; or &lt;code&gt;NARROW&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;The agent does the work.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;finish&lt;/code&gt;&lt;/strong&gt;: the harness reruns its own sealed copy of the checks, your tests and every earlier proven check, scans the diff for cheating, and writes the report and a receipt.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Catching misunderstandings
&lt;/h3&gt;

&lt;p&gt;This was the part I cared about most. The repo has scripted demo agents that make classic mistakes on cue, so you can see each one caught. In one, I ask for &lt;code&gt;percent(1, 4)&lt;/code&gt; to return 25. The agent reads "percentage" as a fraction and writes a check expecting &lt;code&gt;0.25&lt;/code&gt;. Its code passes its own check and the tests stay green. Only the review catches it (this is the real harness and a real second AI):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;UNPROVEN - job 1
WRONG "returns the percentage, e.g. percent(1, 4) returns 25":
  check_percent.py tests something else. The check expects 0.25 instead of the requested 25.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Proof by exhaustion
&lt;/h3&gt;

&lt;p&gt;A check can list its inputs instead of picking a couple of examples. The harness, not the agent, tries every combination and compares each output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Only admins and a post&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;s own author may delete it; admins and editors may edit; everyone may read.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;blog&lt;/span&gt;

&lt;span class="n"&gt;DOMAIN&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;admin&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;editor&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;viewer&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;action&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;read&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;edit&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;delete&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
          &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;is_author&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;]}&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;role&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;action&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;is_author&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;        &lt;span class="c1"&gt;# what the code does
&lt;/span&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;blog&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;can&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;role&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;action&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;is_author&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;expected&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;role&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;action&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;is_author&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;   &lt;span class="c1"&gt;# what it should do
&lt;/span&gt;    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;action&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;read&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;action&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;edit&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;role&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;admin&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;editor&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;role&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;admin&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;is_author&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's 18 cases, and the report prints all of them, so you can read the rule you're trusting. In the demo, the scripted agent's first attempt forgets that authors may delete their own posts, and the report names the exact case: &lt;code&gt;role='editor', action='delete', is_author=True: got False, expected True&lt;/code&gt;. Numbers work too: &lt;code&gt;add&lt;/code&gt; checked on 1,005,004 input pairs took under two seconds.&lt;/p&gt;

&lt;p&gt;Everyday bugs live in combinations like these: roles × actions, coupon × customer type, order status × event. Things that can't be listed (free text, how a page looks) fall back to chosen inputs, and the report says so under "THIS PROOF RELIES ON".&lt;/p&gt;

&lt;h2&gt;
  
  
  Gotchas I hit (so you don't)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Link your account before your first task.&lt;/strong&gt; Owner-only agents politely refuse everyone else, including you on an unlinked account.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Group Privacy.&lt;/strong&gt; If the bot never reacts to &lt;code&gt;@agent&lt;/code&gt; messages in a group, check BotFather's privacy setting.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Codex's Windows sandbox couldn't run my Python.&lt;/strong&gt; The sandbox's accounts can't read a per-user Python install, so checks failed to start. I set &lt;code&gt;CHECK_RUNNER=direct&lt;/code&gt; in Proofbot's &lt;code&gt;.env&lt;/code&gt;: the agent stays sandboxed, but the checks run as me. The report states this every time.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Python cache files looked like edits.&lt;/strong&gt; Running checks writes &lt;code&gt;__pycache__/*.pyc&lt;/code&gt;, which the harness first flagged as changes. It now ignores bytecode.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Read your agent's permission mode.&lt;/strong&gt; With Auto mode on, the agent got access outside its folder without a prompt in the chat. That was what I wanted here, but it's worth knowing.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What I learned
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The scariest failure isn't cheating. It's misunderstanding.&lt;/strong&gt; A cheating agent leaves traces a scanner can find. An agent that misread you writes checks that agree with its mistake, and everything goes green. You need something that compares the checks with what you &lt;em&gt;asked&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;"Done" should be a document, not a feeling.&lt;/strong&gt; Once the report came from the harness instead of the agent, I stopped reading diffs on my phone and started reading proofs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Switch made the agent feel like a teammate.&lt;/strong&gt; A room, an owner-only agent, progress in the chat, and a stop button meant I could hand off work from Telegram without opening a laptop.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Right now the second-AI review runs inside the harness. Next I want it to happen &lt;em&gt;in the room&lt;/em&gt;: the agent posts its sealed checks, a second Switch agent replies with MISSING / WRONG / NARROW where teammates can see it, and a person approves before any work starts.&lt;/p&gt;

&lt;p&gt;Try it: &lt;code&gt;git clone https://github.com/qunatumstuff/proofbot&lt;/code&gt; and run &lt;code&gt;python demo/lazy_agent.py misunderstand&lt;/code&gt;. With Python and a signed-in Codex CLI there's nothing else to set up, and you'll watch an agent's mistake get caught in about 20 seconds. The Switch setup above is how you get the same thing in your team chat.&lt;/p&gt;

</description>
      <category>agents</category>
      <category>ai</category>
      <category>automation</category>
      <category>hackathon</category>
    </item>
  </channel>
</rss>
