Skip to content

refactor(objectql): move the datasource-routing bodies out of engine.ts into engine-datasource-routing.ts (#25522 cut 2) - #25636

Merged
objectstack-fleet[bot] merged 1 commit into
mainfrom
claude/issue-25522-objectql-engine-cut-2
Oct 24, 2026
Merged

objectstack-fleet[bot] merged 1 commit into
mainfrom
claude/issue-25522-objectql-engine-cut-2

Conversation

@objectstack-fleet

Copy link
Copy Markdown
Contributor

Part of #25522
Clause-②: no
Metadata-protocol: none
Ruling-ref: 6348891160

Cut 2 of the packages/objectql/src/engine.ts split (#24586 ruling A, recorded in 6270097840). The claim is 6383544450. Three ObjectQL method bodies move unedited into a new module, packages/objectql/src/engine-datasource-routing.ts: getDriver, resolveDatasourceFromMapping and matchPattern, all private. #25522 stays open for the later cuts.

Branch claude/issue-25522-objectql-engine-cut-2, cut from origin/main at cc10e74fe. Since then main has moved two commits (#25621, #25620), and neither touches packages/objectql/**. The branch has not been merged forward; CI builds the merge ref.

Serial with the file's in-flight PRs. At start, none of the 14 open PRs touched packages/objectql/**. I fetched each head and diffed it against its merge-base. Just before this PR was opened I measured again: none of the 16 open PRs touches it (file lists of #25633, #25632 and the moved #25626 read; the other 13 unchanged).

Which part of Datasource routing moves, and why not all of it

The dispatch proposed the whole Datasource routing row less setDatasourceMapping and the two public statics. I measured first, and it moves less than that:

  • resolveDatasourceBinding stays. Two packages/spec liveness ledgers cite it by symbol as their evidence: packages/spec/liveness/object.json (object.datasource, limb 1) and packages/spec/liveness/manifest.json (manifest.defaultDatasource, limb 4), both as packages/objectql/src/engine.ts#resolveDatasourceBinding. So does docs/adr/0139-…md. Card ask 3 wants every path reader migrated in the same PR. This dispatch forbids packages/spec/** and docs/adr/**. Moving the body would leave both ledger gates green on the stub's name while the code they quote sat in another file, so it stays where they point.
  • resolveEffectiveDatasource, resolveMappedDatasource and isSystemLedgerObject stay. Their bodies are 2, 1 and 4 lines, and each stub's host literal would be longer than the body it replaces. This follows the same reasoning cut 1 used for setI18nService.
  • Test doubles (assumption A1): no double loses its calls. Across the repo's tests, the members of this area are doubled four ways:
    • vi.spyOn(engine as any, 'getDriver') in packages/objectql/src/engine-judge-filter.test.ts, on a real engine. Every caller left in engine.ts still calls this.getDriver(…), and no moved body calls getDriver, so the spy sees the same calls.
    • Instance assignments of resolveEffectiveDatasource, in plugin-audit/src/comment-thread-leaf.test.ts and service-analytics/src/__tests__/effective-datasource-probe.test.ts. That method did not move.
    • Object-literal fakes that carry getDriver or resolveEffectiveDatasource (plugin-security, plugin-auth, service-analytics, service-storage, metadata-protocol). They replace the whole engine, so they never reach ObjectQL.
    • Direct calls (engine as any).getDriver(name). They reach the stub, which keeps its name.
    • The moved bodies reach resolveDatasourceBinding and matchPattern through late-bound closures, so a double set on the instance is still the one they call.

The shape (#23050 shape B, as cut 1 and #25222, #25223, #25224 and #25467 apply it)

  • The class keeps each method with its name, signature, docblock and position. Each body is now one host literal plus fn.call(host, …), marked [#25522 cut 2]. matchPattern reads no member, so it is called directly.
  • DatasourceRoutingHost is new. It types each member as the class member itself (ObjectQL['drivers'], ObjectQL['resolveDatasourceBinding'], …). Each moved function types its this as the Pick of the host over exactly the members its body reads, and each stub annotates its literal as the ThisParameterType of the moved function. There is no cast, and no member becomes public or protected.
  • Fields go as getters: drivers, logger, unavailableDatasources and datasourceMapping. Each read happens when the body makes it, so a rule array replaced by setDatasourceMapping, or a driver registered later, is seen as before.
  • Imports. The module imports ObjectQL as a type only, so there is no module cycle at run time. It imports IDataDriver as a type from @objectstack/core and DatasourceUnavailableError from ./driver-connect-errors.js, the specifiers engine.ts uses. No moved body reads a static. engine.ts gains one import and keeps every import it had. DatasourceUnavailableError stays imported there because a {@link DatasourceUnavailableError} in a docblock that stays still names it (tsc and eslint are clean). Nothing re-exports the module.

The published .d.ts does not change

This is the series bar, ruling 6348891160. Base was a turbo run build --filter='@objectstack/objectql...' at cc10e74fe (14/14 tasks). Head was pnpm --filter @objectstack/objectql build at c70b6b5d against the same dependency tree. The head dist/index.mjs carries readUnavailableDatasources twice, so the head build is the one compared.

All six declaration files are byte-identical, and the raw diff of each is 0 lines. The util chunk name, util-ByiLm3B6, is the same at both ends.

file raw sha256, base = head normalised (ruling, double-quoted), base = head normalised (single-quoted spelling), base = head
index.d.ts 9ca22071717e3f761198115fa54a143df4151a52950d826a10677420dcad16ae 9ca22071717e… c15106196eb2…
index.d.mts 69dd1cfe3875024f434b2d7defce771ebc8c7e48a05be7c946fa6ecdbd912b40 69dd1cfe3875… a2d6d7b241e8…
core.d.ts d27b72bde2eec9a47c7dd3c104976321533cf397452ca9f84491a455ec28e73b d27b72bde2ee… d27b72bde2ee…
core.d.mts 5a0cca505296b678b31c742c285e028fe434f5467bb8d27e052e470ce0e09652 5a0cca505296… 5a0cca505296…
util-ByiLm3B6.d.ts and .d.mts 1742a9cb029654d1ca4e8e392e98001eec85963987f516b1b76f672ecd08e5a9 1742a9cb0296… bffd1b630dab…
  • The ruling's normaliser was run verbatim (double-quoted unions only). This package prints single-quoted literals, so on these files it changes nothing and normalised = raw. A second column applies the same single class (sorting the members of one string-literal union) spelled with a single quote. That column also matches at base and head. This cut does not depend on it, because the raw bytes are identical.
  • Positive control, on a copy of the head util-ByiLm3B6.d.ts: line 8412 private matchPattern; made public (matchPattern;, one line changed) gives raw = ruled-normalised e1ebae28ec516d6480a51cf8551a7eeb62498e24d2409140e0199dcf4ecc34be, which differs from 1742a9cb…. The single-quote normalisation gives f715c98bfa40…, which differs from bffd1b630dab….
  • Export lists, loaded at run time from the built bundles (ESM import() and CJS require), are identical at base and head. . has 182 exports under ESM and 182 under CJS; ./core has 54 and 54. The sorted lists hash 881616cc179189098182bd6b8a95701d9922f9677b786bc12e2d31c1adb0adaa and 393e806906e876c2e020aa96617d54050a35ae63cd483b67d8e968b7b5390f49 at both ends.

No changeset: skip-changeset, per ruling 6348891160 item 4.

Proof of move-only

  • Bodies, by AST token (recursive getChildren leaves). For each moved function, the parameters (without the added this), the return type and the body have the same token sequence as the base method: getDriver 206, resolveDatasourceFromMapping 168, matchPattern 54. That is 428 tokens with 0 differences. Each body line is the base line less two leading spaces (56, 34 and 7 lines). Negative control: changing one token in resolveDatasourceFromMapping makes the check report DIFFER.
  • Class side. The class has 317 members at base and at head. The 314 that did not move are byte-identical to base. The 3 stubs keep their docblocks and signatures byte-identical.
  • Top level of engine.ts. All 234 base statements outside the class are byte-identical at head. The one new statement is the import of the new module.
  • Size. +208 / −97 over 2 files, under the 3,000-line manual-merge line. engine.ts goes from 23,881 to 23,807 lines. engine-datasource-routing.ts has 185 lines, most of them the module header and the host docblock.
  • The tests reach the moved bodies. These were one-off mutations written with scripts/ablation-replace.mjs. Each restored to the HEAD blob f6252c183b12 with git diff HEAD empty, and no test file was kept:
    • matchPattern's .replace(/\*/g, '.*') changed to 'Z': datasource-mapping.test.ts goes 2 failed / 8 passed.
    • getDriver's unavailableDatasources.get(…) read, which goes through the getter, replaced by undefined: datasource-unavailable.test.ts goes 4 failed. The same mutation leaves datasource-mapping.test.ts green, which is noted under Acceptance notes.

Readers of the moved lines

  • ADR anchors (assumption A2). scripts/adr-anchors/packages__objectql__src__engine.ts.json's one paragraph is about the transaction seam. Its routing clause ("SYSTEM_LEDGER_LIFECYCLE_CLASSES, the same tuple ADR-0057 §3.6 routing reads") describes resolveDatasourceBinding step 3 and isSystemLedgerObject, and both stay. No moved body reads the tuple or cites an ADR; the ADR-0057 §3.6 mention in getDriver's docblock stays on the stub. So the new module owes no anchor entry, and none is added. check:adr-anchors: 85 anchored files at both ends; 1,871 decision-letter citations on the anchored surface at both ends; 52,481 citations across 6,594 files at both ends.
  • Liveness ledgers. pnpm --filter @objectstack/spec check:liveness exits 0 at head. 982 path#symbol pointers each name a symbol the cited file contains. Key-mention anchoring asks 753 pairs: 752 anchored and 1 exempt, the same as at base. engine.ts still names defaultDatasource outside the moved bodies.
  • Other path readers. docs/adr/0062-…md mentions engine.ts (getDriver/registerDriver routing) in prose, and both methods are still in engine.ts. check-adr-symbol-anchors: 2,384 anchors resolve at head. check-platform-checklist --changed-from origin/main: 1 anchored file in the change set, 14 anchors judged, 0 lost.

Seam table (fresh, origin/main cc10e74fe, 2026-10-24)

engine.ts is 23,881 lines. 8,270 of them (34.6%) come from the last 30 days (git blame --since=2026-09-24T11:00Z, history covering 2026-09-15 onward). 126 commits touched it in 30 days, and 35 in 7. The file has the module preamble (lines 1–5015), class ObjectQL (5016–23206, 317 members) and a trailer. Sections are contiguous member ranges, docblocks included, with the same names and first members as cut 1's table.

The columns:

  • methods counts method declarations and the constructor, without accessors. That is why "Status and registry accessor" reads 1 here and read 2 in cut 1's table.
  • inferred public lists public methods with an inferred return type; these stay.
  • U counts this.FIELD.delete/insert/update( sites.
  • private statics lists statics that are not public; these stay.
range section first … last member lines 30-day lines methods inferred public U private statics
5016-5242 Instance state and constructor txStore … Constructor 227 50 1 (1 public) - 0 -
5243-5265 Status and registry accessor getStatus … registry 23 0 1 (1 public) getStatus 0 -
5266-5609 Hook and function registry registerHook … triggerHooks 344 6 16 (16 public) registerHook, triggerHooks 1 -
5610-6090 Hook dispatch internals hasHooksFor … assertBulkPerRowHookBudget 481 53 7 (0 public) - 0 -
6091-6247 Action registry and activation registerAction … setActionActive 157 19 10 (10 public) - 1 -
6248-6529 Registered resolvers and write-gate probes _heldFileResolver … registerInsertRecomputeListener 282 257 6 (6 public) - 0 -
6530-7283 Readable-ids security and permission/formula resolution readableIdsSecurityReported … resolveDefaultPermissions 754 754 15 (2 public) - 0 -
7284-7390 Authz invalidation and middleware registration writeEpoch … hasObjectMiddleware 107 18 4 (4 public) - 0 -
7391-7626 Execution plumbing (middleware, session, provenance, users) executeWithMiddleware … buildUser 236 37 7 (0 public) - 0 -
7627-7957 Driver options and engine posture buildDriverOptions … resolveEnginePosture 331 209 6 (0 public) - 0 -
7958-8167 Organization probe and system-insert organization probeInstallOrganizations … transactionCoversDriverFor 210 45 4 (0 public) - 0 -
8168-8533 Field defaults resolveNowDefault … defaultFieldEntries 366 37 6 (0 public) - 0 -
8534-9144 Autonumber applyAutonumbers … seedAutonumber 611 78 6 (0 public) - 1 -
9145-9809 Package, app, plugin and driver registration registrationConversionWarned … registerDriver 665 170 6 (3 public) registerApp, registerDriver 0 -
9810-10018 Datasource registry supplyFileColumnsMovedResolver … listUnavailableDatasources 209 1 8 (7 public) - 3 -
10019-10265 Write guard and realtime publish assertWriteAllowed … publishBulkDataEvent 247 18 4 (1 public) - 0 -
10266-10364 Validation-message i18n (cut 1) setI18nService … objectDisplayLabel 99 14 4 (1 public) - 0 -
10365-11457 Referential integrity and master-detail resolution assertReferencesResolve … masterDeclaredFields 1093 625 12 (0 public) - 0 -
11458-11573 Dangling-reference and cascade inspection inspectDanglingReferences … inspectCascadeDelete 116 48 2 (2 public) - 0 -
11574-11668 Crypto and tenancy providers setCryptoProvider … setTenancyPostureProvider 95 20 4 (4 public) - 1 -
11669-12234 Secret and internal-field handling encryptSecretFields … resolveInternalField 566 32 9 (3 public) - 0 -
12235-12303 Schema lookup and filter judging getSchema … judgeFilter 69 48 3 (2 public) - 0 -
12304-12646 Datasource routing (this cut) LIFECYCLE_DATASOURCE … setDatasourceMapping 343 0 8 (3 public) setDatasourceMapping 0 -
12647-12869 Lifecycle init and health init … resolvePrimaryDatasource 223 0 3 (3 public) init 0 -
12870-12943 Media and value-shape presence objectHasMediaField … valueShapeStrictFor 74 13 4 (0 public) - 0 mediaFieldPresence, coveredValueFieldPresence
12944-13626 Migration flags and attestations isFileReferencesMigrationVerified … wasDatastoreCreatedFromEmpty 683 81 17 (8 public) - 0 -
13627-13653 destroy destroy … destroy 27 0 1 (1 public) destroy 0 -
13654-13668 Expand/cascade limits (statics) MAX_EXPAND_DEPTH … MAX_BULK_PER_ROW_HOOK_ROWS 15 0 0 (0 public) - 0 MAX_EXPAND_DEPTH, MAX_CASCADE_DEPTH
13669-14119 Roll-up summaries autonumberCounters … recomputeSummaries 451 0 7 (1 public) - 0 -
14120-14373 Related-record expansion expandRelatedRecords … expandRelatedRecords 254 10 1 (0 public) - 0 -
14374-14821 File-reference hydration resolveFileReferences … readParentDerivedFiles 448 310 5 (0 public) - 0 -
14822-15239 Query lowering resolveWhereTokens … requireFindOnePredicate 418 212 8 (0 public) - 0 -
15240-15796 find / findOne find … staticReadonlyCreateStrip 557 152 4 (2 public) - 0 -
15797-16454 validate validate … validate 658 492 1 (1 public) - 0 -
16455-17799 insert / insertMany readUpdatePriorRow … insertMany 1345 480 3 (2 public) - 1 -
17800-19731 update update … update 1932 391 1 (1 public) - 0 -
19732-21272 Delete cascade and reference walking planCascadeAtomicity … organizationOwnedRowCounts 1541 747 22 (1 public) - 0 storedReferenceIncludes, remainderAfterMemberRemoval, referenceCheckContext, outlivesOrganization, keepsOrganizationReference, organizationCountContext
21273-21842 delete delete … delete 570 47 1 (1 public) - 0 -
21843-22455 count / aggregate count … aggregate 613 362 3 (2 public) - 0 -
22456-22849 execute and transactions execute … enforceTransactionOrigin 394 63 8 (2 public) - 0 -
22850-23205 Compatibility API registerObject … create 356 36 16 (16 public) - 0 -

After this cut, the Datasource routing row at head is lines 12307–12572 (266 lines).

For the next dispatch (cut 3)

  • Proposed area: Lifecycle init and health, less init. init has an inferred return type, so it stays. What moves is checkDriversHealth (34-line body) and resolvePrimaryDatasource (37-line body):
    • both are public with explicit return types, so their signatures stay on the stubs and the .d.ts keeps its bytes;
    • 0 lines from the last 30 days, no this.FIELD.delete/insert/update( site, no static read;
    • no engine.ts#… path reader, and no spy or instance double on either, measured repo-wide.
    • resolvePrimaryDatasource reads isSystemLedgerObject and resolveDatasourceBinding (both late-bound closures), plus _registry and drivers (getters).
  • Still waiting: Roll-up summaries (spec-coupled, see cut 1). Datasource registry has U = 3: 2 sites in unregisterDriver and 1 in clearDatasourceUnavailable. Its other six bodies are 1–15 lines and mostly shorter than a host literal.

Acceptance notes

  • datasource-mapping.test.ts's case "when the connect verdict is known, the error says WHY rather than 'not registered'" asserts /analytics database unreachable|ERR_DATASOURCE_UNAVAILABLE|broken/. The fallback "mapped … is not registered" message also contains broken, so the case stays green with the unavailableDatasources branch removed (mutation above). datasource-unavailable.test.ts does pin that branch. This predates this PR and is noted, not filed.

Verification

All at head c70b6b5d.

  • pnpm --filter @objectstack/objectql typecheck (tsc --noEmit and check:test-typecheck): exit 0, 39 files / 233 errors / 64 pinned signatures held. Eslint with --no-inline-config on packages/objectql and on both files: exit 0.
  • packages/objectql suite (vitest run --project local --maxWorkers=2, under os-verify-lock, VERDICT command-exit 0): 466 files, 8,700 tests, 8,700 passed, 0 failed, 0 skipped.
  • Downstream type-checks are untouched by construction. Every moved member is private, and all six published declaration files are byte-identical. CI's TypeScript Type Check covers the dependants.
  • dispatch-gates --commands derived 56 families on the real diff. All 56 were run, each exit code recorded, and --ran reconciles: 56 accounted for, 54 run, 2 NOT MEASURED. 53 exit 0. Three are NOT MEASURED locally; CI runs them:
    • check-engine-split-ratio --days 90 exit 2, CANNOT COMPUTE: history starts 2026-09-15, inside the window.
    • check-plugin-teardown-shape --self-test exit 3: the pinned fixture commit is not in this shallow clone.
    • check:dual-build-cjs-loads exit 3, PREREQUISITE NOT MET: no dist/ for the other packages. The export lists above answer its question for this package.
  • Hand gates, all exit 0: check-adr-anchors, check-adr-symbol-anchors, check-nul-bytes, check-platform-checklist --changed-from origin/main, and pnpm --filter @objectstack/spec check:liveness.

Generated by Claude Code

…ts into engine-datasource-routing.ts (#25522 cut 2)

Move-only. The bodies of ObjectQL#getDriver, #resolveDatasourceFromMapping
and #matchPattern move unedited into engine-datasource-routing.ts and reach
the class through DatasourceRoutingHost (getters for the fields, late-bound
closures for resolveDatasourceBinding and matchPattern). Each method keeps
its name, signature, docblock and position in the class.

resolveDatasourceBinding stays: packages/spec/liveness ledgers and an ADR
cite it by engine.ts#resolveDatasourceBinding.

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

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

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

2 hand-written doc(s) NAME something this change touched and may need an implementation-accuracy re-verification:

  • content/docs/data-modeling/external-datasources.mdx (via datasourceMapping (symbol, a field of interface DatasourceRoutingHost), datasourceMapping (literal, a string literal in datasourceMapping; a string literal in resolveDatasourceFromMapping))
  • content/docs/getting-started/quick-start.mdx (via datasourceMapping (symbol, a field of interface DatasourceRoutingHost), datasourceMapping (literal, a string literal in datasourceMapping; a string literal in resolveDatasourceFromMapping))
What this run could not see
  • 2 name(s) were too generic to anchor anything (single lowercase words)
  • the SDK route bridge reached 54 of 206 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 e8de8a7ece08da5875cb50186eed3b6509a367c8 → packageMentionDocs.

Which tree this was computed on

This run read content/docs from 7cc682b51b86125a29b06b9b51bba370a82ca5bc — the merge of head c70b6b5df402ddc1f0915ea65f0e049ec630e5eb into base e8de8a7ece08da5875cb50186eed3b6509a367c8, 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 7cc682b51b86125a29b06b9b51bba370a82ca5bc && git checkout 7cc682b51b86125a29b06b9b51bba370a82ca5bc
# afterwards, rebuild it from the two parents, which stay fetchable
git fetch origin e8de8a7ece08da5875cb50186eed3b6509a367c8 c70b6b5df402ddc1f0915ea65f0e049ec630e5eb && git checkout -B drift-repro e8de8a7ece08da5875cb50186eed3b6509a367c8 && git merge --no-ff c70b6b5df402ddc1f0915ea65f0e049ec630e5eb

node scripts/docs-audit/affected-docs.mjs --json e8de8a7ece08da5875cb50186eed3b6509a367c8

⚠️ 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 e8de8a7ece08da5875cb50186eed3b6509a367c8 → 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

席位核对

ACCEPT · domain:server seat 2 · sunhaolin · session_01JVTd3PprStGa26aez5omLB · 2026-10-24T14:19Z · head c70b6b5df4 · claim 6383544450 · report 6383838631

  • Shape: draft, base main, author objectstack-fleet[bot], assignee sunhaolin, Part of #25522, no closing keyword, Clause-②: no, Metadata-protocol: none, skip-changeset (ruling 6348891160). 2 files in packages/objectql/src/; not governed.
  • Move-only, re-measured by the seat: three private bodies at base (engine.ts:12371 getDriver, :12575 resolveDatasourceFromMapping, :12619 matchPattern) against the new module (:72, :135, :177). Whitespace-insensitive comparison: all three identical. engine.ts shrinks by 74 lines.
  • Scope narrowed (open question 1, option A accepted): resolveDatasourceBinding stays in the class because packages/spec/liveness/object.json, manifest.json and docs/adr/0139 cite it by symbol and path, and both surfaces were forbidden to this dispatch. Moving it would leave the ledgers pointing at a delegating stub. The three 1–4-line members stay because they are shorter than a host literal, the same rule this seat now sets for [maintainer] refactor(driver-sql): split src/sql-driver.ts (22,096 lines, +2,533 in 30 days) along its SqlDriver seams, one move-only slice per PR #25521.
  • A1 (doubles), as measured by the dev: the one real-engine double, vi.spyOn(engine, 'getDriver') in engine-judge-filter.test.ts, still sees every call. A2 disproved: no anchor entry is owed (the ADR-0057 paragraph describes members that stay).
  • CI on head c70b6b5df4: 34 success, 12 skipped, 0 red; every skip on main's roster.
  • Writes: mcp_calls 10, all GitHub MCP reads; no write tool.
  • Noted, not owed here: the weak assertion in datasource-mapping.test.ts (its regex also matches the fallback message), covered by datasource-unavailable.test.ts; and the shared-.git shallow-boundary incident, repaired in the same run (the dev's deviation 4).

Landing: pr_ready + automerge_enable through the relay in this act (CI green, mergeable clean).


Generated by Claude Code

@objectstack-fleet
objectstack-fleet Bot marked this pull request as ready for review October 24, 2026 14:21
@objectstack-fleet
objectstack-fleet Bot enabled auto-merge October 24, 2026 14:21
@objectstack-fleet
objectstack-fleet Bot added this pull request to the merge queue Oct 24, 2026
Merged via the queue into main with commit 702b44f Oct 24, 2026
47 checks passed
@objectstack-fleet
objectstack-fleet Bot deleted the claude/issue-25522-objectql-engine-cut-2 branch October 24, 2026 15:01
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.

2 participants