Skip to content
Back to skills

Cognitive Load Reviewer

ASecurity

Analyze and reduce cognitive load in code by identifying complex conditionals, deep nesting, shallow modules, excessive abstractions, and architectural over-engineering. Use when reviewing code quality, refactoring for maintainability, or simplifying systems. Keywords: cognitive load, complexity, refactor, simplify, maintainability, readability, mental overhead, abstraction, architecture review

  • 666 stars
  • 0 votes
  • 0 copies
  • 3 views
  • Added February 8, 2026
developmentrustgosqlexpressdebuggingrefactoring

Security analysis

A100/100

Scanned February 12, 2026

npx -y skills add majiayu000/claude-skill-registry --skill cognitive-load-reviewer --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Cognitive Load Reviewer?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Cognitive Load Reviewer
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/majiayu000-cognitive-load-reviewer/badge)](https://www.skillsdirectory.com/skills/majiayu000-cognitive-load-reviewer)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: cognitive-load-reviewer
description: Analyze and reduce cognitive load in code by identifying complex conditionals, deep nesting, shallow modules, excessive abstractions, and architectural over-engineering. Use when reviewing code quality, refactoring for maintainability, or simplifying systems. Keywords: cognitive load, complexity, refactor, simplify, maintainability, readability, mental overhead, abstraction, architecture review
---

# Cognitive Load Reviewer

Identifies and reduces extraneous cognitive load in software systems following evidence-based principles.

## Core Principle

**Working Memory Limit**: Humans can hold ~4 chunks of information simultaneously. Code exceeding this threshold creates mental fatigue and slows development.

**Goal**: Reduce *extraneous* cognitive load (caused by poor design) while accepting *intrinsic* load (inherent domain complexity).

## Analysis Framework

### 1. Complex Conditionals

**Look for:**
- Nested boolean expressions: `if val > X && (a || b) && (c && !d)`
- Multiple conditions without intermediate variables
- Logic requiring mental simulation to understand

**Fix:**
```rust
// ❌ High cognitive load
if val > constant && (cond2 || cond3) && (cond4 && !cond5) {
    // ...
}

// ✅ Externalized mental bookkeeping
let exceeds_threshold = val > constant;
let has_valid_mode = cond2 || cond3;
let is_enabled = cond4 && !cond5;

if exceeds_threshold && has_valid_mode && is_enabled {
    // ...
}
```

### 2. Deep Nesting

**Look for:**
- Multiple levels of indentation (>3 levels)
- Nested if/match statements
- Accumulated context requirements

**Fix:**
```rust
// ❌ Nested context tracking
fn process(data: Option<Data>) -> Result<Output> {
    if let Some(data) = data {
        if data.is_valid() {
            if let Some(result) = data.compute() {
                return Ok(result);
            }
        }
    }
    Err(Error::Invalid)
}

// ✅ Early returns focus on happy path
fn process(data: Option<Data>) -> Result<Output> {
    let data = data.ok_or(Error::Missing)?;
    if !data.is_valid() {
        return Err(Error::Invalid);
    }
    data.compute().ok_or(Error::ComputeFailed)
}
```

### 3. Shallow vs. Deep Modules

**Identify shallow modules:**
- Complex interface with minimal functionality
- Many small functions/methods requiring multiple mental models
- High coupling between components

**Prefer deep modules:**
- Simple interface hiding complex implementation
- Unix I/O principle: 5 basic calls, 100K+ lines internal complexity
- Single entry point with clear contract

**Example:**
```rust
// ❌ Shallow - many small pieces
struct UserValidator;
struct PasswordHasher;
struct SessionCreator;
struct TokenGenerator;
// ... requires understanding 4+ components

// ✅ Deep - simple interface, complex internals
struct AuthService {
    pub fn authenticate(&self, credentials: Credentials) -> Result<Session>
    // Hides validation, hashing, session creation internally
}
```

### 4. Abstraction Layers

**Red flags:**
- Hexagonal/Onion architecture with 5+ layers
- Repository patterns abstracting simple queries
- Domain/Application/Infrastructure separation without clear benefit
- "MetricsProviderFactoryFactory" naming patterns

**Reality check:**
- Can newcomers contribute within hours or days?
- Does debugging require tracing through multiple layers?
- Are abstraction layers solving real extension points or architectural purity?

**Principle:** Add abstraction only for justified extension points, not preemptive flexibility.

### 5. DRY Abuse

**Look for:**
- Shared code between unrelated domains
- Premature abstractions creating tight coupling
- "Generic" utilities requiring mental mapping

**Guideline:**
```rust
// ✅ "A little copying is better than a little dependency"
// Duplicate 5-10 lines if it maintains clarity and independence
// Abstract only when 3+ use cases demonstrate clear pattern
```

### 6. Microservices Over-Granularity

**Warning signs:**
- Changes require modifying 4+ services
- Distributed monolith patterns
- More services than team members

**Case study:** 5 developers, 17 microservices → 10 months behind schedule

**Principle:** Defer network boundaries until logical system boundaries are clear.

### 7. Framework Magic

**Look for:**
- Business logic embedded in framework code
- Annotations/macros hiding control flow
- "Magic" requiring framework internals knowledge before contributing

**Fix:**
```rust
// ❌ Framework-coupled business logic
#[framework::magic_handler]
async fn process_order(ctx: FrameworkContext) -> FrameworkResponse {
    // Business logic intertwined with framework
}

// ✅ Framework as library, business logic separate
async fn process_order(order: Order) -> Result<Receipt> {
    // Pure business logic, framework-agnostic
}

// Adapter layer handles framework integration
```

### 8. Self-Describing Values

**Look for:**
- Numeric error codes requiring mental mappings
- Boolean flags without semantic names
- Magic numbers without constants

**Fix:**
```rust
// ❌ Requires memorization
return Err(401);

// ✅ Self-describing
return Err(AuthError::JwtExpired);

// ❌ Magic number
if status == 418 { ... }

// ✅ Named constant
const TEAPOT_STATUS: u16 = 418;
if status == TEAPOT_STATUS { ... }
```

### 9. Inheritance Hierarchies

**Look for:**
- Multiple inheritance levels (>2)
- Vertical cognitive chains requiring class-hopping
- Overridden behavior modifications

**Prefer:**
- Composition over inheritance
- Trait/interface implementations without deep hierarchies
- Flat structures with explicit dependencies

## Analysis Process

### Step 1: Identify Cognitive Hotspots

Scan code for:
- Functions >50 lines
- Nesting depth >3 levels
- Complex boolean logic
- Multiple abstraction layers
- Module coupling patterns

### Step 2: Measure Mental Overhead

Ask:
- How many facts must I hold in memory?
- Can I understand this without context-switching?
- Would a newcomer understand this in <5 minutes?
- Does this require memorizing mappings/conventions?

### Step 3: Categorize Load Type

- **Intrinsic**: Domain complexity (accept it)
- **Extraneous**: Design choices (fix it)

### Step 4: Recommend Improvements

Prioritize:
1. **High impact, low effort**: Extract intermediate variables, early returns
2. **Medium impact**: Simplify module boundaries, reduce abstractions
3. **Strategic**: Architecture simplification, framework decoupling

## Output Format

Present findings as:

### 🧠 Cognitive Load Analysis

**High Load Areas** (>4 mental chunks required)
- `crates/parser/src/query.rs:145` - Complex conditional with 6 boolean clauses
- `crates/storage/src/engine.rs:89` - 5 levels of nesting, difficult to track state

**Shallow Module Patterns** (complex interface, minimal functionality)
- `StorageAdapter` + `QueryExecutor` + `ResultMapper` could merge into single `QueryEngine`

**Excessive Abstraction**
- Repository pattern adds indirection without extension points
- Consider direct SQL calls via jOOQ-style query builder

**Improvement Priorities**

1. **Extract intermediate variables** in `query.rs:145`
   ```rust
   let has_valid_columns = !columns.is_empty() && columns.iter().all(|c| c.is_valid());
   let within_bounds = offset >= 0 && limit <= MAX_LIMIT;
   if has_valid_columns && within_bounds { ... }
   ```

2. **Flatten nesting** in `engine.rs:89` using early returns

3. **Merge shallow modules** to create deeper interface with simpler mental model

## Onboarding Metric

**Critical test:** Can a new developer contribute within 1-2 days?

If newcomers struggle >40 consecutive minutes, cognitive load needs reduction.

## Project Integration

Reference `CLAUDE.md` principles:
- Incremental development reduces cognitive overhead
- TDD externalizes requirements into tests
- Small commits maintain reviewability
- Parallel sub-agents distribute analysis cognitive load

## Success Examples

- Instagram: 14M users with 3 engineers (simple architecture)
- Unix I/O: Deep module pattern (5 calls, 100K+ lines hidden)
- Raft consensus: Designed explicitly for understandability

## Anti-Pattern Summary

❌ Overly granular module decomposition
❌ Excessive architectural layers without benefit
❌ Numeric codes requiring memorization
❌ Framework-embedded business logic
❌ Premature DRY abstractions
❌ Deep inheritance chains
❌ Nested conditionals without intermediate variables
❌ Shallow modules forcing multi-component mental models

## Remember

**"The best components provide powerful functionality yet have a simple interface."**

Optimize for reducing the mental effort required to understand and modify code.

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.