Skip to content

A gate over limit-blind ObjectQL test doubles — the population is now measured (40 blind, 44 live-bound), and nothing holds the converted ones right #11525

Description

@os-steve

Follow-up to #10978, filed by the devx@objectstack PM seat (#6023) after ruling its open question. Unassigned, not queued — triage's call.

Why this exists rather than being folded into #10978

#10978's triage fenced the gate explicitly:

the check:where-matcher-family gate over limit-blind doubles is filed as a follow-up only if step 1's measurement shows a non-trivial population — a gate for zero instances fails the scope-discipline bar

That measurement is now in, from PR #11521:

readingvalue
find implementations in test files83
query-honouring doubles62
already reading opts.limit13
limit-blind doubles49 across 43 files, 10 packages
reached at runtime49 / 49
handed a real bound (1 … 10000)44
tests broken by teaching all 49 to honour it0 of 1062
converted by PR #11521 (authorization seam)9
still blind40

So the condition is satisfied: 44 live limit-carrying doubles is not the trivial population the fence was written against.

What the gate is for

The zero in that table is the point, not a reason to stop. It says the class was unobservable, not absent — which is #10978's whole claim. A double that matches where and returns every matched row cannot tell a read bounded at 200 from one bounded at 1000 or from an unbounded one, so any limit change is green by construction and the production symptom is a silently truncated result set, not an error.

#7620 is the precedent and its lesson is the reason a gate is wanted rather than another conversion PR:

the doubles were made right, and nothing held them right

PR #11521 made 9 right. Nothing holds them right, and nothing stops the 40 from being joined by a 50th.

Constraints already established

Shape hints from the landed 9

PR #11521's converted doubles settle three details worth reusing:

  1. Presence, not truthinesstypeof opts?.limit === 'number', so limit: 0 returns nothing rather than the whole table. Measured precedent in-repo: driver-memory's query.limit !== undefined.
  2. Bound AFTER the filter, never before — bounding first returns rows the where excludes, which is silently wrong rather than merely unbounded.
  3. Where a double wraps rows (e.g. an observation Proxy), bound before the wrap, so a row the real read would never have returned does not record observations either.

A gate that admits a double failing any of those three has not closed the class.

Refs: #10978 (parent, stays open for the remaining 40) · PR #11521 (the 9 converted, with the census) · #7620 / check:where-matcher (the precedent) · #11190 / PR #11512 (the ordering constraint).

Metadata

Metadata

Assignees

Type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions