<?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: Anmol Nagpal</title>
    <description>The latest articles on DEV Community by Anmol Nagpal (@anmolnagpal).</description>
    <link>https://dev.to/anmolnagpal</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%2F296976%2F3aba3ccb-b418-44c9-ba2c-098499c88049.jpeg</url>
      <title>DEV Community: Anmol Nagpal</title>
      <link>https://dev.to/anmolnagpal</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/anmolnagpal"/>
    <language>en</language>
    <item>
      <title>Give your AI code reviewer a rulebook: deterministic DevOps reviews with Claude Code</title>
      <dc:creator>Anmol Nagpal</dc:creator>
      <pubDate>Sun, 30 Aug 2026 02:27:12 +0000</pubDate>
      <link>https://dev.to/anmolnagpal/give-your-ai-code-reviewer-a-rulebook-deterministic-devops-reviews-with-claude-code-4i4d</link>
      <guid>https://dev.to/anmolnagpal/give-your-ai-code-reviewer-a-rulebook-deterministic-devops-reviews-with-claude-code-4i4d</guid>
      <description>&lt;p&gt;An AI reviewer that says "looks good to me" on a Terraform PR that ships a public S3 bucket is worse than no reviewer, it launders a bad change through a trusted-looking check. The fix isn't a smarter model, it's a &lt;strong&gt;rulebook&lt;/strong&gt;: a fixed catalog of findings, each with a stable ID, each backed by a test, so the review is the same on Tuesday as it was on Monday.&lt;/p&gt;

&lt;p&gt;That's what &lt;a href="https://github.com/anmolnagpal/devops-skills" rel="noopener noreferrer"&gt;&lt;code&gt;devops-skills&lt;/code&gt;&lt;/a&gt; is, 18 review and scaffolding skills for Claude Code (and Cursor, and Codex), where every finding carries a rule ID from a canonical registry and every rule has a fixture behind it.&lt;/p&gt;

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



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ /plugin marketplace add anmolnagpal/devops-skills
$ /plugin install clouddrove@devops-skills
✔ Plugin "clouddrove" installed (1.5.0)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or everything (Cursor rules + Codex &lt;code&gt;AGENTS.md&lt;/code&gt; + MCP), one line:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;/bin/bash &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://raw.githubusercontent.com/anmolnagpal/devops-skills/main/scripts/bootstrap.sh&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;--&lt;/span&gt; &lt;span class="nt"&gt;--all&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  What a review actually looks like
&lt;/h2&gt;

&lt;p&gt;Point it at a Terraform module before you raise the MR:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;gt; review my terraform before I raise the MR

BLOCKING, Must fix before MR
[main.tf:14] TF-STATE-001 No remote backend, state would live on a laptop
 -&amp;gt; add a backend "s3" block with DynamoDB state locking
[rds.tf:31] TF-VAR-001 Hardcoded DB password in `default`
 -&amp;gt; move to a variable, mark sensitive = true, source from Secrets Manager
[s3.tf:8] SEC-PUB-001 Bucket exposed via `acl = "public-read"`
 -&amp;gt; remove the public ACL; add a public_access_block with all four flags true

ADVISORY, Should fix
[s3.tf:8] TF-RES-001 Bucket missing required tags (Environment, Team, ManagedBy)

Summary: 3 blocking issue(s), 1 advisory issue(s).
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Notice the IDs. &lt;code&gt;TF-STATE-001&lt;/code&gt; means the same thing every run, in every repo, to every teammate. You can waive one in a baseline and the waiver still makes sense next quarter. The same IDs come out of &lt;a href="https://github.com/clouddrove-ci/auditkit" rel="noopener noreferrer"&gt;auditkit&lt;/a&gt;'s deep audit engine, so an inline review and a full audit speak one language.&lt;/p&gt;

&lt;h2&gt;
  
  
  "Tested findings, not asserted", what that means
&lt;/h2&gt;

&lt;p&gt;Each rule ships a fixture pair: a bad input that must trip it, and a clean input that must not. Static, model-free, CI-runnable:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ bash skills/tf/evals/validate.sh
OK [tf]: 17 case(s) valid against 30 catalog rule(s).

$ bash scripts/check-rule-ids.sh
check-rule-ids: 179 canonical, 173 emitted, 6 reserved, 0 planned.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If a skill invents a rule ID that isn't in the registry, CI rejects the PR. If a fixture references a rule the catalog doesn't define, the eval fails. The rulebook can't drift from the tests.&lt;/p&gt;

&lt;h2&gt;
  
  
  A real one: is your audit log actually on?
&lt;/h2&gt;

&lt;p&gt;Everyone "has logging." Fewer people have an audit log that is &lt;strong&gt;on, complete, off the node that wrote it, and tamper-proof&lt;/strong&gt;. The &lt;code&gt;logging&lt;/code&gt; skill checks exactly that across k8s, GKE, AKS, and CloudWatch. Here's the interesting part, we ran it against a real &lt;a href="https://k3s.io/" rel="noopener noreferrer"&gt;k3s&lt;/a&gt; cluster instead of trusting the fixture.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ kubectl get --raw=/metrics | grep apiserver_audit_event_total
apiserver_audit_event_total 0 # 325-day-old cluster, zero audit events

$ cat /etc/rancher/k3s/config.yaml
disable:
 - traefik
node-ip: 192.168.13.108 # no kube-apiserver-arg, no audit-policy-file
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Three independent signals, one conclusion, audit logging is off. The skill's finding matches the ground truth:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;BLOCKING, Must fix before deploy
[/etc/rancher/k3s/config.yaml:1] LOG-K8S-001 k3s server has no audit logging:
 kube-apiserver-arg omits audit-policy-file / audit-log-path (off by default)
 -&amp;gt; add audit-policy-file, audit-log-path, and an audit-webhook backend

Summary: 1 blocking issue.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;LOG-K8S-002&lt;/code&gt; (policy too coarse) and &lt;code&gt;LOG-K8S-003&lt;/code&gt; (log stays node-local) correctly stayed silent, there's no policy to be coarse and the log isn't merely local, it's absent. A rule that fires on a real cluster the way it fires on its fixture is a rule you can trust.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mapped to the frameworks
&lt;/h2&gt;

&lt;p&gt;Every security and infra skill declares which controls it enforces, MITRE ATT&amp;amp;CK, NIST CSF 2.0, D3FEND, generated into a machine-readable &lt;code&gt;index.json&lt;/code&gt; and a coverage table:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ jq '.count, (.skills | map(select(.frameworks!={})) | length)' index.json
18
15
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So "which of my controls does this skill check" is a lookup, not a guess.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it on your worst repo
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;gt; review my helm values for prod
&amp;gt; is this plan safe to apply to prod? # reads tfplan.json
&amp;gt; is audit logging on for this cluster?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It's MIT, actively maintained, and conforms to the &lt;a href="https://agentskills.io" rel="noopener noreferrer"&gt;agentskills.io&lt;/a&gt; open standard. Repo: &lt;strong&gt;&lt;a href="https://github.com/anmolnagpal/devops-skills" rel="noopener noreferrer"&gt;https://github.com/anmolnagpal/devops-skills&lt;/a&gt;&lt;/strong&gt;. If you break it or want a rule it doesn't have, open an issue, the last three shipped rules came straight from real gaps.&lt;/p&gt;

</description>
      <category>devops</category>
      <category>terraform</category>
      <category>kubernetes</category>
      <category>ai</category>
    </item>
  </channel>
</rss>
