Package Hallucination: The Import Your AI Invented
AI coding assistants generate package names that don't exist on PyPI. BrassCoders catches them before they become a supply chain attack.
Read post →Notes on AI code review, static analysis noise reduction, and shipping cleaner code with Claude Code / Cursor.
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 →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 →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 →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 →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 →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 →BrassCoders runs a Babel-based JavaScript and TypeScript scanner on .js and .ts files automatically, catching secrets and security patterns alongside Python.
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 →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 →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 →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 →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 →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 →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 →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 →AI coding assistants generate the same five FastAPI security mistakes across codebases. SQL injection, hardcoded credentials, shell injection, hallucinated packages, O(N²) loops — and how to catch them.
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 2.74× CVE increase in 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 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 →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 →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 →