agentleFS
CloudAI-XCloudAI-X/opencode-workflow/skills/designing-architecture/SKILL.md

designing-architecture

Skill275 starsChanged 10 months agoMITView on GitHub

Guides software architecture decisions, design patterns, and system design principles. Use when designing systems, choosing patterns, or making architectural decisions.

2 other projects use a version of this.

Adopted by

Most recently taken up by

  • Other versions2 projects use a version of this.

    Word for word · 0

    None found.

    Edited · 0

    None found.

    Wrote their own version · 2

    1. CloudAI-X/claude-workflow★ 1.4ksame name
    2. CloudAI-X/claude-workflow-v2★ 1.4ksame name

    How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.

  • In this repository6 other files it gives its agents.

The file

We split this skill into the rules it gives an agent

2 rules. About 0 are common, 2 are distinctive, and 0 are very specific to this project.

  • ≈0

    Common · estimate

    Many files like this have a rule of this kind.

  • ≈2

    Distinctive · estimate

    This author's own choices. Worth a look.

  • 0

    Very specific

    Tied to their project's names, files or tools. Probably skip.

  • Common
  • Distinctive
  • Very specific
  1. Distinctive:

    Big Ball of Mud: - No clear structure, everything depends on everything

    line 285
  2. Distinctive:

    Before finalizing an architecture decision, verify:

    line 298

≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
SKILL.md

Designing Architecture

Principles and patterns for designing maintainable, scalable, and robust software systems.

When to Use This Skill

  • Designing new systems or features
  • Choosing between architectural patterns
  • Making technology decisions
  • Reviewing system design
  • Planning for scalability
  • Refactoring legacy systems

Core Architecture Principles

SOLID Principles

PrincipleSummaryViolation Sign
Single ResponsibilityOne reason to changeClass does too many things
Open/ClosedOpen for extension, closed for modificationModifying existing code for new features
Liskov SubstitutionSubtypes replaceable for base typesOverrides break parent behavior
Interface SegregationSmall, focused interfacesClasses implement unused methods
Dependency InversionDepend on abstractionsHigh-level modules depend on low-level

The Dependency Rule

Outer layers depend on inner layers, NEVER the reverse.

┌─────────────────────────────────────┐
│     Frameworks & Drivers           │  ← Database, Web, UI
├─────────────────────────────────────┤
│     Interface Adapters             │  ← Controllers, Presenters, Gateways
├─────────────────────────────────────┤
│     Application Business Rules     │  ← Use Cases
├─────────────────────────────────────┤
│     Enterprise Business Rules      │  ← Entities
└─────────────────────────────────────┘

Dependencies point INWARD only.

Architectural Patterns

Layered Architecture

┌─────────────────────────────────────┐
│     Presentation Layer             │  ← UI, API Controllers
├─────────────────────────────────────┤
│     Application Layer              │  ← Use Cases, Services
├─────────────────────────────────────┤
│     Domain Layer                   │  ← Business Logic, Entities
├─────────────────────────────────────┤
│     Infrastructure Layer           │  ← Database, External APIs
└─────────────────────────────────────┘

Use when: Traditional applications, clear separation needed Avoid when: High-performance needs, event-driven systems

Hexagonal Architecture (Ports & Adapters)

           ┌───────────────┐
           │   Primary     │
           │   Adapters    │  ← REST API, CLI, GraphQL
           └───────┬───────┘
                   │
        ┌──────────▼──────────┐
        │                     │
        │   ┌───────────┐     │
        │   │   Core    │     │
Primary │   │  Domain   │     │ Secondary
Ports   │   │  Logic    │     │ Ports
        │   └───────────┘     │
        │                     │
        └──────────┬──────────┘
                   │
           ┌───────▼───────┐
           │   Secondary   │
           │   Adapters    │  ← Database, Message Queue, External API
           └───────────────┘

Use when: Testability is critical, multiple interfaces needed Avoid when: Simple CRUD applications

Microservices Architecture

┌─────────┐  ┌─────────┐  ┌─────────┐
│ Service │  │ Service │  │ Service │
│    A    │  │    B    │  │    C    │
└────┬────┘  └────┬────┘  └────┬────┘
     │            │            │
     └────────────┴────────────┘
                  │
           ┌──────▼──────┐
           │   Message   │
           │    Bus      │
           └─────────────┘

Use when: Independent scaling, team autonomy, polyglot needs Avoid when: Small teams, simple domains, tight coupling required

Event-Driven Architecture

Event Source → Event Bus → Event Handlers
     │              │              │
     ▼              ▼              ▼
  Produces    Routes Events    Consumes
  Events      (Kafka, RabbitMQ)  Events

Use when: Async processing, decoupling, audit trails Avoid when: Immediate consistency required, simple workflows


Design Patterns

Creational Patterns

PatternPurposeWhen to Use
FactoryCreate objects without specifying classObject creation logic is complex
BuilderConstruct complex objects step-by-stepMany optional parameters
SingletonSingle instance globallyShared resource (use sparingly)
Dependency InjectionInject dependencies externallyTestability, loose coupling

Structural Patterns

PatternPurposeWhen to Use
AdapterConvert interface to anotherIntegrating incompatible systems
DecoratorAdd behavior dynamicallyExtending functionality without inheritance
FacadeSimplified interface to complex systemHiding complexity
RepositoryAbstract data accessSeparating domain from persistence

Behavioral Patterns

PatternPurposeWhen to Use
StrategyInterchangeable algorithmsMultiple ways to do something
ObserverNotify dependents of changesEvent systems, reactive updates
CommandEncapsulate actions as objectsUndo/redo, queuing, logging
Chain of ResponsibilityPass request along handlersMiddleware, validation chains

Domain-Driven Design Concepts

Strategic Design

ConceptDefinitionExample
Bounded ContextExplicit boundary for a domain modelOrder context, Shipping context
Ubiquitous LanguageShared vocabulary between devs and domain experts"Order", "Line Item", "Fulfillment"
Context MapHow bounded contexts relateCustomer shared between Sales and Support

Tactical Patterns

PatternPurposeExample
EntityObject with identityUser, Order
Value ObjectObject without identityMoney, Address
AggregateCluster of entities with rootOrder + LineItems
Domain EventSomething that happenedOrderPlaced, PaymentReceived
RepositoryCollection-like access to aggregatesOrderRepository
Domain ServiceLogic that doesn't fit entitiesPricingService

System Design Considerations

Scalability Patterns

PatternDescriptionTrade-off
Horizontal ScalingAdd more instancesStatelessness required
Vertical ScalingBigger machinesHardware limits
CachingStore computed resultsCache invalidation
Database ShardingSplit data across DBsQuery complexity
Read ReplicasSeparate read/writeEventual consistency
CDNEdge content deliveryStatic content only

Resilience Patterns

PatternPurposeImplementation
Circuit BreakerPrevent cascade failuresFail fast when downstream is down
Retry with BackoffHandle transient failuresExponential delay between retries
BulkheadIsolate failuresSeparate thread pools per dependency
TimeoutBound waiting timeMax wait for responses
FallbackGraceful degradationDefault behavior when service unavailable

Data Consistency Patterns

PatternConsistencyUse When
ACID TransactionsStrongFinancial data, critical operations
SagaEventualDistributed transactions
Event SourcingEventualAudit trails, complex state
CQRSEventualDifferent read/write models

Technology Decision Framework

When to Use a Database

NeedRecommendedAvoid
Relational data, ACIDPostgreSQL, MySQLMongoDB
Document storage, flexible schemaMongoDB, DynamoDBRelational
Key-value, high speedRedis, MemcachedRelational
Time seriesInfluxDB, TimescaleDBGeneric SQL
Graph relationshipsNeo4j, NeptuneRelational (for complex)
SearchElasticsearch, MeilisearchFull table scans

When to Use Message Queues

NeedPattern
Async processingQueue (SQS, RabbitMQ)
Event broadcastingPub/Sub (SNS, Kafka)
Task schedulingDelayed queues
Load levelingQueue with workers
Event sourcingLog-based (Kafka)

Architecture Decision Records (ADR)

Template

# ADR-001: [Title]

## Status
[Proposed | Accepted | Deprecated | Superseded by ADR-XXX]

## Context
[Why is this decision needed?]

## Decision
[What is the decision?]

## Consequences
### Positive
- [Benefit 1]
- [Benefit 2]

### Negative
- [Trade-off 1]
- [Trade-off 2]

## Alternatives Considered
1. [Alternative 1] - [Why rejected]
2. [Alternative 2] - [Why rejected]

Anti-Patterns to Avoid

  1. Big Ball of Mud - No clear structure, everything depends on everything
  2. Golden Hammer - Using one pattern for all problems
  3. Premature Optimization - Designing for scale before proving need
  4. Analysis Paralysis - Over-designing, never shipping
  5. Distributed Monolith - Microservices with tight coupling
  6. Anemic Domain Model - Entities with only getters/setters
  7. God Object - One class that does everything
  8. Leaky Abstraction - Implementation details leak through interfaces

Decision Checklist

Before finalizing an architecture decision, verify:

  • Does it solve the actual problem?
  • Is it the simplest solution that works?
  • Can the team maintain it?
  • Does it align with existing patterns?
  • Is it testable?
  • Can it evolve as requirements change?
  • Are the trade-offs acceptable?
  • Is the decision documented?

Quick Reference

SOLID:
  S - Single Responsibility
  O - Open/Closed
  L - Liskov Substitution
  I - Interface Segregation
  D - Dependency Inversion

PATTERNS:
  Layered     → Simple, clear separation
  Hexagonal   → Testable, adaptable
  Microservices → Scalable, independent
  Event-Driven  → Decoupled, async

DDD BUILDING BLOCKS:
  Entity, Value Object, Aggregate
  Repository, Domain Event, Domain Service

SCALABILITY:
  Horizontal scaling, Caching, Sharding, CDN

RESILIENCE:
  Circuit Breaker, Retry, Bulkhead, Timeout

Download now (ZIP)

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

No reviews yet

People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.

  • It worked
  • Partly
  • It didn't
What did you use it for? e.g. Reviewing pull requests in a Rails app

Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.