Skip to main content
skill CX Codex

software-patterns — Claude Code skill: pick the right architecture

Compares tradeoffs between architectural patterns and points to the one that fits your problem: coupling, resilience, service boundaries. Useful when code resists testing.

Install into Claude Code · Skills CLI (Vercel) All methods and platforms ↓
npx skills add bobmatnyc/claude-mpm-skills --skill software-patterns -a claude-code
Open on GitHub

What software-patterns does

This is not a catalog to memorize. The skill walks a decision tree: name the problem class first, then see which pattern closes it. Dependency injection and service-oriented architecture sit at the foundation and are meant to be applied by default. Repository, domain events, anti-corruption layer and circuit breaker stay situational — you reach for them once a symptom shows up.

Six reference files ship with it: foundational-patterns.md, situational-patterns.md, anti-patterns.md, decision-trees.md, examples.md and code-smell-signals.md. That last one maps low-level smells — large switches, nested loops, parameter reassignment, high coupling — to the architectural problem they signal and the pattern that fixes it. Examples are language-agnostic pseudocode.

A red flags section is built in. Reach for every pattern at once, or justify a choice with "it's best practice", and the skill stops you and asks for the actual problem. On a codebase with no coupling symptoms it changes nothing, which is the intended behaviour.

What it helps with

  • untangle classes that build their own dependencies
  • move database access behind a service boundary
  • break a call cycle between services with domain events
  • stop one slow external API from taking the system down
  • keep a third-party API from leaking into your domain model

Example prompts for the agent

  • services instantiate their own dependencies and tests are painful — which pattern fits?
  • service A calls B, B calls C, C calls A again. how do I break the cycle?
  • the external API keeps changing fields and breaking our code. what goes between them?

How to install software-patterns

1Skills CLI (Vercel)

npx skills add bobmatnyc/claude-mpm-skills --skill software-patterns -a claude-code

2Manually: put the files in place

~/.claude/skills/software-patterns/SKILL.md

Copy the whole skill folder; for one project use .claude/skills/software-patterns/

Step by step, with commands for each platform: How to install skills in Claude Code: five ways

Questions about software-patterns

How do I install software-patterns in Claude?

Run npx skills add bobmatnyc/claude-mpm-skills --skill software-patterns -a claude-code. The skill file then lands at ~/.claude/skills/software-patterns/SKILL.md.

What does software-patterns do?

It compares architectural pattern tradeoffs and recommends one for your problem: dependency injection, SOA, repository, domain events, circuit breaker, anti-corruption layer.

Does the skill invoke the model on its own?

No. It carries disable-model-invocation: true and user-invocable: false, so it works as a reference rather than a standalone command.

Source text

SKILL.md · MIT
---
name: software-patterns
description: "Compare tradeoffs and recommend architectural patterns — dependency injection, service-oriented architecture, repository, domain events, circuit breaker, and anti-corruption layer. Use when choosing between design patterns, planning microservices boundaries, evaluating system design alternatives, or asking 'which pattern should I use' for a specific coupling or resilience problem."
user-invocable: false
disable-model-invocation: true
version: 1.1.0
updated: "2026-06-15"
languages: all
progressive_disclosure:
  entry_point:
    summary: "Compare tradeoffs and recommend architectural patterns for coupling, resilience, and boundary problems"
    when_to_use: "When choosing between design patterns, planning microservices, evaluating dependency injection vs service locator, or deciding how to decouple services"
    quick_start: "1. Identify the problem class 2. Check decision tree 3. Apply foundational patterns (DI+SOA) 4. Layer situational patterns as needed"
  references:
    - foundational-patterns.md
    - situational-patterns.md
    - anti-patterns.md
    - decision-trees.md
    - examples.md
    - code-smell-signals.md
tags:
  - architecture
  - patterns
  - design-patterns
  - dependency-injection
  - service-oriented-architecture
  - microservices
  - system-design
---

# Software Patterns Primer

## Overview

Architectural patterns solve specific structural problems. This skill provides a decision framework for when to apply each pattern, not a catalog to memorize.

**Core philosophy:** Patterns solve problems. No problem? No pattern needed.

## When to Use This Skill

Activate when:
- Designing a new system or major feature
- Adding external service integrations
- Code becomes difficult to test or modify
- Services start calling each other in circles
- Failures in one component cascade to others
- Business logic scatters across multiple locations

## Pattern Hierarchy

### Foundational (Apply by Default)

These patterns provide the structural foundation for maintainable systems. Apply unless you have specific reasons not to.

| Pattern | Problem Solved | Signal to Apply |
|---------|---------------|-----------------|
| **Dependency Injection** | Tight coupling, untestable code | Classes instantiate their own dependencies |
| **Service-Oriented Architecture** | Monolithic tangles, unclear boundaries | Business logic scattered, no clear ownership |

**DI quick example — before and after:**

```python
# BEFORE: tight coupling, hard to test
class OrderService:
    def __init__(self):
        self.db = PostgresDatabase()       # concrete dependency
        self.mailer = SmtpMailer()         # concrete dependency

# AFTER: dependencies injected, easily testable
class OrderService:
    def __init__(self, db: Database, mailer: Mailer):
        self.db = db
        self.mailer = mailer
# In tests: OrderService(db=FakeDatabase(), mailer=FakeMailer())
```

### Situational (Apply When Triggered)

These patterns address specific problems. Don't apply preemptively.

| Pattern | Problem Solved | Signal to Apply |
|---------|---------------|-----------------|
| **Repository** | Data access coupling | Services know about database details |
| **Domain Events** | Circular dependencies, temporal coupling | Service A calls B calls C calls A |
| **Anti-Corruption Layer** | External system coupling | External API changes break your code |
| **Circuit Breaker** | Cascading failures | One slow service takes down everything |

→ [Foundational Patterns Detail](references/foundational-patterns.md)
→ [Situational Patterns Detail](references/situational-patterns.md)

## Quick Decision Tree

```
Is code hard to test?
├─ Yes → Apply Dependency Injection
└─ No → Continue

Is business logic scattered?
├─ Yes → Apply Service-Oriented Architecture
└─ No → Continue

Do services know database details?
├─ Yes → Apply Repository Pattern
└─ No → Continue

Do services call each other in cycles?
├─ Yes → Apply Domain Events
└─ No → Continue

Does external API change break your code?
├─ Yes → Apply Anti-Corruption Layer
└─ No → Continue

Does one slow service break everything?
├─ Yes → Apply Circuit Breaker
└─ No → Current patterns sufficient
```

→ [Complete Decision Trees](references/decision-trees.md)

## Implementation Priority

When starting a new system:

1. **First:** Establish DI container/pattern
2. **Second:** Define service boundaries (SOA)
3. **Third:** Add Repository for data access
4. **Then:** Layer situational patterns as problems emerge

When refactoring existing system:

1. **First:** Identify the specific pain point
2. **Second:** Apply the minimal pattern that solves it
3. **Third:** Validate improvement before adding more

## Navigation

### Pattern Details
- **[Foundational Patterns](references/foundational-patterns.md)**: DI and SOA implementation guides, when to deviate
- **[Situational Patterns](references/situational-patterns.md)**: Repository, Domain Events, ACL, Circuit Breaker details

### Decision Support
- **[Decision Trees](references/decision-trees.md)**: Complete flowcharts for pattern selection
- **[Anti-Patterns](references/anti-patterns.md)**: Common misapplications and how to recognize them
- **[Code-Smell Signals](references/code-smell-signals.md)**: Low-level code smells (large switches, nested loops, parameter reassignment, high complexity/coupling) mapped to the architectural problems they signal and the pattern that fixes each — derived from CAST Highlight `_multi` quality indicators (https://doc.casthighlight.com/)

### Implementation
- **[Examples](references/examples.md)**: Language-agnostic pseudocode for each pattern combination

## Red Flags - STOP

STOP when:
- "Let me add all these patterns upfront" → Apply only what solves current problems
- "This pattern is best practice" → Best practice for what problem?
- "We might need this later" → YAGNI - add when needed
- "Service Locator is simpler" → Hidden dependencies cause testing pain
- "I'll just call this service directly" → Consider if events would decouple better
- "External API is stable, no need for ACL" → APIs always change eventually

**ALL of these mean: STOP. Identify the specific problem first.**

## Integration with Other Skills

- **test-driven-development**: DI enables testability; TDD validates pattern application
- **systematic-debugging**: Clear boundaries (SOA) simplify debugging
- **root-cause-tracing**: Well-structured services have clearer call chains

## Pattern Combinations

Common effective combinations:

| Scenario | Patterns |
|----------|----------|
| New microservice | DI + SOA + Repository |
| External API integration | DI + ACL + Circuit Breaker |
| Event-driven system | DI + SOA + Domain Events |
| Data-heavy application | DI + SOA + Repository + Unit of Work |

---

**Remember:** Patterns exist to solve problems. Start with the problem, not the pattern.

© bobmatnyc · MIT · bobmatnyc/claude-mpm-skills

Similar skills

Everything for Backend and APIs →

From the same set65

kubernetes A Kubernetes operations playbook for your agent: safe rollouts, health probes, resource sizing and fast kubectl triage. CX Codex +1 383installs systematic-debugging This skill guides an agent from reproducing a bug to checking the fix. Use it when an error or unexpected behavior has no clear cause. CX Codex +1 382installs vue A Vue 3 skill for your coding agent: Composition API, reactivity, single-file components, Vue Router, Pinia, TypeScript and Vite. Useful when the agent writes Vue frontend code. CX Codex +1 381installs api-documentation A set of rules that tells the agent how to write docstrings, JSDoc, Godoc and endpoint descriptions. Useful when several agents each carry their own copy of the same guidance. CX Codex +1 379installs nextjs-v16 A skill that walks a project through the Next.js 16 migration: async request APIs, opt-in caching with "use cache", Turbopack. Useful when upgrading an existing app. CX Codex +1 371installs testing-anti-patterns A skill for spotting tests that verify mock behavior, add test-only production methods, or use incomplete mocks. CX Codex +1 368installs vercel-deployments-builds Walks through the Vercel deployment lifecycle: builds, previews, release phases and rollback. Useful when you configure build output or control releases. CX Codex +1 368installs stacked-prs A skill that walks the agent through building stacks of dependent pull requests, where each branch grows from the previous one instead of main. Useful when a large feature is split into phases. CX Codex +1 362installs

Project sponsors

Companies that keep this analytics open
Gold sponsor

Impressions, clicks and code copies — open statistics. We keep the numbers public for the same reason NeBlask itself is public. Become a sponsor