<?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: Golla Satvik Kumar</title>
    <description>The latest articles on DEV Community by Golla Satvik Kumar (@satvik8954).</description>
    <link>https://dev.to/satvik8954</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%2F4101332%2F27d8c46f-e8a1-4e4c-bb82-6c9c20d54dec.png</url>
      <title>DEV Community: Golla Satvik Kumar</title>
      <link>https://dev.to/satvik8954</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/satvik8954"/>
    <language>en</language>
    <item>
      <title>Building Data Watchdog: A Two-Gate Approval Agent on TrueForge</title>
      <dc:creator>Golla Satvik Kumar</dc:creator>
      <pubDate>Sun, 30 Aug 2026 11:51:38 +0000</pubDate>
      <link>https://dev.to/satvik8954/building-data-watchdog-a-two-gate-approval-agent-on-trueforge-3aoe</link>
      <guid>https://dev.to/satvik8954/building-data-watchdog-a-two-gate-approval-agent-on-trueforge-3aoe</guid>
      <description>&lt;p&gt;I went into the WeMakeDevs Agent Harness Hackathon wanting to build something using TrueForge's approval-gate system properly — not just have a model promise to "ask before doing things," but actually have the harness enforce that pause. Here's how it went, dead ends included.&lt;/p&gt;

&lt;p&gt;Starting point: the Approval-Gated Assistant&lt;/p&gt;

&lt;p&gt;The hackathon's example ideas list a simple starting point: an agent that drafts something (an email, a ticket) and pauses before doing anything irreversible. I picked Gmail as the connected tool, since I already had an account.&lt;/p&gt;

&lt;p&gt;That turned out to be the first wall. Gmail's MCP server requires a Google Cloud OAuth Client set up on the developer side, and even after wiring up the OAuth consent screen, scopes, and redirect URI, TrueForge's connector kept failing with a DCR (Dynamic Client Registration) error — Gmail's MCP endpoint doesn't support DCR, and TrueForge's UI only offered sign-in via DCR, not manual Client ID/Secret entry. After a few rounds of trying to force it, I switched to GitHub instead — a built-in catalog connector, header-auth based, and much simpler to wire up with a personal access token.&lt;/p&gt;

&lt;p&gt;Getting the approval gate to actually work&lt;/p&gt;

&lt;p&gt;The UI doesn't expose a "require approval" toggle per tool — that setting only exists at the API level, in the agent manifest:&lt;/p&gt;

&lt;p&gt;json&lt;br&gt;
"mcp_servers": [&lt;br&gt;
  {&lt;br&gt;
    "name": "github",&lt;br&gt;
    "enable_tools": ["@all"],&lt;br&gt;
    "require_approval_for_tools": ["issue_write"]&lt;br&gt;
  }&lt;br&gt;
]&lt;/p&gt;

&lt;p&gt;Once I set this via a direct PUT /api/v1/agents/ call, the harness genuinely paused before creating a GitHub issue — showing the raw tool-call request and an Allow/Deny button. That was the moment the project started feeling like a real approval-gated agent rather than a polite prompt.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Wanting more: trying an Analytics Agent&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;With the certificate basically secured, I decided to push for an actual competitive submission and picked the Analytics Agent idea — natural language question → SQL → execution → explanation.&lt;/p&gt;

&lt;p&gt;This meant enabling TrueForge's sandbox, which currently only supports Daytona as a provider. I hit another wall here: Daytona rejected my API key from inside TrueForge, even though the same credentials worked fine locally on my own machine — never fully resolved why.&lt;/p&gt;

&lt;p&gt;Rather than keep debugging an external dependency close to deadline, I built a small custom MCP server in Python (using the mcp SDK) that exposes a run_sql tool directly over a local SQLite database (the Chinook sample dataset — a music store with customers, invoices, and genres). This sidestepped Daytona entirely, reused the same header-auth-free custom-connector pattern TrueForge supports, and got me a working SQL tool in under 20 minutes once the direction was clear.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The idea that tied it together: Data Watchdog&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Rather than treat the GitHub agent and the analytics agent as two separate, generic submissions, I combined them into one agent with two independent approval gates and real branching logic:&lt;/p&gt;

&lt;p&gt;Agent proposes a SQL query against the database → pauses for approval → runs it&lt;br&gt;
Agent evaluates the result against a stated rule (flag if a category's revenue is more than 30% below the average)&lt;br&gt;
If the threshold is met: agent drafts a GitHub issue with the finding as evidence → pauses for approval again → creates it&lt;br&gt;
If not: agent reports the finding in chat and stops — no second approval, no issue&lt;/p&gt;

&lt;p&gt;I tested both branches explicitly. Asking about the lowest-revenue genre in the Chinook database correctly triggered both approval gates and created a real GitHub issue with the underlying numbers as evidence. Asking about the highest-revenue genre correctly reasoned through the same threshold and concluded there was nothing worth flagging — no issue created, no second gate triggered. That branching is what convinced me this was a genuine decision point, not a fixed two-step pipeline dressed up as one.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Code quality with Qodo&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I connected Qodo to the GitHub repo early and ran every meaningful change through a pull request rather than pushing straight to main. Qodo reviewed each PR automatically — checking for bugs, rule violations, and requirement gaps — and reported no issues on the changes that shipped.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What I'd do differently&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If I'd picked GitHub as my connector from the very start instead of chasing Gmail's OAuth flow, I'd have had a lot more runway to build something more ambitious with the sandbox itself. The lesson that stuck with me: TrueForge's built-in catalog connectors (GitHub, Linear, etc.) are dramatically less friction than anything requiring custom OAuth setup, and that's worth weighing heavily when time is tight.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Links&lt;/strong&gt;&lt;br&gt;
Repo: github.com/satvik8954/Wemakedevs&lt;br&gt;
Qodo-reviewed PRs: #1, #2 (Data Watchdog)&lt;/p&gt;

</description>
      <category>agents</category>
      <category>ai</category>
      <category>buildinpublic</category>
      <category>showdev</category>
    </item>
  </channel>
</rss>
