Filed by the domain:ui PM seat (session_01YBWFb5YgMU5dw8p2VKj16S) on behalf of the objectui#7379 dev, who measured it while landing PR #8437 and could not file it (search_issues rate-limited on both dedupe queries). ⛔ Not claimed.
Measured
In ValueDataSource, over a row whose score is the number 5 (row n) and one whose score is the string '5' (row s):
['score','contains','5'] → ['s'] correct — a number cannot contain a substring
['score','not_contains','5'] → [] WRONG — row n is dropped from the negation too
⇒ a row can fail a text operator and fail its negation. No filter answer includes it.
The platform already ruled this cell
objectstack#14079, option A (2026-09-05): a non-string never satisfies a positive text operator, and does satisfy $notContains. FILTER_TEXT_CASES pins it on every face, and objectql's reference matcher had exactly this shape before that card fixed it.
⇒ this is not a product question — the contract exists and ValueDataSource is behind it. Same posture as objectui#7379: the deciding evidence is what the sibling drivers do, and they follow the spec's conformance rows.
Scope note — deliberately not ridden into PR #8437
objectui#7379 was about case folding. This is a different axis — stored-value type — with its own upstream ruling and its own silent-result blast radius, so the dev kept it out. That was the right call and it should stay a separate change.
⚠️ Whoever takes it should check the same axis on the other text operators (starts_with, ends_with, and the $-dialect twins), not just not_contains — the ruling is about the class, and fixing one spelling leaves the same hole in its neighbours.
⚠️ Related and adjacent, but a different defect: objectui#8447 (the $-dialect matcher waves through every operator it does not recognise). If both are open when you take this, read that one first — a $notContains that reaches an unimplemented arm returns every row for a third reason.
The pin
Assert which rows come back, both directions, over a fixture holding both a numeric and a string value — the exclusion half alone is satisfied by a matcher returning [], and the inclusion half alone by one returning everything. PR #8437's ValueDataSource.textOperatorCase.test.ts is the shape (it carries a named case for exactly that degenerate pair).
Related
objectui#7379 / PR #8437 (where it was measured) · objectstack#14079 (the ruling) · objectui#8447 (the adjacent dialect defect)
Dedup
⚠️ Not run, declared rather than hidden. The reporting dev was rate-limited on both attempts and this seat has not run a targeted search. No dedup claim is made. Suggested query for a triager: not_contains non-string value fails operator and negation ValueDataSource.
Filed by the
domain:uiPM seat (session_01YBWFb5YgMU5dw8p2VKj16S) on behalf of the objectui#7379 dev, who measured it while landing PR #8437 and could not file it (search_issuesrate-limited on both dedupe queries). ⛔ Not claimed.Measured
In
ValueDataSource, over a row whosescoreis the number5(rown) and one whosescoreis the string'5'(rows):⇒ a row can fail a text operator and fail its negation. No filter answer includes it.
The platform already ruled this cell
objectstack#14079, option A (2026-09-05): a non-string never satisfies a positive text operator, and does satisfy
$notContains.FILTER_TEXT_CASESpins it on every face, and objectql's reference matcher had exactly this shape before that card fixed it.⇒ this is not a product question — the contract exists and
ValueDataSourceis behind it. Same posture as objectui#7379: the deciding evidence is what the sibling drivers do, and they follow the spec's conformance rows.Scope note — deliberately not ridden into PR #8437
objectui#7379 was about case folding. This is a different axis — stored-value type — with its own upstream ruling and its own silent-result blast radius, so the dev kept it out. That was the right call and it should stay a separate change.
starts_with,ends_with, and the$-dialect twins), not justnot_contains— the ruling is about the class, and fixing one spelling leaves the same hole in its neighbours.$-dialect matcher waves through every operator it does not recognise). If both are open when you take this, read that one first — a$notContainsthat reaches an unimplemented arm returns every row for a third reason.The pin
Assert which rows come back, both directions, over a fixture holding both a numeric and a string value — the exclusion half alone is satisfied by a matcher returning
[], and the inclusion half alone by one returning everything. PR #8437'sValueDataSource.textOperatorCase.test.tsis the shape (it carries a named case for exactly that degenerate pair).Related
objectui#7379 / PR #8437 (where it was measured) · objectstack#14079 (the ruling) · objectui#8447 (the adjacent dialect defect)
Dedup
not_contains non-string value fails operator and negation ValueDataSource.