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.