Clean Architecture compliance review for Go microservices. Validates layer dependency direction, interface placement, repository patterns, and package structure. Use when reviewing code that follows hexagonal or clean architecture.
Use this skill when reviewing Go microservices that follow Clean Architecture / Hexagonal Architecture patterns, especially services with this structure:
internal/
├── core/
│ ├── domain/ # Entities, value objects, domain errors
│ ├── port/ # Interfaces (driven & driving)
│ └── service/ # Use cases / application logic
├── adapter/
│ ├── handler/ # HTTP/gRPC handlers (driving adapters)
│ ├── repository/ # Database implementations (driven adapters)
│ └── client/ # External service clients (driven adapters)
└── infrastructure/ # Config, DI, server setup
Dependencies MUST point inward: adapter → port → domain
import of adapter/ packages in core/ packages✅ handler → service (via port interface) → repository (via port interface)
❌ service → concrete repository implementation
❌ domain → handler
port/ — implemented by servicesport/ — implemented by adapterssql.Row, http.Request in ports)util, common, helper, misc)internal/ is used to prevent external imports| Violation | Symptom | Fix |
|---|---|---|
| Leaky abstraction | *sql.DB in service parameters | Define a port interface |
| Anemic domain | All logic in services, empty domain structs | Move business rules to domain |
| God service | Service with 20+ methods | Split by use case / subdomain |
| DTO in domain | json:"..." tags on domain entities | Create separate DTOs in adapter |
| Circular dependency | Package A imports B, B imports A | Extract interface to port layer |
[LAYER_VIOLATION] file:LINE
From: adapter/repository/user.go
To: adapter/handler/user.go
Rule: Adapters must not import other adapters
→ Fix: Extract shared logic to a port or domain service