<?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: kuro-tomo</title>
    <description>The latest articles on DEV Community by kuro-tomo (@kurotomo).</description>
    <link>https://dev.to/kurotomo</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%2F4105454%2F3fd13269-d47f-4960-b743-fd9ae1f150a8.png</url>
      <title>DEV Community: kuro-tomo</title>
      <link>https://dev.to/kurotomo</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/kurotomo"/>
    <language>en</language>
    <item>
      <title>SinkSeal: git-hook guardrails for AI coding agents</title>
      <dc:creator>kuro-tomo</dc:creator>
      <pubDate>Wed, 02 Sep 2026 05:23:23 +0000</pubDate>
      <link>https://dev.to/kurotomo/sinkseal-git-hook-guardrails-for-ai-coding-agents-2d9i</link>
      <guid>https://dev.to/kurotomo/sinkseal-git-hook-guardrails-for-ai-coding-agents-2d9i</guid>
      <description>&lt;p&gt;I built this after watching an AI-agent-built demo feature get wired straight to a live SMS/voice vendor — no guard, no synthetic-tenant check, just the same code path production used. A routine demo session produced real phone charges.&lt;/p&gt;

&lt;p&gt;SinkSeal is a set of git hooks (bash, no runtime dependency beyond git + grep/sed) that catch three things on every commit and push, regardless of which agent (Claude Code, Cursor, Codex, or a human) writes the code:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;secrets&lt;/strong&gt;, via gitleaks (warns rather than blocks if gitleaks isn't on your PATH — install it separately for this check to actually run)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;risk-category changes&lt;/strong&gt; (auth, payments, migrations, etc.) — flagged, not blocked, but requires an explicit commit-message trailer acknowledging it&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;"live-fire" calls&lt;/strong&gt; to external irreversible-action APIs (SMS, payment, public-posting) reached from demo/test code paths — hard-blocked if the path looks like a demo, soft-flagged otherwise&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why git hooks, not a CI check
&lt;/h2&gt;

&lt;p&gt;CI catches a bad diff &lt;em&gt;after&lt;/em&gt; it's already pushed. A git hook catches it before the commit even lands, regardless of which coding agent (or human) wrote the code — the enforcement lives in the hook, not in any one tool's configuration or system prompt.&lt;/p&gt;

&lt;h2&gt;
  
  
  Install
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/kuro-tomo/sinkseal
./sinkseal/install.sh /path/to/your/repo
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This copies the hooks self-contained into &lt;code&gt;&amp;lt;repo&amp;gt;/.githooks/&lt;/code&gt;, so it survives even if you later delete the sinkseal checkout, and it's inherited automatically by any git worktree of that repo.&lt;/p&gt;

&lt;p&gt;Free and MIT-licensed: &lt;a href="https://github.com/kuro-tomo/sinkseal" rel="noopener noreferrer"&gt;https://github.com/kuro-tomo/sinkseal&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Feedback especially welcome on the pattern-matching approach — it's inherently a probabilistic safety net (regex-based), not a completeness guarantee, and I'd rather know where it's weak than oversell it.&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>ai</category>
      <category>security</category>
      <category>git</category>
    </item>
  </channel>
</rss>
