A specification object whose two paths disagreed

A specification with an in-memory check and a query builder, both correct in isolation and disagreeing on a boundary.

final class EligibleForRefund
{
    public function isSatisfiedBy(Order $o): bool
    {
        return $o->placedAt > now()->subDays(30);      // exclusive
    }

    public function toQuery(Builder $q): Builder
    {
        return $q->where('placed_at', '>=', now()->subDays(30));  // inclusive
    }
}

One character apart, and the report listed orders the refund endpoint then rejected. The only thing that keeps the two paths honest is a property test that generates orders, runs both and asserts agreement — a hundred cases found it in the first run, and no example-based test would have chosen exactly thirty days ago to the second.