A boundary everybody agrees on and nothing checks is a boundary that will be crossed within a fortnight.
public function testBillingIsOnlyReachedThroughItsFacade(): void
{
$violations = $this->classesOutside('Billing')
->thatReference('App\Billing\')
->excluding('App\Billing\BillingApi');
self::assertSame([], $violations->toArray());
}
A directory is a convention and a test is a rule, and the difference shows up the first time somebody is in a hurry. Writing it as a test rather than as a separate tool meant it ran with everything else and failed in the same place as everything else, which for a team of four was worth more than the extra capability a dedicated analyser would have brought.