Skip to content

refactor(objectql): move three query-lowering bodies out of engine.ts into engine-query-lowering.ts (#25522 cut 20) - #27851

Merged
objectstack-fleet[bot] merged 2 commits into
mainfrom
claude/project-thread-n9w3bf
Oct 30, 2026
Merged

objectstack-fleet[bot] merged 2 commits into
mainfrom
claude/project-thread-n9w3bf

Conversation

@objectstack-fleet

@objectstack-fleet objectstack-fleet Bot commented Oct 30, 2026 •

Copy link
Copy Markdown
Contributor

domain:server#2 · os-sales · session_01L6bhgUCizoYWQVJWjhdR6F

Requested by Sales · project thread
Part of #25522
Clause-②: no
Metadata-protocol: none
Skills-docs: none — a move-only split of a private engine body; no skill or docs page names these members
Ruling-ref: 6348891160 + 6441032442

维护者速读

  • 改了什么:把 engine.ts「查询条件下沉」区里 3 个方法体(where/having 令牌解析 resolveWhereTokens、跨对象关系条件改写成 $in 的 lowerRelationConditions、搜索可查询字段的取得 resolveSearchQueryableFields)原样搬进新文件 engine-query-lowering.ts;类上的方法签名、注释、位置不变,方法体换成转交。与留下代码共用的 2 个顶层 helper(resolveThenLowerWhere、relationSitesOf)原地加 export、由新文件导入(不复制)。engine.ts 22,170 → 22,131 行。
  • 为什么改:[maintainer] refactor(objectql): split src/engine.ts (23,903 lines, +7,501 in 30 days) along its ObjectQL seams, one move-only slice per PR #25522 按缝拆分 engine.ts 的第 20 刀。在最新 main 上把类的 268 个成员全部重新测价:大块方法体几乎都被系列限制锁住(私有静态、推断的公开返回类型、engine.ts#X 外部指针、写入普查、查询选项擦除基线),能整块搬、付得起 −30 行以上的只剩这一区,净 −39 行。
  • 风险与回滚:纯搬移,无行为变化。公开 .d.ts 六个文件里四个逐字节相同;index.d.ts/.d.mts 因两个 helper 原地 export 引起顶层声明重排(裁决 6441032442 B 情形),经语句级归一化后完全相等(语句多重集、声明面摘要、导入导出名集合都相等,附阳性对照)。运行期导出名单与函数名相同,外部包加载顺序不变,晚绑定探针新旧逐行一致。回滚 = revert 本 PR。
  • 先看:packages/objectql/src/engine-query-lowering.ts(3 个函数与 QueryLoweringHost,其中用 symbol 键 getter 传安全服务槽是本系列新出现的宿主形状)、packages/objectql/src/engine.ts 里 3 个转交桩、新导入行与 2 处原地 export。
  • 两分钟验证:pnpm --filter @objectstack/objectql exec vitest run --project local --maxWorkers=2 src/engine-nested-relation-lowering.test.ts src/relation-condition-prescription-cap.test.ts src/engine-search-queryable-fields.test.ts,应见 3 个文件、38 个测试全部通过。
  • 需要你做的:无,席位落地。

Cut 20 of the packages/objectql/src/engine.ts split (#24586 ruling A, recorded in 6270097840), under the claim 6512318712 (branch amendment 6512348857). Three bodies of the query-lowering area move unedited into a new module, packages/objectql/src/engine-query-lowering.ts, behind QueryLoweringHost. No behaviour changes. #25522 stays open.

Branch claude/project-thread-n9w3bf (the card thread's harness-pinned branch), cut from origin/main at fec60e00, with origin/main 0a4b0fb223 merged in (clean). origin/main has since moved to 637cfc6736; that range touches registry.ts, two ADRs and liveness/datasource.*, none of this diff's paths, none of them names a moved body, and git merge-tree of this head with it is clean.

What changes

Why this area

Re-priced on fresh origin/main (engine.ts 22,170 lines, blob 543fe0beb94c): every one of the class's 268 members was screened for the series limits and priced by the net-line rule (body lines removed less the stub and host the move costs). What is left that is both free and large is little:

candidate area net why not / why
query lowering (resolveWhereTokens, lowerRelationConditions, resolveSearchQueryableFields) −39 chosen: all three free, private, declared return types, contiguous
write support (staticReadonlyCreateStrip and neighbours) about −35 free, but scattered over several sections, so the cut would not read as one seam
hook dispatch remainder (dispatchUnscopedMultiWriteHooks) −30 one body; does not pay more than −30

The large bodies are locked: private statics (expandRelatedRecords, walkReferencingRelations), an inferred public return (registerApp), engine.ts#X liveness pointers (registerMetadataCollections, buildSummaryIndex, expandSearchOnAst), docs/adr pointers (applyFieldDefaults, executeWithMiddleware, transaction), query-options erasure sites (find, findOne, seedAutonumber) and this.update write sites under the tenant-audit census (recordObservedDeviation, retractCreationAttestation, recomputeSummaries).

Inside the chosen area:

member body lines disposition
resolveWhereTokens 20 moves, −13
resolveRelateThenLowerWhere 5 stays: pays +2
lowerRelationConditions 27 moves, −18
withResolvedWhere 5 stays: pays 0
expandSearchOnAst 84 stays: docs/qa and packages/spec/liveness name engine.ts#expandSearchOnAst
resolveSearchQueryableFields 14 moves, −12
expandSearchOnOptions 6 stays: pays +1
fillQueryAstDefaults 14 stays: a packages/spec/liveness pointer names it

The three bodies price at −43 in all; the module's import line and the import-list edits in engine.ts bring the file to −39. The two-body variant (without resolveSearchQueryableFields) measured −29 to −31, so the third body was added to clear −30.

The shape

  • The class keeps all three methods with name, modifiers, signature, docblock and position. A body becomes one host literal typed ThisParameterType<typeof fn> with exactly the QueryLoweringHost members it reads, plus a .call, marked [#25522 cut 20], as cuts 8 and 10 to 19 did; the generic lowerRelationConditions<W> is called as (lowerRelationConditions<W>).call(host, …).
  • Fields go as getters over late-bound closures (_registry, relatedSchemaOf); methods as late-bound closures (resolveRelateThenLowerWhere, find), so a double set on the engine after construction is still the one a call reaches.
  • New in the series: a symbol-keyed host member. resolveSearchQueryableFields reads the engine's security-service source through the module-level symbol SECURITY_SERVICE_SOURCE_SLOT. The host carries it as get [SECURITY_SERVICE_SOURCE_SLOT](), typed unknown on QueryLoweringHost (the body already narrows it), and the stub reads it as (this as unknown as Record<symbol, unknown>)[SECURITY_SERVICE_SOURCE_SLOT]. No moved body assigns a field, so there is no setter.
  • Series limits. All three are private with declared return types, so each .d.ts line stays private NAME;. No moved body reads a private static, has a this.FIELD.delete/insert/update( site, calls this.insert / this.update / this.delete, is a query-options erasure site, carries an engine.ts#NAME pointer, or holds a system-context census row or a reader-test via site.
  • Helpers, under the cut-14 seat ruling 6432376812. resolveThenLowerWhere and relationSitesOf are read by moved and staying bodies alike; each gains export in place, byte for byte otherwise, and the module imports them (and SECURITY_SERVICE_SOURCE_SLOT, already exported) from ./engine.js. Nothing re-exports any of them from the package entry.
  • Imports. assertHavingResolvedTemporalTokensInRange, relationFilterCapError and the RelationReplacement type were read in engine.ts only by moved bodies, so they leave engine.ts's import lists (both modules are still imported there for other names). RELATION_FILTER_ID_CAP becomes a type-only specifier in engine.ts, since its only remaining reader there is a {@link} in a docblock that stays.
  • Load order (measured). engine.ts imports the module right after ./having-filter.js, after every module the new one imports, so no module is evaluated earlier than before. On the head bundles the // src/... region order equals the base's with one line added, // src/engine-query-lowering.ts, after engine-validate.ts (index.mjs 121 to 122 regions, index.js 122 to 123, core.mjs 110 to 111, core.js 111 to 112). The external import statements (158 in index.mjs, 140 in core.mjs) and require( calls are identical and in the same order at base and head.

Net lines

engine.ts goes from 22,170 to 22,131 lines, net −39 (28 added, 67 removed). The module is 178 lines. The diff against origin/main is 273 changed lines over 2 files (+206 / −67).

Readers of the moved lines

  • No engine.ts#resolveWhereTokens|lowerRelationConditions|resolveSearchQueryableFields|resolveThenLowerWhere|relationSitesOf pointer exists anywhere outside packages/objectql/src (git grep on origin/main 637cfc6736: 0 hits), so no reader moves.
  • federated-injected-column-readers.test.ts keys name none of the moved bodies; the test passes. check-system-context-census: OK, register unchanged. check-tenant-audit-census: census JSON equal at base and head.
  • Read-seam census. check-durability-degradation-log-level --list at base and head: identical once line numbers are masked (167 lines).
  • Decision-letter count. check-adr-anchors: 1,921 decision-letter citations at base and at head. The moved bodies carry no [ADR-NNNN Dn] letter.

Why

#25522 splits engine.ts one seam at a time so that a change to one area reads, reviews and conflicts as that area alone. This is the largest free, contiguous seam left under the current series limits. Nothing about what the engine does changes.

Tests

No test is added and none is edited: the move is proved by identity, not by new behaviour.

Public .d.ts: ruling 6441032442 letter B (top-level reorder), with a positive control

Built @objectstack/objectql at base 0a4b0fb223 and at the merged head 0014e7332. Four declaration files are raw byte-identical; index.d.ts and index.d.mts differ by 180 raw-diff lines each. Measured per variant: exporting either resolveThenLowerWhere or relationSitesOf alone moves the AggregatedColumnClass and RELATION_FILTER_ID_CAP declarations and reorders one import's specifiers, which is the case letter B allows when the statement-level normaliser closes it.

file raw sha256 base → head raw-diff lines statements (only base / only head) normalised sha256 declared surface specifier sets
core.d.ts 61512fd9… = 0 14 / 14 (0 / 0) 3a827f7f… EQUAL 0224b74e351a (1) EQUAL import 10, export 85 EQUAL
core.d.mts 1753655e… = 0 14 / 14 (0 / 0) 9c348846… EQUAL 0224b74e351a (1) EQUAL import 10, export 85 EQUAL
index.d.ts 1f93ea9f… → 17310099… 180 137 / 137 (0 / 0) 8369d957… EQUAL 5ad12aeac594 (118) EQUAL import 26, export 300 EQUAL
index.d.mts b28038a7… → 576cb7ad… 180 137 / 137 (0 / 0) aa35d3ef… EQUAL 5ad12aeac594 (118) EQUAL import 26, export 300 EQUAL
util-BMx8ShtN.d.ts 75d16412… = 0 187 / 187 (0 / 0) 17b34879… EQUAL 38c72db70306 (175) EQUAL import 55, export 149 EQUAL
util-BMx8ShtN.d.mts 75d16412… = 0 187 / 187 (0 / 0) 17b34879… EQUAL 38c72db70306 (175) EQUAL import 55, export 149 EQUAL
  • No chunk is renamed (util-BMx8ShtN at both).
  • Normaliser disclosure. The ruling's own dtsnorm.mjs lives in another project's files and was not available in this container, so dtsnorm-cut20.mjs re-implements ruling 6441032442 item 1(b) from the ruling's text (statement multiset, declared-surface digest sorted per top-level entry, import/export specifier sets). Its sha256 is 2dd168976943dd62df853a20dd2e06fc41afea76aef34cb2d4e7fb54af8fa5c0; the positive control below shows it does see a surface change.
  • Positive control. On 66d694e25 (whose declaration files are byte-identical to the merged head's), node scripts/ablation-replace.mjs dropped private from the lowerRelationConditions stub and rebuilt. The chunk is renamed util-ljRTZG5W; its normalised sha256 reads 4ca41d40… against 17b34879… and its declared surface 21b34ba6d9a8 against 38c72db70306. The restore leg put the engine.ts blob back to fd1d10a8237a (equal to HEAD), and the rebuild that followed compared equal to the head build.
  • The run-time export lists are equal: index 194 names and core 54, ESM and CJS, and a digest over every export's name and function .name is c5c2f41286d9 at base and head, so no bundler same-name rename happened.
  • (1e) After the head build, the full turbo run build (116 of 116 tasks, the dependents' DTS builds included) and the @objectstack/core and @objectstack/objectql typechecks ran: exit 0 each. (P2) packages/objectql/package.json exports names ./dist/index.* and ./dist/core.* only; (P3) git grep -n -E 'objectql/dist' -- scripts package.json: 0 hits.
AST compare (move-only)

A one-off script (TypeScript compiler API; leaf tokens) on base engine.ts against head engine.ts plus the module:

  • The three moved bodies are SAME (parameters, return type, async, body tokens, and every body line equal after one level of indent): resolveWhereTokens 173 tokens / 20 lines, lowerRelationConditions 282 / 27, resolveSearchQueryableFields 135 / 14. Negative controls: one changed token in a module copy reads DIFF, and a comment-only edit fails the line rule.
  • class ObjectQL: 333 of 333 members kept, in the same order; 330 byte-identical including leading trivia, and the 3 stubs keep docblock, modifiers and signature identical.
  • Top level: 237 of 242 base statements byte-identical. The other 5: the two import lists that lose specifiers, resolveThenLowerWhere and relationSitesOf each with export added and otherwise byte-identical, and the class. The head adds one statement: the module import.
Late-binding probe (base and head dist)

zz-probe-cut20.mjs (a one-off, not committed) loads the built ObjectQL from each dist/ and drives the three bodies with doubles set on the instance after construction: lowerRelationConditions on a nested relation condition, null, a plain condition, the 1,000-id cap (it throws INVALID_FILTER) and with find replaced a second time; resolveWhereTokens on where, with resolveRelateThenLowerWhere replaced (the spy sees the call), on having, and on an empty AST; resolveSearchQueryableFields with no context, with no slot, with the security-service slot set after construction, replaced, throwing, and set to a non-function. The 27 output lines are identical on base and head (the construction log lines, which carry timestamps, set aside); stderr is empty on both.

Suites

Under scripts/pm/os-verify-lock.sh:

  • Full turbo run build: 116 of 116 tasks, exit 0.
  • typecheck of @objectstack/objectql and @objectstack/core: exit 0 each.
  • @objectstack/objectql vitest --project local on the merged head: 491 files, 9,252 tests passed, exit 0 (engine-nested-relation-lowering.test.ts, relation-condition-prescription-cap.test.ts, engine-search-queryable-fields.test.ts, engine-nested-object-door.test.ts, query-expression-conformance.test.ts and federated-injected-column-readers.test.ts among them). The three files in the two-minute check: 38 passed.
  • test:repo projects for objectql (1 of 5) and core (6 of 94) that read this package ran green locally; Test Core runs the rest in CI.

Verification

The gate list is node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack on 0014e7332, each run with its exit code captured before any pipe, then reconciled with --ran (each line CMD :: exit N).

  • Derived gates: 48 of 48 run, exit 0 each; --ran: 48 derived, 48 run, 0 NOT-MEASURED, 0 UNRUN ("a DERIVED zero — all 48 recorded an exit code and none of them is 3"). check:dual-build-cjs-loads ran after the full build.
  • Hand gates, exit 0 each: pnpm check:authz-resolver, check:error-code-casing, check:filter-alias-parity, check:engine-double-contract, check:tenant-chokepoint, check:adr-anchors, check:query-options-erasure; @objectstack/spec check:api-surface, check:generated, check:liveness; node scripts/check-tenant-audit-census.mjs, check-adr-symbol-anchors.mjs, check-platform-checklist.mjs --changed-from origin/main, check-commit-card-trailers.mjs --range origin/main..HEAD, check-system-context-census.mjs, check-nul-bytes.mjs; and eslint as pnpm lint runs it (--no-inline-config) on packages/objectql.

Acceptance notes

  • Serial order. Nothing was edited before the claim 6512318712 and its amendment 6512348857 named this branch.
  • Overlap. All 13 open PRs were fetched just before opening this (git diff --name-only origin/main...pr/N): none touches packages/objectql/src/engine*. git merge-tree of this head with origin/main 637cfc6736 is clean.
  • New host shape to look at. The symbol-keyed getter for SECURITY_SERVICE_SOURCE_SLOT is the first host member in the series keyed by a symbol rather than a name; it is the one place this cut goes beyond cuts 8 to 19's shape.
  • What stays, for the next cut. expandSearchOnAst (84 body lines) and fillQueryAstDefaults stay for their liveness pointers; resolveRelateThenLowerWhere, withResolvedWhere and expandSearchOnOptions do not pay for a stub. After this cut, no free contiguous area in engine.ts pays more than −30 under the current series limits.
  • Left as is. A docblock in engine.ts still says {@link RELATION_FILTER_ID_CAP}; it is kept byte-identical with the specifier type-only. The moved bodies keep their indentation minus one level, as moved, not re-formatted.

Human Minimum

  • 1. Schemas start as Zod; packages/spec holds no runtime logic. (Not touched.)
  • 2. Every name I added uses the casing for its kind (QueryLoweringHost, engine-query-lowering.ts).
  • 3. No formatter ran; pnpm lint passes on the touched package.
  • 4. One issue, one branch off an up-to-date main, one pull request.
  • 5. No publish-visible change, so skip-changeset (ruling 6441032442 item 4: no changeset for a reorder); both declaration lines are filled in above.
  • 6. packages/spec not touched.
  • 7. No hand edits to content/docs/references/, packages/*/CHANGELOG.md or content/docs/releases/.
  • 8. Title, body and comments are in English, apart from the maintainer quick-read block the project asks for.
  • The Before Submitting list in CONTRIBUTING.md is done.

skip-changeset: move-only inside @objectstack/objectql, with the published declarations equal under the ruling's normaliser and no behaviour change, so there is nothing for a release note to say.

🤖 Generated with Claude Code

https://claude.ai/code/session_01L6bhgWZYhVkTy8Yp9oDD11


Generated by Claude Code

…25522 cut 20)

resolveWhereTokens, lowerRelationConditions and
resolveSearchQueryableFields move unedited into engine-query-lowering.ts
behind QueryLoweringHost; the class keeps each method as a stub.
resolveThenLowerWhere and relationSitesOf are exported in place and
imported back. Move-only.

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01L6bhgWZYhVkTy8Yp9oDD11
@objectstack-fleet objectstack-fleet Bot added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Oct 30, 2026
@github-actions

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

This PR changes 1 package(s): @objectstack/objectql, touching 14 documentable anchor(s).

⛔ 1 release-owned page(s) name something this change touched. These are read-only:

  • content/docs/releases/v17/17-6.mdx (via RELATION_FILTER_ID_CAP (symbol, a top-level type), getQueryableFields (literal, a string literal in resolveSearchQueryableFields))

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.

What this run could not see
  • 1 name(s) were too generic to anchor anything (single lowercase words)
  • the SDK route bridge reached 58 of 210 client-bound route-ledger rows — the other 152 have no registrar path: tail to select them, so pages documenting THEIR client methods cannot appear above, on this or any run. Of those 152: 0 are remediable by widening that discovery convention (an in-repo file declares the path; the convention did not scan it); 55 are structural — on a ledger where NOT ONE row is declared in-repo, so no discovery change reaches them at any price; 97 are undecided (no in-repo declaration, on a ledger that has other in-repo registrars — absence and an unreadable spelling are not distinguishable here). The rows themselves: node scripts/docs-audit/affected-docs.mjs --bridge-coverage
  • a page that states a rule by its inputs shares no identifier with the emitter that implements the rule, so an emitter-only diff cannot list it — not on this run and not on any run. Measured on fix(driver-sql): emit varchar(maxLength) for a text field a declared index keys on #11430: content/docs/protocol/objectql/types.mdx documents the text-family column mapping by the ObjectQL type names it maps FROM (text / textarea / html) while the diff changed createColumn; it went unlisted, and it was the page that diff falsified, in four places. No shared token exists to detect this on, so a rule your change carries has to be re-read by hand in the pages that restate it.
  • a key NAME is not a key, so the hand re-read the line above prescribes can land on the wrong schema. The same spelling is authorable on one governed type and a [REMOVED] tombstone on another for each of active, aria, joins, objects, template, tools and version (censused on [finding] tools is a key on BOTH AgentSchema (tombstoned, dead) and SkillSchema (live, cloud-attested), so a name-based search attributes skill examples to the agent key — it produced a false stop-the-line alarm on PR #19059 #19093 over the liveness ledger's governed types, top-level keys); nothing in a search result distinguishes the two, so a grep hit on a LIVE example reads as evidence about the DEAD key. Measured on fix(spec): the agent.tools liveness row says dead — it claimed live on a key the schema tombstoned #19059: content/docs/ai/agents.mdx was reported as contradicting the agent.tools tombstone over its tools: example at :161, which is inside the defineSkill({ block opened at :155 — the page was already correct. Settle ownership by PARSING the value against both schemas, never by the name: that literal PASSES SkillSchema, and as an AgentSchema it FAILS at tools with the tombstone prescription. ⛔ These names are not the whole class — a key retired through a .strict() guidance map leaves no tombstone in the walked shape and none of them here (tool.category, live as AIToolDefinition.category).

Coarse fallback — 19 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): node scripts/docs-audit/affected-docs.mjs --json 637cfc67362933c7c04b8784247e2b39d4e68acf → packageMentionDocs.

Which tree this was computed on

This run read content/docs from 8470d7bbbeb9592939cb53c38e3310eec19b0fce — the merge of head 0014e73327f5c6e6ccd57dec7bc5d71f94c57316 into base 637cfc67362933c7c04b8784247e2b39d4e68acf, which is what actions/checkout gives a pull_request run. Not the PR head.

A worktree cut from an older main holds a different content/docs, so re-deriving there can legitimately return a different list — that is a different tree, not a wrong row. To answer on the same tree:

# while this PR is open — GitHub drops the merge commit once it closes
git fetch origin 8470d7bbbeb9592939cb53c38e3310eec19b0fce && git checkout 8470d7bbbeb9592939cb53c38e3310eec19b0fce
# afterwards, rebuild it from the two parents, which stay fetchable
git fetch origin 637cfc67362933c7c04b8784247e2b39d4e68acf 0014e73327f5c6e6ccd57dec7bc5d71f94c57316 && git checkout -B drift-repro 637cfc67362933c7c04b8784247e2b39d4e68acf && git merge --no-ff 0014e73327f5c6e6ccd57dec7bc5d71f94c57316

node scripts/docs-audit/affected-docs.mjs --json 637cfc67362933c7c04b8784247e2b39d4e68acf

⚠️ That checkout carried uncommitted changes, so the commit above does not fully identify what was read.

Advisory only, and a precision-first one (#9192): a page is listed because it names a
symbol, wire route or SDK method this diff touched — not because it mentions a changed
package. Each row says which anchor put it there, so a wrong row is reportable rather than
merely annoying. To re-verify, run the docs-accuracy-audit workflow scoped to these files:
node scripts/docs-audit/affected-docs.mjs 637cfc67362933c7c04b8784247e2b39d4e68acf → pass the list as
args.docs, on the commit named under Which tree this was computed on.

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

domain:server#2 · os-sales · session_01L6bhgUCizoYWQVJWjhdR6F

维护者速读(席位终稿)

  • 改了什么:engine.ts 拆分系列第 20 刀:「查询条件下沉」区的 3 个方法体(resolveWhereTokens、lowerRelationConditions、resolveSearchQueryableFields)原样搬到新文件 engine-query-lowering.ts;类上的方法签名、注释、位置不变,方法体改为转交。两个共用的顶层 helper 在 engine.ts 原地加 export 供新文件导入,不复制,也不进包入口。engine.ts 22,170 → 22,131 行。
  • 为什么改:[maintainer] refactor(objectql): split src/engine.ts (23,903 lines, +7,501 in 30 days) along its ObjectQL seams, one move-only slice per PR #25522 按缝拆分大文件;在最新 main 上重新估价后,这是唯一能在系列限制下整块搬走的区。
  • 风险与回滚:纯搬移,无行为变化;公开 .d.ts 六个文件中四个逐字节相同,index.d.ts / .d.mts 按裁定 6441032442 B 归一化后相同。回滚 = revert 本 PR。
  • 先看:packages/objectql/src/engine-query-lowering.ts 的宿主类型 QueryLoweringHost。
  • 两分钟验证:pnpm --filter @objectstack/objectql test。
  • 需要你做的:无。非受管面,席位落地。

席位意见: ACCEPT。Shape B 搬移,系列 d.ts 关卡满足;新出现的 symbol 键 getter 宿主形状在使用时读槽,保留「从不缓存」语义。

席位核对

ACCEPT · head 0014e73327f5c6e6ccd57dec7bc5d71f94c57316 · 2026-10-30T02:37Z

  • 形态: 2 files, +206/−67: the new sibling module and the three forwarding stubs in engine.ts. No packages/spec, no governed path; move-only; Tier S.
  • Clause-②: no, Metadata-protocol: none. Ruling-ref 6348891160 (series host shape and d.ts bar) + 6441032442 (letter B normalisation). The two helpers exported in place from engine.ts are not re-exported from src/index.ts (named re-exports only, read by the seat), so the package surface does not move.
  • 前提实测: the thread re-priced all 268 class members on fresh main; this section is the only one movable under the series limits at ≥ −30 lines (net −39).
  • 抽查读数: the seat read the host for resolveSearchQueryableFields: a SECURITY_SERVICE_SOURCE_SLOT-keyed getter that reads the engine slot at each use, so the old "read at use, never cached" property holds; a new host shape for the series, accepted.
  • d.ts bar: 4 of 6 published declaration files byte-identical; index.d.ts / index.d.mts equal after the ruling-B normalisation (dtsnorm-cut20.mjs, written from the ruling's text, with a positive control).
  • 门禁 check-runs: 57 on this head: 36 success, 21 skipped, 0 other (read 2026-10-30T02:37Z); mergeable_state: clean. Derived gates 48/48 + 16 manual exit 0; objectql 491 files / 9,252 tests; lint green; git merge-tree clean against main and no open PR touches engine*.
  • 接受的偏差: the PR body's attribution lines were the card thread's (the seat patched the signature line, the Skills-docs: line and the thread link).
  • 范围外去向: none.
  • 散文面: the stub comments checked against the moved bodies by the seat.
  • 落地条款: relay pr_ready + automerge_enable through the merge queue.

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

Labels

size/m skip-changeset PR has no user-facing published change; bypasses the changeset gate

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant