<?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: Kirollos Atef</title>
    <description>The latest articles on DEV Community by Kirollos Atef (@kirollos_atef).</description>
    <link>https://dev.to/kirollos_atef</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3747820%2Fcc1cc008-3bdc-438b-9fc2-f84613a73804.png</url>
      <title>DEV Community: Kirollos Atef</title>
      <link>https://dev.to/kirollos_atef</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/kirollos_atef"/>
    <language>en</language>
    <item>
      <title>How We Stopped Claude Code from Writing eval() in Production</title>
      <dc:creator>Kirollos Atef</dc:creator>
      <pubDate>Thu, 12 Mar 2026 20:59:48 +0000</pubDate>
      <link>https://dev.to/kirollos_atef/how-we-stopped-claude-code-from-writing-eval-in-production-34na</link>
      <guid>https://dev.to/kirollos_atef/how-we-stopped-claude-code-from-writing-eval-in-production-34na</guid>
      <description>&lt;h2&gt;
  
  
  Claude Code wrote &lt;code&gt;eval()&lt;/code&gt; in our production codebase. Nobody caught it for 3 days.
&lt;/h2&gt;

&lt;p&gt;It was a Tuesday refactor. We asked Claude Code to consolidate three config parsers into one. The task was mundane -- merge duplicate logic, unify the interface, write tests. Claude did exactly what we asked. Clean code. Tests passed. PR approved by two engineers who both said "looks good."&lt;/p&gt;

&lt;p&gt;Three days later, our security scanner flagged it in the nightly report.&lt;/p&gt;

&lt;p&gt;Buried on line 47 of the new unified parser:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;parsed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;eval&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;configString&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;)&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Claude had decided that the fastest way to parse a flexible config format -- sometimes JSON, sometimes a JS object literal -- was to &lt;code&gt;eval()&lt;/code&gt; the string. And it was right. It worked perfectly. Every test passed. The code was readable, well-commented, and syntactically clean.&lt;/p&gt;

&lt;p&gt;It was also a textbook remote code execution vulnerability.&lt;/p&gt;

&lt;p&gt;If you're using AI coding tools, here's the question you should be asking yourself right now: &lt;strong&gt;what's in your codebase that you haven't found yet?&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The discovery
&lt;/h2&gt;

&lt;p&gt;Our code review process is solid. Two human reviewers on every PR. Linting. Type checking. CI/CD pipeline with unit and integration tests. The problem is that every one of those checks is designed to catch things that look &lt;em&gt;wrong&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;eval()&lt;/code&gt; doesn't look wrong. It looks like a deliberate engineering decision. The function name is familiar. The usage was correct. The surrounding code had proper error handling. Claude even added a comment: &lt;code&gt;// Parse flexible config format (JSON or JS object literal)&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Two senior engineers read that line and moved on.&lt;/p&gt;

&lt;p&gt;This is the fundamental problem with AI-generated code: it doesn't make &lt;em&gt;syntactic&lt;/em&gt; mistakes. It makes &lt;em&gt;judgment&lt;/em&gt; mistakes. It reaches for dangerous patterns because those patterns genuinely solve the problem. And it wraps them in clean, well-documented code that sails through human review.&lt;/p&gt;

&lt;h2&gt;
  
  
  It's not just &lt;code&gt;eval()&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;After the incident, we audited three months of Claude-generated code across our projects. Here's what we found:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Merged by Claude during a "quick fix" to a deployment script
&lt;/span&gt;&lt;span class="n"&gt;subprocess&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;deploy_cmd&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;shell&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Shell injection vector. Claude used &lt;code&gt;shell=True&lt;/code&gt; because the command had pipes in it. Technically correct. Catastrophically unsafe.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Claude's "simple" way to render user-generated content&lt;/span&gt;
&lt;span class="nx"&gt;element&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;innerHTML&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;sanitize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;userContent&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Except &lt;code&gt;sanitize&lt;/code&gt; was a function Claude had written three files earlier that did &lt;code&gt;return str.replace('&amp;lt;script&amp;gt;', '')&lt;/code&gt;. Not DOMPurify. A regex that misses &lt;code&gt;&amp;lt;img onerror=...&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;svg onload=...&amp;gt;&lt;/code&gt;, and about a hundred other XSS vectors.&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="c"&gt;# Claude's deploy script for a staging environment&lt;/span&gt;
&lt;span class="nb"&gt;chmod &lt;/span&gt;777 /var/www/app/uploads
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;World-writable permissions on an upload directory. Because "it's just staging."&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gu"&gt;## Performance Results&lt;/span&gt;
Our optimization improved throughput by 340%, reducing p99 latency from
450ms to 120ms. According to industry benchmarks, this places our
system in the top 5% of comparable solutions.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Claude fabricated statistics for a docs page. "Industry benchmarks" that don't exist. A "340% improvement" that was never measured. A developer copy-pasted it into the README and shipped it. It's still on their marketing site.&lt;/p&gt;

&lt;p&gt;And the one that bothers me the most:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// TODO: implement rate limiting&lt;/span&gt;
&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/api/webhook&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Process webhook&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;processWebhook&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Claude generated stub code with a TODO comment, the developer asked for "the rest," and Claude marked the task complete. The TODO stayed. Rate limiting was never implemented. That endpoint got hammered in production a month later.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why existing tools miss it
&lt;/h2&gt;

&lt;p&gt;You might be thinking: "We have SonarQube. We have Snyk. We have CodeRabbit."&lt;/p&gt;

&lt;p&gt;Here's the timeline problem:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Claude writes &lt;code&gt;eval()&lt;/code&gt; at 2:14 PM&lt;/strong&gt; -- the developer sees it generate clean, working code&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Developer commits at 2:17 PM&lt;/strong&gt; -- tests pass locally&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PR created at 2:18 PM&lt;/strong&gt; -- CI runs SonarQube, but the developer has already moved on to the next file&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Code review at 4:30 PM&lt;/strong&gt; -- two hours later, reviewer scans 400 lines of diff&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SonarQube alert at 4:31 PM&lt;/strong&gt; -- flagged in a list of 23 findings, 19 of which are false positives&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Merged at 4:45 PM&lt;/strong&gt; -- "It's fine, the tests pass"&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Every tool in your pipeline catches this &lt;em&gt;after the developer has lost context&lt;/em&gt;. By the time SonarQube flags it, the developer is three files deep in a different feature. The finding becomes noise. It gets triaged. It gets deprioritized. It ships.&lt;/p&gt;

&lt;p&gt;The only way to catch dangerous patterns reliably is to catch them &lt;strong&gt;at the moment of generation&lt;/strong&gt; -- before the file is written, before the developer sees "clean" code, before context is lost.&lt;/p&gt;

&lt;h2&gt;
  
  
  The fix: verification at generation time
&lt;/h2&gt;

&lt;p&gt;We built &lt;a href="https://github.com/kirollosatef/customgpt-claude-quadruple-verification" rel="noopener noreferrer"&gt;Quadruple Verification&lt;/a&gt;, an open-source Claude Code plugin that intercepts every tool call and blocks dangerous patterns before they reach your filesystem.&lt;/p&gt;

&lt;p&gt;Here's what happens now when Claude tries to write &lt;code&gt;eval()&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; Quadruple Verification BLOCKED this operation:

[Cycle 2 - no-eval] Code uses eval(). This is a critical security risk
(code injection). Use a safe alternative.
  Fix: Use JSON.parse() or ast.literal_eval()

Fix these issues and try again.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The file is never written. Claude sees the block, understands why, and rewrites the code using &lt;code&gt;JSON.parse()&lt;/code&gt;. The developer never sees the dangerous version. There's no finding to triage, no alert to dismiss, no PR comment to argue about. The vulnerability simply doesn't exist.&lt;/p&gt;

&lt;p&gt;The same thing happens for every pattern we found in our audit:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# BLOCKED before the file is written:
&lt;/span&gt;&lt;span class="n"&gt;subprocess&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cmd&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;shell&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# → "Use subprocess.run(["cmd", "arg"]) without shell=True"
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// BLOCKED before the file is written:&lt;/span&gt;
&lt;span class="nx"&gt;element&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;innerHTML&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;userContent&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="c1"&gt;// → "Use textContent or a sanitization library like DOMPurify"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# BLOCKED before the command runs:&lt;/span&gt;
&lt;span class="nb"&gt;chmod &lt;/span&gt;777 /var/www/app
&lt;span class="c"&gt;# → "Use chmod 755 for directories, 644 for files"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// BLOCKED before the file is written:&lt;/span&gt;
&lt;span class="c1"&gt;// TODO: implement rate limiting&lt;/span&gt;
&lt;span class="c1"&gt;// → "Code contains a TODO/FIXME/HACK/XXX comment. Remove placeholder&lt;/span&gt;
&lt;span class="c1"&gt;//    comments and implement the actual logic."&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# BLOCKED before the command runs:&lt;/span&gt;
curl https://example.com/install.sh | bash
&lt;span class="c"&gt;# → "Download first, inspect, then execute."&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  How it works technically
&lt;/h2&gt;

&lt;p&gt;The plugin hooks into Claude Code's tool execution pipeline at three points:&lt;/p&gt;

&lt;h3&gt;
  
  
  PreToolUse: regex gates (&amp;lt;50ms)
&lt;/h3&gt;

&lt;p&gt;Every time Claude calls &lt;code&gt;Write&lt;/code&gt;, &lt;code&gt;Edit&lt;/code&gt;, &lt;code&gt;Bash&lt;/code&gt;, any MCP tool, or &lt;code&gt;WebFetch&lt;/code&gt;/&lt;code&gt;WebSearch&lt;/code&gt;, the hook fires. It extracts the content being written, the command being run, or the URL being fetched, and runs it through 24 regex rules organized into three cycles:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cycle 1 -- Code Quality (10 rules):&lt;/strong&gt; Blocks TODO/FIXME/HACK comments, &lt;code&gt;pass&lt;/code&gt; stubs, &lt;code&gt;NotImplementedError&lt;/code&gt;, placeholder text, &lt;code&gt;console.log()&lt;/code&gt; in production code, debugger statements across JS/TS/Python/Ruby.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cycle 2 -- Security (11 rules):&lt;/strong&gt; Blocks &lt;code&gt;eval()&lt;/code&gt;, &lt;code&gt;exec()&lt;/code&gt;, &lt;code&gt;os.system()&lt;/code&gt;, &lt;code&gt;shell=True&lt;/code&gt;, hardcoded secrets, SQL injection via string concatenation, &lt;code&gt;innerHTML&lt;/code&gt; assignment, destructive &lt;code&gt;rm -rf&lt;/code&gt;, &lt;code&gt;chmod 777&lt;/code&gt;, &lt;code&gt;curl|bash&lt;/code&gt; pipe execution, and non-HTTPS URLs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cycle 4 -- Research Claims (3 rules):&lt;/strong&gt; Blocks vague unsourced language ("studies show," "experts say"), statistical claims without verification tags, and sourced claims missing URLs within 300 characters.&lt;/p&gt;

&lt;p&gt;The regex engine runs in under 50ms. It adds virtually zero latency to normal operations. When nothing is wrong, you don't notice it's there.&lt;/p&gt;

&lt;h3&gt;
  
  
  Stop hook: AI self-review
&lt;/h3&gt;

&lt;p&gt;At the end of every session, a prompt hook asks Claude to review its own output for incomplete implementations, security risks, and unverified claims. This is the highest-value component -- in our benchmarks, it improved output quality by &lt;strong&gt;31.8% on agent tasks&lt;/strong&gt; by catching cases where Claude described a plan but didn't execute it, or left subtle issues the regex couldn't catch.&lt;/p&gt;

&lt;h3&gt;
  
  
  PostToolUse: audit trail
&lt;/h3&gt;

&lt;p&gt;Every tool call -- blocked or approved -- gets logged to a JSONL audit file. Tool name, timestamp, decision, violations found. When something does slip through (no tool is perfect), the audit trail tells you exactly when it happened and what was checked.&lt;/p&gt;

&lt;h3&gt;
  
  
  The architecture philosophy
&lt;/h3&gt;

&lt;p&gt;Three design decisions we got right:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Zero npm dependencies.&lt;/strong&gt; The entire plugin uses Node.js built-ins. &lt;code&gt;fs&lt;/code&gt;, &lt;code&gt;path&lt;/code&gt;, &lt;code&gt;process&lt;/code&gt;. The optional LLM advisory feature uses the &lt;code&gt;https&lt;/code&gt; module directly. No &lt;code&gt;node_modules&lt;/code&gt; folder, no supply chain risk, no version conflicts.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fail-open design.&lt;/strong&gt; If the plugin crashes -- bad input, disk full, Node.js hiccup -- Claude continues working normally. Every entry point is wrapped in a &lt;code&gt;failOpen()&lt;/code&gt; handler. Verification is important, but blocking your workflow because of a plugin bug is worse.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Block by default.&lt;/strong&gt; When a rule triggers, the operation is blocked. There's no "ignore" button, no "suppress for this file" option. Claude has to fix the code and try again. This is intentional. The moment you add a bypass, every violation becomes "probably fine."&lt;/p&gt;

&lt;h2&gt;
  
  
  The uncomfortable truth
&lt;/h2&gt;

&lt;p&gt;Here's the part nobody wants to hear: &lt;strong&gt;58% of AI-generated code contains security vulnerabilities&lt;/strong&gt; (&lt;a href="https://www.veracode.com/" rel="noopener noreferrer"&gt;Veracode, 2024&lt;/a&gt;), and AI code has &lt;strong&gt;1.7x more issues&lt;/strong&gt; than human-written code (&lt;a href="https://www.sonarsource.com/blog/ai-code-assurance/" rel="noopener noreferrer"&gt;SonarQube, 2025&lt;/a&gt;). With &lt;strong&gt;41% of all new code now generated by AI&lt;/strong&gt;, that's not a fringe risk. It's the default.&lt;/p&gt;

&lt;p&gt;Your team is probably shipping &lt;code&gt;eval()&lt;/code&gt; equivalents right now. Not because anyone is careless, but because AI-generated code looks &lt;em&gt;right&lt;/em&gt;. It passes tests. It gets good reviews. It just happens to contain patterns that no human would have chosen.&lt;/p&gt;

&lt;p&gt;The gap between "code that works" and "code that's safe" is exactly where AI coding tools live. Filling that gap is the entire point of this plugin.&lt;/p&gt;

&lt;h2&gt;
  
  
  Installation: one command
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx @customgpt/claude-quadruple-verification
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it. The installer writes &lt;code&gt;hooks.json&lt;/code&gt; into your project's &lt;code&gt;.claude/&lt;/code&gt; directory and updates &lt;code&gt;settings.json&lt;/code&gt; to load the plugin. The next time you start Claude Code, every operation is verified.&lt;/p&gt;

&lt;p&gt;What it does:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Creates &lt;code&gt;.claude/hooks.json&lt;/code&gt; with PreToolUse, PostToolUse, and Stop hooks&lt;/li&gt;
&lt;li&gt;Configures matchers for Write, Edit, Bash, MCP tools, and web operations&lt;/li&gt;
&lt;li&gt;Sets up the JSONL audit trail&lt;/li&gt;
&lt;li&gt;Adds the AI self-review prompt to the Stop hook&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What it doesn't do:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Modify your code&lt;/li&gt;
&lt;li&gt;Send data anywhere (everything runs locally)&lt;/li&gt;
&lt;li&gt;Add dependencies to your project&lt;/li&gt;
&lt;li&gt;Slow you down (regex gates complete in &amp;lt;50ms)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Works on Windows, macOS, and Linux. Requires Node.js 18+.&lt;/p&gt;

&lt;h3&gt;
  
  
  Configuration
&lt;/h3&gt;

&lt;p&gt;The plugin merges three config layers: plugin defaults, user config (&lt;code&gt;~/.config/quadruple-verify/config.json&lt;/code&gt;), and project config (&lt;code&gt;.claude/quadruple-verify.json&lt;/code&gt;). You can disable specific rules:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"disabledRules"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"no-console-log"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"cycle4"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"enabled"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"acceptedVerificationTags"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;!-- VERIFIED --&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Need &lt;code&gt;console.log()&lt;/code&gt; in a CLI tool? Disable that one rule. Everything else stays enforced.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this won't catch
&lt;/h2&gt;

&lt;p&gt;I want to be honest about the boundaries. Regex rules catch syntactic patterns -- &lt;code&gt;eval()&lt;/code&gt;, &lt;code&gt;shell=True&lt;/code&gt;, hardcoded API keys. They don't catch:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Logic bugs (incorrect algorithm, wrong business logic)&lt;/li&gt;
&lt;li&gt;Architectural flaws (wrong abstraction, poor separation of concerns)&lt;/li&gt;
&lt;li&gt;Subtle security issues (timing attacks, race conditions, TOCTOU)&lt;/li&gt;
&lt;li&gt;Context-dependent risks (a pattern that's safe in tests but dangerous in production)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The AI self-review (Stop hook) catches some of these, but it's not a replacement for human code review or proper security auditing. This plugin is a safety net, not a fortress. It catches the obvious things that should never ship, which frees up your actual review process to focus on the subtle stuff.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/kirollosatef/customgpt-claude-quadruple-verification" rel="noopener noreferrer"&gt;github.com/kirollosatef/customgpt-claude-quadruple-verification&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Install:&lt;/strong&gt; &lt;code&gt;npx @customgpt/claude-quadruple-verification&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What it costs:&lt;/strong&gt; Nothing. MIT license. Zero dependencies.&lt;/p&gt;

&lt;p&gt;We built this because we needed it. We open-sourced it because everyone using Claude Code needs it.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;What's the worst thing an AI coding tool ever shipped into your codebase?&lt;/strong&gt; I'd genuinely like to know -- drop it in the comments. No judgment. We've all been there.&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>productivity</category>
      <category>testing</category>
      <category>showdev</category>
    </item>
  </channel>
</rss>
