You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
[finding] search-fields.ts's docblock says the $search expansion runs "over exactly this set" — since #2486 it also ORs a clause on the hidden __search companion, and that one clause is deliberately $contains #17574
Filed unassigned by the domain:spec execution seat while accepting PR #17572 (card #15052). Recording only — no severity asserted, routing and grading are triage's. The type is prefilled Bug for one reason and one only: triage graded the identical shape on the identical sentence that way ten days ago (#15052, class (b)). ⛔ Correct it if that reading does not carry.
The sentence, and what the engine actually does
packages/spec/src/data/search-fields.ts:9 — the ENGINE bullet of the module docblock — says $search expands into clauses "over exactly this set". Measured on origin/main, that has not been true since #2486:
packages/objectql/src/search-filter.ts:144 const hasCompanion = !!opts.fields[SEARCH_COMPANION_FIELD];
:145-149 const clauses = searchFields.flatMap(…)
if (hasCompanion && isCompanionMatchableTerm(term)) {
clauses.push({ [SEARCH_COMPANION_FIELD]: { $contains: term.toLowerCase() } });
}
lit control 'expandSearchToFilter' in that same file : 1 ⇒ the readings above are readings
⇒ When the object carries the hidden __search companion column (deployment-gated, :37-40), a latin term additionally ORs a clause on a field that is not in the resolved set at all. The set is not "exactly" the set.
⭐ And the second half is now sharper than it was this morning. That pushed clause is $contains, deliberately — :140-143 says so in as many words: "This is a different mechanism from the source-column clauses in fieldClausesForTerm, which compare against raw stored text and therefore need $icontains. Do not "align" the two." PR #17572 has just corrected the same bullet to say $icontains. ⇒ The docblock now reads as though every clause in the expansion is $icontains, when one of them is $containson purpose, and the file two packages away carries an explicit ⛔ against "fixing" that difference.
The implementing round did surface it, in out_of_scope_findings, and judged it "incomplete, not wrong, so not class (a)" with "Successor: none currently queued". ⛔ The class test was run against (a) — a reproducible defect — when the shape is (b): a declared statement contradicted by measurable behaviour. ⚠️ And with no successor named, the acceptance-note fallback does not hold either: the rule is that a finding with no nameable successor is closed with 「承接者:无」 written out, ⛔ not left as a note nobody will read. It is filed here instead.
Two shapes, ⛔ neither of them chosen here
Say the truth about the set — the resolved set, plus the hidden __search companion when the deployment provisioned it.
Say the truth about the operator split — $icontains on the source columns, $contains on the folded companion, with search-filter.ts:140-143's "Do not align the two" cited so the next reader does not fix it.
They are independent and both may be right. ⚠️ A third option — leave it, on the ground that a docblock is allowed to simplify — is defensible for the enum-label $in path (search-filter.ts:108), which the landed sibling docblock also elides; it is weaker here, because the companion clause is on a field outside the set the sentence names as exact.
What this does NOT claim
⛔ No behaviour is wrong. The engine, the companion column and the $contains/$icontains split are all correct and deliberate. This is about a published sentence.
⛔ No claim about the landed sibling docblock at packages/objectql/src/search-filter.ts:8, which elides the same two exceptions. Whether the family should be exhaustive at all is the open question, ⛔ not a decided one.
Filed unassigned by the
domain:specexecution seat while accepting PR #17572 (card #15052). Recording only — no severity asserted, routing and grading are triage's. Thetypeis prefilledBugfor one reason and one only: triage graded the identical shape on the identical sentence that way ten days ago (#15052, class (b)). ⛔ Correct it if that reading does not carry.The sentence, and what the engine actually does
packages/spec/src/data/search-fields.ts:9— the ENGINE bullet of the module docblock — says$searchexpands into clauses "over exactly this set". Measured onorigin/main, that has not been true since #2486:⇒ When the object carries the hidden
__searchcompanion column (deployment-gated,:37-40), a latin term additionally ORs a clause on a field that is not in the resolved set at all. The set is not "exactly" the set.⭐ And the second half is now sharper than it was this morning. That pushed clause is
$contains, deliberately —:140-143says so in as many words: "This is a different mechanism from the source-column clauses infieldClausesForTerm, which compare against raw stored text and therefore need$icontains. Do not "align" the two." PR #17572 has just corrected the same bullet to say$icontains. ⇒ The docblock now reads as though every clause in the expansion is$icontains, when one of them is$containson purpose, and the file two packages away carries an explicit ⛔ against "fixing" that difference.Why this is a card and not a rider on #17572
search-fields.tsdocblock still says$searchexpands to an$orof$contains— a fourth site in the #7641 family, inpackages/specrather thanobjectql#15052's subject is one wrong operator name; this is a different defect (an exactness claim, plus a newly-created ambiguity) that happens to live in the same sentence. Folding it in would have widened a diff whose licence was one clause.search-fields.tsdocblock still says$searchexpands to an$orof$contains— a fourth site in the #7641 family, inpackages/specrather thanobjectql#15052 itself, which is the argument for filing rather than noting: a source docblock inpackages/specdescribing engine behaviour the engine does not have. That is exactly what triage called class (b) and typedBugon 2026-09-10, quoting both texts. The reasoning transfers without modification.out_of_scope_findings, and judged it "incomplete, not wrong, so not class (a)" with "Successor: none currently queued". ⛔ The class test was run against (a) — a reproducible defect — when the shape is (b): a declared statement contradicted by measurable behaviour.Two shapes, ⛔ neither of them chosen here
__searchcompanion when the deployment provisioned it.$icontainson the source columns,$containson the folded companion, withsearch-filter.ts:140-143's "Do not align the two" cited so the next reader does notfixit.They are independent and both may be right.⚠️ A third option — leave it, on the ground that a docblock is allowed to simplify — is defensible for the enum-label
$inpath (search-filter.ts:108), which the landed sibling docblock also elides; it is weaker here, because the companion clause is on a field outside the set the sentence names as exact.What this does NOT claim
$contains/$icontainssplit are all correct and deliberate. This is about a published sentence.packages/objectql/src/search-filter.ts:8, which elides the same two exceptions. Whether the family should be exhaustive at all is the open question, ⛔ not a decided one.domain:speclabel set,state=all, updated since 2026-07-01 ⇒ 400 unique issues, title+body grepped for__search,#2486,SEARCH_COMPANION,over exactly this set,companion column. The only hits are [finding] Thesearch-fields.tsdocblock still says$searchexpands to an$orof$contains— a fourth site in the #7641 family, inpackages/specrather thanobjectql#15052 itself and [finding] The published docs still describe the ADR-0061 search expansion as$orof$containsin six places — and one of them tells the reader the case-insensitivity question is "still open" when #7641 closed it #13988 (closed — the published docs half of the$searchis case-sensitive on textual fields, contrary to three declarations that say case-insensitive #7641 family, which structurally cannot reach a source docblock inpackages/spec, by the same argument that made [finding] Thesearch-fields.tsdocblock still says$searchexpands to an$orof$contains— a fourth site in the #7641 family, inpackages/specrather thanobjectql#15052 a separate card). Lit control on the same corpus:search-fieldsreturned four cards ([finding] SEARCHABLE_ENUM_TYPES contains 'status', which is not a member of the 49-value FieldType enum — dead vocabulary entry in search-fields.ts #13695, SEARCH_AUTO_EXCLUDED_TYPES contains 4 members not in the FieldType enum — more dead vocabulary in search-fields.ts #13716, [finding] Thesearch-fields.tsdocblock still says$searchexpands to an$orof$contains— a fourth site in the #7641 family, inpackages/specrather thanobjectql#15052, [Decision] refuse a text operator ($containsfamily) over a field whose DECLARED type is not textual —INVALID_FILTER400 at the engine's field-aware door (option C of #14079); the textual-type vocabulary is the question #15661) ⇒ the zeros are readings.since=2026-07-01.domain:*.Refs: #15052 / PR #17572 (the operator half, landing) · #2486 (the companion column) · #7641 / #4706 (the operator adjudication chain) · #13988 · #13744 · #13984.
domain:specexecution seat ·session_01MkQhmuuJAVDjmeWNixwDDH· measured and filed 2026-09-10T23:48ZGenerated by Claude Code