<?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: Yash Shah</title>
    <description>The latest articles on DEV Community by Yash Shah (@yashshah1211).</description>
    <link>https://dev.to/yashshah1211</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%2F4034911%2Ff955e8da-2e39-40a2-ad4f-a20fec4099cc.png</url>
      <title>DEV Community: Yash Shah</title>
      <link>https://dev.to/yashshah1211</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/yashshah1211"/>
    <language>en</language>
    <item>
      <title>When Our AI Agent Said Committed Before It Had Executed Anything</title>
      <dc:creator>Yash Shah</dc:creator>
      <pubDate>Thu, 05 Nov 2026 10:31:28 +0000</pubDate>
      <link>https://dev.to/yashshah1211/when-our-ai-agent-said-committed-before-it-had-executed-anything-21b2</link>
      <guid>https://dev.to/yashshah1211/when-our-ai-agent-said-committed-before-it-had-executed-anything-21b2</guid>
      <description>&lt;p&gt;How we built CASCADE with Switch, Google Antigravity ACP, and Mattermost—and why human approval needs more than a chatbot saying “done.”&lt;br&gt;
During the Flip the Switch 2026 hackathon, our agent confidently reported:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Authorization Confirmed — Plan B Approved. Status: ACTIVE / COMMITTED.&lt;/strong&gt;&lt;br&gt;
Then the turn failed.&lt;br&gt;
The organizer had genuinely approved the plan. But the agent didn't yet have the execution operation it needed. Instead, it tried looking through directories on the developer's machine and one tool call failed. The message sounded like a completed recovery, even though the engine hadn't completed it.&lt;br&gt;
That gap—between what an AI says, what a human authorizes, and what code actually does—became the central lesson of our project.&lt;br&gt;
We built CASCADE, the Commitment Recovery Engine, to make that gap visible. Through Switch, a Google Antigravity ACP agent collaborates with an organizer inside Mattermost. A deterministic TypeScript engine checks recovery plans. A human approves the precise budget exception. A receipt describes what was actually applied locally.&lt;br&gt;
Watch the actual three-minute CASCADE walkthrough: real Mattermost messages, human approval, local execution receipt, and clearly labeled explanatory visuals.&lt;br&gt;
  &lt;iframe src="https://www.youtube.com/embed/Q33BVLvCgTA" width="710" height="399"&gt;
  &lt;/iframe&gt;
&lt;br&gt;
&lt;strong&gt;Scope:&lt;/strong&gt; Our 430-person event is fictional and the recovery data is synthetic. The local code and authenticated team-chat workflow were demonstrated. No real venue was booked, supplier paid, or attendee notified.&lt;br&gt;
One cancelled auditorium. Seven commitments at risk.&lt;br&gt;
The scenario was simple to understand and surprisingly hard to satisfy.&lt;br&gt;
A 430-person hackathon loses its main auditorium. The organizer still owes attendees and sponsors a synchronized 10:00 a.m. kickoff, accessible replacement spaces, sufficient AV coverage, sponsor timing, keynote delivery, and budget discipline. The committed budget is ₹80,000.&lt;br&gt;
Rather than asking the language model to invent a solution, CASCADE represents the resource dependencies and evaluates explicit candidate plans against those promises.&lt;br&gt;
Recovery option Verdict Why&lt;br&gt;
Plan A: Two halls, existing equipment   FAIL    Both halls need AV at the same time, but only one kit is available&lt;br&gt;
Plan B: Two halls, rent one more AV kit REQUIRES_APPROVAL   Hard commitments pass; projected cost rises to ₹83,000&lt;br&gt;
Plan C: Sequential opening waves    FAIL    Participants no longer share the promised 10:00 kickoff&lt;br&gt;
Plan B allocates 250 attendees to Hall A and 180 to Hall B, both from 10:00–10:45. The second AV kit costs an extra ₹3,000.&lt;br&gt;
The deterministic engine identifies this synthetic plan as feasible under its encoded constraints. It should not decide on its own that the extra spending is authorized.&lt;br&gt;
Where Switch fits—and why it wasn't just a chat wrapper&lt;br&gt;
Switch links an existing AI agent to the same room where a human team works. We used the bundled Mattermost service and a Google Antigravity ACP runtime on Windows.&lt;br&gt;
Our workflow looked like this:&lt;br&gt;
&lt;/p&gt;


&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Organizer reports disruption in Mattermost
                |
                v
        Switch shared room
                |
                v
      Antigravity ACP agent
                |
                v
   Registered CASCADE operations
                |
                v
     Deterministic TypeScript CLI
                |
                v
  Plan A FAIL / Plan B APPROVAL / Plan C FAIL
                |
                v
       Owner approves Plan B
                |
                v
 Authenticated message verification
                |
                v
    Local artifacts + receipt
                |
                v
       Back in the team room
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The offline engine can evaluate fixtures without Switch. But the shared human–agent decision workflow—incident reporting, agent tool calls, room-bound approval, and a visible outcome—is what Switch adds.&lt;br&gt;
The distinction matters. A chatbot responding “approved” is not a substitute for authenticated human authorization or a completed tool call.&lt;br&gt;
How to try the reproducible part yourself&lt;br&gt;
For someone new to Switch, I recommend first testing your actual task without an agent. That makes later debugging much easier.&lt;br&gt;
CASCADE's offline engine requires Node.js 20+ (22 recommended), npm, and Git:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/yashshah1211/cascade.git
&lt;span class="nb"&gt;cd &lt;/span&gt;cascade
npm &lt;span class="nb"&gt;install
&lt;/span&gt;npm &lt;span class="nb"&gt;test
&lt;/span&gt;npm run demo
npm run inspect
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;demo&lt;/code&gt; command evaluates the synthetic incident; &lt;code&gt;inspect&lt;/code&gt; shows the deterministic model output. To browse it in a local, read-only UI:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm run dashboard
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Open &lt;code&gt;http://127.0.0.1:4173&lt;/code&gt;.&lt;br&gt;
This dashboard is an offline fixture explorer, not a connected Switch interface. Its &lt;code&gt;OFFLINE_SIMULATION&lt;/code&gt; labels refer to that read-only data source.&lt;br&gt;
Next, open the Switch integration guide. The live version requires Switch Console, its Mattermost and database services, a compatible authenticated ACP agent, and credentials specific to your own environment. It cannot be recreated from GitHub Actions alone.&lt;br&gt;
Connecting the agent and tools&lt;br&gt;
Our first connection test was intentionally small: mention the configured agent in the Mattermost team room, ask for a fixed acknowledgement, and confirm that it replies through Switch. Only after that do we test an actual executable tool call.&lt;br&gt;
CASCADE registered two custom Switch operations:&lt;br&gt;
&lt;code&gt;cascade_evaluate_recovery&lt;/code&gt; invokes the deterministic plan evaluator.&lt;br&gt;
&lt;code&gt;cascade_execute_recovery&lt;/code&gt; processes a real approved message ID and performs the bounded local recovery.&lt;br&gt;
Our integration used a reversible patch to a particular installed Switch Core Python operations file. It is not an official upstream Switch extension, and other versions can need adaptation. We added a setup script with an explicit target path, dry-run, backup, and rollback instead of copying arbitrary code into vendor files:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;npm&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;run&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;build&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;python&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;scripts/setup-switch-operations.py&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;--target&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"PATH\TO\SWITCH\definitions.py"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;--dry-run&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;python&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;scripts/setup-switch-operations.py&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;--target&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"PATH\TO\SWITCH\definitions.py"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Use the path from your own installation and review the dry-run before modifying anything. Restart the relevant service and inspect the real tool invocation rather than assuming the agent saw the new operation. See the README for the full configuration, limitations, and rollback notes.&lt;br&gt;
A practical troubleshooting lesson&lt;br&gt;
A working Switch Console window doesn't guarantee that Mattermost is healthy. During our Windows demo preparation, Mattermost refused connections because its backing local PostgreSQL service was unavailable. We restored the original services and preserved the conversation instead of resetting Docker volumes or creating a fresh room.&lt;br&gt;
Debug in layers: database → Mattermost → Switch room → agent session → registered tool → actual CLI result. Don't treat an agent reply as proof that every layer works.&lt;br&gt;
Our first failure: the AI invented believable details&lt;br&gt;
The first plausible-looking report suggested a 220/210 attendee allocation. But the real engine fixture used 250/180. It also characterized Plan A as a simple capacity problem, whereas the deterministic constraint failure was concurrent AV.&lt;br&gt;
The model had reasoned from its context rather than running the engine.&lt;br&gt;
We looked for the actual Switch tool invocation, connected the evaluation operation, and checked the CLI output. The corrected report showed the real constraints.&lt;br&gt;
Lesson 1: A plausible answer is not evidence that the tool ran.&lt;br&gt;
Our second failure: approval was mistaken for execution&lt;br&gt;
Plan B exceeded the budget by ₹3,000. We intentionally required the designated human owner to type a specific command into the team room:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CASCADE APPROVE &amp;lt;PLAN_HASH&amp;gt; MAX_EXTRA_INR 3000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is not a digital signature: the SHA-256 plan hash identifies the exact plan content. The Mattermost server supplies authenticated information about the actual author and message. CASCADE checks the account ID, expected server and room, human rather than bot/webhook authorship, timestamp, plan hash, and approved amount.&lt;br&gt;
The human's real approval message is visible in the demo video. It binds the exact recovery plan hash to a maximum extra spend of INR 3,000.&lt;br&gt;
Then came the “ACTIVE / COMMITTED” message. The agent had seen genuine approval but did not have the recovery execution operation available. One failed tool turn later, we learned to separate permission to execute from evidence of execution.&lt;br&gt;
We added a constrained &lt;code&gt;cascade_execute_recovery&lt;/code&gt; operation that targets the real recovery CLI and propagates failures. The first successful local application used the verified recovery CLI. Later, an Antigravity-initiated Switch tool call checked the same already-applied result and reported &lt;code&gt;Already Applied: true&lt;/code&gt; without posting another receipt.&lt;br&gt;
That later operation was an idempotent replay, not the original artifact creation. We don't pretend otherwise.&lt;br&gt;
Lesson 2: Human approval is a prerequisite. A verified receipt is the result.&lt;br&gt;
What the recovery actually produced&lt;br&gt;
The successful local execution generated:&lt;br&gt;
File    Meaning&lt;br&gt;
&lt;code&gt;schedule.json&lt;/code&gt;    250/180 hall allocations, synchronized kickoff and projected ₹83,000&lt;br&gt;
&lt;code&gt;assignments.json&lt;/code&gt; All 430 attendees assigned with no gaps or overlap&lt;br&gt;
&lt;code&gt;stakeholder-messages.md&lt;/code&gt;  Communication drafts only — not sent&lt;br&gt;
&lt;code&gt;receipt.json&lt;/code&gt; Verified plan hash, approval reference and state &lt;code&gt;APPLIED_LOCALLY&lt;/code&gt;&lt;br&gt;
The actual bot-authored receipt appears in the demo video, with the plan ID, verification reference, and &lt;code&gt;APPLIED_LOCALLY&lt;/code&gt; execution state.&lt;br&gt;
The execution code validates existing artifacts on retry and avoids duplicating the published receipt.&lt;br&gt;
&lt;code&gt;APPLIED_LOCALLY&lt;/code&gt; means exactly that: local files exist. It is not a venue booking, transaction, or notification. In a real deployment, those external actions would require separately designed integrations and explicit authorization.&lt;br&gt;
What I liked about Switch—and what I'd improve&lt;br&gt;
Switch's most useful property was allowing an existing agent to work inside the team's actual decision context. Human instructions, permission prompts, evaluation reports, and receipts were visible to the same people.&lt;br&gt;
The rough edges were equally instructive:&lt;br&gt;
A supported custom-tool SDK would be safer and easier to reproduce than a version-specific operations-file patch.&lt;br&gt;
First-class tool-result provenance would make it harder for an agent to say “completed” without a completed operation.&lt;br&gt;
Scoped permissions would reduce repetitive approval prompts for safe read-only tasks while preserving strong gates for higher-impact actions.&lt;br&gt;
Local service health diagnostics should make database, Mattermost, gateway, and agent failures easier to distinguish.&lt;br&gt;
A structured decision timeline could link incident → evaluation → human approval → execution receipt without a manual investigation.&lt;br&gt;
These aren't hypothetical complaints; each one came from building or debugging this exact workflow.&lt;br&gt;
The principle I'll carry into my next agent project&lt;br&gt;
Start with one reproducible task. Connect one agent to one shared room. Give it a real tool with explicit inputs. Make human decisions genuinely human. Require a receipt that says what the software actually did, and make retries safe.&lt;br&gt;
The most interesting question for workflow automation isn't merely “What task happens next?” It's “Which promises must remain true, and who is allowed to change them?”&lt;br&gt;
That's the idea behind CASCADE.&lt;br&gt;
The agent coordinates. The engine checks. The human authorizes. Switch keeps the team together.&lt;br&gt;
And after our agent confidently declared a plan committed before running it, that separation is exactly what I want from AI workflows.&lt;/p&gt;




&lt;h3&gt;
  
  
  Explore CASCADE
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;💻 Source code:&lt;/strong&gt; &lt;a href="https://github.com/yashshah1211/cascade" rel="noopener noreferrer"&gt;View CASCADE on GitHub&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🎬 Demo video:&lt;/strong&gt; &lt;a href="https://youtu.be/Q33BVLvCgTA" rel="noopener noreferrer"&gt;Watch the full CASCADE demonstration on YouTube&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🏆 Hackathon:&lt;/strong&gt; &lt;a href="https://www.wemakedevs.org/hackathons/switch" rel="noopener noreferrer"&gt;Flip the Switch 2026&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Direct links:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;GitHub: &lt;a href="https://github.com/yashshah1211/cascade" rel="noopener noreferrer"&gt;https://github.com/yashshah1211/cascade&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;YouTube: &lt;a href="https://youtu.be/Q33BVLvCgTA" rel="noopener noreferrer"&gt;https://youtu.be/Q33BVLvCgTA&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;All people, venue, budget and event details in the scenario are synthetic. The Mattermost approval/receipt screenshots are from a genuine local demo; private local services are not publicly accessible.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>showdev</category>
      <category>opensource</category>
      <category>hackathon</category>
    </item>
    <item>
      <title>I built HackerMate because finding a hackathon team still sucks in 2026</title>
      <dc:creator>Yash Shah</dc:creator>
      <pubDate>Sat, 18 Jul 2026 08:26:09 +0000</pubDate>
      <link>https://dev.to/yashshah1211/i-built-hackermate-because-finding-a-hackathon-team-still-sucks-in-2026-2oh2</link>
      <guid>https://dev.to/yashshah1211/i-built-hackermate-because-finding-a-hackathon-team-still-sucks-in-2026-2oh2</guid>
      <description>&lt;p&gt;If you've ever hacked solo because you couldn't find teammates in time, or ended up in a mismatched team because Discord servers move too fast to actually vet anyone — this one's for you.&lt;br&gt;
I've been building HackerMate, a full-stack platform designed to fix the two most painful parts of hackathons:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Before the hackathon: finding the right team
Instead of scrolling through chaotic Discord/WhatsApp threads, HackerMate lets you:&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Browse and create teams&lt;br&gt;
Search for teammates by skill, role, or college&lt;br&gt;
Apply to join a team or invite people directly&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;During the hackathon: actually staying organized
Once your team is formed, HackerMate becomes your mini project OS:&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Task management&lt;br&gt;
Daily standups&lt;br&gt;
A shared project board&lt;/p&gt;

&lt;p&gt;The stack:&lt;/p&gt;

&lt;p&gt;Next.js (App Router)&lt;br&gt;
Supabase for auth + database&lt;br&gt;
Tailwind CSS with a custom dark design system&lt;br&gt;
TypeScript throughout&lt;/p&gt;

&lt;p&gt;It started life as "HackOS" before I rebranded, and it's now live at hackermate.in. Right now it has ~35 early users, mostly friends and people from my network — which has been super useful for feedback, but I'm now trying to get real hackathon teams using it in the wild.&lt;br&gt;
If you're participating in any upcoming hackathons, I'd genuinely love for you to try forming a team on HackerMate and tell me what breaks. Feedback — good or brutal — welcome in the comments.&lt;br&gt;
What's the most annoying part of finding a hackathon team for you?&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>buildinpublic</category>
      <category>opensource</category>
      <category>nextjs</category>
    </item>
  </channel>
</rss>
