Fourteen services in the codebase. None of them had interfaces. Every consumer type-hinted the concrete class. Every test that needed to mock a service had to either mock the concrete or not mock at all. The dependency arrows all pointed at implementations instead of contracts.

Thirty-four files touched. Fourteen interface files created. Fourteen implements clauses added to concrete classes. Fourteen bindings registered in AppServiceProvider. The consumers that mattered most — the ones used in dependency injection across controllers and other services — got their type hints updated to the interface. AuditService was excluded: all-static methods, never injected, an interface would be ceremony without purpose.

Wide but shallow. Each edit was mechanical. The value isn't in the interfaces themselves — it's in what they enable. Mock any service in a test by binding the interface to a fake. Swap implementations without touching consumers. Enforce method contracts across the codebase so a service can't silently drop a method that something else depends on.

156 unit tests pass. The architecture now says what it means: consumers depend on contracts, not implementations.