Skip to content

fix(spec): EngineQueryOptionsSchema.search accepts the canonical bare query string (#7178) - #7249

Merged
os-zhuang merged 2 commits into
mainfrom
claude/issue-7178-engine-search-union
Aug 10, 2026
Merged

fix(spec): EngineQueryOptionsSchema.search accepts the canonical bare query string (#7178)#7249
os-zhuang merged 2 commits into
mainfrom
claude/issue-7178-engine-search-union

Conversation

@os-zhuang

@os-zhuang os-zhuang commented Aug 10, 2026

Copy link
Copy Markdown
Contributor

Closes #7178.

The lane-ruled direction, executed: align EngineQueryOptionsSchema.search with BaseQuerySchema.search — the same-family drift repair whose precedent and rationale query.zod.ts already records — then delete the casts the divergence forced.

Premise re-measurement (fresh origin/main @ 2e4274d)

Everything triage verified at 5d24f4b still held at 2e4274d; nothing was repaired in between.

Claim Anchor Measured
Engine options schema is object-form only packages/spec/src/data/data-engine.zod.ts:119 search: FullTextSearchSchema.optional()
Query schema is the union packages/spec/src/data/query.zod.ts:502 z.union([z.string(), FullTextSearchSchema]).optional()
Loader engine-branch casts, comment naming this issue packages/metadata/src/loaders/database-loader.ts:228-258 ✅ 3 as any (_find/_findOne/_count) under a NOTE (#6231) block that names #7178
Test casts passing the canonical spelling packages/objectql/src/engine-findone-contract.test.ts ✅ found 7, not 5 (see below)
Ratchet records the loader sites scripts/query-options-erasure-baseline.json database-loader.ts: 3, testSurface.sites: 256

Deviation from the dispatch, worth a look: the card and the dispatch both say five as any in engine-findone-contract.test.ts pass the canonical spelling. The real count is seven — lines 144, 150, 163, 164, 169, 179, 296 on origin/main. All seven had search: <string> as their only off-contract content and all seven compile uncast after the change; the erasure ratchet independently confirms the number (test surface fell exactly 256 → 249). I removed all seven rather than five. No other cast in that file was touched — the ones covering where: [[...]] tuples, filter:, empty bags and the proof.call loop are genuinely off-contract input and stay.

Also worth noting: the loader's fourth as any (_delete, { where: { id } } as any) is a different shape, unrelated to search, and is left alone — it is not one of the three the ratchet counts.

Consumer census (the card's own guard, run before landing)

Swept every read of search off a value typed EngineQueryOptions / EngineQueryOptionsParsed / EngineCountOptions / any engine find/findOne/count options parameter, looking for object-form member access (.query, .fields, destructuring, spread, Object.keys) without a typeof guard.

Site Reads Guard Verdict
objectql/src/engine.ts:5849-5860 (expandSearchOnAst, the one $search expansion shared by find/findOne) raw.fields typeof raw === 'object' ? raw?.fields : undefined Already serves the string — this is why the schema was lying
objectql/src/search-filter.ts:59-69 (normalizeSearch) o.query, o.fields ✅ full string/object discrimination; param is unknown No change
objectql/src/search-filter.ts:102-109 (expandSearchToFilter) only the normalized result ✅ via normalizeSearch No change
metadata-protocol/src/protocol.ts:5882-5886 (#4254 searchFields ingress gate) search.fields typeof … === 'object' No change; a bare string correctly falls to else (no caller-named fields to validate)
metadata-protocol/src/protocol.ts:6063 options.search == null n/a — null check only No change
objectql/src/engine.ts:5865-5866 delete (ast as any).search n/a — shape-agnostic No change
EngineCountOptionsSchema / ENGINE_COUNT_OPTION_KEYS n/a Structurally immune: count declares no search key at all

Result: zero unguarded object-form consumers, and zero sites in category (b) "behavior would silently change." Every consumer was already written for the union, which is the whole shape of this defect. No guard needed adding, so the STOP condition did not trigger.

Cleared as different types, not engine options: metadata-manager.ts (MetadataQuerySchema.search, a plain z.string()), client/src/query-builder.ts (a writer), rest-server.ts (raw HTTP query bag, already typeof-guarded), plus URL.search / view-config booleans. No driver reads search at all — the key is deleted before the AST leaves the engine.

Changes

File Change
packages/spec/src/data/data-engine.zod.ts search: FullTextSearchSchema.optional()z.union([z.string(), FullTextSearchSchema]).optional(), with a doc comment mirroring the repair rationale query.zod.ts records for the query side
packages/metadata/src/loaders/database-loader.ts 3 engine-branch as any deleted (_find/_findOne/_count); the stale NOTE (#6231) block rewritten to record the close-out and warn against reinstating the cast
packages/objectql/src/engine-findone-contract.test.ts 7 as any deleted — the canonical spelling now passes uncast
packages/spec/src/data/data-engine.test.ts 5 new pins (below)
scripts/query-options-erasure-baseline.json ratcheted down: database-loader.ts leaves the grandfather list entirely (was 3, now clean); testSurface.sites 256 → 249
content/docs/references/data/data-engine.mdx regenerated — the search row now reads string | { query: string; … }
content/docs/kernel/contracts/data-engine.mdx (2nd commit) hand-written EngineQueryOptions block: search?: FullTextSearchstring | FullTextSearch
.changeset/engine-query-options-search-union.md @objectstack/spec minor, @objectstack/metadata patch

Because the baseline JSON is the ESLint ignores list (eslint.config.mjs:299 reads it), dropping the loader key also un-mutes that file for pnpm lint — it now has to stay clean on its own.

On the second commit (hand-written docs)

The PR's own docs-drift advisory listed 107 pages. 106 of them reach @objectstack/spec by package-level fan-out and make no claim about this key — but one was a genuine hit: content/docs/kernel/contracts/data-engine.mdx:113 hand-mirrors the EngineQueryOptions interface and declared search?: FullTextSearch. Left alone, the hand-written face would say the opposite of the regenerated face about the same key. grep 'search?: FullTextSearch' over content/docs confirms it was the only such page; the query-side pages (objectql/query-syntax, data-modeling/queries) already document the union.

Deliberately not fixed there: the same block omits searchFields entirely. That is #7170's defect (triage deduped it as distinct) and belongs to that card.

Reverse verification — direction predicted first

Predictions written before measuring, then measured by reverting only data-engine.zod.ts to origin/main (git checkout origin/main -- <file>) and running the new pins unchanged. Tests import from src, so no rebuild confound.

Pin Predicted Measured pre-change Post-change
accepts the BARE query string 🔴 RED 🔴 RED — ZodError: expected object, received string 🟢 GREEN
accepts search + searchFields in both spellings 🔴 RED 🔴 RED — same, on the bare-string half 🟢 GREEN
matches BaseQuerySchema.search (siblings agree) 🔴 RED 🔴 RED — QuerySchema accepted both, engine options rejected the string 🟢 GREEN
still accepts the structured FullTextSearch form 🟢 GREEN both sides 🟢 GREEN 🟢 GREEN
rejects a search that is neither string nor FullTextSearch 🟢 GREEN both sides 🟢 GREEN 🟢 GREEN

Stated explicitly, since it is the point of the exercise: the last two pins are non-discriminating — they are guard pins that hold the rest of the accept face still (the union widens by exactly one spelling and does not open the key to anything), not evidence for the change. The first three carry the proof, and all three were red on unmodified origin/main for the predicted reason.

Compile-side, the card's TS2345 is gone: DriverQueryEngineQueryOptionsParsed now assigns bare. tsc --noEmit over packages/metadata reports zero errors in database-loader.ts (the only hits under that path are pre-existing .test.ts import-extension / implicit-any debt I did not touch), and packages/objectql src typechecks clean. Since objectql/tsconfig.json excludes **/*.test.ts, I typechecked engine-findone-contract.test.ts explicitly through a throwaway project file (deleted, not committed): no error on any de-casted line — proving the 7 casts were vestigial rather than merely unenforced.

Gates

Spec was built before every dist-derived regen, per the stale-dist trap (#7122), and rebuilt once more after the reverse-verification revert/restore so nothing generated read a stale dist.

Gate Result
pnpm --filter @objectstack/spec build ✅ (twice — before the gen chain, and again post-revert)
turbo run build --filter=@objectstack/objectql... --filter=@objectstack/metadata... ✅ 15/15
check:query-options-erasure 🔴 → ratcheted → ✅ (self-test 10 shapes / 8 ratchet cases; "no files added" verified against 2e4274d)
pnpm --filter @objectstack/spec check:generated 🔴 1/11 stale (content/docs/references/**) → gen:docs → ✅ 11/11
check:api-surface ✅ unchanged — no new exports, no signature change
check:export-origins ✅ current, 4970 exports / 16 entry points
check:authorable-surface ✅ 1277 defaults unchanged; 1587 schemas generated
check:docs 🔴 → regenerated → ✅
check:doc-authoring ✅ 374 files clean
check:docs-audit-scope ✅ 179 hand-written docs in sync; releases pages read-only
check:empty-changeset, check:changeset-gate-self-tests, check:adr-0087-registration
pnpm --filter @objectstack/spec test ✅ 360 files / 9402 tests
pnpm --filter @objectstack/objectql test ✅ 167 files / 2906 tests
pnpm --filter @objectstack/metadata test ✅ 29 files / 592 tests
eslint --no-inline-config on all changed sources ✅ clean

The dual-snapshot pair (api-surface/ + export-origins/) both reported current against the real post-build dist, so neither needed regenerating — the type surface widened a property's type, which is not part of either snapshot's recorded shape. Heavy runs were serialized under flock /tmp/os-heavy-verify.lock; no contention, zero wait (this was the only heavy consumer on the box).

Special-inspection items for the PM

  1. Cast count is 7, not 5. The dispatch and the card both say five. Worth a glance that removing all seven is what you wanted — the ratchet's independent 256 → 249 is the corroboration.
  2. The asymmetry note the card records is now stale, and I did not refresh it in prose anywhere but here. The card noted count accepts the value fine because EngineCountOptions is a z.input type. Measured cause is slightly different and worth recording correctly: EngineCountOptionsSchema declares only where + context — it has no search key at all — and ENGINE_COUNT_OPTION_KEYS (engine.ts:310) rejects one outright. So count accepted DriverQuery via ordinary non-fresh-object excess-property assignability, not via z.input vs z.infer. Post-change the asymmetry is simply gone from the caller's view: all three loader helpers pass uncast. The only place the old wording lived in code was the loader's NOTE (#6231) block, which this PR rewrites.
  3. Baseline key removal doubles as an ESLint un-mute. database-loader.ts is no longer in ignores, so any future any-erasure there fails pnpm lint directly rather than needing the ratchet. Intended, but it is a real tightening beyond the literal ask.
  4. Pre-existing, out of scope, filed nowhere yet: packages/spec/src/data/query.test.ts:1094/1106/1193/1205 do unguarded result.search?.operator / .fuzzy / .highlight on QuerySchema.parse(...), whose search has been string | FullTextSearchParsed since the query-side repair. Latent on the QueryAST side, untouched and unaffected by this PR. Say the word and I will file it as a finding; I did not, to avoid noise on a pin that is green.
  5. docs/adr/** and content/docs/releases/ were not touched. The two content/ changes are the generated references/data/data-engine.mdx and the one genuinely-stale hand-written line in kernel/contracts/data-engine.mdx.

No auto-merge — yours to land serially.

… query string (#7178)

`BaseQuerySchema.search` (query.zod.ts, hence QueryAST, hence DriverQuery) has
been `z.union([z.string(), FullTextSearchSchema])` since its own drift repair,
with a doc comment saying why: the bare string IS the canonical Tier-1 contract
(ADR-0061 D1), it is what every surface sends, and it is what the dogfood HTTP
proof pins. `EngineQueryOptionsSchema.search` — the options type of
IDataEngine.find/findOne — declared the structured form only.

The runtime never agreed with that narrowing: `normalizeSearch` in
objectql/src/search-filter.ts opens with `if (typeof raw === 'string')`, and
protocol-data.test.ts asserts the protocol layer hands the engine a bare string.
So the type forbade what the engine serves, and callers paid the standard price:
`as any` on the query argument, which does not suppress `search` alone — it
switches off checking for where/orderBy/fields in the same literal. This schema
is not `.strict()`, so an unknown key there is silently dropped; the cast the
divergence forced was precisely the cast check:query-options-erasure exists to
stop.

Same-family drift REPAIR, not a new dialect — the identical fix
BaseQuerySchema.search already carries. On the query side it surfaced as a
validation failure when #3899 started validating request bodies; here it
surfaced as TS2345 when #6231 retyped DatabaseLoader's read helpers to
DriverQuery and the engine branch alone refused to compile.

Consumer census before landing (the card's own guard): every site reading
object-form members off an engine-options `search` already narrows with
`typeof` — engine.ts's `$search` expansion, search-filter.ts's normalizeSearch,
and metadata-protocol/protocol.ts's searchFields ingress gate. No consumer
needed a guard added and none changes behavior. `count` is untouched:
EngineCountOptionsSchema declares no `search` key at all.

With the schemas agreed, the casts the divergence forced are deleted —
DatabaseLoader's three engine-branch `as any` (real where/orderBy/fields
checking recovered on the metadata main read path) and the seven in
engine-findone-contract.test.ts that were passing the canonical spelling.
query-options-erasure-baseline.json ratcheted down accordingly (the loader file
leaves the grandfather list entirely; test surface 256 -> 249).

Closes #7178

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012ymfZNzYCQpoptQ2sHbwU3
@vercel

vercel Bot commented Aug 10, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

1 Skipped Deployment
Project Deployment Actions Updated (UTC)
objectstack Ignored Ignored Aug 10, 2026 3:57am

Request Review

@github-actions

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

This PR changes 2 package(s): @objectstack/metadata, @objectstack/spec.

107 hand-written doc(s) reference the affected code and may need an implementation-accuracy re-verification:

  • content/docs/ai/agents.mdx (via @objectstack/spec)
  • content/docs/ai/skills-reference.mdx (via @objectstack/spec)
  • content/docs/ai/skills.mdx (via @objectstack/spec)
  • content/docs/api/client-sdk.mdx (via @objectstack/spec)
  • content/docs/api/environment-routing.mdx (via @objectstack/spec)
  • content/docs/api/error-catalog.mdx (via @objectstack/spec)
  • content/docs/api/error-handling-client.mdx (via @objectstack/spec)
  • content/docs/api/error-handling-server.mdx (via @objectstack/spec)
  • content/docs/api/index.mdx (via @objectstack/spec)
  • content/docs/automation/approvals.mdx (via @objectstack/spec)
  • content/docs/automation/connectors.mdx (via @objectstack/spec)
  • content/docs/automation/flows.mdx (via @objectstack/spec)
  • content/docs/automation/hook-bodies.mdx (via packages/spec)
  • content/docs/automation/hooks.mdx (via @objectstack/spec)
  • content/docs/automation/index.mdx (via @objectstack/spec)
  • content/docs/automation/webhooks.mdx (via @objectstack/spec)
  • content/docs/automation/workflows.mdx (via @objectstack/spec)
  • content/docs/concepts/architecture.mdx (via @objectstack/spec)
  • content/docs/concepts/design-principles.mdx (via packages/spec)
  • content/docs/concepts/index.mdx (via @objectstack/spec)
  • content/docs/concepts/metadata-driven.mdx (via @objectstack/spec)
  • content/docs/concepts/metadata-lifecycle.mdx (via @objectstack/metadata, packages/spec)
  • content/docs/concepts/north-star.mdx (via @objectstack/spec)
  • content/docs/data-modeling/analytics.mdx (via @objectstack/spec)
  • content/docs/data-modeling/drivers.mdx (via @objectstack/spec)
  • content/docs/data-modeling/external-datasources.mdx (via @objectstack/spec)
  • content/docs/data-modeling/field-types.mdx (via @objectstack/spec)
  • content/docs/data-modeling/fields.mdx (via @objectstack/spec)
  • content/docs/data-modeling/formulas.mdx (via @objectstack/spec)
  • content/docs/data-modeling/index.mdx (via @objectstack/spec)
  • content/docs/data-modeling/objects.mdx (via @objectstack/spec)
  • content/docs/data-modeling/queries.mdx (via @objectstack/spec)
  • content/docs/data-modeling/schema-design.mdx (via @objectstack/spec)
  • content/docs/data-modeling/seed-data.mdx (via @objectstack/spec)
  • content/docs/data-modeling/validation-rules.mdx (via @objectstack/spec)
  • content/docs/data-modeling/validation.mdx (via @objectstack/spec)
  • content/docs/deployment/cli.mdx (via @objectstack/spec)
  • content/docs/deployment/tenancy-modes.mdx (via @objectstack/spec)
  • content/docs/deployment/troubleshooting.mdx (via @objectstack/spec)
  • content/docs/deployment/validating-metadata.mdx (via @objectstack/spec)
  • content/docs/getting-started/build-with-claude-code.mdx (via @objectstack/spec)
  • content/docs/getting-started/common-patterns.mdx (via @objectstack/spec)
  • content/docs/getting-started/examples.mdx (via @objectstack/spec)
  • content/docs/getting-started/quick-reference.mdx (via @objectstack/spec)
  • content/docs/getting-started/quick-start.mdx (via @objectstack/spec)
  • content/docs/getting-started/your-first-project.mdx (via @objectstack/spec)
  • content/docs/kernel/cluster.mdx (via packages/metadata, @objectstack/spec)
  • content/docs/kernel/contracts/auth-service.mdx (via packages/spec)
  • content/docs/kernel/contracts/cache-service.mdx (via packages/spec)
  • content/docs/kernel/contracts/data-engine.mdx (via @objectstack/spec)
  • content/docs/kernel/contracts/index.mdx (via @objectstack/spec)
  • content/docs/kernel/contracts/metadata-service.mdx (via packages/spec)
  • content/docs/kernel/contracts/storage-service.mdx (via @objectstack/spec)
  • content/docs/kernel/index.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/data-service.mdx (via @objectstack/spec)
  • content/docs/kernel/runtime-services/email-service.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/examples.mdx (via @objectstack/spec)
  • content/docs/kernel/runtime-services/index.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/queue-service.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/sharing-service.mdx (via @objectstack/spec)
  • content/docs/kernel/runtime-services/sms-service.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/storage-service.mdx (via @objectstack/spec)
  • content/docs/kernel/services-checklist.mdx (via @objectstack/metadata, @objectstack/spec)
  • content/docs/kernel/services.mdx (via @objectstack/spec)
  • content/docs/permissions/authorization.mdx (via @objectstack/spec)
  • content/docs/permissions/permission-sets.mdx (via @objectstack/spec)
  • content/docs/permissions/permissions-matrix.mdx (via @objectstack/spec)
  • content/docs/permissions/positions.mdx (via @objectstack/spec)
  • content/docs/permissions/rls.mdx (via @objectstack/spec)
  • content/docs/permissions/sharing-rules.mdx (via @objectstack/spec)
  • content/docs/permissions/system-context.mdx (via packages/spec)
  • content/docs/plugins/adding-a-metadata-type.mdx (via @objectstack/spec)
  • content/docs/plugins/development.mdx (via @objectstack/spec)
  • content/docs/plugins/index.mdx (via @objectstack/spec)
  • content/docs/plugins/packages.mdx (via @objectstack/metadata, @objectstack/spec)
  • content/docs/protocol/backward-compatibility.mdx (via @objectstack/spec)
  • content/docs/protocol/diagram.mdx (via packages/spec)
  • content/docs/protocol/kernel/config-resolution.mdx (via @objectstack/spec)
  • content/docs/protocol/kernel/http-protocol.mdx (via @objectstack/metadata, @objectstack/spec)
  • content/docs/protocol/kernel/i18n-standard.mdx (via @objectstack/spec)
  • content/docs/protocol/kernel/index.mdx (via @objectstack/spec)
  • content/docs/protocol/kernel/lifecycle.mdx (via @objectstack/spec)
  • content/docs/protocol/kernel/metadata-service.mdx (via @objectstack/metadata)
  • content/docs/protocol/kernel/plugin-spec.mdx (via @objectstack/spec)
  • content/docs/protocol/knowledge.mdx (via @objectstack/spec)
  • content/docs/protocol/objectql/index.mdx (via @objectstack/spec)
  • content/docs/protocol/objectql/query-syntax.mdx (via @objectstack/spec)
  • content/docs/protocol/objectql/schema.mdx (via @objectstack/spec)
  • content/docs/protocol/objectql/security.mdx (via packages/spec)
  • content/docs/protocol/objectql/state-machine.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/actions.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/concept.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/index.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/layout-dsl.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/record-alert.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/widget-contract.mdx (via @objectstack/spec)
  • content/docs/ui/actions.mdx (via @objectstack/spec)
  • content/docs/ui/apps.mdx (via @objectstack/spec)
  • content/docs/ui/create-vs-edit-form.mdx (via @objectstack/spec)
  • content/docs/ui/dashboards.mdx (via @objectstack/spec)
  • content/docs/ui/field-grouping-and-order.mdx (via @objectstack/spec)
  • content/docs/ui/forms.mdx (via @objectstack/spec)
  • content/docs/ui/index.mdx (via @objectstack/spec)
  • content/docs/ui/public-data-collection.mdx (via @objectstack/spec)
  • content/docs/ui/setup-app.mdx (via @objectstack/spec)
  • content/docs/ui/translations.mdx (via @objectstack/spec)
  • content/docs/ui/views.mdx (via @objectstack/spec)

7 release-owned page(s) also reference the affected code. These are read-only:

  • content/docs/releases/implementation-status.mdx (via @objectstack/spec)
  • content/docs/releases/index.mdx (via @objectstack/spec)
  • content/docs/releases/v12.mdx (via @objectstack/metadata, @objectstack/spec)
  • content/docs/releases/v13.mdx (via @objectstack/spec)
  • content/docs/releases/v16.mdx (via @objectstack/spec)
  • content/docs/releases/v17.mdx (via @objectstack/spec)
  • content/docs/releases/v9.mdx (via @objectstack/metadata, @objectstack/spec)

content/docs/releases/ is RELEASE-OWNED (AGENTS.md "Documentation Guardrails"): release
notes are written centrally at release time, and a code PR that edits them is the exact PR
that guardrail exists to stop. They are still audited — read-only. If one of them is actually
wrong, file an issue or open a dedicated docs-only PR; do not edit it here.

Advisory only. To re-verify, run the docs-accuracy-audit workflow scoped to these files:
node scripts/docs-audit/affected-docs.mjs origin/main → pass the list as args.docs.

…'s canonical spelling (#7178)

`content/docs/kernel/contracts/data-engine.mdx` hand-mirrors the
`EngineQueryOptions` interface and declared `search?: FullTextSearch`. That was
true of the schema until this branch widened it; leaving it makes the
hand-written face say the opposite of the generated face
(`references/data/data-engine.mdx`, regenerated in the previous commit) about
the same key — the shape that costs AI authors the most.

Surfaced by the PR's own docs-drift advisory. It is the ONLY hand-written page
in the repo carrying this declaration (`grep 'search?: FullTextSearch'` over
content/docs: one hit); the other pages the advisory lists reach @objectstack/spec
by package-level fan-out and make no claim about this key. The query-side pages
(`objectql/query-syntax`, `data-modeling/queries`) already document the union,
since `BaseQuerySchema.search` has carried it since its own repair.

Deliberately NOT fixed here: the same block omits `searchFields` entirely. That
is #7170's defect (triage deduped it as distinct) and belongs to that card, not
this one.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012ymfZNzYCQpoptQ2sHbwU3
@os-zhuang
os-zhuang marked this pull request as ready for review August 10, 2026 04:57
@os-zhuang
os-zhuang added this pull request to the merge queue Aug 10, 2026
Merged via the queue into main with commit 8b06bba Aug 10, 2026
28 checks passed
@os-zhuang
os-zhuang deleted the claude/issue-7178-engine-search-union branch August 10, 2026 05:27
os-zhuang pushed a commit that referenced this pull request Aug 10, 2026
…eline on the merged tree

Both #7249 and this PR ratcheted scripts/query-options-erasure-baseline.json;
the merged tree carries both reductions, so the file is re-measured with
--update rather than hand-merged (the resolution rule declared in the PR body).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011SaEx5461eovGX7AS9aLDV
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation protocol:data size/m tests tooling

Projects

None yet

2 participants