Skip to content

bug(core): not_contains on a non-string stored value fails the operator AND its negation — against the platform's objectstack#14079 ruling #8452

Description

@os-justin

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.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workingdomain:specobjectui spec stream: fix lands on packages/types, schema corpus or spec pin coupling — spec lanedomain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatpm:queuepriority:p2

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions