Uh oh!
There was an error while loading. Please reload this page.
docs(objectql): correct the ADR-0061 search-expansion docblock to $icontains (both sites) - #13987
Conversation
…contains` The ADR-0061 docblock on `expandSearchOnAst` described the search expansion as a cross-field `$or` of `$contains` in two places. Both are false: the implementation one file over (`search-filter.ts`) emits `$icontains` for the source-column clauses, and its own header records the adjudication — "[#7641] The case-insensitive operator is `$icontains`, NOT `$contains`." Comment-only, zero behaviour. `search-filter.ts` is already correct and is not touched. Deliberately NOT changed: the multi-value containment passage further down `engine.ts` (`referenceProbeFilter` and its docblock), where `$contains` is the correct spelling — that paragraph is about membership over a stored array, not about ADR-0061 search expansion. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01F3jdziLbAPGeceVNmSox5L
…ck correction Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01F3jdziLbAPGeceVNmSox5L
📓 Docs Drift CheckNothing in this diff resolved to a documentable surface (no symbol, route or SDK anchor derived from 1 changed package(s)), so this run has no opinion about the docs. What this run could not see
Coarse fallback — 15 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): |
zhuangjianguo
commented
Aug 31, 2026
PM review — ACCEPT. ⛔ Not released yet: 15 of 29 checks still running.
1. ⭐⭐ The sweep found a class neither the card nor triage knew existed — and triage's acceptance criterion pointed at a behaviour changeTriage set the bar as a binary: "改完之后 There is a third, and the seat's A2.3 sweep surfaced it. I verified it on
⇒ The full four-class classification (search expansion · multi-value containment · normalized companion · operator implementation in 2. Zone-2 verdicts — all four, with A2.3 falsified in the useful direction
⭐ On #13984 the seat also recorded why the false sentence survived so long: the argument it carries is still true (a Latin term cannot hit a stored CJK value under either operator, because folding does not transliterate). A falsehood that supports a true conclusion is the hardest kind to see, and naming that is more useful than the correction itself. 3. Two pieces of measurement discipline worth naming
4. The census risk was measured away rather than guarded against
5. Changeset and clause ②
6. Gates32 families derived, 30 exit 0, 2 exit 3 — both quoted from their own verdict text and correctly recorded as PREREQUISITE NOT MET = NOT MEASURED, ⛔ never as passes. Exit codes captured before any pipe. One declared narrowing: repo-wide Status14 of 29 checks complete, zero failures; 15 still in flight, ~7 minutes in. ⛔ No ready-flip and no auto-merge until every one is completed and green — the bar is completeness, not the required subset, because enqueue is irreversible here. On landing: verify by content on Generated by Claude Code |
Uh oh!
There was an error while loading. Please reload this page.
Fixes#13744
Comment-only, zero behaviour. Corrects two false spellings in one ADR-0061 docblock in
packages/objectql/src/engine.ts, bringing it into line with the implementation one file over.The defect
engine.ts's docblock on the privateexpandSearchOnAsthelper (shared byfindandfindOne) described the$searchexpansion as a cross-field$orof$contains. The implementation inpackages/objectql/src/search-filter.tsemits$icontainsfor the source-column clauses, and records the adjudication in its own header atsearch-filter.ts:23:The two files contradicted each other and the implementation was the correct one.
search-filter.tsis not touched.The card named one site; triage re-anchored and found a second in the same docblock. Both are fixed here.
Anchored before / after
Anchored by quoted string, not by line number — this card's line numbers had already drifted once (
:8550when filed,:8645at triage). Line numbers below are the ones actually found at merge baseeb649cb8bc.Site 1 —
engine.ts:8647(the shape of the expansion)Site 2 —
engine.ts:8664(the easier one to miss — it reads as a statement of fact about driver capability rather than a description of the expansion, and is equally false)Both are single-token substitutions inside one
/** ... */block. The file's line count is unchanged (13805 before and after), so no cited line anywhere in the repo shifts.Deliberately NOT changed
engine.ts~:11212-~:11258— the multi-value containment passage onreferenceProbeFilter, where$containsis the correct spelling. That paragraph is about membership over a stored array and explicitly says "No public filter surface is widened". A whole-file find-and-replace would turn a correct paragraph false; this diff has exactly two hunks and neither is near it.search-filter.ts— already correct, and its__searchcompanion clause stays$containsby design (both sides are already lowercase, so a case-sensitive operator over two folded values is exact; that file says "Do not 'align' the two.").Operator classification across
packages/objectql/src/**Every
$containsmention in the package was read and classified. After this change the distribution matches thesearch-filter.tsadjudication — search expansion says$icontains, multi-value containment and the normalized companion column say$contains:engine.ts:8647,:8664$icontainsengine.ts:11212-11258(7 mentions, incl. 3 code sites)$containssearch-filter.ts(6)having-filter.ts(8)$containssearch-companion.ts:237,:286__searchcompanion clause$containssearch-companion.ts:6$icontainsengine.tscontained zero$icontainsmentions before this change, so the two fixed sites were its only search-expansion references.Out-of-scope finding
A third file carries the same false sentence:
search-companion.ts:6calls the ADR-0061 expansion "a$containsover source columns". It is not fixed here — the dispatch scoped this PR toengine.tsand asked that a third site be recorded separately. Filed unassigned as #13984, which also records the two mentions in that same file where$containsis correct, so nobody batch-replaces it.Verification
Gate union re-run at the final commit
24d04ba988(the tree this PR proposes), derived withnode scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack— the script computes its own change set, so the list is not a hand-written one.check-system-context-census.mjsgreen: "OK — 109 elevation read sites in 20 packages across 45 files, all anchored; 145 anchors resolve, 27 declared non-read." The pure spelling change inserts no lines, so nothing needed re-pointing and--fixwas not run.check-test-completeness.mjsneeds a test-run log the family invocation does not pass it ("the local reading for this gate is NOT MEASURED").check:dual-build-cjs-loadsneeds a fullpnpm build; 54 packages this diff does not touch have nodist/in this worktree ("Runpnpm buildfirst. This is NOT a pass: nothing was measured."). CI'sBuild CoreandTest Corecover both.Targeted package checks, all green:
pnpm --filter @objectstack/objectql typecheck— exit 0 (tsc --noEmit && tsc --noEmit -p tsconfig.scripts.json).engine.tsconfirmed present in the typecheck program viatsc --listFiles.pnpm --filter @objectstack/objectql exec vitest run --maxWorkers=2 src/search-filter.test.ts src/global-search-palette-recall.test.ts src/search-companion.test.ts— 3 files, 57 tests passed.Those tests are the positive control that the corrected sentence is now true:
The last one is why the companion mentions were left alone.
Changeset
A real
patchchangeset for@objectstack/objectql, not theskip-changesetlabel. The criterion applied is the package's publish status rather than the size of the change:packages/objectql/package.jsondeclares noprivateflag, so the diff lands in the source of a published package. All 8 changeset-triggered gate families are green.Clause-② declaration
Clause-②: no. Both limbs measured against the diff as it actually landed, not as it was scoped:
packages/objectql/src/engine.tsplus.changeset/engine-adr0061-icontains-docblock.md. Nothing underpackages/spec/src/**./** ... */block;git diffshows 2 insertions and 2 deletions, every one of them a comment line. No accept/reject behaviour moves and no published surface widens —search-filter.tsalready emitted$icontainsbefore this PR and is not touched, so the runtime is byte-for-byte the same.Generated by Claude Code
Generated by Claude Code