<?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>The permission map every Claude Code agent needs (and the column most teams skip)</title>
      <dc:creator>kuro-tomo</dc:creator>
      <pubDate>Wed, 23 Sep 2026 02:54:11 +0000</pubDate>
      <link>https://dev.to/kurotomo/the-permission-map-every-claude-code-agent-needs-and-the-column-most-teams-skip-1h8g</link>
      <guid>https://dev.to/kurotomo/the-permission-map-every-claude-code-agent-needs-and-the-column-most-teams-skip-1h8g</guid>
      <description>&lt;h2&gt;
  
  
  The question that matters more than "does the agent work"
&lt;/h2&gt;

&lt;p&gt;Over the past several months I've been running structural governance checks on AI coding agents — mainly Claude Code — across a handful of active projects. Not code review. The specific question: what can this agent's tools actually reach, and does anything catch it when it reaches the wrong thing?&lt;/p&gt;

&lt;h3&gt;
  
  
  The pattern
&lt;/h3&gt;

&lt;p&gt;An agent has a tool — a payment API, a messaging API, a deploy hook, whatever — that can act on the outside world. Somewhere in the flow, the agent's own summary says the action succeeded. But the guard that was supposed to sit in front of that call was either never wired up, or wired up against the wrong trigger (checking for a specific error string that changed after a dependency update, say). The agent isn't lying. It's reporting what it observed, and what it observed was incomplete.&lt;/p&gt;

&lt;h3&gt;
  
  
  A permission map, in practice
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Reach&lt;/th&gt;
&lt;th&gt;Guard exists?&lt;/th&gt;
&lt;th&gt;Guard actually fires?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Read repo files&lt;/td&gt;
&lt;td&gt;read-only&lt;/td&gt;
&lt;td&gt;n/a&lt;/td&gt;
&lt;td&gt;n/a&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Write to feature branch&lt;/td&gt;
&lt;td&gt;reversible&lt;/td&gt;
&lt;td&gt;n/a&lt;/td&gt;
&lt;td&gt;n/a&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Call payment API&lt;/td&gt;
&lt;td&gt;irreversible&lt;/td&gt;
&lt;td&gt;yes (claimed)&lt;/td&gt;
&lt;td&gt;no — checks wrong status code&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Post to Slack/webhook&lt;/td&gt;
&lt;td&gt;irreversible&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The first two rows are usually easy to get right. The third column — "guard actually fires" — is where I've now found the same gap on three separate setups: a guard that exists on paper (someone wrote it, it's in the code) but doesn't fire against the real failure mode, because nobody re-verified it after whatever it depends on changed shape.&lt;/p&gt;

&lt;h3&gt;
  
  
  What actually catches this
&lt;/h3&gt;

&lt;p&gt;A checklist that:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Maps every tool call by blast radius (read-only / reversible / irreversible).&lt;/li&gt;
&lt;li&gt;Traces where the irreversible ones actually land — the real endpoint, not the one you remember configuring.&lt;/li&gt;
&lt;li&gt;Deliberately tries to break each guard instead of just checking it's present. If a guard hasn't been broken and caught in the failing state, I don't count it as verified.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That third step is the one almost nobody does, and it's the one that finds the real bugs.&lt;/p&gt;

&lt;h3&gt;
  
  
  If you want this run against your own setup
&lt;/h3&gt;

&lt;p&gt;I've turned this into a fixed-scope written audit — $950 flat, 2–3 weeks, everything async (no calls) — for anyone who wants steps 1–3 run against their own agent: &lt;a href="mailto:mabokko@gmail.com"&gt;mabokko@gmail.com&lt;/a&gt;. Also happy to just talk through the pattern above if that's more useful to you than paying for the full thing.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>claude</category>
      <category>security</category>
      <category>programming</category>
    </item>
    <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>
