ColumnPredicate
A test a shredded column can answer without opening a document.
Type bracketing is part of the contract, and it has to be, because skipping depends on it. A numericRange matches values of numeric kind only; a textRange matches strings only; a value of any other kind is not a match and not an error. Without that rule, a column whose numeric bound misses the predicate could not be skipped merely because the segment also holds strings at the path — and with it, one bound slot is enough to rule a segment out.
It is the rule MongoDB and JavaScript both take and SQL/JSON declines; what matters here is less which one than that it is written down and that the recheck uses the same one. .claude/rules/index-and-query.md requires the recheck to run the same logic that built the index, so matches is what both the column scan and the fallback document scan evaluate.