I feel is kind of similar to static vs dynamic type system argument. Dynamic Type systems can work great if you have strong contracts and everyone understands how to define/maintain that, but as you grow up the team, you'd have people having gaps in understanding those contracts and break them eventually leading to bugs. Enforcing rules sometimes just keeps the rules alive in everyone's head as it is harder to get around that usually.