"The bearing of a child takes nine months, no matter how many women are assigned."
β Frederick Brooks, The Mythical Man-Month (1975)
Fifty years later, Brooks was still right. And so was the rest of my shelf.
I ran the same code review with Claude twice.
First time: caught the SQL injection, flagged separation of concerns. Solid review.
Second time: focused on naming conventions. Missed the injection entirely.
Same code. Same model. Completely different results.
That's not a Claude problem. That's a consistency problem. And it's fixable β if you give the model a framework to work from.
So I encoded 12 classic engineering books into a Claude Code skill. Here's what happened.
The Problem
Most code quality tools count lines and cyclomatic complexity. That's useful, but it misses the deeper problems: architectural drift, knowledge silos, domain model distortion β the issues that slow teams down for months before anyone notices.
Meanwhile, the software engineering classics have had answers to these problems for decades. Brooks, Fowler, Martin, McConnell, Evans, Ousterhout β twelve books, fifty years of hard-won wisdom. The insights haven't changed. We just stopped encoding them consistently.
What I Built
brooks-lint is a Claude Code skill (also works with Gemini CLI and Codex CLI) that diagnoses code against twelve decay risk dimensions synthesized from 12 classic engineering books, producing structured findings with book citations, severity labels, and concrete remedies every time.
The 12 Books
| Book | Author |
|---|---|
| The Mythical Man-Month | Frederick Brooks |
| Code Complete | Steve McConnell |
| Refactoring | Martin Fowler |
| Clean Architecture | Robert C. Martin |
| The Pragmatic Programmer | Hunt & Thomas |
| Domain-Driven Design | Eric Evans |
| A Philosophy of Software Design | John Ousterhout |
| Software Engineering at Google | Winters, Manshreck & Wright |
| xUnit Test Patterns | Gerard Meszaros |
| The Art of Unit Testing | Roy Osherove |
| How Google Tests Software | Whittaker, Arbon & Carollo |
| Working Effectively with Legacy Code | Michael Feathers |
The Six Production Code Decay Risks
| Risk | Diagnostic Question |
|---|---|
| π§ Cognitive Overload | How much mental effort to understand this? |
| π Change Propagation | How many unrelated things break on one change? |
| π Knowledge Duplication | Is the same decision expressed in multiple places? |
| π Accidental Complexity | Is the code more complex than the problem? |
| ποΈ Dependency Disorder | Do dependencies flow in a consistent direction? |
| πΊοΈ Domain Model Distortion | Does the code faithfully represent the domain? |
Every finding follows the same chain: Symptom β Source (book + chapter) β Consequence β Remedy
The Six Test-Suite Decay Risks (New in v0.5)
brooks-lint now also audits your test suite against six test-space decay risks sourced from xUnit Test Patterns, The Art of Unit Testing, How Google Tests Software, and Working Effectively with Legacy Code:
| Risk | Diagnostic Question |
|---|---|
| π Test Obscurity | Can you understand what this test verifies at a glance? |
| π§± Test Brittleness | Does this test break when unrelated implementation details change? |
| π Test Duplication | Are the same scenarios covered in multiple places? |
| π Mock Abuse | Are mocks hiding real design problems? |
| π Coverage Illusion | Does high coverage give false confidence? |
| ποΈ Architecture Mismatch | Do tests reflect the production architecture? |
What It Looks Like
Given this code:
class UserService:
def update_profile(self, user_id, name, email, avatar_url):
user = self.db.query(f"SELECT * FROM users WHERE id = {user_id}")
user['email'] = email
if user['email'] != email: # always False β silent bug
self.smtp.send(...)
points = user['login_count'] * 10 + 500
self.db.execute(f"UPDATE loyalty SET points={points} WHERE user_id={user_id}")
brooks-lint produces:
Health Score: 28/100
π΄ Change Propagation β Single Method Changes for Four Unrelated Business Reasons
Symptom: update_profile performs profile updates, email notifications, loyalty
points recalculation, and cache invalidation all in one method body.
Source: Fowler β Refactoring β Divergent Change
Hunt & Thomas β The Pragmatic Programmer β Orthogonality
Consequence: Any change to the loyalty formula risks breaking email notifications.
Remedy: Extract NotificationService, LoyaltyService, and UserCacheInvalidator.
π΄ Domain Model Distortion β Silent Logic Bug: Email Notification Never Fires
Symptom: user['email'] = email overwrites the old value before the comparison β
the condition is always False. The notification is dead code.
Source: McConnell β Code Complete β Ch. 17: Unusual Control Structures
Consequence: Users are never notified when their email address changes.
Remedy: Capture old_email = user['email'] before any mutation.
(+ 6 more findings including SQL injection, dependency disorder, magic numbers)
Architecture Audit with Dependency Graph (v0.6)
In Mode 2, brooks-lint generates a Mermaid dependency graph color-coded by severity β red = Critical, yellow = Warning, green = clean. It renders natively in GitHub, VS Code, and Notion.
Four Modes
| Command | Short Form | Action |
|---|---|---|
/brooks-lint:brooks-review |
/brooks-review |
PR-level code review |
/brooks-lint:brooks-audit |
/brooks-audit |
Architecture audit with Mermaid dependency graph |
/brooks-lint:brooks-debt |
/brooks-debt |
Tech debt assessment with prioritized roadmap |
/brooks-lint:brooks-test |
/brooks-test |
Test suite health review |
Benchmark Results
Tested across 3 real-world scenarios (PR review, architecture audit, tech debt):
| Criterion | brooks-lint | Plain Claude |
|---|---|---|
| Structured findings | β 100% | β 0% |
| Book citations | β 100% | β 0% |
| Severity labels | β 100% | β 0% |
| Health Score (0β100) | β 100% | β 0% |
| Overall pass rate | 94% | 16% |
The gap isn't what Claude can find β it's what it consistently finds, with traceable evidence and actionable remedies every time.
How It Compares
| brooks-lint | ESLint/Pylint | GitHub Copilot | Plain Claude | |
|---|---|---|---|---|
| Structured diagnosis chain | β | β | β | β |
| Traces findings to classic books | β | β | β | β |
| Architecture-level insights | β | β | ~ | ~ |
| Domain model analysis | β | β | β | ~ |
| Zero config, no plugins | β | β | β | β |
| Works with any language | β | β | β | β |
brooks-lint doesn't replace your linter. It catches what linters can't.
Installation
Claude Code (Recommended)
/plugin marketplace add hyhmrright/brooks-lint
Gemini CLI
/extensions install https://github.com/hyhmrright/brooks-lint
Codex CLI
$brooks-review # skills trigger automatically on code quality discussions
Manual Install
cp commands/*.md ~/.claude/commands/
cp -r skills/ ~/.claude/skills/brooks-lint
Configuration (v0.7)
Place a .brooks-lint.yaml in your project root to customize behavior:
version: 1
disable:
- T5 # skip coverage metrics check
severity:
R1: suggestion # downgrade Cognitive Overload for this domain
ignore:
- "**/*.generated.*"
- "**/vendor/**"
GitHub: https://github.com/hyhmrright/brooks-lint β MIT licensed, free to use.
AI can help you write code faster, but it can't tell you whether you're building a cathedral or a tar pit. brooks-lint bridges that gap.
If you've used AI for code reviews, I'm curious: what's your biggest frustration with consistency? Drop it in the comments β I'd love to hear what decay risks you're seeing most.
If this was useful, a β€οΈ or unicorn helps others find it.













