<?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: Sandeep Shelke</title>
    <description>The latest articles on DEV Community by Sandeep Shelke (@yantrakar).</description>
    <link>https://dev.to/yantrakar</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%2F4196151%2F6fd71c5b-0d16-4f35-89e4-38c8d1f29242.png</url>
      <title>DEV Community: Sandeep Shelke</title>
      <link>https://dev.to/yantrakar</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/yantrakar"/>
    <language>en</language>
    <item>
      <title>My own guardrail stopped my coding agent for 70 minutes</title>
      <dc:creator>Sandeep Shelke</dc:creator>
      <pubDate>Sat, 24 Oct 2026 19:21:47 +0000</pubDate>
      <link>https://dev.to/yantrakar/my-own-guardrail-stopped-my-coding-agent-for-70-minutes-50d0</link>
      <guid>https://dev.to/yantrakar/my-own-guardrail-stopped-my-coding-agent-for-70-minutes-50d0</guid>
      <description>&lt;p&gt;I left a coding agent running unattended: Copilot CLI, headless, in a resume loop. It loaded my gitpro skill on its own, because the skill's description says to use it before committing.&lt;/p&gt;

&lt;p&gt;The skill has one rule: before any &lt;code&gt;git commit&lt;/code&gt;, run &lt;code&gt;gitpro why&lt;/code&gt; to check the identity. On that machine the gitpro CLI was not installed. The skill also says: if it is missing, ask before installing. There was nobody to ask.&lt;/p&gt;

&lt;p&gt;So the agent did exactly what it was told. It kept working, checked once more for gitpro, never committed, and ended the run with a note: the identity preflight is unavailable and must not be bypassed. No &lt;code&gt;--no-verify&lt;/code&gt;, no install, no commit under a wrong name.&lt;/p&gt;

&lt;p&gt;The guardrail worked. It also left about 70 minutes and 55 files of verified work uncommitted, until I re-ran the tests and committed it myself.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the rule was missing
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;A path for unattended runs. "Ask the user" is not a rule when nobody is there.&lt;/li&gt;
&lt;li&gt;A difference between a local commit and a push. This repo had no remote. A local commit is easy to undo; a push is not.&lt;/li&gt;
&lt;li&gt;A difference between blocked and done. The agent finished the run instead of reporting a blocker.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  The change I am proposing
&lt;/h2&gt;

&lt;p&gt;In an unattended run without gitpro: allow a local commit in a repo with no remote, when the repo's own &lt;code&gt;user.email&lt;/code&gt; is set, and record that the check was skipped. Anything with a remote, or any push, stops and is reported as blocked, not done.&lt;/p&gt;

&lt;p&gt;If you write rules for agents, give every "ask first" an answer for when nobody is there. In an unattended run you can't be available, so the decisions it will need have to be recorded beforehand, as part of the skill. This needs better understanding. How do you handle those decisions in your unattended runs?&lt;/p&gt;

&lt;p&gt;gitpro: &lt;a href="https://gitpro.dev" rel="noopener noreferrer"&gt;https://gitpro.dev&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;PS: Written with help from Claude. The experience and the tool are mine.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>git</category>
      <category>opensource</category>
      <category>productivity</category>
    </item>
    <item>
      <title>The cable was fine: overlapping subnets on a two-NIC machine</title>
      <dc:creator>Sandeep Shelke</dc:creator>
      <pubDate>Wed, 21 Oct 2026 21:31:16 +0000</pubDate>
      <link>https://dev.to/yantrakar/the-cable-was-fine-overlapping-subnets-on-a-two-nic-machine-gmc</link>
      <guid>https://dev.to/yantrakar/the-cable-was-fine-overlapping-subnets-on-a-two-nic-machine-gmc</guid>
      <description>&lt;p&gt;While isolating my AI model cluster on its own network segment, I could not reach a host on another network from my lab machine.&lt;/p&gt;

&lt;p&gt;I was suspecting a faulty NIC card, a faulty cable, or a wrong connection on the switch in the lab.&lt;/p&gt;

&lt;p&gt;AI came in handy to detect it. I asked it to trace why I was not able to reach that host. The machine had two NIC cards, one on my subnet and the other used as a bridge to another subnet. It said the new IP being assigned was from the same subnet as my own. Two networks with overlapping addresses.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwr1pt8avuai0oapozhn6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwr1pt8avuai0oapozhn6.png" alt="Before: the old /23 range contains the external /24, so the addresses overlap. After: each network has its own range." width="799" height="185"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So I gave the bridged network its own range.&lt;/p&gt;

&lt;p&gt;If you are using a VLAN, ensure that it is isolated and only one of the nodes has the bridge enabled. It could be wired or wireless.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqvf25xfm70986yyxupui.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqvf25xfm70986yyxupui.png" alt="The one rule: a network is reachable only if the address ranges do not collide and a router sits in both." width="799" height="246"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To check quickly: &lt;code&gt;ip -br addr&lt;/code&gt; shows each card with its address and prefix. If one range sits inside the other, you have the same problem.&lt;/p&gt;

&lt;p&gt;With private AI this matters more. Model servers should sit on their own segment, with one way in and out. I wrote more on why: &lt;a href="https://yantrakar.com/self-replication-network-boundary.html" rel="noopener noreferrer"&gt;https://yantrakar.com/self-replication-network-boundary.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Have you lost time on overlapping subnets?&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Written with help from Claude. The experience is mine. Addresses in the pictures are deliberately obfuscated to avoid leaking internals.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>networking</category>
      <category>linux</category>
      <category>devops</category>
      <category>ai</category>
    </item>
    <item>
      <title>Wrong git email again? Pick the identity from the remote URL</title>
      <dc:creator>Sandeep Shelke</dc:creator>
      <pubDate>Tue, 20 Oct 2026 15:18:24 +0000</pubDate>
      <link>https://dev.to/yantrakar/wrong-git-email-again-pick-the-identity-from-the-remote-url-1d3n</link>
      <guid>https://dev.to/yantrakar/wrong-git-email-again-pick-the-identity-from-the-remote-url-1d3n</guid>
      <description>&lt;p&gt;Personal GitHub, work GitHub, GitLab, two Bitbuckets. More than once I committed with the wrong name and email. Sometimes the push was rejected. Sometimes nobody noticed for weeks.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why &lt;code&gt;includeIf gitdir&lt;/code&gt; is not enough
&lt;/h2&gt;

&lt;p&gt;It picks the identity by folder. Repos don't always live in the right folder. The remote URL is a better signal: &lt;code&gt;git@bitbucket.org:client/api.git&lt;/code&gt; is a client repo wherever it is cloned.&lt;/p&gt;

&lt;p&gt;Git can do this itself since 2.36:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ini"&gt;&lt;code&gt;&lt;span class="nn"&gt;[includeIf "hasconfig:remote.*.url:git@bitbucket.org:client/**"]&lt;/span&gt;
    &lt;span class="py"&gt;path&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;~/.gitconfig-client&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add one SSH host entry per account, because GitHub and Bitbucket won't take the same key on two accounts.&lt;/p&gt;

&lt;h2&gt;
  
  
  Or let gitpro write it
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://gitpro.dev" rel="noopener noreferrer"&gt;gitpro&lt;/a&gt; is a small open-source CLI that writes exactly this: the &lt;code&gt;includeIf&lt;/code&gt; blocks and the SSH entries, in a marked block, backed up first. No daemon, no git wrapper.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pipx &lt;span class="nb"&gt;install &lt;/span&gt;gitpro
gitpro setup   &lt;span class="c"&gt;# preview, then confirm once&lt;/span&gt;
gitpro why     &lt;span class="c"&gt;# which identity this repo should use, and the fix&lt;/span&gt;
gitpro scan    &lt;span class="c"&gt;# find repos that override it&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;scan&lt;/code&gt; found one old repo of mine with its own &lt;code&gt;user.email&lt;/code&gt; that ignored everything. &lt;code&gt;scan --fix&lt;/code&gt; removed it.&lt;/p&gt;

&lt;p&gt;Coding agents commit as whoever git says you are, so there is also a Claude Code hook that blocks a wrong-identity commit or push.&lt;/p&gt;

&lt;p&gt;Linux and macOS, MIT: &lt;a href="https://github.com/Yantrakar/gitpro" rel="noopener noreferrer"&gt;github.com/Yantrakar/gitpro&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Written with help from Claude. The experience and the tool are mine.&lt;/em&gt;&lt;/p&gt;

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