| name | deptrac-fixer |
| description | Diagnose and fix Deptrac architectural violations automatically. Use when Deptrac reports dependency violations, layers are incorrectly coupled, or when refactoring code to respect hexagonal architecture boundaries. Never modifies deptrac.yaml - always fixes the code to match the architecture. |
Deptrac Fixer Skill
Context (Input)
make deptrac reports violations
- Error message contains "must not depend on"
- Domain layer has framework imports (Symfony, Doctrine, API Platform)
- Infrastructure directly calls Application handlers
- Any architectural boundary violation detected
Task (Function)
Diagnose and fix Deptrac violations by refactoring code to respect hexagonal architecture boundaries.
Success Criteria: make deptrac outputs "โ
No violations found"
Core Principle
Fix the code, NEVER modify deptrac.yaml
The architecture is correct. The code must conform to it, not vice versa.
Quick Start: Fix a Violation
Step 1: Run Deptrac
make deptrac
Step 2: Parse Violation Message
Domain must not depend on Symfony
src/Customer/Domain/Entity/Customer.php:8
uses Symfony\Component\Validator\Constraints as Assert
Extract:
- Violating Layer: Domain
- Forbidden Dependency: Symfony
- File & Line:
src/Customer/Domain/Entity/Customer.php:8
- Violation Type:
uses (import statement)
Step 3: Identify Fix Pattern
See: REFERENCE.md for complete fix patterns and advanced scenarios.
Step 4: Apply Fix
Follow the pattern from examples, then verify:
make deptrac
Repeat until: "โ
No violations found"
Layer Dependency Rules
Domain โโโโโโโโโโโโโโโโโ> (NO dependencies)
โ
โ
Application โโโโโโโโโโ> Domain + Infrastructure + Symfony + API Platform
โ
โ
Infrastructure โโโโโโโ> Domain + Application + Symfony + Doctrine
Allowed Dependencies:
| Layer | Can Depend On |
|---|
| Domain | โ Nothing (pure PHP only) |
| Application | โ
Domain, Infrastructure, Symfony, API Platform |
| Infrastructure | โ
Domain, Application, Symfony, Doctrine, MongoDB |
See: CODELY-STRUCTURE.md for complete directory hierarchy.
Common Fix Patterns (Quick Reference)
Pattern 1: Domain โ Symfony Validator
โ Problem: Validation annotations in Domain entity
use Symfony\Component\Validator\Constraints as Assert;
class Customer {
#[Assert\NotBlank]
private string $name;
}
โ
Solution: Move validation to config/validator/{Entity}.yaml
Pattern 2: Domain โ Doctrine Annotations
โ Problem: Doctrine attributes in Domain entity
use Doctrine\ODM\MongoDB\Mapping\Annotations as ODM;
#[ODM\Document]
class Customer { }
โ
Solution: Create XML mapping in config/doctrine/{Entity}.mongodb.xml
Pattern 3: Domain โ API Platform
โ Problem: API Platform attributes in Domain entity
use ApiPlatform\Metadata\ApiResource;
#[ApiResource]
class Customer { }
โ
Solution: Create YAML config in config/api_platform/resources/{entity}.yaml
Pattern 4: Infrastructure โ Application Handler
โ Problem: Direct handler call from Infrastructure
class Repository {
public function __construct(
private SomeHandler $handler // โ Circular dependency
) {}
}
โ
Solution: Use Command Bus pattern
class Repository {
public function __construct(
private CommandBusInterface $commandBus // โ
Interface
) {}
public function someMethod() {
$this->commandBus->dispatch(new SomeCommand());
}
}
See: examples/ directory for complete, runnable examples.
Diagnostic Workflow
When facing multiple violations:
Step 1: Get All Violations
make deptrac > violations.txt
Step 2: Categorize by Type
Group violations by layer pair:
- Domain โ Symfony
- Domain โ Doctrine
- Domain โ API Platform
- Infrastructure โ Application
- etc.
Step 3: Fix in Priority Order
- Domain violations first (most critical)
- Infrastructure violations (circular dependencies)
- Application violations (least common)
Step 4: Verify Incrementally
make deptrac
Track progress: 15 violations โ 10 โ 5 โ 0 โ
Constraints
NEVER
- Modify
deptrac.yaml to allow violations
- Disable Deptrac checks
- Add suppression comments
- Create "wrapper" classes to hide dependencies
- Move entire class to wrong layer just to satisfy Deptrac
- Use reflection or dynamic loading to bypass checks
ALWAYS
- Fix the code to match the architecture
- Keep Domain layer pure (no framework imports)
- Use interfaces for cross-layer dependencies
- Move configuration to YAML/XML files
- Verify fixes with
make deptrac after each change
- Check that tests still pass after refactoring
Format (Output)
Expected Deptrac Output
Deptrac
Checking dependencies...
โ
No violations found
Expected CI Output
โ
CI checks successfully passed!
Verification Checklist
After fixing violations:
Related Skills
Quick Commands
make deptrac
vendor/bin/deptrac analyze --report-uncovered
make deptrac && make ci
Reference Documentation
For detailed patterns, examples, and troubleshooting:
- REFERENCE.md - Complete fix patterns for all violation types
- CODELY-STRUCTURE.md - Directory hierarchy and file placement rules
- examples/ - Complete, runnable code examples:
01-domain-symfony-validation.php - Fixing Symfony validation violations
02-domain-doctrine-annotations.php - Removing Doctrine imports
03-domain-api-platform.php - Moving API Platform config
04-infrastructure-handler.php - Using Command Bus pattern
Anti-Patterns to Avoid
โ DON'T Modify deptrac.yaml
paths:
- { collector: layer_domain, exclude: '.*Annotation.*' }
โ DON'T Create Wrapper Classes
class MyValidator {
private SymfonyValidator $validator;
}
โ DON'T Move Classes to Wrong Layer
โ
DO Fix the Root Cause
- Extract validation to YAML
- Move configuration to XML
- Use interfaces and dependency inversion
- Respect layer responsibilities
Success Criteria Summary
- โ
Zero Deptrac violations
- โ
Domain layer pure (no framework imports)
- โ
All configuration externalized (YAML/XML)
- โ
Proper use of Command Bus for cross-layer communication
- โ
All tests passing
- โ
CI pipeline green