From software-craft
Design systems with appropriate complexity—no more, no less. Use this skill when the user asks to architect applications, design system boundaries, or make structural decisions. Generates pragmatic architectures that solve real problems without premature abstraction.
npx claudepluginhub bengous/claude-code-plugins --plugin software-craftThis skill uses the workspace's default tool permissions.
This skill guides creation of system architectures that match actual requirements, not imagined future needs. Design real structures with clear boundaries, explicit trade-offs, and appropriate complexity.
Applies Acme Corporation brand guidelines including colors, fonts, layouts, and messaging to generated PowerPoint, Excel, and PDF documents.
Builds DCF models with sensitivity analysis, Monte Carlo simulations, and scenario planning for investment valuation and risk assessment.
Calculates profitability (ROE, margins), liquidity (current ratio), leverage, efficiency, and valuation (P/E, EV/EBITDA) ratios from financial statements in CSV, JSON, text, or Excel for investment analysis.
Share bugs, ideas, or general feedback.
This skill guides creation of system architectures that match actual requirements, not imagined future needs. Design real structures with clear boundaries, explicit trade-offs, and appropriate complexity.
The user provides architecture requirements: a system to design, a scaling challenge, or structural decisions to make. They may include context about team size, expected load, or existing constraints.
<architecture_design_thinking>
Before designing, understand the actual constraints:
The goal is to solve the problem with the least complexity that allows future adaptation. Every abstraction, every boundary, every pattern has a cost. Pay only for what you need.
Then design systems that are:
<architecture_guidelines>
Separate concerns that change for different reasons and at different rates.
<example_good title="Meaningful boundary">
src/ users/ # User management domain models.py services.py api.py billing/ # Billing domain models.py services.py api.py shared/ # Truly shared utilities auth.py </example_good>
<example_bad title="Ceremony without purpose">
src/ interfaces/ IUserRepository.py # One implementation exists repositories/ UserRepositoryImpl.py # Wraps SQLAlchemy, which is already a repository services/ UserService.py # Just calls the repository </example_bad>
Core logic depends on nothing. Infrastructure depends on core.
<example_good title="Clear dependency direction">
domain/ # Pure business logic, no imports from outer layers order.py # Order entity with business rules
application/ # Use cases, orchestrates domain place_order.py # Imports from domain/, not infrastructure/
infrastructure/ # External concerns postgres.py # Implements persistence, imports from application/ stripe.py # Implements payments </example_good>
Architecture should make data flow obvious. Where does it enter? How does it transform? Where does it exit?
<example_good title="Obvious data flow"> Request → Validate → Transform → Store → Respond
api/routes.py # Request enters validators.py # Validation transformers.py # Business logic transformation repositories.py # Storage serializers.py # Response shaping </example_good>
Network fails. Databases timeout. Services crash. Build this into the structure.
<example_good title="Failure-aware design"> class OrderService: def place_order(self, order: Order) -> Result: # Explicit failure handling at boundaries inventory = self.inventory.reserve(order.items) if inventory.failed: return Result.failure("Items unavailable", retry=False)
payment = self.payments.charge(order.total)
if payment.failed:
self.inventory.release(inventory.reservation_id) # Compensate
return Result.failure("Payment failed", retry=True)
return Result.success(order)
</example_good>
You will debug this at 3am. Can you trace a request? Can you replay a failure?
<example_good title="Observable architecture">
@trace def handle_request(request): log.info("Processing", request_id=request.id, user=request.user_id) try: result = process(request) log.info("Completed", request_id=request.id, result=result.status) return result except Exception as e: log.error("Failed", request_id=request.id, error=str(e), context=request.to_dict()) # Full context for replay raise </example_good> </architecture_guidelines>
<architecture_anti_patterns>
Avoid premature distribution:
Avoid abstraction theater:
Avoid cargo cult patterns:
Avoid future-proofing:
<architecture_success_criteria>
Your architecture is right-sized when:
<architecture_complexity_decisions>
Add complexity when you have:
A checklist before adding architectural complexity:
[ ] Have I tried the simple solution?
[ ] Do I have evidence it's insufficient?
[ ] Can my team operate this?
[ ] Will this still make sense in 6 months?
[ ] Can I explain why this complexity is necessary?
If any answer is "no", keep it simple. </architecture_complexity_decisions>
<architecture_iteration>
Architecture is discovered, not designed upfront. For complex systems:
Every senior engineer has a graveyard of over-engineered systems they regret. Learn from their pain. Build boring systems that work.