AI Code Defect Rates: The Q3 2026 Data Report
A dated, sourced snapshot of AI-generated-code defect and security rates for Q3 2026: 45% OWASP flaws, 1.7x issues per PR, 19.7% phantom packages. Refreshed quarterly.
Read post →Notes on AI code review, static analysis noise reduction, and shipping cleaner code with Claude Code / Cursor.
A dated, sourced snapshot of AI-generated-code defect and security rates for Q3 2026: 45% OWASP flaws, 1.7x issues per PR, 19.7% phantom packages. Refreshed quarterly.
Read post →BrassCoders ran a first-party probe: 96 package names a frontier AI model suggested for Python tasks, checked live against PyPI. 95 existed; 1 didn't.
Read post →Wire a Claude Code hook to run brasscoders scan on every edit, so .brass/ai_instructions.yaml stays fresh and the assistant reads findings without copy-paste.
Read post →A 2025 benchmark puts LLM code-review recall at 0.78 to 0.88, yet the models mislocate findings and vary run to run — the numbers on why it's a weak gate.
Read post →BrassCoders closes the loop on AI-written bugs: scan for the finding, hand it to your assistant for a patch, then re-scan to confirm the fix deterministically.
Read post →BrassCoders scans an AI-generated Express.js user API and returns CRITICAL command injection plus a hardcoded JWT secret. Real scan output and fixes.
Read post →What three 2025 studies show about AI-generated code security, why the risk compounds, and how to build a deterministic scanning gate.
Read post →AI generates code that satisfies the prompt — not the business rules it was never given. Static analysis can't catch what only your requirements document knows.
Read post →When AI-generated code is 'safe' but wrong: the trust boundary is a design decision no scanner can make. Here's what it means and what actually enforces it.
Read post →A new guide covers how to run BrassCoders on every commit — a CI step on push or a git pre-commit hook — and why there's no automatic watch mode. BrassCoders is a command-line scanner you invoke, not a background daemon.
Read post →Evaluating an AI coding assistant for your team? Two separate surfaces require two separate question sets. Here's the checklist for both.
Read post →Before-and-after walkthrough: BrassCoders finds SQL injection in a corpus Flask endpoint, the parameterized fix, and what the re-scan shows — including the one Semgrep taint finding that remains.
Read post →BrassCoders flags MD5 in a file-deduplication script as a CRITICAL security finding. The pattern match is correct — the context makes it a false positive. Here's the before scan, the .brassignore entry, and the after scan.
Read post →How to frame the ROI of adding AI-aware static analysis to your team's CI pipeline — anchored in your own scan data, not vendor-provided numbers.
Read post →A real before-and-after: BrassCoders's SecretsScanner finds a hardcoded HMAC signing key in a corpus Python file. The environment variable fix, the re-scan, and why detect-secrets catches this where Bandit alone misses some cases.
Read post →AI coding assistants expand code output without expanding review capacity. A practical framework for measuring AI-generated code security risk as a number your organization can act on.
Read post →A concise brief on what AI coding assistants do to your security surface, what conventional tooling misses, and what one CI step closes the gap.
Read post →SQL injection: caught. Missing auth on a route: not caught. BrassCoders maps the precise boundary between what static analysis detects deterministically and what requires an AI assistant's context.
Read post →Generic static analysis tools have a coverage gap specific to AI-generated code. These questions separate AI-aware tools from legacy scanners in a vendor evaluation.
Read post →Yes — via a dedicated Babel-based JavaScript/TypeScript scanner and Semgrep. Here's exactly what it catches and where the gap is versus the Python scanner.
Read post →Partially. BrassCoders catches structural indicators — threading.Thread without locks, shared mutable state in async functions — but not asyncio races that leave no structural marker.
Read post →BrassCoders's OSS core makes zero outbound calls by default. The --offline flag adds hard enforcement for air-gapped CI, HIPAA, and SOC 2 environments.
Read post →Detection time, remediation effort, credential rotation, and incident response — framed in engineering hours, not dollar amounts. And what catching it at commit time costs instead.
Read post →Yes — BrassCoders scans DRF views, serializers, and settings files. Semgrep includes Django-specific rules, and Bandit catches SQL injection and secrets in DRF route handlers.
Read post →Yes — BrassCoders scans any Python project layout. It reads pyproject.toml as the project manifest for Paid-plan enrichment and works with both pyproject.toml and setup.py projects.
Read post →Step-by-step: install BrassCoders, run the scan, read the .brass/ai_instructions.yaml output, and understand what to do with the findings.
Read post →After a BrassCoders scan, .brass/ai_instructions.yaml contains severity-ranked findings formatted for pasting into Claude Code or Cursor. Here's how to read and use it.
Read post →A typical BrassCoders scan runs in under 60 seconds on most Python codebases. Scan time scales with project size and whether Pyre/Pysa taint analysis is enabled.
Read post →BrassCoders writes three YAML files to .brass/ — a ranked AI instructions file, a full findings file, and a security-only view. Here's what each contains.
Read post →BrassCoders requires Python 3.10 or higher. It runs on macOS, Linux, and Windows via WSL2. Python 3.9 and earlier are not supported due to Pyre/Pysa requirements.
Read post →.gitignore tells git which files to exclude from version control. .brassignore tells BrassCoders which files or finding types to suppress — a different job, a different syntax.
Read post →AI coding assistants optimize for the happy path: code that satisfies the prompt and passes local tests but breaks silently in production environments.
Read post →AI-generated Alembic and Django migrations have a specific failure pattern: column type mismatches and missing nullable defaults that corrupt data silently.
Read post →AI pins real packages but outdated vulnerable versions in requirements.txt — different from slopsquatting, and invisible without an explicit audit.
Read post →AI-generated type annotations pass mypy but fail at runtime — Optional masking required fields, Any collapsing structure, wrong return types.
Read post →AI writes tests that hit 80% coverage but assert almost nothing — the pattern, why it happens, and what BrassCoders catches in the gap.
Read post →Hidden instructions in MCP tool descriptions can hijack your AI coding agent. Here's the attack surface and what static analysis can and can't cover.
Read post →OWASP's agentic AI Top 10 covers risks Python developers face when using Claude Code, Cursor, or building autonomous AI coding pipelines.
Read post →AI assistants write Pydantic v2 models that satisfy mypy but allow invalid data through, creating a false sense of API input validation security.
Read post →Hidden instructions in README files and code comments can steer Claude Code or Cursor into running attacker-controlled commands during a normal session.
Read post →print() calls, commented-out auth checks, and debug flags — the artifacts AI coding assistants leave that consistently survive code review.
Read post →Ruff's default ruleset covers style and correctness — not security. Here's what to add to Ruff, and what neither Ruff nor Bandit covers in AI-generated Python.
Read post →BrassCoders, Snyk, Semgrep, SonarQube, and CodeRabbit each occupy a different pipeline slot. Here's how to map them to your CI workflow.
Read post →Autonomous coding agents ship code without a human in the review loop. BrassCoders scans the output regardless of authorship — here's what the patterns look like.
Read post →Regulatory frameworks were written before AI coding assistants existed. Here's which existing obligations apply — and what evidence record satisfies them for the code-review step.
Read post →A complete, section-by-section AI code review policy template for engineering teams — covering the technical gate, human review requirements, secrets handling, and escalation paths.
Read post →AI assistants generate async Python that shares mutable state without locking — the prompt asked for performance, not safety. Here's exactly what breaks and how to fix it.
Read post →BrassCoders applies 12 scanners to LLM application code. What changes isn't the scanner — it's which findings dominate: hardcoded API keys, missing input validation before prompt templates, and SQL/shell injection through tool calls.
Read post →Four Flask security patterns AI coding assistants get wrong: missing CSRF protection, debug=True in production, hardcoded secret_key, and SQL injection via f-string. Verified Bandit rule IDs included.
Read post →GDPR Article 25 requires privacy by design. BrassCoders's --offline flag delivers it: zero bytes leave the machine during an OSS scan. Here's how that maps to your GDPR obligations.
Read post →AI assistants write FastAPI endpoints that blindly map request bodies to database rows — including is_admin and role. Here's why it happens and how to stop it.
Read post →A 3-step playbook for adding BrassCoders to any dev environment: install the CLI, add a pre-commit hook, add a CI gate. Security baseline from day one.
Read post →The OWASP LLM Top 10 (2025) maps where AI applications break. This post maps which categories static analysis can reach — and which ones it can't, and why.
Read post →os.path.join(upload_dir, user_filename) is syntactically correct and semantically dangerous. Here's why AI assistants generate this pattern and what catches it.
Read post →AI assistants generate TypeScript with predictable security patterns — hardcoded keys, eval() calls, and unvalidated request data. Here's exactly what BrassCoders catches and where coverage ends.
Read post →SOC2 CC7.1 requires evidence that code was scanned before deployment. When AI writes the code, that evidence must show the AI-generated output went through the same scan gate — not just human-written commits.
Read post →SQLAlchemy's ORM parameterizes by default. But when AI assistants hit complex queries, they reach for text() with f-strings — and Bandit B608 fires on that pattern every time.
Read post →AI assistants add requests verify=False to silence SSL certificate errors. BrassCoders flags it as HIGH severity. Here's the attack path and the actual fix.
Read post →When an LLM returns a URL and the application fetches it without checking, the attacker controls the destination. Here's what that looks like in agentic code, what BrassCoders can catch, and what the AI triage layer handles.
Read post →AI coding assistants complete credential fields with whatever looks plausible. They have no access to your secrets manager, Vault config, or environment-variable conventions — and vibe coding removes the review step that would have caught it.
Read post →Ten developers using AI assistants produce ten different vulnerability surfaces. One deterministic scanner with fixed rules is the team-level gate that fixes this.
Read post →Andrej Karpathy coined vibe coding in February 2025. BrassCoders scanned 15 AI-generated Python files and found real issues in 9 — with zero generation-time warnings. That gap is the velocity risk.
Read post →Python's random module is predictable to attackers. BrassCoders flags it via Bandit B311 — the fix is one import swap to secrets.
Read post →User-influenced prompt input reaches your HTML page unescaped. The fix is Jinja2 autoescape=True. BrassCoders flags the misconfiguration before the model ever runs.
Read post →AI coding assistants generate package names that don't exist on PyPI. BrassCoders catches them before they become a supply chain attack.
Read post →Brass-SEO published a case study on the boundary-content GEO strategy behind this blog: winning AI citations by answering the questions BrassCoders doesn't own.
Read post →Everything a code scanner misses in AI-generated code reduces to one root cause: it sees structure, never intent, and never the running system.
Read post →A scanner proves code matches a known-bad shape; it can't prove the code does the right thing. A logic bug leaves no pattern to match — which is why BrassCoders hands correctness to the LLM layer, with benchmark data to show the seam.
Read post →Prompt injection is a runtime attack on the AI agent reading your repository, not a pattern in the code it writes. No source scanner sees it. Here's where the exposure is and where the mitigations actually live.
Read post →Debug mode on in production, a missing security header, a permissive CORS policy — these are properties of the deployed system, not literals a source scan reads. BrassCoders catches the ones hardcoded in source and names the rest as the runtime layer's job.
Read post →Authorization is a fact about who should access what — intent a pattern scanner can't see. That's why broken access control is OWASP's #1 web risk, and why an AI-written authz check that looks plausible is the dangerous case. BrassCoders draws the line.
Read post →A pattern scanner flags known-bad shapes. A deliberate backdoor is engineered to look like known-good code — which is how the xz-utils backdoor cleared human review and every static check. That's the provenance layer, not the scan.
Read post →A scanner flags performance anti-patterns — a nested loop, an N+1 query shape. It can't tell you your actual bottleneck, because the hotspot is a measured property of a running workload. That's a profiler's job, and BrassCoders says so.
Read post →AI assistants reach for MD5, AES-ECB, and the random module because their training data did. BrassCoders flags every instance through Bandit's crypto rules, and the research measures how often it matters.
Read post →Ask any AI assistant how to catch the bugs your AI writes and the answers split in two: deterministic scanners for structural bugs, an LLM for intent.
Read post →A source scanner catches PII written into code. An LLM app leaks at inference, when the model emits data it was handed — a string that never appears in your source. That's a different layer, and BrassCoders says so.
Read post →A deterministic scanner narrows scope before your AI assistant triages. Research backs the hybrid: the pre-pass finds what rules catch; the model handles what rules can't.
Read post →BrassCoders found command injection in 2 of 15 AI-generated files: run_command.py used subprocess with shell=True on a string argument, thumbnail.py used os.system with an f-string path.
Read post →BrassCoders flagged 53 findings across 15 AI-generated files. On triage, 9 of 15 were real. The gap between those numbers is the reason a scanner that infers intent would be worse.
Read post →BrassCoders writes .brass/ai_instructions.yaml with severity, file path, line number, and remediation for every finding. A chat prompt gives none of that. Here's why the difference matters.
Read post →BrassCoders found hardcoded credentials in 2 of 15 AI-generated files: token_check.py had a literal HMAC signing key, email_sender.py had an SMTP password. Both came from realistic prompts.
Read post →BrassCoders writes .brass/ai_instructions.yaml sorted by severity, with line numbers and remediation notes. Here's what Claude Code does with each field and why the structure matters.
Read post →BrassCoders' benchmark found the model issued zero proactive security warnings during code generation, then caught 12 of 12 bugs when asked to review. A gate needs to run without being asked.
Read post →BrassCoders found SQL injection in 2 of 15 AI-generated Python files. Both used Python string formatting to build queries. Both passed prompt review. Neither Pylint nor the model warned during generation.
Read post →AI assistants reach for the simpler API. yaml.load executes arbitrary Python on unsafe input. BrassCoders found it in config_loader.py, an AI-generated file from a realistic prompt.
Read post →BrassCoders writes .brass/ai_instructions.yaml — plain YAML, no proprietary encoding. Here's how to use that file as context in Claude Code, Cursor, and Continue.
Read post →Sourced: Veracode found 45% of AI code carries an OWASP Top 10 flaw, CodeRabbit measured 1.7x more issues per PR, and ~20% of AI-suggested packages don't exist.
Read post →METR's 2025 trial found experienced developers were 19% slower with AI tools while believing they were 20% faster. The gap is unreviewed code.
Read post →Research sorts bugs in AI-generated code into eight classes. Here's which a deterministic Python scanner catches and which still need a human or an LLM.
Read post →BrassCoders flagged a finding in all 15 AI-generated Python files. On triage, 9 carried a real security or performance issue. The other findings were the reason you triage.
Read post →LLM reviewers vary run to run and mislocate findings. A deterministic scanner returns the same findings every commit. A 2025 benchmark backs running both.
Read post →AI assistants invent package names that don't exist; one study found 19.7%. BrassCoders flags every unresolvable import before the install runs.
Read post →AI assistants write O(N²) loops that pass every test and crawl at scale. BrassCoders flags all four patterns where Bandit and Semgrep catch none.
Read post →AI assistants hardcode realistic-looking API keys into example code. BrassCoders bundles detect-secrets and adds custom formats, covering 20+ credential types.
Read post →AI assistants drop real-looking names, emails, and SSNs into fixtures and stubs. BrassCoders flags PII-shaped strings in source before they reach a shared repo.
Read post →All 12 scanners are free in the OSS core; Paid adds ranking, not detection. The honest line on when free is enough and when $12/dev/month pays off.
Read post →BrassCoders bundles Bandit, Pylint, Pyre/Pysa, Semgrep, ast-grep, and detect-secrets into one scan: one install, one ranked YAML, no six-tool config.
Read post →BrassCoders runs a Babel-based JavaScript and TypeScript scanner on .js and .ts files automatically, catching secrets and security patterns alongside Python.
Read post →The OSS core finds everything; the Paid plan ranks it. BrassCoders Paid cuts a typical 1500+ raw findings to a focused 50-80, for $12 per developer per month.
Read post →As AI coding assistants get better, the obvious bugs vanish and the structural ones hide inside code that looks too clean to question.
Read post →Add BrassCoders to your GitLab CI pipeline in under 10 minutes. Full .gitlab-ci.yml config, artifact upload, merge request gates, and Paid plan license key setup.
Read post →AI coding assistants write tests that pass CI but miss real bugs: always-true assertions, empty bodies, mock-everything tests. What BrassCoders catches and what requires mutation testing.
Read post →Run brasscoders scan, open .brass/ai_instructions.yaml in Cursor, ask Cursor to triage. The workflow for reviewing AI-generated code without reading 1500 raw findings yourself.
Read post →The 45-source evidence base behind BrassCoders is now on GitHub: 8 research categories on AI-code risk, machine-readable JSON, and an llms.txt built for AI assistants.
Read post →Four Django security patterns AI coding assistants get wrong: SQL injection via raw(), missing CSRF_COOKIE_SECURE, DEBUG=True in production, and unsafe mark_safe(). Code examples and BrassCoders findings.
Read post →USENIX Security 2025: 19.7% of AI-recommended packages don't exist. Lasso Security's PoC received 30,000+ downloads. How the PyPI attack surface works, and how BrassCoders's phantom-package scanner catches it before pip install runs.
Read post →Snyk catches CVEs in your dependencies. BrassCoders catches bugs in your source code. Different attack surfaces, different tools — here's when you need each.
Read post →SOC 2 Type II requires evidence of continuous vulnerability monitoring. The .brass/detailed_analysis.yaml file — retained 90 days in CI artifacts — provides machine-readable evidence of what was scanned, when, and what was found.
Read post →SonarQube is a code-quality workflow platform. BrassCoders is a focused AI-coder CI gate with YAML output for AI assistants. They solve different problems — here's when you need each, and when you need both.
Read post →How to work through BrassCoders findings without burning out your team: severity tiers, when to fix vs suppress, .brassignore vs inline comments, and how AI enrichment changes the calculus.
Read post →A fresh brasscoders scan on a medium Django project produces 1500+ findings. .brassignore cuts that to ~300 signal findings without touching the Paid plan. Here's every pattern worth adding.
Read post →Step-by-step guide to adding BrassCoders static analysis to your Python CI pipeline with GitHub Actions — copy-paste workflow, artifact upload, and build-failure configuration.
Read post →A practical template for writing a code review policy when 40% of your diff is AI-generated. Covers pre-commit gates, CI enforcement, human review thresholds, and audit trails.
Read post →BrassCoders and CodeRabbit occupy different pipeline slots — one scans every commit deterministically before a PR exists, the other reviews the diff conversationally when the PR opens. Most teams run both.
Read post →What AI coding assistants get wrong with FastAPI — and how BrassCoders catches SQL injection, shell injection, and hardcoded credentials before they reach production.
Read post →Cloud API code reviewers transmit your source code to third-party endpoints on every commit. For HIPAA and SOC 2 teams, that transmission creates a compliance gap BrassCoders's local scanner avoids entirely.
Read post →Set up BrassCoders as a pre-commit hook to block hardcoded secrets, SQL injection, and hallucinated imports before they hit your git history — 5 lines of config.
Read post →Semgrep and BrassCoders share a scanner. The useful question is what each adds that the other doesn't — for Python teams shipping AI-generated code.
Read post →Vibe coding ships fast. The O(N²) loop, the hardcoded secret, the hallucinated import — they ship too. BrassCoders catches all four bug classes in 30 seconds.
Read post →Gartner projects 75-90% of enterprise engineers on AI assistants by 2028. Copilot has 4.7M paid seats, Cursor $2B ARR, Claude Code a multi-billion run-rate. Five numbers.
Read post →Asking an AI to review your AI's code is not a quality control. It's a conversation. Here's why the distinction matters for anyone shipping AI-assisted software.
Read post →Head-to-head on 12 AI-generated Python files: BrassCoders 11/12, Claude 12/12, Bandit 6/12, Pylint 1/12. What the numbers mean for your pre-merge workflow.
Read post →A walkthrough of the four AI-coder performance anti-patterns BrassCoders catches that Bandit, Pylint, and a frontier model reviewer all miss: O(N²) string concat, insert-at-zero loops, triple-nested joins, and unbounded polls.
Read post →When you invoke an AI code reviewer, your source code travels to an external API. Here's exactly what gets sent, why that matters for regulated and proprietary codebases, and what the alternative looks like.
Read post →Bandit caught 6 of 12 planted bugs in BrassCoders's AI-coder benchmark — and 0 of the 4 performance anti-patterns AI coding assistants introduce most often. Here's why, and what to add alongside it.
Read post →BrassCoders is one of five AI tools from Copper Sun Content and Creative. Here are the other four, and why an engineer might actually want them.
Read post →Auditors do not accept stochastic scanner output. Deterministic, reproducible, citation-ready YAML — the audit posture an AI-augmented engineering team needs by 2026.
Read post →A static-analysis report with 1,500 findings is functionally a report with zero findings — nobody reads it. The bottleneck is ranking, not detection.
Read post →AI code review and deterministic static analysis are complementary layers, not competitors. The math of running both, the hand-off prompt, and when replacing one with the other is wrong.
Read post →AI coding assistants reason within a single file's context window and miss bugs whose taint flows across three or more files. The category that ships past AI-assisted review.
Read post →AI-generated code drove a near-sixfold CVE increase within Q1 2026 — from 6 AI-attributed CVEs in January to 35 in March alone. A reading of what the data says about where deterministic detection needs to go.
Read post →The full BrassCoders CLI is open source on GitHub under Apache 2.0. 12 scanners, source-auditable detection, contributions welcome. Repo at CopperSunDev/brasscoders.
Read post →BrassCoders Paid is now generally available. $12/dev/month adds AI-powered semantic dedup, cluster sizing, and rank-by-relevance against your project signature. The OSS core stays free forever.
Read post →AI coding assistants embed credentials in generated config files, example scripts, and test fixtures more often than developers expect. The detection pattern is entropy plus format matching — here is what BrassCoders scans for and why.
Read post →A worked example of BrassCoders plus an AI assistant doing real PR review work. Scan locally, hand the ranked output to Claude Code or Cursor, walk each finding to a diff. Total reviewer time stays roughly constant regardless of diff size.
Read post →BrassCoders scans run entirely on your machine by default. The Paid plan adds one network call to our gateway with already-redacted findings, never raw source code. Here is every byte that leaves your machine.
Read post →AI coding assistants confidently generate imports of packages that don't exist on PyPI or npm. The pattern is documented, the supply-chain risk is real, and the detection is straightforward — here is how it works.
Read post →AI code review tools surface a lot of speculative noise alongside the real bugs. Here's why that happens and how to filter the output down to the findings that merit a developer's attention.
Read post →