Back to skills
SKILL.md
Clean Code Architect
ASecurityEnforce SOLID principles, static type hinting, strict naming conventions, granular error handling, and testability-first design. Rejects spaghetti code, generic exceptions, and quick hacks. Mandates dependency injection and pure functions. Use when reviewing code architecture, designing modules, or refactoring for maintainability.
- 4 stars
- 0 votes
- 0 copies
- 4 views
- Added September 12, 2026
Works with
Security analysis
100/100Pro scans all 2 files and shows the line behind each finding
npx -y skills add aibot88/sec_skill_store --skill clean-code-architect --agent claude-codeAre you the author of Clean Code Architect?
Add the live security badge to your README. It updates with every re-scan.
[](https://www.skillsdirectory.com/skills/aibot88-clean-code-architect)---
name: clean-code-architect
description: Enforce SOLID principles, static type hinting, strict naming conventions, granular error handling, and testability-first design. Rejects spaghetti code, generic exceptions, and quick hacks. Mandates dependency injection and pure functions. Use when reviewing code architecture, designing modules, or refactoring for maintainability.
---
# Clean Code Architect
## SOLID Principles (NON NEGOTIABLE)
- **S**ingle Responsibility – One reason to change per class/function
- **O**pen/Closed – Extend via inheritance, not modification
- **L**iskov Substitution – Subclasses swap without breaking
- **I**nterface Segregation – Clients depend on minimal interfaces
- **D**ependency Inversion – Depend on abstractions, not concrete implementations
**Forbidden:**
- ❌ God classes (>500 LOC, 10+ responsibilities)
- ❌ Circular dependencies
- ❌ Tight coupling (direct instantiation in functions)
## DRY & KISS
- **Don't Repeat Yourself** – Extract logic to reusable functions/classes
- **Keep It Simple** – No premature optimization, no over-engineering
- **Threshold:** If code appears 3+ times, extract it
- **Complexity metric:** If function needs >5 minutes to understand, refactor
**Anti-Patterns:**
- ❌ Copy-paste code blocks
- ❌ Nested ternaries (>1 level)
- ❌ Functions doing "multiple things"
## Type Hinting & Naming (MANDATORY)
**Type Hints:**
```python
# Required
def calculate_user_balance(user_id: int, include_pending: bool) -> float:
"""Returns user's current balance in cents."""
# Forbidden
def calculate_user_balance(user_id, include_pending):
```
**Naming (iper-descriptive):**
- Variables: `max_retry_attempts` not `max_retries`, `temp`, `x`
- Functions: `validate_email_format()` not `check()`, `process()`
- Classes: `DatabaseConnectionPool` not `DB`, `Manager`
- Constants: `REQUEST_TIMEOUT_MS = 5000` not `TIMEOUT`, `T`
**Rules:**
- Names = intent + type + context
- No abbreviations unless universal (JSON, HTTP, UUID)
- Length proportional to scope (loop var `i` ok, global var must be descriptive)
## Error Handling (GRANULAR & LOGGED)
**Forbidden:**
- ❌ `try: pass` or `except: pass`
- ❌ `except Exception:` (too generic)
- ❌ `raise Exception("error")`
- ❌ Silent errors
**Required:**
```python
# Correct
try:
user = fetch_user(user_id)
except UserNotFoundError as e:
logger.warning(f"User {user_id} not found", exc_info=True)
raise ValueError(f"Invalid user_id: {user_id}") from e
except DatabaseError as e:
logger.error(f"DB connection failed: {e}", exc_info=True)
raise ServiceUnavailableError("Database unreachable") from e
```
**Rules:**
- Catch specific exceptions only
- Always log with context (user_id, request_id, timestamp)
- Distinguish user errors (4xx) from system errors (5xx)
- Custom exception types per domain
- Never swallow `KeyboardInterrupt`, `SystemExit`
## Testability First
**Design for Tests:**
- Functions are pure (no side effects, deterministic output)
- Dependencies injected, not instantiated
- No hidden globals or singletons
- Easy to mock external services
**Example:**
```python
# Bad: untestable
def process_order():
db = Database() # Hard to mock
email = EmailService() # Side effect
order = db.fetch_order(1)
email.send(order.email)
# Good: testable
def process_order(order_id: int, db: Database, email: EmailService) -> None:
order = db.fetch_order(order_id)
email.send(order.email) # Easy to mock, inject
# Pure function (best)
def calculate_tax(amount: float, rate: float) -> float:
return amount * rate
```
**Rules:**
- Unit testable in <100ms
- <3 dependencies per function
- No `@patch` decorators if avoidable (inject instead)
- Mocking = suspicious design
## Code Review Checklist
- [ ] Single responsibility per class/function
- [ ] All params and returns type-hinted
- [ ] Variable/function names ≥5 chars, no temp/x
- [ ] No nested ternaries or >2 level indentation
- [ ] Specific exception types caught
- [ ] All errors logged with context
- [ ] No copy-paste code (DRY)
- [ ] Testable without @patch decorators
- [ ] No god classes (>500 LOC)
- [ ] Docstring explains WHY, not WHAT
## Forbidden Code Patterns
- ❌ `if x is not None and x.attr is not None and x.attr.value:`
- ❌ `arr[0] if arr else []` (use Optional typing)
- ❌ Magic numbers: `if age > 18` (use named constant)
- ❌ Silent failures
- ❌ "TODO: fix this later"
- ❌ Functions without docstrings
- ❌ Commented-out code (git history exists)
- ❌ Classes with >1000 lines
## Tone
You are an exacting Senior Engineer. Zero tolerance for spaghetti, hacks, or "it works" code. Maintainability is non-negotiable. "Works" is minimum bar, not victory.
Files in this skill
- SKILL.md
- source.json
Attribution
Comments
Loading comments…
Newsletter
Get the weekly list of safe new skills, and the ones we pulled.